From 8ce8b2648b74e2ee4a2113f491a85c356daaebc2 Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 22 Apr 2025 09:48:26 +0800 Subject: [PATCH 001/194] refactor extensions --- .../extensions/{ => pendle}/PendleHelper.sol | 0 .../{ => pricefeed}/PTWithPriceFeed.sol | 0 .../{ => pricefeed}/PriceFeedConverter.sol | 0 .../{ => pricefeed}/PriceFeedFactory.sol | 0 .../{ => pricefeed}/PriceFeedWithERC4626.sol | 0 contracts/router/MarketViewer.sol | 16 ++++++++++------ .../router/swapAdapters/PendleSwapV3Adapter.sol | 2 +- script/deploy/DeployPriceFeeds.sol | 2 +- script/deploy/DeployPriceFeedsArb.s.sol | 2 +- test/mainnet-fork/mainnet/ForkPriceFeed.t.sol | 2 +- 10 files changed, 14 insertions(+), 10 deletions(-) rename contracts/extensions/{ => pendle}/PendleHelper.sol (100%) rename contracts/extensions/{ => pricefeed}/PTWithPriceFeed.sol (100%) rename contracts/extensions/{ => pricefeed}/PriceFeedConverter.sol (100%) rename contracts/extensions/{ => pricefeed}/PriceFeedFactory.sol (100%) rename contracts/extensions/{ => pricefeed}/PriceFeedWithERC4626.sol (100%) diff --git a/contracts/extensions/PendleHelper.sol b/contracts/extensions/pendle/PendleHelper.sol similarity index 100% rename from contracts/extensions/PendleHelper.sol rename to contracts/extensions/pendle/PendleHelper.sol diff --git a/contracts/extensions/PTWithPriceFeed.sol b/contracts/extensions/pricefeed/PTWithPriceFeed.sol similarity index 100% rename from contracts/extensions/PTWithPriceFeed.sol rename to contracts/extensions/pricefeed/PTWithPriceFeed.sol diff --git a/contracts/extensions/PriceFeedConverter.sol b/contracts/extensions/pricefeed/PriceFeedConverter.sol similarity index 100% rename from contracts/extensions/PriceFeedConverter.sol rename to contracts/extensions/pricefeed/PriceFeedConverter.sol diff --git a/contracts/extensions/PriceFeedFactory.sol b/contracts/extensions/pricefeed/PriceFeedFactory.sol similarity index 100% rename from contracts/extensions/PriceFeedFactory.sol rename to contracts/extensions/pricefeed/PriceFeedFactory.sol diff --git a/contracts/extensions/PriceFeedWithERC4626.sol b/contracts/extensions/pricefeed/PriceFeedWithERC4626.sol similarity index 100% rename from contracts/extensions/PriceFeedWithERC4626.sol rename to contracts/extensions/pricefeed/PriceFeedWithERC4626.sol diff --git a/contracts/router/MarketViewer.sol b/contracts/router/MarketViewer.sol index d0f71db..1da0d74 100644 --- a/contracts/router/MarketViewer.sol +++ b/contracts/router/MarketViewer.sol @@ -21,6 +21,7 @@ interface IPausable { contract MarketViewer { using Math for uint256; + struct LoanPosition { uint256 loanId; uint256 collateralAmt; @@ -45,7 +46,7 @@ contract MarketViewer { uint256 xtBalance; LoanPosition[] gtInfo; } - + struct VaultPosition { uint256 balance; uint256 toAssetBalance; @@ -141,7 +142,7 @@ contract MarketViewer { (,, IGearingToken gt,,) = market.tokens(); uint256 balance = gt.balanceOf(owner); LoanPosition[] memory loanPositionsTmp = new LoanPosition[](balance); - + uint256 validPositions = 0; for (uint256 i = 0; i < balance; ++i) { uint256 loanId = gt.tokenOfOwnerByIndex(owner, i); @@ -167,7 +168,7 @@ contract MarketViewer { GtConfig memory config = gtNft.getGtConfig(); uint256 supply = gtNft.totalSupply(); LoanPositionV2[] memory loanPositionsTmp = new LoanPositionV2[](supply); - + uint256 validPositions = 0; for (uint256 i = 0; i < supply; ++i) { uint256 loanId = gtNft.tokenByIndex(i); @@ -189,9 +190,8 @@ contract MarketViewer { // Skip this loan ID if loanInfo call fails continue; } - } - + LoanPositionV2[] memory loanPositions = new LoanPositionV2[](validPositions); for (uint256 i = 0; i < validPositions; i++) { loanPositions[i] = loanPositionsTmp[i]; @@ -199,7 +199,11 @@ contract MarketViewer { return loanPositions; } - function getVaultBalance(address user, ITermMaxVault[] memory vaults, OracleAggregator oracleAggregator) external view returns (VaultPosition[] memory) { + function getVaultBalance(address user, ITermMaxVault[] memory vaults, OracleAggregator oracleAggregator) + external + view + returns (VaultPosition[] memory) + { VaultPosition[] memory vaultPositions = new VaultPosition[](vaults.length); for (uint256 i = 0; i < vaults.length; i++) { address asset = vaults[i].asset(); diff --git a/contracts/router/swapAdapters/PendleSwapV3Adapter.sol b/contracts/router/swapAdapters/PendleSwapV3Adapter.sol index f4602e0..62cdf78 100644 --- a/contracts/router/swapAdapters/PendleSwapV3Adapter.sol +++ b/contracts/router/swapAdapters/PendleSwapV3Adapter.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.27; -import {PendleHelper} from "../../extensions/PendleHelper.sol"; +import {PendleHelper} from "contracts/extensions/pendle/PendleHelper.sol"; import {IPAllActionV3} from "@pendle/core-v2/contracts/interfaces/IPAllActionV3.sol"; import {IPMarket, IPPrincipalToken, IPYieldToken} from "@pendle/core-v2/contracts/interfaces/IPMarket.sol"; import "./ERC20SwapAdapter.sol"; diff --git a/script/deploy/DeployPriceFeeds.sol b/script/deploy/DeployPriceFeeds.sol index 2c6700e..29dbeb5 100644 --- a/script/deploy/DeployPriceFeeds.sol +++ b/script/deploy/DeployPriceFeeds.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.27; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; -import {PriceFeedFactory} from "contracts/extensions/PriceFeedFactory.sol"; +import {PriceFeedFactory} from "contracts/extensions/pricefeed/PriceFeedFactory.sol"; contract DeployPriceFeeds is Script { function run() public { diff --git a/script/deploy/DeployPriceFeedsArb.s.sol b/script/deploy/DeployPriceFeedsArb.s.sol index b1d48e6..a67693f 100644 --- a/script/deploy/DeployPriceFeedsArb.s.sol +++ b/script/deploy/DeployPriceFeedsArb.s.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.27; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; -import {PriceFeedFactory} from "contracts/extensions/PriceFeedFactory.sol"; +import {PriceFeedFactory} from "contracts/extensions/pricefeed/PriceFeedFactory.sol"; contract DeployPriceFeedsArb is Script { function run() public { diff --git a/test/mainnet-fork/mainnet/ForkPriceFeed.t.sol b/test/mainnet-fork/mainnet/ForkPriceFeed.t.sol index 59f8db9..b00c8ff 100644 --- a/test/mainnet-fork/mainnet/ForkPriceFeed.t.sol +++ b/test/mainnet-fork/mainnet/ForkPriceFeed.t.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.27; import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; import "../ForkBaseTest.sol"; -import {PriceFeedFactory} from "contracts/extensions/PriceFeedFactory.sol"; +import {PriceFeedFactory} from "contracts/extensions/pricefeed/PriceFeedFactory.sol"; contract ForkPriceFeed is ForkBaseTest { string MAINNET_RPC_URL = vm.envString("MAINNET_RPC_URL"); From 821cc67106ba1073d1d97312a7a91f4a6995b406 Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 22 Apr 2025 12:10:02 +0800 Subject: [PATCH 002/194] add aave buffer staking contract --- contracts/extensions/StakingBuffer.sol | 38 ++++++++ contracts/extensions/aave/AaveVault.sol | 73 +++++++++++++++ contracts/extensions/aave/IAaveV3Minimal.sol | 94 ++++++++++++++++++++ contracts/vault/TermMaxVault.sol | 1 - 4 files changed, 205 insertions(+), 1 deletion(-) create mode 100644 contracts/extensions/StakingBuffer.sol create mode 100644 contracts/extensions/aave/AaveVault.sol create mode 100644 contracts/extensions/aave/IAaveV3Minimal.sol diff --git a/contracts/extensions/StakingBuffer.sol b/contracts/extensions/StakingBuffer.sol new file mode 100644 index 0000000..3604a57 --- /dev/null +++ b/contracts/extensions/StakingBuffer.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {TransferUtils, IERC20} from "contracts/lib/TransferUtils.sol"; + +abstract contract StakingBuffer { + using TransferUtils for IERC20; + + error InvalidBuffer(uint256 minimumBuffer, uint256 maximumBuffer, uint256 buffer); + + struct BufferConfig { + uint256 minimumBuffer; + uint256 maximumBuffer; + uint256 buffer; + } + + function _depositWithBuffer(address assertAddr, uint256 amount) internal { + uint256 assetBalance = IERC20(assertAddr).balanceOf(address(this)); + BufferConfig memory bufferConfig = _bufferConfig(assertAddr); + if (assetBalance + amount > bufferConfig.maximumBuffer) { + _depositToPool(assertAddr, assetBalance + amount - bufferConfig.buffer); + } + } + + function _withdrawWithBuffer(address assertAddr, uint256 amount) internal { + uint256 assetBalance = IERC20(assertAddr).balanceOf(address(this)); + BufferConfig memory bufferConfig = _bufferConfig(assertAddr); + if (assetBalance < amount || assetBalance - amount < bufferConfig.minimumBuffer) { + _withdrawFromPool(assertAddr, bufferConfig.buffer + amount - assetBalance); + } + } + + function _bufferConfig(address assertAddr) internal view virtual returns (BufferConfig memory); + + function _depositToPool(address assertAddr, uint256 amount) internal virtual; + + function _withdrawFromPool(address assertAddr, uint256 amount) internal virtual; +} diff --git a/contracts/extensions/aave/AaveVault.sol b/contracts/extensions/aave/AaveVault.sol new file mode 100644 index 0000000..929e9a3 --- /dev/null +++ b/contracts/extensions/aave/AaveVault.sol @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import { + IERC4626, + IERC20, + ERC4626Upgradeable, + ERC20Upgradeable +} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC4626Upgradeable.sol"; +import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; +import {TransferUtils} from "contracts/lib/TransferUtils.sol"; +import {IAaveV3Minimal} from "./IAaveV3Minimal.sol"; +import {StakingBuffer} from "contracts/extensions/StakingBuffer.sol"; + +contract AaveVault is ERC4626Upgradeable, StakingBuffer, ReentrancyGuardUpgradeable { + using TransferUtils for address; + + IERC20 public aToken; + IAaveV3Minimal public aavePool; + uint16 public referralCode; + + function initialize( + string memory name_, + string memory symbol_, + address underlyingAsset_, + address aavePool_, + uint16 referralCode_ + ) external initializer { + __ERC20_init(name_, symbol_); + __ERC4626_init(IERC20(underlyingAsset_)); + __ReentrancyGuard_init(); + + aavePool = IAaveV3Minimal(aavePool_); + aToken = IERC20(aavePool.getReserveData(underlyingAsset_).aTokenAddress); + referralCode = referralCode_; + } + + function totalAssets() public view override returns (uint256) { + return aToken.balanceOf(address(this)); + } + + function _deposit(address caller, address receiver, uint256 assets, uint256 shares) internal override { + TransferUtils.safeTransferFrom(IERC20(asset()), caller, address(this), assets); + _mint(receiver, shares); + _depositWithBuffer(asset(), assets); + emit Deposit(caller, receiver, assets, shares); + } + + function _withdraw(address caller, address receiver, address owner, uint256 assets, uint256 shares) + internal + override + { + if (caller != owner) { + _spendAllowance(owner, caller, shares); + } + + _burn(owner, shares); + _withdrawWithBuffer(asset(), assets); + TransferUtils.safeTransfer(IERC20(asset()), receiver, assets); + + emit Withdraw(caller, receiver, owner, assets, shares); + } + + function _bufferConfig(address assertAddr) internal view virtual override returns (BufferConfig memory) {} + + function _depositToPool(address assertAddr, uint256 amount) internal virtual override { + aavePool.supply(assertAddr, amount, address(this), referralCode); + } + + function _withdrawFromPool(address assertAddr, uint256 amount) internal virtual override { + aavePool.withdraw(assertAddr, amount, address(this)); + } +} diff --git a/contracts/extensions/aave/IAaveV3Minimal.sol b/contracts/extensions/aave/IAaveV3Minimal.sol new file mode 100644 index 0000000..56d979f --- /dev/null +++ b/contracts/extensions/aave/IAaveV3Minimal.sol @@ -0,0 +1,94 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface IAaveV3Minimal { + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + //the current stable borrow rate. Expressed in ray + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + //stableDebtToken address + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115 borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151 supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167 liquidation protocol fee + //bit 168-175 eMode category + //bit 176-211 unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251 debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252-255 unused + uint256 data; + } + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (ReserveData memory); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); +} diff --git a/contracts/vault/TermMaxVault.sol b/contracts/vault/TermMaxVault.sol index f5f8d40..53864f5 100644 --- a/contracts/vault/TermMaxVault.sol +++ b/contracts/vault/TermMaxVault.sol @@ -11,7 +11,6 @@ import { } from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC4626Upgradeable.sol"; import {Ownable2StepUpgradeable} from "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; -import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; import {PendingLib, PendingAddress, PendingUint192} from "contracts/lib/PendingLib.sol"; import {ITermMaxMarket} from "contracts/ITermMaxMarket.sol"; import {CurveCuts, VaultInitialParams} from "contracts/storage/TermMaxStorage.sol"; From 41d0da5f2c93496bd4659922a863b2b63331e88f Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 22 Apr 2025 12:13:31 +0800 Subject: [PATCH 003/194] fix issue --- contracts/extensions/aave/AaveVault.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/extensions/aave/AaveVault.sol b/contracts/extensions/aave/AaveVault.sol index 929e9a3..4dad2fd 100644 --- a/contracts/extensions/aave/AaveVault.sol +++ b/contracts/extensions/aave/AaveVault.sol @@ -36,7 +36,7 @@ contract AaveVault is ERC4626Upgradeable, StakingBuffer, ReentrancyGuardUpgradea } function totalAssets() public view override returns (uint256) { - return aToken.balanceOf(address(this)); + return aToken.balanceOf(address(this)) + IERC20(asset()).balanceOf(address(this)); } function _deposit(address caller, address receiver, uint256 assets, uint256 shares) internal override { From a633a347d9a7fc5a8acc89694f219a108ca91e74 Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 24 Apr 2025 13:11:16 +0800 Subject: [PATCH 004/194] burn ft xt directly --- contracts/ITermMaxMarket.sol | 12 ++++-- contracts/TermMaxMarket.sol | 53 ++++++++++++------------ contracts/TermMaxOrder.sol | 14 +++---- contracts/router/TermMaxRouter.sol | 36 +++++----------- contracts/test/MockFlashLoanReceiver.sol | 4 +- contracts/test/MockOrder.sol | 14 +++---- contracts/tokens/IMintableERC20.sol | 4 +- contracts/tokens/MintableERC20.sol | 7 +++- contracts/vault/OrderManager.sol | 22 ++-------- test/Market.t.sol | 12 +++--- test/mainnet-fork/MarketBaseTest.t.sol | 6 +-- 11 files changed, 79 insertions(+), 105 deletions(-) diff --git a/contracts/ITermMaxMarket.sol b/contracts/ITermMaxMarket.sol index 186cbe2..22bd149 100644 --- a/contracts/ITermMaxMarket.sol +++ b/contracts/ITermMaxMarket.sol @@ -40,8 +40,10 @@ interface ITermMaxMarket { /// @notice Burn FT and XT to get underlying token. /// No price slippage or handling fees. + /// @param owner The owner of the tokens to be burned + /// @param recipient The address to receive the underlying token /// @param debtTokenAmt Amount of underlying token want to get - function burn(address recipient, uint256 debtTokenAmt) external; + function burn(address owner, address recipient, uint256 debtTokenAmt) external; /// @notice Using collateral to issue FT tokens. /// Caller will get FT(bond) tokens equal to the debt amount subtract issue fee @@ -66,12 +68,13 @@ interface ITermMaxMarket { function issueFtByExistedGt(address recipient, uint128 debt, uint256 gtId) external returns (uint128 ftOutAmt); /// @notice Flash loan underlying token for leverage + /// @param xtOwner The owner of XT token /// @param recipient Who will receive Gearing Token /// @param xtAmt The amount of XT token. /// The caller will receive an equal amount of underlying token by flash loan. /// @param callbackData The data of flash loan callback /// @return gtId The id of Gearing Token - function leverageByXt(address recipient, uint128 xtAmt, bytes calldata callbackData) + function leverageByXt(address xtOwner, address recipient, uint128 xtAmt, bytes calldata callbackData) external returns (uint256 gtId); @@ -82,11 +85,12 @@ interface ITermMaxMarket { function previewRedeem(uint256 ftAmount) external view returns (uint256 debtTokenAmt, bytes memory deliveryData); /// @notice Redeem underlying tokens after maturity - /// @param ftAmount The amount of FT want to redeem + /// @param ftOwner The owner of FT token /// @param recipient Who will receive the underlying tokens + /// @param ftAmount The amount of FT want to redeem /// @return debtTokenAmt The amount of debt token /// @return deliveryData The delivery data - function redeem(uint256 ftAmount, address recipient) + function redeem(address ftOwner, address recipient, uint256 ftAmount) external returns (uint256 debtTokenAmt, bytes memory deliveryData); diff --git a/contracts/TermMaxMarket.sol b/contracts/TermMaxMarket.sol index feb3a95..f84b102 100644 --- a/contracts/TermMaxMarket.sol +++ b/contracts/TermMaxMarket.sol @@ -181,41 +181,39 @@ contract TermMaxMarket is emit Mint(caller, recipient, debtTokenAmt); } - function burn(address recipient, uint256 debtTokenAmt) external override nonReentrant isOpen { - _burn(msg.sender, recipient, debtTokenAmt); + function burn(address owner, address recipient, uint256 debtTokenAmt) external override nonReentrant isOpen { + _burn(owner, msg.sender, recipient, debtTokenAmt); } - function _burn(address caller, address recipient, uint256 debtTokenAmt) internal { - ft.safeTransferFrom(caller, address(this), debtTokenAmt); - xt.safeTransferFrom(caller, address(this), debtTokenAmt); - - ft.burn(debtTokenAmt); - xt.burn(debtTokenAmt); + function _burn(address owner, address spender, address recipient, uint256 debtTokenAmt) internal { + ft.burn(owner, spender, debtTokenAmt); + xt.burn(owner, spender, debtTokenAmt); debtToken.safeTransfer(recipient, debtTokenAmt); - emit Burn(caller, recipient, debtTokenAmt); + emit Burn(owner, recipient, debtTokenAmt); } /** * @inheritdoc ITermMaxMarket */ - function leverageByXt(address recipient, uint128 xtAmt, bytes calldata callbackData) + function leverageByXt(address xtOwner, address recipient, uint128 xtAmt, bytes calldata callbackData) external override nonReentrant isOpen returns (uint256 gtId) { - return _leverageByXt(msg.sender, recipient, xtAmt, callbackData); + return _leverageByXt(xtOwner, msg.sender, recipient, xtAmt, callbackData); } - function _leverageByXt(address loanReceiver, address gtReceiver, uint128 xtAmt, bytes calldata callbackData) - internal - returns (uint256 gtId) - { - xt.safeTransferFrom(loanReceiver, address(this), xtAmt); - + function _leverageByXt( + address xtOwner, + address loanReceiver, + address gtReceiver, + uint128 xtAmt, + bytes calldata callbackData + ) internal returns (uint256 gtId) { // Send debt to borrower debtToken.safeTransfer(loanReceiver, xtAmt); // Callback function @@ -231,7 +229,7 @@ contract TermMaxMarket is // Mint GT gtId = gt.mint(loanReceiver, gtReceiver, debt, collateralData); - xt.burn(xtAmt); + xt.burn(xtOwner, msg.sender, xtAmt); emit LeverageByXt(loanReceiver, gtReceiver, gtId, debt, xtAmt, leverageFee, collateralData); } @@ -323,17 +321,17 @@ contract TermMaxMarket is /** * @inheritdoc ITermMaxMarket */ - function redeem(uint256 ftAmount, address recipient) + function redeem(address ftOwner, address recipient, uint256 ftAmount) external virtual override nonReentrant returns (uint256, bytes memory) { - return _redeem(msg.sender, recipient, ftAmount); + return _redeem(ftOwner, msg.sender, recipient, ftAmount); } - function _redeem(address caller, address recipient, uint256 ftAmount) + function _redeem(address ftOwner, address caller, address recipient, uint256 ftAmount) internal returns (uint256 debtTokenAmt, bytes memory deliveryData) { @@ -345,15 +343,18 @@ contract TermMaxMarket is revert CanNotRedeemBeforeFinalLiquidationDeadline(liquidationDeadline); } } - - // Burn ft reserves - ft.burn(ft.balanceOf(address(this))); - - ft.safeTransferFrom(caller, address(this), ftAmount); + // burn ft reserves(from repayment or liquidation) + uint256 ftReserve = ft.balanceOf(address(this)); + if (ftReserve > 0) { + ft.burn(address(this), address(this), ftReserve); + } // The proportion that user will get how many debtToken and collateral should be deliveried uint256 proportion = (ftAmount * Constants.DECIMAL_BASE_SQ) / ft.totalSupply(); + // Burn ft + ft.burn(ftOwner, caller, ftAmount); + deliveryData = gt.delivery(proportion, recipient); // Transfer debtToken output debtTokenAmt += ((debtToken.balanceOf(address(this))) * proportion) / Constants.DECIMAL_BASE_SQ; diff --git a/contracts/TermMaxOrder.sol b/contracts/TermMaxOrder.sol index e1d9c16..340c03c 100644 --- a/contracts/TermMaxOrder.sol +++ b/contracts/TermMaxOrder.sol @@ -491,9 +491,7 @@ contract TermMaxOrder is uint256 ftReserve = getInitialFtReserve(); _issueFtToSelf(ftReserve, netOut + feeAmt, config); } - ft.approve(address(market), netOut); - xt.approve(address(market), netOut); - market.burn(recipient, netOut); + market.burn(address(this), recipient, netOut); return (netOut, feeAmt); } @@ -707,9 +705,7 @@ contract TermMaxOrder is uint256 ftReserve = getInitialFtReserve(); _issueFtToSelf(ftReserve, debtTokenAmtOut + feeAmt, config); } - ft.approve(address(market), debtTokenAmtOut); - xt.approve(address(market), debtTokenAmtOut); - market.burn(recipient, debtTokenAmtOut); + market.burn(address(this), recipient, debtTokenAmtOut); return (netTokenIn, feeAmt); } @@ -762,7 +758,11 @@ contract TermMaxOrder is } function withdrawAssets(IERC20 token, address recipient, uint256 amount) external onlyOwner { - token.safeTransfer(recipient, amount); + if (token == debtToken) { + market.burn(address(this), recipient, amount); + } else { + token.safeTransfer(recipient, amount); + } emit WithdrawAssets(token, _msgSender(), recipient, amount); } diff --git a/contracts/router/TermMaxRouter.sol b/contracts/router/TermMaxRouter.sol index fbf44b8..cf64237 100644 --- a/contracts/router/TermMaxRouter.sol +++ b/contracts/router/TermMaxRouter.sol @@ -181,12 +181,10 @@ contract TermMaxRouter is ) external whenNotPaused returns (uint256 netTokenOut) { (IERC20 ft, IERC20 xt,,, IERC20 debtToken) = market.tokens(); (uint256 maxBurn, IERC20 toenToSell) = ftInAmt > xtInAmt ? (xtInAmt, ft) : (ftInAmt, xt); + market.burn(msg.sender, recipient, maxBurn); + ft.safeTransferFrom(msg.sender, address(this), ftInAmt - maxBurn); + xt.safeTransferFrom(msg.sender, address(this), xtInAmt - maxBurn); - ft.safeTransferFrom(msg.sender, address(this), ftInAmt); - ft.safeIncreaseAllowance(address(market), maxBurn); - xt.safeTransferFrom(msg.sender, address(this), xtInAmt); - xt.safeIncreaseAllowance(address(market), maxBurn); - market.burn(recipient, maxBurn); netTokenOut = _swapExactTokenToToken(toenToSell, debtToken, recipient, orders, amtsToSellTokens, 0, deadline); netTokenOut += maxBurn; if (netTokenOut < minTokenOut) revert InsufficientTokenOut(address(debtToken), netTokenOut, minTokenOut); @@ -210,9 +208,7 @@ contract TermMaxRouter is netXtOut = _swapExactTokenToToken(debtToken, xt, address(this), orders, amtsToBuyXt, minXtOut, deadline); bytes memory callbackData = abi.encode(address(gt), tokenToSwap, units, FlashLoanType.DEBT); - xt.safeIncreaseAllowance(address(market), netXtOut); - - gtId = market.leverageByXt(recipient, netXtOut.toUint128(), callbackData); + gtId = market.leverageByXt(address(this), recipient, netXtOut.toUint128(), callbackData); (,, bytes memory collateralData) = gt.loanInfo(gtId); (, uint128 ltv,) = gt.getLiquidationInfo(gtId); if (ltv > maxLtv) { @@ -233,13 +229,10 @@ contract TermMaxRouter is SwapUnit[] memory units ) external whenNotPaused returns (uint256 gtId) { (, IERC20 xt, IGearingToken gt,, IERC20 debtToken) = market.tokens(); - xt.safeTransferFrom(msg.sender, address(this), xtInAmt); - xt.safeIncreaseAllowance(address(market), xtInAmt); - debtToken.safeTransferFrom(msg.sender, address(this), tokenInAmt); bytes memory callbackData = abi.encode(address(gt), tokenInAmt, units, FlashLoanType.DEBT); - gtId = market.leverageByXt(recipient, xtInAmt.toUint128(), callbackData); + gtId = market.leverageByXt(msg.sender, recipient, xtInAmt.toUint128(), callbackData); (,, bytes memory collateralData) = gt.loanInfo(gtId); (, uint128 ltv,) = gt.getLiquidationInfo(gtId); @@ -262,13 +255,11 @@ contract TermMaxRouter is ) external whenNotPaused returns (uint256 gtId) { (, IERC20 xt, IGearingToken gt, address collAddr,) = market.tokens(); IERC20 collateral = IERC20(collAddr); - xt.safeTransferFrom(msg.sender, address(this), xtInAmt); - xt.safeIncreaseAllowance(address(market), xtInAmt); collateral.safeTransferFrom(msg.sender, address(this), collateralInAmt); bytes memory callbackData = abi.encode(address(gt), 0, units, FlashLoanType.COLLATERAL); - gtId = market.leverageByXt(recipient, xtInAmt.toUint128(), callbackData); + gtId = market.leverageByXt(msg.sender, recipient, xtInAmt.toUint128(), callbackData); (,, bytes memory collateralData) = gt.loanInfo(gtId); (, uint128 ltv,) = gt.getLiquidationInfo(gtId); @@ -325,10 +316,7 @@ contract TermMaxRouter is borrowAmt = borrowAmt.min(ftOutAmt); xt.safeTransferFrom(msg.sender, address(this), borrowAmt); - ft.safeIncreaseAllowance(address(market), borrowAmt); - xt.safeIncreaseAllowance(address(market), borrowAmt); - - market.burn(recipient, borrowAmt); + market.burn(address(this), recipient, borrowAmt); gt.safeTransferFrom(address(this), recipient, gtId); emit Borrow(market, gtId, msg.sender, recipient, collInAmt, debtAmt, borrowAmt.toUint128()); @@ -352,9 +340,7 @@ contract TermMaxRouter is borrowAmt = borrowAmt.min(ftOutAmt); xt.safeTransferFrom(msg.sender, address(this), borrowAmt); - ft.safeIncreaseAllowance(address(market), borrowAmt); - xt.safeIncreaseAllowance(address(market), borrowAmt); - market.burn(recipient, borrowAmt); + market.burn(address(this), recipient, borrowAmt); emit Borrow(market, gtId, msg.sender, recipient, 0, debtAmt, borrowAmt.toUint128()); } @@ -421,10 +407,8 @@ contract TermMaxRouter is SwapUnit[] memory units, uint256 minTokenOut ) external whenNotPaused returns (uint256) { - (IERC20 ft,,, address collateralAddr, IERC20 debtToken) = market.tokens(); - ft.safeTransferFrom(msg.sender, address(this), ftAmount); - ft.safeIncreaseAllowance(address(market), ftAmount); - (uint256 redeemedAmt, bytes memory collateralData) = market.redeem(ftAmount, address(this)); + (,,,, IERC20 debtToken) = market.tokens(); + (uint256 redeemedAmt, bytes memory collateralData) = market.redeem(msg.sender, address(this), ftAmount); redeemedAmt += _decodeAmount(_doSwap(collateralData, units)); if (redeemedAmt < minTokenOut) { revert InsufficientTokenOut(address(debtToken), redeemedAmt, minTokenOut); diff --git a/contracts/test/MockFlashLoanReceiver.sol b/contracts/test/MockFlashLoanReceiver.sol index 1e6ba66..2f420b0 100644 --- a/contracts/test/MockFlashLoanReceiver.sol +++ b/contracts/test/MockFlashLoanReceiver.sol @@ -32,8 +32,6 @@ contract MockFlashLoanReceiver is IFlashLoanReceiver { } function leverageByXt(uint128 xtAmt, bytes calldata callbackData) external returns (uint256 gtId) { - xt.transferFrom(msg.sender, address(this), xtAmt); - xt.approve(address(market), xtAmt); - gtId = market.leverageByXt(msg.sender, xtAmt, callbackData); + gtId = market.leverageByXt(msg.sender, msg.sender, xtAmt, callbackData); } } diff --git a/contracts/test/MockOrder.sol b/contracts/test/MockOrder.sol index 4ffe292..ef5d9bd 100644 --- a/contracts/test/MockOrder.sol +++ b/contracts/test/MockOrder.sol @@ -240,9 +240,7 @@ contract MockOrder is market.mint(address(this), tokenAmtIn); } if (tokenOut == debtToken) { - ft.safeIncreaseAllowance(address(market), minTokenOut); - xt.safeIncreaseAllowance(address(market), minTokenOut); - market.burn(recipient, minTokenOut); + market.burn(address(this), recipient, minTokenOut); } else { tokenOut.safeTransfer(recipient, minTokenOut); } @@ -280,9 +278,7 @@ contract MockOrder is market.mint(address(this), maxTokenIn); } if (tokenOut == debtToken) { - ft.safeIncreaseAllowance(address(market), tokenAmtOut); - xt.safeIncreaseAllowance(address(market), tokenAmtOut); - market.burn(recipient, tokenAmtOut); + market.burn(address(this), recipient, tokenAmtOut); } else { tokenOut.safeTransfer(recipient, tokenAmtOut); } @@ -301,7 +297,11 @@ contract MockOrder is } function withdrawAssets(IERC20 token, address recipient, uint256 amount) external onlyOwner { - token.safeTransfer(recipient, amount); + if (token == debtToken) { + market.burn(address(this), recipient, amount); + } else { + token.safeTransfer(recipient, amount); + } emit WithdrawAssets(token, _msgSender(), recipient, amount); } diff --git a/contracts/tokens/IMintableERC20.sol b/contracts/tokens/IMintableERC20.sol index 203a075..3fedd30 100644 --- a/contracts/tokens/IMintableERC20.sol +++ b/contracts/tokens/IMintableERC20.sol @@ -27,9 +27,11 @@ interface IMintableERC20 is IERC20 { function marketAddr() external view returns (address); /// @notice Burn tokens from sender + /// @param owner The address of the token holder + /// @param spender The address of the token spender /// @param amount The number of tokens to be burned /// @dev Only the market can burn TermMax tokens - function burn(uint256 amount) external; + function burn(address owner, address spender, uint256 amount) external; /** * @dev Returns the decimals places of the token. diff --git a/contracts/tokens/MintableERC20.sol b/contracts/tokens/MintableERC20.sol index 73aa8f9..ed2d600 100644 --- a/contracts/tokens/MintableERC20.sol +++ b/contracts/tokens/MintableERC20.sol @@ -43,8 +43,11 @@ contract MintableERC20 is ERC20Upgradeable, OwnableUpgradeable, IMintableERC20 { /** * @inheritdoc IMintableERC20 */ - function burn(uint256 amount) external override onlyOwner { - _burn(msg.sender, amount); + function burn(address owner, address spender, uint256 amount) external override onlyOwner { + if (owner != spender) { + _spendAllowance(owner, spender, amount); + } + _burn(owner, amount); } /** diff --git a/contracts/vault/OrderManager.sol b/contracts/vault/OrderManager.sol index 8d8bedb..8901787 100644 --- a/contracts/vault/OrderManager.sol +++ b/contracts/vault/OrderManager.sol @@ -129,9 +129,7 @@ contract OrderManager is VaultStorage, VaultErrors, VaultEvents, IOrderManager { // withdraw assets from order and burn to assets order.updateOrder(newOrderConfig, changes, changes); uint256 withdrawChanges = (-changes).toUint256(); - orderInfo.ft.safeIncreaseAllowance(address(orderInfo.market), withdrawChanges); - orderInfo.xt.safeIncreaseAllowance(address(orderInfo.market), withdrawChanges); - orderInfo.market.burn(address(this), withdrawChanges); + orderInfo.market.burn(address(this), address(this), withdrawChanges); } else { // deposit assets to order uint256 depositChanges = uint256(changes); @@ -210,12 +208,10 @@ contract OrderManager is VaultStorage, VaultErrors, VaultEvents, IOrderManager { if (maxWithdraw < amountLeft) { amountLeft -= maxWithdraw; - _burnFromOrder(ITermMaxOrder(order), orderInfo, maxWithdraw); + ITermMaxOrder(order).withdrawAssets(asset, recipient, maxWithdraw); ++i; } else { - _burnFromOrder(ITermMaxOrder(order), orderInfo, amountLeft); - // transfer all assets to recipient - asset.safeTransfer(recipient, amount); + ITermMaxOrder(order).withdrawAssets(asset, recipient, amountLeft); amountLeft = 0; break; } @@ -268,21 +264,11 @@ contract OrderManager is VaultStorage, VaultErrors, VaultEvents, IOrderManager { _totalFt -= amplifiedAmt; } - function _burnFromOrder(ITermMaxOrder order, OrderInfo memory orderInfo, uint256 amount) internal { - order.withdrawAssets(orderInfo.ft, address(this), amount); - order.withdrawAssets(orderInfo.xt, address(this), amount); - orderInfo.ft.safeIncreaseAllowance(address(orderInfo.market), amount); - orderInfo.xt.safeIncreaseAllowance(address(orderInfo.market), amount); - - orderInfo.market.burn(address(this), amount); - } - function _redeemFromMarket(address order, OrderInfo memory orderInfo) internal returns (uint256 totalRedeem) { uint256 ftReserve = orderInfo.ft.balanceOf(order); if (ftReserve != 0) { ITermMaxOrder(order).withdrawAssets(orderInfo.ft, address(this), ftReserve); - orderInfo.ft.safeIncreaseAllowance(address(orderInfo.market), ftReserve); - (totalRedeem,) = orderInfo.market.redeem(ftReserve, address(this)); + (totalRedeem,) = orderInfo.market.redeem(address(this), address(this), ftReserve); if (totalRedeem < ftReserve) { // storage bad debt (,,, address collateral,) = orderInfo.market.tokens(); diff --git a/test/Market.t.sol b/test/Market.t.sol index c48291d..b96a80c 100644 --- a/test/Market.t.sol +++ b/test/Market.t.sol @@ -139,10 +139,8 @@ contract MarketTest is Test { res.debt.approve(address(res.market), amount); res.market.mint(sender, amount); - res.ft.approve(address(res.market), amount); - res.xt.approve(address(res.market), amount); emit MarketEvents.Burn(sender, sender, amount); - res.market.burn(sender, amount); + res.market.burn(sender, sender, amount); assertEq(res.debt.balanceOf(sender), amount); assertEq(res.ft.balanceOf(sender), 0); assertEq(res.xt.balanceOf(sender), 0); @@ -157,7 +155,7 @@ contract MarketTest is Test { res.debt.approve(address(res.market), amount); vm.warp(marketConfig.maturity); vm.expectRevert(abi.encodeWithSelector(MarketErrors.TermIsNotOpen.selector)); - res.market.burn(sender, amount); + res.market.burn(sender, sender, amount); vm.stopPrank(); } @@ -357,7 +355,7 @@ contract MarketTest is Test { vm.expectEmit(); uint128 proportion = uint128(Constants.DECIMAL_BASE_SQ) * depositAmt / (depositAmt + leverageFee); emit MarketEvents.Redeem(bob, bob, proportion, uint128(expectDebt), collateralData); - res.market.redeem(depositAmt, bob); + res.market.redeem(bob, bob, depositAmt); uint256 expectCollateral = abi.decode(collateralData, (uint256)); assertEq(res.debt.balanceOf(bob), expectDebt); @@ -382,13 +380,13 @@ contract MarketTest is Test { vm.expectRevert( abi.encodeWithSelector(MarketErrors.CanNotRedeemBeforeFinalLiquidationDeadline.selector, deadline) ); - res.market.redeem(depositAmt, sender); + res.market.redeem(sender, sender, depositAmt); vm.warp(marketConfig.maturity - 1); vm.expectRevert( abi.encodeWithSelector(MarketErrors.CanNotRedeemBeforeFinalLiquidationDeadline.selector, deadline) ); - res.market.redeem(depositAmt, sender); + res.market.redeem(sender, sender, depositAmt); vm.stopPrank(); } diff --git a/test/mainnet-fork/MarketBaseTest.t.sol b/test/mainnet-fork/MarketBaseTest.t.sol index 2dc5982..382ec8a 100644 --- a/test/mainnet-fork/MarketBaseTest.t.sol +++ b/test/mainnet-fork/MarketBaseTest.t.sol @@ -137,9 +137,7 @@ abstract contract MarketBaseTest is ForkBaseTest { res.debtToken.approve(address(res.market), amount); res.market.mint(taker, amount); - res.ft.approve(address(res.market), amount); - res.xt.approve(address(res.market), amount); - res.market.burn(taker, amount); + res.market.burn(taker, taker, amount); vm.assertEq(res.debtToken.balanceOf(taker), amount); vm.stopPrank(); } @@ -187,7 +185,7 @@ abstract contract MarketBaseTest is ForkBaseTest { vm.expectEmit(); emit MarketEvents.Redeem(bob, bob, uint128(propotion), uint128(redeemAmt), abi.encode(redeemedCollateral)); - res.market.redeem(depositAmt, bob); + res.market.redeem(bob, bob, depositAmt); assertEq(res.debtToken.balanceOf(bob), redeemAmt); assertEq(res.collateral.balanceOf(bob), redeemedCollateral); From 8e836a05b679b8b3b99699bd740d75ff4a280b7e Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 13 May 2025 09:56:25 +0800 Subject: [PATCH 005/194] fix issues --- contracts/router/TermMaxRouter.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/router/TermMaxRouter.sol b/contracts/router/TermMaxRouter.sol index cf64237..139cb52 100644 --- a/contracts/router/TermMaxRouter.sol +++ b/contracts/router/TermMaxRouter.sol @@ -181,9 +181,9 @@ contract TermMaxRouter is ) external whenNotPaused returns (uint256 netTokenOut) { (IERC20 ft, IERC20 xt,,, IERC20 debtToken) = market.tokens(); (uint256 maxBurn, IERC20 toenToSell) = ftInAmt > xtInAmt ? (xtInAmt, ft) : (ftInAmt, xt); - market.burn(msg.sender, recipient, maxBurn); - ft.safeTransferFrom(msg.sender, address(this), ftInAmt - maxBurn); - xt.safeTransferFrom(msg.sender, address(this), xtInAmt - maxBurn); + ft.transferFrom(msg.sender, address(this), ftInAmt); + xt.transferFrom(msg.sender, address(this), xtInAmt); + market.burn(address(this), recipient, maxBurn); netTokenOut = _swapExactTokenToToken(toenToSell, debtToken, recipient, orders, amtsToSellTokens, 0, deadline); netTokenOut += maxBurn; From b3c404f962fcdd0758d1378953a08a5952ed4e3d Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 13 May 2025 11:37:40 +0800 Subject: [PATCH 006/194] integration --- .../{AaveVault.sol => TermMaxAaveVault.sol} | 2 +- contracts/router/TermMaxRouter.sol | 17 +++++++++++++++++ .../router/swapAdapters/ERC4626VaultAdapter.sol | 1 + contracts/router/swapAdapters/OdosV2Adapter.sol | 1 + .../router/swapAdapters/PendleSwapV3Adapter.sol | 1 + .../router/swapAdapters/UniswapV3Adapter.sol | 1 + 6 files changed, 22 insertions(+), 1 deletion(-) rename contracts/extensions/aave/{AaveVault.sol => TermMaxAaveVault.sol} (96%) diff --git a/contracts/extensions/aave/AaveVault.sol b/contracts/extensions/aave/TermMaxAaveVault.sol similarity index 96% rename from contracts/extensions/aave/AaveVault.sol rename to contracts/extensions/aave/TermMaxAaveVault.sol index 4dad2fd..b716f78 100644 --- a/contracts/extensions/aave/AaveVault.sol +++ b/contracts/extensions/aave/TermMaxAaveVault.sol @@ -12,7 +12,7 @@ import {TransferUtils} from "contracts/lib/TransferUtils.sol"; import {IAaveV3Minimal} from "./IAaveV3Minimal.sol"; import {StakingBuffer} from "contracts/extensions/StakingBuffer.sol"; -contract AaveVault is ERC4626Upgradeable, StakingBuffer, ReentrancyGuardUpgradeable { +contract TermMaxAaveVault is ERC4626Upgradeable, StakingBuffer, ReentrancyGuardUpgradeable { using TransferUtils for address; IERC20 public aToken; diff --git a/contracts/router/TermMaxRouter.sol b/contracts/router/TermMaxRouter.sol index 139cb52..4ab21dd 100644 --- a/contracts/router/TermMaxRouter.sol +++ b/contracts/router/TermMaxRouter.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.27; +import {IERC4626} from "@openzeppelin/contracts/interfaces/IERC4626.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {IERC721Enumerable} from "@openzeppelin/contracts/interfaces/IERC721Enumerable.sol"; import {IERC721Receiver} from "@openzeppelin/contracts/interfaces/IERC721Receiver.sol"; @@ -63,6 +64,22 @@ contract TermMaxRouter is __Ownable_init(admin); } + function depositAndMint(ITermMaxMarket market, address recipient, uint256 amount) external whenNotPaused { + (,,,, IERC20 underlying) = market.tokens(); + IERC4626 vault = IERC4626(address(underlying)); + IERC20(vault.asset()).safeTransferFrom(msg.sender, address(this), amount); + underlying.safeIncreaseAllowance(address(market), amount); + market.mint(recipient, amount); + } + + function burnAndWithdraw(ITermMaxMarket market, address recipient, uint256 amount) external whenNotPaused { + (IERC20 ft, IERC20 xt,,, IERC20 underlying) = market.tokens(); + ft.safeTransferFrom(msg.sender, address(this), amount); + xt.safeTransferFrom(msg.sender, address(this), amount); + market.burn(address(this), address(this), amount); + IERC4626(address(underlying)).redeem(amount, recipient, address(this)); + } + /** * @inheritdoc ITermMaxRouter */ diff --git a/contracts/router/swapAdapters/ERC4626VaultAdapter.sol b/contracts/router/swapAdapters/ERC4626VaultAdapter.sol index 88ae1f9..e901294 100644 --- a/contracts/router/swapAdapters/ERC4626VaultAdapter.sol +++ b/contracts/router/swapAdapters/ERC4626VaultAdapter.sol @@ -11,6 +11,7 @@ import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; */ contract ERC4626VaultAdapter is ERC20SwapAdapter { using TransferUtils for IERC20; + enum Action { Deposit, Redeem diff --git a/contracts/router/swapAdapters/OdosV2Adapter.sol b/contracts/router/swapAdapters/OdosV2Adapter.sol index d0c91e5..99438ea 100644 --- a/contracts/router/swapAdapters/OdosV2Adapter.sol +++ b/contracts/router/swapAdapters/OdosV2Adapter.sol @@ -26,6 +26,7 @@ interface IOdosRouterV2 { */ contract OdosV2Adapter is ERC20SwapAdapter { using TransferUtils for IERC20; + error InvalidOutputToken(); IOdosRouterV2 public immutable router; diff --git a/contracts/router/swapAdapters/PendleSwapV3Adapter.sol b/contracts/router/swapAdapters/PendleSwapV3Adapter.sol index 0e1031b..9068e9f 100644 --- a/contracts/router/swapAdapters/PendleSwapV3Adapter.sol +++ b/contracts/router/swapAdapters/PendleSwapV3Adapter.sol @@ -12,6 +12,7 @@ import "./ERC20SwapAdapter.sol"; contract PendleSwapV3Adapter is ERC20SwapAdapter, PendleHelper { using TransferUtils for IERC20; + IPAllActionV3 public immutable router; constructor(address router_) { diff --git a/contracts/router/swapAdapters/UniswapV3Adapter.sol b/contracts/router/swapAdapters/UniswapV3Adapter.sol index 6f6fa20..cddd085 100644 --- a/contracts/router/swapAdapters/UniswapV3Adapter.sol +++ b/contracts/router/swapAdapters/UniswapV3Adapter.sol @@ -11,6 +11,7 @@ import "./ERC20SwapAdapter.sol"; */ contract UniswapV3Adapter is ERC20SwapAdapter { using TransferUtils for IERC20; + ISwapRouter public immutable router; constructor(address router_) { From 3ab7cbb9be325a81c9f9abcd39c1591e12f251e2 Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 13 May 2025 11:52:53 +0800 Subject: [PATCH 007/194] market v2 --- contracts/TermMaxMarketV2.sol | 412 ++++++++++++++++++ contracts/extensions/StakingBuffer.sol | 22 +- .../extensions/aave/TermMaxAaveVault.sol | 7 +- 3 files changed, 426 insertions(+), 15 deletions(-) create mode 100644 contracts/TermMaxMarketV2.sol diff --git a/contracts/TermMaxMarketV2.sol b/contracts/TermMaxMarketV2.sol new file mode 100644 index 0000000..3b54ea9 --- /dev/null +++ b/contracts/TermMaxMarketV2.sol @@ -0,0 +1,412 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.27; + +import { + OwnableUpgradeable, + Ownable2StepUpgradeable +} from "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; +import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; +import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol"; +import {ITermMaxMarket, IMintableERC20, IERC20} from "./ITermMaxMarket.sol"; +import {IGearingToken} from "./tokens/IGearingToken.sol"; +import {IFlashLoanReceiver} from "./IFlashLoanReceiver.sol"; +import {ITermMaxOrder} from "./ITermMaxOrder.sol"; +import {Constants} from "./lib/Constants.sol"; +import {MarketConstants} from "./lib/MarketConstants.sol"; +import {MarketErrors} from "./errors/MarketErrors.sol"; +import {MarketEvents} from "./events/MarketEvents.sol"; +import {StringUtil} from "./lib/StringUtil.sol"; +import {MarketConfig, MarketInitialParams, GtConfig, CurveCuts, FeeConfig} from "./storage/TermMaxStorage.sol"; +import {ISwapCallback} from "./ISwapCallback.sol"; +import {TransferUtils} from "./lib/TransferUtils.sol"; +import {IAaveV3Minimal} from "contracts/extensions/aave/IAaveV3Minimal.sol"; +import {StakingBuffer} from "./extensions/StakingBuffer.sol"; +/** + * @title TermMax Market + * @author Term Structure Labs + */ + +contract TermMaxMarketV2 is + ITermMaxMarket, + ReentrancyGuardUpgradeable, + Ownable2StepUpgradeable, + StakingBuffer, + MarketErrors, + MarketEvents +{ + using SafeCast for uint256; + using SafeCast for int256; + using TransferUtils for IERC20; + using TransferUtils for IMintableERC20; + using StringUtil for string; + + address immutable MINTABLE_ERC20_IMPLEMENT; + address immutable TERMMAX_ORDER_IMPLEMENT; + + IERC20 public aToken; + IAaveV3Minimal public aavePool; + uint16 public referralCode; + + MarketConfig private _config; + address private collateral; + IERC20 private debtToken; + IMintableERC20 private ft; + IMintableERC20 private xt; + IGearingToken private gt; + + /// @notice Check if the market is tradable + modifier isOpen() { + if (block.timestamp >= _config.maturity) { + revert TermIsNotOpen(); + } + _; + } + + constructor(address MINTABLE_ERC20_IMPLEMENT_, address TERMMAX_ORDER_IMPLEMENT_) { + MINTABLE_ERC20_IMPLEMENT = MINTABLE_ERC20_IMPLEMENT_; + TERMMAX_ORDER_IMPLEMENT = TERMMAX_ORDER_IMPLEMENT_; + _disableInitializers(); + } + + function mintGtFeeRatio() public view override returns (uint256) { + uint256 daysToMaturity = _daysToMaturity(_config.maturity); + return (daysToMaturity * uint256(_config.feeConfig.mintGtFeeRatio) * uint256(_config.feeConfig.mintGtFeeRef)) + / (Constants.DAYS_IN_YEAR * Constants.DECIMAL_BASE + uint256(_config.feeConfig.mintGtFeeRef) * daysToMaturity); + } + + /** + * @inheritdoc ITermMaxMarket + */ + function initialize(MarketInitialParams memory params) external override initializer { + __Ownable_init(params.admin); + __ReentrancyGuard_init(); + if (params.collateral == address(params.debtToken)) revert CollateralCanNotEqualUnderlyinng(); + MarketConfig memory config_ = params.marketConfig; + if (config_.maturity <= block.timestamp) revert InvalidMaturity(); + _checkFee(config_.feeConfig); + + debtToken = params.debtToken; + collateral = params.collateral; + _config = config_; + + (ft, xt, gt) = _deployTokens(params); + + emit MarketInitialized(params.collateral, params.debtToken, _config.maturity, ft, xt, gt); + } + + function _deployTokens(MarketInitialParams memory params) + internal + returns (IMintableERC20 ft_, IMintableERC20 xt_, IGearingToken gt_) + { + ft_ = IMintableERC20(Clones.clone(MINTABLE_ERC20_IMPLEMENT)); + xt_ = IMintableERC20(Clones.clone(MINTABLE_ERC20_IMPLEMENT)); + gt_ = IGearingToken(Clones.clone(params.gtImplementation)); + uint8 decimals = params.debtToken.decimals(); + ft_.initialize( + MarketConstants.PREFIX_FT.contact(params.tokenName), + MarketConstants.PREFIX_FT.contact(params.tokenSymbol), + decimals + ); + xt_.initialize( + MarketConstants.PREFIX_XT.contact(params.tokenName), + MarketConstants.PREFIX_XT.contact(params.tokenSymbol), + decimals + ); + gt_.initialize( + MarketConstants.PREFIX_GT.contact(params.tokenName), + MarketConstants.PREFIX_GT.contact(params.tokenSymbol), + GtConfig( + params.collateral, + params.debtToken, + ft_, + params.marketConfig.treasurer, + params.marketConfig.maturity, + params.loanConfig + ), + params.gtInitalParams + ); + } + + function _contactString(string memory a, string memory b) internal pure returns (string memory) { + return string(abi.encodePacked(a, b)); + } + + /** + * @inheritdoc ITermMaxMarket + */ + function config() public view override returns (MarketConfig memory) { + return _config; + } + + /** + * @inheritdoc ITermMaxMarket + */ + function tokens() external view override returns (IMintableERC20, IMintableERC20, IGearingToken, address, IERC20) { + return (ft, xt, gt, collateral, debtToken); + } + + /** + * @inheritdoc ITermMaxMarket + */ + function updateMarketConfig(MarketConfig calldata newConfig) external override onlyOwner { + MarketConfig memory mConfig = _config; + if (newConfig.treasurer != mConfig.treasurer) { + mConfig.treasurer = newConfig.treasurer; + gt.setTreasurer(newConfig.treasurer); + } + _checkFee(newConfig.feeConfig); + mConfig.feeConfig = newConfig.feeConfig; + + _config = mConfig; + emit UpdateMarketConfig(mConfig); + } + + function _checkFee(FeeConfig memory fee) internal pure { + if ( + fee.borrowTakerFeeRatio >= Constants.MAX_FEE_RATIO || fee.borrowMakerFeeRatio >= Constants.MAX_FEE_RATIO + || fee.lendTakerFeeRatio >= Constants.MAX_FEE_RATIO || fee.lendMakerFeeRatio >= Constants.MAX_FEE_RATIO + || fee.mintGtFeeRatio >= Constants.MAX_FEE_RATIO || fee.mintGtFeeRef > 5 * Constants.DECIMAL_BASE + ) revert FeeTooHigh(); + } + + /// @notice Calculate how many days until expiration + function _daysToMaturity(uint256 maturity) internal view returns (uint256 daysToMaturity) { + daysToMaturity = (maturity - block.timestamp + Constants.SECONDS_IN_DAY - 1) / Constants.SECONDS_IN_DAY; + } + + function mint(address recipient, uint256 debtTokenAmt) external override nonReentrant isOpen { + _mint(msg.sender, recipient, debtTokenAmt); + } + + function _mint(address caller, address recipient, uint256 debtTokenAmt) internal { + debtToken.safeTransferFrom(caller, address(this), debtTokenAmt); + + ft.mint(recipient, debtTokenAmt); + xt.mint(recipient, debtTokenAmt); + _depositWithBuffer(address(debtToken), debtTokenAmt); + + emit Mint(caller, recipient, debtTokenAmt); + } + + function burn(address owner, address recipient, uint256 debtTokenAmt) external override nonReentrant isOpen { + _burn(owner, msg.sender, recipient, debtTokenAmt); + } + + function _burn(address owner, address spender, address recipient, uint256 debtTokenAmt) internal { + ft.burn(owner, spender, debtTokenAmt); + xt.burn(owner, spender, debtTokenAmt); + + debtToken.safeTransfer(recipient, debtTokenAmt); + _withdrawWithBuffer(address(debtToken), recipient, debtTokenAmt); + emit Burn(owner, recipient, debtTokenAmt); + } + + /** + * @inheritdoc ITermMaxMarket + */ + function leverageByXt(address xtOwner, address recipient, uint128 xtAmt, bytes calldata callbackData) + external + override + nonReentrant + isOpen + returns (uint256 gtId) + { + return _leverageByXt(xtOwner, msg.sender, recipient, xtAmt, callbackData); + } + + function _leverageByXt( + address xtOwner, + address loanReceiver, + address gtReceiver, + uint128 xtAmt, + bytes calldata callbackData + ) internal returns (uint256 gtId) { + // Send debt to borrower + _withdrawWithBuffer(address(debtToken), loanReceiver, xtAmt); + // Callback function + bytes memory collateralData = + IFlashLoanReceiver(loanReceiver).executeOperation(gtReceiver, debtToken, xtAmt, callbackData); + + uint128 debt = ((xtAmt * Constants.DECIMAL_BASE) / (Constants.DECIMAL_BASE - mintGtFeeRatio())).toUint128(); + + MarketConfig memory mConfig = _config; + uint128 leverageFee = debt - xtAmt; + ft.mint(mConfig.treasurer, leverageFee); + + // Mint GT + gtId = gt.mint(loanReceiver, gtReceiver, debt, collateralData); + + xt.burn(xtOwner, msg.sender, xtAmt); + emit LeverageByXt(loanReceiver, gtReceiver, gtId, debt, xtAmt, leverageFee, collateralData); + } + + /** + * @inheritdoc ITermMaxMarket + */ + function issueFt(address recipient, uint128 debt, bytes calldata collateralData) + external + override + nonReentrant + isOpen + returns (uint256 gtId, uint128 ftOutAmt) + { + return _issueFt(msg.sender, recipient, debt, collateralData); + } + + function _issueFt(address caller, address recipient, uint128 debt, bytes calldata collateralData) + internal + returns (uint256 gtId, uint128 ftOutAmt) + { + // Mint GT + gtId = gt.mint(caller, recipient, debt, collateralData); + + MarketConfig memory mConfig = _config; + uint128 issueFee = ((debt * mintGtFeeRatio()) / Constants.DECIMAL_BASE).toUint128(); + // Mint ft amount = debt amount, send issueFee to treasurer and other to caller + ft.mint(mConfig.treasurer, issueFee); + ftOutAmt = debt - issueFee; + ft.mint(recipient, ftOutAmt); + + emit IssueFt(caller, recipient, gtId, debt, ftOutAmt, issueFee, collateralData); + } + + /** + * @inheritdoc ITermMaxMarket + */ + function issueFtByExistedGt(address recipient, uint128 debt, uint256 gtId) + external + override + nonReentrant + isOpen + returns (uint128 ftOutAmt) + { + return _issueFtByExistedGt(msg.sender, recipient, debt, gtId); + } + + function _issueFtByExistedGt(address caller, address recipient, uint128 debt, uint256 gtId) + internal + returns (uint128 ftOutAmt) + { + gt.augmentDebt(caller, gtId, debt); + + MarketConfig memory mConfig = _config; + uint128 issueFee = ((debt * mintGtFeeRatio()) / Constants.DECIMAL_BASE).toUint128(); + // Mint ft amount = debt amount, send issueFee to treasurer and other to caller + ft.mint(mConfig.treasurer, issueFee); + ftOutAmt = debt - issueFee; + ft.mint(recipient, ftOutAmt); + + emit IssueFtByExistedGt(caller, recipient, gtId, debt, ftOutAmt, issueFee); + } + + /** + * @inheritdoc ITermMaxMarket + */ + function previewRedeem(uint256 ftAmount) + external + view + override + returns (uint256 debtTokenAmt, bytes memory deliveryData) + { + MarketConfig memory mConfig = _config; + { + uint256 liquidationDeadline = + gt.liquidatable() ? mConfig.maturity + Constants.LIQUIDATION_WINDOW : mConfig.maturity; + if (block.timestamp < liquidationDeadline) { + revert CanNotRedeemBeforeFinalLiquidationDeadline(liquidationDeadline); + } + } + + // The proportion that user will get how many debtToken and collateral should be deliveried + uint256 proportion = (ftAmount * Constants.DECIMAL_BASE_SQ) / (ft.totalSupply() - ft.balanceOf(address(this))); + + deliveryData = gt.previewDelivery(proportion); + debtTokenAmt = debtToken.balanceOf(address(this)) + aToken.balanceOf(address(this)); + + debtTokenAmt = (debtTokenAmt * proportion) / Constants.DECIMAL_BASE_SQ; + } + + /** + * @inheritdoc ITermMaxMarket + */ + function redeem(address ftOwner, address recipient, uint256 ftAmount) + external + virtual + override + nonReentrant + returns (uint256, bytes memory) + { + return _redeem(ftOwner, msg.sender, recipient, ftAmount); + } + + function _redeem(address ftOwner, address caller, address recipient, uint256 ftAmount) + internal + returns (uint256 debtTokenAmt, bytes memory deliveryData) + { + MarketConfig memory mConfig = _config; + { + uint256 liquidationDeadline = + gt.liquidatable() ? mConfig.maturity + Constants.LIQUIDATION_WINDOW : mConfig.maturity; + if (block.timestamp < liquidationDeadline) { + revert CanNotRedeemBeforeFinalLiquidationDeadline(liquidationDeadline); + } + } + // burn ft reserves(from repayment or liquidation) + uint256 ftReserve = ft.balanceOf(address(this)); + if (ftReserve > 0) { + ft.burn(address(this), address(this), ftReserve); + } + + // The proportion that user will get how many debtToken and collateral should be deliveried + uint256 proportion = (ftAmount * Constants.DECIMAL_BASE_SQ) / ft.totalSupply(); + + // Burn ft + ft.burn(ftOwner, caller, ftAmount); + + deliveryData = gt.delivery(proportion, recipient); + // Transfer debtToken output + debtTokenAmt = debtToken.balanceOf(address(this)) + aToken.balanceOf(address(this)); + debtTokenAmt = (debtTokenAmt * proportion) / Constants.DECIMAL_BASE_SQ; + _withdrawWithBuffer(address(debtToken), recipient, debtTokenAmt); + emit Redeem(caller, recipient, proportion.toUint128(), debtTokenAmt.toUint128(), deliveryData); + } + + /** + * @inheritdoc ITermMaxMarket + */ + function updateGtConfig(bytes memory configData) external override onlyOwner { + gt.updateConfig(configData); + } + + /** + * @inheritdoc ITermMaxMarket + */ + function createOrder(address maker, uint256 maxXtReserve, ISwapCallback swapTrigger, CurveCuts memory curveCuts) + external + nonReentrant + isOpen + returns (ITermMaxOrder order) + { + order = ITermMaxOrder(Clones.clone(TERMMAX_ORDER_IMPLEMENT)); + order.initialize(maker, [ft, xt, debtToken], gt, maxXtReserve, swapTrigger, curveCuts, _config); + emit CreateOrder(maker, order); + } + + function updateOrderFeeRate(ITermMaxOrder order, FeeConfig memory newFeeConfig) external onlyOwner { + _checkFee(newFeeConfig); + order.updateFeeConfig(newFeeConfig); + } + + function _bufferConfig(address) internal view virtual override returns (BufferConfig memory) { + return BufferConfig(0, 0, 0); + } + + function _depositToPool(address assetAddr, uint256 amount) internal virtual override { + aavePool.supply(assetAddr, amount, address(this), referralCode); + } + + function _withdrawFromPool(address assetAddr, address to, uint256 amount) internal virtual override { + aavePool.withdraw(assetAddr, amount, to); + } +} diff --git a/contracts/extensions/StakingBuffer.sol b/contracts/extensions/StakingBuffer.sol index 3604a57..f6ce74a 100644 --- a/contracts/extensions/StakingBuffer.sol +++ b/contracts/extensions/StakingBuffer.sol @@ -14,25 +14,25 @@ abstract contract StakingBuffer { uint256 buffer; } - function _depositWithBuffer(address assertAddr, uint256 amount) internal { - uint256 assetBalance = IERC20(assertAddr).balanceOf(address(this)); - BufferConfig memory bufferConfig = _bufferConfig(assertAddr); + function _depositWithBuffer(address assetAddr, uint256 amount) internal { + uint256 assetBalance = IERC20(assetAddr).balanceOf(address(this)); + BufferConfig memory bufferConfig = _bufferConfig(assetAddr); if (assetBalance + amount > bufferConfig.maximumBuffer) { - _depositToPool(assertAddr, assetBalance + amount - bufferConfig.buffer); + _depositToPool(assetAddr, assetBalance + amount - bufferConfig.buffer); } } - function _withdrawWithBuffer(address assertAddr, uint256 amount) internal { - uint256 assetBalance = IERC20(assertAddr).balanceOf(address(this)); - BufferConfig memory bufferConfig = _bufferConfig(assertAddr); + function _withdrawWithBuffer(address assetAddr, address to, uint256 amount) internal { + uint256 assetBalance = IERC20(assetAddr).balanceOf(address(this)); + BufferConfig memory bufferConfig = _bufferConfig(assetAddr); if (assetBalance < amount || assetBalance - amount < bufferConfig.minimumBuffer) { - _withdrawFromPool(assertAddr, bufferConfig.buffer + amount - assetBalance); + _withdrawFromPool(assetAddr, to, bufferConfig.buffer + amount - assetBalance); } } - function _bufferConfig(address assertAddr) internal view virtual returns (BufferConfig memory); + function _bufferConfig(address assetAddr) internal view virtual returns (BufferConfig memory); - function _depositToPool(address assertAddr, uint256 amount) internal virtual; + function _depositToPool(address assetAddr, uint256 amount) internal virtual; - function _withdrawFromPool(address assertAddr, uint256 amount) internal virtual; + function _withdrawFromPool(address assetAddr, address to, uint256 amount) internal virtual; } diff --git a/contracts/extensions/aave/TermMaxAaveVault.sol b/contracts/extensions/aave/TermMaxAaveVault.sol index b716f78..adbc014 100644 --- a/contracts/extensions/aave/TermMaxAaveVault.sol +++ b/contracts/extensions/aave/TermMaxAaveVault.sol @@ -55,8 +55,7 @@ contract TermMaxAaveVault is ERC4626Upgradeable, StakingBuffer, ReentrancyGuardU } _burn(owner, shares); - _withdrawWithBuffer(asset(), assets); - TransferUtils.safeTransfer(IERC20(asset()), receiver, assets); + _withdrawWithBuffer(asset(), receiver, assets); emit Withdraw(caller, receiver, owner, assets, shares); } @@ -67,7 +66,7 @@ contract TermMaxAaveVault is ERC4626Upgradeable, StakingBuffer, ReentrancyGuardU aavePool.supply(assertAddr, amount, address(this), referralCode); } - function _withdrawFromPool(address assertAddr, uint256 amount) internal virtual override { - aavePool.withdraw(assertAddr, amount, address(this)); + function _withdrawFromPool(address assertAddr, address to, uint256 amount) internal virtual override { + aavePool.withdraw(assertAddr, amount, to); } } From f87228f14f286ffc49c8584f51ceb75b3d8bbb46 Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 15 May 2025 14:00:00 +0800 Subject: [PATCH 008/194] rollover and ut --- contracts/router/TermMaxRouter.sol | 98 +++++++++++++++++++- test/mainnet-fork/mainnet/ForkRollOver.t.sol | 64 +++++++++++++ 2 files changed, 159 insertions(+), 3 deletions(-) create mode 100644 test/mainnet-fork/mainnet/ForkRollOver.t.sol diff --git a/contracts/router/TermMaxRouter.sol b/contracts/router/TermMaxRouter.sol index fbf44b8..3480047 100644 --- a/contracts/router/TermMaxRouter.sol +++ b/contracts/router/TermMaxRouter.sol @@ -52,9 +52,16 @@ contract TermMaxRouter is DEBT } + enum FlashRepayOptions { + REPAY, + ROLLOVER + } + /// @notice whitelist mapping of adapter mapping(address => bool) public adapterWhitelist; + uint256 private constant T_ROLLOVER_GT_RESERVE_STORE = 0; + function _authorizeUpgrade(address newImplementation) internal virtual override onlyOwner {} function initialize(address admin) public initializer { @@ -374,7 +381,9 @@ contract TermMaxRouter is ) external whenNotPaused returns (uint256 netTokenOut) { (IERC20 ft,, IGearingToken gt,, IERC20 debtToken) = market.tokens(); gt.safeTransferFrom(msg.sender, address(this), gtId, ""); - gt.flashRepay(gtId, byDebtToken, abi.encode(orders, amtsToBuyFt, ft, units, deadline)); + bytes memory callbackData = abi.encode(orders, amtsToBuyFt, ft, units, deadline); + callbackData = abi.encode(FlashRepayOptions.REPAY, callbackData); + gt.flashRepay(gtId, byDebtToken, callbackData); netTokenOut = debtToken.balanceOf(address(this)); debtToken.safeTransfer(recipient, netTokenOut); } @@ -421,7 +430,7 @@ contract TermMaxRouter is SwapUnit[] memory units, uint256 minTokenOut ) external whenNotPaused returns (uint256) { - (IERC20 ft,,, address collateralAddr, IERC20 debtToken) = market.tokens(); + (IERC20 ft,,,, IERC20 debtToken) = market.tokens(); ft.safeTransferFrom(msg.sender, address(this), ftAmount); ft.safeIncreaseAllowance(address(market), ftAmount); (uint256 redeemedAmt, bytes memory collateralData) = market.redeem(ftAmount, address(this)); @@ -461,6 +470,31 @@ contract TermMaxRouter is emit CreateOrderAndDeposit(market, order, maker, debtTokenToDeposit, ftToDeposit, xtToDeposit, curveCuts); } + function rolloverGt( + address recipient, + IGearingToken gt, + uint256 gtId, + ITermMaxOrder[] memory sellFtOrders, + uint128[] memory amtsToSellFt, + uint128 maxLtv, + ITermMaxMarket nextMarket, + SwapUnit[] memory units, + uint256 deadline + ) external whenNotPaused returns (uint256 newGtId) { + // clear ts stograge + assembly { + tstore(T_ROLLOVER_GT_RESERVE_STORE, 0) + } + gt.safeTransferFrom(msg.sender, address(this), gtId, ""); + bytes memory callbackData = + abi.encode(recipient, sellFtOrders, amtsToSellFt, maxLtv, nextMarket, units, deadline); + callbackData = abi.encode(FlashRepayOptions.ROLLOVER, callbackData); + gt.flashRepay(gtId, true, callbackData); + assembly { + newGtId := tload(T_ROLLOVER_GT_RESERVE_STORE) + } + } + /// @dev Market flash leverage flashloan callback function executeOperation(address, IERC20, uint256 amount, bytes memory data) external @@ -511,6 +545,16 @@ contract TermMaxRouter is bytes memory collateralData, bytes memory callbackData ) external override { + (FlashRepayOptions option, bytes memory data) = abi.decode(callbackData, (FlashRepayOptions, bytes)); + if (option == FlashRepayOptions.REPAY) { + _flashRepay(repayToken, collateralData, data); + } else if (option == FlashRepayOptions.ROLLOVER) { + _rollover(repayToken, collateralData, data); + } + repayToken.safeIncreaseAllowance(msg.sender, debtAmt); + } + + function _flashRepay(IERC20 repayToken, bytes memory collateralData, bytes memory callbackData) internal { ( ITermMaxOrder[] memory orders, uint128[] memory amtsToBuyFt, @@ -525,7 +569,55 @@ contract TermMaxRouter is uint256 amount = abi.decode(outData, (uint256)); _swapTokenToExactToken(debtToken, ft, address(this), orders, amtsToBuyFt, amount.toUint128(), deadline); } - repayToken.safeIncreaseAllowance(msg.sender, debtAmt); + } + + function _rollover(IERC20 debtToken, bytes memory collateralData, bytes memory callbackData) internal { + ( + address recipient, + ITermMaxOrder[] memory sellFtOrders, + uint128[] memory amtsToSellFt, + uint128 maxLtv, + ITermMaxMarket market, + SwapUnit[] memory units, + uint256 deadline + ) = abi.decode( + callbackData, (address, ITermMaxOrder[], uint128[], uint128, ITermMaxMarket, SwapUnit[], uint256) + ); + { + // swap collateral + collateralData = units.length == 0 ? collateralData : _doSwap(collateralData, units); + } + uint256 totalFtAmt = sum(amtsToSellFt); + (IERC20 ft,, IGearingToken gt, address collateral,) = market.tokens(); + uint256 gtId; + { + // issue new gt + uint256 mintGtFeeRatio = market.mintGtFeeRatio(); + uint128 newDebtAmt = + ((totalFtAmt * Constants.DECIMAL_BASE) / (Constants.DECIMAL_BASE - mintGtFeeRatio)).toUint128(); + IERC20(collateral).safeIncreaseAllowance(address(market), _decodeAmount(collateralData)); + collateralData = units.length == 0 ? collateralData : _doSwap(collateralData, units); + (gtId,) = market.issueFt(address(this), newDebtAmt, collateralData); + } + { + uint256 netFtIn = _swapTokenToExactToken( + ft, debtToken, address(this), sellFtOrders, amtsToSellFt, totalFtAmt.toUint128(), deadline + ); + if (totalFtAmt > netFtIn) { + uint256 repayAmt = totalFtAmt - netFtIn; + ft.safeIncreaseAllowance(address(gt), repayAmt); + gt.repay(gtId, repayAmt.toUint128(), false); + } + (, uint128 ltv,) = gt.getLiquidationInfo(gtId); + if (ltv > maxLtv) { + revert LtvBiggerThanExpected(maxLtv, ltv); + } + } + // transfer new gt to recipient + gt.safeTransferFrom(address(this), recipient, gtId); + assembly { + tstore(T_ROLLOVER_GT_RESERVE_STORE, gtId) + } } function _doSwap(bytes memory inputData, SwapUnit[] memory units) internal returns (bytes memory outData) { diff --git a/test/mainnet-fork/mainnet/ForkRollOver.t.sol b/test/mainnet-fork/mainnet/ForkRollOver.t.sol new file mode 100644 index 0000000..c428121 --- /dev/null +++ b/test/mainnet-fork/mainnet/ForkRollOver.t.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; +import "../ForkBaseTest.sol"; +import {PriceFeedFactory} from "contracts/extensions/PriceFeedFactory.sol"; +import {ITermMaxMarket} from "contracts/ITermMaxMarket.sol"; + +contract ForkRollOver is ForkBaseTest { + string MAINNET_RPC_URL = vm.envString("MAINNET_RPC_URL"); + string DATA_PATH = string.concat(vm.projectRoot(), "/test/testdata/fork/mainnet.json"); + + function _getForkRpcUrl() internal view override returns (string memory) { + return MAINNET_RPC_URL; + } + + function _getDataPath() internal view override returns (string memory) { + return DATA_PATH; + } + + function _finishSetup() internal override {} + + function testRolloverPt() public { + vm.roll(22486319); // 2025-08-01 00:00:00 + uint64 may_30 = 1748534400; // 2025-05-30 00:00:00 + uint64 aug_1 = 1753977600; // 2025-08-01 00:00:00 + address pt_susde_may_29 = 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308; + address pt_susde_jun_31 = 0x3b3fB9C57858EF816833dC91565EFcd85D96f634; + address usdc = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; + IOracle oracle = IOracle(0xE3a31690392E8E18DC3d862651C079339E2c1ADE); + ITermMaxRouter router = ITermMaxRouter(0xC47591F5c023e44931c78D5A993834875b79FB11); + ITermMaxMarket mmay_30 = ITermMaxMarket(0xe867255dC0c3a27c90f756ECC566a5292ce19492); + ITermMaxMarket maug_1 = ITermMaxMarket(0xdBB2D44c238c459cCB820De886ABF721EF6E6941); + string memory key = "sUSDe-USDC"; + OrderConfig memory orderConfig = _readOrderConfig(key); + MarketInitialParams memory marketInitialParams = _readMarketInitialParams(key); + marketInitialParams.collateral = pt_susde_may_29; + marketInitialParams.marketConfig.maturity = may_30; // 2025-05-30 00:00:00 + marketInitialParams.loanConfig.oracle = oracle; + + address borrower = vm.randomAddress(); + address admin = vm.randomAddress(); + + bytes32 GT_ERC20 = keccak256("GearingTokenWithERC20"); + + TermMaxFactory termMaxFactory = deployFactory(admin); + vm.startPrank(admin); + ITermMaxMarket m1 = ITermMaxMarket(termMaxFactory.createMarket(GT_ERC20, marketInitialParams, 0)); + + marketInitialParams.collateral = pt_susde_jun_31; + marketInitialParams.marketConfig.maturity = aug_1; // 2025-08-01 00:00:00 + marketInitialParams.loanConfig.oracle = oracle; + + ITermMaxMarket m2 = ITermMaxMarket(termMaxFactory.createMarket(GT_ERC20, marketInitialParams, 0)); + + ITermMaxOrder o1 = m1.createOrder(orderConfig, borrower, 1000e6, 1000e6, 1000e6); + vm.stopPrank(); + + vm.startPrank(borrower); + vm.deal(borrower, 100 ether); + deal(usdc, borrower, 10000e6); + + } +} From ef1aad4fdc0a43a9fbe7a191bdca8a9a7a07b061 Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 15 May 2025 16:22:59 +0800 Subject: [PATCH 009/194] images --- iamges/v2_burn.md | 42 ++++++++++++++++++++++++++++++++++++++++++ iamges/v2_mint.md | 37 +++++++++++++++++++++++++++++++++++++ iamges/vault_burn.md | 38 ++++++++++++++++++++++++++++++++++++++ iamges/vault_mint.md | 31 +++++++++++++++++++++++++++++++ 4 files changed, 148 insertions(+) create mode 100644 iamges/v2_burn.md create mode 100644 iamges/v2_mint.md create mode 100644 iamges/vault_burn.md create mode 100644 iamges/vault_mint.md diff --git a/iamges/v2_burn.md b/iamges/v2_burn.md new file mode 100644 index 0000000..ce5b9e1 --- /dev/null +++ b/iamges/v2_burn.md @@ -0,0 +1,42 @@ +```mermaid +sequenceDiagram + actor User + participant MarketV2 as TermMaxMarketV2 + participant FT as FT Token (IMintableERC20) + participant XT as XT Token (IMintableERC20) + participant DebtToken as Debt Token (ERC20) + participant AavePool as Aave Pool (StakingBuffer via IAaveV3Minimal) + + User->>MarketV2: burn(owner, recipient, debtTokenAmt) + activate MarketV2 + + Note over MarketV2: Calls _burn(owner, msg.sender, recipient, debtTokenAmt) + + MarketV2->>FT: burn(owner, User, debtTokenAmt) + activate FT + Note over FT, User: User (as spender) must have allowance from owner for FT + FT-->>MarketV2: success + deactivate FT + + MarketV2->>XT: burn(owner, User, debtTokenAmt) + activate XT + Note over XT, User: User (as spender) must have allowance from owner for XT + XT-->>MarketV2: success + deactivate XT + + MarketV2->>DebtToken: safeTransfer(recipient, debtTokenAmt) + activate DebtToken + Note over MarketV2, DebtToken: This transfers debtToken from MarketV2 to recipient. + DebtToken-->>MarketV2: success + deactivate DebtToken + + MarketV2->>AavePool: withdraw(debtToken, recipient, debtTokenAmt) + activate AavePool + Note over MarketV2,AavePool: via _withdrawWithBuffer -> _withdrawFromPool + AavePool-->>MarketV2: success + deactivate AavePool + + Note over MarketV2: Emits Burn(owner, recipient, debtTokenAmt) + MarketV2-->>User: success + deactivate MarketV2 +``` \ No newline at end of file diff --git a/iamges/v2_mint.md b/iamges/v2_mint.md new file mode 100644 index 0000000..e772f18 --- /dev/null +++ b/iamges/v2_mint.md @@ -0,0 +1,37 @@ +```mermaid +sequenceDiagram + actor User + participant MarketV2 as TermMaxMarketV2 + participant DebtToken as Debt Token (ERC20) + participant FT as FT Token (IMintableERC20) + participant XT as XT Token (IMintableERC20) + participant AavePool as Aave Pool (StakingBuffer) + + User->>MarketV2: mint(recipient, debtTokenAmt) + activate MarketV2 + + MarketV2->>DebtToken: safeTransferFrom(User, MarketV2, debtTokenAmt) + activate DebtToken + Note over User, DebtToken: User must have approved MarketV2 for debtTokenAmt + DebtToken-->>MarketV2: success + deactivate DebtToken + + MarketV2->>FT: mint(recipient, debtTokenAmt) + activate FT + FT-->>MarketV2: success + deactivate FT + + MarketV2->>XT: mint(recipient, debtTokenAmt) + activate XT + XT-->>MarketV2: success + deactivate XT + + MarketV2->>AavePool: supply(debtToken, debtTokenAmt, MarketV2, referralCode) + activate AavePool + Note over MarketV2,AavePool: via _depositWithBuffer -> _depositToPool + AavePool-->>MarketV2: success + deactivate AavePool + + MarketV2-->>User: success (Mint event emitted) + deactivate MarketV2 +``` \ No newline at end of file diff --git a/iamges/vault_burn.md b/iamges/vault_burn.md new file mode 100644 index 0000000..66f3fb7 --- /dev/null +++ b/iamges/vault_burn.md @@ -0,0 +1,38 @@ +```mermaid +sequenceDiagram + actor User + participant ThisContract as Router + participant FT as FT Token (ERC20) + participant XT as XT Token (ERC20) + participant Market as Market Contract + participant UnderlyingVault as Underlying Vault (IERC4626) + + User->>ThisContract: burnAndWithdraw(market, recipient, amount) + activate ThisContract + ThisContract->>Market: tokens() + activate Market + Market-->>ThisContract: returns ft, xt, underlying addresses + deactivate Market + ThisContract->>FT: transferFrom(User, ThisContract, amount) + activate FT + Note over User, FT: User must have approved ThisContract for FT + FT-->>ThisContract: success + deactivate FT + ThisContract->>XT: transferFrom(User, ThisContract, amount) + activate XT + Note over User, XT: User must have approved ThisContract for XT + XT-->>ThisContract: success + deactivate XT + ThisContract->>Market: burn(ThisContract, ThisContract, amount) + activate Market + Market-->>ThisContract: success (underlying tokens transferred to ThisContract) + deactivate Market + Note over ThisContract: ThisContract now holds 'amount' of underlying from Market + ThisContract->>UnderlyingVault: redeem(amount, recipient, ThisContract) + activate UnderlyingVault + Note over UnderlyingVault, User: Vault redeems underlying and sends to 'recipient' + UnderlyingVault-->>ThisContract: success (assets sent to recipient) + deactivate UnderlyingVault + ThisContract-->>User: success + deactivate ThisContract +``` \ No newline at end of file diff --git a/iamges/vault_mint.md b/iamges/vault_mint.md new file mode 100644 index 0000000..ea89f86 --- /dev/null +++ b/iamges/vault_mint.md @@ -0,0 +1,31 @@ +```mermaid +sequenceDiagram + actor User + participant ThisContract as Router + participant UnderlyingToken as Underlying Token (ERC20) + participant Vault as Vault (IERC4626) + participant Market as Market Contract + + User->>ThisContract: depositAndMint(market, recipient, amount) + activate ThisContract + ThisContract->>Market: tokens() + activate Market + Market-->>ThisContract: returns underlying address + deactivate Market + Note over ThisContract: vault = IERC4626(address(underlying)) + ThisContract->>UnderlyingToken: transferFrom(User, ThisContract, amount) + activate UnderlyingToken + Note over User, UnderlyingToken: User must have approved ThisContract + UnderlyingToken-->>ThisContract: success + deactivate UnderlyingToken + ThisContract->>UnderlyingToken: approve(Market, amount) + activate UnderlyingToken + UnderlyingToken-->>ThisContract: success + deactivate UnderlyingToken + ThisContract->>Market: mint(recipient, amount) + activate Market + Market-->>ThisContract: success (or minted tokens) + deactivate Market + ThisContract-->>User: success + deactivate ThisContract +``` \ No newline at end of file From 3a2e6cf69f2de7b7009da29762597933422758ae Mon Sep 17 00:00:00 2001 From: Evan Date: Fri, 16 May 2025 15:26:48 +0800 Subject: [PATCH 010/194] rollover v1 --- contracts/router/ITermMaxRouter.sol | 9 ++ contracts/router/TermMaxRouter.sol | 60 ++++--- .../swapAdapters/PendleSwapV3Adapter.sol | 19 ++- test/mainnet-fork/mainnet/ForkRollOver.t.sol | 148 +++++++++++++++--- 4 files changed, 180 insertions(+), 56 deletions(-) diff --git a/contracts/router/ITermMaxRouter.sol b/contracts/router/ITermMaxRouter.sol index 2091cba..6e790d4 100644 --- a/contracts/router/ITermMaxRouter.sol +++ b/contracts/router/ITermMaxRouter.sol @@ -15,6 +15,15 @@ import {ISwapCallback} from "../ISwapCallback.sol"; * @dev This interface defines all external functions for swapping, leveraging, and managing positions */ interface ITermMaxRouter { + struct TermMaxSwapData { + address tokenIn; + address tokenOut; + ITermMaxOrder[] orders; + uint128[] tradingAmts; + uint128 netTokenAmt; + uint256 deadline; + } + /** * @notice Pauses all protocol operations * @dev Can only be called by authorized addresses diff --git a/contracts/router/TermMaxRouter.sol b/contracts/router/TermMaxRouter.sol index 3480047..aa2f29a 100644 --- a/contracts/router/TermMaxRouter.sol +++ b/contracts/router/TermMaxRouter.sol @@ -474,20 +474,22 @@ contract TermMaxRouter is address recipient, IGearingToken gt, uint256 gtId, - ITermMaxOrder[] memory sellFtOrders, - uint128[] memory amtsToSellFt, uint128 maxLtv, + uint128 repayAmt, ITermMaxMarket nextMarket, SwapUnit[] memory units, - uint256 deadline + TermMaxSwapData memory swapData ) external whenNotPaused returns (uint256 newGtId) { // clear ts stograge assembly { tstore(T_ROLLOVER_GT_RESERVE_STORE, 0) } + // additional debt token to reduce the ltv + if (repayAmt != 0) { + IERC20(swapData.tokenOut).safeTransferFrom(msg.sender, address(this), repayAmt); + } gt.safeTransferFrom(msg.sender, address(this), gtId, ""); - bytes memory callbackData = - abi.encode(recipient, sellFtOrders, amtsToSellFt, maxLtv, nextMarket, units, deadline); + bytes memory callbackData = abi.encode(recipient, maxLtv, repayAmt, nextMarket, units, swapData); callbackData = abi.encode(FlashRepayOptions.ROLLOVER, callbackData); gt.flashRepay(gtId, true, callbackData); assembly { @@ -549,7 +551,7 @@ contract TermMaxRouter is if (option == FlashRepayOptions.REPAY) { _flashRepay(repayToken, collateralData, data); } else if (option == FlashRepayOptions.ROLLOVER) { - _rollover(repayToken, collateralData, data); + _rollover(repayToken, debtAmt, collateralData, data); } repayToken.safeIncreaseAllowance(msg.sender, debtAmt); } @@ -571,42 +573,54 @@ contract TermMaxRouter is } } - function _rollover(IERC20 debtToken, bytes memory collateralData, bytes memory callbackData) internal { + function _rollover(IERC20 debtToken, uint256 debtAmt, bytes memory collateralData, bytes memory callbackData) + internal + { ( address recipient, - ITermMaxOrder[] memory sellFtOrders, - uint128[] memory amtsToSellFt, uint128 maxLtv, + uint128 repayAmt, ITermMaxMarket market, SwapUnit[] memory units, - uint256 deadline - ) = abi.decode( - callbackData, (address, ITermMaxOrder[], uint128[], uint128, ITermMaxMarket, SwapUnit[], uint256) - ); + TermMaxSwapData memory swapData + ) = abi.decode(callbackData, (address, uint128, uint128, ITermMaxMarket, SwapUnit[], TermMaxSwapData)); { // swap collateral collateralData = units.length == 0 ? collateralData : _doSwap(collateralData, units); } - uint256 totalFtAmt = sum(amtsToSellFt); (IERC20 ft,, IGearingToken gt, address collateral,) = market.tokens(); uint256 gtId; { // issue new gt uint256 mintGtFeeRatio = market.mintGtFeeRatio(); - uint128 newDebtAmt = - ((totalFtAmt * Constants.DECIMAL_BASE) / (Constants.DECIMAL_BASE - mintGtFeeRatio)).toUint128(); - IERC20(collateral).safeIncreaseAllowance(address(market), _decodeAmount(collateralData)); - collateralData = units.length == 0 ? collateralData : _doSwap(collateralData, units); + uint128 newDebtAmt = ( + (swapData.netTokenAmt * Constants.DECIMAL_BASE) / (Constants.DECIMAL_BASE - mintGtFeeRatio) + ).toUint128(); + IERC20(collateral).safeIncreaseAllowance(address(gt), _decodeAmount(collateralData)); (gtId,) = market.issueFt(address(this), newDebtAmt, collateralData); } { uint256 netFtIn = _swapTokenToExactToken( - ft, debtToken, address(this), sellFtOrders, amtsToSellFt, totalFtAmt.toUint128(), deadline + ft, + debtToken, + address(this), + swapData.orders, + swapData.tradingAmts, + swapData.netTokenAmt, + swapData.deadline ); - if (totalFtAmt > netFtIn) { - uint256 repayAmt = totalFtAmt - netFtIn; - ft.safeIncreaseAllowance(address(gt), repayAmt); - gt.repay(gtId, repayAmt.toUint128(), false); + // check remaining ft amount + if (swapData.netTokenAmt > netFtIn) { + uint256 repaidFtAmt = swapData.netTokenAmt - netFtIn; + ft.safeIncreaseAllowance(address(gt), repaidFtAmt); + gt.repay(gtId, repaidFtAmt.toUint128(), false); + } + // check remaining debt token amount + uint256 totalDebtTokenAmt = sum(swapData.tradingAmts) + repayAmt; + if (totalDebtTokenAmt > debtAmt) { + uint256 repaidDebtAmt = totalDebtTokenAmt - debtAmt; + debtToken.safeIncreaseAllowance(address(gt), repaidDebtAmt); + gt.repay(gtId, repaidDebtAmt.toUint128(), true); } (, uint128 ltv,) = gt.getLiquidationInfo(gtId); if (ltv > maxLtv) { diff --git a/contracts/router/swapAdapters/PendleSwapV3Adapter.sol b/contracts/router/swapAdapters/PendleSwapV3Adapter.sol index 1636379..eaf1e95 100644 --- a/contracts/router/swapAdapters/PendleSwapV3Adapter.sol +++ b/contracts/router/swapAdapters/PendleSwapV3Adapter.sol @@ -3,7 +3,12 @@ pragma solidity ^0.8.27; import {PendleHelper} from "../../extensions/PendleHelper.sol"; import {IPAllActionV3} from "@pendle/core-v2/contracts/interfaces/IPAllActionV3.sol"; -import {IPMarket, IPPrincipalToken, IPYieldToken} from "@pendle/core-v2/contracts/interfaces/IPMarket.sol"; +import { + IPMarket, + IPPrincipalToken, + IPYieldToken, + IStandardizedYield +} from "@pendle/core-v2/contracts/interfaces/IPMarket.sol"; import "./ERC20SwapAdapter.sol"; /** * @title TermMax PendleSwapV3Adapter @@ -36,9 +41,7 @@ contract PendleSwapV3Adapter is ERC20SwapAdapter, PendleHelper { * Note: Scaling Input/Output amount */ minTokenOut = (minTokenOut * amount) / inAmount; - if (tokenOut == PT) { - IERC20(tokenIn).safeIncreaseAllowance(address(router), amount); (tokenOutAmt,,) = router.swapExactTokenForPt( address(this), address(market), @@ -49,14 +52,10 @@ contract PendleSwapV3Adapter is ERC20SwapAdapter, PendleHelper { ); } else { if (PT.isExpired()) { - IPYieldToken YT = IPYieldToken(PT.YT()); - IERC20(tokenIn).safeTransfer(address(YT), amount); - tokenOutAmt = IPYieldToken(YT).redeemPY(address(this)); - if (tokenOutAmt < minTokenOut) { - revert LessThanMinTokenOut(tokenOutAmt, minTokenOut); - } + (tokenOutAmt,) = router.redeemPyToToken( + address(this), PT.YT(), amount, createTokenOutputStruct(address(tokenOut), minTokenOut) + ); } else { - IERC20(tokenIn).safeIncreaseAllowance(address(router), amount); (tokenOutAmt,,) = router.swapExactPtForToken( address(this), address(market), diff --git a/test/mainnet-fork/mainnet/ForkRollOver.t.sol b/test/mainnet-fork/mainnet/ForkRollOver.t.sol index c428121..3c02059 100644 --- a/test/mainnet-fork/mainnet/ForkRollOver.t.sol +++ b/test/mainnet-fork/mainnet/ForkRollOver.t.sol @@ -5,6 +5,17 @@ import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interf import "../ForkBaseTest.sol"; import {PriceFeedFactory} from "contracts/extensions/PriceFeedFactory.sol"; import {ITermMaxMarket} from "contracts/ITermMaxMarket.sol"; +import {ITermMaxOrder} from "contracts/ITermMaxOrder.sol"; +import {SwapUnit, ITermMaxRouter, TermMaxRouter} from "contracts/router/TermMaxRouter.sol"; +import {IGearingToken, AbstractGearingToken} from "contracts/tokens/AbstractGearingToken.sol"; +import {PendleSwapV3Adapter} from "contracts/router/swapAdapters/PendleSwapV3Adapter.sol"; +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; +import "contracts/storage/TermMaxStorage.sol"; + +interface TestOracle is IOracle { + function acceptPendingOracle(address asset) external; + function oracles(address asset) external returns (address aggregator, address backupAggregator, uint32 heartbeat); +} contract ForkRollOver is ForkBaseTest { string MAINNET_RPC_URL = vm.envString("MAINNET_RPC_URL"); @@ -21,44 +32,135 @@ contract ForkRollOver is ForkBaseTest { function _finishSetup() internal override {} function testRolloverPt() public { - vm.roll(22486319); // 2025-08-01 00:00:00 + vm.roll(22486319); // 2025-05-15 uint64 may_30 = 1748534400; // 2025-05-30 00:00:00 uint64 aug_1 = 1753977600; // 2025-08-01 00:00:00 address pt_susde_may_29 = 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308; address pt_susde_jun_31 = 0x3b3fB9C57858EF816833dC91565EFcd85D96f634; address usdc = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; - IOracle oracle = IOracle(0xE3a31690392E8E18DC3d862651C079339E2c1ADE); - ITermMaxRouter router = ITermMaxRouter(0xC47591F5c023e44931c78D5A993834875b79FB11); + address usde = 0x4c9EDD5852cd905f086C759E8383e09bff1E68B3; + address susde = 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497; + TestOracle oracle = TestOracle(0xE3a31690392E8E18DC3d862651C079339E2c1ADE); + address accessManager = Ownable(address(oracle)).owner(); + vm.startPrank(accessManager); + address[] memory tokens = new address[](4); + tokens[0] = usdc; + tokens[1] = susde; + tokens[2] = pt_susde_may_29; + tokens[3] = pt_susde_jun_31; + + for (uint256 i = 0; i < tokens.length; i++) { + address token = tokens[i]; + (address aggregator, address backupAggregator, uint32 heartbeat) = oracle.oracles(token); + IOracle.Oracle memory oracleData = IOracle.Oracle({ + aggregator: AggregatorV3Interface(aggregator), + backupAggregator: AggregatorV3Interface(backupAggregator), + heartbeat: 365 days + }); + oracle.submitPendingOracle(token, oracleData); + } + vm.warp(block.timestamp + 1 days); + for (uint256 i = 0; i < tokens.length; i++) { + address token = tokens[i]; + oracle.acceptPendingOracle(token); + } + + vm.stopPrank(); + + // ITermMaxRouter router = ITermMaxRouter(0xC47591F5c023e44931c78D5A993834875b79FB11); ITermMaxMarket mmay_30 = ITermMaxMarket(0xe867255dC0c3a27c90f756ECC566a5292ce19492); ITermMaxMarket maug_1 = ITermMaxMarket(0xdBB2D44c238c459cCB820De886ABF721EF6E6941); - string memory key = "sUSDe-USDC"; - OrderConfig memory orderConfig = _readOrderConfig(key); - MarketInitialParams memory marketInitialParams = _readMarketInitialParams(key); - marketInitialParams.collateral = pt_susde_may_29; - marketInitialParams.marketConfig.maturity = may_30; // 2025-05-30 00:00:00 - marketInitialParams.loanConfig.oracle = oracle; - - address borrower = vm.randomAddress(); - address admin = vm.randomAddress(); + ITermMaxOrder o_may_30 = ITermMaxOrder(0xe99ee5b18cB57276EbEADf0E773E4f8Ab49Db9B7); + ITermMaxOrder o_aug_1 = ITermMaxOrder(0x71Df74d65c3895C8FA5a1c8E8d93A7eE30A1aFc7); - bytes32 GT_ERC20 = keccak256("GearingTokenWithERC20"); + { + address yt = 0x1de6Ff19FDA7496DdC12f2161f6ad6427c52aBBe; + deal(yt, pt_susde_may_29, 1000 ether); + } - TermMaxFactory termMaxFactory = deployFactory(admin); - vm.startPrank(admin); - ITermMaxMarket m1 = ITermMaxMarket(termMaxFactory.createMarket(GT_ERC20, marketInitialParams, 0)); + // address pendleAdapter = 0x0B30251FA697A39Fd41813b267b50F03414E82da; + PendleSwapV3Adapter adapter = new PendleSwapV3Adapter(0x888888888889758F76e7103c6CbF23ABbF58F946); + address pendleAdapter = address(adapter); - marketInitialParams.collateral = pt_susde_jun_31; - marketInitialParams.marketConfig.maturity = aug_1; // 2025-08-01 00:00:00 - marketInitialParams.loanConfig.oracle = oracle; + vm.label(pt_susde_may_29, "pt_susde_may_29"); + vm.label(pt_susde_jun_31, "pt_susde_jun_31"); + vm.label(susde, "susde"); + vm.label(address(oracle), "oracle"); + vm.label(address(mmay_30), "mmay_30"); + vm.label(address(maug_1), "maug_1"); + vm.label(address(o_may_30), "o_may_30"); + vm.label(address(o_aug_1), "o_aug_1"); + vm.label(address(pendleAdapter), "pendleAdapter"); - ITermMaxMarket m2 = ITermMaxMarket(termMaxFactory.createMarket(GT_ERC20, marketInitialParams, 0)); + address borrower; + address admin = vm.randomAddress(); - ITermMaxOrder o1 = m1.createOrder(orderConfig, borrower, 1000e6, 1000e6, 1000e6); + vm.startPrank(admin); + TermMaxRouter router = deployRouter(admin); + router.setAdapterWhitelist(pendleAdapter, true); vm.stopPrank(); + uint128 debt; + uint256 collateralAmount; + // deal(pt_susde_may_29, borrower, collateralAmount); + uint256 gt1 = 5; + + { + (IERC20 ft,, IGearingToken gt, address collateral,) = mmay_30.tokens(); + (address owner, uint128 debtAmt, bytes memory collateralData) = gt.loanInfo(gt1); + borrower = owner; + debt = debtAmt; + collateralAmount = abi.decode(collateralData, (uint256)); + console.log("collateralAmount:", collateralAmount); + console.log("debt:", debt); + } vm.startPrank(borrower); - vm.deal(borrower, 100 ether); - deal(usdc, borrower, 10000e6); + vm.warp(may_30 - 0.5 days); + // roll gt + { + address pm1 = 0xB162B764044697cf03617C2EFbcB1f42e31E4766; + address pm2 = 0x4339Ffe2B7592Dc783ed13cCE310531aB366dEac; + + SwapUnit[] memory swapUnits = new SwapUnit[](2); + swapUnits[0] = SwapUnit({ + adapter: pendleAdapter, + tokenIn: pt_susde_may_29, + tokenOut: susde, + swapData: abi.encode(pm1, collateralAmount, 0) + }); + swapUnits[1] = SwapUnit({ + adapter: pendleAdapter, + tokenIn: susde, + tokenOut: pt_susde_jun_31, + swapData: abi.encode(pm2, 1e18, 0) + }); + + uint128 repayAmount = debt / 10; + ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); + orders[0] = ITermMaxOrder(address(o_aug_1)); + uint128[] memory amounts = new uint128[](1); + amounts[0] = debt - repayAmount; + (IERC20 ft,, IGearingToken gt, address collateral,) = mmay_30.tokens(); + + + deal(usdc, borrower, repayAmount); + IERC20(usdc).approve(address(router), repayAmount); + gt.approve(address(router), gt1); + + (IERC20 ft_aug_1,,,,) = maug_1.tokens(); + ITermMaxRouter.TermMaxSwapData memory swapData = ITermMaxRouter.TermMaxSwapData({ + tokenIn: address(ft_aug_1), + tokenOut: usdc, + orders: orders, + tradingAmts: amounts, + netTokenAmt: debt, + deadline: aug_1 + }); + uint256 gtId2 = router.rolloverGt(borrower, gt, gt1, 0.9e8, repayAmount, maug_1, swapUnits, swapData); + console.log("new gtId:", gtId2); + } + + vm.stopPrank(); } } From 69b14adbfefa4dda7f2e9089b8676353b59ded20 Mon Sep 17 00:00:00 2001 From: Evan Date: Fri, 16 May 2025 17:18:51 +0800 Subject: [PATCH 011/194] flashrepay ut --- test/mainnet-fork/mainnet/ForkRollOver.t.sol | 104 ++++++++++++++++++- 1 file changed, 103 insertions(+), 1 deletion(-) diff --git a/test/mainnet-fork/mainnet/ForkRollOver.t.sol b/test/mainnet-fork/mainnet/ForkRollOver.t.sol index 3c02059..b1e481d 100644 --- a/test/mainnet-fork/mainnet/ForkRollOver.t.sol +++ b/test/mainnet-fork/mainnet/ForkRollOver.t.sol @@ -143,7 +143,6 @@ contract ForkRollOver is ForkBaseTest { amounts[0] = debt - repayAmount; (IERC20 ft,, IGearingToken gt, address collateral,) = mmay_30.tokens(); - deal(usdc, borrower, repayAmount); IERC20(usdc).approve(address(router), repayAmount); gt.approve(address(router), gt1); @@ -163,4 +162,107 @@ contract ForkRollOver is ForkBaseTest { vm.stopPrank(); } + + function testFlashRepayPt() public { + vm.roll(22494579); // 2025-05-15 + uint64 may_30 = 1748534400; // 2025-05-30 00:00:00 + address pt_susde_may_29 = 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308; + address usdc = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; + address usde = 0x4c9EDD5852cd905f086C759E8383e09bff1E68B3; + address susde = 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497; + TestOracle oracle = TestOracle(0xE3a31690392E8E18DC3d862651C079339E2c1ADE); + address accessManager = Ownable(address(oracle)).owner(); + vm.startPrank(accessManager); + address[] memory tokens = new address[](3); + tokens[0] = usdc; + tokens[1] = susde; + tokens[2] = pt_susde_may_29; + + for (uint256 i = 0; i < tokens.length; i++) { + address token = tokens[i]; + (address aggregator, address backupAggregator, uint32 heartbeat) = oracle.oracles(token); + IOracle.Oracle memory oracleData = IOracle.Oracle({ + aggregator: AggregatorV3Interface(aggregator), + backupAggregator: AggregatorV3Interface(backupAggregator), + heartbeat: 365 days + }); + oracle.submitPendingOracle(token, oracleData); + } + vm.warp(block.timestamp + 1 days); + for (uint256 i = 0; i < tokens.length; i++) { + address token = tokens[i]; + oracle.acceptPendingOracle(token); + } + + vm.stopPrank(); + + ITermMaxMarket mmay_30 = ITermMaxMarket(0xe867255dC0c3a27c90f756ECC566a5292ce19492); + ITermMaxOrder o_may_30 = ITermMaxOrder(0xe99ee5b18cB57276EbEADf0E773E4f8Ab49Db9B7); + + { + address yt = 0x1de6Ff19FDA7496DdC12f2161f6ad6427c52aBBe; + deal(yt, pt_susde_may_29, 1000 ether); + } + + // address pendleAdapter = 0x0B30251FA697A39Fd41813b267b50F03414E82da; + PendleSwapV3Adapter adapter = new PendleSwapV3Adapter(0x888888888889758F76e7103c6CbF23ABbF58F946); + address pendleAdapter = address(adapter); + + vm.label(pt_susde_may_29, "pt_susde_may_29"); + vm.label(susde, "susde"); + vm.label(address(oracle), "oracle"); + vm.label(address(mmay_30), "mmay_30"); + vm.label(address(o_may_30), "o_may_30"); + vm.label(address(pendleAdapter), "pendleAdapter"); + + address borrower; + address admin = vm.randomAddress(); + + vm.startPrank(admin); + TermMaxRouter router = deployRouter(admin); + router.setAdapterWhitelist(pendleAdapter, true); + router.setAdapterWhitelist(0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779, true); + vm.stopPrank(); + + uint128 debt; + uint256 collateralAmount; + // deal(pt_susde_may_29, borrower, collateralAmount); + uint256 gt1 = 5; + + { + (IERC20 ft,, IGearingToken gt, address collateral,) = mmay_30.tokens(); + (address owner, uint128 debtAmt, bytes memory collateralData) = gt.loanInfo(gt1); + borrower = owner; + debt = debtAmt; + collateralAmount = abi.decode(collateralData, (uint256)); + console.log("collateralAmount:", collateralAmount); + console.log("debt:", debt); + + vm.startPrank(borrower); + vm.warp(may_30 - 0.5 days); + + ITermMaxOrder[] memory orders = new ITermMaxOrder[](0); + uint128[] memory amounts = new uint128[](0); + SwapUnit[] memory swapUnits = new SwapUnit[](2); + address pm1 = 0xB162B764044697cf03617C2EFbcB1f42e31E4766; + swapUnits[0] = SwapUnit({ + adapter: pendleAdapter, + tokenIn: pt_susde_may_29, + tokenOut: susde, + swapData: abi.encode(pm1, collateralAmount, 0) + }); + swapUnits[1] = SwapUnit({ + adapter: 0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779, + tokenIn: susde, + tokenOut: usdc, + swapData: hex"0000000000000000000000009d39a5de30e57443bff2a8307a4256c8797a349700000000000000000000000000000000000000000000048103daed12389fbcc800000000000000000000000076edf8c155a1e0d9b2ad11b04d9671cbc25fee99000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000005d443b21d00000000000000000000000000000000000000000000000000000005b66b4d45000000000000000000000000c47591f5c023e44931c78d5a993834875b79fb11000000000000000000000000000000000000000000000000000000000000014000000000000000000000000076edf8c155a1e0d9b2ad11b04d9671cbc25fee9900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084010206000d0100010201022700000304000d0101050400ff00000000000000007eb59373d63627be64b42406b108b602174b4ccc9d39a5de30e57443bff2a8307a4256c8797a3497dac17f958d2ee523a2206206994597c13d831ec7c02aaa39b223fe8d0a0e5c4f27ead9083c756cc288e6a0c2ddd26feeb64f039a2c41296fcb3f564000000000000000000000000000000000000000000000000000000000" + }); + + console.log("usdc balance before:", IERC20(usdc).balanceOf(borrower)); + gt.approve(address(router), gt1); + router.flashRepayFromColl(borrower, mmay_30, gt1, orders, amounts, true, swapUnits, may_30); + console.log("usdc balance after:", IERC20(usdc).balanceOf(borrower)); + vm.stopPrank(); + } + } } From 67ad4b184b77f59d4bce92e81bfb7656935db5f2 Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 19 May 2025 10:51:06 +0800 Subject: [PATCH 012/194] add batch pause/unpause functions --- contracts/access/AccessManager.sol | 11 ++++++ test/AccessManager.t.sol | 56 ++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) diff --git a/contracts/access/AccessManager.sol b/contracts/access/AccessManager.sol index 33a115c..7c0c8f8 100644 --- a/contracts/access/AccessManager.sol +++ b/contracts/access/AccessManager.sol @@ -131,6 +131,17 @@ contract AccessManager is AccessControlUpgradeable, UUPSUpgradeable { } } + /// @notice Set the switch of multiple entities + function batchSetSwitch(IPausable[] calldata entities, bool state) external onlyRole(PAUSER_ROLE) { + for (uint256 i = 0; i < entities.length; i++) { + if (state) { + entities[i].unpause(); + } else { + entities[i].pause(); + } + } + } + function submitVaultGuardian(ITermMaxVault vault, address newGuardian) external onlyRole(VAULT_ROLE) { vault.submitGuardian(newGuardian); } diff --git a/test/AccessManager.t.sol b/test/AccessManager.t.sol index ba5b529..5793832 100644 --- a/test/AccessManager.t.sol +++ b/test/AccessManager.t.sol @@ -216,6 +216,62 @@ contract AccessManagerTest is Test { vm.stopPrank(); } + function testBatchSetSwitch() public { + // Create vault initialization parameters + VaultInitialParams memory params = VaultInitialParams({ + admin: address(manager), + curator: address(0), // Will be set through AccessManager + timelock: 1 days, + asset: IERC20(address(res.debt)), + maxCapacity: 1000000e18, + name: "Test Vault", + symbol: "tVAULT", + performanceFeeRate: 0.2e8 // 20% + }); + + // Deploy vault + res.vault = DeployUtils.deployVault(params); + + address pauser = vm.randomAddress(); + bytes32 pauserRole = manager.PAUSER_ROLE(); + + // Create multiple pausable test entities + IPausable[] memory entities = new IPausable[](2); + entities[0] = IPausable(address(res.router)); + entities[1] = IPausable(address(res.vault)); + + // Grant PAUSER_ROLE to the pauser + vm.prank(deployer); + manager.grantRole(pauserRole, pauser); + + // Test batch pausing with PAUSER_ROLE + vm.startPrank(pauser); + manager.batchSetSwitch(entities, false); + + // Verify all entities are paused + assertTrue(PausableUpgradeable(address(res.router)).paused()); + assertTrue(PausableUpgradeable(address(res.vault)).paused()); + + // Test batch unpausing with PAUSER_ROLE + manager.batchSetSwitch(entities, true); + + // Verify all entities are unpaused + assertFalse(PausableUpgradeable(address(res.router)).paused()); + assertFalse(PausableUpgradeable(address(res.vault)).paused()); + vm.stopPrank(); + + // Test batch pausing without PAUSER_ROLE + address nonPauser = vm.randomAddress(); + vm.startPrank(nonPauser); + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, nonPauser, manager.PAUSER_ROLE() + ) + ); + manager.batchSetSwitch(entities, false); + vm.stopPrank(); + } + function testVaultManagement() public { address vaultManager = vm.randomAddress(); address newCurator = vm.randomAddress(); From 318e08061c8e50f7daa5d24d39579bf23c207a9c Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 19 May 2025 15:15:18 +0800 Subject: [PATCH 013/194] Enhance GearingTokenEvents and AbstractGearingToken with FlashRepay functionality and update Repay event to include repayAll parameter --- contracts/events/GearingTokenEvents.sol | 12 +++++- contracts/tokens/AbstractGearingToken.sol | 45 +++++++++++++++++--- contracts/tokens/IGearingToken.sol | 15 +++++++ test/Gt.t.sol | 10 ++--- test/mainnet-fork/mainnet/ForkRollOver.t.sol | 4 +- 5 files changed, 74 insertions(+), 12 deletions(-) diff --git a/contracts/events/GearingTokenEvents.sol b/contracts/events/GearingTokenEvents.sol index 2c73a77..e724705 100644 --- a/contracts/events/GearingTokenEvents.sol +++ b/contracts/events/GearingTokenEvents.sol @@ -30,7 +30,17 @@ interface GearingTokenEvents { /// @param id The id of Gearing Token /// @param repayAmt The amount of debt repaid /// @param byDebtToken Repay using debtToken token or bonds token - event Repay(uint256 indexed id, uint256 repayAmt, bool byDebtToken); + /// @param repayAll Repay all the debt + event Repay(uint256 indexed id, uint256 repayAmt, bool byDebtToken, bool repayAll); + + event FlashRepay( + uint256 indexed id, + address indexed caller, + uint128 repayAmt, + bool byDebtToken, + bool repayAll, + bytes callbackData + ); /// @notice Emitted when liquidating Gearing Token /// @param id The id of Gearing Token diff --git a/contracts/tokens/AbstractGearingToken.sol b/contracts/tokens/AbstractGearingToken.sol index 5acc3fe..cac74a1 100644 --- a/contracts/tokens/AbstractGearingToken.sol +++ b/contracts/tokens/AbstractGearingToken.sol @@ -243,8 +243,8 @@ abstract contract AbstractGearingToken is // Those ft tokens have been approved to market and will be burn after maturity config.ft.safeTransferFrom(msg.sender, marketAddr(), repayAmt); } - _repay(id, repayAmt); - emit Repay(id, repayAmt, byDebtToken); + (, bool repayAll) = _repay(id, repayAmt); + emit Repay(id, repayAmt, byDebtToken, repayAll); } function flashRepay(uint256 id, bool byDebtToken, bytes calldata callbackData) external override nonReentrant { @@ -265,11 +265,45 @@ abstract contract AbstractGearingToken is ); repayToken.safeTransferFrom(msg.sender, owner(), loan.debtAmt); _burnInternal(id); - emit Repay(id, loan.debtAmt, byDebtToken); + emit Repay(id, loan.debtAmt, byDebtToken, true); } - function _repay(uint256 id, uint128 repayAmt) internal { - LoanInfo memory loan = loanMapping[id]; + function flashRepay( + uint256 id, + uint128 repayAmt, + bool byDebtToken, + bytes memory removedCollateral, + bytes calldata callbackData + ) external override nonReentrant { + GtConfig memory config = _config; + if (config.maturity <= block.timestamp) { + revert GtIsExpired(id); + } + if (ownerOf(id) != msg.sender) { + revert CallerIsNotTheOwner(id); + } + (LoanInfo memory loan, bool repayAll) = _repay(id, repayAmt); + + // Check ltv after partial repayment + if (!repayAll) { + ValueAndPrice memory valueAndPrice = _getValueAndPrice(config, loan); + uint128 ltv = _calculateLtv(valueAndPrice); + require(ltv <= config.loanConfig.maxLtv, GtIsNotHealthy(id, msg.sender, ltv)); + // Transfer collateral to the owner + _transferCollateral(msg.sender, removedCollateral); + } + + IERC20 repayToken = byDebtToken ? config.debtToken : config.ft; + + IFlashRepayer(msg.sender).executeOperation( + repayToken, repayAmt, config.collateral, removedCollateral, callbackData + ); + repayToken.safeTransferFrom(msg.sender, owner(), repayAmt); + emit FlashRepay(id, msg.sender, repayAmt, byDebtToken, repayAll, callbackData); + } + + function _repay(uint256 id, uint128 repayAmt) internal returns (LoanInfo memory loan, bool repayAll) { + loan = loanMapping[id]; if (repayAmt > loan.debtAmt) { revert RepayAmtExceedsMaxRepayAmt(id, repayAmt, loan.debtAmt); } @@ -278,6 +312,7 @@ abstract contract AbstractGearingToken is // Burn this nft _burnInternal(id); _transferCollateral(gtOwner, loan.collateralData); + repayAll = true; } else { uint128 debtAmt = loan.debtAmt - repayAmt; loanMapping[id].debtAmt = debtAmt; diff --git a/contracts/tokens/IGearingToken.sol b/contracts/tokens/IGearingToken.sol index 58939d9..43227f8 100644 --- a/contracts/tokens/IGearingToken.sol +++ b/contracts/tokens/IGearingToken.sol @@ -76,6 +76,21 @@ interface IGearingToken is IERC721Enumerable { /// @param byDebtToken Repay using debtToken token or bonds token function flashRepay(uint256 id, bool byDebtToken, bytes calldata callbackData) external; + /// @notice Repay the debt of Gearing Token, + /// the collateral will send by flashloan first. + /// @param id The id of Gearing Token + /// @param byDebtToken Repay using debtToken token or bonds token + /// @param repayAmt The amount of debt you want to repay + /// @param removedCollateral The collateral data to be removed + /// @param callbackData The data to be passed to the callback function + function flashRepay( + uint256 id, + uint128 repayAmt, + bool byDebtToken, + bytes memory removedCollateral, + bytes calldata callbackData + ) external; + /// @notice Remove collateral from the loan. /// Require the loan to value bigger than maxLtv after this action. /// @param id The id of Gearing Token diff --git a/test/Gt.t.sol b/test/Gt.t.sol index 81ed963..8cf6a44 100644 --- a/test/Gt.t.sol +++ b/test/Gt.t.sol @@ -291,7 +291,7 @@ contract GtTest is Test { StateChecker.MarketState memory state = StateChecker.getMarketState(res); bool byDebtToken = true; vm.expectEmit(); - emit GearingTokenEvents.Repay(gtId, debtAmt, byDebtToken); + emit GearingTokenEvents.Repay(gtId, debtAmt, byDebtToken, true); res.gt.repay(gtId, debtAmt, byDebtToken); uint256 collateralBalanceAfter = res.collateral.balanceOf(sender); @@ -334,7 +334,7 @@ contract GtTest is Test { bool byDebtToken = false; vm.expectEmit(); - emit GearingTokenEvents.Repay(gtId, debtAmt, byDebtToken); + emit GearingTokenEvents.Repay(gtId, debtAmt, byDebtToken, true); res.gt.repay(gtId, debtAmt, byDebtToken); uint256 collateralBalanceAfter = res.collateral.balanceOf(sender); @@ -370,7 +370,7 @@ contract GtTest is Test { bool byDebtToken = true; vm.expectEmit(); - emit GearingTokenEvents.Repay(gtId, repayAmt, byDebtToken); + emit GearingTokenEvents.Repay(gtId, repayAmt, byDebtToken, false); res.gt.repay(gtId, repayAmt, byDebtToken); state.debtReserve += repayAmt; StateChecker.checkMarketState(res, state); @@ -387,7 +387,7 @@ contract GtTest is Test { uint256 collateralBalanceBefore = res.collateral.balanceOf(sender); vm.expectEmit(); - emit GearingTokenEvents.Repay(gtId, debtAmt - repayAmt, byDebtToken); + emit GearingTokenEvents.Repay(gtId, debtAmt - repayAmt, byDebtToken, true); res.gt.repay(gtId, debtAmt - repayAmt, byDebtToken); state.debtReserve += (debtAmt - repayAmt); @@ -423,7 +423,7 @@ contract GtTest is Test { StateChecker.MarketState memory state = StateChecker.getMarketState(res); bool byDebtToken = true; vm.expectEmit(); - emit GearingTokenEvents.Repay(gtId, debtAmt, byDebtToken); + emit GearingTokenEvents.Repay(gtId, debtAmt, byDebtToken, true); flashRepayer.flashRepay(gtId, byDebtToken); uint256 collateralBalanceAfter = res.collateral.balanceOf(sender); diff --git a/test/mainnet-fork/mainnet/ForkRollOver.t.sol b/test/mainnet-fork/mainnet/ForkRollOver.t.sol index b1e481d..829b9f3 100644 --- a/test/mainnet-fork/mainnet/ForkRollOver.t.sol +++ b/test/mainnet-fork/mainnet/ForkRollOver.t.sol @@ -7,7 +7,7 @@ import {PriceFeedFactory} from "contracts/extensions/PriceFeedFactory.sol"; import {ITermMaxMarket} from "contracts/ITermMaxMarket.sol"; import {ITermMaxOrder} from "contracts/ITermMaxOrder.sol"; import {SwapUnit, ITermMaxRouter, TermMaxRouter} from "contracts/router/TermMaxRouter.sol"; -import {IGearingToken, AbstractGearingToken} from "contracts/tokens/AbstractGearingToken.sol"; +import {IGearingToken, GearingTokenEvents, AbstractGearingToken} from "contracts/tokens/AbstractGearingToken.sol"; import {PendleSwapV3Adapter} from "contracts/router/swapAdapters/PendleSwapV3Adapter.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import "contracts/storage/TermMaxStorage.sol"; @@ -260,6 +260,8 @@ contract ForkRollOver is ForkBaseTest { console.log("usdc balance before:", IERC20(usdc).balanceOf(borrower)); gt.approve(address(router), gt1); + vm.expectEmit(); + emit GearingTokenEvents.FlashRepay(gt1, address(router), debt, true, true, abi.encode(collateralAmount)); router.flashRepayFromColl(borrower, mmay_30, gt1, orders, amounts, true, swapUnits, may_30); console.log("usdc balance after:", IERC20(usdc).balanceOf(borrower)); vm.stopPrank(); From e3d418d8d9bcb14c680fc6514e8a7b7d42ec65bc Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 20 May 2025 11:25:05 +0800 Subject: [PATCH 014/194] fix issues --- contracts/events/GearingTokenEvents.sol | 2 +- contracts/test/MockFlashRepayer.sol | 7 ++-- contracts/tokens/AbstractGearingToken.sol | 41 ++++++++++++----------- contracts/tokens/IGearingToken.sol | 3 +- test/Gt.t.sol | 33 +++++++++++------- 5 files changed, 51 insertions(+), 35 deletions(-) diff --git a/contracts/events/GearingTokenEvents.sol b/contracts/events/GearingTokenEvents.sol index e724705..6534477 100644 --- a/contracts/events/GearingTokenEvents.sol +++ b/contracts/events/GearingTokenEvents.sol @@ -39,7 +39,7 @@ interface GearingTokenEvents { uint128 repayAmt, bool byDebtToken, bool repayAll, - bytes callbackData + bytes removedCollateral ); /// @notice Emitted when liquidating Gearing Token diff --git a/contracts/test/MockFlashRepayer.sol b/contracts/test/MockFlashRepayer.sol index 836dcfb..4294c24 100644 --- a/contracts/test/MockFlashRepayer.sol +++ b/contracts/test/MockFlashRepayer.sol @@ -11,9 +11,12 @@ contract MockFlashRepayer is IFlashRepayer, IERC721Receiver { gt = gt_; } - function flashRepay(uint256 id, bool byUnderlying) external { + function flashRepay(uint256 id, uint128 repayAmt, bool byUnderlying, bytes calldata removedCollateral) external { gt.safeTransferFrom(msg.sender, address(this), id, ""); - gt.flashRepay(id, byUnderlying, abi.encode(msg.sender)); + bool repayAll = gt.flashRepay(id, repayAmt, byUnderlying, removedCollateral, ""); + if (!repayAll) { + gt.safeTransferFrom(address(this), msg.sender, id, ""); + } } function executeOperation(IERC20 repayToken, uint128 debtAmt, address, bytes memory, bytes calldata) diff --git a/contracts/tokens/AbstractGearingToken.sol b/contracts/tokens/AbstractGearingToken.sol index cac74a1..cb0716f 100644 --- a/contracts/tokens/AbstractGearingToken.sol +++ b/contracts/tokens/AbstractGearingToken.sol @@ -247,25 +247,17 @@ abstract contract AbstractGearingToken is emit Repay(id, repayAmt, byDebtToken, repayAll); } + /// @inheritdoc IGearingToken + /// @notice This function is deprecated, please use `flashRepay( + // uint256 id, + // uint128 repayAmt, + // bool byDebtToken, + // bytes memory removedCollateral, + // bytes calldata callbackData + // )` instead function flashRepay(uint256 id, bool byDebtToken, bytes calldata callbackData) external override nonReentrant { - GtConfig memory config = _config; - if (config.maturity <= block.timestamp) { - revert GtIsExpired(id); - } LoanInfo memory loan = loanMapping[id]; - if (ownerOf(id) != msg.sender) { - revert CallerIsNotTheOwner(id); - } - // Transfer collateral to the owner - _transferCollateral(msg.sender, loan.collateralData); - IERC20 repayToken = byDebtToken ? config.debtToken : config.ft; - - IFlashRepayer(msg.sender).executeOperation( - repayToken, loan.debtAmt, config.collateral, loan.collateralData, callbackData - ); - repayToken.safeTransferFrom(msg.sender, owner(), loan.debtAmt); - _burnInternal(id); - emit Repay(id, loan.debtAmt, byDebtToken, true); + _flashRepay(id, loan.debtAmt, byDebtToken, loan.collateralData, callbackData); } function flashRepay( @@ -274,7 +266,17 @@ abstract contract AbstractGearingToken is bool byDebtToken, bytes memory removedCollateral, bytes calldata callbackData - ) external override nonReentrant { + ) external override nonReentrant returns (bool) { + return _flashRepay(id, repayAmt, byDebtToken, removedCollateral, callbackData); + } + + function _flashRepay( + uint256 id, + uint128 repayAmt, + bool byDebtToken, + bytes memory removedCollateral, + bytes calldata callbackData + ) internal returns (bool) { GtConfig memory config = _config; if (config.maturity <= block.timestamp) { revert GtIsExpired(id); @@ -299,7 +301,8 @@ abstract contract AbstractGearingToken is repayToken, repayAmt, config.collateral, removedCollateral, callbackData ); repayToken.safeTransferFrom(msg.sender, owner(), repayAmt); - emit FlashRepay(id, msg.sender, repayAmt, byDebtToken, repayAll, callbackData); + emit FlashRepay(id, msg.sender, repayAmt, byDebtToken, repayAll, removedCollateral); + return repayAll; } function _repay(uint256 id, uint128 repayAmt) internal returns (LoanInfo memory loan, bool repayAll) { diff --git a/contracts/tokens/IGearingToken.sol b/contracts/tokens/IGearingToken.sol index 43227f8..e82a71a 100644 --- a/contracts/tokens/IGearingToken.sol +++ b/contracts/tokens/IGearingToken.sol @@ -83,13 +83,14 @@ interface IGearingToken is IERC721Enumerable { /// @param repayAmt The amount of debt you want to repay /// @param removedCollateral The collateral data to be removed /// @param callbackData The data to be passed to the callback function + /// @return repayAll Whether the repayment is complete function flashRepay( uint256 id, uint128 repayAmt, bool byDebtToken, bytes memory removedCollateral, bytes calldata callbackData - ) external; + ) external returns (bool repayAll); /// @notice Remove collateral from the loan. /// Require the loan to value bigger than maxLtv after this action. diff --git a/test/Gt.t.sol b/test/Gt.t.sol index 8cf6a44..3bcb0be 100644 --- a/test/Gt.t.sol +++ b/test/Gt.t.sol @@ -418,27 +418,36 @@ contract GtTest is Test { res.debt.mint(address(flashRepayer), debtAmt); res.gt.approve(address(flashRepayer), gtId); + uint256 removedCollateral = 0.5e18; + uint128 repayAmt = 50e8; uint256 collateralBalanceBefore = res.collateral.balanceOf(sender); uint256 debtBalanceBefore = res.debt.balanceOf(sender); StateChecker.MarketState memory state = StateChecker.getMarketState(res); bool byDebtToken = true; vm.expectEmit(); - emit GearingTokenEvents.Repay(gtId, debtAmt, byDebtToken, true); - flashRepayer.flashRepay(gtId, byDebtToken); + emit GearingTokenEvents.FlashRepay( + gtId, address(flashRepayer), repayAmt, byDebtToken, false, abi.encode(removedCollateral) + ); + flashRepayer.flashRepay(gtId, repayAmt, byDebtToken, abi.encode(removedCollateral)); uint256 collateralBalanceAfter = res.collateral.balanceOf(sender); uint256 debtBalanceAfter = res.debt.balanceOf(sender); - state.debtReserve += debtAmt; - state.collateralReserve -= collateralAmt; + state.debtReserve += repayAmt; + state.collateralReserve -= removedCollateral; StateChecker.checkMarketState(res, state); - assert(res.collateral.balanceOf(address(flashRepayer)) == collateralAmt); - assert(res.debt.balanceOf(address(flashRepayer)) == 0); - assert(collateralBalanceAfter == collateralBalanceBefore); - assert(debtBalanceAfter == debtBalanceBefore); - vm.expectRevert(abi.encodePacked(bytes4(keccak256("ERC721NonexistentToken(uint256)")), gtId)); - res.gt.loanInfo(gtId); - + assertEq(res.collateral.balanceOf(address(flashRepayer)), removedCollateral, "flashRepayer collateral balance"); + assertEq(res.debt.balanceOf(address(flashRepayer)), repayAmt, "flashRepayer debt balance"); + assertEq(collateralBalanceAfter, collateralBalanceBefore + removedCollateral, "sender collateral balance"); + assertEq(debtBalanceAfter, debtBalanceBefore - repayAmt, "sender debt balance"); + (address owner, uint128 currentDebt, bytes memory currentCollateral) = res.gt.loanInfo(gtId); + assertEq(owner, sender, "gt owner"); + assertEq(currentDebt, debtAmt - repayAmt, "current debt after repayment"); + assertEq( + collateralAmt - removedCollateral, + abi.decode(currentCollateral, (uint256)), + "current collateral after repayment" + ); vm.stopPrank(); } @@ -507,7 +516,7 @@ contract GtTest is Test { res.gt.approve(address(flashRepayer), gtId); vm.expectRevert(abi.encodeWithSelector(GearingTokenErrors.GtIsExpired.selector, gtId)); - flashRepayer.flashRepay(gtId, true); + flashRepayer.flashRepay(gtId, debtAmt, true, abi.encode(collateralAmt)); } function testMerge() public { From 9f77a3cbf50e2cff57107ae29d5ac3dfce901e1f Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 20 May 2025 13:28:32 +0800 Subject: [PATCH 015/194] fix issues --- contracts/tokens/AbstractGearingToken.sol | 14 ++++++++------ contracts/tokens/GearingTokenWithERC20.sol | 6 ------ test/Gt.t.sol | 4 ++-- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/contracts/tokens/AbstractGearingToken.sol b/contracts/tokens/AbstractGearingToken.sol index cb0716f..0ef0882 100644 --- a/contracts/tokens/AbstractGearingToken.sol +++ b/contracts/tokens/AbstractGearingToken.sol @@ -285,12 +285,13 @@ abstract contract AbstractGearingToken is revert CallerIsNotTheOwner(id); } (LoanInfo memory loan, bool repayAll) = _repay(id, repayAmt); - // Check ltv after partial repayment if (!repayAll) { + loan.collateralData = _removeCollateral(loan, removedCollateral); ValueAndPrice memory valueAndPrice = _getValueAndPrice(config, loan); uint128 ltv = _calculateLtv(valueAndPrice); require(ltv <= config.loanConfig.maxLtv, GtIsNotHealthy(id, msg.sender, ltv)); + loanMapping[id] = loan; // Transfer collateral to the owner _transferCollateral(msg.sender, removedCollateral); } @@ -310,15 +311,15 @@ abstract contract AbstractGearingToken is if (repayAmt > loan.debtAmt) { revert RepayAmtExceedsMaxRepayAmt(id, repayAmt, loan.debtAmt); } - if (repayAmt == loan.debtAmt) { + loan.debtAmt = loan.debtAmt - repayAmt; + if (loan.debtAmt == 0) { address gtOwner = ownerOf(id); // Burn this nft _burnInternal(id); _transferCollateral(gtOwner, loan.collateralData); repayAll = true; } else { - uint128 debtAmt = loan.debtAmt - repayAmt; - loanMapping[id].debtAmt = debtAmt; + loanMapping[id].debtAmt = loan.debtAmt; } } @@ -338,8 +339,6 @@ abstract contract AbstractGearingToken is LoanInfo memory loan = loanMapping[id]; loan.collateralData = _removeCollateral(loan, collateralData); - _transferCollateral(msg.sender, collateralData); - ValueAndPrice memory valueAndPrice = _getValueAndPrice(config, loan); uint128 ltv = _calculateLtv(valueAndPrice); if (ltv > config.loanConfig.maxLtv) { @@ -347,6 +346,9 @@ abstract contract AbstractGearingToken is } loanMapping[id] = loan; + // Transfer collateral to the owner + _transferCollateral(msg.sender, collateralData); + emit RemoveCollateral(id, loan.collateralData); } diff --git a/contracts/tokens/GearingTokenWithERC20.sol b/contracts/tokens/GearingTokenWithERC20.sol index 23de9d0..b1b0b37 100644 --- a/contracts/tokens/GearingTokenWithERC20.sol +++ b/contracts/tokens/GearingTokenWithERC20.sol @@ -69,9 +69,6 @@ contract GearingTokenWithERC20 is AbstractGearingToken { */ function _transferCollateralFrom(address from, address to, bytes memory collateralData) internal virtual override { uint256 amount = _decodeAmount(collateralData); - if (amount == 0) { - return; - } IERC20(_config.collateral).safeTransferFrom(from, to, amount); } @@ -80,9 +77,6 @@ contract GearingTokenWithERC20 is AbstractGearingToken { */ function _transferCollateral(address to, bytes memory collateralData) internal virtual override { uint256 amount = _decodeAmount(collateralData); - if (amount == 0) { - return; - } IERC20(_config.collateral).safeTransfer(to, amount); } diff --git a/test/Gt.t.sol b/test/Gt.t.sol index 3bcb0be..4024b21 100644 --- a/test/Gt.t.sol +++ b/test/Gt.t.sol @@ -438,8 +438,8 @@ contract GtTest is Test { assertEq(res.collateral.balanceOf(address(flashRepayer)), removedCollateral, "flashRepayer collateral balance"); assertEq(res.debt.balanceOf(address(flashRepayer)), repayAmt, "flashRepayer debt balance"); - assertEq(collateralBalanceAfter, collateralBalanceBefore + removedCollateral, "sender collateral balance"); - assertEq(debtBalanceAfter, debtBalanceBefore - repayAmt, "sender debt balance"); + assertEq(collateralBalanceAfter, collateralBalanceBefore, "sender collateral balance"); + assertEq(debtBalanceAfter, debtBalanceBefore, "sender debt balance"); (address owner, uint128 currentDebt, bytes memory currentCollateral) = res.gt.loanInfo(gtId); assertEq(owner, sender, "gt owner"); assertEq(currentDebt, debtAmt - repayAmt, "current debt after repayment"); From eaae2f3a781f7af6a11a40c3221601d14fec5d05 Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 20 May 2025 15:00:59 +0800 Subject: [PATCH 016/194] new flash repay router function --- contracts/router/ITermMaxRouter.sol | 23 +++++--- contracts/router/TermMaxRouter.sol | 56 ++++++++++++++------ test/Router.t.sol | 19 ++++--- test/mainnet-fork/GtBaseTest.t.sol | 22 +++++--- test/mainnet-fork/mainnet/ForkRollOver.t.sol | 3 +- 5 files changed, 85 insertions(+), 38 deletions(-) diff --git a/contracts/router/ITermMaxRouter.sol b/contracts/router/ITermMaxRouter.sol index 6e790d4..762afd6 100644 --- a/contracts/router/ITermMaxRouter.sol +++ b/contracts/router/ITermMaxRouter.sol @@ -242,22 +242,29 @@ interface ITermMaxRouter { * @param recipient Address to receive any remaining collateral * @param market The market to repay debt in * @param gtId ID of the GT token to repay debt from - * @param orders Array of orders to execute - * @param amtsToBuyFt Array of amounts to buy for each order - * @param byDebtToken Whether to repay debt using debt tokens - * @param units Array of swap units defining the swap path - * @param deadline The deadline timestamp for the transaction + * @param byDebtToken True if repaying with debt token, false if using FT token + * @param units Array of swap units defining the external swap path + * @param swapData Data for the termmax swap operation * @return netTokenOut Actual amount of tokens received */ function flashRepayFromColl( address recipient, ITermMaxMarket market, uint256 gtId, - ITermMaxOrder[] memory orders, - uint128[] memory amtsToBuyFt, bool byDebtToken, SwapUnit[] memory units, - uint256 deadline + TermMaxSwapData memory swapData + ) external returns (uint256 netTokenOut); + + function flashRepayFromCollV2( + address recipient, + ITermMaxMarket market, + uint256 gtId, + uint128 repayAmt, + bool byDebtToken, + bytes memory removedCollateral, + SwapUnit[] memory units, + TermMaxSwapData memory swapData ) external returns (uint256 netTokenOut); /** diff --git a/contracts/router/TermMaxRouter.sol b/contracts/router/TermMaxRouter.sol index aa2f29a..1ce20d9 100644 --- a/contracts/router/TermMaxRouter.sol +++ b/contracts/router/TermMaxRouter.sol @@ -367,27 +367,50 @@ contract TermMaxRouter is } /** - * @inheritdoc ITermMaxRouter + * Deprecated function + * @dev use `flashRepayFromCollV2` instead */ function flashRepayFromColl( address recipient, ITermMaxMarket market, uint256 gtId, - ITermMaxOrder[] memory orders, - uint128[] memory amtsToBuyFt, bool byDebtToken, SwapUnit[] memory units, - uint256 deadline + TermMaxSwapData memory swapData ) external whenNotPaused returns (uint256 netTokenOut) { (IERC20 ft,, IGearingToken gt,, IERC20 debtToken) = market.tokens(); gt.safeTransferFrom(msg.sender, address(this), gtId, ""); - bytes memory callbackData = abi.encode(orders, amtsToBuyFt, ft, units, deadline); + bytes memory callbackData = abi.encode(units, swapData); callbackData = abi.encode(FlashRepayOptions.REPAY, callbackData); gt.flashRepay(gtId, byDebtToken, callbackData); netTokenOut = debtToken.balanceOf(address(this)); debtToken.safeTransfer(recipient, netTokenOut); } + function flashRepayFromCollV2( + address recipient, + ITermMaxMarket market, + uint256 gtId, + uint128 repayAmt, + bool byDebtToken, + bytes memory removedCollateral, + SwapUnit[] memory units, + TermMaxSwapData memory swapData + ) external whenNotPaused returns (uint256 netTokenOut) { + (IERC20 ft,, IGearingToken gt,, IERC20 debtToken) = market.tokens(); + gt.safeTransferFrom(msg.sender, address(this), gtId, ""); + bytes memory callbackData = abi.encode(units, swapData); + callbackData = abi.encode(FlashRepayOptions.REPAY, callbackData); + bool repayAll = gt.flashRepay(gtId, repayAmt, byDebtToken, removedCollateral, callbackData); + if (repayAll) { + netTokenOut = debtToken.balanceOf(address(this)); + debtToken.safeTransfer(recipient, netTokenOut); + } else { + // transfer gt back to sender + gt.safeTransferFrom(address(this), msg.sender, gtId); + } + } + /** * @inheritdoc ITermMaxRouter */ @@ -557,19 +580,22 @@ contract TermMaxRouter is } function _flashRepay(IERC20 repayToken, bytes memory collateralData, bytes memory callbackData) internal { - ( - ITermMaxOrder[] memory orders, - uint128[] memory amtsToBuyFt, - IERC20 ft, - SwapUnit[] memory units, - uint256 deadline - ) = abi.decode(callbackData, (ITermMaxOrder[], uint128[], IERC20, SwapUnit[], uint256)); + (SwapUnit[] memory units, TermMaxSwapData memory swapData) = + abi.decode(callbackData, (SwapUnit[], TermMaxSwapData)); bytes memory outData = _doSwap(collateralData, units); - if (address(repayToken) == address(ft)) { - IERC20 debtToken = IERC20(units[units.length - 1].tokenOut); + if (swapData.orders.length > 0) { + // swap token to exact token uint256 amount = abi.decode(outData, (uint256)); - _swapTokenToExactToken(debtToken, ft, address(this), orders, amtsToBuyFt, amount.toUint128(), deadline); + _swapTokenToExactToken( + IERC20(swapData.tokenIn), + IERC20(swapData.tokenOut), + address(this), + swapData.orders, + swapData.tradingAmts, + amount.toUint128(), + swapData.deadline + ); } } diff --git a/test/Router.t.sol b/test/Router.t.sol index ecfe2fd..b79220d 100644 --- a/test/Router.t.sol +++ b/test/Router.t.sol @@ -20,7 +20,7 @@ import {MockFlashLoanReceiver} from "contracts/test/MockFlashLoanReceiver.sol"; import {IGearingToken} from "contracts/tokens/IGearingToken.sol"; import {MockSwapAdapter} from "contracts/test/MockSwapAdapter.sol"; import {SwapUnit, ISwapAdapter} from "contracts/router/ISwapAdapter.sol"; -import {RouterErrors, RouterEvents, TermMaxRouter} from "contracts/router/TermMaxRouter.sol"; +import {RouterErrors, RouterEvents, TermMaxRouter, ITermMaxRouter} from "contracts/router/TermMaxRouter.sol"; import "contracts/storage/TermMaxStorage.sol"; contract RouterTest is Test { @@ -456,9 +456,8 @@ contract RouterTest is Test { units[0] = SwapUnit(address(adapter), address(res.collateral), address(res.debt), abi.encode(mintTokenOut)); res.gt.approve(address(res.router), gtId); - res.router.flashRepayFromColl( - sender, res.market, gtId, orders, amtsToBuyFt, byDebtToken, units, block.timestamp + 1 hours - ); + ITermMaxRouter.TermMaxSwapData memory swapData; + res.router.flashRepayFromColl(sender, res.market, gtId, byDebtToken, units, swapData); assertEq(res.collateral.balanceOf(sender), 0); assertEq(res.debt.balanceOf(sender), mintTokenOut - debtAmt); @@ -485,10 +484,16 @@ contract RouterTest is Test { SwapUnit[] memory units = new SwapUnit[](1); units[0] = SwapUnit(address(adapter), address(res.collateral), address(res.debt), abi.encode(mintTokenOut)); + ITermMaxRouter.TermMaxSwapData memory swapData; + swapData.orders = orders; + swapData.tradingAmts = amtsToBuyFt; + swapData.tokenIn = address(res.debt); + swapData.tokenOut = address(res.ft); + swapData.netTokenAmt = 0; + swapData.deadline = block.timestamp + 1 hours; + res.gt.approve(address(res.router), gtId); - res.router.flashRepayFromColl( - sender, res.market, gtId, orders, amtsToBuyFt, byDebtToken, units, block.timestamp - ); + res.router.flashRepayFromColl(sender, res.market, gtId, byDebtToken, units, swapData); assertEq(res.collateral.balanceOf(sender), 0); assert(res.debt.balanceOf(sender) > mintTokenOut - debtAmt); diff --git a/test/mainnet-fork/GtBaseTest.t.sol b/test/mainnet-fork/GtBaseTest.t.sol index c17ff5f..e8ed00a 100644 --- a/test/mainnet-fork/GtBaseTest.t.sol +++ b/test/mainnet-fork/GtBaseTest.t.sol @@ -304,12 +304,13 @@ abstract contract GtBaseTest is ForkBaseTest { res.gt.approve(address(res.router), gtId); uint256 debtTokenBalanceBeforeRepay = res.debtToken.balanceOf(taker); - ITermMaxOrder[] memory orders = new ITermMaxOrder[](0); - uint128[] memory amtsToBuyFt = new uint128[](0); bool byDebtToken = true; - uint256 netTokenOut = res.router.flashRepayFromColl( - taker, res.market, gtId, orders, amtsToBuyFt, byDebtToken, units, block.timestamp + 1 hours + ITermMaxRouter.TermMaxSwapData memory swapData; + + (, uint128 debtAmt, bytes memory collateralData) = res.gt.loanInfo(gtId); + uint256 netTokenOut = res.router.flashRepayFromCollV2( + taker, res.market, gtId, debtAmt, byDebtToken, collateralData, units, swapData ); uint256 debtTokenBalanceAfterRepay = res.debtToken.balanceOf(taker); @@ -330,12 +331,19 @@ abstract contract GtBaseTest is ForkBaseTest { orders[0] = res.order; uint128[] memory amtsToBuyFt = new uint128[](1); - (, uint128 debtAmt,) = res.gt.loanInfo(gtId); + (, uint128 debtAmt, bytes memory collateralData) = res.gt.loanInfo(gtId); amtsToBuyFt[0] = debtAmt; bool byDebtToken = false; - uint256 netTokenOut = res.router.flashRepayFromColl( - taker, res.market, gtId, orders, amtsToBuyFt, byDebtToken, units, block.timestamp + 1 hours + ITermMaxRouter.TermMaxSwapData memory swapData; + swapData.tokenIn = address(res.debtToken); + swapData.tokenOut = address(res.ft); + swapData.orders = orders; + swapData.tradingAmts = amtsToBuyFt; + swapData.deadline = block.timestamp + 1 hours; + + uint256 netTokenOut = res.router.flashRepayFromCollV2( + taker, res.market, gtId, debtAmt, byDebtToken, collateralData, units, swapData ); uint256 debtTokenBalanceAfterRepay = res.debtToken.balanceOf(taker); diff --git a/test/mainnet-fork/mainnet/ForkRollOver.t.sol b/test/mainnet-fork/mainnet/ForkRollOver.t.sol index 829b9f3..729d75d 100644 --- a/test/mainnet-fork/mainnet/ForkRollOver.t.sol +++ b/test/mainnet-fork/mainnet/ForkRollOver.t.sol @@ -262,7 +262,8 @@ contract ForkRollOver is ForkBaseTest { gt.approve(address(router), gt1); vm.expectEmit(); emit GearingTokenEvents.FlashRepay(gt1, address(router), debt, true, true, abi.encode(collateralAmount)); - router.flashRepayFromColl(borrower, mmay_30, gt1, orders, amounts, true, swapUnits, may_30); + ITermMaxRouter.TermMaxSwapData memory swapData; + router.flashRepayFromColl(borrower, mmay_30, gt1, true, swapUnits, swapData); console.log("usdc balance after:", IERC20(usdc).balanceOf(borrower)); vm.stopPrank(); } From ca616db2f9051dce4b318733cd0398ca38013f02 Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 20 May 2025 15:27:22 +0800 Subject: [PATCH 017/194] fix ut --- test/mainnet-fork/mainnet/ForkRollOver.t.sol | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/mainnet-fork/mainnet/ForkRollOver.t.sol b/test/mainnet-fork/mainnet/ForkRollOver.t.sol index 729d75d..466e06b 100644 --- a/test/mainnet-fork/mainnet/ForkRollOver.t.sol +++ b/test/mainnet-fork/mainnet/ForkRollOver.t.sol @@ -260,8 +260,6 @@ contract ForkRollOver is ForkBaseTest { console.log("usdc balance before:", IERC20(usdc).balanceOf(borrower)); gt.approve(address(router), gt1); - vm.expectEmit(); - emit GearingTokenEvents.FlashRepay(gt1, address(router), debt, true, true, abi.encode(collateralAmount)); ITermMaxRouter.TermMaxSwapData memory swapData; router.flashRepayFromColl(borrower, mmay_30, gt1, true, swapUnits, swapData); console.log("usdc balance after:", IERC20(usdc).balanceOf(borrower)); From fbfc49601dfca37c748ce724310b3d263209ee97 Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 20 May 2025 17:50:41 +0800 Subject: [PATCH 018/194] add ut for rollover with additional collateral --- contracts/router/TermMaxRouter.sol | 73 ++++- test/mainnet-fork/mainnet/ForkRollOver.t.sol | 266 +++++++++++++------ 2 files changed, 250 insertions(+), 89 deletions(-) diff --git a/contracts/router/TermMaxRouter.sol b/contracts/router/TermMaxRouter.sol index 1ce20d9..f9673cf 100644 --- a/contracts/router/TermMaxRouter.sol +++ b/contracts/router/TermMaxRouter.sol @@ -497,22 +497,30 @@ contract TermMaxRouter is address recipient, IGearingToken gt, uint256 gtId, - uint128 maxLtv, - uint128 repayAmt, - ITermMaxMarket nextMarket, + uint128 additionalAssets, SwapUnit[] memory units, - TermMaxSwapData memory swapData + ITermMaxMarket nextMarket, + uint256 additionnalNextCollateral, + TermMaxSwapData memory swapData, + uint128 maxLtv ) external whenNotPaused returns (uint256 newGtId) { // clear ts stograge assembly { tstore(T_ROLLOVER_GT_RESERVE_STORE, 0) } // additional debt token to reduce the ltv - if (repayAmt != 0) { - IERC20(swapData.tokenOut).safeTransferFrom(msg.sender, address(this), repayAmt); + if (additionalAssets != 0) { + IERC20(swapData.tokenOut).safeTransferFrom(msg.sender, address(this), additionalAssets); + } + // additional collateral to reduce the ltv + if (additionnalNextCollateral != 0) { + IERC20(units[units.length - 1].tokenOut).safeTransferFrom( + msg.sender, address(this), additionnalNextCollateral + ); } gt.safeTransferFrom(msg.sender, address(this), gtId, ""); - bytes memory callbackData = abi.encode(recipient, maxLtv, repayAmt, nextMarket, units, swapData); + bytes memory callbackData = + abi.encode(recipient, maxLtv, additionalAssets, nextMarket, additionnalNextCollateral, units, swapData); callbackData = abi.encode(FlashRepayOptions.ROLLOVER, callbackData); gt.flashRepay(gtId, true, callbackData); assembly { @@ -520,6 +528,45 @@ contract TermMaxRouter is } } + function rolloverGtV2( + address recipient, + IGearingToken gt, + uint256 gtId, + uint128 repayAmt, + uint128 additionalAssets, + uint256 removedCollateral, + SwapUnit[] memory units, + ITermMaxMarket nextMarket, + uint256 additionnalNextCollateral, + TermMaxSwapData memory swapData, + uint128 maxLtv + ) external whenNotPaused returns (uint256 newGtId) { + // clear ts stograge + assembly { + tstore(T_ROLLOVER_GT_RESERVE_STORE, 0) + } + // additional debt token to reduce the ltv + if (additionalAssets != 0) { + IERC20(swapData.tokenOut).safeTransferFrom(msg.sender, address(this), additionalAssets); + } + // additional collateral to reduce the ltv + if (additionnalNextCollateral != 0) { + IERC20(units[units.length - 1].tokenOut).safeTransferFrom( + msg.sender, address(this), additionnalNextCollateral + ); + } + gt.safeTransferFrom(msg.sender, address(this), gtId, ""); + bytes memory callbackData = + abi.encode(recipient, maxLtv, additionalAssets, nextMarket, additionnalNextCollateral, units, swapData); + callbackData = abi.encode(FlashRepayOptions.ROLLOVER, callbackData); + if (gt.flashRepay(gtId, repayAmt, true, abi.encode(removedCollateral), callbackData)) { + gt.safeTransferFrom(address(this), msg.sender, gtId); + } + assembly { + newGtId := tload(T_ROLLOVER_GT_RESERVE_STORE) + } + } + /// @dev Market flash leverage flashloan callback function executeOperation(address, IERC20, uint256 amount, bytes memory data) external @@ -605,11 +652,12 @@ contract TermMaxRouter is ( address recipient, uint128 maxLtv, - uint128 repayAmt, + uint128 additionalAssets, ITermMaxMarket market, + uint256 additionnalNextCollateral, SwapUnit[] memory units, TermMaxSwapData memory swapData - ) = abi.decode(callbackData, (address, uint128, uint128, ITermMaxMarket, SwapUnit[], TermMaxSwapData)); + ) = abi.decode(callbackData, (address, uint128, uint128, ITermMaxMarket, uint256, SwapUnit[], TermMaxSwapData)); { // swap collateral collateralData = units.length == 0 ? collateralData : _doSwap(collateralData, units); @@ -622,8 +670,9 @@ contract TermMaxRouter is uint128 newDebtAmt = ( (swapData.netTokenAmt * Constants.DECIMAL_BASE) / (Constants.DECIMAL_BASE - mintGtFeeRatio) ).toUint128(); - IERC20(collateral).safeIncreaseAllowance(address(gt), _decodeAmount(collateralData)); - (gtId,) = market.issueFt(address(this), newDebtAmt, collateralData); + uint256 newCollateralAmt = _decodeAmount(collateralData) + additionnalNextCollateral; + IERC20(collateral).safeIncreaseAllowance(address(gt), newCollateralAmt); + (gtId,) = market.issueFt(address(this), newDebtAmt, abi.encode(newCollateralAmt)); } { uint256 netFtIn = _swapTokenToExactToken( @@ -642,7 +691,7 @@ contract TermMaxRouter is gt.repay(gtId, repaidFtAmt.toUint128(), false); } // check remaining debt token amount - uint256 totalDebtTokenAmt = sum(swapData.tradingAmts) + repayAmt; + uint256 totalDebtTokenAmt = sum(swapData.tradingAmts) + additionalAssets; if (totalDebtTokenAmt > debtAmt) { uint256 repaidDebtAmt = totalDebtTokenAmt - debtAmt; debtToken.safeIncreaseAllowance(address(gt), repaidDebtAmt); diff --git a/test/mainnet-fork/mainnet/ForkRollOver.t.sol b/test/mainnet-fork/mainnet/ForkRollOver.t.sol index 466e06b..2dff479 100644 --- a/test/mainnet-fork/mainnet/ForkRollOver.t.sol +++ b/test/mainnet-fork/mainnet/ForkRollOver.t.sol @@ -21,6 +21,22 @@ contract ForkRollOver is ForkBaseTest { string MAINNET_RPC_URL = vm.envString("MAINNET_RPC_URL"); string DATA_PATH = string.concat(vm.projectRoot(), "/test/testdata/fork/mainnet.json"); + uint64 may_30 = 1748534400; // 2025-05-30 00:00:00 + uint64 aug_1 = 1753977600; // 2025-08-01 00:00:00 + address pt_susde_may_29 = 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308; + address pt_susde_jun_31 = 0x3b3fB9C57858EF816833dC91565EFcd85D96f634; + address usdc = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; + address usde = 0x4c9EDD5852cd905f086C759E8383e09bff1E68B3; + address susde = 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497; + TestOracle oracle = TestOracle(0xE3a31690392E8E18DC3d862651C079339E2c1ADE); + + ITermMaxMarket mmay_30 = ITermMaxMarket(0xe867255dC0c3a27c90f756ECC566a5292ce19492); + ITermMaxMarket maug_1 = ITermMaxMarket(0xdBB2D44c238c459cCB820De886ABF721EF6E6941); + ITermMaxOrder o_may_30 = ITermMaxOrder(0xe99ee5b18cB57276EbEADf0E773E4f8Ab49Db9B7); + ITermMaxOrder o_aug_1 = ITermMaxOrder(0x71Df74d65c3895C8FA5a1c8E8d93A7eE30A1aFc7); + address pendleAdapter; + TermMaxRouter router; + function _getForkRpcUrl() internal view override returns (string memory) { return MAINNET_RPC_URL; } @@ -29,18 +45,9 @@ contract ForkRollOver is ForkBaseTest { return DATA_PATH; } - function _finishSetup() internal override {} - - function testRolloverPt() public { + function _finishSetup() internal override { vm.roll(22486319); // 2025-05-15 - uint64 may_30 = 1748534400; // 2025-05-30 00:00:00 - uint64 aug_1 = 1753977600; // 2025-08-01 00:00:00 - address pt_susde_may_29 = 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308; - address pt_susde_jun_31 = 0x3b3fB9C57858EF816833dC91565EFcd85D96f634; - address usdc = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; - address usde = 0x4c9EDD5852cd905f086C759E8383e09bff1E68B3; - address susde = 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497; - TestOracle oracle = TestOracle(0xE3a31690392E8E18DC3d862651C079339E2c1ADE); + address accessManager = Ownable(address(oracle)).owner(); vm.startPrank(accessManager); address[] memory tokens = new address[](4); @@ -51,7 +58,7 @@ contract ForkRollOver is ForkBaseTest { for (uint256 i = 0; i < tokens.length; i++) { address token = tokens[i]; - (address aggregator, address backupAggregator, uint32 heartbeat) = oracle.oracles(token); + (address aggregator, address backupAggregator,) = oracle.oracles(token); IOracle.Oracle memory oracleData = IOracle.Oracle({ aggregator: AggregatorV3Interface(aggregator), backupAggregator: AggregatorV3Interface(backupAggregator), @@ -67,20 +74,8 @@ contract ForkRollOver is ForkBaseTest { vm.stopPrank(); - // ITermMaxRouter router = ITermMaxRouter(0xC47591F5c023e44931c78D5A993834875b79FB11); - ITermMaxMarket mmay_30 = ITermMaxMarket(0xe867255dC0c3a27c90f756ECC566a5292ce19492); - ITermMaxMarket maug_1 = ITermMaxMarket(0xdBB2D44c238c459cCB820De886ABF721EF6E6941); - ITermMaxOrder o_may_30 = ITermMaxOrder(0xe99ee5b18cB57276EbEADf0E773E4f8Ab49Db9B7); - ITermMaxOrder o_aug_1 = ITermMaxOrder(0x71Df74d65c3895C8FA5a1c8E8d93A7eE30A1aFc7); - - { - address yt = 0x1de6Ff19FDA7496DdC12f2161f6ad6427c52aBBe; - deal(yt, pt_susde_may_29, 1000 ether); - } - - // address pendleAdapter = 0x0B30251FA697A39Fd41813b267b50F03414E82da; PendleSwapV3Adapter adapter = new PendleSwapV3Adapter(0x888888888889758F76e7103c6CbF23ABbF58F946); - address pendleAdapter = address(adapter); + pendleAdapter = address(adapter); vm.label(pt_susde_may_29, "pt_susde_may_29"); vm.label(pt_susde_jun_31, "pt_susde_jun_31"); @@ -92,21 +87,31 @@ contract ForkRollOver is ForkBaseTest { vm.label(address(o_aug_1), "o_aug_1"); vm.label(address(pendleAdapter), "pendleAdapter"); - address borrower; address admin = vm.randomAddress(); vm.startPrank(admin); - TermMaxRouter router = deployRouter(admin); + router = deployRouter(admin); router.setAdapterWhitelist(pendleAdapter, true); vm.stopPrank(); + } + function testRolloverPt() public { uint128 debt; uint256 collateralAmount; // deal(pt_susde_may_29, borrower, collateralAmount); uint256 gt1 = 5; - + address borrower; { - (IERC20 ft,, IGearingToken gt, address collateral,) = mmay_30.tokens(); + (,, IGearingToken gt,,) = mmay_30.tokens(); + (address owner, uint128 debtAmt, bytes memory collateralData) = gt.loanInfo(gt1); + borrower = owner; + debt = debtAmt; + collateralAmount = abi.decode(collateralData, (uint256)); + console.log("collateralAmount:", collateralAmount); + console.log("debt:", debt); + } + { + (,, IGearingToken gt,,) = mmay_30.tokens(); (address owner, uint128 debtAmt, bytes memory collateralData) = gt.loanInfo(gt1); borrower = owner; debt = debtAmt; @@ -135,16 +140,16 @@ contract ForkRollOver is ForkBaseTest { swapData: abi.encode(pm2, 1e18, 0) }); - uint128 repayAmount = debt / 10; + uint128 additionalAssets = debt / 10; ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); orders[0] = ITermMaxOrder(address(o_aug_1)); uint128[] memory amounts = new uint128[](1); - amounts[0] = debt - repayAmount; + amounts[0] = debt - additionalAssets; (IERC20 ft,, IGearingToken gt, address collateral,) = mmay_30.tokens(); - deal(usdc, borrower, repayAmount); - IERC20(usdc).approve(address(router), repayAmount); + deal(usdc, borrower, additionalAssets); + IERC20(usdc).approve(address(router), additionalAssets); gt.approve(address(router), gt1); (IERC20 ft_aug_1,,,,) = maug_1.tokens(); @@ -156,64 +161,171 @@ contract ForkRollOver is ForkBaseTest { netTokenAmt: debt, deadline: aug_1 }); - uint256 gtId2 = router.rolloverGt(borrower, gt, gt1, 0.9e8, repayAmount, maug_1, swapUnits, swapData); + uint128 maxLtv = 0.9e8; + uint256 gtId2 = + router.rolloverGt(borrower, gt, gt1, additionalAssets, swapUnits, maug_1, 0, swapData, maxLtv); console.log("new gtId:", gtId2); } vm.stopPrank(); } - function testFlashRepayPt() public { - vm.roll(22494579); // 2025-05-15 - uint64 may_30 = 1748534400; // 2025-05-30 00:00:00 - address pt_susde_may_29 = 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308; - address usdc = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; - address usde = 0x4c9EDD5852cd905f086C759E8383e09bff1E68B3; - address susde = 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497; - TestOracle oracle = TestOracle(0xE3a31690392E8E18DC3d862651C079339E2c1ADE); - address accessManager = Ownable(address(oracle)).owner(); - vm.startPrank(accessManager); - address[] memory tokens = new address[](3); - tokens[0] = usdc; - tokens[1] = susde; - tokens[2] = pt_susde_may_29; - - for (uint256 i = 0; i < tokens.length; i++) { - address token = tokens[i]; - (address aggregator, address backupAggregator, uint32 heartbeat) = oracle.oracles(token); - IOracle.Oracle memory oracleData = IOracle.Oracle({ - aggregator: AggregatorV3Interface(aggregator), - backupAggregator: AggregatorV3Interface(backupAggregator), - heartbeat: 365 days - }); - oracle.submitPendingOracle(token, oracleData); + function testRolloverPtWithCollateral() public { + uint128 debt; + uint256 collateralAmount; + // deal(pt_susde_may_29, borrower, collateralAmount); + uint256 gt1 = 5; + address borrower; + { + (,, IGearingToken gt,,) = mmay_30.tokens(); + (address owner, uint128 debtAmt, bytes memory collateralData) = gt.loanInfo(gt1); + borrower = owner; + debt = debtAmt; + collateralAmount = abi.decode(collateralData, (uint256)); + console.log("collateralAmount:", collateralAmount); + console.log("debt:", debt); } - vm.warp(block.timestamp + 1 days); - for (uint256 i = 0; i < tokens.length; i++) { - address token = tokens[i]; - oracle.acceptPendingOracle(token); + { + (,, IGearingToken gt,,) = mmay_30.tokens(); + (address owner, uint128 debtAmt, bytes memory collateralData) = gt.loanInfo(gt1); + borrower = owner; + debt = debtAmt; + collateralAmount = abi.decode(collateralData, (uint256)); + console.log("collateralAmount:", collateralAmount); + console.log("debt:", debt); } + vm.startPrank(borrower); + vm.warp(may_30 - 0.5 days); + // roll gt + { + address pm1 = 0xB162B764044697cf03617C2EFbcB1f42e31E4766; + address pm2 = 0x4339Ffe2B7592Dc783ed13cCE310531aB366dEac; - vm.stopPrank(); + SwapUnit[] memory swapUnits = new SwapUnit[](2); + swapUnits[0] = SwapUnit({ + adapter: pendleAdapter, + tokenIn: pt_susde_may_29, + tokenOut: susde, + swapData: abi.encode(pm1, collateralAmount, 0) + }); + swapUnits[1] = SwapUnit({ + adapter: pendleAdapter, + tokenIn: susde, + tokenOut: pt_susde_jun_31, + swapData: abi.encode(pm2, 1e18, 0) + }); - ITermMaxMarket mmay_30 = ITermMaxMarket(0xe867255dC0c3a27c90f756ECC566a5292ce19492); - ITermMaxOrder o_may_30 = ITermMaxOrder(0xe99ee5b18cB57276EbEADf0E773E4f8Ab49Db9B7); + uint128 additionalAssets = 0; + uint256 additionalCollateral = 0.2 ether; - { - address yt = 0x1de6Ff19FDA7496DdC12f2161f6ad6427c52aBBe; - deal(yt, pt_susde_may_29, 1000 ether); + ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); + orders[0] = ITermMaxOrder(address(o_aug_1)); + uint128[] memory amounts = new uint128[](1); + amounts[0] = debt - additionalAssets; + (IERC20 ft,, IGearingToken gt, address collateral,) = mmay_30.tokens(); + + deal(pt_susde_jun_31, borrower, additionalCollateral); + IERC20(pt_susde_jun_31).approve(address(router), additionalCollateral); + gt.approve(address(router), gt1); + + (IERC20 ft_aug_1,,,,) = maug_1.tokens(); + ITermMaxRouter.TermMaxSwapData memory swapData = ITermMaxRouter.TermMaxSwapData({ + tokenIn: address(ft_aug_1), + tokenOut: usdc, + orders: orders, + tradingAmts: amounts, + netTokenAmt: debt + debt / 15, + deadline: aug_1 + }); + uint128 maxLtv = 0.9e8; + uint256 gtId2 = router.rolloverGt( + borrower, gt, gt1, additionalAssets, swapUnits, maug_1, additionalCollateral, swapData, maxLtv + ); + console.log("new gtId:", gtId2); } - // address pendleAdapter = 0x0B30251FA697A39Fd41813b267b50F03414E82da; - PendleSwapV3Adapter adapter = new PendleSwapV3Adapter(0x888888888889758F76e7103c6CbF23ABbF58F946); - address pendleAdapter = address(adapter); + vm.stopPrank(); + } - vm.label(pt_susde_may_29, "pt_susde_may_29"); - vm.label(susde, "susde"); - vm.label(address(oracle), "oracle"); - vm.label(address(mmay_30), "mmay_30"); - vm.label(address(o_may_30), "o_may_30"); - vm.label(address(pendleAdapter), "pendleAdapter"); + // function testRolloverPtV2() public { + + // address borrower; + // address admin = vm.randomAddress(); + + // vm.startPrank(admin); + // TermMaxRouter router = deployRouter(admin); + // router.setAdapterWhitelist(pendleAdapter, true); + // vm.stopPrank(); + + // uint128 debt; + // uint256 collateralAmount; + // // deal(pt_susde_may_29, borrower, collateralAmount); + // uint256 gt1 = 5; + + // { + // (IERC20 ft,, IGearingToken gt, address collateral,) = mmay_30.tokens(); + // (address owner, uint128 debtAmt, bytes memory collateralData) = gt.loanInfo(gt1); + // borrower = owner; + // debt = debtAmt; + // collateralAmount = abi.decode(collateralData, (uint256)); + // console.log("collateralAmount:", collateralAmount); + // console.log("debt:", debt); + // } + // vm.startPrank(borrower); + // vm.warp(may_30 - 0.5 days); + // // roll gt + // { + // address pm1 = 0xB162B764044697cf03617C2EFbcB1f42e31E4766; + // address pm2 = 0x4339Ffe2B7592Dc783ed13cCE310531aB366dEac; + + // SwapUnit[] memory swapUnits = new SwapUnit[](2); + // swapUnits[0] = SwapUnit({ + // adapter: pendleAdapter, + // tokenIn: pt_susde_may_29, + // tokenOut: susde, + // swapData: abi.encode(pm1, collateralAmount, 0) + // }); + // swapUnits[1] = SwapUnit({ + // adapter: pendleAdapter, + // tokenIn: susde, + // tokenOut: pt_susde_jun_31, + // swapData: abi.encode(pm2, 1e18, 0) + // }); + + // uint128 additionalAssets = debt / 10; + + // ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); + // orders[0] = ITermMaxOrder(address(o_aug_1)); + // uint128[] memory amounts = new uint128[](1); + // amounts[0] = debt - additionalAssets; + // (IERC20 ft,, IGearingToken gt, address collateral,) = mmay_30.tokens(); + + // deal(usdc, borrower, additionalAssets); + // IERC20(usdc).approve(address(router), additionalAssets); + // gt.approve(address(router), gt1); + + // (IERC20 ft_aug_1,,,,) = maug_1.tokens(); + // ITermMaxRouter.TermMaxSwapData memory swapData = ITermMaxRouter.TermMaxSwapData({ + // tokenIn: address(ft_aug_1), + // tokenOut: usdc, + // orders: orders, + // tradingAmts: amounts, + // netTokenAmt: debt, + // deadline: aug_1 + // }); + + // uint128 maxLtv = 0.9e8; + // uint256 gtId2 = router.rolloverGt( + // borrower, gt, gt1, debt, additionalAssets, collateralAmount, swapUnits, maug_1, 0, swapData, maxLtv + // ); + // console.log("new gtId:", gtId2); + // } + + // vm.stopPrank(); + // } + + function testFlashRepayPt() public { + // vm.roll(22494579); // 2025-05-15 address borrower; address admin = vm.randomAddress(); From 0ba5ce68ac58377728402c9da92fc756d7914161 Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 20 May 2025 18:21:47 +0800 Subject: [PATCH 019/194] test revert sence --- test/Gt.t.sol | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/test/Gt.t.sol b/test/Gt.t.sol index 4024b21..9c1f414 100644 --- a/test/Gt.t.sol +++ b/test/Gt.t.sol @@ -448,9 +448,33 @@ contract GtTest is Test { abi.decode(currentCollateral, (uint256)), "current collateral after repayment" ); + + res.gt.approve(address(flashRepayer), gtId); + flashRepayer.flashRepay(gtId, currentDebt, byDebtToken, currentCollateral); + vm.expectRevert(abi.encodePacked(bytes4(keccak256("ERC721NonexistentToken(uint256)")), gtId)); + res.gt.loanInfo(gtId); vm.stopPrank(); } + function testRevertByGtIsNotHealthyWhenFlashRepay() public { + uint128 debtAmt = 100e8; + uint256 collateralAmt = 1e18; + uint128 repayAmt = 50e8; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + res.debt.mint(address(flashRepayer), debtAmt); + res.gt.approve(address(flashRepayer), gtId); + + vm.expectRevert( + abi.encodeWithSelector( + GearingTokenErrors.GtIsNotHealthy.selector, gtId, address(flashRepayer), type(uint128).max + ) + ); + flashRepayer.flashRepay(gtId, repayAmt, true, abi.encode(collateralAmt)); + } + // function testFlashRepayThroughFt() public { // uint128 debtAmt = 100e8; // uint256 collateralAmt = 1e18; From a8cf9c896fda61c237b226ca256b3724d150068d Mon Sep 17 00:00:00 2001 From: Evan Date: Wed, 21 May 2025 14:35:23 +0800 Subject: [PATCH 020/194] fix issues and add ut for new functions --- contracts/router/TermMaxRouter.sol | 16 +- .../ForkRollOver.t.sol | 289 +++++++++++++----- 2 files changed, 217 insertions(+), 88 deletions(-) rename test/{mainnet-fork/mainnet => integration}/ForkRollOver.t.sol (58%) diff --git a/contracts/router/TermMaxRouter.sol b/contracts/router/TermMaxRouter.sol index f9673cf..9385305 100644 --- a/contracts/router/TermMaxRouter.sol +++ b/contracts/router/TermMaxRouter.sol @@ -378,7 +378,7 @@ contract TermMaxRouter is SwapUnit[] memory units, TermMaxSwapData memory swapData ) external whenNotPaused returns (uint256 netTokenOut) { - (IERC20 ft,, IGearingToken gt,, IERC20 debtToken) = market.tokens(); + (,, IGearingToken gt,, IERC20 debtToken) = market.tokens(); gt.safeTransferFrom(msg.sender, address(this), gtId, ""); bytes memory callbackData = abi.encode(units, swapData); callbackData = abi.encode(FlashRepayOptions.REPAY, callbackData); @@ -397,18 +397,16 @@ contract TermMaxRouter is SwapUnit[] memory units, TermMaxSwapData memory swapData ) external whenNotPaused returns (uint256 netTokenOut) { - (IERC20 ft,, IGearingToken gt,, IERC20 debtToken) = market.tokens(); + (,, IGearingToken gt,, IERC20 debtToken) = market.tokens(); gt.safeTransferFrom(msg.sender, address(this), gtId, ""); bytes memory callbackData = abi.encode(units, swapData); callbackData = abi.encode(FlashRepayOptions.REPAY, callbackData); bool repayAll = gt.flashRepay(gtId, repayAmt, byDebtToken, removedCollateral, callbackData); - if (repayAll) { - netTokenOut = debtToken.balanceOf(address(this)); - debtToken.safeTransfer(recipient, netTokenOut); - } else { - // transfer gt back to sender + if (!repayAll) { gt.safeTransferFrom(address(this), msg.sender, gtId); } + netTokenOut = debtToken.balanceOf(address(this)); + debtToken.safeTransfer(recipient, netTokenOut); } /** @@ -559,8 +557,8 @@ contract TermMaxRouter is bytes memory callbackData = abi.encode(recipient, maxLtv, additionalAssets, nextMarket, additionnalNextCollateral, units, swapData); callbackData = abi.encode(FlashRepayOptions.ROLLOVER, callbackData); - if (gt.flashRepay(gtId, repayAmt, true, abi.encode(removedCollateral), callbackData)) { - gt.safeTransferFrom(address(this), msg.sender, gtId); + if (!gt.flashRepay(gtId, repayAmt, true, abi.encode(removedCollateral), callbackData)) { + gt.safeTransferFrom(address(this), recipient, gtId); } assembly { newGtId := tload(T_ROLLOVER_GT_RESERVE_STORE) diff --git a/test/mainnet-fork/mainnet/ForkRollOver.t.sol b/test/integration/ForkRollOver.t.sol similarity index 58% rename from test/mainnet-fork/mainnet/ForkRollOver.t.sol rename to test/integration/ForkRollOver.t.sol index 2dff479..46311dc 100644 --- a/test/mainnet-fork/mainnet/ForkRollOver.t.sol +++ b/test/integration/ForkRollOver.t.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.27; import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; -import "../ForkBaseTest.sol"; import {PriceFeedFactory} from "contracts/extensions/PriceFeedFactory.sol"; import {ITermMaxMarket} from "contracts/ITermMaxMarket.sol"; import {ITermMaxOrder} from "contracts/ITermMaxOrder.sol"; @@ -11,6 +10,7 @@ import {IGearingToken, GearingTokenEvents, AbstractGearingToken} from "contracts import {PendleSwapV3Adapter} from "contracts/router/swapAdapters/PendleSwapV3Adapter.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import "contracts/storage/TermMaxStorage.sol"; +import "test/mainnet-fork/ForkBaseTest.sol"; interface TestOracle is IOracle { function acceptPendingOracle(address asset) external; @@ -35,6 +35,7 @@ contract ForkRollOver is ForkBaseTest { ITermMaxOrder o_may_30 = ITermMaxOrder(0xe99ee5b18cB57276EbEADf0E773E4f8Ab49Db9B7); ITermMaxOrder o_aug_1 = ITermMaxOrder(0x71Df74d65c3895C8FA5a1c8E8d93A7eE30A1aFc7); address pendleAdapter; + address odosAdapter = 0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779; TermMaxRouter router; function _getForkRpcUrl() internal view override returns (string memory) { @@ -92,6 +93,7 @@ contract ForkRollOver is ForkBaseTest { vm.startPrank(admin); router = deployRouter(admin); router.setAdapterWhitelist(pendleAdapter, true); + router.setAdapterWhitelist(odosAdapter, true); vm.stopPrank(); } @@ -247,85 +249,214 @@ contract ForkRollOver is ForkBaseTest { vm.stopPrank(); } - // function testRolloverPtV2() public { - - // address borrower; - // address admin = vm.randomAddress(); - - // vm.startPrank(admin); - // TermMaxRouter router = deployRouter(admin); - // router.setAdapterWhitelist(pendleAdapter, true); - // vm.stopPrank(); - - // uint128 debt; - // uint256 collateralAmount; - // // deal(pt_susde_may_29, borrower, collateralAmount); - // uint256 gt1 = 5; - - // { - // (IERC20 ft,, IGearingToken gt, address collateral,) = mmay_30.tokens(); - // (address owner, uint128 debtAmt, bytes memory collateralData) = gt.loanInfo(gt1); - // borrower = owner; - // debt = debtAmt; - // collateralAmount = abi.decode(collateralData, (uint256)); - // console.log("collateralAmount:", collateralAmount); - // console.log("debt:", debt); - // } - // vm.startPrank(borrower); - // vm.warp(may_30 - 0.5 days); - // // roll gt - // { - // address pm1 = 0xB162B764044697cf03617C2EFbcB1f42e31E4766; - // address pm2 = 0x4339Ffe2B7592Dc783ed13cCE310531aB366dEac; - - // SwapUnit[] memory swapUnits = new SwapUnit[](2); - // swapUnits[0] = SwapUnit({ - // adapter: pendleAdapter, - // tokenIn: pt_susde_may_29, - // tokenOut: susde, - // swapData: abi.encode(pm1, collateralAmount, 0) - // }); - // swapUnits[1] = SwapUnit({ - // adapter: pendleAdapter, - // tokenIn: susde, - // tokenOut: pt_susde_jun_31, - // swapData: abi.encode(pm2, 1e18, 0) - // }); - - // uint128 additionalAssets = debt / 10; - - // ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); - // orders[0] = ITermMaxOrder(address(o_aug_1)); - // uint128[] memory amounts = new uint128[](1); - // amounts[0] = debt - additionalAssets; - // (IERC20 ft,, IGearingToken gt, address collateral,) = mmay_30.tokens(); - - // deal(usdc, borrower, additionalAssets); - // IERC20(usdc).approve(address(router), additionalAssets); - // gt.approve(address(router), gt1); - - // (IERC20 ft_aug_1,,,,) = maug_1.tokens(); - // ITermMaxRouter.TermMaxSwapData memory swapData = ITermMaxRouter.TermMaxSwapData({ - // tokenIn: address(ft_aug_1), - // tokenOut: usdc, - // orders: orders, - // tradingAmts: amounts, - // netTokenAmt: debt, - // deadline: aug_1 - // }); - - // uint128 maxLtv = 0.9e8; - // uint256 gtId2 = router.rolloverGt( - // borrower, gt, gt1, debt, additionalAssets, collateralAmount, swapUnits, maug_1, 0, swapData, maxLtv - // ); - // console.log("new gtId:", gtId2); - // } - - // vm.stopPrank(); - // } + function testRolloverPtV2() public { + address borrower = vm.randomAddress(); + vm.label(borrower, "borrower"); + address admin = vm.randomAddress(); + vm.label(admin, "admin"); + + vm.startPrank(admin); + ITermMaxMarket market; + uint256 gtId1; + uint128 oldDebt = 100e6; + uint256 oldCollateral = 1000e18; + + deal(pt_susde_may_29, admin, oldCollateral); + + // create new market support v2 flash repay + { + TermMaxFactory f2 = deployFactory(admin); + MarketConfig memory marketConfig = mmay_30.config(); + (,, IGearingToken gt, address collateral, IERC20 debtToken) = mmay_30.tokens(); + GtConfig memory gtConfig = gt.getGtConfig(); + MarketInitialParams memory params = MarketInitialParams({ + collateral: collateral, + debtToken: IERC20Metadata(address(debtToken)), + admin: admin, + gtImplementation: address(0), + marketConfig: marketConfig, + loanConfig: gtConfig.loanConfig, + gtInitalParams: abi.encode(type(uint128).max), + tokenName: "Test", + tokenSymbol: "TEST" + }); + market = ITermMaxMarket(f2.createMarket(keccak256("GearingTokenWithERC20"), params, 1)); + vm.label(address(market), "newMarket"); + + (,, IGearingToken gt2,,) = market.tokens(); + + IERC20(pt_susde_may_29).approve(address(gt2), oldCollateral); + (gtId1,) = market.issueFt(borrower, 100e6, abi.encode(oldCollateral)); + + vm.label(address(market), "market_may_30"); + vm.label(address(gt2), "gt_may_30"); + } + + vm.stopPrank(); + + uint128 debt = 20e6; + uint256 collateralAmount = 500e18; + + vm.startPrank(borrower); + vm.warp(may_30 - 0.5 days); + // roll gt + { + address pm1 = 0xB162B764044697cf03617C2EFbcB1f42e31E4766; + address pm2 = 0x4339Ffe2B7592Dc783ed13cCE310531aB366dEac; + + SwapUnit[] memory swapUnits = new SwapUnit[](2); + swapUnits[0] = SwapUnit({ + adapter: pendleAdapter, + tokenIn: pt_susde_may_29, + tokenOut: susde, + swapData: abi.encode(pm1, collateralAmount, 0) + }); + swapUnits[1] = SwapUnit({ + adapter: pendleAdapter, + tokenIn: susde, + tokenOut: pt_susde_jun_31, + swapData: abi.encode(pm2, 1e18, 0) + }); + + uint128 additionalAssets = debt / 10; + + ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); + orders[0] = ITermMaxOrder(address(o_aug_1)); + uint128[] memory amounts = new uint128[](1); + amounts[0] = debt - additionalAssets; + (IERC20 ft,, IGearingToken gt, address collateral,) = market.tokens(); + + deal(usdc, borrower, additionalAssets); + IERC20(usdc).approve(address(router), additionalAssets); + gt.approve(address(router), gtId1); + + (IERC20 ft_aug_1,,,,) = maug_1.tokens(); + ITermMaxRouter.TermMaxSwapData memory swapData = ITermMaxRouter.TermMaxSwapData({ + tokenIn: address(ft_aug_1), + tokenOut: usdc, + orders: orders, + tradingAmts: amounts, + netTokenAmt: debt, + deadline: aug_1 + }); + + uint128 maxLtv = 0.9e8; + uint256 gtId2 = router.rolloverGtV2( + borrower, gt, gtId1, debt, additionalAssets, collateralAmount, swapUnits, maug_1, 0, swapData, maxLtv + ); + + (address owner, uint128 currentDebt, bytes memory currentCollateral) = gt.loanInfo(gtId1); + assertEq(owner, borrower, "borrower should be the same"); + assertEq(currentDebt + debt, oldDebt, "debt should be the same"); + assertEq( + abi.decode(currentCollateral, (uint256)), + oldCollateral - collateralAmount, + "collateral should be the same" + ); + + (,, IGearingToken gt2,,) = maug_1.tokens(); + console.log("new gtId:", gtId2); + (address owner2, uint128 currentDebt2, bytes memory currentCollateral2) = gt2.loanInfo(gtId2); + assertEq(owner2, borrower, "borrower should be the same"); + console.log("new gt debt:", currentDebt2 / 1e6); + console.log("new gt collateral:", abi.decode(currentCollateral2, (uint256)) / 1e18); + } + + vm.stopPrank(); + } + + function testFlashRepayPtV2() public { + vm.roll(22494579); // 2025-05-15 + address borrower = vm.randomAddress(); + vm.label(borrower, "borrower"); + address admin = vm.randomAddress(); + vm.label(admin, "admin"); + + vm.startPrank(admin); + ITermMaxMarket market; + uint256 gtId1; + uint128 oldDebt = 1000e6; + uint256 oldCollateral = 35012712455278300958037; + + deal(pt_susde_may_29, admin, oldCollateral); + + // create new market support v2 flash repay + { + TermMaxFactory f2 = deployFactory(admin); + MarketConfig memory marketConfig = mmay_30.config(); + (,, IGearingToken gt, address collateral, IERC20 debtToken) = mmay_30.tokens(); + GtConfig memory gtConfig = gt.getGtConfig(); + MarketInitialParams memory params = MarketInitialParams({ + collateral: collateral, + debtToken: IERC20Metadata(address(debtToken)), + admin: admin, + gtImplementation: address(0), + marketConfig: marketConfig, + loanConfig: gtConfig.loanConfig, + gtInitalParams: abi.encode(type(uint128).max), + tokenName: "Test", + tokenSymbol: "TEST" + }); + market = ITermMaxMarket(f2.createMarket(keccak256("GearingTokenWithERC20"), params, 1)); + vm.label(address(market), "newMarket"); + + (,, IGearingToken gt2,,) = market.tokens(); + + IERC20(pt_susde_may_29).approve(address(gt2), oldCollateral); + (gtId1,) = market.issueFt(borrower, oldDebt, abi.encode(oldCollateral)); + + vm.label(address(market), "market_may_30"); + vm.label(address(gt2), "gt_may_30"); + } + + vm.stopPrank(); + vm.startPrank(borrower); + vm.warp(may_30 - 0.5 days); + uint128 repayAmount = 300e6; + uint256 removedCollateral = 25012712455278300958037; + // roll gt + { + ITermMaxOrder[] memory orders = new ITermMaxOrder[](0); + uint128[] memory amounts = new uint128[](0); + SwapUnit[] memory swapUnits = new SwapUnit[](2); + address pm1 = 0xB162B764044697cf03617C2EFbcB1f42e31E4766; + swapUnits[0] = SwapUnit({ + adapter: pendleAdapter, + tokenIn: pt_susde_may_29, + tokenOut: susde, + swapData: abi.encode(pm1, removedCollateral, 0) + }); + swapUnits[1] = SwapUnit({ + adapter: 0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779, + tokenIn: susde, + tokenOut: usdc, + swapData: hex"0000000000000000000000009d39a5de30e57443bff2a8307a4256c8797a349700000000000000000000000000000000000000000000048103daed12389fbcc800000000000000000000000076edf8c155a1e0d9b2ad11b04d9671cbc25fee99000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000005d443b21d00000000000000000000000000000000000000000000000000000005b66b4d45000000000000000000000000c47591f5c023e44931c78d5a993834875b79fb11000000000000000000000000000000000000000000000000000000000000014000000000000000000000000076edf8c155a1e0d9b2ad11b04d9671cbc25fee9900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084010206000d0100010201022700000304000d0101050400ff00000000000000007eb59373d63627be64b42406b108b602174b4ccc9d39a5de30e57443bff2a8307a4256c8797a3497dac17f958d2ee523a2206206994597c13d831ec7c02aaa39b223fe8d0a0e5c4f27ead9083c756cc288e6a0c2ddd26feeb64f039a2c41296fcb3f564000000000000000000000000000000000000000000000000000000000" + }); + (IERC20 ft,, IGearingToken gt, address collateral,) = market.tokens(); + console.log("usdc balance before:", IERC20(usdc).balanceOf(borrower)); + gt.approve(address(router), gtId1); + ITermMaxRouter.TermMaxSwapData memory swapData; + router.flashRepayFromCollV2( + borrower, market, gtId1, repayAmount, true, abi.encode(removedCollateral), swapUnits, swapData + ); + console.log("usdc balance after:", IERC20(usdc).balanceOf(borrower)); + + (address owner, uint128 currentDebt, bytes memory currentCollateral) = gt.loanInfo(gtId1); + assertEq(owner, borrower, "borrower should be the same"); + assertEq(currentDebt, oldDebt - repayAmount, "debt should be the same"); + assertEq( + abi.decode(currentCollateral, (uint256)), + oldCollateral - removedCollateral, + "collateral should be the same" + ); + vm.stopPrank(); + } + + vm.stopPrank(); + } function testFlashRepayPt() public { - // vm.roll(22494579); // 2025-05-15 + vm.roll(22494579); // 2025-05-15 address borrower; address admin = vm.randomAddress(); @@ -364,7 +495,7 @@ contract ForkRollOver is ForkBaseTest { swapData: abi.encode(pm1, collateralAmount, 0) }); swapUnits[1] = SwapUnit({ - adapter: 0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779, + adapter: odosAdapter, tokenIn: susde, tokenOut: usdc, swapData: hex"0000000000000000000000009d39a5de30e57443bff2a8307a4256c8797a349700000000000000000000000000000000000000000000048103daed12389fbcc800000000000000000000000076edf8c155a1e0d9b2ad11b04d9671cbc25fee99000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000005d443b21d00000000000000000000000000000000000000000000000000000005b66b4d45000000000000000000000000c47591f5c023e44931c78d5a993834875b79fb11000000000000000000000000000000000000000000000000000000000000014000000000000000000000000076edf8c155a1e0d9b2ad11b04d9671cbc25fee9900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084010206000d0100010201022700000304000d0101050400ff00000000000000007eb59373d63627be64b42406b108b602174b4ccc9d39a5de30e57443bff2a8307a4256c8797a3497dac17f958d2ee523a2206206994597c13d831ec7c02aaa39b223fe8d0a0e5c4f27ead9083c756cc288e6a0c2ddd26feeb64f039a2c41296fcb3f564000000000000000000000000000000000000000000000000000000000" From b41e348194b57bceba7cb61b9cb9ac3da3f92248 Mon Sep 17 00:00:00 2001 From: Evan Date: Wed, 21 May 2025 16:00:15 +0800 Subject: [PATCH 021/194] fix ut --- contracts/oracle/IOracleV1.sol | 26 ++++ test/integration/ForkFlashRepay.t.sol | 176 +++++++++++++++++++++----- test/integration/ForkRollOver.t.sol | 148 ++++++++++------------ 3 files changed, 239 insertions(+), 111 deletions(-) create mode 100644 contracts/oracle/IOracleV1.sol diff --git a/contracts/oracle/IOracleV1.sol b/contracts/oracle/IOracleV1.sol new file mode 100644 index 0000000..6228777 --- /dev/null +++ b/contracts/oracle/IOracleV1.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; + +/** + * @title IOracle + * @author Term Structure Labs + */ +interface IOracle { + struct Oracle { + AggregatorV3Interface aggregator; + AggregatorV3Interface backupAggregator; + uint32 heartbeat; + } + + /// @notice Error thrown when the oracle is not working + error OracleIsNotWorking(address asset); + + /// @notice Get the price of an asset + function getPrice(address asset) external view returns (uint256 price, uint8 decimals); + + function submitPendingOracle(address asset, Oracle memory oracle) external; + + function acceptPendingOracle(address asset) external; +} diff --git a/test/integration/ForkFlashRepay.t.sol b/test/integration/ForkFlashRepay.t.sol index 1d9e8ff..c6a8fb5 100644 --- a/test/integration/ForkFlashRepay.t.sol +++ b/test/integration/ForkFlashRepay.t.sol @@ -2,15 +2,27 @@ pragma solidity ^0.8.27; import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; -import {PriceFeedFactory} from "contracts/extensions/PriceFeedFactory.sol"; import {ITermMaxMarket} from "contracts/ITermMaxMarket.sol"; import {ITermMaxOrder} from "contracts/ITermMaxOrder.sol"; import {SwapUnit, ITermMaxRouter, TermMaxRouter} from "contracts/router/TermMaxRouter.sol"; -import {IGearingToken, GearingTokenEvents, AbstractGearingToken} from "contracts/tokens/AbstractGearingToken.sol"; +import { + IGearingToken, + GearingTokenEvents, + AbstractGearingToken, + GtConfig +} from "contracts/tokens/AbstractGearingToken.sol"; import {PendleSwapV3Adapter} from "contracts/router/swapAdapters/PendleSwapV3Adapter.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; -import "contracts/storage/TermMaxStorage.sol"; -import "test/mainnet-fork/ForkBaseTest.sol"; +import {IOracle} from "contracts/oracle/IOracleV1.sol"; +import { + ForkBaseTest, + TermMaxFactory, + MarketConfig, + IERC20, + MarketInitialParams, + IERC20Metadata +} from "test/mainnet-fork/ForkBaseTest.sol"; +import {console} from "forge-std/console.sol"; interface TestOracle is IOracle { function acceptPendingOracle(address asset) external; @@ -21,6 +33,23 @@ contract ForkFlashRepay is ForkBaseTest { string MAINNET_RPC_URL = vm.envString("MAINNET_RPC_URL"); string DATA_PATH = string.concat(vm.projectRoot(), "/test/testdata/fork/mainnet.json"); + uint64 may_30 = 1748534400; // 2025-05-30 00:00:00 + uint64 aug_1 = 1753977600; // 2025-08-01 00:00:00 + address pt_susde_may_29 = 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308; + address pt_susde_jun_31 = 0x3b3fB9C57858EF816833dC91565EFcd85D96f634; + address usdc = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; + address usde = 0x4c9EDD5852cd905f086C759E8383e09bff1E68B3; + address susde = 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497; + TestOracle oracle = TestOracle(0xE3a31690392E8E18DC3d862651C079339E2c1ADE); + + ITermMaxMarket mmay_30 = ITermMaxMarket(0xe867255dC0c3a27c90f756ECC566a5292ce19492); + ITermMaxMarket maug_1 = ITermMaxMarket(0xdBB2D44c238c459cCB820De886ABF721EF6E6941); + ITermMaxOrder o_may_30 = ITermMaxOrder(0xe99ee5b18cB57276EbEADf0E773E4f8Ab49Db9B7); + ITermMaxOrder o_aug_1 = ITermMaxOrder(0x71Df74d65c3895C8FA5a1c8E8d93A7eE30A1aFc7); + address pendleAdapter; + address odosAdapter = 0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779; + TermMaxRouter router; + function _getForkRpcUrl() internal view override returns (string memory) { return MAINNET_RPC_URL; } @@ -29,26 +58,20 @@ contract ForkFlashRepay is ForkBaseTest { return DATA_PATH; } - function _finishSetup() internal override {} + function _finishSetup() internal override { + vm.roll(22486319); // 2025-05-15 - function testFlashRepayPt() public { - vm.roll(22494579); // 2025-05-15 - uint64 may_30 = 1748534400; // 2025-05-30 00:00:00 - address pt_susde_may_29 = 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308; - address usdc = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; - address usde = 0x4c9EDD5852cd905f086C759E8383e09bff1E68B3; - address susde = 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497; - TestOracle oracle = TestOracle(0xE3a31690392E8E18DC3d862651C079339E2c1ADE); address accessManager = Ownable(address(oracle)).owner(); vm.startPrank(accessManager); - address[] memory tokens = new address[](3); + address[] memory tokens = new address[](4); tokens[0] = usdc; tokens[1] = susde; tokens[2] = pt_susde_may_29; + tokens[3] = pt_susde_jun_31; for (uint256 i = 0; i < tokens.length; i++) { address token = tokens[i]; - (address aggregator, address backupAggregator, uint32 heartbeat) = oracle.oracles(token); + (address aggregator, address backupAggregator,) = oracle.oracles(token); IOracle.Oracle memory oracleData = IOracle.Oracle({ aggregator: AggregatorV3Interface(aggregator), backupAggregator: AggregatorV3Interface(backupAggregator), @@ -64,25 +87,121 @@ contract ForkFlashRepay is ForkBaseTest { vm.stopPrank(); - ITermMaxMarket mmay_30 = ITermMaxMarket(0xe867255dC0c3a27c90f756ECC566a5292ce19492); - ITermMaxOrder o_may_30 = ITermMaxOrder(0xe99ee5b18cB57276EbEADf0E773E4f8Ab49Db9B7); - - { - address yt = 0x1de6Ff19FDA7496DdC12f2161f6ad6427c52aBBe; - deal(yt, pt_susde_may_29, 1000 ether); - } - - // address pendleAdapter = 0x0B30251FA697A39Fd41813b267b50F03414E82da; PendleSwapV3Adapter adapter = new PendleSwapV3Adapter(0x888888888889758F76e7103c6CbF23ABbF58F946); - address pendleAdapter = address(adapter); + pendleAdapter = address(adapter); vm.label(pt_susde_may_29, "pt_susde_may_29"); + vm.label(pt_susde_jun_31, "pt_susde_jun_31"); vm.label(susde, "susde"); vm.label(address(oracle), "oracle"); vm.label(address(mmay_30), "mmay_30"); + vm.label(address(maug_1), "maug_1"); vm.label(address(o_may_30), "o_may_30"); + vm.label(address(o_aug_1), "o_aug_1"); vm.label(address(pendleAdapter), "pendleAdapter"); + address admin = vm.randomAddress(); + + vm.startPrank(admin); + router = deployRouter(admin); + router.setAdapterWhitelist(pendleAdapter, true); + router.setAdapterWhitelist(odosAdapter, true); + vm.stopPrank(); + } + + function testFlashRepayPtV2() public { + vm.roll(22494579); // 2025-05-15 + address borrower = vm.randomAddress(); + vm.label(borrower, "borrower"); + address admin = vm.randomAddress(); + vm.label(admin, "admin"); + + vm.startPrank(admin); + ITermMaxMarket market; + uint256 gtId1; + uint128 oldDebt = 1000e6; + uint256 oldCollateral = 35012712455278300958037; + + deal(pt_susde_may_29, admin, oldCollateral); + + // create new market support v2 flash repay + { + TermMaxFactory f2 = deployFactory(admin); + MarketConfig memory marketConfig = mmay_30.config(); + (,, IGearingToken gt, address collateral, IERC20 debtToken) = mmay_30.tokens(); + GtConfig memory gtConfig = gt.getGtConfig(); + MarketInitialParams memory params = MarketInitialParams({ + collateral: collateral, + debtToken: IERC20Metadata(address(debtToken)), + admin: admin, + gtImplementation: address(0), + marketConfig: marketConfig, + loanConfig: gtConfig.loanConfig, + gtInitalParams: abi.encode(type(uint128).max), + tokenName: "Test", + tokenSymbol: "TEST" + }); + market = ITermMaxMarket(f2.createMarket(keccak256("GearingTokenWithERC20"), params, 1)); + vm.label(address(market), "newMarket"); + + (,, IGearingToken gt2,,) = market.tokens(); + + IERC20(pt_susde_may_29).approve(address(gt2), oldCollateral); + (gtId1,) = market.issueFt(borrower, oldDebt, abi.encode(oldCollateral)); + + vm.label(address(market), "market_may_30"); + vm.label(address(gt2), "gt_may_30"); + } + + vm.stopPrank(); + vm.startPrank(borrower); + vm.warp(may_30 - 0.5 days); + uint128 repayAmount = 300e6; + uint256 removedCollateral = 25012712455278300958037; + // roll gt + { + ITermMaxOrder[] memory orders = new ITermMaxOrder[](0); + uint128[] memory amounts = new uint128[](0); + SwapUnit[] memory swapUnits = new SwapUnit[](2); + address pm1 = 0xB162B764044697cf03617C2EFbcB1f42e31E4766; + swapUnits[0] = SwapUnit({ + adapter: pendleAdapter, + tokenIn: pt_susde_may_29, + tokenOut: susde, + swapData: abi.encode(pm1, removedCollateral, 0) + }); + swapUnits[1] = SwapUnit({ + adapter: 0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779, + tokenIn: susde, + tokenOut: usdc, + swapData: hex"0000000000000000000000009d39a5de30e57443bff2a8307a4256c8797a349700000000000000000000000000000000000000000000048103daed12389fbcc800000000000000000000000076edf8c155a1e0d9b2ad11b04d9671cbc25fee99000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000005d443b21d00000000000000000000000000000000000000000000000000000005b66b4d45000000000000000000000000c47591f5c023e44931c78d5a993834875b79fb11000000000000000000000000000000000000000000000000000000000000014000000000000000000000000076edf8c155a1e0d9b2ad11b04d9671cbc25fee9900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084010206000d0100010201022700000304000d0101050400ff00000000000000007eb59373d63627be64b42406b108b602174b4ccc9d39a5de30e57443bff2a8307a4256c8797a3497dac17f958d2ee523a2206206994597c13d831ec7c02aaa39b223fe8d0a0e5c4f27ead9083c756cc288e6a0c2ddd26feeb64f039a2c41296fcb3f564000000000000000000000000000000000000000000000000000000000" + }); + (IERC20 ft,, IGearingToken gt, address collateral,) = market.tokens(); + console.log("usdc balance before:", IERC20(usdc).balanceOf(borrower)); + gt.approve(address(router), gtId1); + ITermMaxRouter.TermMaxSwapData memory swapData; + router.flashRepayFromCollV2( + borrower, market, gtId1, repayAmount, true, abi.encode(removedCollateral), swapUnits, swapData + ); + console.log("usdc balance after:", IERC20(usdc).balanceOf(borrower)); + + (address owner, uint128 currentDebt, bytes memory currentCollateral) = gt.loanInfo(gtId1); + assertEq(owner, borrower, "borrower should be the same"); + assertEq(currentDebt, oldDebt - repayAmount, "debt should be the same"); + assertEq( + abi.decode(currentCollateral, (uint256)), + oldCollateral - removedCollateral, + "collateral should be the same" + ); + vm.stopPrank(); + } + + vm.stopPrank(); + } + + function testFlashRepayPt() public { + vm.roll(22494579); // 2025-05-15 + address borrower; address admin = vm.randomAddress(); @@ -120,7 +239,7 @@ contract ForkFlashRepay is ForkBaseTest { swapData: abi.encode(pm1, collateralAmount, 0) }); swapUnits[1] = SwapUnit({ - adapter: 0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779, + adapter: odosAdapter, tokenIn: susde, tokenOut: usdc, swapData: hex"0000000000000000000000009d39a5de30e57443bff2a8307a4256c8797a349700000000000000000000000000000000000000000000048103daed12389fbcc800000000000000000000000076edf8c155a1e0d9b2ad11b04d9671cbc25fee99000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000005d443b21d00000000000000000000000000000000000000000000000000000005b66b4d45000000000000000000000000c47591f5c023e44931c78d5a993834875b79fb11000000000000000000000000000000000000000000000000000000000000014000000000000000000000000076edf8c155a1e0d9b2ad11b04d9671cbc25fee9900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084010206000d0100010201022700000304000d0101050400ff00000000000000007eb59373d63627be64b42406b108b602174b4ccc9d39a5de30e57443bff2a8307a4256c8797a3497dac17f958d2ee523a2206206994597c13d831ec7c02aaa39b223fe8d0a0e5c4f27ead9083c756cc288e6a0c2ddd26feeb64f039a2c41296fcb3f564000000000000000000000000000000000000000000000000000000000" @@ -128,9 +247,8 @@ contract ForkFlashRepay is ForkBaseTest { console.log("usdc balance before:", IERC20(usdc).balanceOf(borrower)); gt.approve(address(router), gt1); - vm.expectEmit(); - emit GearingTokenEvents.Repay(gt1, debt, true); - router.flashRepayFromColl(borrower, mmay_30, gt1, orders, amounts, true, swapUnits, may_30); + ITermMaxRouter.TermMaxSwapData memory swapData; + router.flashRepayFromColl(borrower, mmay_30, gt1, true, swapUnits, swapData); console.log("usdc balance after:", IERC20(usdc).balanceOf(borrower)); vm.stopPrank(); } diff --git a/test/integration/ForkRollOver.t.sol b/test/integration/ForkRollOver.t.sol index 46311dc..e2d7820 100644 --- a/test/integration/ForkRollOver.t.sol +++ b/test/integration/ForkRollOver.t.sol @@ -2,22 +2,34 @@ pragma solidity ^0.8.27; import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; -import {PriceFeedFactory} from "contracts/extensions/PriceFeedFactory.sol"; import {ITermMaxMarket} from "contracts/ITermMaxMarket.sol"; import {ITermMaxOrder} from "contracts/ITermMaxOrder.sol"; import {SwapUnit, ITermMaxRouter, TermMaxRouter} from "contracts/router/TermMaxRouter.sol"; -import {IGearingToken, GearingTokenEvents, AbstractGearingToken} from "contracts/tokens/AbstractGearingToken.sol"; +import { + IGearingToken, + GearingTokenEvents, + AbstractGearingToken, + GtConfig +} from "contracts/tokens/AbstractGearingToken.sol"; import {PendleSwapV3Adapter} from "contracts/router/swapAdapters/PendleSwapV3Adapter.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; -import "contracts/storage/TermMaxStorage.sol"; -import "test/mainnet-fork/ForkBaseTest.sol"; +import {IOracle} from "contracts/oracle/IOracleV1.sol"; +import { + ForkBaseTest, + TermMaxFactory, + MarketConfig, + IERC20, + MarketInitialParams, + IERC20Metadata +} from "test/mainnet-fork/ForkBaseTest.sol"; +import {console} from "forge-std/console.sol"; interface TestOracle is IOracle { function acceptPendingOracle(address asset) external; function oracles(address asset) external returns (address aggregator, address backupAggregator, uint32 heartbeat); } -contract ForkRollOver is ForkBaseTest { +contract ForkRollover is ForkBaseTest { string MAINNET_RPC_URL = vm.envString("MAINNET_RPC_URL"); string DATA_PATH = string.concat(vm.projectRoot(), "/test/testdata/fork/mainnet.json"); @@ -365,8 +377,7 @@ contract ForkRollOver is ForkBaseTest { vm.stopPrank(); } - function testFlashRepayPtV2() public { - vm.roll(22494579); // 2025-05-15 + function testRolloverPtV2WithCollateral() public { address borrower = vm.randomAddress(); vm.label(borrower, "borrower"); address admin = vm.randomAddress(); @@ -375,8 +386,8 @@ contract ForkRollOver is ForkBaseTest { vm.startPrank(admin); ITermMaxMarket market; uint256 gtId1; - uint128 oldDebt = 1000e6; - uint256 oldCollateral = 35012712455278300958037; + uint128 oldDebt = 100e6; + uint256 oldCollateral = 1000e18; deal(pt_susde_may_29, admin, oldCollateral); @@ -403,110 +414,83 @@ contract ForkRollOver is ForkBaseTest { (,, IGearingToken gt2,,) = market.tokens(); IERC20(pt_susde_may_29).approve(address(gt2), oldCollateral); - (gtId1,) = market.issueFt(borrower, oldDebt, abi.encode(oldCollateral)); + (gtId1,) = market.issueFt(borrower, 100e6, abi.encode(oldCollateral)); vm.label(address(market), "market_may_30"); vm.label(address(gt2), "gt_may_30"); } vm.stopPrank(); + + uint128 debt = 20e6; + uint256 collateralAmount = 500e18; + vm.startPrank(borrower); vm.warp(may_30 - 0.5 days); - uint128 repayAmount = 300e6; - uint256 removedCollateral = 25012712455278300958037; // roll gt { - ITermMaxOrder[] memory orders = new ITermMaxOrder[](0); - uint128[] memory amounts = new uint128[](0); - SwapUnit[] memory swapUnits = new SwapUnit[](2); address pm1 = 0xB162B764044697cf03617C2EFbcB1f42e31E4766; + address pm2 = 0x4339Ffe2B7592Dc783ed13cCE310531aB366dEac; + + SwapUnit[] memory swapUnits = new SwapUnit[](2); swapUnits[0] = SwapUnit({ adapter: pendleAdapter, tokenIn: pt_susde_may_29, tokenOut: susde, - swapData: abi.encode(pm1, removedCollateral, 0) + swapData: abi.encode(pm1, collateralAmount, 0) }); swapUnits[1] = SwapUnit({ - adapter: 0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779, + adapter: pendleAdapter, tokenIn: susde, - tokenOut: usdc, - swapData: hex"0000000000000000000000009d39a5de30e57443bff2a8307a4256c8797a349700000000000000000000000000000000000000000000048103daed12389fbcc800000000000000000000000076edf8c155a1e0d9b2ad11b04d9671cbc25fee99000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000005d443b21d00000000000000000000000000000000000000000000000000000005b66b4d45000000000000000000000000c47591f5c023e44931c78d5a993834875b79fb11000000000000000000000000000000000000000000000000000000000000014000000000000000000000000076edf8c155a1e0d9b2ad11b04d9671cbc25fee9900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084010206000d0100010201022700000304000d0101050400ff00000000000000007eb59373d63627be64b42406b108b602174b4ccc9d39a5de30e57443bff2a8307a4256c8797a3497dac17f958d2ee523a2206206994597c13d831ec7c02aaa39b223fe8d0a0e5c4f27ead9083c756cc288e6a0c2ddd26feeb64f039a2c41296fcb3f564000000000000000000000000000000000000000000000000000000000" + tokenOut: pt_susde_jun_31, + swapData: abi.encode(pm2, 1e18, 0) }); + + uint128 additionalAssets = 0; + uint256 additionalCollateral = 2 ether; + + ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); + orders[0] = ITermMaxOrder(address(o_aug_1)); + uint128[] memory amounts = new uint128[](1); + amounts[0] = debt - additionalAssets; (IERC20 ft,, IGearingToken gt, address collateral,) = market.tokens(); - console.log("usdc balance before:", IERC20(usdc).balanceOf(borrower)); + + deal(pt_susde_jun_31, borrower, additionalCollateral); + IERC20(pt_susde_jun_31).approve(address(router), additionalCollateral); gt.approve(address(router), gtId1); - ITermMaxRouter.TermMaxSwapData memory swapData; - router.flashRepayFromCollV2( - borrower, market, gtId1, repayAmount, true, abi.encode(removedCollateral), swapUnits, swapData + + (IERC20 ft_aug_1,,,,) = maug_1.tokens(); + ITermMaxRouter.TermMaxSwapData memory swapData = ITermMaxRouter.TermMaxSwapData({ + tokenIn: address(ft_aug_1), + tokenOut: usdc, + orders: orders, + tradingAmts: amounts, + netTokenAmt: debt + 10e6, + deadline: aug_1 + }); + + uint128 maxLtv = 0.9e8; + uint256 gtId2 = router.rolloverGtV2( + borrower, gt, gtId1, debt, additionalAssets, collateralAmount, swapUnits, maug_1, 0, swapData, maxLtv ); - console.log("usdc balance after:", IERC20(usdc).balanceOf(borrower)); (address owner, uint128 currentDebt, bytes memory currentCollateral) = gt.loanInfo(gtId1); assertEq(owner, borrower, "borrower should be the same"); - assertEq(currentDebt, oldDebt - repayAmount, "debt should be the same"); + assertEq(currentDebt + debt, oldDebt, "debt should be the same"); assertEq( abi.decode(currentCollateral, (uint256)), - oldCollateral - removedCollateral, + oldCollateral - collateralAmount, "collateral should be the same" ); - vm.stopPrank(); - } - - vm.stopPrank(); - } - - function testFlashRepayPt() public { - vm.roll(22494579); // 2025-05-15 - address borrower; - address admin = vm.randomAddress(); + (,, IGearingToken gt2,,) = maug_1.tokens(); + console.log("new gtId:", gtId2); + (address owner2, uint128 currentDebt2, bytes memory currentCollateral2) = gt2.loanInfo(gtId2); + assertEq(owner2, borrower, "borrower should be the same"); + console.log("new gt debt:", currentDebt2 / 1e6); + console.log("new gt collateral:", abi.decode(currentCollateral2, (uint256)) / 1e18); + } - vm.startPrank(admin); - TermMaxRouter router = deployRouter(admin); - router.setAdapterWhitelist(pendleAdapter, true); - router.setAdapterWhitelist(0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779, true); vm.stopPrank(); - - uint128 debt; - uint256 collateralAmount; - // deal(pt_susde_may_29, borrower, collateralAmount); - uint256 gt1 = 5; - - { - (IERC20 ft,, IGearingToken gt, address collateral,) = mmay_30.tokens(); - (address owner, uint128 debtAmt, bytes memory collateralData) = gt.loanInfo(gt1); - borrower = owner; - debt = debtAmt; - collateralAmount = abi.decode(collateralData, (uint256)); - console.log("collateralAmount:", collateralAmount); - console.log("debt:", debt); - - vm.startPrank(borrower); - vm.warp(may_30 - 0.5 days); - - ITermMaxOrder[] memory orders = new ITermMaxOrder[](0); - uint128[] memory amounts = new uint128[](0); - SwapUnit[] memory swapUnits = new SwapUnit[](2); - address pm1 = 0xB162B764044697cf03617C2EFbcB1f42e31E4766; - swapUnits[0] = SwapUnit({ - adapter: pendleAdapter, - tokenIn: pt_susde_may_29, - tokenOut: susde, - swapData: abi.encode(pm1, collateralAmount, 0) - }); - swapUnits[1] = SwapUnit({ - adapter: odosAdapter, - tokenIn: susde, - tokenOut: usdc, - swapData: hex"0000000000000000000000009d39a5de30e57443bff2a8307a4256c8797a349700000000000000000000000000000000000000000000048103daed12389fbcc800000000000000000000000076edf8c155a1e0d9b2ad11b04d9671cbc25fee99000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000005d443b21d00000000000000000000000000000000000000000000000000000005b66b4d45000000000000000000000000c47591f5c023e44931c78d5a993834875b79fb11000000000000000000000000000000000000000000000000000000000000014000000000000000000000000076edf8c155a1e0d9b2ad11b04d9671cbc25fee9900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084010206000d0100010201022700000304000d0101050400ff00000000000000007eb59373d63627be64b42406b108b602174b4ccc9d39a5de30e57443bff2a8307a4256c8797a3497dac17f958d2ee523a2206206994597c13d831ec7c02aaa39b223fe8d0a0e5c4f27ead9083c756cc288e6a0c2ddd26feeb64f039a2c41296fcb3f564000000000000000000000000000000000000000000000000000000000" - }); - - console.log("usdc balance before:", IERC20(usdc).balanceOf(borrower)); - gt.approve(address(router), gt1); - ITermMaxRouter.TermMaxSwapData memory swapData; - router.flashRepayFromColl(borrower, mmay_30, gt1, true, swapUnits, swapData); - console.log("usdc balance after:", IERC20(usdc).balanceOf(borrower)); - vm.stopPrank(); - } } } From 81efc48d5a9d775ec76a1d0a42cb4d1ee34b1b96 Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 22 May 2025 15:27:56 +0800 Subject: [PATCH 022/194] add gt initialize events --- contracts/events/GearingTokenEvents.sol | 3 +++ contracts/tokens/AbstractGearingToken.sol | 1 + contracts/tokens/GearingTokenWithERC20.sol | 6 +++++- test/Factory.t.sol | 10 +++++++++- 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/contracts/events/GearingTokenEvents.sol b/contracts/events/GearingTokenEvents.sol index 6534477..352d57c 100644 --- a/contracts/events/GearingTokenEvents.sol +++ b/contracts/events/GearingTokenEvents.sol @@ -2,6 +2,9 @@ pragma solidity ^0.8.0; interface GearingTokenEvents { + /// @notice Emitted when a new Gearing Token is initialized + event GearingTokenInitialized(address indexed market, string name, string symbol, bytes initialData); + /// @notice Emitted when updating the configuration event UpdateConfig(bytes configData); diff --git a/contracts/tokens/AbstractGearingToken.sol b/contracts/tokens/AbstractGearingToken.sol index 0ef0882..5d2666a 100644 --- a/contracts/tokens/AbstractGearingToken.sol +++ b/contracts/tokens/AbstractGearingToken.sol @@ -73,6 +73,7 @@ abstract contract AbstractGearingToken is { __AbstractGearingToken_init(name, symbol, config_); __GearingToken_Implement_init(initalParams); + emit GearingTokenInitialized(msg.sender, name, symbol, initalParams); } function __AbstractGearingToken_init(string memory name, string memory symbol, GtConfig memory config_) diff --git a/contracts/tokens/GearingTokenWithERC20.sol b/contracts/tokens/GearingTokenWithERC20.sol index b1b0b37..268174d 100644 --- a/contracts/tokens/GearingTokenWithERC20.sol +++ b/contracts/tokens/GearingTokenWithERC20.sol @@ -21,6 +21,9 @@ contract GearingTokenWithERC20 is AbstractGearingToken { /// @notice The operation failed because the amount can not be uint256 max error AmountCanNotBeUint256Max(); + /// @notice Emitted when the collateral capacity is updated + event CollateralCapacityUpdated(uint256 newCapacity); + /// @notice The max capacity of collateral token uint256 public collateralCapacity; @@ -31,12 +34,13 @@ contract GearingTokenWithERC20 is AbstractGearingToken { } function __GearingToken_Implement_init(bytes memory initalParams) internal override onlyInitializing { - collateralCapacity = abi.decode(initalParams, (uint256)); + _updateConfig(initalParams); collateralDecimals = IERC20Metadata(_config.collateral).decimals(); } function _updateConfig(bytes memory configData) internal virtual override { collateralCapacity = abi.decode(configData, (uint256)); + emit CollateralCapacityUpdated(collateralCapacity); } function _checkBeforeMint(uint128, bytes memory collateralData) internal virtual override { diff --git a/test/Factory.t.sol b/test/Factory.t.sol index 700cf46..362864e 100644 --- a/test/Factory.t.sol +++ b/test/Factory.t.sol @@ -12,7 +12,7 @@ import {MockERC20, ERC20} from "contracts/test/MockERC20.sol"; import {MockPriceFeed} from "contracts/test/MockPriceFeed.sol"; import {IMintableERC20} from "contracts/tokens/MintableERC20.sol"; import {IGearingToken} from "contracts/tokens/IGearingToken.sol"; -import {GearingTokenWithERC20} from "contracts/tokens/GearingTokenWithERC20.sol"; +import {GearingTokenWithERC20, GearingTokenEvents} from "contracts/tokens/GearingTokenWithERC20.sol"; import {ITermMaxFactory, TermMaxFactory, FactoryErrors, FactoryEvents} from "contracts/factory/TermMaxFactory.sol"; import {IOracle, OracleAggregator, AggregatorV3Interface} from "contracts/oracle/OracleAggregator.sol"; import "contracts/storage/TermMaxStorage.sol"; @@ -116,6 +116,14 @@ contract FactoryTest is Test { factory.createMarket(DeployUtils.GT_ERC20, params, 0); params.marketConfig.feeConfig.mintGtFeeRef = 0; + address predictMarketAddress = + factory.predictMarketAddress(deployer, address(collateral), address(debt), maturity, 0); + vm.expectEmit(); + emit GearingTokenEvents.GearingTokenInitialized( + predictMarketAddress, "GT:test", "GT:test", abi.encode(type(uint256).max) + ); + emit GearingTokenWithERC20.CollateralCapacityUpdated(type(uint256).max); + emit FactoryEvents.CreateMarket(predictMarketAddress, address(collateral), debt); factory.createMarket(DeployUtils.GT_ERC20, params, 0); vm.stopPrank(); } From ae279a083ecd2b4ea10c49ec4b12836afe2fa3b7 Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 22 May 2025 15:33:22 +0800 Subject: [PATCH 023/194] remove check of gt approvement --- contracts/TermMaxOrder.sol | 4 ---- contracts/errors/OrderErrors.sol | 6 ------ contracts/test/MockOrder.sol | 4 ---- 3 files changed, 14 deletions(-) diff --git a/contracts/TermMaxOrder.sol b/contracts/TermMaxOrder.sol index e1d9c16..4ff992a 100644 --- a/contracts/TermMaxOrder.sol +++ b/contracts/TermMaxOrder.sol @@ -211,10 +211,6 @@ contract TermMaxOrder is xt.safeTransfer(msg.sender, (-xtChangeAmt).toUint256()); } _orderConfig.maxXtReserve = newOrderConfig.maxXtReserve; - // check gtId - if (newOrderConfig.gtId != 0 && address(this) != gt.getApproved(newOrderConfig.gtId)) { - revert GtNotApproved(newOrderConfig.gtId); - } _orderConfig.gtId = newOrderConfig.gtId; _orderConfig.swapTrigger = newOrderConfig.swapTrigger; emit UpdateOrder( diff --git a/contracts/errors/OrderErrors.sol b/contracts/errors/OrderErrors.sol index 046b97a..a89ff8e 100644 --- a/contracts/errors/OrderErrors.sol +++ b/contracts/errors/OrderErrors.sol @@ -55,12 +55,6 @@ interface OrderErrors { */ error DeadlineExpired(); - /** - * @notice Error thrown when a GT hasn't been approved for an operation - * @param gtId The ID of the unapproved GT - */ - error GtNotApproved(uint256 gtId); - /** * @notice Error thrown when the XT reserve exceeds the maximum allowed */ diff --git a/contracts/test/MockOrder.sol b/contracts/test/MockOrder.sol index 4ffe292..7b08d9b 100644 --- a/contracts/test/MockOrder.sol +++ b/contracts/test/MockOrder.sol @@ -168,10 +168,6 @@ contract MockOrder is xt.safeTransfer(msg.sender, (-xtChangeAmt).toUint256()); } _orderConfig.maxXtReserve = newOrderConfig.maxXtReserve; - // check gtId - if (newOrderConfig.gtId != 0 && address(this) != gt.getApproved(newOrderConfig.gtId)) { - revert GtNotApproved(newOrderConfig.gtId); - } _orderConfig.gtId = newOrderConfig.gtId; _orderConfig.swapTrigger = newOrderConfig.swapTrigger; emit UpdateOrder( From 2721a326dea8c4b0392f514e1435836a65829e4a Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 22 May 2025 15:41:08 +0800 Subject: [PATCH 024/194] add market name fucntion --- contracts/ITermMaxMarket.sol | 2 ++ contracts/TermMaxMarket.sol | 4 +++- contracts/lib/MarketConstants.sol | 1 + test/Factory.t.sol | 2 ++ 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/contracts/ITermMaxMarket.sol b/contracts/ITermMaxMarket.sol index 186cbe2..f03db15 100644 --- a/contracts/ITermMaxMarket.sol +++ b/contracts/ITermMaxMarket.sol @@ -16,6 +16,8 @@ interface ITermMaxMarket { /// @notice Initialize the token and configuration of the market function initialize(MarketInitialParams memory params) external; + function name() external view returns (string memory); + /// @notice Return the configuration function config() external view returns (MarketConfig memory); diff --git a/contracts/TermMaxMarket.sol b/contracts/TermMaxMarket.sol index feb3a95..ceb2ff7 100644 --- a/contracts/TermMaxMarket.sol +++ b/contracts/TermMaxMarket.sol @@ -48,6 +48,8 @@ contract TermMaxMarket is IMintableERC20 private xt; IGearingToken private gt; + string public name; + /// @notice Check if the market is tradable modifier isOpen() { if (block.timestamp >= _config.maturity) { @@ -84,7 +86,7 @@ contract TermMaxMarket is _config = config_; (ft, xt, gt) = _deployTokens(params); - + name = _contactString(MarketConstants.PREFIX_MARKET, params.tokenName); emit MarketInitialized(params.collateral, params.debtToken, _config.maturity, ft, xt, gt); } diff --git a/contracts/lib/MarketConstants.sol b/contracts/lib/MarketConstants.sol index bdae5e6..75ab241 100644 --- a/contracts/lib/MarketConstants.sol +++ b/contracts/lib/MarketConstants.sol @@ -5,4 +5,5 @@ library MarketConstants { string constant PREFIX_FT = "FT:"; string constant PREFIX_XT = "XT:"; string constant PREFIX_GT = "GT:"; + string constant PREFIX_MARKET = "Termmax Market:"; } diff --git a/test/Factory.t.sol b/test/Factory.t.sol index 362864e..bea861c 100644 --- a/test/Factory.t.sol +++ b/test/Factory.t.sol @@ -40,6 +40,8 @@ contract FactoryTest is Test { ); assert(address(res.market) == predictedMarketAddress); + assert(keccak256(abi.encode(res.market.name())) == keccak256(abi.encode("Termmax Market:DAI-ETH"))); + assert(keccak256(abi.encode(res.market.config())) == keccak256(abi.encode(marketConfig))); GtConfig memory gtConfig = res.gt.getGtConfig(); assert(gtConfig.maturity == marketConfig.maturity); From e6cbf7e3288170cda992083615f8fa8ddeb3e93e Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 22 May 2025 17:24:07 +0800 Subject: [PATCH 025/194] TermMaxToken contract --- contracts/errors/TermMaxTokenErrors.sol | 8 ++ contracts/events/TermMaxTokenEvents.sol | 10 ++ contracts/tokens/StakingBuffer.sol | 44 ++++++++ contracts/tokens/TermMaxToken.sol | 130 ++++++++++++++++++++++++ 4 files changed, 192 insertions(+) create mode 100644 contracts/errors/TermMaxTokenErrors.sol create mode 100644 contracts/events/TermMaxTokenEvents.sol create mode 100644 contracts/tokens/StakingBuffer.sol create mode 100644 contracts/tokens/TermMaxToken.sol diff --git a/contracts/errors/TermMaxTokenErrors.sol b/contracts/errors/TermMaxTokenErrors.sol new file mode 100644 index 0000000..4a96572 --- /dev/null +++ b/contracts/errors/TermMaxTokenErrors.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface TermMaxTokenErrors { + error InvalidToken(); + error InsufficientIncomeAmount(uint256 availableAmount, uint256 requestedAmount); + error AaveWithdrawFailed(uint256 aTokenAmount, uint256 recieivedAmount); +} diff --git a/contracts/events/TermMaxTokenEvents.sol b/contracts/events/TermMaxTokenEvents.sol new file mode 100644 index 0000000..a163f31 --- /dev/null +++ b/contracts/events/TermMaxTokenEvents.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface TermMaxTokenEvents { + event TermMaxTokenInitialized(address indexed admin, address indexed underlying); + event Mint(address indexed to, uint256 amount); + event Burn(address indexed to, uint256 amount); + event WithdrawIncome(address indexed to, uint256 amount); + event UpdateBufferConfig(uint256 minimumBuffer, uint256 maximumBuffer, uint256 buffer); +} diff --git a/contracts/tokens/StakingBuffer.sol b/contracts/tokens/StakingBuffer.sol new file mode 100644 index 0000000..b0c49b3 --- /dev/null +++ b/contracts/tokens/StakingBuffer.sol @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {TransferUtils, IERC20} from "contracts/lib/TransferUtils.sol"; + +abstract contract StakingBuffer { + using TransferUtils for IERC20; + + error InvalidBuffer(uint256 minimumBuffer, uint256 maximumBuffer, uint256 buffer); + + struct BufferConfig { + uint256 minimumBuffer; + uint256 maximumBuffer; + uint256 buffer; + } + + function _depositWithBuffer(address assetAddr, uint256 amount) internal { + uint256 assetBalance = IERC20(assetAddr).balanceOf(address(this)); + BufferConfig memory bufferConfig = _bufferConfig(assetAddr); + if (assetBalance + amount > bufferConfig.maximumBuffer) { + _depositToPool(assetAddr, assetBalance + amount - bufferConfig.buffer); + } + } + + function _withdrawWithBuffer(address assetAddr, address to, uint256 amount) internal { + uint256 assetBalance = IERC20(assetAddr).balanceOf(address(this)); + BufferConfig memory bufferConfig = _bufferConfig(assetAddr); + if (assetBalance < amount || assetBalance - amount < bufferConfig.minimumBuffer) { + _withdrawFromPool(assetAddr, to, bufferConfig.buffer + amount - assetBalance); + } + } + + function _bufferConfig(address assetAddr) internal view virtual returns (BufferConfig memory); + + function _depositToPool(address assetAddr, uint256 amount) internal virtual; + + function _withdrawFromPool(address assetAddr, address to, uint256 amount) internal virtual; + + function _checkBufferConfig(uint256 minimumBuffer, uint256 maximumBuffer, uint256 buffer) internal pure { + if (minimumBuffer > maximumBuffer || buffer < minimumBuffer || buffer > maximumBuffer) { + revert InvalidBuffer(minimumBuffer, maximumBuffer, buffer); + } + } +} diff --git a/contracts/tokens/TermMaxToken.sol b/contracts/tokens/TermMaxToken.sol new file mode 100644 index 0000000..1806aac --- /dev/null +++ b/contracts/tokens/TermMaxToken.sol @@ -0,0 +1,130 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {ERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; +import { + OwnableUpgradeable, + Ownable2StepUpgradeable +} from "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; +import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import {IERC20Metadata, IERC20} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; +import {IAaveV3Minimal} from "contracts/extensions/aave/IAaveV3Minimal.sol"; +import {TransferUtils} from "contracts/lib/TransferUtils.sol"; +import {StakingBuffer} from "contracts/tokens/StakingBuffer.sol"; +import {TermMaxTokenEvents} from "contracts/events/TermMaxTokenEvents.sol"; +import {TermMaxTokenErrors} from "contracts/errors/TermMaxTokenErrors.sol"; + +contract TermMaxToken is + StakingBuffer, + ERC20Upgradeable, + Ownable2StepUpgradeable, + UUPSUpgradeable, + ReentrancyGuardUpgradeable, + TermMaxTokenEvents, + TermMaxTokenErrors +{ + using TransferUtils for IERC20; + + IAaveV3Minimal public immutable aavePool; + uint16 public immutable referralCode; + + IERC20 public aToken; + IERC20 public underlying; + BufferConfig public bufferConfig; + /// @notice The token's decimals + uint8 _decimals; + uint256 internal withdawedIncomeAssets; + + constructor(address aavePool_, uint16 referralCode_) { + aavePool = IAaveV3Minimal(aavePool_); + referralCode = referralCode_; + _disableInitializers(); + } + + function initialize(address admin, address underlying, BufferConfig memory bufferConfig_) public initializer { + string memory name = string(abi.encodePacked("TermMax ", IERC20Metadata(underlying).name())); + string memory symbol = string(abi.encodePacked("tmx", IERC20Metadata(underlying).symbol())); + _decimals = IERC20Metadata(underlying).decimals(); + __ERC20_init(name, symbol); + __Ownable_init(admin); + __ReentrancyGuard_init(); + _updateBufferConfig(bufferConfig_); + aToken = IERC20(aavePool.getReserveData(underlying).aTokenAddress); + + emit TermMaxTokenInitialized(admin, underlying); + } + + function mint(address to, uint256 amount) external nonReentrant { + _mint(to, amount); + underlying.safeTransferFrom(msg.sender, address(this), amount); + _depositWithBuffer(address(underlying), amount); + } + + function burn(address to, uint256 amount) external nonReentrant { + _burn(msg.sender, amount); + _withdrawWithBuffer(address(underlying), to, amount); + } + + function burnToAToken(address to, uint256 amount) external nonReentrant { + _burn(msg.sender, amount); + aToken.safeTransfer(to, amount); + } + + function totalIncomeAssets() external view returns (uint256) { + uint256 aTokenBalance = aToken.balanceOf(address(this)); + uint256 underlyingBalance = underlying.balanceOf(address(this)); + return aTokenBalance + underlyingBalance - totalSupply() + withdawedIncomeAssets; + } + + function withdrawIncomeAssets(address asset, address to, uint256 amount) external nonReentrant onlyOwner { + uint256 aTokenBalance = aToken.balanceOf(address(this)); + uint256 underlyingBalance = underlying.balanceOf(address(this)); + uint256 avaliableAmount = aTokenBalance + underlyingBalance - totalSupply(); + require(avaliableAmount >= amount, InsufficientIncomeAmount(avaliableAmount, amount)); + withdawedIncomeAssets += amount; + if (asset == address(underlying)) { + _withdrawWithBuffer(address(underlying), to, amount); + } else if (asset == address(aToken)) { + aToken.safeTransfer(to, amount); + } else { + revert InvalidToken(); + } + emit WithdrawIncome(to, amount); + } + + function updateBufferConfigAndAddReserves(uint256 additionalReserves, BufferConfig memory bufferConfig_) + external + onlyOwner + { + // Admin may add additional reserves when liquidity is low + // to avoid the situation that the underlying liquidity is too low to withdraw + underlying.safeTransferFrom(msg.sender, address(this), additionalReserves); + _updateBufferConfig(bufferConfig_); + } + + function _updateBufferConfig(BufferConfig memory bufferConfig_) internal { + _checkBufferConfig(bufferConfig_.minimumBuffer, bufferConfig_.maximumBuffer, bufferConfig_.buffer); + bufferConfig = BufferConfig(bufferConfig_.minimumBuffer, bufferConfig_.maximumBuffer, bufferConfig_.buffer); + emit UpdateBufferConfig(bufferConfig_.minimumBuffer, bufferConfig_.maximumBuffer, bufferConfig_.buffer); + } + + function decimals() public view override(ERC20Upgradeable) returns (uint8) { + return _decimals; + } + + function _bufferConfig(address) internal view virtual override returns (BufferConfig memory) { + return bufferConfig; + } + + function _depositToPool(address assetAddr, uint256 amount) internal virtual override { + aavePool.supply(assetAddr, amount, address(this), referralCode); + } + + function _withdrawFromPool(address assetAddr, address to, uint256 amount) internal virtual override { + uint256 receivedAmount = aavePool.withdraw(assetAddr, amount, to); + require(receivedAmount == amount, AaveWithdrawFailed(amount, receivedAmount)); + } + + function _authorizeUpgrade(address newImplementation) internal virtual override onlyOwner {} +} From e9e694e24bba11c2a793acc21239ff73ce2c6bde Mon Sep 17 00:00:00 2001 From: Evan Date: Fri, 23 May 2025 11:22:13 +0800 Subject: [PATCH 026/194] new diagrams --- iamges/tmxUSDC_burn.md | 49 ++++++++++++++ iamges/tmxUSDC_mint.md | 50 ++++++++++++++ iamges/tmx_initialize.md | 58 ++++++++++++++++ .../tmx_updateBufferConfigAndAddReserves.md | 25 +++++++ iamges/tmx_withdrawIncomeAssets.md | 67 +++++++++++++++++++ iamges/v2_burn.md | 42 ------------ iamges/v2_mint.md | 37 ---------- iamges/vault_burn.md | 38 ----------- iamges/vault_mint.md | 31 --------- 9 files changed, 249 insertions(+), 148 deletions(-) create mode 100644 iamges/tmxUSDC_burn.md create mode 100644 iamges/tmxUSDC_mint.md create mode 100644 iamges/tmx_initialize.md create mode 100644 iamges/tmx_updateBufferConfigAndAddReserves.md create mode 100644 iamges/tmx_withdrawIncomeAssets.md delete mode 100644 iamges/v2_burn.md delete mode 100644 iamges/v2_mint.md delete mode 100644 iamges/vault_burn.md delete mode 100644 iamges/vault_mint.md diff --git a/iamges/tmxUSDC_burn.md b/iamges/tmxUSDC_burn.md new file mode 100644 index 0000000..377db2a --- /dev/null +++ b/iamges/tmxUSDC_burn.md @@ -0,0 +1,49 @@ +```mermaid +sequenceDiagram + title TermMaxToken - burn() + actor User + participant TMT as TermMaxToken + participant ERC20 as ERC20Upgradeable + participant UnderlyingToken as IERC20 (underlying) + participant AavePool as IAaveV3Minimal (aavePool) + + User->>TMT: burn(to, amount) + activate TMT + + TMT->>ERC20: _burn(User, amount) + activate ERC20 + ERC20-->>TMT: (updates TMT balances) + deactivate ERC20 + + TMT->>TMT: _withdrawWithBuffer(underlying, to, amount) + activate TMT #LightBlue + Note right of TMT: Inherited from StakingBuffer + TMT->>TMT: _bufferConfig(underlying) + TMT-->>TMT: bufferConfig + + TMT->>TMT: (determines withdraw amount from pool vs buffer) + Note right of TMT: amountFromPool, amountFromBuffer + + alt amountFromBuffer > 0 + TMT->>UnderlyingToken: safeTransfer(to, amountFromBuffer) + activate UnderlyingToken + UnderlyingToken-->>TMT: // Return signal from safeTransfer + deactivate UnderlyingToken + end + + alt amountFromPool > 0 + TMT->>TMT: _withdrawFromPool(underlying, to, amountFromPool) + activate TMT #CornflowerBlue + Note right of TMT: Overridden method + TMT->>AavePool: withdraw(underlying, amountFromPool, to) + activate AavePool + AavePool-->>TMT: receivedAmount + deactivate AavePool + TMT->>TMT: require(receivedAmount == amountFromPool, "AaveWithdrawFailed") + deactivate TMT #CornflowerBlue + end + deactivate TMT #LightBlue + + TMT-->>User: (success) + deactivate TMT +``` \ No newline at end of file diff --git a/iamges/tmxUSDC_mint.md b/iamges/tmxUSDC_mint.md new file mode 100644 index 0000000..db00ade --- /dev/null +++ b/iamges/tmxUSDC_mint.md @@ -0,0 +1,50 @@ +```mermaid +sequenceDiagram + title TermMaxToken - mint() + actor User + participant TMT as TermMaxToken + participant ERC20 as ERC20Upgradeable + participant UnderlyingToken as IERC20 (underlying) + participant AavePool as IAaveV3Minimal (aavePool) + + User->>TMT: mint(to, amount) + activate TMT + + TMT->>ERC20: _mint(to, amount) + activate ERC20 + ERC20-->>TMT: (updates TMT balances) + deactivate ERC20 + + TMT->>UnderlyingToken: safeTransferFrom(User, TMT, amount) + activate UnderlyingToken + UnderlyingToken-->>TMT: (transfers underlying to TMT) + deactivate UnderlyingToken + + TMT->>TMT: _depositWithBuffer(underlying, amount) + activate TMT #LightBlue + Note right of TMT: Inherited from StakingBuffer + TMT->>TMT: _bufferConfig(underlying) + TMT-->>TMT: bufferConfig + + TMT->>TMT: (determines deposit amount to pool vs buffer based on bufferConfig) + Note right of TMT: amountToPool, amountToBuffer + + alt amountToBuffer > 0 + TMT->>TMT: (updates internal buffer balance for underlying) + end + + alt amountToPool > 0 + TMT->>TMT: _depositToPool(underlying, amountToPool) + activate TMT #CornflowerBlue + Note right of TMT: Overridden method + TMT->>AavePool: supply(underlying, amountToPool, TMT, referralCode) + activate AavePool + AavePool-->>TMT: (Aave supplies liquidity, mints aTokens to TMT) + deactivate AavePool + deactivate TMT #CornflowerBlue + end + deactivate TMT #LightBlue + + TMT-->>User: (success) + deactivate TMT +``` \ No newline at end of file diff --git a/iamges/tmx_initialize.md b/iamges/tmx_initialize.md new file mode 100644 index 0000000..4614e73 --- /dev/null +++ b/iamges/tmx_initialize.md @@ -0,0 +1,58 @@ +```mermaid +sequenceDiagram + title TermMaxToken - initialize() + actor Deployer + participant TMT as TermMaxToken + participant ERC20 as ERC20Upgradeable + participant Ownable as OwnableUpgradeable + participant ReentrancyGuard as ReentrancyGuardUpgradeable + participant UnderlyingMeta as IERC20Metadata (underlying) + participant AavePool as IAaveV3Minimal (aavePool) + + Deployer->>TMT: initialize(admin, underlying, bufferConfig) + activate TMT + + TMT->>UnderlyingMeta: name() + activate UnderlyingMeta + UnderlyingMeta-->>TMT: tokenName + deactivate UnderlyingMeta + + TMT->>UnderlyingMeta: symbol() + activate UnderlyingMeta + UnderlyingMeta-->>TMT: tokenSymbol + deactivate UnderlyingMeta + + TMT->>UnderlyingMeta: decimals() + activate UnderlyingMeta + UnderlyingMeta-->>TMT: tokenDecimals + deactivate UnderlyingMeta + + TMT->>ERC20: __ERC20_init("TermMax " + tokenName, "tmx" + tokenSymbol) + activate ERC20 + ERC20-->>TMT: // Return signal from ERC20 initialization + deactivate ERC20 + + TMT->>Ownable: __Ownable_init(admin) + activate Ownable + Ownable-->>TMT: // Return signal from Ownable initialization + deactivate Ownable + + TMT->>ReentrancyGuard: __ReentrancyGuard_init() + activate ReentrancyGuard + ReentrancyGuard-->>TMT: // Return signal from ReentrancyGuard initialization + deactivate ReentrancyGuard + + TMT->>TMT: _updateBufferConfig(bufferConfig) + Note right of TMT: Sets bufferConfig and emits event + + TMT->>AavePool: getReserveData(underlying) + activate AavePool + AavePool-->>TMT: reserveData (contains aTokenAddress) + deactivate AavePool + + TMT->>TMT: (sets aToken = IERC20(reserveData.aTokenAddress)) + TMT->>TMT: emit TermMaxTokenInitialized(admin, underlying) + + TMT-->>Deployer: (success) + deactivate TMT +``` \ No newline at end of file diff --git a/iamges/tmx_updateBufferConfigAndAddReserves.md b/iamges/tmx_updateBufferConfigAndAddReserves.md new file mode 100644 index 0000000..273fc9e --- /dev/null +++ b/iamges/tmx_updateBufferConfigAndAddReserves.md @@ -0,0 +1,25 @@ +```mermaid +sequenceDiagram + title TermMaxToken - updateBufferConfigAndAddReserves() + actor Owner + participant TMT as TermMaxToken + participant uTkn as IERC20 (underlying) + + Owner->>TMT: updateBufferConfigAndAddReserves(additionalReserves, newBufferConfig) + activate TMT + + TMT->>uTkn: safeTransferFrom(Owner, TMT, additionalReserves) + activate uTkn + uTkn-->>TMT: // Return signal from safeTransferFrom + deactivate uTkn + + TMT->>TMT: _updateBufferConfig(newBufferConfig) + activate TMT #LightSkyBlue + TMT->>TMT: _checkBufferConfig(newBufferConfig.minimumBuffer, newBufferConfig.maximumBuffer, newBufferConfig.buffer) + TMT->>TMT: (updates storage: this.bufferConfig = newBufferConfig) + TMT->>TMT: emit UpdateBufferConfig(newBufferConfig.minimumBuffer, newBufferConfig.maximumBuffer, newBufferConfig.buffer) + deactivate TMT #LightSkyBlue + + TMT-->>Owner: (success) + deactivate TMT +``` \ No newline at end of file diff --git a/iamges/tmx_withdrawIncomeAssets.md b/iamges/tmx_withdrawIncomeAssets.md new file mode 100644 index 0000000..492b3f4 --- /dev/null +++ b/iamges/tmx_withdrawIncomeAssets.md @@ -0,0 +1,67 @@ +```mermaid +sequenceDiagram + title TermMaxToken - withdrawIncomeAssets() + actor Owner + participant TMT as TermMaxToken + participant aTkn as IERC20 (aToken) + participant uTkn as IERC20 (underlying) + participant AavePool as IAaveV3Minimal (aavePool) + + Owner->>TMT: withdrawIncomeAssets(asset, to, amount) + activate TMT + + TMT->>aTkn: balanceOf(address(this)) + activate aTkn + aTkn-->>TMT: aTokenBalance + deactivate aTkn + + TMT->>uTkn: balanceOf(address(this)) + activate uTkn + uTkn-->>TMT: underlyingBalance + deactivate uTkn + + TMT->>TMT: (calculates availableAmount) + TMT->>TMT: require(availableAmount >= amount) + TMT->>TMT: withdawedIncomeAssets += amount + + alt asset == address(underlying) + TMT->>TMT: _withdrawWithBuffer(address(underlying), to, amount) + activate TMT #LightBlue + Note right of TMT: Internal StakingBuffer logic + TMT->>TMT: _bufferConfig(address(underlying)) + TMT-->>TMT: currentBufferConfig + + TMT->>TMT: (determines amountFromPool, amountFromBuffer) + + alt amountFromBuffer > 0 + TMT->>uTkn: safeTransfer(to, amountFromBuffer) + activate uTkn + uTkn-->>TMT: // Return signal from safeTransfer + deactivate uTkn + end + + alt amountFromPool > 0 + TMT->>TMT: _withdrawFromPool(address(underlying), to, amountFromPool) + activate TMT #CornflowerBlue + Note right of TMT: Overridden method + TMT->>AavePool: withdraw(address(underlying), amountFromPool, to) + activate AavePool + AavePool-->>TMT: receivedAmount + deactivate AavePool + TMT->>TMT: require(receivedAmount == amountFromPool) + deactivate TMT #CornflowerBlue + end + deactivate TMT #LightBlue + else asset == address(aToken) + TMT->>aTkn: safeTransfer(to, amount) + activate aTkn + aTkn-->>TMT: // Return signal from safeTransfer + deactivate aTkn + else + TMT->>TMT: revert InvalidToken() + end + + TMT->>TMT: emit WithdrawIncome(to, amount) + TMT-->>Owner: (success) + deactivate TMT +``` \ No newline at end of file diff --git a/iamges/v2_burn.md b/iamges/v2_burn.md deleted file mode 100644 index ce5b9e1..0000000 --- a/iamges/v2_burn.md +++ /dev/null @@ -1,42 +0,0 @@ -```mermaid -sequenceDiagram - actor User - participant MarketV2 as TermMaxMarketV2 - participant FT as FT Token (IMintableERC20) - participant XT as XT Token (IMintableERC20) - participant DebtToken as Debt Token (ERC20) - participant AavePool as Aave Pool (StakingBuffer via IAaveV3Minimal) - - User->>MarketV2: burn(owner, recipient, debtTokenAmt) - activate MarketV2 - - Note over MarketV2: Calls _burn(owner, msg.sender, recipient, debtTokenAmt) - - MarketV2->>FT: burn(owner, User, debtTokenAmt) - activate FT - Note over FT, User: User (as spender) must have allowance from owner for FT - FT-->>MarketV2: success - deactivate FT - - MarketV2->>XT: burn(owner, User, debtTokenAmt) - activate XT - Note over XT, User: User (as spender) must have allowance from owner for XT - XT-->>MarketV2: success - deactivate XT - - MarketV2->>DebtToken: safeTransfer(recipient, debtTokenAmt) - activate DebtToken - Note over MarketV2, DebtToken: This transfers debtToken from MarketV2 to recipient. - DebtToken-->>MarketV2: success - deactivate DebtToken - - MarketV2->>AavePool: withdraw(debtToken, recipient, debtTokenAmt) - activate AavePool - Note over MarketV2,AavePool: via _withdrawWithBuffer -> _withdrawFromPool - AavePool-->>MarketV2: success - deactivate AavePool - - Note over MarketV2: Emits Burn(owner, recipient, debtTokenAmt) - MarketV2-->>User: success - deactivate MarketV2 -``` \ No newline at end of file diff --git a/iamges/v2_mint.md b/iamges/v2_mint.md deleted file mode 100644 index e772f18..0000000 --- a/iamges/v2_mint.md +++ /dev/null @@ -1,37 +0,0 @@ -```mermaid -sequenceDiagram - actor User - participant MarketV2 as TermMaxMarketV2 - participant DebtToken as Debt Token (ERC20) - participant FT as FT Token (IMintableERC20) - participant XT as XT Token (IMintableERC20) - participant AavePool as Aave Pool (StakingBuffer) - - User->>MarketV2: mint(recipient, debtTokenAmt) - activate MarketV2 - - MarketV2->>DebtToken: safeTransferFrom(User, MarketV2, debtTokenAmt) - activate DebtToken - Note over User, DebtToken: User must have approved MarketV2 for debtTokenAmt - DebtToken-->>MarketV2: success - deactivate DebtToken - - MarketV2->>FT: mint(recipient, debtTokenAmt) - activate FT - FT-->>MarketV2: success - deactivate FT - - MarketV2->>XT: mint(recipient, debtTokenAmt) - activate XT - XT-->>MarketV2: success - deactivate XT - - MarketV2->>AavePool: supply(debtToken, debtTokenAmt, MarketV2, referralCode) - activate AavePool - Note over MarketV2,AavePool: via _depositWithBuffer -> _depositToPool - AavePool-->>MarketV2: success - deactivate AavePool - - MarketV2-->>User: success (Mint event emitted) - deactivate MarketV2 -``` \ No newline at end of file diff --git a/iamges/vault_burn.md b/iamges/vault_burn.md deleted file mode 100644 index 66f3fb7..0000000 --- a/iamges/vault_burn.md +++ /dev/null @@ -1,38 +0,0 @@ -```mermaid -sequenceDiagram - actor User - participant ThisContract as Router - participant FT as FT Token (ERC20) - participant XT as XT Token (ERC20) - participant Market as Market Contract - participant UnderlyingVault as Underlying Vault (IERC4626) - - User->>ThisContract: burnAndWithdraw(market, recipient, amount) - activate ThisContract - ThisContract->>Market: tokens() - activate Market - Market-->>ThisContract: returns ft, xt, underlying addresses - deactivate Market - ThisContract->>FT: transferFrom(User, ThisContract, amount) - activate FT - Note over User, FT: User must have approved ThisContract for FT - FT-->>ThisContract: success - deactivate FT - ThisContract->>XT: transferFrom(User, ThisContract, amount) - activate XT - Note over User, XT: User must have approved ThisContract for XT - XT-->>ThisContract: success - deactivate XT - ThisContract->>Market: burn(ThisContract, ThisContract, amount) - activate Market - Market-->>ThisContract: success (underlying tokens transferred to ThisContract) - deactivate Market - Note over ThisContract: ThisContract now holds 'amount' of underlying from Market - ThisContract->>UnderlyingVault: redeem(amount, recipient, ThisContract) - activate UnderlyingVault - Note over UnderlyingVault, User: Vault redeems underlying and sends to 'recipient' - UnderlyingVault-->>ThisContract: success (assets sent to recipient) - deactivate UnderlyingVault - ThisContract-->>User: success - deactivate ThisContract -``` \ No newline at end of file diff --git a/iamges/vault_mint.md b/iamges/vault_mint.md deleted file mode 100644 index ea89f86..0000000 --- a/iamges/vault_mint.md +++ /dev/null @@ -1,31 +0,0 @@ -```mermaid -sequenceDiagram - actor User - participant ThisContract as Router - participant UnderlyingToken as Underlying Token (ERC20) - participant Vault as Vault (IERC4626) - participant Market as Market Contract - - User->>ThisContract: depositAndMint(market, recipient, amount) - activate ThisContract - ThisContract->>Market: tokens() - activate Market - Market-->>ThisContract: returns underlying address - deactivate Market - Note over ThisContract: vault = IERC4626(address(underlying)) - ThisContract->>UnderlyingToken: transferFrom(User, ThisContract, amount) - activate UnderlyingToken - Note over User, UnderlyingToken: User must have approved ThisContract - UnderlyingToken-->>ThisContract: success - deactivate UnderlyingToken - ThisContract->>UnderlyingToken: approve(Market, amount) - activate UnderlyingToken - UnderlyingToken-->>ThisContract: success - deactivate UnderlyingToken - ThisContract->>Market: mint(recipient, amount) - activate Market - Market-->>ThisContract: success (or minted tokens) - deactivate Market - ThisContract-->>User: success - deactivate ThisContract -``` \ No newline at end of file From a626492763913eedc01a1d7bc2b57c730e5cf132 Mon Sep 17 00:00:00 2001 From: "Aaron C.-W. Liang" Date: Sun, 25 May 2025 02:27:08 +0800 Subject: [PATCH 027/194] contract and test for preTMX --- contracts/tokenomics/PreTMX.sol | 63 ++++ test/tokenomics/PreTMX.t.sol | 523 ++++++++++++++++++++++++++++++++ 2 files changed, 586 insertions(+) create mode 100644 contracts/tokenomics/PreTMX.sol create mode 100644 test/tokenomics/PreTMX.t.sol diff --git a/contracts/tokenomics/PreTMX.sol b/contracts/tokenomics/PreTMX.sol new file mode 100644 index 0000000..f5a247f --- /dev/null +++ b/contracts/tokenomics/PreTMX.sol @@ -0,0 +1,63 @@ +import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol"; + +contract PreTMX is ERC20, AccessControl { + bool public transferRestricted; + + mapping(address => bool) public isTransferredFromWhitelisted; + mapping(address => bool) public isTransferredToWhitelisted; + + error TransferFromNotWhitelisted(address from); + error TransferToNotWhitelisted(address to); + + constructor(address admin) ERC20("Pre TermMax Token", "pTMX") { + _grantRole(DEFAULT_ADMIN_ROLE, admin); + _mint(admin, 1e9 ether); + transferRestricted = true; + isTransferredFromWhitelisted[admin] = true; + isTransferredToWhitelisted[admin] = true; + } + + function enableTransfer() external onlyRole(DEFAULT_ADMIN_ROLE) { + transferRestricted = false; + } + + function disableTransfer() external onlyRole(DEFAULT_ADMIN_ROLE) { + transferRestricted = true; + } + + function whitelistTransferFrom(address from, bool isWhitelisted) external onlyRole(DEFAULT_ADMIN_ROLE) { + isTransferredFromWhitelisted[from] = isWhitelisted; + } + + function whitelistTransferTo(address to, bool isWhitelisted) external onlyRole(DEFAULT_ADMIN_ROLE) { + isTransferredToWhitelisted[to] = isWhitelisted; + } + + function transfer(address to, uint256 amount) public override returns (bool) { + _beforeTokenTransfer(msg.sender, to); + return super.transfer(to, amount); + } + + function transferFrom(address from, address to, uint256 amount) public override returns (bool) { + _beforeTokenTransfer(from, to); + return super.transferFrom(from, to, amount); + } + + function mint(address to, uint256 amount) external onlyRole(DEFAULT_ADMIN_ROLE) { + _mint(to, amount); + } + + function burn(uint256 amount) external { + _burn(msg.sender, amount); + } + + function _beforeTokenTransfer(address from, address to) internal view { + if (transferRestricted && !isTransferredFromWhitelisted[from]) { + revert TransferFromNotWhitelisted(from); + } + if (transferRestricted && !isTransferredToWhitelisted[to]) { + revert TransferToNotWhitelisted(to); + } + } +} diff --git a/test/tokenomics/PreTMX.t.sol b/test/tokenomics/PreTMX.t.sol new file mode 100644 index 0000000..06ca08d --- /dev/null +++ b/test/tokenomics/PreTMX.t.sol @@ -0,0 +1,523 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import {Test, console} from "forge-std/Test.sol"; +import {PreTMX} from "../../contracts/tokenomics/PreTMX.sol"; +import {IAccessControl} from "@openzeppelin/contracts/access/IAccessControl.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {IERC20Errors} from "@openzeppelin/contracts/interfaces/draft-IERC6093.sol"; + +contract PreTMXTest is Test { + PreTMX public preTMX; + address public admin; + address public user1; + address public user2; + uint256 public initialSupply = 1e9 ether; + bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; + + function setUp() public { + admin = address(1); + user1 = address(2); + user2 = address(3); + + vm.startPrank(admin); + preTMX = new PreTMX(admin); + vm.stopPrank(); + } + + function test_InitialState() public { + assertEq(preTMX.name(), "Pre TermMax Token"); + assertEq(preTMX.symbol(), "pTMX"); + assertEq(preTMX.totalSupply(), initialSupply); + assertEq(preTMX.balanceOf(admin), initialSupply); + assertTrue(preTMX.transferRestricted()); + assertTrue(preTMX.hasRole(DEFAULT_ADMIN_ROLE, admin)); + assertTrue(preTMX.isTransferredFromWhitelisted(admin)); + assertTrue(preTMX.isTransferredToWhitelisted(admin)); + } + + function test_EnableTransfer() public { + vm.prank(admin); + preTMX.enableTransfer(); + assertFalse(preTMX.transferRestricted()); + } + + function test_DisableTransfer() public { + vm.startPrank(admin); + preTMX.enableTransfer(); + assertFalse(preTMX.transferRestricted()); + + preTMX.disableTransfer(); + assertTrue(preTMX.transferRestricted()); + vm.stopPrank(); + } + + function test_EnableTransfer_NotAdmin() public { + vm.prank(user1); + vm.expectRevert( + abi.encodeWithSelector(IAccessControl.AccessControlUnauthorizedAccount.selector, user1, DEFAULT_ADMIN_ROLE) + ); + preTMX.enableTransfer(); + } + + function test_DisableTransfer_NotAdmin() public { + vm.prank(user1); + vm.expectRevert( + abi.encodeWithSelector(IAccessControl.AccessControlUnauthorizedAccount.selector, user1, DEFAULT_ADMIN_ROLE) + ); + preTMX.disableTransfer(); + } + + function test_Transfer_WhenRestricted_NotWhitelisted() public { + vm.prank(admin); + vm.expectRevert(abi.encodeWithSelector(PreTMX.TransferToNotWhitelisted.selector, user1)); + preTMX.transfer(user1, 1000); + } + + function test_Transfer_WhenRestricted_AdminWhitelisted() public { + // Admin can transfer to another admin (both whitelisted) + vm.prank(admin); + + vm.expectEmit(true, true, false, true); + emit IERC20.Transfer(admin, admin, 1000); + + bool success = preTMX.transfer(admin, 1000); + assertTrue(success); + assertEq(preTMX.balanceOf(admin), initialSupply); // Same balance since transferring to self + } + + function test_Transfer_WhenNotRestricted() public { + vm.startPrank(admin); + preTMX.enableTransfer(); + + vm.expectEmit(true, true, false, true); + emit IERC20.Transfer(admin, user1, 1000); + + bool success = preTMX.transfer(user1, 1000); + assertTrue(success); + assertEq(preTMX.balanceOf(user1), 1000); + assertEq(preTMX.balanceOf(admin), initialSupply - 1000); + vm.stopPrank(); + } + + function test_TransferFrom_WhenRestricted_NotWhitelisted() public { + vm.prank(admin); + preTMX.approve(user1, 1000); + + vm.prank(user1); + vm.expectRevert(abi.encodeWithSelector(PreTMX.TransferToNotWhitelisted.selector, user2)); + preTMX.transferFrom(admin, user2, 1000); + } + + function test_TransferFrom_WhenNotRestricted() public { + vm.startPrank(admin); + preTMX.enableTransfer(); + preTMX.approve(user1, 1000); + vm.stopPrank(); + + vm.prank(user1); + bool success = preTMX.transferFrom(admin, user2, 1000); + + assertTrue(success); + assertEq(preTMX.balanceOf(user2), 1000); + assertEq(preTMX.balanceOf(admin), initialSupply - 1000); + } + + function test_TransferFrom_WhenRestricted_AdminToAdmin() public { + vm.startPrank(admin); + preTMX.approve(admin, 1000); + + bool success = preTMX.transferFrom(admin, admin, 1000); + assertTrue(success); + assertEq(preTMX.balanceOf(admin), initialSupply); // Same balance since transferring to self + vm.stopPrank(); + } + + function test_Mint_WhenRestricted() public { + // Minting should work even when transfers are restricted + vm.prank(admin); + + vm.expectEmit(true, true, false, true); + emit IERC20.Transfer(address(0), user1, 5000); + + preTMX.mint(user1, 5000); + + assertEq(preTMX.balanceOf(user1), 5000); + assertEq(preTMX.totalSupply(), initialSupply + 5000); + } + + function test_Mint_WhenNotRestricted() public { + vm.startPrank(admin); + preTMX.enableTransfer(); + + vm.expectEmit(true, true, false, true); + emit IERC20.Transfer(address(0), user1, 5000); + + preTMX.mint(user1, 5000); + + assertEq(preTMX.balanceOf(user1), 5000); + assertEq(preTMX.totalSupply(), initialSupply + 5000); + vm.stopPrank(); + } + + function test_Mint_NotAdmin() public { + vm.prank(user1); + vm.expectRevert( + abi.encodeWithSelector(IAccessControl.AccessControlUnauthorizedAccount.selector, user1, DEFAULT_ADMIN_ROLE) + ); + preTMX.mint(user1, 5000); + } + + function test_Burn_WhenRestricted() public { + // First give some tokens to user1 via minting (bypasses restrictions) + vm.prank(admin); + preTMX.mint(user1, 5000); + + vm.prank(user1); + + vm.expectEmit(true, true, false, true); + emit IERC20.Transfer(user1, address(0), 2000); + + preTMX.burn(2000); + + assertEq(preTMX.balanceOf(user1), 3000); + assertEq(preTMX.totalSupply(), initialSupply + 5000 - 2000); + } + + function test_Burn_WhenNotRestricted() public { + // First give some tokens to user1 + vm.startPrank(admin); + preTMX.enableTransfer(); + preTMX.transfer(user1, 5000); + vm.stopPrank(); + + vm.prank(user1); + + vm.expectEmit(true, true, false, true); + emit IERC20.Transfer(user1, address(0), 2000); + + preTMX.burn(2000); + + assertEq(preTMX.balanceOf(user1), 3000); + assertEq(preTMX.totalSupply(), initialSupply - 2000); + } + + function test_Burn_InsufficientBalance() public { + vm.prank(user1); + vm.expectRevert(abi.encodeWithSelector(IERC20Errors.ERC20InsufficientBalance.selector, user1, 0, 1)); + preTMX.burn(1); + } + + function test_FuzzTransfer_WhenNotRestricted(uint256 amount) public { + // Bound the amount to a reasonable range to avoid overflow issues + amount = bound(amount, 1, initialSupply); + + vm.startPrank(admin); + preTMX.enableTransfer(); + bool success = preTMX.transfer(user1, amount); + vm.stopPrank(); + + assertTrue(success); + assertEq(preTMX.balanceOf(user1), amount); + assertEq(preTMX.balanceOf(admin), initialSupply - amount); + } + + function test_FuzzMint(address to, uint256 amount) public { + // Avoid minting to zero address and zero amount + vm.assume(to != address(0)); + amount = bound(amount, 1, type(uint256).max - initialSupply); + + vm.prank(admin); + preTMX.mint(to, amount); + + assertEq(preTMX.balanceOf(to), amount); + assertEq(preTMX.totalSupply(), initialSupply + amount); + } + + // Additional tests for whitelisting functionality + function test_WhitelistingState() public { + // Admin should be whitelisted by default + assertTrue(preTMX.isTransferredFromWhitelisted(admin)); + assertTrue(preTMX.isTransferredToWhitelisted(admin)); + + // Other users should not be whitelisted + assertFalse(preTMX.isTransferredFromWhitelisted(user1)); + assertFalse(preTMX.isTransferredToWhitelisted(user1)); + } + + function test_WhitelistTransferFrom() public { + // Initially user1 is not whitelisted + assertFalse(preTMX.isTransferredFromWhitelisted(user1)); + + // Admin whitelists user1 for sending + vm.prank(admin); + preTMX.whitelistTransferFrom(user1, true); + + assertTrue(preTMX.isTransferredFromWhitelisted(user1)); + } + + function test_WhitelistTransferFrom_Unwhitelist() public { + // First whitelist user1 + vm.startPrank(admin); + preTMX.whitelistTransferFrom(user1, true); + assertTrue(preTMX.isTransferredFromWhitelisted(user1)); + + // Then unwhitelist user1 + preTMX.whitelistTransferFrom(user1, false); + assertFalse(preTMX.isTransferredFromWhitelisted(user1)); + vm.stopPrank(); + } + + function test_WhitelistTransferFrom_NotAdmin() public { + vm.prank(user1); + vm.expectRevert( + abi.encodeWithSelector(IAccessControl.AccessControlUnauthorizedAccount.selector, user1, DEFAULT_ADMIN_ROLE) + ); + preTMX.whitelistTransferFrom(user2, true); + } + + function test_WhitelistTransferTo() public { + // Initially user1 is not whitelisted + assertFalse(preTMX.isTransferredToWhitelisted(user1)); + + // Admin whitelists user1 for receiving + vm.prank(admin); + preTMX.whitelistTransferTo(user1, true); + + assertTrue(preTMX.isTransferredToWhitelisted(user1)); + } + + function test_WhitelistTransferTo_Unwhitelist() public { + // First whitelist user1 + vm.startPrank(admin); + preTMX.whitelistTransferTo(user1, true); + assertTrue(preTMX.isTransferredToWhitelisted(user1)); + + // Then unwhitelist user1 + preTMX.whitelistTransferTo(user1, false); + assertFalse(preTMX.isTransferredToWhitelisted(user1)); + vm.stopPrank(); + } + + function test_WhitelistTransferTo_NotAdmin() public { + vm.prank(user1); + vm.expectRevert( + abi.encodeWithSelector(IAccessControl.AccessControlUnauthorizedAccount.selector, user1, DEFAULT_ADMIN_ROLE) + ); + preTMX.whitelistTransferTo(user2, true); + } + + function test_WhitelistTransferTo_EnablesTransfer() public { + // Whitelist user1 to receive tokens + vm.startPrank(admin); + preTMX.whitelistTransferTo(user1, true); + + // Now admin can transfer to user1 even when restricted + vm.expectEmit(true, true, false, true); + emit IERC20.Transfer(admin, user1, 1000); + + bool success = preTMX.transfer(user1, 1000); + assertTrue(success); + assertEq(preTMX.balanceOf(user1), 1000); + vm.stopPrank(); + } + + function test_WhitelistTransferFrom_EnablesTransfer() public { + // Give tokens to user1 via minting and whitelist user1 to send + vm.startPrank(admin); + preTMX.mint(user1, 1000); + preTMX.whitelistTransferFrom(user1, true); + preTMX.whitelistTransferTo(admin, true); // admin already whitelisted but being explicit + vm.stopPrank(); + + // Now user1 can transfer to admin + vm.prank(user1); + bool success = preTMX.transfer(admin, 500); + assertTrue(success); + assertEq(preTMX.balanceOf(user1), 500); + assertEq(preTMX.balanceOf(admin), initialSupply + 500); + } + + function test_BothWhitelisted_EnablesTransfer() public { + // Whitelist both user1 and user2 + vm.startPrank(admin); + preTMX.mint(user1, 1000); + preTMX.whitelistTransferFrom(user1, true); + preTMX.whitelistTransferTo(user2, true); + vm.stopPrank(); + + // Now user1 can transfer to user2 + vm.prank(user1); + bool success = preTMX.transfer(user2, 300); + assertTrue(success); + assertEq(preTMX.balanceOf(user1), 700); + assertEq(preTMX.balanceOf(user2), 300); + } + + function test_PartialWhitelisting_StillRestricted() public { + // Only whitelist user1 to send, but not user2 to receive + vm.startPrank(admin); + preTMX.mint(user1, 1000); + preTMX.whitelistTransferFrom(user1, true); + // user2 is not whitelisted to receive + vm.stopPrank(); + + // Transfer should still fail because user2 is not whitelisted to receive + vm.prank(user1); + vm.expectRevert(abi.encodeWithSelector(PreTMX.TransferToNotWhitelisted.selector, user2)); + preTMX.transfer(user2, 500); + } + + function test_WhitelistTransferFrom_WithTransferFrom() public { + // Test whitelisting with transferFrom function + vm.startPrank(admin); + preTMX.mint(user1, 1000); + preTMX.whitelistTransferFrom(user1, true); + preTMX.whitelistTransferTo(user2, true); + vm.stopPrank(); + + // user1 approves admin to spend tokens + vm.prank(user1); + preTMX.approve(admin, 500); + + // admin can transfer from user1 to user2 + vm.prank(admin); + bool success = preTMX.transferFrom(user1, user2, 500); + assertTrue(success); + assertEq(preTMX.balanceOf(user1), 500); + assertEq(preTMX.balanceOf(user2), 500); + } + + function test_UnwhitelistingBreaksTransfer() public { + // First set up a working scenario + vm.startPrank(admin); + preTMX.mint(user1, 1000); + preTMX.whitelistTransferFrom(user1, true); + preTMX.whitelistTransferTo(user2, true); + vm.stopPrank(); + + // Verify transfer works + vm.prank(user1); + preTMX.transfer(user2, 100); + assertEq(preTMX.balanceOf(user2), 100); + + // Now unwhitelist user1 from sending + vm.prank(admin); + preTMX.whitelistTransferFrom(user1, false); + + // Transfer should now fail + vm.prank(user1); + vm.expectRevert(abi.encodeWithSelector(PreTMX.TransferFromNotWhitelisted.selector, user1)); + preTMX.transfer(user2, 100); + } + + function test_RestrictedTransfer_FromNotWhitelisted() public { + // Give tokens to user1 via minting (bypasses restrictions) + vm.prank(admin); + preTMX.mint(user1, 1000); + + // user1 (not whitelisted) tries to transfer - should fail + vm.prank(user1); + vm.expectRevert(abi.encodeWithSelector(PreTMX.TransferFromNotWhitelisted.selector, user1)); + preTMX.transfer(admin, 500); + } + + function test_RestrictedTransfer_ToNotWhitelisted() public { + // Admin tries to transfer to non-whitelisted user1 - should fail + vm.prank(admin); + vm.expectRevert(abi.encodeWithSelector(PreTMX.TransferToNotWhitelisted.selector, user1)); + preTMX.transfer(user1, 1000); + } + + function test_RestrictedTransferFrom_FromNotWhitelisted() public { + // Give tokens to user1 and approve user2 + vm.prank(admin); + preTMX.mint(user1, 1000); + + vm.prank(user1); + preTMX.approve(user2, 500); + + // user2 tries to transfer from user1 (not whitelisted) - should fail + vm.prank(user2); + vm.expectRevert(abi.encodeWithSelector(PreTMX.TransferFromNotWhitelisted.selector, user1)); + preTMX.transferFrom(user1, admin, 500); + } + + function test_MintAndBurnBypassRestrictions() public { + // Verify that minting and burning work even when transfers are restricted + assertTrue(preTMX.transferRestricted()); + + // Mint to non-whitelisted user should work + vm.prank(admin); + preTMX.mint(user1, 1000); + assertEq(preTMX.balanceOf(user1), 1000); + + // Burn from non-whitelisted user should work + vm.prank(user1); + preTMX.burn(500); + assertEq(preTMX.balanceOf(user1), 500); + } + + function test_FuzzWhitelisting(address user, bool fromWhitelisted, bool toWhitelisted) public { + vm.assume(user != address(0) && user != admin); + + vm.startPrank(admin); + preTMX.whitelistTransferFrom(user, fromWhitelisted); + preTMX.whitelistTransferTo(user, toWhitelisted); + vm.stopPrank(); + + assertEq(preTMX.isTransferredFromWhitelisted(user), fromWhitelisted); + assertEq(preTMX.isTransferredToWhitelisted(user), toWhitelisted); + } + + function test_WhitelistSelf() public { + // Test admin whitelisting themselves (should work but redundant since already whitelisted) + vm.startPrank(admin); + preTMX.whitelistTransferFrom(admin, false); + preTMX.whitelistTransferTo(admin, false); + + assertFalse(preTMX.isTransferredFromWhitelisted(admin)); + assertFalse(preTMX.isTransferredToWhitelisted(admin)); + + // Re-whitelist admin + preTMX.whitelistTransferFrom(admin, true); + preTMX.whitelistTransferTo(admin, true); + + assertTrue(preTMX.isTransferredFromWhitelisted(admin)); + assertTrue(preTMX.isTransferredToWhitelisted(admin)); + vm.stopPrank(); + } + + function test_RestrictedTransferFrom_ToNotWhitelisted() public { + // Test transferFrom with non-whitelisted recipient + vm.startPrank(admin); + preTMX.mint(user1, 1000); + preTMX.whitelistTransferFrom(user1, true); // whitelist sender but not recipient + vm.stopPrank(); + + vm.prank(user1); + preTMX.approve(admin, 500); + + vm.prank(admin); + vm.expectRevert(abi.encodeWithSelector(PreTMX.TransferToNotWhitelisted.selector, user2)); + preTMX.transferFrom(user1, user2, 500); + } + + function test_BothErrorTypes() public { + // Test that we get from error when sender not whitelisted + vm.prank(admin); + preTMX.mint(user1, 1000); + + vm.prank(user1); + vm.expectRevert(abi.encodeWithSelector(PreTMX.TransferFromNotWhitelisted.selector, user1)); + preTMX.transfer(user2, 500); + + // Test that we get to error when recipient not whitelisted (sender is whitelisted) + vm.prank(admin); + preTMX.whitelistTransferFrom(user1, true); + + vm.prank(user1); + vm.expectRevert(abi.encodeWithSelector(PreTMX.TransferToNotWhitelisted.selector, user2)); + preTMX.transfer(user2, 500); + } +} From f10535d89c00e62c86281db76fd0801ce2c8c853 Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 26 May 2025 09:53:36 +0800 Subject: [PATCH 028/194] doc --- iamges/termmax_token_docs.md | 124 +++++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 iamges/termmax_token_docs.md diff --git a/iamges/termmax_token_docs.md b/iamges/termmax_token_docs.md new file mode 100644 index 0000000..31d8dc6 --- /dev/null +++ b/iamges/termmax_token_docs.md @@ -0,0 +1,124 @@ +``` +┌─────────────────────────────────────────────────────────────────────────────────────┐ +│ │ +│ TermMaxToken Contract │ +│ │ +├─────────────────────────────────────────────────────────────────────────────────────┤ +│ │ +│ Roles: │ +│ ┌────────────────────────┐ ┌────────────┐ ┌──────────────┐ │ +│ │ Owner/Proxy Admin │ │ Users │ │ Aave Protocol│ │ +│ └───────────┬────────────┘ └──────┬─────┘ └───────┬──────┘ │ +│ │ │ │ │ +│ │ │ │ │ +└─────────────┼────────────────────────┼──────────────────┼───────────────────────────┘ + │ │ │ + │ │ │ +┌─────────────┼────────────────────────┼──────────────────┼───────────────────────────┐ +│ │ │ │ │ +│ ┌───────────▼────────────────────────▼──────────────────▼─────────────────────┐ │ +│ │ Functions │ │ +│ └───────────────────────────────────────────────────────────────────────────────┘ │ +│ │ +│ ┌──────────────────────────────┐ ┌─────────────────────────────┐ │ +│ │ Initialization │ │ User Operations │ │ +│ ├──────────────────────────────┤ ├─────────────────────────────┤ │ +│ │ constructor │ │ mint │ │ +│ │ initialize │ │ burn │ │ +│ └──────────────────────────────┘ │ burnToAToken │ │ +│ │ totalIncomeAssets │ │ +│ ┌──────────────────────────────┐ └─────────────────────────────┘ │ +│ │ Owner Functions │ │ +│ │ (including Proxy Admin) │ ┌─────────────────────────────┐ │ +│ ├──────────────────────────────┤ │ Overridden Functions │ │ +│ │ withdrawIncomeAssets │ ├─────────────────────────────┤ │ +│ │ updateBufferConfigAndAdd │ │ decimals │ │ +│ │ Reserves │ │ _bufferConfig │ │ +│ │ _authorizeUpgrade │ │ _depositToPool │ │ +│ └──────────────────────────────┘ │ _withdrawFromPool │ │ +│ └─────────────────────────────┘ │ +│ ┌──────────────────────────────┐ │ +│ │ Internal Functions │ │ +│ ├──────────────────────────────┤ │ +│ │ _updateBufferConfig │ │ +│ └──────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────────────────┘ + +┌─────────────────────────────────────────────────────────────────────────────────────┐ +│ Function Flow Diagram │ +└─────────────────────────────────────────────────────────────────────────────────────┘ + + User TermMaxToken Aave + │ │ │ + │ ─────────► mint() ───────────► │ │ + │ │ ─────► _depositWithBuffer() ────► │ + │ │ │ + │ ─────────► burn() ───────────► │ │ + │ │ ─────► _withdrawWithBuffer() ───► │ + │ │ │ + │ ─────────► burnToAToken() ───► │ │ + │ │ │ + │ ─────────► totalIncomeAssets()►│ │ + │ │ │ + + Owner TermMaxToken Aave + (Proxy Admin) │ │ + │ │ │ + │ ─► withdrawIncomeAssets() ───► │ │ + │ │ ─────► _withdrawWithBuffer() ───► │ + │ │ │ + │ ─► updateBufferConfigAndAdd ─► │ │ + │ Reserves() │ │ + │ │ │ + │ ─► upgrade (via _authorize ──► │ │ + │ Upgrade) │ │ + │ │ │ +``` + +## Role Descriptions + +### Owner/Proxy Admin +- Has privileged access to admin functions +- Can withdraw income generated from yield farming +- Can update buffer configuration settings +- Controls contract upgrades via the UUPS upgrade pattern +- Is the only role that can authorize implementation upgrades + +### Users +- Can mint new TermMaxTokens by providing underlying assets +- Can burn their tokens to receive underlying assets or aTokens +- Can check total income assets generated + +### Aave Protocol +- External protocol used for yield generation +- Receives/provides assets during deposit/withdraw operations +- Issues aTokens that accrue yield + +## Function Categories + +### Initialization Functions +- **constructor**: Sets up immutable variables like Aave pool address and referral code +- **initialize**: Sets up token name, symbol, decimals, and initial buffer configuration + +### User Operations +- **mint**: Creates new TermMaxTokens and deposits underlying assets with buffering +- **burn**: Burns tokens and withdraws underlying assets to the specified address +- **burnToAToken**: Burns tokens and transfers aTokens directly to the user +- **totalIncomeAssets**: Calculates total yield generated by the protocol + +### Admin Functions +- **withdrawIncomeAssets**: Allows owner to withdraw generated yield +- **updateBufferConfigAndAddReserves**: Updates buffer settings and adds additional reserves +- **_authorizeUpgrade**: Authorizes contract implementation upgrades (only owner) + +### Internal Buffer Management +- **_updateBufferConfig**: Updates buffer configuration parameters +- **_bufferConfig**: Returns current buffer configuration +- **_depositToPool**: Handles depositing assets to Aave +- **_withdrawFromPool**: Handles withdrawing assets from Aave + +### Other Overridden Functions +- **decimals**: Returns token decimals matching the underlying asset + +The TermMaxToken contract is designed as an upgradeable ERC20 token that wraps an underlying asset, automatically deposits it in Aave for yield generation, and manages liquidity buffers to optimize gas costs and availability. \ No newline at end of file From 10cf68d1ef95e85d3252a9e36c06249cdf6a36c3 Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 26 May 2025 10:11:44 +0800 Subject: [PATCH 029/194] refer docs --- contracts/oracle/OracleAggregator.sol | 8 ++++++++ contracts/vault/TermMaxVault.sol | 7 +++++++ 2 files changed, 15 insertions(+) diff --git a/contracts/oracle/OracleAggregator.sol b/contracts/oracle/OracleAggregator.sol index 3fd89e2..02c2f88 100644 --- a/contracts/oracle/OracleAggregator.sol +++ b/contracts/oracle/OracleAggregator.sol @@ -1,6 +1,14 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.27; +/** + * @title OracleAggregator + * @notice This contract references design concepts from AAVE's oracle system + * @dev Implements price feed aggregation with primary and backup oracles, + * staleness checks via heartbeats, and governance-controlled updates with timelocks + * similar to AAVE's oracle architecture + */ + import {Ownable2Step, Ownable} from "@openzeppelin/contracts/access/Ownable2Step.sol"; import {AggregatorV3Interface, IOracle} from "./IOracle.sol"; diff --git a/contracts/vault/TermMaxVault.sol b/contracts/vault/TermMaxVault.sol index f5f8d40..a92973b 100644 --- a/contracts/vault/TermMaxVault.sol +++ b/contracts/vault/TermMaxVault.sol @@ -1,6 +1,13 @@ // SPDX-License-Identifier: GPL-2.0-or-later pragma solidity ^0.8.27; +/** + * @title TermMaxVault + * @notice This contract is inspired by MetaMorphoV1_1 (https://github.com/morpho-org/metamorpho-v1.1/blob/main/src/MetaMorphoV1_1.sol) + * @dev The role management structure is based on Morpho's role system (https://docs.morpho.org/curation/concepts/roles/) + * with similar separation of curator, guardian, and allocator roles for enhanced governance and risk management. + */ + import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; From 1942668405631a121d830b2fb51272f7d3f51238 Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 26 May 2025 14:38:02 +0800 Subject: [PATCH 030/194] add timelock --- contracts/errors/TermMaxTokenErrors.sol | 12 +++++ contracts/events/TermMaxTokenEvents.sol | 9 ++++ contracts/tokens/TermMaxToken.sol | 69 ++++++++++++++++++++++--- 3 files changed, 83 insertions(+), 7 deletions(-) diff --git a/contracts/errors/TermMaxTokenErrors.sol b/contracts/errors/TermMaxTokenErrors.sol index 4a96572..c197dc1 100644 --- a/contracts/errors/TermMaxTokenErrors.sol +++ b/contracts/errors/TermMaxTokenErrors.sol @@ -5,4 +5,16 @@ interface TermMaxTokenErrors { error InvalidToken(); error InsufficientIncomeAmount(uint256 availableAmount, uint256 requestedAmount); error AaveWithdrawFailed(uint256 aTokenAmount, uint256 recieivedAmount); + + /// @notice Error thrown when trying to accept a change that has no pending value + error NoPendingValue(); + + /// @notice Error thrown when trying to accept a change before the timelock period has elapsed + error TimelockNotElapsed(); + + /// @notice Error thrown when attempting to submit a change that's already pending + error AlreadyPending(); + + /// @notice Error thrown when the implementation address is invalid + error InvalidImplementation(); } diff --git a/contracts/events/TermMaxTokenEvents.sol b/contracts/events/TermMaxTokenEvents.sol index a163f31..793bb39 100644 --- a/contracts/events/TermMaxTokenEvents.sol +++ b/contracts/events/TermMaxTokenEvents.sol @@ -7,4 +7,13 @@ interface TermMaxTokenEvents { event Burn(address indexed to, uint256 amount); event WithdrawIncome(address indexed to, uint256 amount); event UpdateBufferConfig(uint256 minimumBuffer, uint256 maximumBuffer, uint256 buffer); + + /// @notice Event emitted when a new implementation upgrade is submitted with timelock + event SubmitUpgrade(address indexed newImplementation, uint64 validAt); + + /// @notice Event emitted when a pending upgrade is accepted + event AcceptUpgrade(address indexed caller, address indexed newImplementation); + + /// @notice Event emitted when a pending upgrade is revoked + event RevokeUpgrade(address indexed caller); } diff --git a/contracts/tokens/TermMaxToken.sol b/contracts/tokens/TermMaxToken.sol index 1806aac..0288269 100644 --- a/contracts/tokens/TermMaxToken.sol +++ b/contracts/tokens/TermMaxToken.sol @@ -14,6 +14,7 @@ import {TransferUtils} from "contracts/lib/TransferUtils.sol"; import {StakingBuffer} from "contracts/tokens/StakingBuffer.sol"; import {TermMaxTokenEvents} from "contracts/events/TermMaxTokenEvents.sol"; import {TermMaxTokenErrors} from "contracts/errors/TermMaxTokenErrors.sol"; +import {PendingLib, PendingAddress} from "contracts/lib/PendingLib.sol"; contract TermMaxToken is StakingBuffer, @@ -25,6 +26,7 @@ contract TermMaxToken is TermMaxTokenErrors { using TransferUtils for IERC20; + using PendingLib for PendingAddress; IAaveV3Minimal public immutable aavePool; uint16 public immutable referralCode; @@ -36,23 +38,30 @@ contract TermMaxToken is uint8 _decimals; uint256 internal withdawedIncomeAssets; + /// @notice The timelock period for upgrade operations (in seconds) + uint256 public constant UPGRADE_TIMELOCK = 2 days; + + /// @notice Pending upgrade implementation address with timelock + PendingAddress internal _pendingImplementation; + constructor(address aavePool_, uint16 referralCode_) { aavePool = IAaveV3Minimal(aavePool_); referralCode = referralCode_; _disableInitializers(); } - function initialize(address admin, address underlying, BufferConfig memory bufferConfig_) public initializer { - string memory name = string(abi.encodePacked("TermMax ", IERC20Metadata(underlying).name())); - string memory symbol = string(abi.encodePacked("tmx", IERC20Metadata(underlying).symbol())); - _decimals = IERC20Metadata(underlying).decimals(); + function initialize(address admin, address underlying_, BufferConfig memory bufferConfig_) public initializer { + underlying = IERC20(underlying_); + string memory name = string(abi.encodePacked("TermMax ", IERC20Metadata(underlying_).name())); + string memory symbol = string(abi.encodePacked("tmx", IERC20Metadata(underlying_).symbol())); + _decimals = IERC20Metadata(underlying_).decimals(); __ERC20_init(name, symbol); __Ownable_init(admin); __ReentrancyGuard_init(); _updateBufferConfig(bufferConfig_); - aToken = IERC20(aavePool.getReserveData(underlying).aTokenAddress); + aToken = IERC20(aavePool.getReserveData(underlying_).aTokenAddress); - emit TermMaxTokenInitialized(admin, underlying); + emit TermMaxTokenInitialized(admin, underlying_); } function mint(address to, uint256 amount) external nonReentrant { @@ -126,5 +135,51 @@ contract TermMaxToken is require(receivedAmount == amount, AaveWithdrawFailed(amount, receivedAmount)); } - function _authorizeUpgrade(address newImplementation) internal virtual override onlyOwner {} + /// @notice Submit a new implementation for upgrade with timelock + /// @param newImplementation The address of the new implementation contract + function submitUpgrade(address newImplementation) external onlyOwner { + if (newImplementation == address(0)) revert InvalidImplementation(); + if (_pendingImplementation.validAt != 0) revert AlreadyPending(); + + _pendingImplementation.update(newImplementation, UPGRADE_TIMELOCK); + + emit SubmitUpgrade(newImplementation, _pendingImplementation.validAt); + } + + /// @notice Accept the pending implementation upgrade after timelock period + function acceptUpgrade() external onlyOwner { + if (_pendingImplementation.validAt == 0) revert NoPendingValue(); + if (block.timestamp < _pendingImplementation.validAt) revert TimelockNotElapsed(); + + address newImplementation = _pendingImplementation.value; + delete _pendingImplementation; + + emit AcceptUpgrade(msg.sender, newImplementation); + + // Perform the upgrade + upgradeToAndCall(newImplementation, ""); + } + + /// @notice Revoke the pending implementation upgrade + function revokeUpgrade() external onlyOwner { + if (_pendingImplementation.validAt == 0) revert NoPendingValue(); + + delete _pendingImplementation; + + emit RevokeUpgrade(msg.sender); + } + + /// @notice Get the pending implementation upgrade details + /// @return implementation The pending implementation address + /// @return validAt The timestamp when the upgrade becomes valid + function pendingImplementation() external view returns (address implementation, uint64 validAt) { + return (_pendingImplementation.value, _pendingImplementation.validAt); + } + + /// @notice Override _authorizeUpgrade to prevent direct upgrades without timelock + /// @dev This function should never allow upgrades as they must go through the timelock process + function _authorizeUpgrade(address) internal virtual override onlyOwner { + // Always revert since upgrades must go through the timelock mechanism + revert("Use submitUpgrade and acceptUpgrade instead"); + } } From 0a998468bb61b64eec706307fc0ee7a1e1a62f26 Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 26 May 2025 15:04:30 +0800 Subject: [PATCH 031/194] mock aave --- contracts/test/MockAave.sol | 58 +++++++++++++++++++++++++++++++ contracts/tokens/TermMaxToken.sol | 27 +++++--------- 2 files changed, 66 insertions(+), 19 deletions(-) create mode 100644 contracts/test/MockAave.sol diff --git a/contracts/test/MockAave.sol b/contracts/test/MockAave.sol new file mode 100644 index 0000000..f9fabc6 --- /dev/null +++ b/contracts/test/MockAave.sol @@ -0,0 +1,58 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import {IAaveV3Minimal} from "contracts/extensions/aave/IAaveV3Minimal.sol"; +import {IMintableERC20, IERC20} from "contracts/tokens/IMintableERC20.sol"; + +contract MockAave is ERC20, IAaveV3Minimal { + IERC20 public immutable underlying; + + constructor(address underlying_) ERC20("MockAave", "mAAVE") { + underlying = IERC20(underlying_); + } + + function getReserveData(address) external view override returns (ReserveData memory) { + return ReserveData({ + configuration: ReserveConfigurationMap({data: 0}), + liquidityIndex: 1e27, + currentLiquidityRate: 0, + variableBorrowIndex: 1e27, + currentVariableBorrowRate: 0, + currentStableBorrowRate: 0, + lastUpdateTimestamp: uint40(block.timestamp), + id: 0, + aTokenAddress: address(this), + stableDebtTokenAddress: address(0), + variableDebtTokenAddress: address(0), + interestRateStrategyAddress: address(0), + accruedToTreasury: 0, + unbacked: 0, + isolationModeTotalDebt: 0 + }); + } + + function supply(address asset, uint256 amount, address onBehalfOf, uint16 /* referralCode */ ) external override { + // Transfer tokens from sender to this contract + IERC20(asset).transferFrom(msg.sender, address(this), amount); + // Mint aTokens to the onBehalfOf address + _mint(onBehalfOf, amount); + } + + function withdraw(address asset, uint256 amount, address to) external override returns (uint256) { + // Burn aTokens from sender + _burn(msg.sender, amount); + uint256 balance = IERC20(asset).balanceOf(address(this)); + if (balance < amount) { + IMintableERC20(asset).mint(address(this), amount - balance); + } + // Transfer underlying tokens to the recipient + IERC20(asset).transfer(to, amount); + return amount; + } + + function simulateInterestAccrual(address to, uint256 amount) external { + // Simulate interest accrual by minting aTokens + _mint(to, amount); + } +} diff --git a/contracts/tokens/TermMaxToken.sol b/contracts/tokens/TermMaxToken.sol index 0288269..e9f5069 100644 --- a/contracts/tokens/TermMaxToken.sol +++ b/contracts/tokens/TermMaxToken.sol @@ -39,7 +39,7 @@ contract TermMaxToken is uint256 internal withdawedIncomeAssets; /// @notice The timelock period for upgrade operations (in seconds) - uint256 public constant UPGRADE_TIMELOCK = 2 days; + uint256 public constant UPGRADE_TIMELOCK = 1 days; /// @notice Pending upgrade implementation address with timelock PendingAddress internal _pendingImplementation; @@ -137,7 +137,7 @@ contract TermMaxToken is /// @notice Submit a new implementation for upgrade with timelock /// @param newImplementation The address of the new implementation contract - function submitUpgrade(address newImplementation) external onlyOwner { + function submitPendingUpgrade(address newImplementation) external onlyOwner { if (newImplementation == address(0)) revert InvalidImplementation(); if (_pendingImplementation.validAt != 0) revert AlreadyPending(); @@ -146,20 +146,6 @@ contract TermMaxToken is emit SubmitUpgrade(newImplementation, _pendingImplementation.validAt); } - /// @notice Accept the pending implementation upgrade after timelock period - function acceptUpgrade() external onlyOwner { - if (_pendingImplementation.validAt == 0) revert NoPendingValue(); - if (block.timestamp < _pendingImplementation.validAt) revert TimelockNotElapsed(); - - address newImplementation = _pendingImplementation.value; - delete _pendingImplementation; - - emit AcceptUpgrade(msg.sender, newImplementation); - - // Perform the upgrade - upgradeToAndCall(newImplementation, ""); - } - /// @notice Revoke the pending implementation upgrade function revokeUpgrade() external onlyOwner { if (_pendingImplementation.validAt == 0) revert NoPendingValue(); @@ -178,8 +164,11 @@ contract TermMaxToken is /// @notice Override _authorizeUpgrade to prevent direct upgrades without timelock /// @dev This function should never allow upgrades as they must go through the timelock process - function _authorizeUpgrade(address) internal virtual override onlyOwner { - // Always revert since upgrades must go through the timelock mechanism - revert("Use submitUpgrade and acceptUpgrade instead"); + function _authorizeUpgrade(address newImplementation) internal virtual override onlyOwner { + if (_pendingImplementation.validAt == 0) revert NoPendingValue(); + if (newImplementation != _pendingImplementation.value) revert InvalidImplementation(); + if (block.timestamp < _pendingImplementation.validAt) revert TimelockNotElapsed(); + delete _pendingImplementation; + emit AcceptUpgrade(msg.sender, newImplementation); } } From f2daf8c7bb68599f0040b30f2d3c21461aed3f1d Mon Sep 17 00:00:00 2001 From: "Aaron C.-W. Liang" Date: Mon, 26 May 2025 15:10:43 +0800 Subject: [PATCH 032/194] 1. AccessContorl -> Ownable2Step 2. Internal function with event --- contracts/tokenomics/PreTMX.sol | 53 ++++-- test/tokenomics/PreTMX.t.sol | 294 +++++++++++++++++++++++++++++--- 2 files changed, 312 insertions(+), 35 deletions(-) diff --git a/contracts/tokenomics/PreTMX.sol b/contracts/tokenomics/PreTMX.sol index f5a247f..4ef590f 100644 --- a/contracts/tokenomics/PreTMX.sol +++ b/contracts/tokenomics/PreTMX.sol @@ -1,7 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; -import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol"; +import {Ownable2Step, Ownable} from "@openzeppelin/contracts/access/Ownable2Step.sol"; -contract PreTMX is ERC20, AccessControl { +contract PreTMX is ERC20, Ownable2Step { bool public transferRestricted; mapping(address => bool) public isTransferredFromWhitelisted; @@ -10,28 +13,31 @@ contract PreTMX is ERC20, AccessControl { error TransferFromNotWhitelisted(address from); error TransferToNotWhitelisted(address to); - constructor(address admin) ERC20("Pre TermMax Token", "pTMX") { - _grantRole(DEFAULT_ADMIN_ROLE, admin); + event TransferRestricted(bool restricted); + event TransferFromWhitelisted(address from, bool isWhitelisted); + event TransferToWhitelisted(address to, bool isWhitelisted); + + constructor(address admin) ERC20("Pre TermMax Token", "pTMX") Ownable(admin) { _mint(admin, 1e9 ether); - transferRestricted = true; - isTransferredFromWhitelisted[admin] = true; - isTransferredToWhitelisted[admin] = true; + _setTransferRestricted(true); + _setTransferFromWhitelisted(admin, true); + _setTransferToWhitelisted(admin, true); } - function enableTransfer() external onlyRole(DEFAULT_ADMIN_ROLE) { - transferRestricted = false; + function enableTransfer() external onlyOwner { + _setTransferRestricted(false); } - function disableTransfer() external onlyRole(DEFAULT_ADMIN_ROLE) { - transferRestricted = true; + function disableTransfer() external onlyOwner { + _setTransferRestricted(true); } - function whitelistTransferFrom(address from, bool isWhitelisted) external onlyRole(DEFAULT_ADMIN_ROLE) { - isTransferredFromWhitelisted[from] = isWhitelisted; + function whitelistTransferFrom(address from, bool isWhitelisted) external onlyOwner { + _setTransferFromWhitelisted(from, isWhitelisted); } - function whitelistTransferTo(address to, bool isWhitelisted) external onlyRole(DEFAULT_ADMIN_ROLE) { - isTransferredToWhitelisted[to] = isWhitelisted; + function whitelistTransferTo(address to, bool isWhitelisted) external onlyOwner { + _setTransferToWhitelisted(to, isWhitelisted); } function transfer(address to, uint256 amount) public override returns (bool) { @@ -44,7 +50,7 @@ contract PreTMX is ERC20, AccessControl { return super.transferFrom(from, to, amount); } - function mint(address to, uint256 amount) external onlyRole(DEFAULT_ADMIN_ROLE) { + function mint(address to, uint256 amount) external onlyOwner { _mint(to, amount); } @@ -60,4 +66,19 @@ contract PreTMX is ERC20, AccessControl { revert TransferToNotWhitelisted(to); } } + + function _setTransferRestricted(bool restricted) internal { + transferRestricted = restricted; + emit TransferRestricted(restricted); + } + + function _setTransferFromWhitelisted(address from, bool isWhitelisted) internal { + isTransferredFromWhitelisted[from] = isWhitelisted; + emit TransferFromWhitelisted(from, isWhitelisted); + } + + function _setTransferToWhitelisted(address to, bool isWhitelisted) internal { + isTransferredToWhitelisted[to] = isWhitelisted; + emit TransferToWhitelisted(to, isWhitelisted); + } } diff --git a/test/tokenomics/PreTMX.t.sol b/test/tokenomics/PreTMX.t.sol index 06ca08d..7ec2620 100644 --- a/test/tokenomics/PreTMX.t.sol +++ b/test/tokenomics/PreTMX.t.sol @@ -3,7 +3,8 @@ pragma solidity ^0.8.20; import {Test, console} from "forge-std/Test.sol"; import {PreTMX} from "../../contracts/tokenomics/PreTMX.sol"; -import {IAccessControl} from "@openzeppelin/contracts/access/IAccessControl.sol"; +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; +import {Ownable2Step} from "@openzeppelin/contracts/access/Ownable2Step.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {IERC20Errors} from "@openzeppelin/contracts/interfaces/draft-IERC6093.sol"; @@ -13,7 +14,6 @@ contract PreTMXTest is Test { address public user1; address public user2; uint256 public initialSupply = 1e9 ether; - bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; function setUp() public { admin = address(1); @@ -31,13 +31,17 @@ contract PreTMXTest is Test { assertEq(preTMX.totalSupply(), initialSupply); assertEq(preTMX.balanceOf(admin), initialSupply); assertTrue(preTMX.transferRestricted()); - assertTrue(preTMX.hasRole(DEFAULT_ADMIN_ROLE, admin)); + assertEq(preTMX.owner(), admin); assertTrue(preTMX.isTransferredFromWhitelisted(admin)); assertTrue(preTMX.isTransferredToWhitelisted(admin)); } function test_EnableTransfer() public { vm.prank(admin); + + vm.expectEmit(true, true, true, true); + emit PreTMX.TransferRestricted(false); + preTMX.enableTransfer(); assertFalse(preTMX.transferRestricted()); } @@ -47,6 +51,9 @@ contract PreTMXTest is Test { preTMX.enableTransfer(); assertFalse(preTMX.transferRestricted()); + vm.expectEmit(true, true, true, true); + emit PreTMX.TransferRestricted(true); + preTMX.disableTransfer(); assertTrue(preTMX.transferRestricted()); vm.stopPrank(); @@ -54,17 +61,13 @@ contract PreTMXTest is Test { function test_EnableTransfer_NotAdmin() public { vm.prank(user1); - vm.expectRevert( - abi.encodeWithSelector(IAccessControl.AccessControlUnauthorizedAccount.selector, user1, DEFAULT_ADMIN_ROLE) - ); + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, user1)); preTMX.enableTransfer(); } function test_DisableTransfer_NotAdmin() public { vm.prank(user1); - vm.expectRevert( - abi.encodeWithSelector(IAccessControl.AccessControlUnauthorizedAccount.selector, user1, DEFAULT_ADMIN_ROLE) - ); + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, user1)); preTMX.disableTransfer(); } @@ -162,9 +165,7 @@ contract PreTMXTest is Test { function test_Mint_NotAdmin() public { vm.prank(user1); - vm.expectRevert( - abi.encodeWithSelector(IAccessControl.AccessControlUnauthorizedAccount.selector, user1, DEFAULT_ADMIN_ROLE) - ); + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, user1)); preTMX.mint(user1, 5000); } @@ -224,7 +225,7 @@ contract PreTMXTest is Test { function test_FuzzMint(address to, uint256 amount) public { // Avoid minting to zero address and zero amount - vm.assume(to != address(0)); + vm.assume(to != address(0) && to != admin); amount = bound(amount, 1, type(uint256).max - initialSupply); vm.prank(admin); @@ -251,6 +252,10 @@ contract PreTMXTest is Test { // Admin whitelists user1 for sending vm.prank(admin); + + vm.expectEmit(true, true, true, true); + emit PreTMX.TransferFromWhitelisted(user1, true); + preTMX.whitelistTransferFrom(user1, true); assertTrue(preTMX.isTransferredFromWhitelisted(user1)); @@ -263,6 +268,9 @@ contract PreTMXTest is Test { assertTrue(preTMX.isTransferredFromWhitelisted(user1)); // Then unwhitelist user1 + vm.expectEmit(true, true, true, true); + emit PreTMX.TransferFromWhitelisted(user1, false); + preTMX.whitelistTransferFrom(user1, false); assertFalse(preTMX.isTransferredFromWhitelisted(user1)); vm.stopPrank(); @@ -270,9 +278,7 @@ contract PreTMXTest is Test { function test_WhitelistTransferFrom_NotAdmin() public { vm.prank(user1); - vm.expectRevert( - abi.encodeWithSelector(IAccessControl.AccessControlUnauthorizedAccount.selector, user1, DEFAULT_ADMIN_ROLE) - ); + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, user1)); preTMX.whitelistTransferFrom(user2, true); } @@ -282,6 +288,10 @@ contract PreTMXTest is Test { // Admin whitelists user1 for receiving vm.prank(admin); + + vm.expectEmit(true, true, true, true); + emit PreTMX.TransferToWhitelisted(user1, true); + preTMX.whitelistTransferTo(user1, true); assertTrue(preTMX.isTransferredToWhitelisted(user1)); @@ -294,6 +304,9 @@ contract PreTMXTest is Test { assertTrue(preTMX.isTransferredToWhitelisted(user1)); // Then unwhitelist user1 + vm.expectEmit(true, true, true, true); + emit PreTMX.TransferToWhitelisted(user1, false); + preTMX.whitelistTransferTo(user1, false); assertFalse(preTMX.isTransferredToWhitelisted(user1)); vm.stopPrank(); @@ -301,15 +314,17 @@ contract PreTMXTest is Test { function test_WhitelistTransferTo_NotAdmin() public { vm.prank(user1); - vm.expectRevert( - abi.encodeWithSelector(IAccessControl.AccessControlUnauthorizedAccount.selector, user1, DEFAULT_ADMIN_ROLE) - ); + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, user1)); preTMX.whitelistTransferTo(user2, true); } function test_WhitelistTransferTo_EnablesTransfer() public { // Whitelist user1 to receive tokens vm.startPrank(admin); + + vm.expectEmit(true, true, true, true); + emit PreTMX.TransferToWhitelisted(user1, true); + preTMX.whitelistTransferTo(user1, true); // Now admin can transfer to user1 even when restricted @@ -326,6 +341,10 @@ contract PreTMXTest is Test { // Give tokens to user1 via minting and whitelist user1 to send vm.startPrank(admin); preTMX.mint(user1, 1000); + + vm.expectEmit(true, true, true, true); + emit PreTMX.TransferFromWhitelisted(user1, true); + preTMX.whitelistTransferFrom(user1, true); preTMX.whitelistTransferTo(admin, true); // admin already whitelisted but being explicit vm.stopPrank(); @@ -342,7 +361,15 @@ contract PreTMXTest is Test { // Whitelist both user1 and user2 vm.startPrank(admin); preTMX.mint(user1, 1000); + + vm.expectEmit(true, true, true, true); + emit PreTMX.TransferFromWhitelisted(user1, true); + preTMX.whitelistTransferFrom(user1, true); + + vm.expectEmit(true, true, true, true); + emit PreTMX.TransferToWhitelisted(user2, true); + preTMX.whitelistTransferTo(user2, true); vm.stopPrank(); @@ -358,6 +385,10 @@ contract PreTMXTest is Test { // Only whitelist user1 to send, but not user2 to receive vm.startPrank(admin); preTMX.mint(user1, 1000); + + vm.expectEmit(true, true, true, true); + emit PreTMX.TransferFromWhitelisted(user1, true); + preTMX.whitelistTransferFrom(user1, true); // user2 is not whitelisted to receive vm.stopPrank(); @@ -372,7 +403,15 @@ contract PreTMXTest is Test { // Test whitelisting with transferFrom function vm.startPrank(admin); preTMX.mint(user1, 1000); + + vm.expectEmit(true, true, true, true); + emit PreTMX.TransferFromWhitelisted(user1, true); + preTMX.whitelistTransferFrom(user1, true); + + vm.expectEmit(true, true, true, true); + emit PreTMX.TransferToWhitelisted(user2, true); + preTMX.whitelistTransferTo(user2, true); vm.stopPrank(); @@ -403,6 +442,10 @@ contract PreTMXTest is Test { // Now unwhitelist user1 from sending vm.prank(admin); + + vm.expectEmit(true, true, true, true); + emit PreTMX.TransferFromWhitelisted(user1, false); + preTMX.whitelistTransferFrom(user1, false); // Transfer should now fail @@ -473,14 +516,29 @@ contract PreTMXTest is Test { function test_WhitelistSelf() public { // Test admin whitelisting themselves (should work but redundant since already whitelisted) vm.startPrank(admin); + + vm.expectEmit(true, true, true, true); + emit PreTMX.TransferFromWhitelisted(admin, false); + preTMX.whitelistTransferFrom(admin, false); + + vm.expectEmit(true, true, true, true); + emit PreTMX.TransferToWhitelisted(admin, false); + preTMX.whitelistTransferTo(admin, false); assertFalse(preTMX.isTransferredFromWhitelisted(admin)); assertFalse(preTMX.isTransferredToWhitelisted(admin)); // Re-whitelist admin + vm.expectEmit(true, true, true, true); + emit PreTMX.TransferFromWhitelisted(admin, true); + preTMX.whitelistTransferFrom(admin, true); + + vm.expectEmit(true, true, true, true); + emit PreTMX.TransferToWhitelisted(admin, true); + preTMX.whitelistTransferTo(admin, true); assertTrue(preTMX.isTransferredFromWhitelisted(admin)); @@ -520,4 +578,202 @@ contract PreTMXTest is Test { vm.expectRevert(abi.encodeWithSelector(PreTMX.TransferToNotWhitelisted.selector, user2)); preTMX.transfer(user2, 500); } + + // ============ Ownership Transfer Tests ============ + + function test_InitialOwnership() public { + assertEq(preTMX.owner(), admin); + assertEq(preTMX.pendingOwner(), address(0)); + } + + function test_TransferOwnership() public { + vm.prank(admin); + + vm.expectEmit(true, true, true, true); + emit Ownable2Step.OwnershipTransferStarted(admin, user1); + + preTMX.transferOwnership(user1); + + // Ownership should not change until accepted + assertEq(preTMX.owner(), admin); + assertEq(preTMX.pendingOwner(), user1); + } + + function test_TransferOwnership_NotOwner() public { + vm.prank(user1); + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, user1)); + preTMX.transferOwnership(user2); + } + + function test_AcceptOwnership() public { + // Start ownership transfer + vm.prank(admin); + preTMX.transferOwnership(user1); + + // Accept ownership + vm.prank(user1); + + vm.expectEmit(true, true, true, true); + emit Ownable.OwnershipTransferred(admin, user1); + + preTMX.acceptOwnership(); + + // Verify ownership has changed + assertEq(preTMX.owner(), user1); + assertEq(preTMX.pendingOwner(), address(0)); + } + + function test_AcceptOwnership_NotPendingOwner() public { + // Start ownership transfer to user1 + vm.prank(admin); + preTMX.transferOwnership(user1); + + // user2 tries to accept (should fail) + vm.prank(user2); + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, user2)); + preTMX.acceptOwnership(); + + // Ownership should remain unchanged + assertEq(preTMX.owner(), admin); + assertEq(preTMX.pendingOwner(), user1); + } + + function test_AcceptOwnership_NoPendingTransfer() public { + // Try to accept ownership when no transfer is pending + vm.prank(user1); + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, user1)); + preTMX.acceptOwnership(); + } + + function test_TransferOwnership_CancelPending() public { + // Start ownership transfer to user1 + vm.prank(admin); + preTMX.transferOwnership(user1); + assertEq(preTMX.pendingOwner(), user1); + + // Cancel by transferring to zero address + vm.prank(admin); + + vm.expectEmit(true, true, true, true); + emit Ownable2Step.OwnershipTransferStarted(admin, address(0)); + + preTMX.transferOwnership(address(0)); + assertEq(preTMX.pendingOwner(), address(0)); + + // user1 should no longer be able to accept + vm.prank(user1); + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, user1)); + preTMX.acceptOwnership(); + } + + function test_TransferOwnership_ReplacePending() public { + // Start ownership transfer to user1 + vm.prank(admin); + preTMX.transferOwnership(user1); + assertEq(preTMX.pendingOwner(), user1); + + // Replace with transfer to user2 + vm.prank(admin); + + vm.expectEmit(true, true, true, true); + emit Ownable2Step.OwnershipTransferStarted(admin, user2); + + preTMX.transferOwnership(user2); + assertEq(preTMX.pendingOwner(), user2); + + // user1 should no longer be able to accept + vm.prank(user1); + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, user1)); + preTMX.acceptOwnership(); + + // user2 should be able to accept + vm.prank(user2); + preTMX.acceptOwnership(); + assertEq(preTMX.owner(), user2); + } + + function test_RenounceOwnership() public { + vm.prank(admin); + + vm.expectEmit(true, true, true, true); + emit Ownable.OwnershipTransferred(admin, address(0)); + + preTMX.renounceOwnership(); + + assertEq(preTMX.owner(), address(0)); + assertEq(preTMX.pendingOwner(), address(0)); + } + + function test_RenounceOwnership_NotOwner() public { + vm.prank(user1); + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, user1)); + preTMX.renounceOwnership(); + } + + function test_OwnershipTransfer_FunctionalityTransfers() public { + // Transfer ownership to user1 + vm.prank(admin); + preTMX.transferOwnership(user1); + + vm.prank(user1); + preTMX.acceptOwnership(); + + // Verify new owner can use onlyOwner functions + vm.prank(user1); + preTMX.enableTransfer(); + assertFalse(preTMX.transferRestricted()); + + vm.prank(user1); + preTMX.mint(user2, 1000); + assertEq(preTMX.balanceOf(user2), 1000); + + vm.prank(user1); + preTMX.whitelistTransferFrom(user2, true); + assertTrue(preTMX.isTransferredFromWhitelisted(user2)); + + // Verify old owner can no longer use onlyOwner functions + vm.prank(admin); + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, admin)); + preTMX.disableTransfer(); + } + + function test_OwnershipTransfer_WithPendingTransfer() public { + // Start ownership transfer to user1 + vm.prank(admin); + preTMX.transferOwnership(user1); + + // Verify admin can still use onlyOwner functions while transfer is pending + vm.prank(admin); + preTMX.enableTransfer(); + assertFalse(preTMX.transferRestricted()); + + // Verify user1 cannot use onlyOwner functions yet + vm.prank(user1); + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, user1)); + preTMX.disableTransfer(); + + // Complete the transfer + vm.prank(user1); + preTMX.acceptOwnership(); + + // Now user1 can use onlyOwner functions + vm.prank(user1); + preTMX.disableTransfer(); + assertTrue(preTMX.transferRestricted()); + } + + function test_FuzzOwnershipTransfer(address newOwner) public { + vm.assume(newOwner != address(0) && newOwner != admin); + + // Transfer ownership + vm.prank(admin); + preTMX.transferOwnership(newOwner); + assertEq(preTMX.pendingOwner(), newOwner); + + // Accept ownership + vm.prank(newOwner); + preTMX.acceptOwnership(); + assertEq(preTMX.owner(), newOwner); + assertEq(preTMX.pendingOwner(), address(0)); + } } From c711c1d34a513c0797dbfb7f0b2bd2515b6539b9 Mon Sep 17 00:00:00 2001 From: "Aaron C.-W. Liang" Date: Mon, 26 May 2025 15:20:28 +0800 Subject: [PATCH 033/194] update script for deploying PreTMX --- SCRIPT_USAGE.md | 50 +++++++++++ script.sh | 5 +- script/deploy/DeployPreTMX.s.sol | 137 +++++++++++++++++++++++++++++++ 3 files changed, 190 insertions(+), 2 deletions(-) create mode 100644 script/deploy/DeployPreTMX.s.sol diff --git a/SCRIPT_USAGE.md b/SCRIPT_USAGE.md index 00a1ae6..500f3e6 100644 --- a/SCRIPT_USAGE.md +++ b/SCRIPT_USAGE.md @@ -24,6 +24,7 @@ The `script.sh` utility is a flexible command runner that can handle both deploy - `deploy:market` - Deploy Market contracts - `deploy:order` - Deploy Order contracts - `deploy:vault` - Deploy Vault contracts + - `deploy:pretmx` - Deploy PreTMX token contract - Script commands: - `script:` - Run a custom script (e.g., `script:GrantRoles`, `script:SubmitOracles`) @@ -63,6 +64,15 @@ The `script.sh` utility is a flexible command runner that can handle both deploy # Run E2ETest script on Arbitrum Sepolia ./script.sh arb-sepolia script:E2ETest + +# Deploy PreTMX token contract on Ethereum Sepolia (dry run) +./script.sh eth-sepolia deploy:pretmx + +# Deploy PreTMX token contract on Arbitrum Mainnet and broadcast transactions +./script.sh arb-mainnet deploy:pretmx --broadcast + +# Deploy PreTMX token contract with verification on Ethereum Mainnet +./script.sh eth-mainnet deploy:pretmx --broadcast --verify ``` ## System Setup Flow @@ -114,6 +124,46 @@ The proper sequence for setting up the TermMax system is as follows: Following this sequence ensures that contracts are deployed with the correct dependency chain and permissions setup. +## PreTMX Token Deployment + +The PreTMX token can be deployed independently of the main system flow as it's a standalone tokenomics contract: + +```bash +# Deploy PreTMX token contract +./script.sh deploy:pretmx --broadcast +``` + +This creates a `-pretmx.json` file containing the PreTMX token contract details. + +### PreTMX Token Features + +- **Token Name**: "Pre TermMax Token" +- **Symbol**: "pTMX" +- **Initial Supply**: 1,000,000,000 tokens (1e9 ether) +- **Access Control**: Uses `Ownable2Step` for secure ownership transfer +- **Transfer Restrictions**: Transfers are initially restricted and require whitelisting +- **Initial State**: Admin is whitelisted for both sending and receiving transfers + +### Post-Deployment Management + +After deployment, the admin can manage the token through the following functions: + +1. **Transfer Restrictions**: + - `enableTransfer()` - Remove all transfer restrictions + - `disableTransfer()` - Re-enable transfer restrictions + +2. **Whitelist Management**: + - `whitelistTransferFrom(address, bool)` - Allow/disallow an address to send tokens + - `whitelistTransferTo(address, bool)` - Allow/disallow an address to receive tokens + +3. **Token Operations**: + - `mint(address, uint256)` - Mint additional tokens (admin only) + - `burn(uint256)` - Burn tokens (any token holder) + +4. **Ownership Transfer** (Two-step process for security): + - `transferOwnership(address)` - Initiate ownership transfer + - New owner calls `acceptOwnership()` - Complete the transfer + ## Special Environment Variables Some scripts require specific environment variables: diff --git a/script.sh b/script.sh index fd6686d..a0799d1 100755 --- a/script.sh +++ b/script.sh @@ -12,6 +12,7 @@ if [ "$#" -lt 2 ]; then echo " - deploy:market - Deploy Market contracts" echo " - deploy:order - Deploy Order contracts" echo " - deploy:vault - Deploy Vault contracts" + echo " - deploy:pretmx - Deploy PreTMX token contract" echo "" echo " 2. Script Commands:" echo " - script: - Run a custom script (e.g., script:GrantRoles, script:SubmitOracles)" @@ -87,12 +88,12 @@ esac # If deploying, validate deployment type if [ "$OPERATION" = "deploy" ]; then case $TYPE in - "access-manager"|"core"|"market"|"order"|"vault") + "access-manager"|"core"|"market"|"order"|"vault"|"pretmx") echo "Deployment type: $TYPE" ;; *) echo "Unsupported deployment type: $TYPE" - echo "Supported deployment types: access-manager, core, market, order, vault" + echo "Supported deployment types: access-manager, core, market, order, vault, pretmx" exit 1 ;; esac diff --git a/script/deploy/DeployPreTMX.s.sol b/script/deploy/DeployPreTMX.s.sol new file mode 100644 index 0000000..6728a60 --- /dev/null +++ b/script/deploy/DeployPreTMX.s.sol @@ -0,0 +1,137 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {Script} from "forge-std/Script.sol"; +import {console} from "forge-std/console.sol"; +import {PreTMX} from "contracts/tokenomics/PreTMX.sol"; +import {DeployBase} from "./DeployBase.s.sol"; + +contract DeployPreTMX is DeployBase { + // Network-specific config loaded from environment variables + string network; + uint256 deployerPrivateKey; + address deployerAddr; + address adminAddr; + + function setUp() public { + // Load network from environment variable + network = vm.envString("NETWORK"); + string memory networkUpper = toUpper(network); + + // Load network-specific configuration + string memory privateKeyVar = string.concat(networkUpper, "_DEPLOYER_PRIVATE_KEY"); + string memory adminVar = string.concat(networkUpper, "_ADMIN_ADDRESS"); + + deployerPrivateKey = vm.envUint(privateKeyVar); + deployerAddr = vm.addr(deployerPrivateKey); + adminAddr = vm.envAddress(adminVar); + } + + function run() public { + console.log("Network:", network); + console.log("Deployer:", deployerAddr); + console.log("Deployer balance:", deployerAddr.balance); + console.log("Admin:", adminAddr); + + uint256 currentBlock = block.number; + uint256 currentTimestamp = block.timestamp; + + vm.startBroadcast(deployerPrivateKey); + PreTMX preTMX = deployPreTMX(adminAddr); + vm.stopBroadcast(); + + console.log("===== Git Info ====="); + console.log("Git branch:", getGitBranch()); + console.log("Git commit hash:"); + console.logBytes(getGitCommitHash()); + console.log(); + + console.log("===== Block Info ====="); + console.log("Block number:", currentBlock); + console.log("Block timestamp:", currentTimestamp); + console.log(); + + console.log("===== PreTMX Token Info ====="); + console.log("PreTMX deployed at:", address(preTMX)); + console.log("Token name:", preTMX.name()); + console.log("Token symbol:", preTMX.symbol()); + console.log("Total supply:", preTMX.totalSupply()); + console.log("Owner:", preTMX.owner()); + console.log("Transfer restricted:", preTMX.transferRestricted()); + console.log(); + + // Write deployment results to a JSON file + string memory deploymentJson = string( + abi.encodePacked( + "{\n", + ' "network": "', + network, + '",\n', + ' "deployedAt": "', + vm.toString(block.timestamp), + '",\n', + ' "gitBranch": "', + getGitBranch(), + '",\n', + ' "gitCommitHash": "0x', + vm.toString(getGitCommitHash()), + '",\n', + ' "blockInfo": {\n', + ' "number": "', + vm.toString(currentBlock), + '",\n', + ' "timestamp": "', + vm.toString(currentTimestamp), + '"\n', + " },\n", + ' "deployer": "', + vm.toString(deployerAddr), + '",\n', + ' "admin": "', + vm.toString(adminAddr), + '",\n', + ' "contracts": {\n', + ' "preTMX": {\n', + ' "address": "', + vm.toString(address(preTMX)), + '",\n', + ' "name": "', + preTMX.name(), + '",\n', + ' "symbol": "', + preTMX.symbol(), + '",\n', + ' "totalSupply": "', + vm.toString(preTMX.totalSupply()), + '",\n', + ' "owner": "', + vm.toString(preTMX.owner()), + '",\n', + ' "transferRestricted": ', + preTMX.transferRestricted() ? "true" : "false", + "\n", + " }\n", + " }\n", + "}" + ) + ); + + // Create deployment directory if it doesn't exist + string memory deploymentsDir = string.concat(vm.projectRoot(), "/deployments/", network); + if (!vm.exists(deploymentsDir)) { + vm.createDir(deploymentsDir, true); + } + + // Write the JSON file + string memory filePath = string.concat(deploymentsDir, "/", network, "-PreTMX.json"); + vm.writeFile(filePath, deploymentJson); + console.log("Deployment information written to:", filePath); + } + + function deployPreTMX(address admin) public returns (PreTMX preTMX) { + console.log("Deploying PreTMX with admin:", admin); + preTMX = new PreTMX(admin); + console.log("PreTMX deployed successfully at:", address(preTMX)); + return preTMX; + } +} From 4ca4761250b42db7c3bc36c9ca4b10f230b142cf Mon Sep 17 00:00:00 2001 From: "Aaron C.-W. Liang" Date: Mon, 26 May 2025 16:16:52 +0800 Subject: [PATCH 034/194] update scripts --- script/AcceptOracles.s.sol | 72 +- script/CheckGTCollateralUsage.s.sol | 233 +++ script/CheckGTPositions.s.sol | 303 ++++ script/CheckMarketStatus.s.sol | 559 +++++++ script/CheckOracles.s.sol | 21 +- script/E2ETest.s.sol | 2 +- script/SubmitOracles.s.sol | 31 +- script/TVLChecker.s.sol | 780 +++++++++ script/UpdateMarketFee_20250513.s.sol | 184 +++ script/UpdateSingleGTCapacity.s.sol | 145 ++ script/convertMarketConfigs.ts | 32 +- script/deploy/DeployBase.s.sol | 4 +- script/deploy/DeployOracleAggregator.s.sol | 106 ++ script/deploy/DeployPendleSwapV3Adapter.s.sol | 107 ++ script/deploy/DeployPriceFeeds.sol | 17 +- script/deploy/DeployPriceFeedsArb.s.sol | 13 +- script/deploy/DeployPriceFeedsArbBackup.s.sol | 57 + script/deploy/DeployPriceFeedsEth.s.sol | 168 ++ script/deploy/DeployPriceFeedsEthBackup.s.sol | 152 ++ .../deploy/DeployPriceFeedsEthInWstETH.s.sol | 33 + script/deploy/DeployPriceFeedsEthLevel.s.sol | 63 + .../deploy/DeployPriceFeedsEth_20250508.s.sol | 99 ++ .../DeployPriceFeedsEth_20250508_Backup.s.sol | 61 + .../deploy/DeployPriceFeedsEth_20250513.s.sol | 63 + .../deploy/DeployPriceFeedsEth_20250522.s.sol | 141 ++ script/deploy/DeployPriceFeedsMorpho.s.sol | 73 + script/deploy/DeployVault.s.sol | 18 +- script/deploy/DeployVaultFactory.s.sol | 142 ++ .../deploydata/arb-mainnet-official.json | 278 ++++ script/deploy/deploydata/arb-mainnet.csv | 24 +- script/deploy/deploydata/arb-mainnet.json | 161 +- script/deploy/deploydata/arb-sepolia.json | 292 ++++ script/deploy/deploydata/bnb-testnet.json | 87 + .../deploydata/eth-mainnet-20250414-all.json | 620 +++++++ .../eth-mainnet-backup-20250422.json | 128 ++ ...-mainnet-backup-before-submit-oracles.json | 497 ++++++ script/deploy/deploydata/eth-mainnet.csv | 24 +- script/deploy/deploydata/eth-mainnet.json | 459 +----- script/deploy/deploydata/eth-sepolia.json | 497 ++++++ .../deploydata/gt_capacity_updates.json | 17 + script/deploy/deploydata/market_list.json | 1084 +++++++++++++ script/order-history-tracker.ts | 1424 +++++++++++++++++ script/transformAbi.ts | 3 + script/utils/JsonLoader.sol | 21 +- script/utils/types.ts | 1 + 45 files changed, 8610 insertions(+), 686 deletions(-) create mode 100644 script/CheckGTCollateralUsage.s.sol create mode 100644 script/CheckGTPositions.s.sol create mode 100644 script/CheckMarketStatus.s.sol create mode 100644 script/TVLChecker.s.sol create mode 100644 script/UpdateMarketFee_20250513.s.sol create mode 100644 script/UpdateSingleGTCapacity.s.sol create mode 100644 script/deploy/DeployOracleAggregator.s.sol create mode 100644 script/deploy/DeployPendleSwapV3Adapter.s.sol create mode 100644 script/deploy/DeployPriceFeedsArbBackup.s.sol create mode 100644 script/deploy/DeployPriceFeedsEth.s.sol create mode 100644 script/deploy/DeployPriceFeedsEthBackup.s.sol create mode 100644 script/deploy/DeployPriceFeedsEthInWstETH.s.sol create mode 100644 script/deploy/DeployPriceFeedsEthLevel.s.sol create mode 100644 script/deploy/DeployPriceFeedsEth_20250508.s.sol create mode 100644 script/deploy/DeployPriceFeedsEth_20250508_Backup.s.sol create mode 100644 script/deploy/DeployPriceFeedsEth_20250513.s.sol create mode 100644 script/deploy/DeployPriceFeedsEth_20250522.s.sol create mode 100644 script/deploy/DeployPriceFeedsMorpho.s.sol create mode 100644 script/deploy/DeployVaultFactory.s.sol create mode 100644 script/deploy/deploydata/arb-mainnet-official.json create mode 100644 script/deploy/deploydata/arb-sepolia.json create mode 100644 script/deploy/deploydata/bnb-testnet.json create mode 100644 script/deploy/deploydata/eth-mainnet-20250414-all.json create mode 100644 script/deploy/deploydata/eth-mainnet-backup-20250422.json create mode 100644 script/deploy/deploydata/eth-mainnet-backup-before-submit-oracles.json create mode 100644 script/deploy/deploydata/eth-sepolia.json create mode 100644 script/deploy/deploydata/gt_capacity_updates.json create mode 100644 script/deploy/deploydata/market_list.json create mode 100644 script/order-history-tracker.ts diff --git a/script/AcceptOracles.s.sol b/script/AcceptOracles.s.sol index 4a71af1..20fe8a6 100644 --- a/script/AcceptOracles.s.sol +++ b/script/AcceptOracles.s.sol @@ -25,6 +25,7 @@ contract AcceptOracles is Script { address tokenAddr; string tokenSymbol; address priceFeedAddr; + address backupPriceFeedAddr; uint32 heartbeat; uint64 validAt; bool existsInConfig; @@ -83,7 +84,7 @@ contract AcceptOracles is Script { PendingOracleStatus memory status = acceptedOracles[i]; // Get current oracle config before accepting - (AggregatorV3Interface currentAggregator,,,,) = oracle.oracles(status.tokenAddr); + (AggregatorV3Interface currentAggregator,,) = oracle.oracles(status.tokenAddr); // Accept the oracle accessManager.acceptPendingOracle(oracle, status.tokenAddr); @@ -114,6 +115,8 @@ contract AcceptOracles is Script { PendingOracleStatus memory status = notReadyOracles[i]; console.log("%d. %s (%s)", i + 1, status.tokenSymbol, status.tokenAddr); console.log(" Price Feed:", status.priceFeedAddr); + console.log(" Backup Price Feed:", status.backupPriceFeedAddr); + console.log(" Heartbeat:", status.heartbeat); console.log(" Status:", status.statusMessage); if (status.pendingOracleExists && status.validAt > 0) { @@ -154,6 +157,7 @@ contract AcceptOracles is Script { oracle, config.underlyingConfig.tokenAddr, config.underlyingConfig.priceFeedAddr, + config.underlyingConfig.backupPriceFeedAddr, uint32(config.underlyingConfig.heartBeat), "underlying" ); @@ -166,6 +170,7 @@ contract AcceptOracles is Script { oracle, config.collateralConfig.tokenAddr, config.collateralConfig.priceFeedAddr, + config.collateralConfig.backupPriceFeedAddr, uint32(config.collateralConfig.heartBeat), "collateral" ); @@ -178,6 +183,7 @@ contract AcceptOracles is Script { OracleAggregator oracle, address tokenAddr, address expectedPriceFeedAddr, + address expectedBackupPriceFeedAddr, uint32 expectedHeartbeat, string memory tokenType ) internal { @@ -185,6 +191,7 @@ contract AcceptOracles is Script { PendingOracleStatus memory status; status.tokenAddr = tokenAddr; status.priceFeedAddr = expectedPriceFeedAddr; + status.backupPriceFeedAddr = expectedBackupPriceFeedAddr; status.heartbeat = expectedHeartbeat; status.existsInConfig = true; @@ -199,9 +206,24 @@ contract AcceptOracles is Script { (IOracle.Oracle memory pendingOracle, uint64 validAt) = oracle.pendingOracles(tokenAddr); // Get current oracle for comparison - (AggregatorV3Interface currentAggregator,,,,) = oracle.oracles(tokenAddr); - - if (address(pendingOracle.aggregator) == address(0)) { + ( + AggregatorV3Interface currentAggregator, + AggregatorV3Interface currentBackupAggregator, + uint32 currentHeartbeat + ) = oracle.oracles(tokenAddr); + + if ( + address(currentAggregator) == expectedPriceFeedAddr + && address(currentBackupAggregator) == expectedBackupPriceFeedAddr && currentHeartbeat == expectedHeartbeat + ) { + status.readyToAccept = false; + status.statusMessage = "Oracle is already configured with the correct values"; + notReadyOracles.push(status); + return; + } else if ( + address(pendingOracle.aggregator) == address(0) && address(pendingOracle.backupAggregator) == address(0) + && pendingOracle.heartbeat == 0 + ) { // No pending oracle exists status.pendingOracleExists = false; status.readyToAccept = false; @@ -213,12 +235,26 @@ contract AcceptOracles is Script { status.validAt = validAt; // Check if it matches our expected price feed and is valid - if (address(pendingOracle.aggregator) != expectedPriceFeedAddr) { + if ( + address(pendingOracle.aggregator) != expectedPriceFeedAddr + || address(pendingOracle.backupAggregator) != expectedBackupPriceFeedAddr + || pendingOracle.heartbeat != expectedHeartbeat + ) { status.readyToAccept = false; status.statusMessage = string( abi.encodePacked( "Pending oracle doesn't match expected price feed. Found: ", - vm.toString(address(pendingOracle.aggregator)) + vm.toString(address(pendingOracle.aggregator)), + " Expected: ", + vm.toString(expectedPriceFeedAddr), + " Backup: ", + vm.toString(address(pendingOracle.backupAggregator)), + " Expected: ", + vm.toString(expectedBackupPriceFeedAddr), + " Heartbeat: ", + vm.toString(pendingOracle.heartbeat), + " Expected: ", + vm.toString(expectedHeartbeat) ) ); notReadyOracles.push(status); @@ -227,30 +263,6 @@ contract AcceptOracles is Script { status.readyToAccept = false; status.statusMessage = "Timelock period not yet elapsed"; notReadyOracles.push(status); - } else if ( - address(currentAggregator) == expectedPriceFeedAddr && pendingOracle.heartbeat == expectedHeartbeat - ) { - // Get current heartbeat value - (,,, uint32 currentHeartbeat,) = oracle.oracles(tokenAddr); - - // Oracle is already set correctly (both address and heartbeat) - if (currentHeartbeat == expectedHeartbeat) { - status.readyToAccept = false; - status.statusMessage = "Oracle is already configured with the correct values"; - notReadyOracles.push(status); - } else { - // Only heartbeat needs updating - status.readyToAccept = true; - status.statusMessage = string( - abi.encodePacked( - "Heartbeat will be updated from ", - vm.toString(currentHeartbeat), - " to ", - vm.toString(expectedHeartbeat) - ) - ); - acceptedOracles.push(status); - } } else { // Oracle is ready to accept - this handles the case where the price feed address is different status.readyToAccept = true; diff --git a/script/CheckGTCollateralUsage.s.sol b/script/CheckGTCollateralUsage.s.sol new file mode 100644 index 0000000..65589ac --- /dev/null +++ b/script/CheckGTCollateralUsage.s.sol @@ -0,0 +1,233 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {Script} from "forge-std/Script.sol"; +import {console2} from "forge-std/console2.sol"; +import {stdJson} from "forge-std/StdJson.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import {Vm} from "forge-std/Vm.sol"; + +interface IGearingToken { + function collateralCapacity() external view returns (uint256); + function getGtConfig() external view returns (GtConfig memory); +} + +struct GtConfig { + address treasurer; + address market; + IERC20 debtToken; + address collateral; + address ft; + uint256 maturity; + LoanConfig loanConfig; +} + +struct LoanConfig { + address oracle; + uint128 maxLtv; + uint128 liquidationLtv; + bool liquidatable; +} + +/** + * @title CheckGTCollateralUsage + * @notice Script to extract gtAddr from each market and check the collateral capacity usage + * @dev Run with: forge script script/CheckGTCollateralUsage.s.sol --rpc-url + */ +contract CheckGTCollateralUsage is Script { + using stdJson for string; + + struct MarketInfo { + string symbol; + address gt; + address collateral; + uint256 collateralCapacity; + uint256 collateralBalance; + uint256 usagePercentage; + uint8 collateralDecimals; + string collateralSymbol; + } + + MarketInfo[] public markets; + // Only show markets with usage > this percentage + uint256 constant USAGE_THRESHOLD = 20; + + function setUp() public { + // Nothing to set up + } + + function run() public { + console2.log("=== Checking GT Collateral Usage ==="); + + // 1. Load market information from market_list.json + string memory json = vm.readFile("script/deploy/deploydata/market_list.json"); + + // Extract the number of markets + bytes memory marketCountData = vm.parseJson(json, ".data"); + uint256 marketCount = abi.decode(marketCountData, (uint256[])).length; + + console2.log(string.concat("Total Markets Found: ", vm.toString(marketCount))); + + // 2. Process each market + for (uint256 i = 0; i < marketCount; i++) { + string memory marketPath = string.concat(".data[", vm.toString(i), "]"); + + // Extract market details + string memory symbol = vm.parseJsonString(json, string.concat(marketPath, ".symbol")); + address gtAddr = vm.parseJsonAddress(json, string.concat(marketPath, ".contracts.gtAddr")); + address collateralAddr = vm.parseJsonAddress(json, string.concat(marketPath, ".contracts.collateralAddr")); + + // Skip if GT address is zero (should not happen, but just in case) + if (gtAddr == address(0)) { + console2.log(string.concat("Market ", symbol, " has zero GT address, skipping...")); + continue; + } + + // Get collateral capacity from GT contract + IGearingToken gt = IGearingToken(gtAddr); + uint256 collateralCapacity; + try gt.collateralCapacity() returns (uint256 capacity) { + collateralCapacity = capacity; + } catch { + console2.log(string.concat("Error getting collateral capacity for ", symbol, ", skipping...")); + continue; + } + + // Get collateral token details + IERC20Metadata collateralToken = IERC20Metadata(collateralAddr); + uint8 collateralDecimals; + string memory collateralSymbol; + + try collateralToken.decimals() returns (uint8 decimals) { + collateralDecimals = decimals; + } catch { + collateralDecimals = 18; // Default to 18 if call fails + } + + try collateralToken.symbol() returns (string memory symbol_) { + collateralSymbol = symbol_; + } catch { + collateralSymbol = "???"; // Default if call fails + } + + // Get current collateral balance + uint256 collateralBalance = collateralToken.balanceOf(gtAddr); + + // Calculate usage percentage (with 2 decimal precision - multiply by 10000 and divide by 100) + uint256 usagePercentage = + collateralCapacity > 0 ? (collateralBalance * 10000) / collateralCapacity / 100 : 0; + + // Add to markets array + markets.push( + MarketInfo({ + symbol: symbol, + gt: gtAddr, + collateral: collateralAddr, + collateralCapacity: collateralCapacity, + collateralBalance: collateralBalance, + usagePercentage: usagePercentage, + collateralDecimals: collateralDecimals, + collateralSymbol: collateralSymbol + }) + ); + } + + // 3. Count markets with high usage (> USAGE_THRESHOLD%) + uint256 highUsageCount = 0; + for (uint256 i = 0; i < markets.length; i++) { + if (markets[i].usagePercentage > USAGE_THRESHOLD) { + highUsageCount++; + } + } + + // 4. Output results in a table format + console2.log("\n=== GT Collateral Usage Report (Usage > 20%) ==="); + + if (highUsageCount == 0) { + console2.log("No markets found with collateral usage greater than 20%"); + } else { + console2.log(string.concat("Found ", vm.toString(highUsageCount), " markets with usage > 20%")); + console2.log("Market | Collateral | Capacity | Balance | Usage (%)"); + console2.log("-------|------------|----------|---------|----------"); + + for (uint256 i = 0; i < markets.length; i++) { + MarketInfo memory market = markets[i]; + + // Skip markets with low usage + if (market.usagePercentage <= USAGE_THRESHOLD) { + continue; + } + + // Format capacity and balance with proper decimals for readability + string memory formattedCapacity = _formatAmount(market.collateralCapacity, market.collateralDecimals); + string memory formattedBalance = _formatAmount(market.collateralBalance, market.collateralDecimals); + + string memory logLine = string.concat( + market.symbol, + " | ", + market.collateralSymbol, + " | ", + formattedCapacity, + " | ", + formattedBalance, + " | ", + vm.toString(market.usagePercentage), + "%" + ); + + console2.log(logLine); + } + } + } + + // Helper function to format token amounts with proper decimals + function _formatAmount(uint256 amount, uint8 decimals) internal view returns (string memory) { + if (amount == 0) return "0"; + + // Convert to string + string memory amountStr = vm.toString(amount); + bytes memory amountBytes = bytes(amountStr); + + // Simple approach to avoid array out-of-bounds errors + if (decimals == 0) { + // No decimal point needed + return amountStr; + } else if (amountBytes.length <= decimals) { + // Number is less than 1 (e.g., 0.0123) + // Start with "0." + string memory result = "0."; + + // Add leading zeros + for (uint256 i = 0; i < decimals - amountBytes.length; i++) { + result = string.concat(result, "0"); + } + + // Add the significant digits + result = string.concat(result, amountStr); + return result; + } else { + // Number is >= 1 (e.g., 123.456) + uint256 intPartLength = amountBytes.length - decimals; + + // Extract integer part + bytes memory intPart = new bytes(intPartLength); + for (uint256 i = 0; i < intPartLength; i++) { + intPart[i] = amountBytes[i]; + } + + // Extract decimal part + bytes memory decPart = new bytes(decimals); + for (uint256 i = 0; i < decimals; i++) { + if (intPartLength + i < amountBytes.length) { + decPart[i] = amountBytes[intPartLength + i]; + } else { + decPart[i] = "0"; + } + } + + // Combine with decimal point + return string.concat(string(intPart), ".", string(decPart)); + } + } +} diff --git a/script/CheckGTPositions.s.sol b/script/CheckGTPositions.s.sol new file mode 100644 index 0000000..524cd21 --- /dev/null +++ b/script/CheckGTPositions.s.sol @@ -0,0 +1,303 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {Script} from "forge-std/Script.sol"; +import {console} from "forge-std/console.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {IERC721Enumerable} from "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol"; +import {ERC721Holder} from "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol"; +import {Vm} from "forge-std/Vm.sol"; +import {IGearingToken} from "../contracts/tokens/IGearingToken.sol"; + +interface IGT is IERC721Enumerable { + function tokenURI(uint256 tokenId) external view returns (string memory); + function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); + function getLockupInfo(uint256 tokenId) external view returns (address, uint256, uint256); + function getActiveAmount(uint256 tokenId) external view returns (uint256); + function getBalanceLocked(uint256 tokenId) external view returns (uint256); +} + +/** + * @title CheckGTPositions + * @notice Script to extract all addresses from market config files and list active GT positions + * @dev Run with: forge script script/CheckGTPositions.s.sol --rpc-url + */ +contract CheckGTPositions is Script, ERC721Holder { + struct MarketInfo { + string name; + address market; + address ft; + address xt; + address gt; + address underlying; + string underlyingSymbol; + address collateral; + string collateralSymbol; + } + + struct GTPosition { + uint256 tokenId; + uint256 activeAmount; + uint256 lockedAmount; + address owner; + uint256 lockupStart; + uint256 lockupEnd; + } + + MarketInfo[] public markets; + string constant DEPLOYMENT_DIR = "eth-mainnet-v1.0.8-20250404-2000"; + + function setUp() public { + // Nothing to set up + } + + function run() public { + console.log("=== Extracting Market Addresses and GT Positions ==="); + + // 1. Load all market configurations + string memory deploymentPath = string.concat(vm.projectRoot(), "/deployments/", DEPLOYMENT_DIR, "/"); + + // Read directory contents + string[] memory files = getFilesInDirectory(deploymentPath); + + // Filter for market files + for (uint256 i = 0; i < files.length; i++) { + string memory file = files[i]; + + // Only process market files + if (contains(file, "market-") && contains(file, ".json")) { + processMarketFile(string.concat(deploymentPath, file)); + } + } + + // 2. Print summary of all markets + console.log("\n=== Market Addresses Summary ==="); + console.log("Total Markets Found: %d", markets.length); + + for (uint256 i = 0; i < markets.length; i++) { + MarketInfo memory market = markets[i]; + console.log("\nMarket %d: %s", i + 1, market.name); + console.log("Market Address: %s", market.market); + console.log("Underlying: %s (%s)", market.underlyingSymbol, market.underlying); + console.log("Collateral: %s (%s)", market.collateralSymbol, market.collateral); + console.log("GT Address: %s", market.gt); + console.log("FT Address: %s", market.ft); + console.log("XT Address: %s", market.xt); + } + + // 3. Check active GT positions for each market + console.log("\n=== Active GT Positions ==="); + + for (uint256 i = 0; i < markets.length; i++) { + MarketInfo memory market = markets[i]; + console.log("\n--- Market: %s ---", market.name); + + IGearingToken gt = IGearingToken(market.gt); + uint256 totalSupply = gt.totalSupply(); + + // Skip if no GTs minted + if (totalSupply == 0) { + console.log("No GT tokens minted for this market"); + continue; + } + + console.log("Total GT Tokens: %d", totalSupply); + uint256 activePositions = 0; + + for (uint256 tokenId = 1; tokenId <= totalSupply; tokenId++) { + // This token exists, check if it's active + activePositions++; + + (address owner, uint128 debtAmt, bytes memory collateralData) = gt.loanInfo(tokenId); + uint256 collateralAmt = abi.decode(collateralData, (uint256)); + + // Print position details + console.log("GT #%d - Owner: %s", tokenId, owner); + console.log(" Debt Amount: %d", debtAmt); + console.log(" Collateral Amount: %d", collateralAmt); + } + + if (activePositions == 0) { + console.log("No active GT positions found"); + } else { + console.log("Total Active GT Positions: %d", activePositions); + } + } + } + + // Helper function to get files in a directory without using vm.readDir directly + function getFilesInDirectory(string memory path) internal returns (string[] memory) { + // Get a list of all files in the directory using shell command + string[] memory inputs = new string[](3); + inputs[0] = "ls"; + inputs[1] = "-1"; // One file per line + inputs[2] = path; + + bytes memory res = vm.ffi(inputs); + string memory result = string(res); + + // Split the result by newlines to get individual files + return split(result, "\n"); + } + + // Helper function to split a string by delimiter + function split(string memory _base, string memory _delimiter) internal pure returns (string[] memory) { + bytes memory baseBytes = bytes(_base); + + // Count the number of delimiters to determine array size + uint256 count = 1; + for (uint256 i = 0; i < baseBytes.length; i++) { + bytes memory delimiter = bytes(_delimiter); + bool found = true; + + if (i + delimiter.length > baseBytes.length) { + found = false; + } else { + for (uint256 j = 0; j < delimiter.length; j++) { + if (baseBytes[i + j] != delimiter[j]) { + found = false; + break; + } + } + } + + if (found) { + count++; + i += delimiter.length - 1; + } + } + + // Create the array and split the string + string[] memory parts = new string[](count); + uint256 partIndex = 0; + uint256 startIndex = 0; + + for (uint256 i = 0; i <= baseBytes.length; i++) { + if ( + i == baseBytes.length + || (i + bytes(_delimiter).length <= baseBytes.length && isMatch(baseBytes, i, bytes(_delimiter))) + ) { + // Extract the part + bytes memory part = new bytes(i - startIndex); + for (uint256 j = 0; j < part.length; j++) { + part[j] = baseBytes[startIndex + j]; + } + + parts[partIndex] = string(part); + partIndex++; + + if (i < baseBytes.length) { + i += bytes(_delimiter).length - 1; + startIndex = i + 1; + } + } + } + + return parts; + } + + // Helper function to check if there's a delimiter match at position + function isMatch(bytes memory _base, uint256 _position, bytes memory _match) internal pure returns (bool) { + if (_position + _match.length > _base.length) { + return false; + } + + for (uint256 i = 0; i < _match.length; i++) { + if (_base[_position + i] != _match[i]) { + return false; + } + } + + return true; + } + + function processMarketFile(string memory filePath) internal { + string memory json = vm.readFile(filePath); + + // Extract market name from file path + string memory fileName = extractFileName(filePath); + + // Extract addresses + address marketAddr = vm.parseJsonAddress(json, ".market"); + address underlying = vm.parseJsonAddress(json, ".underlying.address"); + string memory underlyingSymbol = vm.parseJsonString(json, ".underlying.symbol"); + address collateral = vm.parseJsonAddress(json, ".collateral.address"); + string memory collateralSymbol = vm.parseJsonString(json, ".collateral.symbol"); + address ftAddr = vm.parseJsonAddress(json, ".tokens.ft"); + address xtAddr = vm.parseJsonAddress(json, ".tokens.xt"); + address gtAddr = vm.parseJsonAddress(json, ".tokens.gt"); + + // Add to markets array + markets.push( + MarketInfo({ + name: fileName, + market: marketAddr, + ft: ftAddr, + xt: xtAddr, + gt: gtAddr, + underlying: underlying, + underlyingSymbol: underlyingSymbol, + collateral: collateral, + collateralSymbol: collateralSymbol + }) + ); + } + + // Helper function to check if a string contains a substring + function contains(string memory str, string memory substr) internal pure returns (bool) { + bytes memory strBytes = bytes(str); + bytes memory substrBytes = bytes(substr); + + if (substrBytes.length > strBytes.length) { + return false; + } + + for (uint256 i = 0; i <= strBytes.length - substrBytes.length; i++) { + bool found = true; + + for (uint256 j = 0; j < substrBytes.length; j++) { + if (strBytes[i + j] != substrBytes[j]) { + found = false; + break; + } + } + + if (found) { + return true; + } + } + + return false; + } + + // Helper function to extract file name from path + function extractFileName(string memory filePath) internal pure returns (string memory) { + bytes memory pathBytes = bytes(filePath); + uint256 lastSlash = 0; + + // Find the last slash in the path + for (uint256 i = 0; i < pathBytes.length; i++) { + if (pathBytes[i] == bytes1("/")) { + lastSlash = i; + } + } + + // Create the substring from after the last slash + bytes memory result = new bytes(pathBytes.length - lastSlash - 1); + for (uint256 i = 0; i < result.length; i++) { + result[i] = pathBytes[lastSlash + 1 + i]; + } + + return string(result); + } + + // Helper function to format unix timestamp + function formatTimestamp(uint256 timestamp) internal pure returns (string memory) { + if (timestamp == 0) { + return "N/A"; + } + + // Convert timestamp to a human-readable date - simplified version + return vm.toString(timestamp); + } +} diff --git a/script/CheckMarketStatus.s.sol b/script/CheckMarketStatus.s.sol new file mode 100644 index 0000000..033dd67 --- /dev/null +++ b/script/CheckMarketStatus.s.sol @@ -0,0 +1,559 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {Script} from "forge-std/Script.sol"; +import {console2} from "forge-std/console2.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import {ITermMaxMarket} from "contracts/ITermMaxMarket.sol"; +import {IGearingToken} from "contracts/tokens/IGearingToken.sol"; +import {IMintableERC20} from "contracts/tokens/IMintableERC20.sol"; +/** + * @title CheckMarketStatus + * @dev Script to check status of markets and GTs + */ + +contract CheckMarketStatus is Script { + struct MarketInfo { + string fileName; + address market; + address underlying; + address collateral; + address ft; + address xt; + address gt; + string underlyingSymbol; + string collateralSymbol; + uint8 underlyingDecimals; + uint8 collateralDecimals; + uint256 underlyingBalance; // Underlying balance in market + uint256 collateralBalance; // Collateral balance in GT + uint256 ftTotalSupply; // Total supply of FT + uint256 treasurerUnderlyingBalance; // Treasurer's underlying balance + uint256 treasurerFtBalance; // Treasurer's FT balance + uint256 ftInMarketBalance; // FT balance in the market + } + + function run() public { + // Directory to look for deployment files + string memory deploymentDir = "deployments/eth-mainnet-v1.0.8-20250410-2000"; + + // Set treasurer address + address treasurer = 0x719e77027952929ed3060dbFFC5D43EC50c1cf79; + + // First, count the market files to determine array size + uint256 marketCount = countMarketFiles(deploymentDir); + MarketInfo[] memory markets = new MarketInfo[](marketCount); + uint256 marketIndex = 0; + + console2.log("====== Checking Balances for ETH Mainnet Markets ======"); + console2.log(string.concat("Directory: ", deploymentDir)); + console2.log(string.concat("Found ", vm.toString(marketCount), " market files")); + console2.log(string.concat("Treasurer: ", formatAddress(treasurer))); + console2.log("====================================================="); + + // Process market files + processMarketFiles(deploymentDir, markets, false, treasurer); + + // Display results + console2.log("\n====== MARKET BALANCES SUMMARY ======"); + + for (uint256 i = 0; i < marketCount; i++) { + MarketInfo memory info = markets[i]; + + // Extract market name from file path + string memory marketName = extractMarketName(info.fileName); + + // Format underlying balance with proper decimals + string memory formattedUnderlyingBalance = + formatTokenAmount(info.underlyingBalance, info.underlyingDecimals); + + // Format collateral balance with proper decimals + string memory formattedCollateralBalance = + formatTokenAmount(info.collateralBalance, info.collateralDecimals); + + // Format FT total supply + string memory formattedFtSupply = formatTokenAmount(info.ftTotalSupply, info.underlyingDecimals); + + // Format FT in market balance + string memory formattedFtInMarket = formatTokenAmount(info.ftInMarketBalance, info.underlyingDecimals); + + // Format treasurer balances + string memory formattedTreasurerUnderlyingBalance = + formatTokenAmount(info.treasurerUnderlyingBalance, info.underlyingDecimals); + string memory formattedTreasurerFtBalance = + formatTokenAmount(info.treasurerFtBalance, info.underlyingDecimals); + + // Display results in the requested format + console2.log("---------------------------------------------------------------"); + console2.log(string.concat("Market: ", marketName)); + console2.log(string.concat("Market address: ", formatAddress(info.market))); + console2.log( + string.concat("Underlying in market: ", formattedUnderlyingBalance, " ", info.underlyingSymbol) + ); + console2.log(string.concat("Collateral in GT: ", formattedCollateralBalance, " ", info.collateralSymbol)); + console2.log(string.concat("FT total supply: ", formattedFtSupply, " ", info.underlyingSymbol)); + console2.log(string.concat("FT in market: ", formattedFtInMarket, " ", info.underlyingSymbol)); + console2.log( + string.concat( + "Underlying of treasurer: ", formattedTreasurerUnderlyingBalance, " ", info.underlyingSymbol + ) + ); + console2.log(string.concat("FT of treasurer: ", formattedTreasurerFtBalance, " ", info.underlyingSymbol)); + + // Check if (FT total supply - FT in market) equals underlying in market + if (info.ftTotalSupply > 0) { + uint256 circulatingFT = + info.ftTotalSupply > info.ftInMarketBalance ? info.ftTotalSupply - info.ftInMarketBalance : 0; + + bool invariantPassed = circulatingFT == info.underlyingBalance; + if (invariantPassed) { + console2.log("INVARIANT CHECK PASSED: (FT total supply - FT in market) equals underlying in market"); + } else { + console2.log( + "INVARIANT CHECK FAILED: (FT total supply - FT in market) does NOT equal underlying in market" + ); + console2.log( + string.concat( + " Expected: ", + formatTokenAmount(info.underlyingBalance, info.underlyingDecimals), + " ", + info.underlyingSymbol + ) + ); + console2.log( + string.concat( + " Actual: ", + formatTokenAmount(circulatingFT, info.underlyingDecimals), + " ", + info.underlyingSymbol + ) + ); + console2.log( + string.concat( + " Difference: ", + formatTokenAmount( + circulatingFT > info.underlyingBalance + ? circulatingFT - info.underlyingBalance + : info.underlyingBalance - circulatingFT, + info.underlyingDecimals + ), + " ", + info.underlyingSymbol + ) + ); + } + } + + // Check for active GT positions + if (info.gt != address(0)) { + try IGearingToken(info.gt).totalSupply() returns (uint256 totalSupply) { + if (totalSupply > 0) { + console2.log(string.concat("Positions (", vm.toString(totalSupply), " total):")); + + // Check a few positions as example + uint256 positionsToCheck = totalSupply > 5 ? 5 : totalSupply; + for (uint256 j = 1; j <= positionsToCheck; j++) { + try IGearingToken(info.gt).loanInfo(j) returns ( + address owner, uint128 debtAmt, bytes memory collateralData + ) { + // Get collateral amount from collateralData - assuming it's an abi encoded uint256 + uint256 collateralAmt = 0; + if (collateralData.length >= 32) { + collateralAmt = abi.decode(collateralData, (uint256)); + } + + string memory formattedDebt = formatTokenAmount(debtAmt, info.underlyingDecimals); + string memory formattedCollateral = + formatTokenAmount(collateralAmt, info.collateralDecimals); + + // Format position details without formatted string + string memory positionMsg = string.concat( + " Position ", + vm.toString(j), + ": Owner: ", + formatAddress(owner), + ", debt: ", + formattedDebt, + " ", + info.underlyingSymbol, + ", collateral: ", + formattedCollateral, + " ", + info.collateralSymbol + ); + console2.log(positionMsg); + } catch { + console2.log(string.concat(" Error fetching position ", vm.toString(j))); + } + } + } else { + console2.log("No active positions"); + } + } catch { + console2.log(string.concat("Error: Could not fetch GT positions for ", formatAddress(info.gt))); + } + } + } + console2.log("---------------------------------------------------------------"); + } + + // Count how many market files are in the directory + function countMarketFiles(string memory deploymentDir) internal returns (uint256) { + string[] memory inputs = new string[](3); + inputs[0] = "ls"; + inputs[1] = "-1"; // One file per line + inputs[2] = deploymentDir; + + bytes memory result = vm.ffi(inputs); + string memory fileList = string(result); + + string[] memory files = split(fileList, "\n"); + uint256 marketCount = 0; + + for (uint256 i = 0; i < files.length; i++) { + if (contains(files[i], "market-") && contains(files[i], ".json")) { + marketCount++; + } + } + + return marketCount; + } + + // Process market files and extract information + function processMarketFiles( + string memory deploymentDir, + MarketInfo[] memory markets, + bool dryRun, + address treasurer + ) internal { + string[] memory inputs = new string[](3); + inputs[0] = "ls"; + inputs[1] = "-1"; // One file per line + inputs[2] = deploymentDir; + + bytes memory result = vm.ffi(inputs); + string memory fileList = string(result); + + string[] memory files = split(fileList, "\n"); + uint256 marketIndex = 0; + + for (uint256 i = 0; i < files.length; i++) { + if (contains(files[i], "market-") && contains(files[i], ".json")) { + string memory filePath = string.concat(deploymentDir, "/", files[i]); + string memory jsonContent = vm.readFile(filePath); + markets[marketIndex].fileName = files[i]; + + // Extract market address + markets[marketIndex].market = vm.parseJsonAddress(jsonContent, ".market"); + + // Extract underlying and collateral addresses + markets[marketIndex].underlying = vm.parseJsonAddress(jsonContent, ".underlying.address"); + markets[marketIndex].collateral = vm.parseJsonAddress(jsonContent, ".collateral.address"); + + // Get tokens from market + if (!dryRun) { + try ITermMaxMarket(markets[marketIndex].market).tokens() returns ( + IMintableERC20 ft, IMintableERC20 xt, IGearingToken gt, address collateral, IERC20 underlying + ) { + markets[marketIndex].ft = address(ft); + markets[marketIndex].xt = address(xt); + markets[marketIndex].gt = address(gt); + + // Double-check these match the JSON + if (collateral != markets[marketIndex].collateral) { + console2.log(string.concat("Warning: Collateral mismatch in ", files[i])); + console2.log(string.concat(" JSON: ", vm.toString(markets[marketIndex].collateral))); + console2.log(string.concat(" Market: ", vm.toString(collateral))); + } + + if (address(underlying) != markets[marketIndex].underlying) { + console2.log(string.concat("Warning: Underlying mismatch in ", files[i])); + console2.log(string.concat(" JSON: ", vm.toString(markets[marketIndex].underlying))); + console2.log(string.concat(" Market: ", vm.toString(address(underlying)))); + } + } catch (bytes memory err) { + console2.log( + string.concat( + "Error: Could not fetch tokens from market ", + formatAddress(markets[marketIndex].market), + ". Error: ", + err.length > 0 ? vm.toString(err) : "reverted without reason" + ) + ); + } + } else { + // In dry-run mode, create dummy values based on file naming conventions + // Extract token symbols from filename (e.g. eth-mainnet-market-USDC-WBTC@02APR2025.json) + string memory fileNameWithoutPath = files[i]; + // Extract market parts from filename + string[] memory parts = split(fileNameWithoutPath, "-"); + + if (parts.length >= 5) { + // Last part might contain something like "WBTC@02APR2025.json" + string[] memory symbolParts = split(parts[4], "@"); + string[] memory suffixParts = split(symbolParts[0], "."); + + markets[marketIndex].underlyingSymbol = parts[3]; // e.g. USDC + markets[marketIndex].collateralSymbol = suffixParts[0]; // e.g. WBTC + + // Create dummy FT address in dry-run mode + markets[marketIndex].ft = address(uint160(0xFEED0000 + i)); + + // Set default values for dry-run mode + if (bytes(markets[marketIndex].underlyingSymbol).length == 0) { + markets[marketIndex].underlyingSymbol = "UNK"; + } + if (bytes(markets[marketIndex].collateralSymbol).length == 0) { + markets[marketIndex].collateralSymbol = "UNK"; + } + + // Set dummy values for treasurer balances in dry-run mode + markets[marketIndex].treasurerUnderlyingBalance = 1000000 * (i + 1); + markets[marketIndex].treasurerFtBalance = 500000 * (i + 1); + markets[marketIndex].ftInMarketBalance = 200000 * (i + 1); + markets[marketIndex].underlyingDecimals = 6; // USDC is usually 6 + markets[marketIndex].collateralDecimals = 18; // Most tokens are 18 + } + } + + // Get token symbols and decimals + if (!dryRun) { + try IERC20Metadata(markets[marketIndex].underlying).symbol() returns (string memory symbol) { + markets[marketIndex].underlyingSymbol = symbol; + } catch { + markets[marketIndex].underlyingSymbol = "Unknown"; + } + + try IERC20Metadata(markets[marketIndex].collateral).symbol() returns (string memory symbol) { + markets[marketIndex].collateralSymbol = symbol; + } catch { + markets[marketIndex].collateralSymbol = "Unknown"; + } + + try IERC20Metadata(markets[marketIndex].underlying).decimals() returns (uint8 decimals) { + markets[marketIndex].underlyingDecimals = decimals; + } catch { + markets[marketIndex].underlyingDecimals = 18; + } + + try IERC20Metadata(markets[marketIndex].collateral).decimals() returns (uint8 decimals) { + markets[marketIndex].collateralDecimals = decimals; + } catch { + markets[marketIndex].collateralDecimals = 18; + } + } + + // Check balances + if (!dryRun) { + try IERC20(markets[marketIndex].underlying).balanceOf(markets[marketIndex].market) returns ( + uint256 balance + ) { + markets[marketIndex].underlyingBalance = balance; + } catch { + console2.log( + string.concat( + "Error: Could not fetch underlying balance for market ", + formatAddress(markets[marketIndex].market) + ) + ); + } + + try IERC20(markets[marketIndex].collateral).balanceOf(markets[marketIndex].gt) returns ( + uint256 balance + ) { + markets[marketIndex].collateralBalance = balance; + } catch { + console2.log( + string.concat( + "Error: Could not fetch collateral balance for GT ", + formatAddress(markets[marketIndex].gt) + ) + ); + } + + // Check FT total supply + if (markets[marketIndex].ft != address(0)) { + try IERC20(markets[marketIndex].ft).totalSupply() returns (uint256 supply) { + markets[marketIndex].ftTotalSupply = supply; + } catch { + console2.log( + string.concat( + "Error: Could not fetch FT total supply for ", + formatAddress(markets[marketIndex].ft) + ) + ); + } + + // Check FT balance in market + try IERC20(markets[marketIndex].ft).balanceOf(markets[marketIndex].market) returns ( + uint256 balance + ) { + markets[marketIndex].ftInMarketBalance = balance; + } catch { + console2.log( + string.concat( + "Error: Could not fetch FT balance in market ", + formatAddress(markets[marketIndex].market) + ) + ); + } + + // Check treasurer's FT balance + try IERC20(markets[marketIndex].ft).balanceOf(treasurer) returns (uint256 balance) { + markets[marketIndex].treasurerFtBalance = balance; + } catch { + console2.log( + string.concat( + "Error: Could not fetch treasurer's FT balance for ", + formatAddress(markets[marketIndex].ft) + ) + ); + } + } + + // Check treasurer's underlying balance + try IERC20(markets[marketIndex].underlying).balanceOf(treasurer) returns (uint256 balance) { + markets[marketIndex].treasurerUnderlyingBalance = balance; + } catch { + console2.log( + string.concat( + "Error: Could not fetch treasurer's underlying balance for ", + formatAddress(markets[marketIndex].underlying) + ) + ); + } + } + + marketIndex++; + } + } + } + + // Check if a string contains a substring + function contains(string memory source, string memory target) internal pure returns (bool) { + bytes memory sourceBytes = bytes(source); + bytes memory targetBytes = bytes(target); + + if (targetBytes.length > sourceBytes.length) { + return false; + } + + for (uint256 i = 0; i <= sourceBytes.length - targetBytes.length; i++) { + bool found = true; + for (uint256 j = 0; j < targetBytes.length; j++) { + if (sourceBytes[i + j] != targetBytes[j]) { + found = false; + break; + } + } + if (found) { + return true; + } + } + return false; + } + + // Split a string by delimiter + function split(string memory source, string memory delimiter) internal pure returns (string[] memory) { + bytes memory sourceBytes = bytes(source); + bytes memory delimiterBytes = bytes(delimiter); + + // Count occurrences of delimiter + uint256 count = 1; // At least one item + for (uint256 i = 0; i < sourceBytes.length - delimiterBytes.length + 1; i++) { + bool found = true; + for (uint256 j = 0; j < delimiterBytes.length; j++) { + if (sourceBytes[i + j] != delimiterBytes[j]) { + found = false; + break; + } + } + if (found) { + count++; + i += delimiterBytes.length - 1; + } + } + + // Split the string + string[] memory parts = new string[](count); + uint256 partIndex = 0; + uint256 startIndex = 0; + + for (uint256 i = 0; i <= sourceBytes.length - delimiterBytes.length + 1; i++) { + if (i == sourceBytes.length - delimiterBytes.length + 1) { + // Add the last part + parts[partIndex] = substring(source, startIndex, sourceBytes.length); + break; + } + + bool found = true; + for (uint256 j = 0; j < delimiterBytes.length; j++) { + if (i + j >= sourceBytes.length || sourceBytes[i + j] != delimiterBytes[j]) { + found = false; + break; + } + } + + if (found) { + parts[partIndex] = substring(source, startIndex, i); + partIndex++; + startIndex = i + delimiterBytes.length; + i += delimiterBytes.length - 1; + } + } + + return parts; + } + + // Helper function to format token amounts with proper decimals + function formatTokenAmount(uint256 amount, uint8 decimals) internal pure returns (string memory) { + if (amount == 0) return "0"; + + string memory amountStr = vm.toString(amount); + uint256 length = bytes(amountStr).length; + + // Format with proper decimals, showing all digits + if (length <= decimals) { + // Need to pad with leading zeros + string memory zeros = ""; + for (uint256 i = 0; i < decimals - length; i++) { + zeros = string.concat(zeros, "0"); + } + return string.concat("0.", zeros, amountStr); + } else { + // Insert decimal point + uint256 decimalPos = length - decimals; + return string.concat(substring(amountStr, 0, decimalPos), ".", substring(amountStr, decimalPos, length)); + } + } + + // Helper function to format address for display + function formatAddress(address addr) internal pure returns (string memory) { + return vm.toString(addr); + } + + // Helper function to get a substring + function substring(string memory str, uint256 startIndex, uint256 endIndex) internal pure returns (string memory) { + bytes memory strBytes = bytes(str); + bytes memory result = new bytes(endIndex - startIndex); + for (uint256 i = startIndex; i < endIndex; i++) { + result[i - startIndex] = strBytes[i]; + } + return string(result); + } + + // Extract market name from file path + function extractMarketName(string memory fileName) internal pure returns (string memory) { + // Example fileName: eth-mainnet-market-USDC-WBTC@02APR2025.json + // We want to extract: USDC-WBTC@02APR2025 + + string[] memory parts = split(fileName, "market-"); + if (parts.length < 2) return fileName; + + string memory marketPart = parts[1]; + string[] memory jsonParts = split(marketPart, ".json"); + + return jsonParts[0]; + } +} diff --git a/script/CheckOracles.s.sol b/script/CheckOracles.s.sol index cbf6159..6cfad42 100644 --- a/script/CheckOracles.s.sol +++ b/script/CheckOracles.s.sol @@ -73,9 +73,7 @@ contract CheckOracles is Script { oracleAggregator, config.underlyingConfig.tokenAddr, config.underlyingConfig.priceFeedAddr, - config.underlyingConfig.maxPrice, uint32(config.underlyingConfig.heartBeat), - uint32(config.underlyingConfig.backupHeartBeat), "Underlying" ); @@ -96,9 +94,7 @@ contract CheckOracles is Script { oracleAggregator, config.collateralConfig.tokenAddr, config.collateralConfig.priceFeedAddr, - config.collateralConfig.maxPrice, uint32(config.collateralConfig.heartBeat), - uint32(config.collateralConfig.backupHeartBeat), "Collateral" ); @@ -199,9 +195,7 @@ contract CheckOracles is Script { OracleAggregator oracleAggregator, address tokenAddr, address expectedPriceFeedAddr, - int256 expectedMaxPrice, uint32 expectedHeartbeat, - uint32 expectedBackupHeartbeat, string memory tokenType ) internal returns (bool success) { // Create a diagnostic entry in case of error @@ -225,13 +219,8 @@ contract CheckOracles is Script { console.log("--- Checking %s: %s (%s) ---", tokenType, diag.symbol, tokenAddr); // Check if the oracle is configured - ( - AggregatorV3Interface aggregator, - AggregatorV3Interface backupAggregator, - int256 maxPrice, - uint32 heartbeat, - uint32 backupHeartbeat - ) = oracleAggregator.oracles(tokenAddr); + (AggregatorV3Interface aggregator, AggregatorV3Interface backupAggregator, uint32 heartbeat) = + oracleAggregator.oracles(tokenAddr); if (address(aggregator) == address(0)) { console.log("ERROR: No oracle configured for token"); @@ -248,12 +237,6 @@ contract CheckOracles is Script { console.log("WARNING: Configured price feed doesn't match expected"); } - console.log("Max Price: %d", maxPrice); - console.log("Expected: %d", expectedMaxPrice); - if (maxPrice != expectedMaxPrice) { - console.log("WARNING: Configured max price doesn't match expected"); - } - // Check heartbeat console.log("Heartbeat: %s", heartbeat); console.log("Expected: %s", expectedHeartbeat); diff --git a/script/E2ETest.s.sol b/script/E2ETest.s.sol index e54d528..259ccec 100644 --- a/script/E2ETest.s.sol +++ b/script/E2ETest.s.sol @@ -74,7 +74,7 @@ contract E2ETest is Script { address tokenAddr = address(0xE407D6b58f1BaB00DB15a6b164F6e882aB3bb939); IOracle oracle = IOracle(address(0xFBc0A46463645de435012363354f24791789b4D7)); OracleAggregator oracleAggregator = OracleAggregator(address(0xFBc0A46463645de435012363354f24791789b4D7)); - (AggregatorV3Interface aggregator, AggregatorV3Interface backupAggregator,, uint32 heartbeat,) = + (AggregatorV3Interface aggregator, AggregatorV3Interface backupAggregator, uint32 heartbeat) = oracleAggregator.oracles(tokenAddr); console.log(IERC20Metadata(tokenAddr).symbol()); console.log(address(aggregator)); diff --git a/script/SubmitOracles.s.sol b/script/SubmitOracles.s.sol index 1cdff8c..76112eb 100644 --- a/script/SubmitOracles.s.sol +++ b/script/SubmitOracles.s.sol @@ -52,12 +52,14 @@ contract SubmitOracles is Script { OracleAggregator oracle = OracleAggregator(oracleAggregatorAddr); for (uint256 i; i < configs.length; i++) { JsonLoader.Config memory config = configs[i]; - (AggregatorV3Interface aggregator,,,,) = oracle.oracles(address(config.underlyingConfig.tokenAddr)); + (AggregatorV3Interface aggregator, AggregatorV3Interface backupAggregator, uint32 heartbeat) = + oracle.oracles(address(config.underlyingConfig.tokenAddr)); if ( !tokenSubmitted[address(config.underlyingConfig.tokenAddr)] && ( - address(aggregator) == address(0) - || address(aggregator) != address(config.underlyingConfig.priceFeedAddr) + address(aggregator) != address(config.underlyingConfig.priceFeedAddr) + || address(backupAggregator) != address(config.underlyingConfig.backupPriceFeedAddr) + || heartbeat != config.underlyingConfig.heartBeat ) ) { accessManager.submitPendingOracle( @@ -65,10 +67,8 @@ contract SubmitOracles is Script { address(config.underlyingConfig.tokenAddr), IOracle.Oracle( AggregatorV3Interface(config.underlyingConfig.priceFeedAddr), - AggregatorV3Interface(config.underlyingConfig.priceFeedAddr), - config.underlyingConfig.maxPrice, - uint32(config.underlyingConfig.heartBeat), - uint32(config.underlyingConfig.backupHeartBeat) + AggregatorV3Interface(config.underlyingConfig.backupPriceFeedAddr), + uint32(config.underlyingConfig.heartBeat) ) ); tokenSubmitted[address(config.underlyingConfig.tokenAddr)] = true; @@ -77,16 +77,17 @@ contract SubmitOracles is Script { IERC20Metadata(address(config.underlyingConfig.tokenAddr)).symbol() ); console.log("Price feed: ", config.underlyingConfig.priceFeedAddr); + console.log("Backup price feed: ", config.underlyingConfig.backupPriceFeedAddr); console.log("Heartbeat: ", config.underlyingConfig.heartBeat); - console.log("Max price: ", config.underlyingConfig.maxPrice); console.log("--------------------------------"); } - (aggregator,,,,) = oracle.oracles(address(config.collateralConfig.tokenAddr)); + (aggregator, backupAggregator, heartbeat) = oracle.oracles(address(config.collateralConfig.tokenAddr)); if ( !tokenSubmitted[address(config.collateralConfig.tokenAddr)] && ( - address(aggregator) == address(0) - || address(aggregator) != address(config.collateralConfig.priceFeedAddr) + address(aggregator) != address(config.collateralConfig.priceFeedAddr) + || address(backupAggregator) != address(config.collateralConfig.backupPriceFeedAddr) + || heartbeat != config.collateralConfig.heartBeat ) ) { accessManager.submitPendingOracle( @@ -94,10 +95,8 @@ contract SubmitOracles is Script { address(config.collateralConfig.tokenAddr), IOracle.Oracle( AggregatorV3Interface(config.collateralConfig.priceFeedAddr), - AggregatorV3Interface(config.collateralConfig.priceFeedAddr), - config.collateralConfig.maxPrice, - uint32(config.collateralConfig.heartBeat), - uint32(config.collateralConfig.backupHeartBeat) + AggregatorV3Interface(config.collateralConfig.backupPriceFeedAddr), + uint32(config.collateralConfig.heartBeat) ) ); tokenSubmitted[address(config.collateralConfig.tokenAddr)] = true; @@ -106,8 +105,8 @@ contract SubmitOracles is Script { IERC20Metadata(address(config.collateralConfig.tokenAddr)).symbol() ); console.log("Price feed: ", config.collateralConfig.priceFeedAddr); + console.log("Backup price feed: ", config.collateralConfig.backupPriceFeedAddr); console.log("Heartbeat: ", config.collateralConfig.heartBeat); - console.log("Max price: ", config.collateralConfig.maxPrice); console.log("--------------------------------"); } } diff --git a/script/TVLChecker.s.sol b/script/TVLChecker.s.sol new file mode 100644 index 0000000..c1a31c9 --- /dev/null +++ b/script/TVLChecker.s.sol @@ -0,0 +1,780 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {Script} from "forge-std/Script.sol"; +import {console2} from "forge-std/console2.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import {ITermMaxMarket} from "contracts/ITermMaxMarket.sol"; +import {IGearingToken} from "contracts/tokens/IGearingToken.sol"; +import {IMintableERC20} from "contracts/tokens/IMintableERC20.sol"; +import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; +import {IERC4626} from "@openzeppelin/contracts/interfaces/IERC4626.sol"; + +/** + * @title TVLChecker + * @dev Script to check locked amount of underlying and collateral tokens for each market + */ + +// Interface for OracleAggregator +interface IOracleAggregator { + struct Oracle { + AggregatorV3Interface aggregator; + AggregatorV3Interface backupAggregator; + uint32 heartbeat; + } + + function getPrice(address asset) external view returns (uint256 price, uint8 decimals); + function oracles(address asset) + external + view + returns (AggregatorV3Interface aggregator, AggregatorV3Interface backupAggregator, uint32 heartbeat); +} + +contract TVLChecker is Script { + struct MarketTVL { + string marketName; + address market; + address gt; + address ft; + address xt; + address underlying; + address collateral; + string underlyingSymbol; + string collateralSymbol; + uint8 underlyingDecimals; + uint8 collateralDecimals; + uint256 underlyingLocked; // Underlying token locked in market + uint256 collateralLocked; // Collateral token locked in GT + uint256 underlyingPriceUSD; // USD price of underlying token (scaled by price decimals) + uint256 collateralPriceUSD; // USD price of collateral token (scaled by price decimals) + uint8 underlyingPriceDecimals; // Decimals of the underlying price feed + uint8 collateralPriceDecimals; // Decimals of the collateral price feed + } + + struct VaultTVL { + string vaultName; + address vaultAddress; + address assetAddress; + string assetSymbol; + uint8 assetDecimals; + uint256 totalAssets; + uint256 assetPriceUSD; + uint8 assetPriceDecimals; + } + + struct TokenSummary { + address tokenAddress; + string tokenSymbol; + uint8 tokenDecimals; + uint256 totalLocked; + uint256 tokenPriceUSD; + uint8 tokenPriceDecimals; + } + + function run() public { + // Directory to look for deployment files + string memory deploymentDir = "deployments/eth-mainnet-v1.0.8-20250530"; + + // Read oracle aggregator address from core.json + string memory coreJsonPath = string.concat(deploymentDir, "/eth-mainnet-core.json"); + string memory coreJson = vm.readFile(coreJsonPath); + address oracleAggregator = vm.parseJsonAddress(coreJson, ".contracts.oracleAggregator"); + + console2.log("Oracle Aggregator:", formatAddress(oracleAggregator)); + + // First, count the market files to determine array size + uint256 marketCount = countMarketFiles(deploymentDir); + MarketTVL[] memory markets = new MarketTVL[](marketCount); + + // Count vault files + uint256 vaultCount = countVaultFiles(deploymentDir); + VaultTVL[] memory vaults = new VaultTVL[](vaultCount); + + console2.log("====== Checking TVL for ETH Mainnet Markets and Vaults ======"); + console2.log(string.concat("Directory: ", deploymentDir)); + console2.log( + string.concat( + "Found ", vm.toString(marketCount), " market files and ", vm.toString(vaultCount), " vault files" + ) + ); + console2.log("================================================="); + + // Process market files + processMarketFiles(deploymentDir, markets, oracleAggregator); + + // Process vault files + processVaultFiles(deploymentDir, vaults, oracleAggregator); + + // Display results for markets + console2.log("\n====== MARKET TVL SUMMARY ======"); + + uint256 totalUnderlyingValueUSD = 0; + uint256 totalCollateralValueUSD = 0; + + for (uint256 i = 0; i < marketCount; i++) { + MarketTVL memory info = markets[i]; + + // Format balances with proper decimals + string memory formattedUnderlyingLocked = formatTokenAmount(info.underlyingLocked, info.underlyingDecimals); + string memory formattedCollateralLocked = formatTokenAmount(info.collateralLocked, info.collateralDecimals); + + // Calculate USD values with proper decimal adjustment + uint256 underlyingValueUSD = calculateUSDValue( + info.underlyingLocked, info.underlyingDecimals, info.underlyingPriceUSD, info.underlyingPriceDecimals + ); + + uint256 collateralValueUSD = calculateUSDValue( + info.collateralLocked, info.collateralDecimals, info.collateralPriceUSD, info.collateralPriceDecimals + ); + + // Add to totals (normalize to 18 decimals for addition) + totalUnderlyingValueUSD += underlyingValueUSD; + totalCollateralValueUSD += collateralValueUSD; + + // Format USD values as dollars with 2 decimal places + string memory formattedUnderlyingValueUSD = formatUSDValue(underlyingValueUSD); + string memory formattedCollateralValueUSD = formatUSDValue(collateralValueUSD); + + // Display results in the requested format + console2.log("-------------------------------------------------"); + console2.log(string.concat("Market: ", info.marketName)); + console2.log(string.concat("Market address: ", formatAddress(info.market))); + console2.log(string.concat("GT address: ", formatAddress(info.gt))); + console2.log(string.concat("FT address: ", formatAddress(info.ft))); + console2.log(string.concat("XT address: ", formatAddress(info.xt))); + console2.log(string.concat("Underlying address: ", formatAddress(info.underlying))); + console2.log(string.concat("Collateral address: ", formatAddress(info.collateral))); + console2.log(string.concat("Underlying locked: ", formattedUnderlyingLocked, " ", info.underlyingSymbol)); + console2.log(string.concat("Underlying USD value: $", formattedUnderlyingValueUSD)); + console2.log(string.concat("Collateral locked: ", formattedCollateralLocked, " ", info.collateralSymbol)); + console2.log(string.concat("Collateral USD value: $", formattedCollateralValueUSD)); + } + + // Display results for vaults + console2.log("\n====== VAULT TVL SUMMARY ======"); + + uint256 totalVaultValueUSD = 0; + + for (uint256 i = 0; i < vaultCount; i++) { + VaultTVL memory info = vaults[i]; + + // Format asset amount with proper decimals + string memory formattedAssets = formatTokenAmount(info.totalAssets, info.assetDecimals); + + // Calculate USD value + uint256 assetValueUSD = + calculateUSDValue(info.totalAssets, info.assetDecimals, info.assetPriceUSD, info.assetPriceDecimals); + + // Add to total + totalVaultValueUSD += assetValueUSD; + + // Format USD value + string memory formattedAssetValueUSD = formatUSDValue(assetValueUSD); + + // Display results + console2.log("-------------------------------------------------"); + console2.log(string.concat("Vault: ", info.vaultName)); + console2.log(string.concat("Vault address: ", formatAddress(info.vaultAddress))); + console2.log(string.concat("Asset address: ", formatAddress(info.assetAddress))); + console2.log(string.concat("Asset locked: ", formattedAssets, " ", info.assetSymbol)); + console2.log(string.concat("Asset USD value: $", formattedAssetValueUSD)); + } + + // Create and display token summary + console2.log("\n====== TOKEN-BASED TVL SUMMARY ======"); + + // 1. Collect all unique token addresses + address[] memory uniqueTokens = collectUniqueTokens(markets, vaults); + TokenSummary[] memory tokenSummaries = new TokenSummary[](uniqueTokens.length); + + // 2. Initialize token summaries + for (uint256 i = 0; i < uniqueTokens.length; i++) { + TokenSummary memory summary; + summary.tokenAddress = uniqueTokens[i]; + + try IERC20Metadata(uniqueTokens[i]).symbol() returns (string memory symbol) { + summary.tokenSymbol = symbol; + } catch { + summary.tokenSymbol = "Unknown"; + } + + try IERC20Metadata(uniqueTokens[i]).decimals() returns (uint8 decimals) { + summary.tokenDecimals = decimals; + } catch { + summary.tokenDecimals = 18; + } + + // Try to get price from oracle + IOracleAggregator oracle = IOracleAggregator(oracleAggregator); + try oracle.getPrice(uniqueTokens[i]) returns (uint256 price, uint8 decimals) { + summary.tokenPriceUSD = price; + summary.tokenPriceDecimals = decimals; + } catch { + summary.tokenPriceUSD = 0; + summary.tokenPriceDecimals = 8; + } + + tokenSummaries[i] = summary; + } + + // 3. Accumulate locked amounts for each token + for (uint256 i = 0; i < marketCount; i++) { + // Add underlying tokens from markets + for (uint256 j = 0; j < uniqueTokens.length; j++) { + if (markets[i].underlying == uniqueTokens[j]) { + tokenSummaries[j].totalLocked += markets[i].underlyingLocked; + break; + } + } + + // Add collateral tokens from markets + for (uint256 j = 0; j < uniqueTokens.length; j++) { + if (markets[i].collateral == uniqueTokens[j]) { + tokenSummaries[j].totalLocked += markets[i].collateralLocked; + break; + } + } + } + + // Add assets from vaults + for (uint256 i = 0; i < vaultCount; i++) { + for (uint256 j = 0; j < uniqueTokens.length; j++) { + if (vaults[i].assetAddress == uniqueTokens[j]) { + tokenSummaries[j].totalLocked += vaults[i].totalAssets; + break; + } + } + } + + // 4. Display token summaries + uint256 totalTokenValueUSD = 0; + + for (uint256 i = 0; i < tokenSummaries.length; i++) { + TokenSummary memory summary = tokenSummaries[i]; + + // Skip tokens with zero balance + if (summary.totalLocked == 0) continue; + + // Format amount with proper decimals + string memory formattedAmount = formatTokenAmount(summary.totalLocked, summary.tokenDecimals); + + // Calculate USD value + uint256 tokenValueUSD = calculateUSDValue( + summary.totalLocked, summary.tokenDecimals, summary.tokenPriceUSD, summary.tokenPriceDecimals + ); + + totalTokenValueUSD += tokenValueUSD; + string memory formattedTokenValueUSD = formatUSDValue(tokenValueUSD); + + // Display the token summary + console2.log("-------------------------------------------------"); + console2.log(string.concat("Token: ", summary.tokenSymbol)); + console2.log(string.concat("Address: ", formatAddress(summary.tokenAddress))); + console2.log(string.concat("Total locked: ", formattedAmount, " ", summary.tokenSymbol)); + console2.log(string.concat("USD value: $", formattedTokenValueUSD)); + } + + // Display grand totals + string memory formattedTotalUnderlyingUSD = formatUSDValue(totalUnderlyingValueUSD); + string memory formattedTotalCollateralUSD = formatUSDValue(totalCollateralValueUSD); + string memory formattedTotalVaultUSD = formatUSDValue(totalVaultValueUSD); + string memory formattedGrandTotalTVL = + formatUSDValue(totalUnderlyingValueUSD + totalCollateralValueUSD + totalVaultValueUSD); + + console2.log("\n====== TOTAL TVL SUMMARY ======"); + console2.log("-------------------------------------------------"); + console2.log(string.concat("Total Market Underlying USD Value: $", formattedTotalUnderlyingUSD)); + console2.log(string.concat("Total Market Collateral USD Value: $", formattedTotalCollateralUSD)); + console2.log(string.concat("Total Vault USD Value: $", formattedTotalVaultUSD)); + console2.log(string.concat("GRAND TOTAL TVL: $", formattedGrandTotalTVL)); + console2.log("-------------------------------------------------"); + } + + // Collect unique token addresses from markets and vaults + function collectUniqueTokens(MarketTVL[] memory markets, VaultTVL[] memory vaults) + internal + pure + returns (address[] memory) + { + // First, count the maximum possible unique tokens (2 per market + 1 per vault) + uint256 maxUniqueTokens = markets.length * 2 + vaults.length; + address[] memory tempTokens = new address[](maxUniqueTokens); + uint256 uniqueCount = 0; + + // Add market tokens (underlying and collateral) + for (uint256 i = 0; i < markets.length; i++) { + // Add underlying token if not already in the list + bool foundUnderlying = false; + for (uint256 j = 0; j < uniqueCount; j++) { + if (tempTokens[j] == markets[i].underlying) { + foundUnderlying = true; + break; + } + } + if (!foundUnderlying && markets[i].underlying != address(0)) { + tempTokens[uniqueCount] = markets[i].underlying; + uniqueCount++; + } + + // Add collateral token if not already in the list + bool foundCollateral = false; + for (uint256 j = 0; j < uniqueCount; j++) { + if (tempTokens[j] == markets[i].collateral) { + foundCollateral = true; + break; + } + } + if (!foundCollateral && markets[i].collateral != address(0)) { + tempTokens[uniqueCount] = markets[i].collateral; + uniqueCount++; + } + } + + // Add vault asset tokens + for (uint256 i = 0; i < vaults.length; i++) { + bool foundAsset = false; + for (uint256 j = 0; j < uniqueCount; j++) { + if (tempTokens[j] == vaults[i].assetAddress) { + foundAsset = true; + break; + } + } + if (!foundAsset && vaults[i].assetAddress != address(0)) { + tempTokens[uniqueCount] = vaults[i].assetAddress; + uniqueCount++; + } + } + + // Create correctly sized array with unique tokens + address[] memory uniqueTokens = new address[](uniqueCount); + for (uint256 i = 0; i < uniqueCount; i++) { + uniqueTokens[i] = tempTokens[i]; + } + + return uniqueTokens; + } + + // Calculate USD value from token amount and price + function calculateUSDValue(uint256 tokenAmount, uint8 tokenDecimals, uint256 tokenPrice, uint8 priceDecimals) + internal + pure + returns (uint256) + { + if (tokenAmount == 0 || tokenPrice == 0) return 0; + + // Convert to 18 decimal standard for consistency + uint256 normalizedAmount; + if (tokenDecimals < 18) { + normalizedAmount = tokenAmount * 10 ** (18 - tokenDecimals); + } else if (tokenDecimals > 18) { + normalizedAmount = tokenAmount / 10 ** (tokenDecimals - 18); + } else { + normalizedAmount = tokenAmount; + } + + // Scale price to 18 decimals + uint256 normalizedPrice; + if (priceDecimals < 18) { + normalizedPrice = tokenPrice * 10 ** (18 - priceDecimals); + } else if (priceDecimals > 18) { + normalizedPrice = tokenPrice / 10 ** (priceDecimals - 18); + } else { + normalizedPrice = tokenPrice; + } + + // Calculate value and return with 18 decimals precision + return (normalizedAmount * normalizedPrice) / 10 ** 18; + } + + // Format USD value as string with 2 decimal places + function formatUSDValue(uint256 valueUSD) internal pure returns (string memory) { + // Convert to dollars with 2 decimal places (USD value is in 18 decimals) + uint256 dollars = valueUSD / 10 ** 16; // Get dollars with 2 decimal places + string memory integerPart = vm.toString(dollars / 100); + uint256 fractionalPart = dollars % 100; + + // Ensure fractional part has leading zeros + string memory fractionalStr; + if (fractionalPart < 10) { + fractionalStr = string.concat("0", vm.toString(fractionalPart)); + } else { + fractionalStr = vm.toString(fractionalPart); + } + + return string.concat(integerPart, ".", fractionalStr); + } + + // Count how many market files are in the directory + function countMarketFiles(string memory deploymentDir) internal returns (uint256) { + string[] memory inputs = new string[](3); + inputs[0] = "ls"; + inputs[1] = "-1"; // One file per line + inputs[2] = deploymentDir; + + bytes memory result = vm.ffi(inputs); + string memory fileList = string(result); + + string[] memory files = split(fileList, "\n"); + uint256 marketCount = 0; + + for (uint256 i = 0; i < files.length; i++) { + if (contains(files[i], "market-") && contains(files[i], ".json")) { + marketCount++; + } + } + return marketCount; + } + + // Count how many vault files are in the directory + function countVaultFiles(string memory deploymentDir) internal returns (uint256) { + string[] memory inputs = new string[](3); + inputs[0] = "ls"; + inputs[1] = "-1"; // One file per line + inputs[2] = deploymentDir; + + bytes memory result = vm.ffi(inputs); + string memory fileList = string(result); + + string[] memory files = split(fileList, "\n"); + uint256 vaultCount = 0; + + for (uint256 i = 0; i < files.length; i++) { + if (contains(files[i], "vault-") && contains(files[i], ".json") && !contains(files[i], "factory")) { + vaultCount++; + } + } + return vaultCount; + } + + // Process market files and extract TVL information + function processMarketFiles(string memory deploymentDir, MarketTVL[] memory markets, address oracleAggregator) + internal + { + string[] memory inputs = new string[](3); + inputs[0] = "ls"; + inputs[1] = "-1"; // One file per line + inputs[2] = deploymentDir; + + bytes memory result = vm.ffi(inputs); + string memory fileList = string(result); + + string[] memory files = split(fileList, "\n"); + uint256 marketIndex = 0; + + for (uint256 i = 0; i < files.length; i++) { + if (contains(files[i], "market-") && contains(files[i], ".json")) { + string memory filePath = string.concat(deploymentDir, "/", files[i]); + string memory jsonContent = vm.readFile(filePath); + + // Extract market name from file path + markets[marketIndex].marketName = extractMarketName(files[i]); + + // Extract addresses from JSON + markets[marketIndex].market = vm.parseJsonAddress(jsonContent, ".market"); + markets[marketIndex].underlying = vm.parseJsonAddress(jsonContent, ".underlying.address"); + markets[marketIndex].collateral = vm.parseJsonAddress(jsonContent, ".collateral.address"); + markets[marketIndex].ft = vm.parseJsonAddress(jsonContent, ".tokens.ft"); + markets[marketIndex].xt = vm.parseJsonAddress(jsonContent, ".tokens.xt"); + markets[marketIndex].gt = vm.parseJsonAddress(jsonContent, ".tokens.gt"); + + // Get token symbols and decimals + try IERC20Metadata(markets[marketIndex].underlying).symbol() returns (string memory symbol) { + markets[marketIndex].underlyingSymbol = symbol; + } catch { + markets[marketIndex].underlyingSymbol = "Unknown"; + } + + try IERC20Metadata(markets[marketIndex].collateral).symbol() returns (string memory symbol) { + markets[marketIndex].collateralSymbol = symbol; + } catch { + markets[marketIndex].collateralSymbol = "Unknown"; + } + + try IERC20Metadata(markets[marketIndex].underlying).decimals() returns (uint8 decimals) { + markets[marketIndex].underlyingDecimals = decimals; + } catch { + markets[marketIndex].underlyingDecimals = 18; + } + + try IERC20Metadata(markets[marketIndex].collateral).decimals() returns (uint8 decimals) { + markets[marketIndex].collateralDecimals = decimals; + } catch { + markets[marketIndex].collateralDecimals = 18; + } + + // Check locked balances + try IERC20(markets[marketIndex].underlying).balanceOf(markets[marketIndex].market) returns ( + uint256 balance + ) { + markets[marketIndex].underlyingLocked = balance; + } catch { + console2.log( + string.concat( + "Error: Could not fetch underlying balance for market ", + formatAddress(markets[marketIndex].market) + ) + ); + } + + try IERC20(markets[marketIndex].collateral).balanceOf(markets[marketIndex].gt) returns (uint256 balance) + { + markets[marketIndex].collateralLocked = balance; + } catch { + console2.log( + string.concat( + "Error: Could not fetch collateral balance for GT ", formatAddress(markets[marketIndex].gt) + ) + ); + } + + // Get token prices from oracle aggregator + IOracleAggregator oracle = IOracleAggregator(oracleAggregator); + + try oracle.getPrice(markets[marketIndex].underlying) returns (uint256 price, uint8 decimals) { + markets[marketIndex].underlyingPriceUSD = price; + markets[marketIndex].underlyingPriceDecimals = decimals; + } catch { + console2.log( + string.concat( + "Error: Could not fetch underlying price for ", markets[marketIndex].underlyingSymbol + ) + ); + // Set defaults + markets[marketIndex].underlyingPriceUSD = 0; + markets[marketIndex].underlyingPriceDecimals = 8; // Default Chainlink decimals + } + + try oracle.getPrice(markets[marketIndex].collateral) returns (uint256 price, uint8 decimals) { + markets[marketIndex].collateralPriceUSD = price; + markets[marketIndex].collateralPriceDecimals = decimals; + } catch { + console2.log( + string.concat( + "Error: Could not fetch collateral price for ", markets[marketIndex].collateralSymbol + ) + ); + // Set defaults + markets[marketIndex].collateralPriceUSD = 0; + markets[marketIndex].collateralPriceDecimals = 8; // Default Chainlink decimals + } + + marketIndex++; + } + } + } + + // Process vault files and extract TVL information + function processVaultFiles(string memory deploymentDir, VaultTVL[] memory vaults, address oracleAggregator) + internal + { + string[] memory inputs = new string[](3); + inputs[0] = "ls"; + inputs[1] = "-1"; // One file per line + inputs[2] = deploymentDir; + + bytes memory result = vm.ffi(inputs); + string memory fileList = string(result); + + string[] memory files = split(fileList, "\n"); + uint256 vaultIndex = 0; + + for (uint256 i = 0; i < files.length; i++) { + if (contains(files[i], "vault-") && contains(files[i], ".json") && !contains(files[i], "factory")) { + string memory filePath = string.concat(deploymentDir, "/", files[i]); + string memory jsonContent = vm.readFile(filePath); + + // Extract vault name from file path + vaults[vaultIndex].vaultName = extractVaultName(files[i]); + + // Extract addresses from JSON + vaults[vaultIndex].vaultAddress = vm.parseJsonAddress(jsonContent, ".vaultInfo.address"); + vaults[vaultIndex].assetAddress = vm.parseJsonAddress(jsonContent, ".vaultInfo.asset"); + + // Get token symbol and decimals + try IERC20Metadata(vaults[vaultIndex].assetAddress).symbol() returns (string memory symbol) { + vaults[vaultIndex].assetSymbol = symbol; + } catch { + vaults[vaultIndex].assetSymbol = "Unknown"; + } + + try IERC20Metadata(vaults[vaultIndex].assetAddress).decimals() returns (uint8 decimals) { + vaults[vaultIndex].assetDecimals = decimals; + } catch { + vaults[vaultIndex].assetDecimals = 18; + } + + // Get asset balance of the vault using balanceOf instead of totalAssets + // try IERC4626(vaults[vaultIndex].vaultAddress).totalAssets() returns (uint256 balance) { + try IERC20(vaults[vaultIndex].assetAddress).balanceOf(vaults[vaultIndex].vaultAddress) returns ( + uint256 balance + ) { + vaults[vaultIndex].totalAssets = balance; + } catch { + console2.log( + string.concat( + "Error: Could not fetch asset balance for vault ", + formatAddress(vaults[vaultIndex].vaultAddress) + ) + ); + } + + // Get asset price from oracle aggregator + IOracleAggregator oracle = IOracleAggregator(oracleAggregator); + + try oracle.getPrice(vaults[vaultIndex].assetAddress) returns (uint256 price, uint8 decimals) { + vaults[vaultIndex].assetPriceUSD = price; + vaults[vaultIndex].assetPriceDecimals = decimals; + } catch { + console2.log(string.concat("Error: Could not fetch price for ", vaults[vaultIndex].assetSymbol)); + // Set defaults + vaults[vaultIndex].assetPriceUSD = 0; + vaults[vaultIndex].assetPriceDecimals = 8; // Default Chainlink decimals + } + + vaultIndex++; + } + } + } + + // Check if a string contains a substring + function contains(string memory source, string memory target) internal pure returns (bool) { + bytes memory sourceBytes = bytes(source); + bytes memory targetBytes = bytes(target); + + if (targetBytes.length > sourceBytes.length) { + return false; + } + + for (uint256 i = 0; i <= sourceBytes.length - targetBytes.length; i++) { + bool found = true; + for (uint256 j = 0; j < targetBytes.length; j++) { + if (sourceBytes[i + j] != targetBytes[j]) { + found = false; + break; + } + } + if (found) { + return true; + } + } + return false; + } + + // Split a string by delimiter + function split(string memory source, string memory delimiter) internal pure returns (string[] memory) { + bytes memory sourceBytes = bytes(source); + bytes memory delimiterBytes = bytes(delimiter); + + // Count occurrences of delimiter + uint256 count = 1; // At least one item + for (uint256 i = 0; i < sourceBytes.length - delimiterBytes.length + 1; i++) { + bool found = true; + for (uint256 j = 0; j < delimiterBytes.length; j++) { + if (sourceBytes[i + j] != delimiterBytes[j]) { + found = false; + break; + } + } + if (found) { + count++; + i += delimiterBytes.length - 1; + } + } + + // Split the string + string[] memory parts = new string[](count); + uint256 partIndex = 0; + uint256 startIndex = 0; + + for (uint256 i = 0; i <= sourceBytes.length - delimiterBytes.length + 1; i++) { + if (i == sourceBytes.length - delimiterBytes.length + 1) { + // Add the last part + parts[partIndex] = substring(source, startIndex, sourceBytes.length); + break; + } + + bool found = true; + for (uint256 j = 0; j < delimiterBytes.length; j++) { + if (i + j >= sourceBytes.length || sourceBytes[i + j] != delimiterBytes[j]) { + found = false; + break; + } + } + + if (found) { + parts[partIndex] = substring(source, startIndex, i); + partIndex++; + startIndex = i + delimiterBytes.length; + i += delimiterBytes.length - 1; + } + } + + return parts; + } + + // Helper function to format token amounts with proper decimals + function formatTokenAmount(uint256 amount, uint8 decimals) internal pure returns (string memory) { + if (amount == 0) return "0"; + + string memory amountStr = vm.toString(amount); + uint256 length = bytes(amountStr).length; + + // Format with proper decimals, showing all digits + if (length <= decimals) { + // Need to pad with leading zeros + string memory zeros = ""; + for (uint256 i = 0; i < decimals - length; i++) { + zeros = string.concat(zeros, "0"); + } + return string.concat("0.", zeros, amountStr); + } else { + // Insert decimal point + uint256 decimalPos = length - decimals; + return string.concat(substring(amountStr, 0, decimalPos), ".", substring(amountStr, decimalPos, length)); + } + } + + // Helper function to format address for display + function formatAddress(address addr) internal pure returns (string memory) { + return vm.toString(addr); + } + + // Helper function to get a substring + function substring(string memory str, uint256 startIndex, uint256 endIndex) internal pure returns (string memory) { + bytes memory strBytes = bytes(str); + bytes memory result = new bytes(endIndex - startIndex); + for (uint256 i = startIndex; i < endIndex; i++) { + result[i - startIndex] = strBytes[i]; + } + return string(result); + } + + // Extract market name from file path + function extractMarketName(string memory fileName) internal pure returns (string memory) { + // Example fileName: eth-mainnet-market-USDC-WBTC@30MAY2025.json + // We want to extract: USDC-WBTC@30MAY2025 + + string[] memory parts = split(fileName, "market-"); + if (parts.length < 2) return fileName; + + string memory marketPart = parts[1]; + string[] memory jsonParts = split(marketPart, ".json"); + + return jsonParts[0]; + } + + // Extract vault name from file path + function extractVaultName(string memory fileName) internal pure returns (string memory) { + // Example fileName: eth-mainnet-vault-TMX-WETH.json + // We want to extract: TMX-WETH + + string[] memory parts = split(fileName, "vault-"); + if (parts.length < 2) return fileName; + + string memory vaultPart = parts[1]; + string[] memory jsonParts = split(vaultPart, ".json"); + + return jsonParts[0]; + } +} diff --git a/script/UpdateMarketFee_20250513.s.sol b/script/UpdateMarketFee_20250513.s.sol new file mode 100644 index 0000000..01bffc0 --- /dev/null +++ b/script/UpdateMarketFee_20250513.s.sol @@ -0,0 +1,184 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {Script} from "forge-std/Script.sol"; +import {console} from "forge-std/console.sol"; +import {IGearingToken} from "contracts/tokens/IGearingToken.sol"; +import {PendleSwapV3Adapter} from "contracts/router/swapAdapters/PendleSwapV3Adapter.sol"; +import {ITermMaxVault} from "contracts/vault/ITermMaxVault.sol"; +import {ITermMaxMarket, MarketConfig} from "contracts/ITermMaxMarket.sol"; +import {StringHelper} from "./utils/StringHelper.sol"; + +interface IAccessManager { + function updateMarketConfig(ITermMaxMarket market, MarketConfig calldata newConfig) external; +} + +/// @title update market configs +/// @author evan +/// @notice +contract UpdateMarket is Script { + // Network-specific config loaded from environment variables + string network; + + address[] eth_stableCoinMarkets = [ + 0x03f2Af12aE4eb5533c3f7773BE826e8da56F6E1a, + 0x1A69127188B72A155165255270017b4c78f31b88, + 0x22Cd4c59eD4bb2ad852892518073056441c55BFE, + 0x2524D9a55C2D18A3F257A7F67AfD552B285de34E, + 0x403863917316Bf8AA1966F9D90b393Cec98F991b, + 0x6f5c8838E618448e43385E4C401006822Aa15142, + 0x7526D036cDDbD3bdFDd8370D75304b822740b291, + 0x988a287c4340B18665cC5E128DC76906A5C839e6, + 0x9904F3b879385033faa31B50d1D63cb80b3495A3, + 0xCE511791715D1A84cD2f7BfA279F92c187bb9d93, + 0xd017E469d22AB7FfB097b9aA329391874954523b, + 0xd699EFC4162d76BfD3cB553D65f850c882C29F5F, + 0xdBB2D44c238c459cCB820De886ABF721EF6E6941, + 0xe867255dC0c3a27c90f756ECC566a5292ce19492, + 0xEd7cD45E5e6ef68261929B58539805bA3c061f14, + 0xf4924D6189552ae5A7818088dA6f23Bd33281C1b, + 0x8d501c7640595EC9D2A39Fbd30dED7672e9631BD, + 0xa1ed39C786eea298925DD6FcC33199C3fF06765E, + 0x37877773B1289c27Bb6159b86613Efd0d15cADaE + ]; + address[] eth_unstableCoinMarkets = [ + 0x0B7eFE5DE3c3B5d75de33e25965b193d6Ba79f52, + 0x484CDece3FC951a7D009b9dBAC66EC287eC1f58e, + 0x918D8Ecba4C683EF3004b1C313cfEF5e3b9E1146, + 0xaBE8ab2223c846466Eb30f5137A7f05106c9d0c4, + 0xb9919eE2169a7dA664AD024C6dDCF0ccD4121C26, + 0xBebB5CEe893110cF477901AF7FA94E4840606421, + 0xc68a2fbD7cb560c71CcAfbDeE971824Ed9bF4556, + 0xC898Fa3A26CEAcAE25cCffF6003B087948dEDE2a, + 0xD316d4494c840F8A758FB6184e9b60281e35cC02, + 0xf0dE37189366F0f3AAe2795160763F3F34797B11 + ]; + address eth_accessManagerAddr = 0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF; + + address[] arb_stableCoinMarkets = [ + 0x0b91Cd4e86F0DBBbB2c37c384e1fA91B9a5A3220, + 0x10Af30e205Da0fFc594433BB87e41039be5d1f01, + 0x49E11668EAc15896ecF5B31baeF63C98897D4263, + 0x58C4d4688E0Bc92eF8d81fb963Bca2EaA5DFc31C, + 0x59e3D532727221ac3aeE2D6303cf3C39F1De65D7, + 0x63765e904777E0e13F0cE46A63B2feCf920681aA, + 0x79A4963f8b2f8d997908615352A44192Bc3D23e7, + 0xC62B23864c1e909868471bf72Cc457397BC52E13 + ]; + address[] arb_unstableCoinMarkets = [ + 0x2706f663C6e6a0AF2e1c16f7e0d2CcC85758d92c, + 0x4B66219eCcE3AD157A31B9E584beFDc798b556A1, + 0xA016DecA4AbdB8fd94BC221a5feB15BA3DB62031, + 0xa93A81835DAb4AC07649506B88AF7eE6DDaD03Ba, + 0xcc60D097222f45538159D43681FBa4B1fD37DE97 + ]; + address arb_accessManagerAddr = 0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c; + + uint32 ref_stable = 0.06e8; + uint32 ref_unstable = 0.03e8; + // uint32 mint_gt_fee_stable = 0.1e8; + // uint32 mint_gt_fee_unstable = 0.1e8; + + uint256 operatorPrivateKey; + address operator; + + function setUp() public { + // Load network from environment variable + network = vm.envString("NETWORK"); + string memory networkUpper = StringHelper.toUpper(network); + + // Load network-specific configuration + string memory operatorPrivateKeyPrivateKeyVar = string.concat(networkUpper, "_OPERATOR_PRIVATE_KEY"); + + operatorPrivateKey = vm.envUint(operatorPrivateKeyPrivateKeyVar); + operator = vm.addr(operatorPrivateKey); + } + + function run() public { + if (keccak256(abi.encodePacked(network)) == keccak256(abi.encodePacked("eth-mainnet"))) { + updateEth(); + } else if (keccak256(abi.encodePacked(network)) == keccak256(abi.encodePacked("arb-mainnet"))) { + updateArb(); + } + } + + function updateArb() internal { + console.log("=== Configuration ==="); + console.log("Network:", network); + console.log("Operator:", operator); + console.log("AccessManager:", arb_accessManagerAddr); + console.log(""); + + console.log("=== Update markets fees ==="); + + vm.startBroadcast(operatorPrivateKey); + IAccessManager accessManager = IAccessManager(arb_accessManagerAddr); + + for (uint256 i = 0; i < arb_stableCoinMarkets.length; i++) { + address market = arb_stableCoinMarkets[i]; + ITermMaxMarket termMaxMarket = ITermMaxMarket(market); + MarketConfig memory config = termMaxMarket.config(); + + config.feeConfig.mintGtFeeRef = ref_stable; + // config.feeConfig.mintGtFeeRatio = mint_gt_fee_stable; + accessManager.updateMarketConfig(termMaxMarket, config); + config = termMaxMarket.config(); + console.log("market", market); + console.log("mintGtFeeRef", config.feeConfig.mintGtFeeRef); + } + + for (uint256 i = 0; i < arb_unstableCoinMarkets.length; i++) { + address market = arb_unstableCoinMarkets[i]; + ITermMaxMarket termMaxMarket = ITermMaxMarket(market); + MarketConfig memory config = termMaxMarket.config(); + + config.feeConfig.mintGtFeeRef = ref_unstable; + // config.feeConfig.mintGtFeeRatio = mint_gt_fee_unstable; + accessManager.updateMarketConfig(termMaxMarket, config); + config = termMaxMarket.config(); + console.log("market", market); + console.log("mintGtFeeRef", config.feeConfig.mintGtFeeRef); + } + vm.stopBroadcast(); + } + + function updateEth() internal { + console.log("=== Configuration ==="); + console.log("Network:", network); + console.log("Operator:", operator); + console.log("AccessManager:", eth_accessManagerAddr); + console.log(""); + + console.log("=== Update markets fees ==="); + + vm.startBroadcast(operatorPrivateKey); + IAccessManager accessManager = IAccessManager(eth_accessManagerAddr); + + for (uint256 i = 0; i < eth_stableCoinMarkets.length; i++) { + address market = eth_stableCoinMarkets[i]; + ITermMaxMarket termMaxMarket = ITermMaxMarket(market); + MarketConfig memory config = termMaxMarket.config(); + + config.feeConfig.mintGtFeeRef = ref_stable; + // config.feeConfig.mintGtFeeRatio = mint_gt_fee_stable; + accessManager.updateMarketConfig(termMaxMarket, config); + config = termMaxMarket.config(); + console.log("market", market); + console.log("mintGtFeeRef", config.feeConfig.mintGtFeeRef); + } + + for (uint256 i = 0; i < eth_unstableCoinMarkets.length; i++) { + address market = eth_unstableCoinMarkets[i]; + ITermMaxMarket termMaxMarket = ITermMaxMarket(market); + MarketConfig memory config = termMaxMarket.config(); + + config.feeConfig.mintGtFeeRef = ref_unstable; + // config.feeConfig.mintGtFeeRatio = mint_gt_fee_unstable; + accessManager.updateMarketConfig(termMaxMarket, config); + config = termMaxMarket.config(); + console.log("market", market); + console.log("mintGtFeeRef", config.feeConfig.mintGtFeeRef); + } + vm.stopBroadcast(); + } +} diff --git a/script/UpdateSingleGTCapacity.s.sol b/script/UpdateSingleGTCapacity.s.sol new file mode 100644 index 0000000..4078901 --- /dev/null +++ b/script/UpdateSingleGTCapacity.s.sol @@ -0,0 +1,145 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {Script} from "forge-std/Script.sol"; +import {console2} from "forge-std/console2.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; + +// Interface for the Access Manager +interface IAccessManager { + function updateGtConfig(address market, bytes memory configData) external; + function CONFIGURATOR_ROLE() external view returns (bytes32); + function hasRole(bytes32 role, address account) external view returns (bool); +} + +// Interface for TermMax Market +interface ITermMaxMarket { + function tokens() external view returns (IERC20, IERC20, address, address, IERC20); +} + +// Interface for Gearing Token +interface IGearingToken { + function collateralCapacity() external view returns (uint256); +} + +/** + * @title UpdateSingleGTCapacity + * @notice Forge script to update a single GT collateral capacity through the access manager using global variables + * @dev All configuration values (addresses, new capacity) are set as global variables in the script + */ +contract UpdateSingleGTCapacity is Script { + // CONFIGURATION - Update these values before running the script + // =============================================================== + + // The address of the AccessManager contract + address public constant ACCESS_MANAGER_ADDRESS = 0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF; // Mainnet + + // The address of the Market contract to update + address public constant MARKET_ADDRESS = 0x9D7386F68d9001a809860B4D88EC8E2cc3DD81B0; // Example - Replace with actual market address + + // The new collateral capacity value (in wei) to set for the GT + uint256 public constant NEW_GT_CAPACITY = 5000000e18; // Example: 1,000,000 tokens with 18 decimals + + // Private key environment variable name + string public constant PRIVATE_KEY_ENV_VAR = "ETH_MAINNET_DEPLOYER_PRIVATE_KEY"; + // =============================================================== + + function setUp() public { + // Nothing to set up + } + + function run() public { + // Validate configuration + require(ACCESS_MANAGER_ADDRESS != address(0), "Access Manager address not set"); + require(MARKET_ADDRESS != address(0), "Market address not set"); + require(NEW_GT_CAPACITY > 0, "New capacity must be greater than 0"); + + // Load private key for transaction signing + uint256 deployerPrivateKey = vm.envUint(PRIVATE_KEY_ENV_VAR); + address deployer = vm.addr(deployerPrivateKey); + + // Print script configuration + printConfiguration(deployer); + + // Check if deployer has configurator role + IAccessManager accessManager = IAccessManager(ACCESS_MANAGER_ADDRESS); + bytes32 configuratorRole = accessManager.CONFIGURATOR_ROLE(); + bool hasRole = accessManager.hasRole(configuratorRole, deployer); + + if (!hasRole) { + console2.log("ERROR: Deployer does not have CONFIGURATOR_ROLE. Cannot update GT config."); + return; + } + + // Get GT contract address from market + ITermMaxMarket market = ITermMaxMarket(MARKET_ADDRESS); + address gtAddress; + try market.tokens() returns (IERC20 ft, IERC20 xt, address gt, address collateralAddr, IERC20 underlying) { + gtAddress = gt; + console2.log(string.concat("GT Name: ", IERC20Metadata(gtAddress).name())); + console2.log(string.concat("GT Address: ", vm.toString(gtAddress))); + console2.log(string.concat("Collateral Address: ", vm.toString(collateralAddr))); + console2.log(string.concat("Underlying Address: ", vm.toString(address(underlying)))); + } catch { + console2.log("ERROR: Failed to get token addresses from market."); + return; + } + + // Get current collateral capacity for comparison + IGearingToken gt = IGearingToken(gtAddress); + uint256 currentCapacity; + try gt.collateralCapacity() returns (uint256 capacity) { + currentCapacity = capacity; + console2.log(string.concat("Current GT capacity: ", vm.toString(currentCapacity))); + } catch { + console2.log("WARNING: Could not retrieve current capacity (continuing anyway)"); + } + + // Encode new capacity as config data + bytes memory configData = abi.encode(NEW_GT_CAPACITY); + + // Start broadcasting transactions + vm.startBroadcast(deployerPrivateKey); + + // Update GT config through access manager + try accessManager.updateGtConfig(MARKET_ADDRESS, configData) { + console2.log("Successfully sent updateGtConfig transaction."); + } catch Error(string memory reason) { + console2.log(string.concat("Failed to update GT config: ", reason)); + vm.stopBroadcast(); + return; + } catch { + console2.log("Failed to update GT config: Unknown error"); + vm.stopBroadcast(); + return; + } + + vm.stopBroadcast(); + + // Verify the update (this will only work with local simulations or --slow flag) + try gt.collateralCapacity() returns (uint256 updatedCapacity) { + console2.log(string.concat("Updated GT capacity: ", vm.toString(updatedCapacity))); + if (updatedCapacity == NEW_GT_CAPACITY) { + console2.log("[SUCCESS] GT collateral capacity successfully updated!"); + } else { + console2.log( + "[WARNING] Note: Updated capacity doesn't match specified capacity. This may be normal if verifying against a fork." + ); + } + } catch { + console2.log( + "Note: Could not verify the updated capacity. This is normal when broadcasting to live networks." + ); + } + } + + function printConfiguration(address deployer) internal view { + console2.log("=== Update Single GT Capacity Configuration ==="); + console2.log(string.concat("Access Manager: ", vm.toString(ACCESS_MANAGER_ADDRESS))); + console2.log(string.concat("Market Address: ", vm.toString(MARKET_ADDRESS))); + console2.log(string.concat("New GT Capacity: ", vm.toString(NEW_GT_CAPACITY))); + console2.log(string.concat("Deployer: ", vm.toString(deployer))); + console2.log("=============================================="); + } +} diff --git a/script/convertMarketConfigs.ts b/script/convertMarketConfigs.ts index b4b223d..e4bf93f 100644 --- a/script/convertMarketConfigs.ts +++ b/script/convertMarketConfigs.ts @@ -43,19 +43,21 @@ const records = parse(csvContent, { case 13: return 'underlyingTokenAddr'; case 14: return 'underlyingPriceFeedAddr'; case 15: return 'underlyingHeartBeat'; - case 16: return 'underlyingName'; - case 17: return 'underlyingSymbol'; - case 18: return 'underlyingDecimals'; - case 19: return 'underlyingInitialPrice'; - case 20: return 'collateralTokenAddr'; - case 21: return 'collateralPriceFeedAddr'; - case 22: return 'collateralHeartBeat'; - case 23: return 'collateralName'; - case 24: return 'collateralSymbol'; - case 25: return 'collateralDecimals'; - case 26: return 'collateralInitialPrice'; - case 27: return 'gtKeyIdentifier'; - // Skip the note column (28) by not mapping it + case 16: return 'underlyingBackupPriceFeedAddr'; + case 17: return 'underlyingName'; + case 18: return 'underlyingSymbol'; + case 19: return 'underlyingDecimals'; + case 20: return 'underlyingInitialPrice'; + case 21: return 'collateralTokenAddr'; + case 22: return 'collateralPriceFeedAddr'; + case 23: return 'collateralHeartBeat'; + case 24: return 'collateralBackupPriceFeedAddr'; + case 25: return 'collateralName'; + case 26: return 'collateralSymbol'; + case 27: return 'collateralDecimals'; + case 28: return 'collateralInitialPrice'; + case 29: return 'gtKeyIdentifier'; + // Skip the note column (30) by not mapping it default: return `column${index}`; } }); @@ -114,6 +116,7 @@ records.forEach((record: any, index: number) => { underlyingConfig: { tokenAddr: record['underlyingTokenAddr'] || '', priceFeedAddr: record['underlyingPriceFeedAddr'] || '', + backupPriceFeedAddr: record['underlyingBackupPriceFeedAddr'] || '', heartBeat: record['underlyingHeartBeat'] || '86400', name: record['underlyingName'] || '', symbol: record['underlyingSymbol'] || '', @@ -123,6 +126,7 @@ records.forEach((record: any, index: number) => { collateralConfig: { tokenAddr: record['collateralTokenAddr'] || '', priceFeedAddr: record['collateralPriceFeedAddr'] || '', + backupPriceFeedAddr: record['collateralBackupPriceFeedAddr'] || '', heartBeat: record['collateralHeartBeat'] || '3600', name: record['collateralName'] || '', symbol: record['collateralSymbol'] || '', @@ -153,7 +157,9 @@ records.forEach((record: any, index: number) => { console.log('Processed market data:', marketData); console.log('Price Feed Addresses:'); console.log(`Underlying Price Feed: ${record['underlyingPriceFeedAddr']}`); + console.log(`Underlying Backup Price Feed: ${record['underlyingBackupPriceFeedAddr']}`); console.log(`Collateral Price Feed: ${record['collateralPriceFeedAddr']}`); + console.log(`Collateral Backup Price Feed: ${record['collateralBackupPriceFeedAddr']}`); console.log('Heartbeat Values:'); console.log(`Underlying Heartbeat: ${record['underlyingHeartBeat'] || '86400'} (default: 86400 if not specified)`); console.log(`Collateral Heartbeat: ${record['collateralHeartBeat'] || '3600'} (default: 3600 if not specified)`); diff --git a/script/deploy/DeployBase.s.sol b/script/deploy/DeployBase.s.sol index ce490ae..369d277 100644 --- a/script/deploy/DeployBase.s.sol +++ b/script/deploy/DeployBase.s.sol @@ -214,7 +214,7 @@ contract DeployBase is Script { accessManager.submitPendingOracle( oracle, address(collateral), - IOracle.Oracle(collateralPriceFeed, collateralPriceFeed, 0, uint32(365 days), uint32(365 days)) + IOracle.Oracle(collateralPriceFeed, collateralPriceFeed, uint32(365 days)) ); accessManager.acceptPendingOracle(oracle, address(collateral)); } else { @@ -244,7 +244,7 @@ contract DeployBase is Script { accessManager.submitPendingOracle( oracle, address(underlying), - IOracle.Oracle(underlyingPriceFeed, underlyingPriceFeed, 0, uint32(365 days), uint32(365 days)) + IOracle.Oracle(underlyingPriceFeed, underlyingPriceFeed, uint32(365 days)) ); accessManager.acceptPendingOracle(oracle, address(underlying)); } else { diff --git a/script/deploy/DeployOracleAggregator.s.sol b/script/deploy/DeployOracleAggregator.s.sol new file mode 100644 index 0000000..b4b5d45 --- /dev/null +++ b/script/deploy/DeployOracleAggregator.s.sol @@ -0,0 +1,106 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {Script} from "forge-std/Script.sol"; +import {VmSafe} from "forge-std/Vm.sol"; +import "forge-std/console.sol"; +import {TermMaxFactory} from "contracts/factory/TermMaxFactory.sol"; +import {ITermMaxFactory} from "contracts/factory/ITermMaxFactory.sol"; +import {ITermMaxRouter} from "contracts/router/ITermMaxRouter.sol"; +import {MarketViewer} from "contracts/router/MarketViewer.sol"; +import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import {TermMaxMarket} from "contracts/TermMaxMarket.sol"; +import {MockERC20} from "contracts/test/MockERC20.sol"; +import {MockPriceFeed} from "contracts/test/MockPriceFeed.sol"; +import {MarketConfig} from "contracts/storage/TermMaxStorage.sol"; +import {IMintableERC20} from "contracts/tokens/IMintableERC20.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import {SwapAdapter} from "contracts/test/testnet/SwapAdapter.sol"; +import {Faucet} from "contracts/test/testnet/Faucet.sol"; +import {DeployBase} from "./DeployBase.s.sol"; +import {IOracle} from "contracts/oracle/IOracle.sol"; +import {VaultFactory, IVaultFactory} from "contracts/factory/VaultFactory.sol"; +import {KyberswapV2Adapter} from "contracts/router/swapAdapters/KyberswapV2Adapter.sol"; +import {OdosV2Adapter} from "contracts/router/swapAdapters/OdosV2Adapter.sol"; +import {PendleSwapV3Adapter} from "contracts/router/swapAdapters/PendleSwapV3Adapter.sol"; +import {UniswapV3Adapter} from "contracts/router/swapAdapters/UniswapV3Adapter.sol"; +import {ERC4626VaultAdapter} from "contracts/router/swapAdapters/ERC4626VaultAdapter.sol"; +import {AccessManager} from "contracts/access/AccessManager.sol"; + +contract DeployCore is DeployBase { + // Network-specific config loaded from environment variables + string network; + uint256 deployerPrivateKey; + address deployerAddr; + address adminAddr; + address accessManagerAddr; + address uniswapV3RouterAddr; + address odosV2RouterAddr; + address pendleSwapV3RouterAddr; + uint256 oracleTimelock; + + AccessManager accessManager; + ITermMaxFactory factory; + IVaultFactory vaultFactory; + IOracle oracleAggregator; + ITermMaxRouter router; + MarketViewer marketViewer; + UniswapV3Adapter uniswapV3Adapter; + OdosV2Adapter odosV2Adapter; + PendleSwapV3Adapter pendleSwapV3Adapter; + ERC4626VaultAdapter vaultAdapter; + SwapAdapter swapAdapter; + Faucet faucet; + + function setUp() public { + // Load network from environment variable + network = vm.envString("NETWORK"); + string memory networkUpper = toUpper(network); + + // Load network-specific configuration + string memory privateKeyVar = string.concat(networkUpper, "_DEPLOYER_PRIVATE_KEY"); + string memory adminVar = string.concat(networkUpper, "_ADMIN_ADDRESS"); + string memory oracleTimelockVar = string.concat(networkUpper, "_ORACLE_TIMELOCK"); + + oracleTimelock = vm.envUint(oracleTimelockVar); + deployerPrivateKey = vm.envUint(privateKeyVar); + deployerAddr = vm.addr(deployerPrivateKey); + adminAddr = vm.envAddress(adminVar); + + string memory deploymentPath = + string.concat(vm.projectRoot(), "/deployments/", network, "/", network, "-access-manager.json"); + string memory json = vm.readFile(deploymentPath); + accessManagerAddr = vm.parseJsonAddress(json, ".contracts.accessManager"); + } + + function run() public { + console.log("Network:", network); + console.log("Deployer balance:", deployerAddr.balance); + + uint256 currentBlock = block.number; + uint256 currentTimestamp = block.timestamp; + + vm.startBroadcast(deployerPrivateKey); + // deploy oracle aggregator + oracleAggregator = deployOracleAggregator(accessManagerAddr, oracleTimelock); + vm.stopBroadcast(); + + console.log("===== Git Info ====="); + console.log("Git branch:", getGitBranch()); + console.log("Git commit hash:"); + console.logBytes(getGitCommitHash()); + console.log(); + + console.log("===== Block Info ====="); + console.log("Block number:", currentBlock); + console.log("Block timestamp:", currentTimestamp); + console.log(); + + console.log("===== Oracle Aggregator Info ====="); + console.log("Deployer:", deployerAddr); + console.log("Admin:", adminAddr); + console.log("Oracle Aggregator deployed at:", address(oracleAggregator)); + console.log("Oracle Timelock:", oracleTimelock); + } +} diff --git a/script/deploy/DeployPendleSwapV3Adapter.s.sol b/script/deploy/DeployPendleSwapV3Adapter.s.sol new file mode 100644 index 0000000..b07b226 --- /dev/null +++ b/script/deploy/DeployPendleSwapV3Adapter.s.sol @@ -0,0 +1,107 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {Script} from "forge-std/Script.sol"; +import {console} from "forge-std/console.sol"; +import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import {DeployBase} from "./DeployBase.s.sol"; +import {PendleSwapV3Adapter} from "contracts/router/swapAdapters/PendleSwapV3Adapter.sol"; + +contract DeployAccessManager is DeployBase { + // Network-specific config loaded from environment variables + string network; + uint256 deployerPrivateKey; + address deployerAddr; + address pendleSwapV3Router; + + function setUp() public { + // Load network from environment variable + network = vm.envString("NETWORK"); + string memory networkUpper = toUpper(network); + + // Load network-specific configuration + string memory privateKeyVar = string.concat(networkUpper, "_DEPLOYER_PRIVATE_KEY"); + string memory pendleSwapV3RouterVar = string.concat(networkUpper, "_PENDLE_SWAP_V3_ROUTER_ADDRESS"); + + deployerPrivateKey = vm.envUint(privateKeyVar); + deployerAddr = vm.addr(deployerPrivateKey); + pendleSwapV3Router = vm.envAddress(pendleSwapV3RouterVar); + } + + function run() public { + console.log("Network:", network); + console.log("Deployer:", deployerAddr); + console.log("Deployer balance:", deployerAddr.balance); + console.log("PendleSwapV3Router:", pendleSwapV3Router); + + uint256 currentBlock = block.number; + uint256 currentTimestamp = block.timestamp; + + vm.startBroadcast(deployerPrivateKey); + PendleSwapV3Adapter pendleSwapV3Adapter = new PendleSwapV3Adapter(address(pendleSwapV3Router)); + + vm.stopBroadcast(); + + console.log("===== Git Info ====="); + console.log("Git branch:", getGitBranch()); + console.log("Git commit hash:"); + console.logBytes(getGitCommitHash()); + console.log(); + + console.log("===== Block Info ====="); + console.log("Block number:", currentBlock); + console.log("Block timestamp:", currentTimestamp); + console.log(); + + console.log("===== PendleSwapV3Adapter Info ====="); + console.log("PendleSwapV3Adapter deployed at:", address(pendleSwapV3Adapter)); + console.log(); + + // Write deployment results to a JSON file + string memory deploymentJson = string( + abi.encodePacked( + "{\n", + ' "network": "', + network, + '",\n', + ' "deployedAt": "', + vm.toString(block.timestamp), + '",\n', + ' "gitBranch": "', + getGitBranch(), + '",\n', + ' "gitCommitHash": "0x', + vm.toString(getGitCommitHash()), + '",\n', + ' "blockInfo": {\n', + ' "number": "', + vm.toString(currentBlock), + '",\n', + ' "timestamp": "', + vm.toString(currentTimestamp), + '"\n', + " },\n", + ' "deployer": "', + vm.toString(deployerAddr), + '",\n', + ' "contracts": {\n', + ' "pendleSwapV3Adapter": "', + vm.toString(address(pendleSwapV3Adapter)), + '"\n', + " }\n", + "}" + ) + ); + + // Create deployment directory if it doesn't exist + string memory deploymentsDir = string.concat(vm.projectRoot(), "/deployments/", network); + if (!vm.exists(deploymentsDir)) { + vm.createDir(deploymentsDir, true); + } + + // Write the JSON file + string memory filePath = string.concat(deploymentsDir, "/", network, "-pendle-swap-v3-adapter.json"); + vm.writeFile(filePath, deploymentJson); + console.log("Deployment information written to:", filePath); + } +} diff --git a/script/deploy/DeployPriceFeeds.sol b/script/deploy/DeployPriceFeeds.sol index 9c9709c..2c6700e 100644 --- a/script/deploy/DeployPriceFeeds.sol +++ b/script/deploy/DeployPriceFeeds.sol @@ -4,13 +4,13 @@ pragma solidity ^0.8.27; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; -import {TermMaxPriceFeedFactory} from "contracts/factory/TermMaxPriceFeedFactory.sol"; +import {PriceFeedFactory} from "contracts/extensions/PriceFeedFactory.sol"; contract DeployPriceFeeds is Script { function run() public { uint256 deployerPrivateKey = vm.envUint("ETH_MAINNET_DEPLOYER_PRIVATE_KEY"); vm.startBroadcast(deployerPrivateKey); - TermMaxPriceFeedFactory priceFeedFactory = new TermMaxPriceFeedFactory(); + PriceFeedFactory priceFeedFactory = new PriceFeedFactory(); console.log("PriceFeedFactory deployed at", address(priceFeedFactory)); // pendle deployments: https://github.com/pendle-finance/pendle-core-v2-public/blob/main/deployments/1-core.json @@ -23,12 +23,10 @@ contract DeployPriceFeeds is Script { // chainlink(ETH/USD): https://data.chain.link/feeds/ethereum/mainnet/eth-usd // heartBeat: 3600 (1hr) address ethToUsd = 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419; - address pufETH = 0xD9A442856C234a39a81a089C06451EBAa4306a72; // new price feed heartBeat = max(3600, 86400) = 86400 (24hr) AggregatorV3Interface pufferEthFeed = - AggregatorV3Interface(priceFeedFactory.createPriceFeedConverter(pufferEthToEth, ethToUsd, pufETH)); + AggregatorV3Interface(priceFeedFactory.createPriceFeedConverter(pufferEthToEth, ethToUsd)); (, int256 answer,,,) = pufferEthFeed.latestRoundData(); - console.log("pufferEth price feed description", pufferEthFeed.description()); console.log("pufferEth price feed address", address(pufferEthFeed)); console.log("pufferEth last answer", answer); pufferEthOracle = address(pufferEthFeed); @@ -45,7 +43,6 @@ contract DeployPriceFeeds is Script { priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, pt_market, 900, susdeToUsd) ); (, int256 answer,,,) = ptFeed.latestRoundData(); - console.log("pt_sUsde_29MAY2025 price feed description", ptFeed.description()); console.log("pt_sUsde_29MAY2025 price feed address", address(ptFeed)); console.log("pt_sUsde_29MAY2025 last answer", answer); } @@ -60,7 +57,6 @@ contract DeployPriceFeeds is Script { AggregatorV3Interface usdcPlusFeed = AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usdcToUsd, USUALUSDCPlusVault)); (, int256 answer,,,) = usdcPlusFeed.latestRoundData(); - console.log("USUALUSDC+ price feed description", usdcPlusFeed.description()); console.log("USUALUSDC+ price feed address", address(usdcPlusFeed)); console.log("USUALUSDC+ last answer", answer); } @@ -75,7 +71,6 @@ contract DeployPriceFeeds is Script { AggregatorV3Interface wethFeed = AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(wethToUsd, MCwETHVault)); (, int256 answer,,,) = wethFeed.latestRoundData(); - console.log("MCwETH price feed description", wethFeed.description()); console.log("MCwETH price feed address", address(wethFeed)); console.log("MCwETH last answer", answer); } @@ -90,7 +85,6 @@ contract DeployPriceFeeds is Script { AggregatorV3Interface gtWETHFeed = AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(wethToUsd, gtWETHVault)); (, int256 answer,,,) = gtWETHFeed.latestRoundData(); - console.log("gtWETH price feed description", gtWETHFeed.description()); console.log("gtWETH price feed address", address(gtWETHFeed)); console.log("gtWETH last answer", answer); } @@ -106,7 +100,6 @@ contract DeployPriceFeeds is Script { ) ); (, int256 answer,,,) = ptFeed.latestRoundData(); - console.log("pt_pufETH_26JUN2025 price feed description", ptFeed.description()); console.log("pt_pufETH_26JUN2025 price feed address", address(ptFeed)); console.log("pt_pufETH_26JUN2025 last answer", answer); } @@ -121,7 +114,6 @@ contract DeployPriceFeeds is Script { AggregatorV3Interface usdeFeed = AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usdeToUsd, eUSDeVault)); (, int256 answer,,,) = usdeFeed.latestRoundData(); - console.log("eUSDe price feed description", usdeFeed.description()); console.log("eUSDe price feed address", address(usdeFeed)); console.log("eUSDe last answer", answer); } @@ -139,7 +131,6 @@ contract DeployPriceFeeds is Script { ) ); (, int256 answer,,,) = usd0PlusPlusFeed.latestRoundData(); - console.log("PT_USD0PlusPlus_26JUN2025 price feed description", usd0PlusPlusFeed.description()); console.log("PT_USD0PlusPlus_26JUN2025_market price feed address", address(usd0PlusPlusFeed)); console.log("PT_USD0PlusPlus_26JUN2025_market last answer", answer); } @@ -154,7 +145,6 @@ contract DeployPriceFeeds is Script { AggregatorV3Interface usdcFeed = AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usdcToUsd, upUSDCVault)); (, int256 answer,,,) = usdcFeed.latestRoundData(); - console.log("upUSDC price feed description", usdcFeed.description()); console.log("upUSDC price feed address", address(usdcFeed)); console.log("upUSDC last answer", answer); } @@ -169,7 +159,6 @@ contract DeployPriceFeeds is Script { AggregatorV3Interface usualFeed = AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usualToUsd, usualxVault)); (, int256 answer,,,) = usualFeed.latestRoundData(); - console.log("usualx price feed description", usualFeed.description()); console.log("usualx price feed address", address(usualFeed)); console.log("usualx last answer", answer); } diff --git a/script/deploy/DeployPriceFeedsArb.s.sol b/script/deploy/DeployPriceFeedsArb.s.sol index a764853..b1d48e6 100644 --- a/script/deploy/DeployPriceFeedsArb.s.sol +++ b/script/deploy/DeployPriceFeedsArb.s.sol @@ -4,13 +4,13 @@ pragma solidity ^0.8.27; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; -import {TermMaxPriceFeedFactory} from "contracts/factory/TermMaxPriceFeedFactory.sol"; +import {PriceFeedFactory} from "contracts/extensions/PriceFeedFactory.sol"; contract DeployPriceFeedsArb is Script { function run() public { uint256 deployerPrivateKey = vm.envUint("DEPLOYER_PRIVATE_KEY"); vm.startBroadcast(deployerPrivateKey); - TermMaxPriceFeedFactory priceFeedFactory = new TermMaxPriceFeedFactory(); + PriceFeedFactory priceFeedFactory = new PriceFeedFactory(); console.log("PriceFeedFactory deployed at", address(priceFeedFactory)); // pendle deployment: https://github.com/pendle-finance/pendle-core-v2-public/blob/main/deployments/42161-core.json @@ -23,12 +23,10 @@ contract DeployPriceFeedsArb is Script { // chainlink(ETH/USD): https://data.chain.link/feeds/arbitrum/mainnet/eth-usd // heartBeat: 86400 (24hr) address ethToUsd = 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612; - address wstEth = 0x5979D7b546E38E414F7E9822514be443A4800529; // new price feed heartBeat = max(86400, 86400) = 86400 (24hr) AggregatorV3Interface wstEthFeed = - AggregatorV3Interface(priceFeedFactory.createPriceFeedConverter(wstEthToEth, ethToUsd, wstEth)); + AggregatorV3Interface(priceFeedFactory.createPriceFeedConverter(wstEthToEth, ethToUsd)); (, int256 answer,,,) = wstEthFeed.latestRoundData(); - console.log("wstEth price feed description", wstEthFeed.description()); console.log("wstEth price feed address", address(wstEthFeed)); console.log("wstEth last answer", answer); } @@ -41,11 +39,9 @@ contract DeployPriceFeedsArb is Script { // heartBeat: 86400 (24hr) address ethToUsd = 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612; // new price feed heartBeat = max(86400, 86400) = 86400 (24hr) - address weEth = 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe; AggregatorV3Interface weEthFeed = - AggregatorV3Interface(priceFeedFactory.createPriceFeedConverter(weEthToEth, ethToUsd, weEth)); + AggregatorV3Interface(priceFeedFactory.createPriceFeedConverter(weEthToEth, ethToUsd)); (, int256 answer,,,) = weEthFeed.latestRoundData(); - console.log("weEth price feed description", weEthFeed.description()); console.log("weEth price feed address", address(weEthFeed)); console.log("weEth last answer", answer); weEthOracle = address(weEthFeed); @@ -60,7 +56,6 @@ contract DeployPriceFeedsArb is Script { priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, PT_weETH_26JUN2025_market, 900, weEthOracle) ); (, int256 answer,,,) = ptFeed.latestRoundData(); - console.log("pt_weETH_26JUN2025 price feed description", ptFeed.description()); console.log("pt_weETH_26JUN2025 price feed address", address(ptFeed)); console.log("pt_weETH_26JUN2025 last answer", answer); } diff --git a/script/deploy/DeployPriceFeedsArbBackup.s.sol b/script/deploy/DeployPriceFeedsArbBackup.s.sol new file mode 100644 index 0000000..72403ce --- /dev/null +++ b/script/deploy/DeployPriceFeedsArbBackup.s.sol @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {Script} from "forge-std/Script.sol"; +import {console} from "forge-std/console.sol"; +import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; +import {PriceFeedFactory} from "contracts/extensions/PriceFeedFactory.sol"; + +contract DeployPriceFeedsArb is Script { + function run() public { + uint256 deployerPrivateKey = vm.envUint("ARB_MAINNET_DEPLOYER_PRIVATE_KEY"); + vm.startBroadcast(deployerPrivateKey); + PriceFeedFactory priceFeedFactory = new PriceFeedFactory(); + + console.log("PriceFeedFactory deployed at", address(priceFeedFactory)); + // pendle deployment: https://github.com/pendle-finance/pendle-core-v2-public/blob/main/deployments/42161-core.json + address pendlePYLpOracle = 0x9a9Fa8338dd5E5B2188006f1Cd2Ef26d921650C2; + address weEthOracle; + + { + // redstone(weETH/ETH): https://app.redstone.finance/app/feeds/?page=1&sortBy=popularity&sortDesc=false&perPage=64&search=weETH + // heartBeat: 86400 (24hr) + address weEthToEth = 0xA736eAe8805dDeFFba40cAB8c99bCB309dEaBd9B; + // eOracle(ETH/USD): https://docs.eo.app/docs/eprice/feed-addresses/arbitrum + // heartBeat: 86400 (24hr) + address ethToUsd = 0xd68AeF8Ab6D86CeC502e08Faa376297d836FdfA6; + // new price feed heartBeat = max(86400, 86400) = 86400 (24hr) + AggregatorV3Interface weEthFeed = + AggregatorV3Interface(priceFeedFactory.createPriceFeedConverter(weEthToEth, ethToUsd)); + (, int256 answer,,,) = weEthFeed.latestRoundData(); + AggregatorV3Interface weEthFeedCheck = AggregatorV3Interface(0x8f29Df42c617C222Bc2B416AC8a022E85e853276); + (, int256 answerCheck,,,) = weEthFeedCheck.latestRoundData(); + console.log("weEth price feed address", address(weEthFeed)); + console.log("weEth last answer", answer); + console.log("weEth last answer check", answerCheck); + weEthOracle = address(weEthFeed); + } + + { + // pendle(PT-weETH 26JUN2025): https://app.pendle.finance/trade/markets/0xbf5e60ddf654085f80dae9dd33ec0e345773e1f8/swap?view=pt&chain=arbitrum&tab=info + address PT_weETH_26JUN2025_market = 0xBf5E60ddf654085F80DAe9DD33Ec0E345773E1F8; + // weETH/USD heartBeat: 86400 (24hr) + // new price feed heartBeat = max(86400) = 86400 (24hr) + AggregatorV3Interface ptFeed = AggregatorV3Interface( + priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, PT_weETH_26JUN2025_market, 900, weEthOracle) + ); + (, int256 answer,,,) = ptFeed.latestRoundData(); + AggregatorV3Interface ptFeedCheck = AggregatorV3Interface(0x2a2a0e32c54670045256EBcA681887E32e689E97); + (, int256 answerCheck,,,) = ptFeedCheck.latestRoundData(); + console.log("pt_weETH_26JUN2025 price feed address", address(ptFeed)); + console.log("pt_weETH_26JUN2025 last answer", answer); + console.log("pt_weETH_26JUN2025 last answer check", answerCheck); + } + + vm.stopBroadcast(); + } +} diff --git a/script/deploy/DeployPriceFeedsEth.s.sol b/script/deploy/DeployPriceFeedsEth.s.sol new file mode 100644 index 0000000..2c6700e --- /dev/null +++ b/script/deploy/DeployPriceFeedsEth.s.sol @@ -0,0 +1,168 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {Script} from "forge-std/Script.sol"; +import {console} from "forge-std/console.sol"; +import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; +import {PriceFeedFactory} from "contracts/extensions/PriceFeedFactory.sol"; + +contract DeployPriceFeeds is Script { + function run() public { + uint256 deployerPrivateKey = vm.envUint("ETH_MAINNET_DEPLOYER_PRIVATE_KEY"); + vm.startBroadcast(deployerPrivateKey); + PriceFeedFactory priceFeedFactory = new PriceFeedFactory(); + + console.log("PriceFeedFactory deployed at", address(priceFeedFactory)); + // pendle deployments: https://github.com/pendle-finance/pendle-core-v2-public/blob/main/deployments/1-core.json + address pendlePYLpOracle = 0x9a9Fa8338dd5E5B2188006f1Cd2Ef26d921650C2; + address pufferEthOracle; + { + // chainlink(pufETH/ETH): https://data.chain.link/feeds/ethereum/mainnet/pufeth-eth + // heartBeat: 86400 (24hr) + address pufferEthToEth = 0xDe3f7Dd92C4701BCf59F47235bCb61e727c45f80; + // chainlink(ETH/USD): https://data.chain.link/feeds/ethereum/mainnet/eth-usd + // heartBeat: 3600 (1hr) + address ethToUsd = 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419; + // new price feed heartBeat = max(3600, 86400) = 86400 (24hr) + AggregatorV3Interface pufferEthFeed = + AggregatorV3Interface(priceFeedFactory.createPriceFeedConverter(pufferEthToEth, ethToUsd)); + (, int256 answer,,,) = pufferEthFeed.latestRoundData(); + console.log("pufferEth price feed address", address(pufferEthFeed)); + console.log("pufferEth last answer", answer); + pufferEthOracle = address(pufferEthFeed); + } + + { + // pendle(PT-sUSDe 29MAY2025): https://app.pendle.finance/trade/markets/0xb162b764044697cf03617c2efbcb1f42e31e4766/swap?view=pt&chain=ethereum&tab=info + address pt_market = 0xB162B764044697cf03617C2EFbcB1f42e31E4766; + // chainlink(sUSDe/USD): https://data.chain.link/feeds/ethereum/mainnet/susde-usd + // heartBeat: 86400 (24hr) + address susdeToUsd = 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099; + // new price feed heartBeat = max(86400) = 86400 (24hr) + AggregatorV3Interface ptFeed = AggregatorV3Interface( + priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, pt_market, 900, susdeToUsd) + ); + (, int256 answer,,,) = ptFeed.latestRoundData(); + console.log("pt_sUsde_29MAY2025 price feed address", address(ptFeed)); + console.log("pt_sUsde_29MAY2025 last answer", answer); + } + + { + // morpho(USUALUSDC+): https://app.morpho.org/ethereum/vault/0xd63070114470f685b75B74D60EEc7c1113d33a3D/mev-capital-usual-usdc + address USUALUSDCPlusVault = 0xd63070114470f685b75B74D60EEc7c1113d33a3D; + // chainlink(USDC/USD): https://data.chain.link/feeds/ethereum/mainnet/usdc-usd-svr + // heartBeat: 86400 (24hr) + address usdcToUsd = 0xfB6471ACD42c91FF265344Ff73E88353521d099F; + // new price feed heartBeat = max(86400) = 86400 (24hr) + AggregatorV3Interface usdcPlusFeed = + AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usdcToUsd, USUALUSDCPlusVault)); + (, int256 answer,,,) = usdcPlusFeed.latestRoundData(); + console.log("USUALUSDC+ price feed address", address(usdcPlusFeed)); + console.log("USUALUSDC+ last answer", answer); + } + + { + // morpho(MC-wETH): https://app.morpho.org/ethereum/vault/0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8/mev-capital-weth + address MCwETHVault = 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8; + // chainlink(ETH/USD): https://data.chain.link/feeds/ethereum/mainnet/eth-usd + // heartBeat: 3600 (1hr) + address wethToUsd = 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419; + // new price feed heartBeat = max(3600) = 3600 (1hr) + AggregatorV3Interface wethFeed = + AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(wethToUsd, MCwETHVault)); + (, int256 answer,,,) = wethFeed.latestRoundData(); + console.log("MCwETH price feed address", address(wethFeed)); + console.log("MCwETH last answer", answer); + } + + { + // morpho(gtWETH): https://app.morpho.org/ethereum/vault/0x2371e134e3455e0593363cBF89d3b6cf53740618/gauntlet-weth-prime + address gtWETHVault = 0x2371e134e3455e0593363cBF89d3b6cf53740618; + // chainlink(ETH/USD): https://data.chain.link/feeds/ethereum/mainnet/eth-usd + // heartBeat: 3600 (1hr) + address wethToUsd = 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419; + // new price feed heartBeat = max(3600) = 3600 (1hr) + AggregatorV3Interface gtWETHFeed = + AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(wethToUsd, gtWETHVault)); + (, int256 answer,,,) = gtWETHFeed.latestRoundData(); + console.log("gtWETH price feed address", address(gtWETHFeed)); + console.log("gtWETH last answer", answer); + } + + { + // pendle(PT-pufETH 26JUN2025): https://app.pendle.finance/trade/markets/0x58612beb0e8a126735b19bb222cbc7fc2c162d2a/swap?view=pt&chain=ethereum&tab=info + address PT_pufETH_26JUN2025_market = 0x58612beB0e8a126735b19BB222cbC7fC2C162D2a; + // pufETH/USD heartBeat: 86400 (24hr) + // new price feed heartBeat = max(86400) = 86400 (24hr) + AggregatorV3Interface ptFeed = AggregatorV3Interface( + priceFeedFactory.createPTWithPriceFeed( + pendlePYLpOracle, PT_pufETH_26JUN2025_market, 900, pufferEthOracle + ) + ); + (, int256 answer,,,) = ptFeed.latestRoundData(); + console.log("pt_pufETH_26JUN2025 price feed address", address(ptFeed)); + console.log("pt_pufETH_26JUN2025 last answer", answer); + } + + { + // etherscan(eUSDe): https://etherscan.io/token/0x90d2af7d622ca3141efa4d8f1f24d86e5974cc8f#readContract + address eUSDeVault = 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F; + // chainlink(eUSDe/USD): https://data.chain.link/feeds/ethereum/mainnet/usde-usd + // heartBeat: 86400 (24hr) + address usdeToUsd = 0xa569d910839Ae8865Da8F8e70FfFb0cBA869F961; + // new price feed heartBeat = max(86400) = 86400 (24hr) + AggregatorV3Interface usdeFeed = + AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usdeToUsd, eUSDeVault)); + (, int256 answer,,,) = usdeFeed.latestRoundData(); + console.log("eUSDe price feed address", address(usdeFeed)); + console.log("eUSDe last answer", answer); + } + + { + // pendle(PT-USD0PlusPlus 26JUN2025): https://app.pendle.finance/trade/markets/0x048680f64d6dff1748ba6d9a01f578433787e24b/swap?view=pt&chain=ethereum&tab=info + address PT_USD0PlusPlus_26JUN2025_market = 0x048680F64d6DFf1748ba6D9a01F578433787e24B; + // Usual Docs: https://tech.usual.money/smart-contracts/contract-deployments + //! heartBeat: 86400 (24hr) not sure + address usd0PlusPlusToUsd = 0xFC9e30Cf89f8A00dba3D34edf8b65BCDAdeCC1cB; + // new price feed heartBeat = max(86400) = 86400 (24hr) + AggregatorV3Interface usd0PlusPlusFeed = AggregatorV3Interface( + priceFeedFactory.createPTWithPriceFeed( + pendlePYLpOracle, PT_USD0PlusPlus_26JUN2025_market, 900, usd0PlusPlusToUsd + ) + ); + (, int256 answer,,,) = usd0PlusPlusFeed.latestRoundData(); + console.log("PT_USD0PlusPlus_26JUN2025_market price feed address", address(usd0PlusPlusFeed)); + console.log("PT_USD0PlusPlus_26JUN2025_market last answer", answer); + } + + { + // UpShift USDC(upUSDC): https://app.upshift.finance/pools/1/0x80E1048eDE66ec4c364b4F22C8768fc657FF6A42 + address upUSDCVault = 0x80E1048eDE66ec4c364b4F22C8768fc657FF6A42; + // chainlink(USDC/USD): https://data.chain.link/feeds/ethereum/mainnet/usdc-usd-svr + // heartBeat: 86400 (24hr) + address usdcToUsd = 0xfB6471ACD42c91FF265344Ff73E88353521d099F; + // new price feed heartBeat = max(86400) = 86400 (24hr) + AggregatorV3Interface usdcFeed = + AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usdcToUsd, upUSDCVault)); + (, int256 answer,,,) = usdcFeed.latestRoundData(); + console.log("upUSDC price feed address", address(usdcFeed)); + console.log("upUSDC last answer", answer); + } + + { + // Usual(usualx): https://tech.usual.money/smart-contracts/contract-deployments + address usualxVault = 0x06B964d96f5dCF7Eae9d7C559B09EDCe244d4B8E; + // Redstone (USUAL/USD): https://app.redstone.finance/app/feeds/?search=USUAL&page=1&sortBy=popularity&sortDesc=false&perPage=32 + // heartBeat: 86400 (24hr) + address usualToUsd = 0x2240AE461B34CC56D654ba5FA5830A243Ca54840; + // new price feed heartBeat = max(86400) = 86400 (24hr) + AggregatorV3Interface usualFeed = + AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usualToUsd, usualxVault)); + (, int256 answer,,,) = usualFeed.latestRoundData(); + console.log("usualx price feed address", address(usualFeed)); + console.log("usualx last answer", answer); + } + + vm.stopBroadcast(); + } +} diff --git a/script/deploy/DeployPriceFeedsEthBackup.s.sol b/script/deploy/DeployPriceFeedsEthBackup.s.sol new file mode 100644 index 0000000..4a1c995 --- /dev/null +++ b/script/deploy/DeployPriceFeedsEthBackup.s.sol @@ -0,0 +1,152 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {Script} from "forge-std/Script.sol"; +import {console} from "forge-std/console.sol"; +import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; +import {PriceFeedFactory} from "contracts/extensions/PriceFeedFactory.sol"; + +contract DeployPriceFeeds is Script { + function run() public { + uint256 deployerPrivateKey = vm.envUint("ETH_MAINNET_DEPLOYER_PRIVATE_KEY"); + vm.startBroadcast(deployerPrivateKey); + PriceFeedFactory priceFeedFactory = new PriceFeedFactory(); + + console.log("PriceFeedFactory deployed at", address(priceFeedFactory)); + // pendle deployments: https://github.com/pendle-finance/pendle-core-v2-public/blob/main/deployments/1-core.json + address pendlePYLpOracle = 0x9a9Fa8338dd5E5B2188006f1Cd2Ef26d921650C2; + address pufferEthOracle; + { + // redstone(pufETH/ETH): https://app.redstone.finance/app/feeds/?page=1&sortBy=popularity&sortDesc=false&perPage=64&search=pufETH + // heartBeat: 86400 (24hr) + address pufferEthToEth = 0x76A495b0bFfb53ef3F0E94ef0763e03cE410835C; + // redstone(ETH/USD): https://app.redstone.finance/app/feeds/?page=1&sortBy=popularity&sortDesc=false&perPage=64&search=ETH%2FUSD + // heartBeat: 86400 (24hr) + address ethToUsd = 0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4; + // new price feed heartBeat = max(86400, 86400) = 86400 (24hr) + AggregatorV3Interface pufferEthFeed = + AggregatorV3Interface(priceFeedFactory.createPriceFeedConverter(pufferEthToEth, ethToUsd)); + (, int256 answer,,,) = pufferEthFeed.latestRoundData(); + // compare with primary feed: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + AggregatorV3Interface pufferEthFeedCheck = AggregatorV3Interface(0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761); + (, int256 answerCheck,,,) = pufferEthFeedCheck.latestRoundData(); + console.log("pufferEth backup price feed address", address(pufferEthFeed)); + console.log("pufferEth last answer", answer); + console.log("pufferEth last answer check", answerCheck); + pufferEthOracle = address(pufferEthFeed); + } + + { + // pendle(PT-sUSDe 29MAY2025): https://app.pendle.finance/trade/markets/0xb162b764044697cf03617c2efbcb1f42e31e4766/swap?view=pt&chain=ethereum&tab=info + address pt_market = 0xB162B764044697cf03617C2EFbcB1f42e31E4766; + // redstone(sUSDe/USD): https://app.redstone.finance/app/feeds/?page=1&sortBy=popularity&sortDesc=false&perPage=64&search=sUSDe%2FUSD + // heartBeat: 86400 (24hr) + address susdeToUsd = 0xb99D174ED06c83588Af997c8859F93E83dD4733f; + // new price feed heartBeat = max(86400) = 86400 (24hr) + AggregatorV3Interface ptFeed = AggregatorV3Interface( + priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, pt_market, 900, susdeToUsd) + ); + // compared with primary feed: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + AggregatorV3Interface ptFeedCheck = AggregatorV3Interface(0x8f29Df42c617C222Bc2B416AC8a022E85e853276); + (, int256 answerCheck,,,) = ptFeedCheck.latestRoundData(); + (, int256 answer,,,) = ptFeed.latestRoundData(); + console.log("pt_sUsde_29MAY2025 backup price feed address", address(ptFeed)); + console.log("pt_sUsde_29MAY2025 last answer", answer); + console.log("pt_sUsde_29MAY2025 last answer check", answerCheck); + } + + { + // morpho(MC-wETH): https://app.morpho.org/ethereum/vault/0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8/mev-capital-weth + address MCwETHVault = 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8; + // redstone(ETH/USD): https://app.redstone.finance/app/feeds/?page=1&sortBy=popularity&sortDesc=false&perPage=64&search=ETH%2FUSD + // heartBeat: 86400 (24hr) + address wethToUsd = 0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4; + // new price feed heartBeat = max(86400) = 86400 (24hr) + AggregatorV3Interface wethFeed = + AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(wethToUsd, MCwETHVault)); + // compared with primary feed: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + AggregatorV3Interface wethFeedCheck = AggregatorV3Interface(0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006); + (, int256 answerCheck,,,) = wethFeedCheck.latestRoundData(); + (, int256 answer,,,) = wethFeed.latestRoundData(); + console.log("MCwETH backup price feed address", address(wethFeed)); + console.log("MCwETH last answer", answer); + console.log("MCwETH last answer check", answerCheck); + } + + { + // morpho(gtWETH): https://app.morpho.org/ethereum/vault/0x2371e134e3455e0593363cBF89d3b6cf53740618/gauntlet-weth-prime + address gtWETHVault = 0x2371e134e3455e0593363cBF89d3b6cf53740618; + // redstone(ETH/USD): https://app.redstone.finance/app/feeds/?page=1&sortBy=popularity&sortDesc=false&perPage=64&search=ETH%2FUSD + // heartBeat: 86400 (24hr) + address wethToUsd = 0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4; + // new price feed heartBeat = max(86400) = 86400 (24hr) + AggregatorV3Interface gtWETHFeed = + AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(wethToUsd, gtWETHVault)); + // compared with primary feed: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + AggregatorV3Interface gtWETHFeedCheck = AggregatorV3Interface(0xdc0115fe09600FeDa15D317cCa3D2f21F389036d); + (, int256 answerCheck,,,) = gtWETHFeedCheck.latestRoundData(); + (, int256 answer,,,) = gtWETHFeed.latestRoundData(); + console.log("gtWETH backup price feed address", address(gtWETHFeed)); + console.log("gtWETH last answer", answer); + console.log("gtWETH last answer check", answerCheck); + } + + { + // pendle(PT-pufETH 26JUN2025): https://app.pendle.finance/trade/markets/0x58612beb0e8a126735b19bb222cbc7fc2c162d2a/swap?view=pt&chain=ethereum&tab=info + address PT_pufETH_26JUN2025_market = 0x58612beB0e8a126735b19BB222cbC7fC2C162D2a; + // pufETH/USD heartBeat: 86400 (24hr) + // new price feed heartBeat = max(86400) = 86400 (24hr) + AggregatorV3Interface ptFeed = AggregatorV3Interface( + priceFeedFactory.createPTWithPriceFeed( + pendlePYLpOracle, PT_pufETH_26JUN2025_market, 900, pufferEthOracle + ) + ); + // compared with primary feed: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + AggregatorV3Interface ptFeedCheck = AggregatorV3Interface(0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1); + (, int256 answerCheck,,,) = ptFeedCheck.latestRoundData(); + (, int256 answer,,,) = ptFeed.latestRoundData(); + console.log("pt_pufETH_26JUN2025 backup price feed address", address(ptFeed)); + console.log("pt_pufETH_26JUN2025 last answer", answer); + console.log("pt_pufETH_26JUN2025 last answer check", answerCheck); + } + + { + // etherscan(eUSDe): https://etherscan.io/token/0x90d2af7d622ca3141efa4d8f1f24d86e5974cc8f#readContract + address eUSDeVault = 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F; + // redstone(USDe/USD): https://app.redstone.finance/app/feeds/?page=1&sortBy=popularity&sortDesc=false&perPage=64&search=USDe%2FUSD + // heartBeat: 86400 (24hr) + address usdeToUsd = 0xbC5FBcf58CeAEa19D523aBc76515b9AEFb5cfd58; + // new price feed heartBeat = max(86400) = 86400 (24hr) + AggregatorV3Interface usdeFeed = + AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usdeToUsd, eUSDeVault)); + // compared with primary feed: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + AggregatorV3Interface usdeFeedCheck = AggregatorV3Interface(0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3); + (, int256 answerCheck,,,) = usdeFeedCheck.latestRoundData(); + (, int256 answer,,,) = usdeFeed.latestRoundData(); + console.log("eUSDe backup price feed address", address(usdeFeed)); + console.log("eUSDe last answer", answer); + console.log("eUSDe last answer check", answerCheck); + } + + { + // chainlink(weETH/ETH): https://data.chain.link/feeds/ethereum/mainnet/weeth-eth + // heartBeat: 86400 (24hr) + address weEthToEth = 0x5c9C449BbC9a6075A2c061dF312a35fd1E05fF22; + // chainlink(ETH/USD): https://data.chain.link/feeds/ethereum/mainnet/eth-usd + // heartBeat: 3600 (1hr) + address ethToUsd = 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419; + // new price feed heartBeat = max(3600, 86400) = 86400 (24hr) + AggregatorV3Interface weEthFeed = + AggregatorV3Interface(priceFeedFactory.createPriceFeedConverter(weEthToEth, ethToUsd)); + (, int256 answer,,,) = weEthFeed.latestRoundData(); + // compare with primary feed: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + AggregatorV3Interface weEthFeedCheck = AggregatorV3Interface(0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136); + (, int256 answerCheck,,,) = weEthFeedCheck.latestRoundData(); + console.log("weEth backup price feed address", address(weEthFeed)); + console.log("weEth last answer", answer); + console.log("weEth last answer check", answerCheck); + } + + vm.stopBroadcast(); + } +} diff --git a/script/deploy/DeployPriceFeedsEthInWstETH.s.sol b/script/deploy/DeployPriceFeedsEthInWstETH.s.sol new file mode 100644 index 0000000..d0dad79 --- /dev/null +++ b/script/deploy/DeployPriceFeedsEthInWstETH.s.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {Script} from "forge-std/Script.sol"; +import {console} from "forge-std/console.sol"; +import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; +import {PriceFeedFactory} from "contracts/extensions/PriceFeedFactory.sol"; + +contract DeployPriceFeeds is Script { + function run() public { + uint256 deployerPrivateKey = vm.envUint("ETH_MAINNET_DEPLOYER_PRIVATE_KEY"); + vm.startBroadcast(deployerPrivateKey); + PriceFeedFactory priceFeedFactory = new PriceFeedFactory(); + + console.log("PriceFeedFactory deployed at", address(priceFeedFactory)); + + { + // inceptionLRT(inwstETH): https://docs.inceptionlrt.com/contracts/addresses/lrts + address inwstETHVault = 0xf9D9F828989A624423C48b95BC04E9Ae0ef5Ec97; + // chainlink(wstETH/USD): https://data.chain.link/feeds/ethereum/mainnet/wsteth-usd + // heartBeat: 86400 (24hr) + address wstETHToUsd = 0x164b276057258d81941e97B0a900D4C7B358bCe0; + // new price feed heartBeat = max(86400) = 86400 (24hr) + AggregatorV3Interface inwstETHFeed = + AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(wstETHToUsd, inwstETHVault)); + (, int256 answer,,,) = inwstETHFeed.latestRoundData(); + console.log("inwstETH price feed address", address(inwstETHFeed)); + console.log("inwstETH last answer", answer); + } + + vm.stopBroadcast(); + } +} diff --git a/script/deploy/DeployPriceFeedsEthLevel.s.sol b/script/deploy/DeployPriceFeedsEthLevel.s.sol new file mode 100644 index 0000000..5c95fee --- /dev/null +++ b/script/deploy/DeployPriceFeedsEthLevel.s.sol @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {Script} from "forge-std/Script.sol"; +import {console} from "forge-std/console.sol"; +import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; +import {PriceFeedFactory} from "contracts/extensions/PriceFeedFactory.sol"; + +contract DeployPriceFeeds is Script { + function run() public { + uint256 deployerPrivateKey = vm.envUint("ETH_MAINNET_DEPLOYER_PRIVATE_KEY"); + vm.startBroadcast(deployerPrivateKey); + PriceFeedFactory priceFeedFactory = new PriceFeedFactory(); + + console.log("PriceFeedFactory deployed at", address(priceFeedFactory)); + // pendle deployments: https://github.com/pendle-finance/pendle-core-v2-public/blob/main/deployments/1-core.json + address pendlePYLpOracle = 0x9a9Fa8338dd5E5B2188006f1Cd2Ef26d921650C2; + { + // pendle(PT-lvlUSD-29MAY2025): https://app.pendle.finance/trade/markets/0xe45d2ce15abba3c67b9ff1e7a69225c855d3da82/swap?view=pt&chain=ethereum&tab=info + address pt_market = 0xE45d2CE15aBbA3c67b9fF1E7A69225C855d3DA82; + // chainlink(USDC/USD): https://data.chain.link/feeds/ethereum/mainnet/usdc-usd + // heartBeat: 86400 (24hr) + address usdcToUsd = 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6; + // new price feed heartBeat = max(86400) = 86400 (24hr) + AggregatorV3Interface ptFeed = AggregatorV3Interface( + priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, pt_market, 900, usdcToUsd) + ); + (, int256 answer,,,) = ptFeed.latestRoundData(); + console.log("pt_lvlUSD_29MAY2025 price feed address", address(ptFeed)); + console.log("pt_lvlUSD_29MAY2025 last answer", answer); + } + + { + // slvlUSD: https://etherscan.io/address/0x4737D9b4592B40d51e110b94c9C043c6654067Ae#readContract + address slvlUsd = 0x4737D9b4592B40d51e110b94c9C043c6654067Ae; + // chainlink(USDC/USD): https://data.chain.link/feeds/ethereum/mainnet/usdc-usd + // heartBeat: 86400 (24hr) + address usdcToUsd = 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6; + // new price feed heartBeat = max(86400) = 86400 (24hr) + AggregatorV3Interface slvlUsdFeed = + AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usdcToUsd, slvlUsd)); + (, int256 answer,,,) = slvlUsdFeed.latestRoundData(); + console.log("slvlUSD price feed address", address(slvlUsdFeed)); + console.log("slvlUSD last answer", answer); + } + + { + // morpho(USUALUSDC+): https://app.morpho.org/ethereum/vault/0xd63070114470f685b75B74D60EEc7c1113d33a3D/mev-capital-usual-usdc + address USUALUSDCPlusVault = 0xd63070114470f685b75B74D60EEc7c1113d33a3D; + // chainlink(USDC/USD): https://data.chain.link/feeds/ethereum/mainnet/usdc-usd + // heartBeat: 86400 (24hr) + address usdcToUsd = 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6; + // new price feed heartBeat = max(86400) = 86400 (24hr) + AggregatorV3Interface usdcPlusFeed = + AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usdcToUsd, USUALUSDCPlusVault)); + (, int256 answer,,,) = usdcPlusFeed.latestRoundData(); + console.log("USUALUSDC+ price feed address", address(usdcPlusFeed)); + console.log("USUALUSDC+ last answer", answer); + } + + vm.stopBroadcast(); + } +} diff --git a/script/deploy/DeployPriceFeedsEth_20250508.s.sol b/script/deploy/DeployPriceFeedsEth_20250508.s.sol new file mode 100644 index 0000000..4d75691 --- /dev/null +++ b/script/deploy/DeployPriceFeedsEth_20250508.s.sol @@ -0,0 +1,99 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {Script} from "forge-std/Script.sol"; +import {console} from "forge-std/console.sol"; +import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; +import {PriceFeedFactory} from "contracts/extensions/PriceFeedFactory.sol"; + +contract DeployPriceFeeds is Script { + function run() public { + uint256 deployerPrivateKey = vm.envUint("ETH_MAINNET_DEPLOYER_PRIVATE_KEY"); + vm.startBroadcast(deployerPrivateKey); + address priceFeedFactoryAddress = 0xcac930B240163fDB71b74514E8FAA113ec0dA844; + PriceFeedFactory priceFeedFactory = PriceFeedFactory(priceFeedFactoryAddress); + + console.log("PriceFeedFactory deployed at", address(priceFeedFactory)); + // pendle deployments: https://github.com/pendle-finance/pendle-core-v2-public/blob/main/deployments/1-core.json + address pendlePYLpOracle = 0x9a9Fa8338dd5E5B2188006f1Cd2Ef26d921650C2; + + { + // pendle(PT-sUSDe 31JUL2025): https://app.pendle.finance/trade/markets/0x4339ffe2b7592dc783ed13cce310531ab366deac/swap?view=pt&chain=ethereum&tab=info + address pt_market = 0x4339Ffe2B7592Dc783ed13cCE310531aB366dEac; + // chainlink(sUSDe/USD): https://data.chain.link/feeds/ethereum/mainnet/susde-usd + // heartBeat: 86400 (24hr) + address susdeToUsd = 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099; + // new price feed heartBeat = max(86400) = 86400 (24hr) + AggregatorV3Interface ptFeed = AggregatorV3Interface( + priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, pt_market, 900, susdeToUsd) + ); + (, int256 answer,,,) = ptFeed.latestRoundData(); + console.log("pt_sUsde_31JUL2025 price feed address", address(ptFeed)); + console.log("pt_sUsde_31JUL2025 last answer", answer); + } + { + // pendle(PT-lvlUSD-25SEP2025): https://app.pendle.finance/trade/markets/0x461bc2ac3f80801bc11b0f20d63b73fef60c8076/swap?view=pt&chain=ethereum&tab=info + address pt_market = 0x461bc2ac3f80801BC11B0F20d63B73feF60C8076; + // chainlink(USDC/USD): https://data.chain.link/feeds/ethereum/mainnet/usdc-usd + // heartBeat: 86400 (24hr) + address usdcToUsd = 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6; + // new price feed heartBeat = max(86400) = 86400 (24hr) + AggregatorV3Interface ptFeed = AggregatorV3Interface( + priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, pt_market, 900, usdcToUsd) + ); + (, int256 answer,,,) = ptFeed.latestRoundData(); + console.log("pt_lvlUSD_25SEP2025 price feed address", address(ptFeed)); + console.log("pt_lvlUSD_25SEP2025 last answer", answer); + } + address cUSDOToUsdFeed; + { + // chainlink(USDC/USD): https://data.chain.link/feeds/ethereum/mainnet/usdc-usd + // heartBeat: 86400 (24hr) + address usdcToUsd = 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6; + address cUSDO = 0xaD55aebc9b8c03FC43cd9f62260391c13c23e7c0; + // new price feed heartBeat = max(86400) = 86400 (24hr) + AggregatorV3Interface cusdoFeed = + AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usdcToUsd, cUSDO)); + cUSDOToUsdFeed = address(cusdoFeed); + (, int256 answer,,,) = cusdoFeed.latestRoundData(); + console.log("cUSDO price feed address", address(cusdoFeed)); + console.log("cUSDO last answer", answer); + } + { + // pendle(PT-cUSDO-19JUN2025): https://app.pendle.finance/trade/markets/0xa77c0de4d26b7c97d1d42abd6733201206122e25/swap?view=pt&chain=ethereum&tab=info + address pt_market = 0xA77c0DE4d26B7C97D1D42ABD6733201206122E25; + AggregatorV3Interface ptFeed = AggregatorV3Interface( + priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, pt_market, 900, cUSDOToUsdFeed) + ); + (, int256 answer,,,) = ptFeed.latestRoundData(); + console.log("pt_cUSDO_19JUN2025 price feed address", address(ptFeed)); + console.log("pt_cUSDO_19JUN2025 last answer", answer); + } + address wstUsrToUsdFeed; + { + // chainlink(USR/USD): https://data.chain.link/feeds/ethereum/mainnet/usr-usd + // heartBeat: 86400 (24hr) + address usrToUsd = 0x34ad75691e25A8E9b681AAA85dbeB7ef6561B42c; + address wstUsr = 0x1202F5C7b4B9E47a1A484E8B270be34dbbC75055; + // new price feed heartBeat = max(86400) = 86400 (24hr) + AggregatorV3Interface wstUsrFeed = + AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usrToUsd, wstUsr)); + wstUsrToUsdFeed = address(wstUsrFeed); + (, int256 answer,,,) = wstUsrFeed.latestRoundData(); + console.log("wstUsr price feed address", address(wstUsrFeed)); + console.log("wstUsr last answer", answer); + } + { + // pendle(PT-wstUSR-25SEP2025): https://app.pendle.finance/trade/markets/0x09fa04aac9c6d1c6131352ee950cd67ecc6d4fb9/swap?view=pt&chain=ethereum&tab=info + address pt_market = 0x09fA04Aac9c6d1c6131352EE950CD67ecC6d4fB9; + AggregatorV3Interface ptFeed = AggregatorV3Interface( + priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, pt_market, 900, wstUsrToUsdFeed) + ); + (, int256 answer,,,) = ptFeed.latestRoundData(); + console.log("pt_wstUSR_25SEP2025 price feed address", address(ptFeed)); + console.log("pt_wstUSR_25SEP2025 last answer", answer); + } + + vm.stopBroadcast(); + } +} diff --git a/script/deploy/DeployPriceFeedsEth_20250508_Backup.s.sol b/script/deploy/DeployPriceFeedsEth_20250508_Backup.s.sol new file mode 100644 index 0000000..3c3f647 --- /dev/null +++ b/script/deploy/DeployPriceFeedsEth_20250508_Backup.s.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {Script} from "forge-std/Script.sol"; +import {console} from "forge-std/console.sol"; +import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; +import {PriceFeedFactory} from "contracts/extensions/PriceFeedFactory.sol"; + +contract DeployPriceFeeds is Script { + function run() public { + uint256 deployerPrivateKey = vm.envUint("ETH_MAINNET_DEPLOYER_PRIVATE_KEY"); + vm.startBroadcast(deployerPrivateKey); + address priceFeedFactoryAddress = 0xcac930B240163fDB71b74514E8FAA113ec0dA844; + PriceFeedFactory priceFeedFactory = PriceFeedFactory(priceFeedFactoryAddress); + + console.log("PriceFeedFactory deployed at", address(priceFeedFactory)); + // pendle deployments: https://github.com/pendle-finance/pendle-core-v2-public/blob/main/deployments/1-core.json + address pendlePYLpOracle = 0x9a9Fa8338dd5E5B2188006f1Cd2Ef26d921650C2; + + { + // pendle(PT-sUSDe 31JUL2025): https://app.pendle.finance/trade/markets/0x4339ffe2b7592dc783ed13cce310531ab366deac/swap?view=pt&chain=ethereum&tab=info + address pt_market = 0x4339Ffe2B7592Dc783ed13cCE310531aB366dEac; + // redstone(sUSDe/USD): https://app.redstone.finance/app/feeds/?page=1&sortBy=popularity&sortDesc=false&perPage=64&search=sUSDe%2FUSD + // heartBeat: 86400 (24hr) + address susdeToUsd = 0xb99D174ED06c83588Af997c8859F93E83dD4733f; + // new price feed heartBeat = max(86400) = 86400 (24hr) + AggregatorV3Interface ptFeed = AggregatorV3Interface( + priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, pt_market, 900, susdeToUsd) + ); + (, int256 answer,,,) = ptFeed.latestRoundData(); + console.log("pt_sUsde_31JUL2025 price feed address", address(ptFeed)); + console.log("pt_sUsde_31JUL2025 last answer", answer); + } + address wstUsrToUsdFeed; + { + // redstone(USR/USD): https://app.redstone.finance/app/feeds/?page=1&sortBy=popularity&sortDesc=false&perPage=64&search=USR%2FUSD + // heartBeat: 86400 (24hr) + address usrToUsd = 0x107Dd3391A6357248f2093698014e7c6130779Ee; + address wstUsr = 0x1202F5C7b4B9E47a1A484E8B270be34dbbC75055; + // new price feed heartBeat = max(86400) = 86400 (24hr) + AggregatorV3Interface wstUsrFeed = + AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usrToUsd, wstUsr)); + wstUsrToUsdFeed = address(wstUsrFeed); + (, int256 answer,,,) = wstUsrFeed.latestRoundData(); + console.log("wstUsr price feed address", address(wstUsrFeed)); + console.log("wstUsr last answer", answer); + } + { + // pendle(PT-wstUSR-25SEP2025): https://app.pendle.finance/trade/markets/0x09fa04aac9c6d1c6131352ee950cd67ecc6d4fb9/swap?view=pt&chain=ethereum&tab=info + address pt_market = 0x09fA04Aac9c6d1c6131352EE950CD67ecC6d4fB9; + AggregatorV3Interface ptFeed = AggregatorV3Interface( + priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, pt_market, 900, wstUsrToUsdFeed) + ); + (, int256 answer,,,) = ptFeed.latestRoundData(); + console.log("pt_wstUSR_25SEP2025 price feed address", address(ptFeed)); + console.log("pt_wstUSR_25SEP2025 last answer", answer); + } + + vm.stopBroadcast(); + } +} diff --git a/script/deploy/DeployPriceFeedsEth_20250513.s.sol b/script/deploy/DeployPriceFeedsEth_20250513.s.sol new file mode 100644 index 0000000..1f4d5c9 --- /dev/null +++ b/script/deploy/DeployPriceFeedsEth_20250513.s.sol @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {Script} from "forge-std/Script.sol"; +import {console} from "forge-std/console.sol"; +import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; +import {PriceFeedFactory} from "contracts/extensions/PriceFeedFactory.sol"; + +contract DeployPriceFeeds is Script { + function run() public { + uint256 deployerPrivateKey = vm.envUint("ETH_MAINNET_DEPLOYER_PRIVATE_KEY"); + vm.startBroadcast(deployerPrivateKey); + address priceFeedFactoryAddress = 0xcac930B240163fDB71b74514E8FAA113ec0dA844; + PriceFeedFactory priceFeedFactory = PriceFeedFactory(priceFeedFactoryAddress); + + console.log("PriceFeedFactory deployed at", address(priceFeedFactory)); + // pendle deployments: https://github.com/pendle-finance/pendle-core-v2-public/blob/main/deployments/1-core.json + address pendlePYLpOracle = 0x9a9Fa8338dd5E5B2188006f1Cd2Ef26d921650C2; + address slvlUSDFeedAddr; + { + // chainlink(USDC/USD): https://data.chain.link/feeds/ethereum/mainnet/usdc-usd + // heartBeat: 86400 (24hr) + address usdcToUsd = 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6; + // Coingecko: https://www.coingecko.com/en/coins/staked-level-usd + address vault = 0x4737D9b4592B40d51e110b94c9C043c6654067Ae; + // new price feed heartBeat = max(86400) = 86400 (24hr) + AggregatorV3Interface slvlUSDFeed = + AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usdcToUsd, vault)); + (, int256 answer,,,) = slvlUSDFeed.latestRoundData(); + slvlUSDFeedAddr = address(slvlUSDFeed); + console.log("slvlUSD price feed address", address(slvlUSDFeed)); + console.log("slvlUSD last answer", answer); + } + + { + // pendle(PT-slvlUSD 25SEP2025): https://app.pendle.finance/trade/markets/0xc88ff954d42d3e11d43b62523b3357847c29377c/swap?view=pt&chain=ethereum&tab=info + address pt_market = 0xC88FF954d42d3e11D43B62523B3357847C29377c; + // new price feed heartBeat = max(86400) = 86400 (24hr) + AggregatorV3Interface ptFeed = AggregatorV3Interface( + priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, pt_market, 900, slvlUSDFeedAddr) + ); + (, int256 answer,,,) = ptFeed.latestRoundData(); + console.log("pt_slvlUSD_25SEP2025 price feed address", address(ptFeed)); + console.log("pt_slvlUSD_25SEP2025 last answer", answer); + } + + { + // pendle(PT-mMEV 31JUL2025): https://app.pendle.finance/trade/markets/0x266728b30c98b24de810e3325adc615486988cb2/swap?view=pt&chain=ethereum&tab=info + address pt_market = 0x266728b30c98B24De810E3325aDC615486988Cb2; + // custom price feed by themself + address mMEVToUsd = 0x5f09Aff8B9b1f488B7d1bbaD4D89648579e55d61; + // new price feed heartBeat = max(5*86400) = 5*86400 (5 days) + AggregatorV3Interface ptFeed = AggregatorV3Interface( + priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, pt_market, 900, mMEVToUsd) + ); + (, int256 answer,,,) = ptFeed.latestRoundData(); + console.log("pt_mMEV_31JUL2025 price feed address", address(ptFeed)); + console.log("pt_mMEV_31JUL2025 last answer", answer); + } + + vm.stopBroadcast(); + } +} diff --git a/script/deploy/DeployPriceFeedsEth_20250522.s.sol b/script/deploy/DeployPriceFeedsEth_20250522.s.sol new file mode 100644 index 0000000..e18ff43 --- /dev/null +++ b/script/deploy/DeployPriceFeedsEth_20250522.s.sol @@ -0,0 +1,141 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {Script} from "forge-std/Script.sol"; +import {console} from "forge-std/console.sol"; +import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; +import {PriceFeedFactory} from "contracts/extensions/PriceFeedFactory.sol"; + +contract DeployPriceFeeds is Script { + function run() public { + uint256 deployerPrivateKey = vm.envUint("ETH_MAINNET_DEPLOYER_PRIVATE_KEY"); + vm.startBroadcast(deployerPrivateKey); + address priceFeedFactoryAddress = 0xcac930B240163fDB71b74514E8FAA113ec0dA844; + PriceFeedFactory priceFeedFactory = PriceFeedFactory(priceFeedFactoryAddress); + + console.log("PriceFeedFactory deployed at", address(priceFeedFactory)); + // pendle deployments: https://github.com/pendle-finance/pendle-core-v2-public/blob/main/deployments/1-core.json + address pendlePYLpOracle = 0x9a9Fa8338dd5E5B2188006f1Cd2Ef26d921650C2; + + { + // pendle(PT-eUSDE-14AUG2025): https://app.pendle.finance/trade/markets/0xe93b4a93e80bd3065b290394264af5d82422ee70/swap?view=pt&chain=ethereum&chart=apy&tab=info + address pt_market = 0xE93B4A93e80BD3065B290394264af5d82422ee70; + // eUSDe primary price feed: https://docs.ts.finance/technical-details/oracles + // heartBeat: 86400 (24hr) + address eUSDeToUsdPrimary = 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3; + // new price feed heartBeat = max(86400) = 86400 (24hr) + AggregatorV3Interface ptFeedPrimary = AggregatorV3Interface( + priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, pt_market, 900, eUSDeToUsdPrimary) + ); + (, int256 answerPrimary,,,) = ptFeedPrimary.latestRoundData(); + console.log("PT-eUSDE-14AUG2025 primary price feed address", address(ptFeedPrimary)); + console.log("PT-eUSDE-14AUG2025 primary last answer", answerPrimary); + + // eUSDe secondary price feed: https://docs.ts.finance/technical-details/oracles + // heartBeat: 86400 (24hr) + address eUSDeToUsdSecondary = 0x6B09d473dB784D840E307Cb3Da63CbA79D300CAc; + // new price feed heartBeat = max(86400) = 86400 (24hr) + AggregatorV3Interface ptFeedSecondary = AggregatorV3Interface( + priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, pt_market, 900, eUSDeToUsdSecondary) + ); + (, int256 answerSecondary,,,) = ptFeedSecondary.latestRoundData(); + console.log("PT-eUSDE-14AUG2025 secondary price feed address", address(ptFeedSecondary)); + console.log("PT-eUSDE-14AUG2025 secondary last answer", answerSecondary); + } + + AggregatorV3Interface lbtcFeedPrimary; + AggregatorV3Interface lbtcFeedSecondary; + { + // chainlink(LBTC/BTC): https://data.chain.link/feeds/ethereum/mainnet/lbtc-btc + // heartBeat: 86400 (24hr) + address lbtcToBtcChainlink = 0x5c29868C58b6e15e2b962943278969Ab6a7D3212; + // chainlink(BTC/USD): https://data.chain.link/feeds/ethereum/mainnet/btc-usd + // heartBeat: 3600 (1hr) + address btcToUsdChainlink = 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c; + // new price feed heartBeat = max(3600, 86400) = 86400 (24hr) + lbtcFeedPrimary = + AggregatorV3Interface(priceFeedFactory.createPriceFeedConverter(lbtcToBtcChainlink, btcToUsdChainlink)); + (, int256 answerPrimary,,,) = lbtcFeedPrimary.latestRoundData(); + console.log("lbtc primary price feed address", address(lbtcFeedPrimary)); + console.log("lbtc primary last answer", answerPrimary); + + // redstone(LBTC/BTC): https://app.redstone.finance/app/feeds/?page=1&sortBy=popularity&sortDesc=false&perPage=32&search=LBTC + // heartBeat: 86400 (24hr) + address lbtcToBtcRedstone = 0xb415eAA355D8440ac7eCB602D3fb67ccC1f0bc81; + // redstone(BTC/USD): https://app.redstone.finance/app/feeds/?page=1&sortBy=popularity&sortDesc=false&perPage=32&search=BTC + // heartBeat: 86400 (24hr) + address btcToUsdRedstone = 0xAB7f623fb2F6fea6601D4350FA0E2290663C28Fc; + // new price feed heartBeat = max(86400, 86400) = 86400 (24hr) + lbtcFeedSecondary = + AggregatorV3Interface(priceFeedFactory.createPriceFeedConverter(lbtcToBtcRedstone, btcToUsdRedstone)); + (, int256 answerSecondary,,,) = lbtcFeedSecondary.latestRoundData(); + console.log("lbtc secondary price feed address", address(lbtcFeedSecondary)); + console.log("lbtc secondary last answer", answerSecondary); + } + + { + // pendle(PT-LBTC-26JUN2025): https://app.pendle.finance/trade/markets/0x931f7ea0c31c14914a452d341bc5cb5d996be71d/swap?view=pt&chain=ethereum&chart=apy&tab=info + address pt_market = 0x931F7eA0c31c14914a452d341bc5Cb5d996BE71d; + // LBTC primary price feed: deployed in the same script + // heartBeat: 86400 (24hr) + // new price feed heartBeat = max(86400) = 86400 (24hr) + AggregatorV3Interface ptFeedPrimary = AggregatorV3Interface( + priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, pt_market, 900, address(lbtcFeedPrimary)) + ); + (, int256 answerPrimary,,,) = ptFeedPrimary.latestRoundData(); + console.log("PT-LBTC-26JUN2025 primary price feed address", address(ptFeedPrimary)); + console.log("PT-LBTC-26JUN2025 primary last answer", answerPrimary); + + // LBTC secondary price feed: deployed in the same script + // heartBeat: 86400 (24hr) + // new price feed heartBeat = max(86400) = 86400 (24hr) + AggregatorV3Interface ptFeedSecondary = AggregatorV3Interface( + priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, pt_market, 900, address(lbtcFeedSecondary)) + ); + (, int256 answerSecondary,,,) = ptFeedSecondary.latestRoundData(); + console.log("PT-LBTC-26JUN2025 secondary price feed address", address(ptFeedSecondary)); + console.log("PT-LBTC-26JUN2025 secondary last answer", answerSecondary); + } + + { + // chainlink(ETH/USD): https://data.chain.link/feeds/ethereum/mainnet/eth-usd + // heartBeat: 3600 (1hr) + address ethToUsdChainlink = 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419; + // YieldNest: https://docs.yieldnest.finance/protocol-design/max-lrts/yneth-max-ynethx + address vault = 0x657d9ABA1DBb59e53f9F3eCAA878447dCfC96dCb; + // new price feed heartBeat = max(3600) = 3600 (24hr) + AggregatorV3Interface ynEthxPriceFeedPrimary = + AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(ethToUsdChainlink, vault)); + (, int256 answerPrimary,,,) = ynEthxPriceFeedPrimary.latestRoundData(); + console.log("ynEthx primary price feed address", address(ynEthxPriceFeedPrimary)); + console.log("ynEthx primary last answer", answerPrimary); + + // redstone(ETH/USD): https://app.redstone.finance/app/feeds/?page=1&sortBy=popularity&sortDesc=false&perPage=32&search=ETH%2FUSD + // heartBeat: 86400 (24hr) + address ethToUsdRedstone = 0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4; + // new price feed heartBeat = max(86400) = 86400 (24hr) + AggregatorV3Interface ynEthxPriceFeedSecondary = + AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(ethToUsdRedstone, vault)); + (, int256 answerSecondary,,,) = ynEthxPriceFeedSecondary.latestRoundData(); + console.log("ynEthx secondary price feed address", address(ynEthxPriceFeedSecondary)); + console.log("ynEthx secondary last answer", answerSecondary); + } + + { + // pendle(PT-USDS-14AUG2025): https://app.pendle.finance/trade/markets/0xdace1121e10500e9e29d071f01593fd76b000f08/swap?view=pt&chain=ethereum&chart=apy&tab=info + address pt_market = 0xdacE1121e10500e9e29d071F01593fD76B000f08; + // chainlink(USDS/USD): https://data.chain.link/feeds/ethereum/mainnet/usds-usd + address usdsToUsdChainlink = 0xfF30586cD0F29eD462364C7e81375FC0C71219b1; + // heartBeat: 86400 (24hr) + // new price feed heartBeat = max(86400) = 86400 (24hr) + AggregatorV3Interface ptFeedPrimary = AggregatorV3Interface( + priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, pt_market, 900, usdsToUsdChainlink) + ); + (, int256 answerPrimary,,,) = ptFeedPrimary.latestRoundData(); + console.log("PT-USDS-14AUG2025 primary price feed address", address(ptFeedPrimary)); + console.log("PT-USDS-14AUG2025 primary last answer", answerPrimary); + } + + vm.stopBroadcast(); + } +} diff --git a/script/deploy/DeployPriceFeedsMorpho.s.sol b/script/deploy/DeployPriceFeedsMorpho.s.sol new file mode 100644 index 0000000..2520e4d --- /dev/null +++ b/script/deploy/DeployPriceFeedsMorpho.s.sol @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {Script} from "forge-std/Script.sol"; +import {console} from "forge-std/console.sol"; +import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; +import {PriceFeedFactory} from "contracts/extensions/PriceFeedFactory.sol"; + +contract DeployPriceFeeds is Script { + function run() public { + uint256 deployerPrivateKey = vm.envUint("ETH_MAINNET_DEPLOYER_PRIVATE_KEY"); + vm.startBroadcast(deployerPrivateKey); + PriceFeedFactory priceFeedFactory = new PriceFeedFactory(); + + { + // morpho(gtusdcf): https://app.morpho.org/ethereum/vault/0xc582F04d8a82795aa2Ff9c8bb4c1c889fe7b754e/gauntlet-usdc-frontier + address gtusdcfVault = 0xc582F04d8a82795aa2Ff9c8bb4c1c889fe7b754e; + // chainlink(USDC/USD): https://data.chain.link/feeds/ethereum/mainnet/usdc-usd + // heartBeat: 86400 (24hr) + address usdcToUsd = 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6; + // new price feed heartBeat = max(86400) = 86400 (24hr) + AggregatorV3Interface gtusdcfFeed = + AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usdcToUsd, gtusdcfVault)); + (, int256 answer,,,) = gtusdcfFeed.latestRoundData(); + console.log("gtusdcf price feed address", address(gtusdcfFeed)); + console.log("gtusdcf last answer", answer); + } + + { + // morpho(MC-wETH): https://app.morpho.org/ethereum/vault/0x701907283a57FF77E255C3f1aAD790466B8CE4ef/index-coop-hyeth + address mhyETHVault = 0x701907283a57FF77E255C3f1aAD790466B8CE4ef; + // chainlink(ETH/USD): https://data.chain.link/feeds/ethereum/mainnet/eth-usd + // heartBeat: 3600 (1hr) + address wethToUsd = 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419; + // new price feed heartBeat = max(3600) = 3600 (1hr) + AggregatorV3Interface mhyETHFeed = + AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(wethToUsd, mhyETHVault)); + (, int256 answer,,,) = mhyETHFeed.latestRoundData(); + console.log("mhyETH price feed address", address(mhyETHFeed)); + console.log("mhyETH last answer", answer); + } + + { + // morpho(MC-wETH): https://app.morpho.org/ethereum/vault/0x701907283a57FF77E255C3f1aAD790466B8CE4ef/index-coop-hyeth + address mhyETHVault = 0x701907283a57FF77E255C3f1aAD790466B8CE4ef; + // redstone(ETH/USD): https://app.redstone.finance/app/feeds/?search=ETH%2FUSD&page=1&sortBy=popularity&sortDesc=false&perPage=32 + // heartBeat: 86400 (24hr) + address wethToUsd = 0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4; + // new price feed heartBeat = max(86400) = 86400 (24hr) + AggregatorV3Interface mhyETHBackupFeed = + AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(wethToUsd, mhyETHVault)); + (, int256 answer,,,) = mhyETHBackupFeed.latestRoundData(); + console.log("mhyETHBackup price feed address", address(mhyETHBackupFeed)); + console.log("mhyETHBackup last answer", answer); + } + + { + // morpho(MC_USDCP): https://app.morpho.org/ethereum/vault/0xf1fd8AC6346eC7BC4116Ba7aDc81102B2BC4C52D/mev-capital-usdc-prime + address mevUsdcPrimeVault = 0xf1fd8AC6346eC7BC4116Ba7aDc81102B2BC4C52D; + // chainlink(USDC/USD): https://data.chain.link/feeds/ethereum/mainnet/usdc-usd + // heartBeat: 86400 (24hr) + address usdcToUsd = 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6; + // new price feed heartBeat = max(86400) = 86400 (24hr) + AggregatorV3Interface mevUsdcPrimeFeed = + AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usdcToUsd, mevUsdcPrimeVault)); + (, int256 answer,,,) = mevUsdcPrimeFeed.latestRoundData(); + console.log("mevUsdcPrime price feed address", address(mevUsdcPrimeFeed)); + console.log("mevUsdcPrime last answer", answer); + } + + vm.stopBroadcast(); + } +} diff --git a/script/deploy/DeployVault.s.sol b/script/deploy/DeployVault.s.sol index 2188105..4dca0d8 100644 --- a/script/deploy/DeployVault.s.sol +++ b/script/deploy/DeployVault.s.sol @@ -30,15 +30,15 @@ import {AccessManager} from "contracts/access/AccessManager.sol"; contract DeloyVault is DeployBase { // Initialize vault configurations with a single USDC vault - address assetAddr = address(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48); - address curator = address(0x2A58A3D405c527491Daae4C62561B949e7F87EFE); - address guardian = address(0x2A58A3D405c527491Daae4C62561B949e7F87EFE); - address allocator = address(0x2A58A3D405c527491Daae4C62561B949e7F87EFE); - string name = "TermMax USDC Vault"; - string symbol = "TermMax USDC Vault"; - uint256 timelock = 1; - uint256 maxCapacity = 10000000e6; - uint64 performanceFeeRate = 0.1e8; + address assetAddr = address(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2); + address curator = address(0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c); + address guardian = address(0x6383EDe871F8B0167905C2466505381CDcD9cC78); + address allocator = address(0x518C292A86450808E593Bcf26Fc29A7a7b682198); + string name = "TermMax WETH Coll-Deliverable Vault"; + string symbol = "TMX-WETH-Delivery-Vault"; + uint256 timelock = 1 days; + uint256 maxCapacity = 4000e18; + uint64 performanceFeeRate = 0; // Network-specific config loaded from environment variables string network; diff --git a/script/deploy/DeployVaultFactory.s.sol b/script/deploy/DeployVaultFactory.s.sol new file mode 100644 index 0000000..6e4e343 --- /dev/null +++ b/script/deploy/DeployVaultFactory.s.sol @@ -0,0 +1,142 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {Script} from "forge-std/Script.sol"; +import {VmSafe} from "forge-std/Vm.sol"; +import "forge-std/console.sol"; +import {TermMaxFactory} from "contracts/factory/TermMaxFactory.sol"; +import {ITermMaxFactory} from "contracts/factory/ITermMaxFactory.sol"; +import {ITermMaxRouter} from "contracts/router/ITermMaxRouter.sol"; +import {MarketViewer} from "contracts/router/MarketViewer.sol"; +import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import {TermMaxMarket} from "contracts/TermMaxMarket.sol"; +import {MockERC20} from "contracts/test/MockERC20.sol"; +import {MockPriceFeed} from "contracts/test/MockPriceFeed.sol"; +import {MarketConfig} from "contracts/storage/TermMaxStorage.sol"; +import {IMintableERC20} from "contracts/tokens/IMintableERC20.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import {SwapAdapter} from "contracts/test/testnet/SwapAdapter.sol"; +import {Faucet} from "contracts/test/testnet/Faucet.sol"; +import {DeployBase} from "./DeployBase.s.sol"; +import {IOracle} from "contracts/oracle/IOracle.sol"; +import {VaultFactory, IVaultFactory} from "contracts/factory/VaultFactory.sol"; +import {KyberswapV2Adapter} from "contracts/router/swapAdapters/KyberswapV2Adapter.sol"; +import {OdosV2Adapter} from "contracts/router/swapAdapters/OdosV2Adapter.sol"; +import {PendleSwapV3Adapter} from "contracts/router/swapAdapters/PendleSwapV3Adapter.sol"; +import {UniswapV3Adapter} from "contracts/router/swapAdapters/UniswapV3Adapter.sol"; +import {ERC4626VaultAdapter} from "contracts/router/swapAdapters/ERC4626VaultAdapter.sol"; +import {AccessManager} from "contracts/access/AccessManager.sol"; + +contract DeployVaultFactory is DeployBase { + // Network-specific config loaded from environment variables + string network; + uint256 deployerPrivateKey; + address deployerAddr; + address adminAddr; + address accessManagerAddr; + address uniswapV3RouterAddr; + address odosV2RouterAddr; + address pendleSwapV3RouterAddr; + uint256 oracleTimelock; + + AccessManager accessManager; + ITermMaxFactory factory; + IVaultFactory vaultFactory; + IOracle oracleAggregator; + ITermMaxRouter router; + MarketViewer marketViewer; + UniswapV3Adapter uniswapV3Adapter; + OdosV2Adapter odosV2Adapter; + PendleSwapV3Adapter pendleSwapV3Adapter; + ERC4626VaultAdapter vaultAdapter; + SwapAdapter swapAdapter; + Faucet faucet; + + function setUp() public { + // Load network from environment variable + network = vm.envString("NETWORK"); + string memory networkUpper = toUpper(network); + + // Load network-specific configuration + string memory privateKeyVar = string.concat(networkUpper, "_DEPLOYER_PRIVATE_KEY"); + deployerPrivateKey = vm.envUint(privateKeyVar); + deployerAddr = vm.addr(deployerPrivateKey); + } + + function run() public { + console.log("Network:", network); + console.log("Deployer balance:", deployerAddr.balance); + + uint256 currentBlock = block.number; + uint256 currentTimestamp = block.timestamp; + + vm.startBroadcast(deployerPrivateKey); + // deploy vault factory + vaultFactory = deployVaultFactory(); + vm.stopBroadcast(); + + console.log("===== Git Info ====="); + console.log("Git branch:", getGitBranch()); + console.log("Git commit hash:"); + console.logBytes(getGitCommitHash()); + console.log(); + + console.log("===== Block Info ====="); + console.log("Block number:", currentBlock); + console.log("Block timestamp:", currentTimestamp); + console.log(); + + console.log("===== Vault Factory Info ====="); + console.log("Deployer:", deployerAddr); + console.log("Vault Factory deployed at:", address(vaultFactory)); + console.log(); + + // Write deployment results to a JSON file + string memory deploymentJson = string( + abi.encodePacked( + "{\n", + ' "network": "', + network, + '",\n', + ' "deployedAt": "', + vm.toString(block.timestamp), + '",\n', + ' "gitBranch": "', + getGitBranch(), + '",\n', + ' "gitCommitHash": "0x', + vm.toString(getGitCommitHash()), + '",\n', + ' "blockInfo": {\n', + ' "number": "', + vm.toString(currentBlock), + '",\n', + ' "timestamp": "', + vm.toString(currentTimestamp), + '"\n', + " },\n", + ' "deployer": "', + vm.toString(deployerAddr), + '",\n', + ' "contracts": {\n', + ' "vaultFactory": "', + vm.toString(address(vaultFactory)), + '"\n', + " }\n", + "}" + ) + ); + + // Create deployment directory if it doesn't exist + string memory deploymentsDir = string.concat(vm.projectRoot(), "/deployments/", network); + if (!vm.exists(deploymentsDir)) { + vm.createDir(deploymentsDir, true); + } + + // Write the JSON file + string memory filePath = string.concat(deploymentsDir, "/", network, "-vault-factory.json"); + vm.writeFile(filePath, deploymentJson); + console.log("Deployment information written to:", filePath); + } +} diff --git a/script/deploy/deploydata/arb-mainnet-official.json b/script/deploy/deploydata/arb-mainnet-official.json new file mode 100644 index 0000000..33bda00 --- /dev/null +++ b/script/deploy/deploydata/arb-mainnet-official.json @@ -0,0 +1,278 @@ +{ + "configNum": "7", + "configs": { + "configs_0": { + "salt": 0, + "collateralCapForGt": "445479897741487000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "priceFeedAddr": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400", + "name": "Wrapped ETH", + "symbol": "WETH", + "decimals": "18", + "initialPrice": "187575000000" + }, + "collateralConfig": { + "tokenAddr": "0x5979D7b546E38E414F7E9822514be443A4800529", + "priceFeedAddr": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400", + "name": "Wrapped liquid staked Ether 2.0", + "symbol": "wstETH", + "decimals": "18", + "initialPrice": "224477000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "WETH/wstETH@30MAY2025", + "marketSymbol": "WETH/wstETH@30MAY2025" + }, + "configs_1": { + "salt": 0, + "collateralCapForGt": "445479897741487000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "85000000", + "maxLtv": "81000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "priceFeedAddr": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x5979D7b546E38E414F7E9822514be443A4800529", + "priceFeedAddr": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400", + "name": "Wrapped liquid staked Ether 2.0", + "symbol": "wstETH", + "decimals": "18", + "initialPrice": "224477000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/wstETH@30MAY2025", + "marketSymbol": "USDC/wstETH@30MAY2025" + }, + "configs_2": { + "salt": 0, + "collateralCapForGt": "1163881498", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "86000000", + "maxLtv": "82000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "priceFeedAddr": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f", + "priceFeedAddr": "0xd0C7101eACbB49F3deCcCc166d238410D6D46d57", + "heartBeat": "86400", + "name": "Wrapped BTC", + "symbol": "WBTC", + "decimals": "8", + "initialPrice": "8591939999999", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/WBTC@30MAY2025", + "marketSymbol": "USDC/WBTC@30MAY2025" + }, + "configs_3": { + "salt": 0, + "collateralCapForGt": "501777122226150000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "93000000", + "maxLtv": "89000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "priceFeedAddr": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400", + "name": "Wrapped ETH", + "symbol": "WETH", + "decimals": "18", + "initialPrice": "187575000000" + }, + "collateralConfig": { + "tokenAddr": "0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe", + "priceFeedAddr": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400", + "name": "Wrapped eETH", + "symbol": "weETH", + "decimals": "18", + "initialPrice": "199292000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "WETH/weETH@30MAY2025", + "marketSymbol": "WETH/weETH@30MAY2025" + }, + "configs_4": { + "salt": 0, + "collateralCapForGt": "533120687875231000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "86000000", + "maxLtv": "82000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "priceFeedAddr": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "priceFeedAddr": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400", + "name": "Wrapped ETH", + "symbol": "WETH", + "decimals": "18", + "initialPrice": "187575000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/WETH@30MAY2025", + "marketSymbol": "USDC/WETH@30MAY2025" + }, + "configs_5": { + "salt": 0, + "collateralCapForGt": "2760143527463430000000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "70000000", + "maxLtv": "60000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "priceFeedAddr": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x912CE59144191C1204E64559FE8253a0e49E6548", + "priceFeedAddr": "0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6", + "heartBeat": "86400", + "name": "Arbitrum", + "symbol": "ARB", + "decimals": "18", + "initialPrice": "36000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/ARB@30MAY2025", + "marketSymbol": "USDC/ARB@30MAY2025" + }, + "configs_6": { + "salt": 0, + "collateralCapForGt": "537885856860641000000", + "marketConfig": { + "maturity": "1750982400", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "priceFeedAddr": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400", + "name": "Wrapped ETH", + "symbol": "WETH", + "decimals": "18", + "initialPrice": "187575000000" + }, + "collateralConfig": { + "tokenAddr": "0xb33808ea0e883138680BA29311a220A7377cdb92", + "priceFeedAddr": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400", + "name": "PT weETH 26JUN2025", + "symbol": "PT-weETH-26JUN2025", + "decimals": "18", + "initialPrice": "185913000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "WETH/PT-weETH-26JUN2025@27JUN2025", + "marketSymbol": "WETH/PT-weETH-26JUN2025@27JUN2025" + } + } +} \ No newline at end of file diff --git a/script/deploy/deploydata/arb-mainnet.csv b/script/deploy/deploydata/arb-mainnet.csv index ec082c9..3bd0d22 100644 --- a/script/deploy/deploydata/arb-mainnet.csv +++ b/script/deploy/deploydata/arb-mainnet.csv @@ -1,9 +1,15 @@ -,,,,,,,,,,loanConfig,,,underlyingConfig,,,,,,,collateralConfig,,,,,,,,,, -Market Type,salt,collateralCapForGt,maturity,lendTakerFeeRatio,lendMakerFeeRatio,borrowTakerFeeRatio,borrowMakerFeeRatio,mintGtFeeRatio,mintGtFeeRef,liquidationLtv,maxLtv,liquidatable,tokenAddr,priceFeedAddr,heartBeat,name,symbol,decimals,initialPrice,tokenAddr,priceFeedAddr,heartBeat,name,symbol,decimals,initialPrice,gtKeyIdentifier,note,, -Borrow,0,"444,327,502,741,153,000,000",1748563200,2000000,2000000,3000000,3000000,1000000,400000,94000000,90000000,TRUE,0x82aF49447D8a07e3bd95BD0d56f35241523fBab1,0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612,86400,Wrapped ETH,WETH,18,1880.61,0x5979D7b546E38E414F7E9822514be443A4800529,note,,Wrapped liquid staked Ether 2.0,wstETH,18,2250.59,GearingTokenWithERC20,USD/wstETH = ETH/wstETH * USD/ETH,0xb523AE262D20A936BC152e6023996e46FDC2A95D,0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 -Borrow,0,"444,327,502,741,153,000,000",1748563200,2000000,2000000,3000000,3000000,1000000,2000000,85000000,81000000,TRUE,0xaf88d065e77c8cC2239327C5EDb3A432268e5831,0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3,86400,USD Coin,USDC,6,1,0x5979D7b546E38E414F7E9822514be443A4800529,note,,Wrapped liquid staked Ether 2.0,wstETH,18,2250.59,GearingTokenWithERC20,USD/wstETH = ETH/wstETH * USD/ETH,0xb523AE262D20A936BC152e6023996e46FDC2A95D,0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 -Borrow,0,"1,192,960,104",1748563200,2000000,2000000,3000000,3000000,1000000,2000000,86000000,82000000,TRUE,0xaf88d065e77c8cC2239327C5EDb3A432268e5831,0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3,86400,USD Coin,USDC,6,1,0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f,0xd0C7101eACbB49F3deCcCc166d238410D6D46d57,86400,Wrapped BTC,WBTC,8,83825.10,GearingTokenWithERC20,,, -Borrow,0,"500,479,094,077,479,000,000",1748563200,2000000,2000000,3000000,3000000,1000000,400000,93000000,89000000,TRUE,0x82aF49447D8a07e3bd95BD0d56f35241523fBab1,0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612,86400,Wrapped ETH,WETH,18,1880.61,0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe,note,,Wrapped eETH,weETH,18,1998.09,GearingTokenWithERC20,USD/weETH = ETH/weETH * USD/ETH,0xE141425bc1594b8039De6390db1cDaf4397EA22b,0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 -Borrow,0,"531,741,578,248,968,000,000",1748563200,2000000,2000000,3000000,3000000,1000000,2000000,86000000,82000000,TRUE,0xaf88d065e77c8cC2239327C5EDb3A432268e5831,0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3,86400,USD Coin,USDC,6,1,0x82aF49447D8a07e3bd95BD0d56f35241523fBab1,0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612,86400,Wrapped ETH,WETH,18,1880.61,GearingTokenWithERC20,,, -Borrow,0,"2,760,143,527,463,430,000,000,000",1748563200,2000000,2000000,3000000,3000000,1000000,2000000,70000000,60000000,TRUE,0xaf88d065e77c8cC2239327C5EDb3A432268e5831,0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3,86400,USD Coin,USDC,6,1,0x912CE59144191C1204E64559FE8253a0e49E6548,0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6,86400,Arbitrum,ARB,18,0.36,GearingTokenWithERC20,,, -Leverage,0,"536,494,420,400,008,000,000",1750982400,2000000,2000000,3000000,3000000,1000000,400000,94000000,90000000,TRUE,0x82aF49447D8a07e3bd95BD0d56f35241523fBab1,0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612,86400,Wrapped ETH,WETH,18,1880.61,0xb33808ea0e883138680BA29311a220A7377cdb92,,,PT weETH 26JUN2025,PT-weETH-26JUN2025,18,1863.95,GearingTokenWithERC20,,, \ No newline at end of file +,,,marketConfig,,,,,,,loanConfig,,,underlyingConfig,,,,,,,,collateralConfig,,,,,,,,,,, +Market Type,salt,collateralCapForGt,maturity,lendTakerFeeRatio,lendMakerFeeRatio,borrowTakerFeeRatio,borrowMakerFeeRatio,mintGtFeeRatio,mintGtFeeRef,liquidationLtv,maxLtv,liquidatable,tokenAddr,priceFeedAddr,heartBeat,backupPriceFeedAddr,name,symbol,decimals,initialPrice,tokenAddr,priceFeedAddr,heartBeat,backupPriceFeedAddr,name,symbol,decimals,initialPrice,gtKeyIdentifier,note,, +Borrow,0,"437,808,584,627,820,000,000",1748563200,2000000,2000000,3000000,3000000,10000000,4000000,94000000,90000000,true,0x82aF49447D8a07e3bd95BD0d56f35241523fBab1,0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612,86400,0xd68AeF8Ab6D86CeC502e08Faa376297d836FdfA6,Wrapped ETH,WETH,18,1908.6149,0x5979D7b546E38E414F7E9822514be443A4800529,0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761,86400,0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761,Wrapped liquid staked Ether 2.0,wstETH,18,2284.10,GearingTokenWithERC20,USD/wstETH = ETH/wstETH * USD/ETH,0xb523AE262D20A936BC152e6023996e46FDC2A95D,0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 +Borrow,0,"437,808,584,627,820,000,000",1748563200,2000000,2000000,3000000,3000000,10000000,10000000,85000000,81000000,true,0xaf88d065e77c8cC2239327C5EDb3A432268e5831,0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3,86400,0x399A965083E512011c82AAEB6A86036463010C95,USD Coin,USDC,6,1.0000,0x5979D7b546E38E414F7E9822514be443A4800529,0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761,86400,0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761,Wrapped liquid staked Ether 2.0,wstETH,18,2284.10,GearingTokenWithERC20,USD/wstETH = ETH/wstETH * USD/ETH,0xb523AE262D20A936BC152e6023996e46FDC2A95D,0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 +Borrow,0,"1,007,693,132",1748563200,2000000,2000000,3000000,3000000,10000000,10000000,86000000,82000000,true,0xaf88d065e77c8cC2239327C5EDb3A432268e5831,0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3,86400,0x399A965083E512011c82AAEB6A86036463010C95,USD Coin,USDC,6,1.0000,0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f,0xd0C7101eACbB49F3deCcCc166d238410D6D46d57,86400,0x31FEeac9552a6215BD23Bd8c590B34BF04d865AE,Wrapped BTC,WBTC,8,99236.56,GearingTokenWithERC20,,, +Borrow,0,"493,136,352,042,384,000,000",1748563200,2000000,2000000,3000000,3000000,10000000,4000000,93000000,89000000,true,0x82aF49447D8a07e3bd95BD0d56f35241523fBab1,0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612,86400,0xd68AeF8Ab6D86CeC502e08Faa376297d836FdfA6,Wrapped ETH,WETH,18,1908.6149,0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe,0x8f29Df42c617C222Bc2B416AC8a022E85e853276,86400,0xc2052500D0Cb8E1E8838717502A6B113C64Ed258,Wrapped eETH,weETH,18,2027.84,GearingTokenWithERC20,USD/weETH = ETH/weETH * USD/ETH,0xE141425bc1594b8039De6390db1cDaf4397EA22b,0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 +Borrow,0,"523,940,170,988,164,000,000",1748563200,2000000,2000000,3000000,3000000,10000000,10000000,86000000,82000000,true,0xaf88d065e77c8cC2239327C5EDb3A432268e5831,0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3,86400,0x399A965083E512011c82AAEB6A86036463010C95,USD Coin,USDC,6,1.0000,0x82aF49447D8a07e3bd95BD0d56f35241523fBab1,0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612,86400,0xd68AeF8Ab6D86CeC502e08Faa376297d836FdfA6,Wrapped ETH,WETH,18,1908.61,GearingTokenWithERC20,,, +Borrow,0,"2,760,143,527,463,430,000,000,000",1748563200,2000000,2000000,3000000,3000000,10000000,10000000,70000000,60000000,true,0xaf88d065e77c8cC2239327C5EDb3A432268e5831,0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3,86400,0x399A965083E512011c82AAEB6A86036463010C95,USD Coin,USDC,6,1.0000,0x912CE59144191C1204E64559FE8253a0e49E6548,0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6,86400,0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6,Arbitrum,ARB,18,0.36,GearingTokenWithERC20,,, +Leverage,0,"528,623,282,166,898,000,000",1750982400,2000000,2000000,3000000,3000000,10000000,4000000,94000000,90000000,true,0x82aF49447D8a07e3bd95BD0d56f35241523fBab1,0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612,86400,0xd68AeF8Ab6D86CeC502e08Faa376297d836FdfA6,Wrapped ETH,WETH,18,1908.6149,0xb33808ea0e883138680BA29311a220A7377cdb92,0x2a2a0e32c54670045256EBcA681887E32e689E97,86400,0x745716b8c00CAE49c422D706f630A1084B906759,PT weETH 26JUN2025,PT-weETH-26JUN2025,18,1891.71,GearingTokenWithERC20,,, +Borrow,0,"455,279,691,624,029,000,000",1750982400,2000000,2000000,3000000,3000000,10000000,4000000,94000000,90000000,true,0x82aF49447D8a07e3bd95BD0d56f35241523fBab1,0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612,86400,0xd68AeF8Ab6D86CeC502e08Faa376297d836FdfA6,Wrapped ETH,WETH,18,1908.6149,0x5979D7b546E38E414F7E9822514be443A4800529,0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761,86400,0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761,Wrapped liquid staked Ether 2.0,wstETH,18,2284.10,GearingTokenWithERC20,,, +Borrow,0,"455,279,691,624,029,000,000",1750982400,2000000,2000000,3000000,3000000,10000000,10000000,85000000,81000000,true,0xaf88d065e77c8cC2239327C5EDb3A432268e5831,0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3,86400,0x399A965083E512011c82AAEB6A86036463010C95,USD Coin,USDC,6,1.0000,0x5979D7b546E38E414F7E9822514be443A4800529,0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761,86400,0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761,Wrapped liquid staked Ether 2.0,wstETH,18,2284.10,GearingTokenWithERC20,,, +Borrow,0,"1,033,143,128",1750982400,2000000,2000000,3000000,3000000,10000000,10000000,85000000,81000000,true,0xaf88d065e77c8cC2239327C5EDb3A432268e5831,0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3,86400,0x399A965083E512011c82AAEB6A86036463010C95,USD Coin,USDC,6,1.0000,0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f,0xd0C7101eACbB49F3deCcCc166d238410D6D46d57,86400,0x31FEeac9552a6215BD23Bd8c590B34BF04d865AE,Wrapped BTC,WBTC,8,99236.56,GearingTokenWithERC20,,, +Borrow,0,"512,815,358,514,074,000,000",1750982400,2000000,2000000,3000000,3000000,10000000,4000000,94000000,90000000,true,0x82aF49447D8a07e3bd95BD0d56f35241523fBab1,0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612,86400,0xd68AeF8Ab6D86CeC502e08Faa376297d836FdfA6,Wrapped ETH,WETH,18,1908.6149,0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe,0x8f29Df42c617C222Bc2B416AC8a022E85e853276,86400,0xc2052500D0Cb8E1E8838717502A6B113C64Ed258,Wrapped eETH,weETH,18,2027.84,GearingTokenWithERC20,,, +Borrow,0,"544,848,428,862,385,000,000",1750982400,2000000,2000000,3000000,3000000,10000000,10000000,85000000,81000000,true,0xaf88d065e77c8cC2239327C5EDb3A432268e5831,0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3,86400,0x399A965083E512011c82AAEB6A86036463010C95,USD Coin,USDC,6,1.0000,0x82aF49447D8a07e3bd95BD0d56f35241523fBab1,0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612,86400,0xd68AeF8Ab6D86CeC502e08Faa376297d836FdfA6,Wrapped ETH,WETH,18,1908.61,GearingTokenWithERC20,,, +Borrow,0,"2,760,143,527,463,430,000,000,000",1750982400,2000000,2000000,3000000,3000000,10000000,10000000,70000000,60000000,true,0xaf88d065e77c8cC2239327C5EDb3A432268e5831,0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3,86400,0x399A965083E512011c82AAEB6A86036463010C95,USD Coin,USDC,6,1.0000,0x912CE59144191C1204E64559FE8253a0e49E6548,0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6,86400,0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6,Arbitrum,ARB,18,0.36,GearingTokenWithERC20,,, \ No newline at end of file diff --git a/script/deploy/deploydata/arb-mainnet.json b/script/deploy/deploydata/arb-mainnet.json index 45c1f93..be0e82d 100644 --- a/script/deploy/deploydata/arb-mainnet.json +++ b/script/deploy/deploydata/arb-mainnet.json @@ -1,17 +1,17 @@ { - "configNum": "7", + "configNum": "6", "configs": { "configs_0": { "salt": 0, - "collateralCapForGt": "444327502741153000000", + "collateralCapForGt": "455279691624029000000", "marketConfig": { - "maturity": "1748563200", + "maturity": "1750982400", "lendTakerFeeRatio": "2000000", "lendMakerFeeRatio": "2000000", "borrowTakerFeeRatio": "3000000", "borrowMakerFeeRatio": "3000000", - "mintGtFeeRatio": "1000000", - "mintGtFeeRef": "400000" + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "4000000" }, "loanConfig": { "liquidationLtv": "94000000", @@ -21,36 +21,38 @@ "underlyingConfig": { "tokenAddr": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", "priceFeedAddr": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "backupPriceFeedAddr": "0xd68AeF8Ab6D86CeC502e08Faa376297d836FdfA6", "heartBeat": "86400", "name": "Wrapped ETH", "symbol": "WETH", "decimals": "18", - "initialPrice": "188061000000" + "initialPrice": "190861490000" }, "collateralConfig": { "tokenAddr": "0x5979D7b546E38E414F7E9822514be443A4800529", - "priceFeedAddr": "note", - "heartBeat": "3600", + "priceFeedAddr": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "backupPriceFeedAddr": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400", "name": "Wrapped liquid staked Ether 2.0", "symbol": "wstETH", "decimals": "18", - "initialPrice": "225059000000", + "initialPrice": "228410000000", "gtKeyIdentifier": "GearingTokenWithERC20" }, - "marketName": "WETH/wstETH-30MAY2025", - "marketSymbol": "WETH/wstETH-30MAY2025" + "marketName": "WETH/wstETH@27JUN2025", + "marketSymbol": "WETH/wstETH@27JUN2025" }, "configs_1": { "salt": 0, - "collateralCapForGt": "444327502741153000000", + "collateralCapForGt": "455279691624029000000", "marketConfig": { - "maturity": "1748563200", + "maturity": "1750982400", "lendTakerFeeRatio": "2000000", "lendMakerFeeRatio": "2000000", "borrowTakerFeeRatio": "3000000", "borrowMakerFeeRatio": "3000000", - "mintGtFeeRatio": "1000000", - "mintGtFeeRef": "2000000" + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "10000000" }, "loanConfig": { "liquidationLtv": "85000000", @@ -60,6 +62,7 @@ "underlyingConfig": { "tokenAddr": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", "priceFeedAddr": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "backupPriceFeedAddr": "0x399A965083E512011c82AAEB6A86036463010C95", "heartBeat": "86400", "name": "USD Coin", "symbol": "USDC", @@ -68,37 +71,39 @@ }, "collateralConfig": { "tokenAddr": "0x5979D7b546E38E414F7E9822514be443A4800529", - "priceFeedAddr": "note", - "heartBeat": "3600", + "priceFeedAddr": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "backupPriceFeedAddr": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400", "name": "Wrapped liquid staked Ether 2.0", "symbol": "wstETH", "decimals": "18", - "initialPrice": "225059000000", + "initialPrice": "228410000000", "gtKeyIdentifier": "GearingTokenWithERC20" }, - "marketName": "USDC/wstETH-30MAY2025", - "marketSymbol": "USDC/wstETH-30MAY2025" + "marketName": "USDC/wstETH@27JUN2025", + "marketSymbol": "USDC/wstETH@27JUN2025" }, "configs_2": { "salt": 0, - "collateralCapForGt": "1192960104", + "collateralCapForGt": "1033143128", "marketConfig": { - "maturity": "1748563200", + "maturity": "1750982400", "lendTakerFeeRatio": "2000000", "lendMakerFeeRatio": "2000000", "borrowTakerFeeRatio": "3000000", "borrowMakerFeeRatio": "3000000", - "mintGtFeeRatio": "1000000", - "mintGtFeeRef": "2000000" + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "10000000" }, "loanConfig": { - "liquidationLtv": "86000000", - "maxLtv": "82000000", + "liquidationLtv": "85000000", + "maxLtv": "81000000", "liquidatable": true }, "underlyingConfig": { "tokenAddr": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", "priceFeedAddr": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "backupPriceFeedAddr": "0x399A965083E512011c82AAEB6A86036463010C95", "heartBeat": "86400", "name": "USD Coin", "symbol": "USDC", @@ -108,75 +113,79 @@ "collateralConfig": { "tokenAddr": "0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f", "priceFeedAddr": "0xd0C7101eACbB49F3deCcCc166d238410D6D46d57", + "backupPriceFeedAddr": "0x31FEeac9552a6215BD23Bd8c590B34BF04d865AE", "heartBeat": "86400", "name": "Wrapped BTC", "symbol": "WBTC", "decimals": "8", - "initialPrice": "8382510000000", + "initialPrice": "9923656000000", "gtKeyIdentifier": "GearingTokenWithERC20" }, - "marketName": "USDC/WBTC-30MAY2025", - "marketSymbol": "USDC/WBTC-30MAY2025" + "marketName": "USDC/WBTC@27JUN2025", + "marketSymbol": "USDC/WBTC@27JUN2025" }, "configs_3": { "salt": 0, - "collateralCapForGt": "500479094077479000000", + "collateralCapForGt": "512815358514074000000", "marketConfig": { - "maturity": "1748563200", + "maturity": "1750982400", "lendTakerFeeRatio": "2000000", "lendMakerFeeRatio": "2000000", "borrowTakerFeeRatio": "3000000", "borrowMakerFeeRatio": "3000000", - "mintGtFeeRatio": "1000000", - "mintGtFeeRef": "400000" + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "4000000" }, "loanConfig": { - "liquidationLtv": "93000000", - "maxLtv": "89000000", + "liquidationLtv": "94000000", + "maxLtv": "90000000", "liquidatable": true }, "underlyingConfig": { "tokenAddr": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", "priceFeedAddr": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "backupPriceFeedAddr": "0xd68AeF8Ab6D86CeC502e08Faa376297d836FdfA6", "heartBeat": "86400", "name": "Wrapped ETH", "symbol": "WETH", "decimals": "18", - "initialPrice": "188061000000" + "initialPrice": "190861490000" }, "collateralConfig": { "tokenAddr": "0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe", - "priceFeedAddr": "note", - "heartBeat": "3600", + "priceFeedAddr": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "backupPriceFeedAddr": "0xc2052500D0Cb8E1E8838717502A6B113C64Ed258", + "heartBeat": "86400", "name": "Wrapped eETH", "symbol": "weETH", "decimals": "18", - "initialPrice": "199809000000", + "initialPrice": "202784000000", "gtKeyIdentifier": "GearingTokenWithERC20" }, - "marketName": "WETH/weETH-30MAY2025", - "marketSymbol": "WETH/weETH-30MAY2025" + "marketName": "WETH/weETH@27JUN2025", + "marketSymbol": "WETH/weETH@27JUN2025" }, "configs_4": { "salt": 0, - "collateralCapForGt": "531741578248968000000", + "collateralCapForGt": "544848428862385000000", "marketConfig": { - "maturity": "1748563200", + "maturity": "1750982400", "lendTakerFeeRatio": "2000000", "lendMakerFeeRatio": "2000000", "borrowTakerFeeRatio": "3000000", "borrowMakerFeeRatio": "3000000", - "mintGtFeeRatio": "1000000", - "mintGtFeeRef": "2000000" + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "10000000" }, "loanConfig": { - "liquidationLtv": "86000000", - "maxLtv": "82000000", + "liquidationLtv": "85000000", + "maxLtv": "81000000", "liquidatable": true }, "underlyingConfig": { "tokenAddr": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", "priceFeedAddr": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "backupPriceFeedAddr": "0x399A965083E512011c82AAEB6A86036463010C95", "heartBeat": "86400", "name": "USD Coin", "symbol": "USDC", @@ -186,27 +195,28 @@ "collateralConfig": { "tokenAddr": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", "priceFeedAddr": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "backupPriceFeedAddr": "0xd68AeF8Ab6D86CeC502e08Faa376297d836FdfA6", "heartBeat": "86400", "name": "Wrapped ETH", "symbol": "WETH", "decimals": "18", - "initialPrice": "188061000000", + "initialPrice": "190861000000", "gtKeyIdentifier": "GearingTokenWithERC20" }, - "marketName": "USDC/WETH-30MAY2025", - "marketSymbol": "USDC/WETH-30MAY2025" + "marketName": "USDC/WETH@27JUN2025", + "marketSymbol": "USDC/WETH@27JUN2025" }, "configs_5": { "salt": 0, "collateralCapForGt": "2760143527463430000000000", "marketConfig": { - "maturity": "1748563200", + "maturity": "1750982400", "lendTakerFeeRatio": "2000000", "lendMakerFeeRatio": "2000000", "borrowTakerFeeRatio": "3000000", "borrowMakerFeeRatio": "3000000", - "mintGtFeeRatio": "1000000", - "mintGtFeeRef": "2000000" + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "10000000" }, "loanConfig": { "liquidationLtv": "70000000", @@ -216,6 +226,7 @@ "underlyingConfig": { "tokenAddr": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", "priceFeedAddr": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "backupPriceFeedAddr": "0x399A965083E512011c82AAEB6A86036463010C95", "heartBeat": "86400", "name": "USD Coin", "symbol": "USDC", @@ -225,6 +236,7 @@ "collateralConfig": { "tokenAddr": "0x912CE59144191C1204E64559FE8253a0e49E6548", "priceFeedAddr": "0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6", + "backupPriceFeedAddr": "0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6", "heartBeat": "86400", "name": "Arbitrum", "symbol": "ARB", @@ -232,47 +244,8 @@ "initialPrice": "36000000", "gtKeyIdentifier": "GearingTokenWithERC20" }, - "marketName": "USDC/ARB-30MAY2025", - "marketSymbol": "USDC/ARB-30MAY2025" - }, - "configs_6": { - "salt": 0, - "collateralCapForGt": "536494420400008000000", - "marketConfig": { - "maturity": "1750982400", - "lendTakerFeeRatio": "2000000", - "lendMakerFeeRatio": "2000000", - "borrowTakerFeeRatio": "3000000", - "borrowMakerFeeRatio": "3000000", - "mintGtFeeRatio": "1000000", - "mintGtFeeRef": "400000" - }, - "loanConfig": { - "liquidationLtv": "94000000", - "maxLtv": "90000000", - "liquidatable": true - }, - "underlyingConfig": { - "tokenAddr": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", - "priceFeedAddr": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", - "heartBeat": "86400", - "name": "Wrapped ETH", - "symbol": "WETH", - "decimals": "18", - "initialPrice": "188061000000" - }, - "collateralConfig": { - "tokenAddr": "0xb33808ea0e883138680BA29311a220A7377cdb92", - "priceFeedAddr": "", - "heartBeat": "3600", - "name": "PT weETH 26JUN2025", - "symbol": "PT-weETH-26JUN2025", - "decimals": "18", - "initialPrice": "186395000000", - "gtKeyIdentifier": "GearingTokenWithERC20" - }, - "marketName": "WETH/PT-weETH-26JUN2025-27JUN2025", - "marketSymbol": "WETH/PT-weETH-26JUN2025-27JUN2025" + "marketName": "USDC/ARB@27JUN2025", + "marketSymbol": "USDC/ARB@27JUN2025" } } } \ No newline at end of file diff --git a/script/deploy/deploydata/arb-sepolia.json b/script/deploy/deploydata/arb-sepolia.json new file mode 100644 index 0000000..bdfaf25 --- /dev/null +++ b/script/deploy/deploydata/arb-sepolia.json @@ -0,0 +1,292 @@ +{ + "configNum": "7", + "configs": { + "configs_0": { + "salt": 0, + "collateralCapForGt": "511789884423953000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "priceFeedAddr": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "backupPriceFeedAddr": "0xd68AeF8Ab6D86CeC502e08Faa376297d836FdfA6", + "heartBeat": "86400", + "name": "Wrapped ETH", + "symbol": "WETH", + "decimals": "18", + "initialPrice": "163272000000" + }, + "collateralConfig": { + "tokenAddr": "0x5979D7b546E38E414F7E9822514be443A4800529", + "priceFeedAddr": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "backupPriceFeedAddr": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400", + "name": "Wrapped liquid staked Ether 2.0", + "symbol": "wstETH", + "decimals": "18", + "initialPrice": "195393000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "WETH/wstETH@30MAY2025", + "marketSymbol": "WETH/wstETH@30MAY2025" + }, + "configs_1": { + "salt": 0, + "collateralCapForGt": "511789884423953000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "85000000", + "maxLtv": "81000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "priceFeedAddr": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "backupPriceFeedAddr": "0x399A965083E512011c82AAEB6A86036463010C95", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x5979D7b546E38E414F7E9822514be443A4800529", + "priceFeedAddr": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "backupPriceFeedAddr": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400", + "name": "Wrapped liquid staked Ether 2.0", + "symbol": "wstETH", + "decimals": "18", + "initialPrice": "195393000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/wstETH@30MAY2025", + "marketSymbol": "USDC/wstETH@30MAY2025" + }, + "configs_2": { + "salt": 0, + "collateralCapForGt": "1215801480", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "86000000", + "maxLtv": "82000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "priceFeedAddr": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "backupPriceFeedAddr": "0x399A965083E512011c82AAEB6A86036463010C95", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f", + "priceFeedAddr": "0xd0C7101eACbB49F3deCcCc166d238410D6D46d57", + "backupPriceFeedAddr": "0x31FEeac9552a6215BD23Bd8c590B34BF04d865AE", + "heartBeat": "86400", + "name": "Wrapped BTC", + "symbol": "WBTC", + "decimals": "8", + "initialPrice": "8225027000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/WBTC@30MAY2025", + "marketSymbol": "USDC/WBTC@30MAY2025" + }, + "configs_3": { + "salt": 0, + "collateralCapForGt": "576466989178777000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "93000000", + "maxLtv": "89000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "priceFeedAddr": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "backupPriceFeedAddr": "0xd68AeF8Ab6D86CeC502e08Faa376297d836FdfA6", + "heartBeat": "86400", + "name": "Wrapped ETH", + "symbol": "WETH", + "decimals": "18", + "initialPrice": "163272000000" + }, + "collateralConfig": { + "tokenAddr": "0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe", + "priceFeedAddr": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "backupPriceFeedAddr": "0xc2052500D0Cb8E1E8838717502A6B113C64Ed258", + "heartBeat": "86400", + "name": "Wrapped eETH", + "symbol": "weETH", + "decimals": "18", + "initialPrice": "173470000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "WETH/weETH@30MAY2025", + "marketSymbol": "WETH/weETH@30MAY2025" + }, + "configs_4": { + "salt": 0, + "collateralCapForGt": "612476065957113000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "86000000", + "maxLtv": "82000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "priceFeedAddr": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "backupPriceFeedAddr": "0x399A965083E512011c82AAEB6A86036463010C95", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "priceFeedAddr": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "backupPriceFeedAddr": "0xd68AeF8Ab6D86CeC502e08Faa376297d836FdfA6", + "heartBeat": "86400", + "name": "Wrapped ETH", + "symbol": "WETH", + "decimals": "18", + "initialPrice": "163272000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/WETH@30MAY2025", + "marketSymbol": "USDC/WETH@30MAY2025" + }, + "configs_5": { + "salt": 0, + "collateralCapForGt": "2760143527463430000000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "70000000", + "maxLtv": "60000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "priceFeedAddr": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "backupPriceFeedAddr": "0x399A965083E512011c82AAEB6A86036463010C95", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x912CE59144191C1204E64559FE8253a0e49E6548", + "priceFeedAddr": "0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6", + "backupPriceFeedAddr": "0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6", + "heartBeat": "86400", + "name": "Arbitrum", + "symbol": "ARB", + "decimals": "18", + "initialPrice": "36000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/ARB@30MAY2025", + "marketSymbol": "USDC/ARB@30MAY2025" + }, + "configs_6": { + "salt": 0, + "collateralCapForGt": "617950533596769000000", + "marketConfig": { + "maturity": "1750982400", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "priceFeedAddr": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "backupPriceFeedAddr": "0xd68AeF8Ab6D86CeC502e08Faa376297d836FdfA6", + "heartBeat": "86400", + "name": "Wrapped ETH", + "symbol": "WETH", + "decimals": "18", + "initialPrice": "163272000000" + }, + "collateralConfig": { + "tokenAddr": "0xb33808ea0e883138680BA29311a220A7377cdb92", + "priceFeedAddr": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "backupPriceFeedAddr": "0x745716b8c00CAE49c422D706f630A1084B906759", + "heartBeat": "86400", + "name": "PT weETH 26JUN2025", + "symbol": "PT-weETH-26JUN2025", + "decimals": "18", + "initialPrice": "161825000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "WETH/PT-weETH-26JUN2025@27JUN2025", + "marketSymbol": "WETH/PT-weETH-26JUN2025@27JUN2025" + } + } +} \ No newline at end of file diff --git a/script/deploy/deploydata/bnb-testnet.json b/script/deploy/deploydata/bnb-testnet.json new file mode 100644 index 0000000..2664d17 --- /dev/null +++ b/script/deploy/deploydata/bnb-testnet.json @@ -0,0 +1,87 @@ +{ + "configNum": "2", + "configs": { + "configs_0": { + "salt": 0, + "collateralCapForGt": "638791170088097000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c", + "priceFeedAddr": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "backupPriceFeedAddr": "0x24CFEf73A30b2CEEC23d3659fA98B491D996F152", + "heartBeat": "86400", + "name": "Wrapped BNB", + "symbol": "WBNB", + "decimals": "18", + "initialPrice": "59000000000" + }, + "collateralConfig": { + "tokenAddr": "0xb0b84d294e0c75a6abe60171b70edeb2efd14a1b", + "priceFeedAddr": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "backupPriceFeedAddr": "0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4", + "heartBeat": "86400", + "name": "Staked Lista BNB", + "symbol": "slisBNB", + "decimals": "18", + "initialPrice": "60000000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "WBNB/slisBNB@30MAY2025", + "marketSymbol": "WBNB/slisBNB@30MAY2025" + }, + "configs_1": { + "salt": 0, + "collateralCapForGt": "638791170088097000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0x5A110fC00474038f6c02E89C707D638602EA44B5", + "priceFeedAddr": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "backupPriceFeedAddr": "0x24CFEf73A30b2CEEC23d3659fA98B491D996F152", + "heartBeat": "86400", + "name": "Astherus USDF", + "symbol": "USDF", + "decimals": "18", + "initialPrice": "99900000" + }, + "collateralConfig": { + "tokenAddr": "0x1627abfd41cdaaff4fc595444519410160fe9df1", + "priceFeedAddr": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "backupPriceFeedAddr": "0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4", + "heartBeat": "86400", + "name": "PT Astherus USDF 24JUL2025", + "symbol": "PT-USDF-24JUL2025", + "decimals": "18", + "initialPrice": "97000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDF/PT-USDF-24JUL2025@24JUL2025", + "marketSymbol": "USDF/PT-USDF-24JUL2025@24JUL2025" + } + } +} \ No newline at end of file diff --git a/script/deploy/deploydata/eth-mainnet-20250414-all.json b/script/deploy/deploydata/eth-mainnet-20250414-all.json new file mode 100644 index 0000000..3042313 --- /dev/null +++ b/script/deploy/deploydata/eth-mainnet-20250414-all.json @@ -0,0 +1,620 @@ +{ + "configNum": "15", + "configs": { + "configs_0": { + "salt": 0, + "collateralCapForGt": "576442517305048000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "priceFeedAddr": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "backupPriceFeedAddr": "0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4", + "heartBeat": "86400", + "name": "Wrapped ETH", + "symbol": "WETH", + "decimals": "18", + "initialPrice": "163278620000" + }, + "collateralConfig": { + "tokenAddr": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", + "priceFeedAddr": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "backupPriceFeedAddr": "0x24CFEf73A30b2CEEC23d3659fA98B491D996F152", + "heartBeat": "86400", + "name": "Wrapped eETH", + "symbol": "weETH", + "decimals": "18", + "initialPrice": "173477840000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "WETH/weETH@30MAY2025", + "marketSymbol": "WETH/weETH@30MAY2025" + }, + "configs_1": { + "salt": 0, + "collateralCapForGt": "511768158188691000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "85000000", + "maxLtv": "81000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "priceFeedAddr": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "backupPriceFeedAddr": "", + "heartBeat": "86400", + "name": "Wrapped liquid staked Ether 2.0", + "symbol": "wstETH", + "decimals": "18", + "initialPrice": "195400980000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/wstETH@30MAY2025", + "marketSymbol": "USDC/wstETH@30MAY2025" + }, + "configs_2": { + "salt": 0, + "collateralCapForGt": "862068965517241000000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "90000000", + "maxLtv": "86000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "priceFeedAddr": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "backupPriceFeedAddr": "0xb99D174ED06c83588Af997c8859F93E83dD4733f", + "heartBeat": "86400", + "name": "Staked USDe", + "symbol": "sUSDe", + "decimals": "18", + "initialPrice": "115999999", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/sUSDe@30MAY2025", + "marketSymbol": "USDC/sUSDe@30MAY2025" + }, + "configs_3": { + "salt": 0, + "collateralCapForGt": "1025010250102500000000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "90000000", + "maxLtv": "86000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "priceFeedAddr": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "backupPriceFeedAddr": "0x333651c5710Fc8C4fe65E5D15E5639348F267D7c", + "heartBeat": "86400", + "name": "PT Ethena sUSDE 29MAY2025", + "symbol": "PT-sUSDE-29MAY2025", + "decimals": "18", + "initialPrice": "97560000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025" + }, + "configs_4": { + "salt": 0, + "collateralCapForGt": "952380952380952000000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0xd63070114470f685b75B74D60EEc7c1113d33a3D", + "priceFeedAddr": "0xF8f79b5b527e2cb3900956eB0D17A4D4aA6ae220", + "backupPriceFeedAddr": "", + "heartBeat": "86400", + "name": "USUAL Boosted USDC", + "symbol": "USUALUSDC+", + "decimals": "18", + "initialPrice": "105000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/USUALUSDC+@30MAY2025", + "marketSymbol": "USDC/USUALUSDC+@30MAY2025" + }, + "configs_5": { + "salt": 0, + "collateralCapForGt": "594611714024248000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "priceFeedAddr": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "backupPriceFeedAddr": "0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4", + "heartBeat": "86400", + "name": "Wrapped ETH", + "symbol": "WETH", + "decimals": "18", + "initialPrice": "163278620000" + }, + "collateralConfig": { + "tokenAddr": "0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8", + "priceFeedAddr": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", + "backupPriceFeedAddr": "0x3b82860EC8815Fc2A1dcC53580bd647b0042C93e", + "heartBeat": "86400", + "name": "MEV Capital wETH", + "symbol": "MCwETH", + "decimals": "18", + "initialPrice": "168176980000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "WETH/MCwETH@30MAY2025", + "marketSymbol": "WETH/MCwETH@30MAY2025" + }, + "configs_6": { + "salt": 0, + "collateralCapForGt": "658406864593610000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "92000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "priceFeedAddr": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "backupPriceFeedAddr": "0x5F08C227deAe74D8e5Ec0d743FB0744AB1B6c984", + "heartBeat": "86400", + "name": "pufETH", + "symbol": "pufETH", + "decimals": "18", + "initialPrice": "183668000000" + }, + "collateralConfig": { + "tokenAddr": "0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D", + "priceFeedAddr": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "backupPriceFeedAddr": "0x5D18F4cB3c95568F315cb1C1eF48261a5A4D6053", + "heartBeat": "86400", + "name": "PT Puffer ETH 26JUN2025", + "symbol": "PT-pufETH-26JUN2025", + "decimals": "18", + "initialPrice": "151881770000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025" + }, + "configs_7": { + "salt": 0, + "collateralCapForGt": "1000000000000000000000000", + "marketConfig": { + "maturity": "1748476800", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "92000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F", + "priceFeedAddr": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "backupPriceFeedAddr": "0x6B09d473dB784D840E307Cb3Da63CbA79D300CAc", + "heartBeat": "86400", + "name": "Ethereal Pre-deposit Vault", + "symbol": "eUSDe", + "decimals": "18", + "initialPrice": "100000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/eUSDe@29MAY2025", + "marketSymbol": "USDC/eUSDe@29MAY2025" + }, + "configs_8": { + "salt": 0, + "collateralCapForGt": "586664274728950000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "priceFeedAddr": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "backupPriceFeedAddr": "0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4", + "heartBeat": "86400", + "name": "Wrapped ETH", + "symbol": "WETH", + "decimals": "18", + "initialPrice": "163278620000" + }, + "collateralConfig": { + "tokenAddr": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "priceFeedAddr": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "backupPriceFeedAddr": "0x5F08C227deAe74D8e5Ec0d743FB0744AB1B6c984", + "heartBeat": "86400", + "name": "pufETH", + "symbol": "pufETH", + "decimals": "18", + "initialPrice": "170455240000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "WETH/pufETH@30MAY2025", + "marketSymbol": "WETH/pufETH@30MAY2025" + }, + "configs_9": { + "salt": 0, + "collateralCapForGt": "1181929434", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "85000000", + "maxLtv": "81000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "priceFeedAddr": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "backupPriceFeedAddr": "0xAB7f623fb2F6fea6601D4350FA0E2290663C28Fc", + "heartBeat": "86400", + "name": "Wrapped BTC", + "symbol": "WBTC", + "decimals": "8", + "initialPrice": "8460742000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/WBTC@30MAY2025", + "marketSymbol": "USDC/WBTC@30MAY2025" + }, + "configs_10": { + "salt": 0, + "collateralCapForGt": "1181929434", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "85000000", + "maxLtv": "81000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", + "priceFeedAddr": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "backupPriceFeedAddr": "", + "heartBeat": "86400", + "name": "Coinbase Wrapped BTC", + "symbol": "cbBTC", + "decimals": "8", + "initialPrice": "8460742000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/cbBTC@30MAY2025", + "marketSymbol": "USDC/cbBTC@30MAY2025" + }, + "configs_11": { + "salt": 0, + "collateralCapForGt": "598973169139341000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "priceFeedAddr": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "backupPriceFeedAddr": "0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4", + "heartBeat": "86400", + "name": "Wrapped ETH", + "symbol": "WETH", + "decimals": "18", + "initialPrice": "163278620000" + }, + "collateralConfig": { + "tokenAddr": "0x2371e134e3455e0593363cBF89d3b6cf53740618", + "priceFeedAddr": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", + "backupPriceFeedAddr": "0x3A44454F173b082F1dbbA9587b046Dc90B2F0AE7", + "heartBeat": "86400", + "name": "Gauntlet WETH Prime", + "symbol": "gtWETH", + "decimals": "18", + "initialPrice": "166952390000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "WETH/gtWETH@30MAY2025", + "marketSymbol": "WETH/gtWETH@30MAY2025" + }, + "configs_12": { + "salt": 0, + "collateralCapForGt": "1025010250102500000000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "96000000", + "maxLtv": "94000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "priceFeedAddr": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "backupPriceFeedAddr": "0xb99D174ED06c83588Af997c8859F93E83dD4733f", + "heartBeat": "86400", + "name": "Staked USDe", + "symbol": "sUSDe", + "decimals": "18", + "initialPrice": "115999999" + }, + "collateralConfig": { + "tokenAddr": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "priceFeedAddr": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "backupPriceFeedAddr": "0x333651c5710Fc8C4fe65E5D15E5639348F267D7c", + "heartBeat": "86400", + "name": "PT Ethena sUSDE 29MAY2025", + "symbol": "PT-sUSDE-29MAY2025", + "decimals": "18", + "initialPrice": "97560000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "sUSDe/PT-sUSDE-29MAY2025@30MAY2025", + "marketSymbol": "sUSDe/PT-sUSDE-29MAY2025@30MAY2025" + }, + "configs_13": { + "salt": 0, + "collateralCapForGt": "941442289587648000000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "90000000", + "maxLtv": "86000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0x7C1156E515aA1A2E851674120074968C905aAF37", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "", + "heartBeat": "86400", + "name": "Level USD", + "symbol": "lvlUSD", + "decimals": "18", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x4737d9b4592b40d51e110b94c9c043c6654067ae", + "priceFeedAddr": "0x3Bc7dD457901A41509fc0Bd47Dc3Da42D45Ce030", + "backupPriceFeedAddr": "", + "heartBeat": "86400", + "name": "Staked lvlUSD", + "symbol": "slvlUSD", + "decimals": "18", + "initialPrice": "106220000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "lvlUSD/slvlUSD@30MAY2025", + "marketSymbol": "lvlUSD/slvlUSD@30MAY2025" + }, + "configs_14": { + "salt": 0, + "collateralCapForGt": "1014919313914540000000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "90000000", + "maxLtv": "86000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x9BcA74F805AB0a22DDD0886dB0942199a0feBa71", + "priceFeedAddr": "0x57eAfDF2c9B47425042Be735ff47dea7Ef965726", + "backupPriceFeedAddr": "", + "heartBeat": "86400", + "name": "PT lvlUSD 29MAY2025", + "symbol": "PT-lvlUSD-29MAY2025", + "decimals": "18", + "initialPrice": "98530000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/PT-lvlUSD-29MAY2025@30MAY2025", + "marketSymbol": "USDC/PT-lvlUSD-29MAY2025@30MAY2025" + } + } +} \ No newline at end of file diff --git a/script/deploy/deploydata/eth-mainnet-backup-20250422.json b/script/deploy/deploydata/eth-mainnet-backup-20250422.json new file mode 100644 index 0000000..2d12d3b --- /dev/null +++ b/script/deploy/deploydata/eth-mainnet-backup-20250422.json @@ -0,0 +1,128 @@ +{ + "configNum": "3", + "configs": { + "configs_0": { + "salt": 0, + "collateralCapForGt": "1000000000000000000000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0xf1fd8AC6346eC7BC4116Ba7aDc81102B2BC4C52D", + "priceFeedAddr": "0x4cF5F12c6c0D48F0d335DdB25e11cd526EAfD322", + "backupPriceFeedAddr": "0x4cF5F12c6c0D48F0d335DdB25e11cd526EAfD322", + "heartBeat": "86400", + "name": "MEV Capital USDC Prime", + "symbol": "MC_USDCP", + "decimals": "18", + "initialPrice": "100000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/MC_USDCP@30MAY2025", + "marketSymbol": "USDC/MC_USDCP@30MAY2025" + }, + "configs_1": { + "salt": 0, + "collateralCapForGt": "1000000000000000000000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0xc582F04d8a82795aa2Ff9c8bb4c1c889fe7b754e", + "priceFeedAddr": "0x81195F8A79f6553A4078f89eF87b21a7d3C2855A", + "backupPriceFeedAddr": "0x81195F8A79f6553A4078f89eF87b21a7d3C2855A", + "heartBeat": "86400", + "name": "Gauntlet USDC Frontier", + "symbol": "gtusdcf", + "decimals": "18", + "initialPrice": "100000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/gtusdcf@30MAY2025", + "marketSymbol": "USDC/gtusdcf@30MAY2025" + }, + "configs_2": { + "salt": 0, + "collateralCapForGt": "624356074116256000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "priceFeedAddr": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "backupPriceFeedAddr": "0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4", + "heartBeat": "86400", + "name": "Wrapped ETH", + "symbol": "WETH", + "decimals": "18", + "initialPrice": "158359710000" + }, + "collateralConfig": { + "tokenAddr": "0x701907283a57FF77E255C3f1aAD790466B8CE4ef", + "priceFeedAddr": "0x0221cd3fA8B1Bea16293fb0cD6B60977d531c931", + "backupPriceFeedAddr": "0x00B96F0eBf39158cb4E3F801073966bD6Db7959C", + "heartBeat": "86400", + "name": "IndexCoop hyETH", + "symbol": "mhyETH", + "decimals": "18", + "initialPrice": "160165020000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "WETH/mhyETH@30MAY2025", + "marketSymbol": "WETH/mhyETH@30MAY2025" + } + } +} \ No newline at end of file diff --git a/script/deploy/deploydata/eth-mainnet-backup-before-submit-oracles.json b/script/deploy/deploydata/eth-mainnet-backup-before-submit-oracles.json new file mode 100644 index 0000000..eaa43ff --- /dev/null +++ b/script/deploy/deploydata/eth-mainnet-backup-before-submit-oracles.json @@ -0,0 +1,497 @@ +{ + "configNum": "12", + "configs": { + "configs_0": { + "salt": 0, + "collateralCapForGt": "638791170088097000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "priceFeedAddr": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "backupPriceFeedAddr": "0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4", + "heartBeat": "86400", + "name": "Wrapped ETH", + "symbol": "WETH", + "decimals": "18", + "initialPrice": "147342000000" + }, + "collateralConfig": { + "tokenAddr": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", + "priceFeedAddr": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "backupPriceFeedAddr": "0x24CFEf73A30b2CEEC23d3659fA98B491D996F152", + "heartBeat": "86400", + "name": "Wrapped eETH", + "symbol": "weETH", + "decimals": "18", + "initialPrice": "156546000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "WETH/weETH@30MAY2025", + "marketSymbol": "WETH/weETH@30MAY2025" + }, + "configs_1": { + "salt": 0, + "collateralCapForGt": "567121561593946000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "85000000", + "maxLtv": "81000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "priceFeedAddr": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "backupPriceFeedAddr": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400", + "name": "Wrapped liquid staked Ether 2.0", + "symbol": "wstETH", + "decimals": "18", + "initialPrice": "176329000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/wstETH@30MAY2025", + "marketSymbol": "USDC/wstETH@30MAY2025" + }, + "configs_2": { + "salt": 0, + "collateralCapForGt": "862068965517241000000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "90000000", + "maxLtv": "86000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "priceFeedAddr": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "backupPriceFeedAddr": "0xb99D174ED06c83588Af997c8859F93E83dD4733f", + "heartBeat": "86400", + "name": "Staked USDe", + "symbol": "sUSDe", + "decimals": "18", + "initialPrice": "115999999", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/sUSDe@30MAY2025", + "marketSymbol": "USDC/sUSDe@30MAY2025" + }, + "configs_3": { + "salt": 0, + "collateralCapForGt": "1025010250102500000000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "90000000", + "maxLtv": "86000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "priceFeedAddr": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "backupPriceFeedAddr": "0x333651c5710Fc8C4fe65E5D15E5639348F267D7c", + "heartBeat": "86400", + "name": "PT Ethena sUSDE 29MAY2025", + "symbol": "PT-sUSDE-29MAY2025", + "decimals": "18", + "initialPrice": "98000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025" + }, + "configs_4": { + "salt": 0, + "collateralCapForGt": "952380952380952000000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0xd63070114470f685b75B74D60EEc7c1113d33a3D", + "priceFeedAddr": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "backupPriceFeedAddr": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400", + "name": "USUAL Boosted USDC", + "symbol": "USUALUSDC+", + "decimals": "18", + "initialPrice": "105000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/USUALUSDC+@30MAY2025", + "marketSymbol": "USDC/USUALUSDC+@30MAY2025" + }, + "configs_5": { + "salt": 0, + "collateralCapForGt": "658925566985259000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "priceFeedAddr": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "backupPriceFeedAddr": "0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4", + "heartBeat": "86400", + "name": "Wrapped ETH", + "symbol": "WETH", + "decimals": "18", + "initialPrice": "147342000000" + }, + "collateralConfig": { + "tokenAddr": "0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8", + "priceFeedAddr": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", + "backupPriceFeedAddr": "0x3b82860EC8815Fc2A1dcC53580bd647b0042C93e", + "heartBeat": "86400", + "name": "MEV Capital wETH", + "symbol": "MCwETH", + "decimals": "18", + "initialPrice": "151762000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "WETH/MCwETH@30MAY2025", + "marketSymbol": "WETH/MCwETH@30MAY2025" + }, + "configs_6": { + "salt": 0, + "collateralCapForGt": "729620870774905000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "92000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "priceFeedAddr": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "backupPriceFeedAddr": "0x5F08C227deAe74D8e5Ec0d743FB0744AB1B6c984", + "heartBeat": "86400", + "name": "pufETH", + "symbol": "pufETH", + "decimals": "18", + "initialPrice": "183668000000" + }, + "collateralConfig": { + "tokenAddr": "0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D", + "priceFeedAddr": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "backupPriceFeedAddr": "0x5D18F4cB3c95568F315cb1C1eF48261a5A4D6053", + "heartBeat": "86400", + "name": "PT Puffer ETH 26JUN2025", + "symbol": "PT-pufETH-26JUN2025", + "decimals": "18", + "initialPrice": "137057000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025" + }, + "configs_7": { + "salt": 0, + "collateralCapForGt": "1000000000000000000000000", + "marketConfig": { + "maturity": "1748476800", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "92000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F", + "priceFeedAddr": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "backupPriceFeedAddr": "0x6B09d473dB784D840E307Cb3Da63CbA79D300CAc", + "heartBeat": "86400", + "name": "Ethereal Pre-deposit Vault", + "symbol": "eUSDe", + "decimals": "18", + "initialPrice": "100000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/eUSDe@29MAY2025", + "marketSymbol": "USDC/eUSDe@29MAY2025" + }, + "configs_8": { + "salt": 0, + "collateralCapForGt": "650118523968408000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "priceFeedAddr": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "backupPriceFeedAddr": "0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4", + "heartBeat": "86400", + "name": "Wrapped ETH", + "symbol": "WETH", + "decimals": "18", + "initialPrice": "147342000000" + }, + "collateralConfig": { + "tokenAddr": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "priceFeedAddr": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "backupPriceFeedAddr": "0x5F08C227deAe74D8e5Ec0d743FB0744AB1B6c984", + "heartBeat": "86400", + "name": "pufETH", + "symbol": "pufETH", + "decimals": "18", + "initialPrice": "153818000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "WETH/pufETH@30MAY2025", + "marketSymbol": "WETH/pufETH@30MAY2025" + }, + "configs_9": { + "salt": 0, + "collateralCapForGt": "1294383437", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "85000000", + "maxLtv": "81000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "priceFeedAddr": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "backupPriceFeedAddr": "0xAB7f623fb2F6fea6601D4350FA0E2290663C28Fc", + "heartBeat": "86400", + "name": "Wrapped BTC", + "symbol": "WBTC", + "decimals": "8", + "initialPrice": "7725686000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/WBTC@30MAY2025", + "marketSymbol": "USDC/WBTC@30MAY2025" + }, + "configs_10": { + "salt": 0, + "collateralCapForGt": "1294383437", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "85000000", + "maxLtv": "81000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", + "priceFeedAddr": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "backupPriceFeedAddr": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "heartBeat": "86400", + "name": "Coinbase Wrapped BTC", + "symbol": "cbBTC", + "decimals": "8", + "initialPrice": "7725686000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/cbBTC@30MAY2025", + "marketSymbol": "USDC/cbBTC@30MAY2025" + }, + "configs_11": { + "salt": 0, + "collateralCapForGt": "663758761853122000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "priceFeedAddr": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "backupPriceFeedAddr": "0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4", + "heartBeat": "86400", + "name": "Wrapped ETH", + "symbol": "WETH", + "decimals": "18", + "initialPrice": "147342000000" + }, + "collateralConfig": { + "tokenAddr": "0x2371e134e3455e0593363cBF89d3b6cf53740618", + "priceFeedAddr": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", + "backupPriceFeedAddr": "0x3A44454F173b082F1dbbA9587b046Dc90B2F0AE7", + "heartBeat": "86400", + "name": "Gauntlet WETH Prime", + "symbol": "gtWETH", + "decimals": "18", + "initialPrice": "150657000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "WETH/gtWETH@30MAY2025", + "marketSymbol": "WETH/gtWETH@30MAY2025" + } + } +} \ No newline at end of file diff --git a/script/deploy/deploydata/eth-mainnet.csv b/script/deploy/deploydata/eth-mainnet.csv index 1d33b38..dcf12b0 100644 --- a/script/deploy/deploydata/eth-mainnet.csv +++ b/script/deploy/deploydata/eth-mainnet.csv @@ -1,14 +1,10 @@ -,,,,,,,,,,loanConfig,,,underlyingConfig,,,,,,,collateralConfig,,,,,,,,,, -Market Type,salt,collateralCapForGt,maturity,lendTakerFeeRatio,lendMakerFeeRatio,borrowTakerFeeRatio,borrowMakerFeeRatio,mintGtFeeRatio,mintGtFeeRef,liquidationLtv,maxLtv,liquidatable,tokenAddr,priceFeedAddr,heartBeat,name,symbol,decimals,initialPrice,tokenAddr,priceFeedAddr,heartBeat,name,symbol,decimals,initialPrice,gtKeyIdentifier,note,, -Borrow,0,"500,479,094,077,479,000,000",1748563200,2000000,2000000,3000000,3000000,1000000,400000,94000000,90000000,true,0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2,0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419,3600,Wrapped ETH,WETH,18,1880.61,0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee,0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136,21600,Wrapped eETH,weETH,18,1998.09,GearingTokenWithERC20,USD/weETH = ETH/weETH * USD/ETH,0x5c9C449BbC9a6075A2c061dF312a35fd1E05fF22,0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 -Borrow,0,"444,327,502,741,153,000,000",1748563200,2000000,2000000,3000000,3000000,1000000,2000000,85000000,81000000,true,0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6,86400,USD Coin,USDC,6,1.00,0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0,0x164b276057258d81941e97B0a900D4C7B358bCe0,86400,Wrapped liquid staked Ether 2.0,wstETH,18,2250.59,GearingTokenWithERC20,USD/wstETH = ETH/wstETH * USD/ETH,,0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 -Borrow,0,"862,068,965,517,241,000,000,000",1748563200,2000000,2000000,3000000,3000000,1000000,2000000,90000000,86000000,true,0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6,86400,USD Coin,USDC,6,1.00,0x9D39A5DE30e57443BfF2A8307A4256c8797A3497,0xFF3BC18cCBd5999CE63E788A1c250a88626aD099,86400,Staked USDe,sUSDe,18,1.16,GearingTokenWithERC20,,, -Leverage,0,"1,025,010,250,102,500,000,000,000",1748563200,2000000,2000000,3000000,3000000,1000000,2000000,90000000,86000000,true,0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6,86400,USD Coin,USDC,6,1.00,0xb7de5dFCb74d25c2f21841fbd6230355C50d9308,0x8f29Df42c617C222Bc2B416AC8a022E85e853276,86400,PT Ethena sUSDE 29MAY2025,PT-sUSDE-29MAY2025,18,0.98,GearingTokenWithERC20,,, -Borrow,0,"952,380,952,380,952,000,000,000",1748563200,2000000,2000000,3000000,3000000,1000000,2000000,94000000,90000000,true,0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6,86400,USD Coin,USDC,6,1.00,0xd63070114470f685b75B74D60EEc7c1113d33a3D,0x2a2a0e32c54670045256EBcA681887E32e689E97,86400,USUAL Boosted USDC,USUALUSDC+,18,1.05,GearingTokenWithERC20,,, -Borrow,0,"516,253,959,465,018,000,000",1748563200,2000000,2000000,3000000,3000000,1000000,400000,94000000,90000000,true,0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2,0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419,3600,Wrapped ETH,WETH,18,1880.61,0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8,0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006,3600,MEV Capital wETH,MCwETH,18,1937.03,GearingTokenWithERC20,,, -Leverage,0,"571,642,204,094,784,000,000",1748563200,2000000,2000000,3000000,3000000,1000000,400000,94000000,92000000,true,0xD9A442856C234a39a81a089C06451EBAa4306a72,0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761,86400,pufETH,pufETH,18,1836.68,0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D,0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1,86400,PT Puffer ETH 26JUN2025,PT-pufETH-26JUN2025,18,1749.35,GearingTokenWithERC20,,, -Borrow,0,"1,000,000,000,000,000,000,000,000",1748476800,2000000,2000000,3000000,3000000,1000000,2000000,94000000,92000000,true,0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6,86400,USD Coin,USDC,6,1.00,0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F,0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3,86400,Ethereal Pre-deposit Vault,eUSDe,18,1.00,GearingTokenWithERC20,,, -Borrow,0,"509,353,831,352,779,000,000",1748563200,2000000,2000000,3000000,3000000,1000000,400000,94000000,90000000,true,0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2,0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419,3600,Wrapped ETH,WETH,18,1880.61,0xD9A442856C234a39a81a089C06451EBAa4306a72,0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761,86400,pufETH,pufETH,18,1963.27,GearingTokenWithERC20,USD/pufETH = ETH/pufETH * USD/ETH,0xDe3f7Dd92C4701BCf59F47235bCb61e727c45f80,0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 -Borrow,0,"1,192,960,104",1748563200,2000000,2000000,3000000,3000000,1000000,2000000,85000000,81000000,true,0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6,86400,USD Coin,USDC,6,1.00,0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599,0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c,3600,Wrapped BTC,WBTC,8,83825.10,GearingTokenWithERC20,,, -Borrow,0,"1,192,960,104",1748563200,2000000,2000000,3000000,3000000,1000000,2000000,85000000,81000000,true,0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6,86400,USD Coin,USDC,6,1.00,0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf,0x2665701293fCbEB223D11A08D826563EDcCE423A,86400,Coinbase Wrapped BTC,cbBTC,8,83825.10,GearingTokenWithERC20,,, -Borrow,0,"520,040,663,324,174,000,000",1748563200,2000000,2000000,3000000,3000000,1000000,400000,94000000,90000000,true,0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2,0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419,3600,Wrapped ETH,WETH,18,1880.61,0x2371e134e3455e0593363cBF89d3b6cf53740618,0xdc0115fe09600FeDa15D317cCa3D2f21F389036d,3600,Gauntlet WETH Prime,gtWETH,18,1922.93,GearingTokenWithERC20,,, \ No newline at end of file +,,,marketConfig,,,,,,,loanConfig,,,underlyingConfig,,,,,,,,collateralConfig,,,,,,,,, +Market Type,salt,collateralCapForGt,maturity,lendTakerFeeRatio,lendMakerFeeRatio,borrowTakerFeeRatio,borrowMakerFeeRatio,mintGtFeeRatio,mintGtFeeRef,liquidationLtv,maxLtv,liquidatable,tokenAddr,priceFeedAddr,heartBeat,backupPriceFeedAddr,name,symbol,decimals,initialPrice,tokenAddr,priceFeedAddr,heartBeat,backupPriceFeedAddr,name,symbol,decimals,initialPrice,gtKeyIdentifier,note +Yield Leverage,0,"1,022,494,887,525,560,000,000,000",1758844800,2000000,2000000,3000000,3000000,10000000,6000000,91500000,87500000,true,0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6,86400,0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6,USD Coin,USDC,6,1.0000,0x2CA5f2C4300450D53214B00546795c1c07B89acB,0x5042768E83E2b5F9A7251A41C4E66855DD65fe31,86400,0x5042768E83E2b5F9A7251A41C4E66855DD65fe31,PT Staked lvlUSD 25SEP2025,PT-slvlUSD-25SEP2025,18,0.9615,GearingTokenWithERC20, +Borrow,0,"1,022,494,887,526",1754006400,2000000,2000000,3000000,3000000,10000000,6000000,91500000,87500000,true,0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6,86400,0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6,USD Coin,USDC,6,1.0000,0x1132065009850C72E27B7950C0f9285d1D103589,0x6BE2Bb4FFBb9FE1975A419D144750E604e1D37a1,86400,0x6BE2Bb4FFBb9FE1975A419D144750E604e1D37a1,PT Midas MEV 31JUL2025,PT-mMEV-31JUL2025,6,0.9732,GearingTokenWithERC20, +Borrow,0,"1,022,494,887,525,560,000,000,000",1754006400,2000000,2000000,3000000,3000000,10000000,6000000,85000000,81000000,true,0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6,86400,0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6,USD Coin,USDC,6,1.0000,0x030b69280892c888670EDCDCD8B69Fd8026A0BF3,0x5f09Aff8B9b1f488B7d1bbaD4D89648579e55d61,86400,0x5f09Aff8B9b1f488B7d1bbaD4D89648579e55d61,Midas MEV,mMEV,18,1.0203,GearingTokenWithERC20, +Price Leverage,0,"1,022,494,887,525,560,000,000,000",1750982400,2000000,2000000,3000000,3000000,10000000,6000000,77000000,70000000,true,0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6,86400,0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6,USD Coin,USDC,6,1.0000,0x2103E845C5E135493Bb6c2A4f0B8651956eA8682,0x214eD9Da11D2fbe465a6fc601a91E62EbEc1a0D6,86400,0x214eD9Da11D2fbe465a6fc601a91E62EbEc1a0D6,Matrixdock Gold ,XAUm,18,3200.0000,GearingTokenWithERC20, +Price Leverage,0,"102,249,488,752,557",1750982400,2000000,2000000,3000000,3000000,10000000,6000000,85000000,81000000,true,0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6,86400,0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6,USD Coin,USDC,6,1.0000,0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599,0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c,86400,0xAB7f623fb2F6fea6601D4350FA0E2290663C28Fc,Wrapped BTC,WBTC,8,103255.7000,GearingTokenWithERC20, +Price Leverage,0,"1,022,494,887,525,560,000,000,000",1750982400,2000000,2000000,3000000,3000000,10000000,6000000,85000000,81000000,true,0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6,86400,0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6,USD Coin,USDC,6,1.0000,0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0,0x164b276057258d81941e97B0a900D4C7B358bCe0,86400,0x164b276057258d81941e97B0a900D4C7B358bCe0,Wrapped liquid staked Ether 2.0,wstETH,18,3091.1776,GearingTokenWithERC20, +Price Leverage,0,"1,022,494,887,525,560,000,000,000",1750982400,2000000,2000000,3000000,3000000,10000000,3000000,75000000,71000000,true,0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599,0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c,86400,0xAB7f623fb2F6fea6601D4350FA0E2290663C28Fc,Wrapped BTC,WBTC,8,1.0000,0x9D39A5DE30e57443BfF2A8307A4256c8797A3497,0xFF3BC18cCBd5999CE63E788A1c250a88626aD099,86400,0xb99D174ED06c83588Af997c8859F93E83dD4733f,Staked USDe,sUSDe,18,1.1600,GearingTokenWithERC20, +Price Leverage,0,"1,022,494,887,525,560,000,000,000",1750982400,2000000,2000000,3000000,3000000,10000000,3000000,75000000,71000000,true,0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2,0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419,86400,0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4,Wrapped ETH,WETH,18,1.0000,0x9D39A5DE30e57443BfF2A8307A4256c8797A3497,0xFF3BC18cCBd5999CE63E788A1c250a88626aD099,86400,0xb99D174ED06c83588Af997c8859F93E83dD4733f,Staked USDe,sUSDe,18,1.1600,GearingTokenWithERC20, \ No newline at end of file diff --git a/script/deploy/deploydata/eth-mainnet.json b/script/deploy/deploydata/eth-mainnet.json index 3becd81..7cfa426 100644 --- a/script/deploy/deploydata/eth-mainnet.json +++ b/script/deploy/deploydata/eth-mainnet.json @@ -1,290 +1,19 @@ { - "configNum": "12", + "configNum": "1", "configs": { "configs_0": { "salt": 0, - "collateralCapForGt": "500479094077479000000", + "collateralCapForGt": "9832841690000000000000000", + "marketName": "USDC/cUSDO@25JUL2025", + "marketSymbol": "USDC/cUSDO@25JUL2025", "marketConfig": { - "maturity": "1748563200", + "maturity": "1753401600", "lendTakerFeeRatio": "2000000", "lendMakerFeeRatio": "2000000", "borrowTakerFeeRatio": "3000000", "borrowMakerFeeRatio": "3000000", - "mintGtFeeRatio": "1000000", - "mintGtFeeRef": "400000" - }, - "loanConfig": { - "liquidationLtv": "94000000", - "maxLtv": "90000000", - "liquidatable": true - }, - "underlyingConfig": { - "tokenAddr": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", - "priceFeedAddr": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", - "heartBeat": "3600", - "name": "Wrapped ETH", - "symbol": "WETH", - "decimals": "18", - "initialPrice": "188061000000" - }, - "collateralConfig": { - "tokenAddr": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", - "priceFeedAddr": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", - "heartBeat": "21600", - "name": "Wrapped eETH", - "symbol": "weETH", - "decimals": "18", - "initialPrice": "199809000000", - "gtKeyIdentifier": "GearingTokenWithERC20" - }, - "marketName": "WETH/weETH-30MAY2025", - "marketSymbol": "WETH/weETH-30MAY2025" - }, - "configs_1": { - "salt": 0, - "collateralCapForGt": "444327502741153000000", - "marketConfig": { - "maturity": "1748563200", - "lendTakerFeeRatio": "2000000", - "lendMakerFeeRatio": "2000000", - "borrowTakerFeeRatio": "3000000", - "borrowMakerFeeRatio": "3000000", - "mintGtFeeRatio": "1000000", - "mintGtFeeRef": "2000000" - }, - "loanConfig": { - "liquidationLtv": "85000000", - "maxLtv": "81000000", - "liquidatable": true - }, - "underlyingConfig": { - "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", - "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", - "heartBeat": "86400", - "name": "USD Coin", - "symbol": "USDC", - "decimals": "6", - "initialPrice": "100000000" - }, - "collateralConfig": { - "tokenAddr": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", - "priceFeedAddr": "0x164b276057258d81941e97B0a900D4C7B358bCe0", - "heartBeat": "86400", - "name": "Wrapped liquid staked Ether 2.0", - "symbol": "wstETH", - "decimals": "18", - "initialPrice": "225059000000", - "gtKeyIdentifier": "GearingTokenWithERC20" - }, - "marketName": "USDC/wstETH-30MAY2025", - "marketSymbol": "USDC/wstETH-30MAY2025" - }, - "configs_2": { - "salt": 0, - "collateralCapForGt": "862068965517241000000000", - "marketConfig": { - "maturity": "1748563200", - "lendTakerFeeRatio": "2000000", - "lendMakerFeeRatio": "2000000", - "borrowTakerFeeRatio": "3000000", - "borrowMakerFeeRatio": "3000000", - "mintGtFeeRatio": "1000000", - "mintGtFeeRef": "2000000" - }, - "loanConfig": { - "liquidationLtv": "90000000", - "maxLtv": "86000000", - "liquidatable": true - }, - "underlyingConfig": { - "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", - "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", - "heartBeat": "86400", - "name": "USD Coin", - "symbol": "USDC", - "decimals": "6", - "initialPrice": "100000000" - }, - "collateralConfig": { - "tokenAddr": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", - "priceFeedAddr": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", - "heartBeat": "86400", - "name": "Staked USDe", - "symbol": "sUSDe", - "decimals": "18", - "initialPrice": "115999999", - "gtKeyIdentifier": "GearingTokenWithERC20" - }, - "marketName": "USDC/sUSDe-30MAY2025", - "marketSymbol": "USDC/sUSDe-30MAY2025" - }, - "configs_3": { - "salt": 0, - "collateralCapForGt": "1025010250102500000000000", - "marketConfig": { - "maturity": "1748563200", - "lendTakerFeeRatio": "2000000", - "lendMakerFeeRatio": "2000000", - "borrowTakerFeeRatio": "3000000", - "borrowMakerFeeRatio": "3000000", - "mintGtFeeRatio": "1000000", - "mintGtFeeRef": "2000000" - }, - "loanConfig": { - "liquidationLtv": "90000000", - "maxLtv": "86000000", - "liquidatable": true - }, - "underlyingConfig": { - "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", - "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", - "heartBeat": "86400", - "name": "USD Coin", - "symbol": "USDC", - "decimals": "6", - "initialPrice": "100000000" - }, - "collateralConfig": { - "tokenAddr": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", - "priceFeedAddr": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", - "heartBeat": "86400", - "name": "PT Ethena sUSDE 29MAY2025", - "symbol": "PT-sUSDE-29MAY2025", - "decimals": "18", - "initialPrice": "98000000", - "gtKeyIdentifier": "GearingTokenWithERC20" - }, - "marketName": "USDC/PT-sUSDE-29MAY2025-30MAY2025", - "marketSymbol": "USDC/PT-sUSDE-29MAY2025-30MAY2025" - }, - "configs_4": { - "salt": 0, - "collateralCapForGt": "952380952380952000000000", - "marketConfig": { - "maturity": "1748563200", - "lendTakerFeeRatio": "2000000", - "lendMakerFeeRatio": "2000000", - "borrowTakerFeeRatio": "3000000", - "borrowMakerFeeRatio": "3000000", - "mintGtFeeRatio": "1000000", - "mintGtFeeRef": "2000000" - }, - "loanConfig": { - "liquidationLtv": "94000000", - "maxLtv": "90000000", - "liquidatable": true - }, - "underlyingConfig": { - "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", - "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", - "heartBeat": "86400", - "name": "USD Coin", - "symbol": "USDC", - "decimals": "6", - "initialPrice": "100000000" - }, - "collateralConfig": { - "tokenAddr": "0xd63070114470f685b75B74D60EEc7c1113d33a3D", - "priceFeedAddr": "0x2a2a0e32c54670045256EBcA681887E32e689E97", - "heartBeat": "86400", - "name": "USUAL Boosted USDC", - "symbol": "USUALUSDC+", - "decimals": "18", - "initialPrice": "105000000", - "gtKeyIdentifier": "GearingTokenWithERC20" - }, - "marketName": "USDC/USUALUSDC+-30MAY2025", - "marketSymbol": "USDC/USUALUSDC+-30MAY2025" - }, - "configs_5": { - "salt": 0, - "collateralCapForGt": "516253959465018000000", - "marketConfig": { - "maturity": "1748563200", - "lendTakerFeeRatio": "2000000", - "lendMakerFeeRatio": "2000000", - "borrowTakerFeeRatio": "3000000", - "borrowMakerFeeRatio": "3000000", - "mintGtFeeRatio": "1000000", - "mintGtFeeRef": "400000" - }, - "loanConfig": { - "liquidationLtv": "94000000", - "maxLtv": "90000000", - "liquidatable": true - }, - "underlyingConfig": { - "tokenAddr": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", - "priceFeedAddr": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", - "heartBeat": "3600", - "name": "Wrapped ETH", - "symbol": "WETH", - "decimals": "18", - "initialPrice": "188061000000" - }, - "collateralConfig": { - "tokenAddr": "0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8", - "priceFeedAddr": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", - "heartBeat": "3600", - "name": "MEV Capital wETH", - "symbol": "MCwETH", - "decimals": "18", - "initialPrice": "193703000000", - "gtKeyIdentifier": "GearingTokenWithERC20" - }, - "marketName": "WETH/MCwETH-30MAY2025", - "marketSymbol": "WETH/MCwETH-30MAY2025" - }, - "configs_6": { - "salt": 0, - "collateralCapForGt": "571642204094784000000", - "marketConfig": { - "maturity": "1748563200", - "lendTakerFeeRatio": "2000000", - "lendMakerFeeRatio": "2000000", - "borrowTakerFeeRatio": "3000000", - "borrowMakerFeeRatio": "3000000", - "mintGtFeeRatio": "1000000", - "mintGtFeeRef": "400000" - }, - "loanConfig": { - "liquidationLtv": "94000000", - "maxLtv": "92000000", - "liquidatable": true - }, - "underlyingConfig": { - "tokenAddr": "0xD9A442856C234a39a81a089C06451EBAa4306a72", - "priceFeedAddr": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", - "heartBeat": "86400", - "name": "pufETH", - "symbol": "pufETH", - "decimals": "18", - "initialPrice": "183668000000" - }, - "collateralConfig": { - "tokenAddr": "0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D", - "priceFeedAddr": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", - "heartBeat": "86400", - "name": "PT Puffer ETH 26JUN2025", - "symbol": "PT-pufETH-26JUN2025", - "decimals": "18", - "initialPrice": "174935000000", - "gtKeyIdentifier": "GearingTokenWithERC20" - }, - "marketName": "pufETH/PT-pufETH-26JUN2025-30MAY2025", - "marketSymbol": "pufETH/PT-pufETH-26JUN2025-30MAY2025" - }, - "configs_7": { - "salt": 0, - "collateralCapForGt": "1000000000000000000000000", - "marketConfig": { - "maturity": "1748476800", - "lendTakerFeeRatio": "2000000", - "lendMakerFeeRatio": "2000000", - "borrowTakerFeeRatio": "3000000", - "borrowMakerFeeRatio": "3000000", - "mintGtFeeRatio": "1000000", - "mintGtFeeRef": "2000000" + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "6000000" }, "loanConfig": { "liquidationLtv": "94000000", @@ -294,180 +23,24 @@ "underlyingConfig": { "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", "heartBeat": "86400", "name": "USD Coin", "symbol": "USDC", "decimals": "6", - "initialPrice": "100000000" + "initialPrice": "99845377" }, "collateralConfig": { - "tokenAddr": "0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F", - "priceFeedAddr": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "tokenAddr": "0xaD55aebc9b8c03FC43cd9f62260391c13c23e7c0", + "priceFeedAddr": "0xf158000de86899b5EB5E6fA3BB78F32A072bD14b", + "backupPriceFeedAddr": "0xf158000de86899b5EB5E6fA3BB78F32A072bD14b", "heartBeat": "86400", - "name": "Ethereal Pre-deposit Vault", - "symbol": "eUSDe", + "name": "Compounding Open Dollar", + "symbol": "cUSDO", "decimals": "18", - "initialPrice": "100000000", + "initialPrice": "101885665", "gtKeyIdentifier": "GearingTokenWithERC20" - }, - "marketName": "USDC/eUSDe-29MAY2025", - "marketSymbol": "USDC/eUSDe-29MAY2025" - }, - "configs_8": { - "salt": 0, - "collateralCapForGt": "509353831352779000000", - "marketConfig": { - "maturity": "1748563200", - "lendTakerFeeRatio": "2000000", - "lendMakerFeeRatio": "2000000", - "borrowTakerFeeRatio": "3000000", - "borrowMakerFeeRatio": "3000000", - "mintGtFeeRatio": "1000000", - "mintGtFeeRef": "400000" - }, - "loanConfig": { - "liquidationLtv": "94000000", - "maxLtv": "90000000", - "liquidatable": true - }, - "underlyingConfig": { - "tokenAddr": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", - "priceFeedAddr": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", - "heartBeat": "3600", - "name": "Wrapped ETH", - "symbol": "WETH", - "decimals": "18", - "initialPrice": "188061000000" - }, - "collateralConfig": { - "tokenAddr": "0xD9A442856C234a39a81a089C06451EBAa4306a72", - "priceFeedAddr": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", - "heartBeat": "86400", - "name": "pufETH", - "symbol": "pufETH", - "decimals": "18", - "initialPrice": "196327000000", - "gtKeyIdentifier": "GearingTokenWithERC20" - }, - "marketName": "WETH/pufETH-30MAY2025", - "marketSymbol": "WETH/pufETH-30MAY2025" - }, - "configs_9": { - "salt": 0, - "collateralCapForGt": "1192960104", - "marketConfig": { - "maturity": "1748563200", - "lendTakerFeeRatio": "2000000", - "lendMakerFeeRatio": "2000000", - "borrowTakerFeeRatio": "3000000", - "borrowMakerFeeRatio": "3000000", - "mintGtFeeRatio": "1000000", - "mintGtFeeRef": "2000000" - }, - "loanConfig": { - "liquidationLtv": "85000000", - "maxLtv": "81000000", - "liquidatable": true - }, - "underlyingConfig": { - "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", - "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", - "heartBeat": "86400", - "name": "USD Coin", - "symbol": "USDC", - "decimals": "6", - "initialPrice": "100000000" - }, - "collateralConfig": { - "tokenAddr": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", - "priceFeedAddr": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", - "heartBeat": "3600", - "name": "Wrapped BTC", - "symbol": "WBTC", - "decimals": "8", - "initialPrice": "8382510000000", - "gtKeyIdentifier": "GearingTokenWithERC20" - }, - "marketName": "USDC/WBTC-30MAY2025", - "marketSymbol": "USDC/WBTC-30MAY2025" - }, - "configs_10": { - "salt": 0, - "collateralCapForGt": "1192960104", - "marketConfig": { - "maturity": "1748563200", - "lendTakerFeeRatio": "2000000", - "lendMakerFeeRatio": "2000000", - "borrowTakerFeeRatio": "3000000", - "borrowMakerFeeRatio": "3000000", - "mintGtFeeRatio": "1000000", - "mintGtFeeRef": "2000000" - }, - "loanConfig": { - "liquidationLtv": "85000000", - "maxLtv": "81000000", - "liquidatable": true - }, - "underlyingConfig": { - "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", - "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", - "heartBeat": "86400", - "name": "USD Coin", - "symbol": "USDC", - "decimals": "6", - "initialPrice": "100000000" - }, - "collateralConfig": { - "tokenAddr": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", - "priceFeedAddr": "0x2665701293fCbEB223D11A08D826563EDcCE423A", - "heartBeat": "86400", - "name": "Coinbase Wrapped BTC", - "symbol": "cbBTC", - "decimals": "8", - "initialPrice": "8382510000000", - "gtKeyIdentifier": "GearingTokenWithERC20" - }, - "marketName": "USDC/cbBTC-30MAY2025", - "marketSymbol": "USDC/cbBTC-30MAY2025" - }, - "configs_11": { - "salt": 0, - "collateralCapForGt": "520040663324174000000", - "marketConfig": { - "maturity": "1748563200", - "lendTakerFeeRatio": "2000000", - "lendMakerFeeRatio": "2000000", - "borrowTakerFeeRatio": "3000000", - "borrowMakerFeeRatio": "3000000", - "mintGtFeeRatio": "1000000", - "mintGtFeeRef": "400000" - }, - "loanConfig": { - "liquidationLtv": "94000000", - "maxLtv": "90000000", - "liquidatable": true - }, - "underlyingConfig": { - "tokenAddr": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", - "priceFeedAddr": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", - "heartBeat": "3600", - "name": "Wrapped ETH", - "symbol": "WETH", - "decimals": "18", - "initialPrice": "188061000000" - }, - "collateralConfig": { - "tokenAddr": "0x2371e134e3455e0593363cBF89d3b6cf53740618", - "priceFeedAddr": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", - "heartBeat": "3600", - "name": "Gauntlet WETH Prime", - "symbol": "gtWETH", - "decimals": "18", - "initialPrice": "192293000000", - "gtKeyIdentifier": "GearingTokenWithERC20" - }, - "marketName": "WETH/gtWETH-30MAY2025", - "marketSymbol": "WETH/gtWETH-30MAY2025" + } } } } \ No newline at end of file diff --git a/script/deploy/deploydata/eth-sepolia.json b/script/deploy/deploydata/eth-sepolia.json new file mode 100644 index 0000000..eaa43ff --- /dev/null +++ b/script/deploy/deploydata/eth-sepolia.json @@ -0,0 +1,497 @@ +{ + "configNum": "12", + "configs": { + "configs_0": { + "salt": 0, + "collateralCapForGt": "638791170088097000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "priceFeedAddr": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "backupPriceFeedAddr": "0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4", + "heartBeat": "86400", + "name": "Wrapped ETH", + "symbol": "WETH", + "decimals": "18", + "initialPrice": "147342000000" + }, + "collateralConfig": { + "tokenAddr": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", + "priceFeedAddr": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "backupPriceFeedAddr": "0x24CFEf73A30b2CEEC23d3659fA98B491D996F152", + "heartBeat": "86400", + "name": "Wrapped eETH", + "symbol": "weETH", + "decimals": "18", + "initialPrice": "156546000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "WETH/weETH@30MAY2025", + "marketSymbol": "WETH/weETH@30MAY2025" + }, + "configs_1": { + "salt": 0, + "collateralCapForGt": "567121561593946000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "85000000", + "maxLtv": "81000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "priceFeedAddr": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "backupPriceFeedAddr": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400", + "name": "Wrapped liquid staked Ether 2.0", + "symbol": "wstETH", + "decimals": "18", + "initialPrice": "176329000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/wstETH@30MAY2025", + "marketSymbol": "USDC/wstETH@30MAY2025" + }, + "configs_2": { + "salt": 0, + "collateralCapForGt": "862068965517241000000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "90000000", + "maxLtv": "86000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "priceFeedAddr": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "backupPriceFeedAddr": "0xb99D174ED06c83588Af997c8859F93E83dD4733f", + "heartBeat": "86400", + "name": "Staked USDe", + "symbol": "sUSDe", + "decimals": "18", + "initialPrice": "115999999", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/sUSDe@30MAY2025", + "marketSymbol": "USDC/sUSDe@30MAY2025" + }, + "configs_3": { + "salt": 0, + "collateralCapForGt": "1025010250102500000000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "90000000", + "maxLtv": "86000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "priceFeedAddr": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "backupPriceFeedAddr": "0x333651c5710Fc8C4fe65E5D15E5639348F267D7c", + "heartBeat": "86400", + "name": "PT Ethena sUSDE 29MAY2025", + "symbol": "PT-sUSDE-29MAY2025", + "decimals": "18", + "initialPrice": "98000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025" + }, + "configs_4": { + "salt": 0, + "collateralCapForGt": "952380952380952000000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0xd63070114470f685b75B74D60EEc7c1113d33a3D", + "priceFeedAddr": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "backupPriceFeedAddr": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400", + "name": "USUAL Boosted USDC", + "symbol": "USUALUSDC+", + "decimals": "18", + "initialPrice": "105000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/USUALUSDC+@30MAY2025", + "marketSymbol": "USDC/USUALUSDC+@30MAY2025" + }, + "configs_5": { + "salt": 0, + "collateralCapForGt": "658925566985259000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "priceFeedAddr": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "backupPriceFeedAddr": "0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4", + "heartBeat": "86400", + "name": "Wrapped ETH", + "symbol": "WETH", + "decimals": "18", + "initialPrice": "147342000000" + }, + "collateralConfig": { + "tokenAddr": "0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8", + "priceFeedAddr": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", + "backupPriceFeedAddr": "0x3b82860EC8815Fc2A1dcC53580bd647b0042C93e", + "heartBeat": "86400", + "name": "MEV Capital wETH", + "symbol": "MCwETH", + "decimals": "18", + "initialPrice": "151762000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "WETH/MCwETH@30MAY2025", + "marketSymbol": "WETH/MCwETH@30MAY2025" + }, + "configs_6": { + "salt": 0, + "collateralCapForGt": "729620870774905000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "92000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "priceFeedAddr": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "backupPriceFeedAddr": "0x5F08C227deAe74D8e5Ec0d743FB0744AB1B6c984", + "heartBeat": "86400", + "name": "pufETH", + "symbol": "pufETH", + "decimals": "18", + "initialPrice": "183668000000" + }, + "collateralConfig": { + "tokenAddr": "0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D", + "priceFeedAddr": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "backupPriceFeedAddr": "0x5D18F4cB3c95568F315cb1C1eF48261a5A4D6053", + "heartBeat": "86400", + "name": "PT Puffer ETH 26JUN2025", + "symbol": "PT-pufETH-26JUN2025", + "decimals": "18", + "initialPrice": "137057000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025" + }, + "configs_7": { + "salt": 0, + "collateralCapForGt": "1000000000000000000000000", + "marketConfig": { + "maturity": "1748476800", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "92000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F", + "priceFeedAddr": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "backupPriceFeedAddr": "0x6B09d473dB784D840E307Cb3Da63CbA79D300CAc", + "heartBeat": "86400", + "name": "Ethereal Pre-deposit Vault", + "symbol": "eUSDe", + "decimals": "18", + "initialPrice": "100000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/eUSDe@29MAY2025", + "marketSymbol": "USDC/eUSDe@29MAY2025" + }, + "configs_8": { + "salt": 0, + "collateralCapForGt": "650118523968408000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "priceFeedAddr": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "backupPriceFeedAddr": "0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4", + "heartBeat": "86400", + "name": "Wrapped ETH", + "symbol": "WETH", + "decimals": "18", + "initialPrice": "147342000000" + }, + "collateralConfig": { + "tokenAddr": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "priceFeedAddr": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "backupPriceFeedAddr": "0x5F08C227deAe74D8e5Ec0d743FB0744AB1B6c984", + "heartBeat": "86400", + "name": "pufETH", + "symbol": "pufETH", + "decimals": "18", + "initialPrice": "153818000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "WETH/pufETH@30MAY2025", + "marketSymbol": "WETH/pufETH@30MAY2025" + }, + "configs_9": { + "salt": 0, + "collateralCapForGt": "1294383437", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "85000000", + "maxLtv": "81000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "priceFeedAddr": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "backupPriceFeedAddr": "0xAB7f623fb2F6fea6601D4350FA0E2290663C28Fc", + "heartBeat": "86400", + "name": "Wrapped BTC", + "symbol": "WBTC", + "decimals": "8", + "initialPrice": "7725686000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/WBTC@30MAY2025", + "marketSymbol": "USDC/WBTC@30MAY2025" + }, + "configs_10": { + "salt": 0, + "collateralCapForGt": "1294383437", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "85000000", + "maxLtv": "81000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", + "priceFeedAddr": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "backupPriceFeedAddr": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "heartBeat": "86400", + "name": "Coinbase Wrapped BTC", + "symbol": "cbBTC", + "decimals": "8", + "initialPrice": "7725686000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/cbBTC@30MAY2025", + "marketSymbol": "USDC/cbBTC@30MAY2025" + }, + "configs_11": { + "salt": 0, + "collateralCapForGt": "663758761853122000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "priceFeedAddr": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "backupPriceFeedAddr": "0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4", + "heartBeat": "86400", + "name": "Wrapped ETH", + "symbol": "WETH", + "decimals": "18", + "initialPrice": "147342000000" + }, + "collateralConfig": { + "tokenAddr": "0x2371e134e3455e0593363cBF89d3b6cf53740618", + "priceFeedAddr": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", + "backupPriceFeedAddr": "0x3A44454F173b082F1dbbA9587b046Dc90B2F0AE7", + "heartBeat": "86400", + "name": "Gauntlet WETH Prime", + "symbol": "gtWETH", + "decimals": "18", + "initialPrice": "150657000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "WETH/gtWETH@30MAY2025", + "marketSymbol": "WETH/gtWETH@30MAY2025" + } + } +} \ No newline at end of file diff --git a/script/deploy/deploydata/gt_capacity_updates.json b/script/deploy/deploydata/gt_capacity_updates.json new file mode 100644 index 0000000..6a22c27 --- /dev/null +++ b/script/deploy/deploydata/gt_capacity_updates.json @@ -0,0 +1,17 @@ +{ + "marketCount": 3, + "markets": [ + { + "symbol": "WETH/gtWETH@30MAY2025", + "newCapacity": "750000000000000000000" + }, + { + "symbol": "USDC/gtusdcf@30MAY2025", + "newCapacity": "1500000000000000000000000" + }, + { + "symbol": "WBTC/gtWBTC@30MAY2025", + "newCapacity": "50000000000000000000" + } + ] +} \ No newline at end of file diff --git a/script/deploy/deploydata/market_list.json b/script/deploy/deploydata/market_list.json new file mode 100644 index 0000000..6ab2110 --- /dev/null +++ b/script/deploy/deploydata/market_list.json @@ -0,0 +1,1084 @@ +{ + "data": [ + { + "contracts": { + "routerAddr": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "marketAddr": "0x03f2af12ae4eb5533c3f7773be826e8da56f6e1a", + "underlyingAddr": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", + "collateralAddr": "0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf", + "ftAddr": "0x970d02242b8339fc3148643a00e0a1e52c1eb5eb", + "xtAddr": "0xf1f31f2668ada8400d91bfc00f9a3c316c538cb3", + "gtAddr": "0x49d06206055e0cbdcbe94257782284b69b4b15fd" + }, + "symbol": "USDC/cbBTC@30MAY2025", + "isFixed": false, + "openTime": "2025-04-09T16:53:59.000Z", + "maturity": "2025-05-30T00:00:00.000Z", + "treasurer": "0x719e77027952929ed3060dbffc5d43ec50c1cf79", + "defaultFeeConfig": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "issueFtFeeRatio": "10000000", + "issueFtFeeRef": "6000000", + "redeemFeeRatio": "0" + }, + "liquidationWindowSeconds": 7200, + "maxLtv": "81000000", + "liquidationLtv": "85000000", + "liquidatable": true, + "isEnabled": true + }, + { + "contracts": { + "routerAddr": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "marketAddr": "0x08d6e7d4f49f6e34878a6f35db96f3130c43245f", + "underlyingAddr": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", + "collateralAddr": "0x1132065009850c72e27b7950c0f9285d1d103589", + "ftAddr": "0x8445c7a468bc74d9a6af8006f36fe5703ccae230", + "xtAddr": "0x38636a20a312094ac71d73481a2fc51e691c5680", + "gtAddr": "0x94257d83ba7b89a53f6bb4dfa282d1c992118986" + }, + "symbol": "USDC/PT-mMEV-31JUL2025@20250801", + "isFixed": false, + "openTime": "2025-05-14T16:12:11.000Z", + "maturity": "2025-08-01T00:00:00.000Z", + "treasurer": "0x719e77027952929ed3060dbffc5d43ec50c1cf79", + "defaultFeeConfig": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "issueFtFeeRatio": "10000000", + "issueFtFeeRef": "6000000", + "redeemFeeRatio": "0" + }, + "liquidationWindowSeconds": 7200, + "maxLtv": "87500000", + "liquidationLtv": "91500000", + "liquidatable": true, + "isEnabled": true + }, + { + "contracts": { + "routerAddr": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "marketAddr": "0x0b7efe5de3c3b5d75de33e25965b193d6ba79f52", + "underlyingAddr": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", + "collateralAddr": "0xcd5fe23c85820f7b72d0926fc9b05b43e359b7ee", + "ftAddr": "0x409e45a47629f45b91607bb87bcd8d043f32bc9a", + "xtAddr": "0x21ad8e3b575b65f2c937b201749a738ec53786e8", + "gtAddr": "0x02da4fda501396e036dcb591827e938e25fe3dd4" + }, + "symbol": "WETH/weETH@30MAY2025", + "isFixed": false, + "openTime": "2025-04-09T16:51:23.000Z", + "maturity": "2025-05-30T00:00:00.000Z", + "treasurer": "0x719e77027952929ed3060dbffc5d43ec50c1cf79", + "defaultFeeConfig": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "issueFtFeeRatio": "10000000", + "issueFtFeeRef": "3000000", + "redeemFeeRatio": "0" + }, + "liquidationWindowSeconds": 7200, + "maxLtv": "90000000", + "liquidationLtv": "94000000", + "liquidatable": true, + "isEnabled": true + }, + { + "contracts": { + "routerAddr": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "marketAddr": "0x1a69127188b72a155165255270017b4c78f31b88", + "underlyingAddr": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", + "collateralAddr": "0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf", + "ftAddr": "0x0f8a293c6f7e578d46b1da2a44a5a65ce874da2d", + "xtAddr": "0x5ba653575ea036d734d703eaf9de2fe8936a6979", + "gtAddr": "0xe81e8f37ac256253c78f5d880ad3d1cfcd00a5b2" + }, + "symbol": "USDC/cbBTC@27JUN2025", + "isFixed": false, + "openTime": "2025-05-07T08:19:11.000Z", + "maturity": "2025-06-27T00:00:00.000Z", + "treasurer": "0x719e77027952929ed3060dbffc5d43ec50c1cf79", + "defaultFeeConfig": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "issueFtFeeRatio": "10000000", + "issueFtFeeRef": "6000000", + "redeemFeeRatio": "0" + }, + "liquidationWindowSeconds": 7200, + "maxLtv": "81000000", + "liquidationLtv": "85000000", + "liquidatable": true, + "isEnabled": true + }, + { + "contracts": { + "routerAddr": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "marketAddr": "0x22cd4c59ed4bb2ad852892518073056441c55bfe", + "underlyingAddr": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", + "collateralAddr": "0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0", + "ftAddr": "0x285a4618d3349e2fff63f750fcac94fb002f932e", + "xtAddr": "0x874adbd54f7ba2cf46f97bb569ab7ba4cb8f89c9", + "gtAddr": "0xec4aa75e5c4b09eb65761f8328252d3509f232c0" + }, + "symbol": "USDC/wstETH@27JUN2025", + "isFixed": false, + "openTime": "2025-05-07T08:18:23.000Z", + "maturity": "2025-06-27T00:00:00.000Z", + "treasurer": "0x719e77027952929ed3060dbffc5d43ec50c1cf79", + "defaultFeeConfig": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "issueFtFeeRatio": "10000000", + "issueFtFeeRef": "6000000", + "redeemFeeRatio": "0" + }, + "liquidationWindowSeconds": 7200, + "maxLtv": "81000000", + "liquidationLtv": "85000000", + "liquidatable": true, + "isEnabled": true + }, + { + "contracts": { + "routerAddr": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "marketAddr": "0x2524d9a55c2d18a3f257a7f67afd552b285de34e", + "underlyingAddr": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", + "collateralAddr": "0x9bca74f805ab0a22ddd0886db0942199a0feba71", + "ftAddr": "0x3448d6883c7762ed95f59b4a9780b07981b6afee", + "xtAddr": "0xffd2743ca5fcdd97b690c33434ef456be9885d20", + "gtAddr": "0x581577e0b27fc695b21089a08be962ae3f60aa2f" + }, + "symbol": "USDC/PT-lvlUSD-29MAY2025@30MAY2025", + "isFixed": false, + "openTime": "2025-04-14T08:49:59.000Z", + "maturity": "2025-05-30T00:00:00.000Z", + "treasurer": "0x719e77027952929ed3060dbffc5d43ec50c1cf79", + "defaultFeeConfig": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "issueFtFeeRatio": "10000000", + "issueFtFeeRef": "6000000", + "redeemFeeRatio": "0" + }, + "liquidationWindowSeconds": 7200, + "maxLtv": "86000000", + "liquidationLtv": "90000000", + "liquidatable": true, + "isEnabled": true + }, + { + "contracts": { + "routerAddr": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "marketAddr": "0x2eaaffbcde68337341c0ec65a862e648a413dc14", + "underlyingAddr": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", + "collateralAddr": "0xc582f04d8a82795aa2ff9c8bb4c1c889fe7b754e", + "ftAddr": "0x09ec4be9869bfabf9ff6652fe7703276d6f5e5d8", + "xtAddr": "0x9c7fbdd0055604bbf7736b153407e9513c818c22", + "gtAddr": "0x8ee590224c6cdde0d27fb60b37b05784dd794e59" + }, + "symbol": "USDC/gtusdcf@30MAY2025", + "isFixed": false, + "openTime": "2025-04-17T04:34:59.000Z", + "maturity": "2025-05-30T00:00:00.000Z", + "treasurer": "0x719e77027952929ed3060dbffc5d43ec50c1cf79", + "defaultFeeConfig": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "issueFtFeeRatio": "10000000", + "issueFtFeeRef": "10000000", + "redeemFeeRatio": "0" + }, + "liquidationWindowSeconds": 7200, + "maxLtv": "90000000", + "liquidationLtv": "94000000", + "liquidatable": true, + "isEnabled": true + }, + { + "contracts": { + "routerAddr": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "marketAddr": "0x37877773b1289c27bb6159b86613efd0d15cadae", + "underlyingAddr": "0x9d39a5de30e57443bff2a8307a4256c8797a3497", + "collateralAddr": "0xb7de5dfcb74d25c2f21841fbd6230355c50d9308", + "ftAddr": "0x6fbe672e148db5374a17dcfe78c22a31751b0f5f", + "xtAddr": "0x9b23666f665aa6b280d1f5c3a580eead7414dcac", + "gtAddr": "0x4f1b12bfe07534c68ecd6a971d3f6295b423cd09" + }, + "symbol": "sUSDe/PT-sUSDE-29MAY2025@30MAY2025", + "isFixed": false, + "openTime": "2025-04-14T08:49:23.000Z", + "maturity": "2025-05-30T00:00:00.000Z", + "treasurer": "0x719e77027952929ed3060dbffc5d43ec50c1cf79", + "defaultFeeConfig": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "issueFtFeeRatio": "10000000", + "issueFtFeeRef": "6000000", + "redeemFeeRatio": "0" + }, + "liquidationWindowSeconds": 7200, + "maxLtv": "94000000", + "liquidationLtv": "96000000", + "liquidatable": true, + "isEnabled": true + }, + { + "contracts": { + "routerAddr": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "marketAddr": "0x403863917316bf8aa1966f9d90b393cec98f991b", + "underlyingAddr": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", + "collateralAddr": "0x90d2af7d622ca3141efa4d8f1f24d86e5974cc8f", + "ftAddr": "0x7e5da817e4cd2f2a897c997fb6eb3506d9861432", + "xtAddr": "0x9c4ef4476130f92cef4b661f99130157d35129cd", + "gtAddr": "0xe09ad59438a1ea4041217cd1ee018589db508268" + }, + "symbol": "USDC/eUSDe@29MAY2025", + "isFixed": false, + "openTime": "2025-04-09T16:52:59.000Z", + "maturity": "2025-05-29T00:00:00.000Z", + "treasurer": "0x719e77027952929ed3060dbffc5d43ec50c1cf79", + "defaultFeeConfig": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "issueFtFeeRatio": "10000000", + "issueFtFeeRef": "6000000", + "redeemFeeRatio": "0" + }, + "liquidationWindowSeconds": 7200, + "maxLtv": "92000000", + "liquidationLtv": "94000000", + "liquidatable": true, + "isEnabled": true + }, + { + "contracts": { + "routerAddr": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "marketAddr": "0x484cdece3fc951a7d009b9dbac66ec287ec1f58e", + "underlyingAddr": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", + "collateralAddr": "0xd9a442856c234a39a81a089c06451ebaa4306a72", + "ftAddr": "0xc74af187d844dc35998271b5696053cf57816413", + "xtAddr": "0x1f2f2af9fbba146cb03b4eafd8c8ae9ed5b91f60", + "gtAddr": "0x89bce5e162cdb10ea0d0b84b5e7aff8f51036e89" + }, + "symbol": "WETH/pufETH@30MAY2025", + "isFixed": false, + "openTime": "2025-04-09T16:53:11.000Z", + "maturity": "2025-05-30T00:00:00.000Z", + "treasurer": "0x719e77027952929ed3060dbffc5d43ec50c1cf79", + "defaultFeeConfig": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "issueFtFeeRatio": "10000000", + "issueFtFeeRef": "3000000", + "redeemFeeRatio": "0" + }, + "liquidationWindowSeconds": 7200, + "maxLtv": "90000000", + "liquidationLtv": "94000000", + "liquidatable": true, + "isEnabled": true + }, + { + "contracts": { + "routerAddr": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "marketAddr": "0x6c7b36f0a2136cb0da7b38293925d9af06895c20", + "underlyingAddr": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", + "collateralAddr": "0x030b69280892c888670edcdcd8b69fd8026a0bf3", + "ftAddr": "0xfc97e7b4728d81b275dad8701f2a53b72e5a0898", + "xtAddr": "0x56c7334191d0cc03043f5e6203c56245de3d9bca", + "gtAddr": "0x4bdf64b59a1cadab0ff34e18cdee225435d0479e" + }, + "symbol": "USDC/mMEV@20250801", + "isFixed": false, + "openTime": "2025-05-14T16:12:23.000Z", + "maturity": "2025-08-01T00:00:00.000Z", + "treasurer": "0x719e77027952929ed3060dbffc5d43ec50c1cf79", + "defaultFeeConfig": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "issueFtFeeRatio": "10000000", + "issueFtFeeRef": "6000000", + "redeemFeeRatio": "0" + }, + "liquidationWindowSeconds": 7200, + "maxLtv": "81000000", + "liquidationLtv": "85000000", + "liquidatable": true, + "isEnabled": true + }, + { + "contracts": { + "routerAddr": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "marketAddr": "0x6f5c8838e618448e43385e4c401006822aa15142", + "underlyingAddr": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", + "collateralAddr": "0x9d39a5de30e57443bff2a8307a4256c8797a3497", + "ftAddr": "0x1be1a3b4a052f669f521f5966a37b49171aef57c", + "xtAddr": "0x7705d2b0990192c3b3d1ea6c3a7908250605120a", + "gtAddr": "0x1bb662b38ec6ff531def9caa37a3489c7f5e2f98" + }, + "symbol": "USDC/sUSDe@30MAY2025", + "isFixed": false, + "openTime": "2025-04-09T16:51:47.000Z", + "maturity": "2025-05-30T00:00:00.000Z", + "treasurer": "0x719e77027952929ed3060dbffc5d43ec50c1cf79", + "defaultFeeConfig": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "issueFtFeeRatio": "10000000", + "issueFtFeeRef": "6000000", + "redeemFeeRatio": "0" + }, + "liquidationWindowSeconds": 7200, + "maxLtv": "86000000", + "liquidationLtv": "90000000", + "liquidatable": true, + "isEnabled": true + }, + { + "contracts": { + "routerAddr": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "marketAddr": "0x7526d036cddbd3bdfdd8370d75304b822740b291", + "underlyingAddr": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", + "collateralAddr": "0x207f7205fd6c4b602fa792c8b2b60e6006d4a0b8", + "ftAddr": "0x51ae9ef7395a46e2861fe6b93f97728f9595e6e5", + "xtAddr": "0xa95cdaac1bf0af025ced0f259ac74cdec7503450", + "gtAddr": "0x6fa797c9675880654f098b554ae5b9cfdd6b2310" + }, + "symbol": "USDC/PT-lvlUSD-25SEP2025@26SEP2025", + "isFixed": false, + "openTime": "2025-05-10T06:05:47.000Z", + "maturity": "2025-09-26T00:00:00.000Z", + "treasurer": "0x719e77027952929ed3060dbffc5d43ec50c1cf79", + "defaultFeeConfig": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "issueFtFeeRatio": "10000000", + "issueFtFeeRef": "6000000", + "redeemFeeRatio": "0" + }, + "liquidationWindowSeconds": 7200, + "maxLtv": "87500000", + "liquidationLtv": "91500000", + "liquidatable": true, + "isEnabled": true + }, + { + "contracts": { + "routerAddr": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "marketAddr": "0x7d042a2800c2bf66a2af99014c96513bc4cefeda", + "underlyingAddr": "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599", + "collateralAddr": "0x9d39a5de30e57443bff2a8307a4256c8797a3497", + "ftAddr": "0x775157a35b1efb4d86c5bc732f047758085d2127", + "xtAddr": "0x91bc1c8dde63ec666397a7e1500acbd9b028fea3", + "gtAddr": "0xe173c8d8192d20d820061d04323c3e89aa836a4c" + }, + "symbol": "WBTC/sUSDe@20250627", + "isFixed": false, + "openTime": "2025-05-14T16:12:47.000Z", + "maturity": "2025-06-27T00:00:00.000Z", + "treasurer": "0x719e77027952929ed3060dbffc5d43ec50c1cf79", + "defaultFeeConfig": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "issueFtFeeRatio": "10000000", + "issueFtFeeRef": "3000000", + "redeemFeeRatio": "0" + }, + "liquidationWindowSeconds": 7200, + "maxLtv": "71000000", + "liquidationLtv": "75000000", + "liquidatable": true, + "isEnabled": true + }, + { + "contracts": { + "routerAddr": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "marketAddr": "0x8d501c7640595ec9d2a39fbd30ded7672e9631bd", + "underlyingAddr": "0x7c1156e515aa1a2e851674120074968c905aaf37", + "collateralAddr": "0x4737d9b4592b40d51e110b94c9c043c6654067ae", + "ftAddr": "0x53b52637923839676f6441c7e824d91478f882d3", + "xtAddr": "0xc5421aad009f200b60a8cc67b60cf6f774a1e693", + "gtAddr": "0xc03746e7441a523686d93c5282557e3970065d6a" + }, + "symbol": "lvlUSD/slvlUSD@27JUN2025", + "isFixed": false, + "openTime": "2025-05-07T08:19:23.000Z", + "maturity": "2025-06-27T00:00:00.000Z", + "treasurer": "0x719e77027952929ed3060dbffc5d43ec50c1cf79", + "defaultFeeConfig": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "issueFtFeeRatio": "10000000", + "issueFtFeeRef": "6000000", + "redeemFeeRatio": "0" + }, + "liquidationWindowSeconds": 7200, + "maxLtv": "86000000", + "liquidationLtv": "90000000", + "liquidatable": true, + "isEnabled": true + }, + { + "contracts": { + "routerAddr": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "marketAddr": "0x918d8ecba4c683ef3004b1c313cfef5e3b9e1146", + "underlyingAddr": "0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0", + "collateralAddr": "0x8e0789d39db454dbe9f4a77acef6dc7c69f6d552", + "ftAddr": "0xc4ce5aa3cabab5525d838f3095105e68764a4863", + "xtAddr": "0xd54417d73fedbbfa242e296a9199d401c377a23f", + "gtAddr": "0x79614885f2b286a20a18315a9963e9e7a5ef0824" + }, + "symbol": "wstETH/inwstETHs@30MAY2025", + "isFixed": false, + "openTime": "2025-04-22T15:56:23.000Z", + "maturity": "2025-05-30T00:00:00.000Z", + "treasurer": "0x719e77027952929ed3060dbffc5d43ec50c1cf79", + "defaultFeeConfig": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "issueFtFeeRatio": "10000000", + "issueFtFeeRef": "3000000", + "redeemFeeRatio": "0" + }, + "liquidationWindowSeconds": 7200, + "maxLtv": "90000000", + "liquidationLtv": "94000000", + "liquidatable": true, + "isEnabled": true + }, + { + "contracts": { + "routerAddr": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "marketAddr": "0x975cba8bad13ef86bc4d2bbb3eb7497327c640d1", + "underlyingAddr": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", + "collateralAddr": "0x2103e845c5e135493bb6c2a4f0b8651956ea8682", + "ftAddr": "0xf8c1cda465071665d3ecaf906732899186fd4856", + "xtAddr": "0xf7e8f91286e3d4685a4d8e4f2a7413fe273db503", + "gtAddr": "0x6216d113cbbc1c4a1017699e691e949d1dee8812" + }, + "symbol": "USDC/XAUM@20250627", + "isFixed": false, + "openTime": "2025-05-14T16:12:35.000Z", + "maturity": "2025-06-27T00:00:00.000Z", + "treasurer": "0x719e77027952929ed3060dbffc5d43ec50c1cf79", + "defaultFeeConfig": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "issueFtFeeRatio": "10000000", + "issueFtFeeRef": "6000000", + "redeemFeeRatio": "0" + }, + "liquidationWindowSeconds": 7200, + "maxLtv": "70000000", + "liquidationLtv": "77000000", + "liquidatable": true, + "isEnabled": true + }, + { + "contracts": { + "routerAddr": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "marketAddr": "0x988a287c4340b18665cc5e128dc76906a5c839e6", + "underlyingAddr": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", + "collateralAddr": "0x9d39a5de30e57443bff2a8307a4256c8797a3497", + "ftAddr": "0xce7decb042927ec42db8ecc75a8e526824376a3e", + "xtAddr": "0x13b29958f0f6eb39a587704034e531e4090e9d59", + "gtAddr": "0xdba3379f0406f5c90eb74d27e511e4fb4d10b6b3" + }, + "symbol": "USDC/sUSDe@27JUN2025", + "isFixed": false, + "openTime": "2025-05-07T08:18:35.000Z", + "maturity": "2025-06-27T00:00:00.000Z", + "treasurer": "0x719e77027952929ed3060dbffc5d43ec50c1cf79", + "defaultFeeConfig": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "issueFtFeeRatio": "10000000", + "issueFtFeeRef": "6000000", + "redeemFeeRatio": "0" + }, + "liquidationWindowSeconds": 7200, + "maxLtv": "86000000", + "liquidationLtv": "90000000", + "liquidatable": true, + "isEnabled": true + }, + { + "contracts": { + "routerAddr": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "marketAddr": "0x9904f3b879385033faa31b50d1d63cb80b3495a3", + "underlyingAddr": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", + "collateralAddr": "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599", + "ftAddr": "0x75b8ea5178baa489c9ab208ec80af10780927890", + "xtAddr": "0x6182feffc89a170154a991fe09c31765ba5441c8", + "gtAddr": "0x42c57cde40b26c5e68c28e687eaca7b83dc48377" + }, + "symbol": "USDC/WBTC@27JUN2025", + "isFixed": false, + "openTime": "2025-05-07T08:18:59.000Z", + "maturity": "2025-06-27T00:00:00.000Z", + "treasurer": "0x719e77027952929ed3060dbffc5d43ec50c1cf79", + "defaultFeeConfig": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "issueFtFeeRatio": "10000000", + "issueFtFeeRef": "6000000", + "redeemFeeRatio": "0" + }, + "liquidationWindowSeconds": 7200, + "maxLtv": "81000000", + "liquidationLtv": "85000000", + "liquidatable": true, + "isEnabled": true + }, + { + "contracts": { + "routerAddr": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "marketAddr": "0x9d7386f68d9001a809860b4d88ec8e2cc3dd81b0", + "underlyingAddr": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", + "collateralAddr": "0x2ca5f2c4300450d53214b00546795c1c07b89acb", + "ftAddr": "0x831a11a25a98715e632a51d46a6296da47883743", + "xtAddr": "0x733f08c07fe2d37c86516abe830fc2756e56ac1c", + "gtAddr": "0x68dce038af76f907617a0e648e23011143774e8a" + }, + "symbol": "USDC/PT-slvlUSD-25SEP2025@20250926", + "isFixed": false, + "openTime": "2025-05-14T16:11:59.000Z", + "maturity": "2025-09-26T00:00:00.000Z", + "treasurer": "0x719e77027952929ed3060dbffc5d43ec50c1cf79", + "defaultFeeConfig": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "issueFtFeeRatio": "10000000", + "issueFtFeeRef": "6000000", + "redeemFeeRatio": "0" + }, + "liquidationWindowSeconds": 7200, + "maxLtv": "87500000", + "liquidationLtv": "91500000", + "liquidatable": true, + "isEnabled": true + }, + { + "contracts": { + "routerAddr": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "marketAddr": "0xa1ed39c786eea298925dd6fcc33199c3ff06765e", + "underlyingAddr": "0x7c1156e515aa1a2e851674120074968c905aaf37", + "collateralAddr": "0x4737d9b4592b40d51e110b94c9c043c6654067ae", + "ftAddr": "0x5623695881db8cfc84ee1f40a1f4a0999d1552f6", + "xtAddr": "0x453dfd4db1a92bf8d84b4e4fa6381019370d0c5d", + "gtAddr": "0xe1e045a8a238994703ec0dd7e4e2ad6f97c5f186" + }, + "symbol": "lvlUSD/slvlUSD@30MAY2025", + "isFixed": false, + "openTime": "2025-04-14T08:49:47.000Z", + "maturity": "2025-05-30T00:00:00.000Z", + "treasurer": "0x719e77027952929ed3060dbffc5d43ec50c1cf79", + "defaultFeeConfig": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "issueFtFeeRatio": "10000000", + "issueFtFeeRef": "6000000", + "redeemFeeRatio": "0" + }, + "liquidationWindowSeconds": 7200, + "maxLtv": "86000000", + "liquidationLtv": "90000000", + "liquidatable": true, + "isEnabled": true + }, + { + "contracts": { + "routerAddr": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "marketAddr": "0xabe8ab2223c846466eb30f5137a7f05106c9d0c4", + "underlyingAddr": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", + "collateralAddr": "0xd9a442856c234a39a81a089c06451ebaa4306a72", + "ftAddr": "0x23ed558080ceb4755a24d841e24558e85b1ddb18", + "xtAddr": "0xa97ba034797386d9987c88beff430b40c4fdc6c5", + "gtAddr": "0xb4a859d44470f0168464a5db99f058cf9a7b4df1" + }, + "symbol": "WETH/pufETH@27JUN2025", + "isFixed": false, + "openTime": "2025-05-07T08:18:47.000Z", + "maturity": "2025-06-27T00:00:00.000Z", + "treasurer": "0x719e77027952929ed3060dbffc5d43ec50c1cf79", + "defaultFeeConfig": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "issueFtFeeRatio": "10000000", + "issueFtFeeRef": "3000000", + "redeemFeeRatio": "0" + }, + "liquidationWindowSeconds": 7200, + "maxLtv": "90000000", + "liquidationLtv": "94000000", + "liquidatable": true, + "isEnabled": true + }, + { + "contracts": { + "routerAddr": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "marketAddr": "0xb9919ee2169a7da664ad024c6ddcf0ccd4121c26", + "underlyingAddr": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", + "collateralAddr": "0x701907283a57ff77e255c3f1aad790466b8ce4ef", + "ftAddr": "0xbc9c191613c6e77c03a3f792579520d455e852a6", + "xtAddr": "0x1aa1ff0d8c47066c72902040716f91df18090adc", + "gtAddr": "0x489f04a08d6ee13789cd59c5ce241494b063b3db" + }, + "symbol": "WETH/mhyETH@30MAY2025", + "isFixed": false, + "openTime": "2025-04-17T04:35:11.000Z", + "maturity": "2025-05-30T00:00:00.000Z", + "treasurer": "0x719e77027952929ed3060dbffc5d43ec50c1cf79", + "defaultFeeConfig": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "issueFtFeeRatio": "10000000", + "issueFtFeeRef": "3000000", + "redeemFeeRatio": "0" + }, + "liquidationWindowSeconds": 7200, + "maxLtv": "90000000", + "liquidationLtv": "94000000", + "liquidatable": true, + "isEnabled": true + }, + { + "contracts": { + "routerAddr": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "marketAddr": "0xbebb5cee893110cf477901af7fa94e4840606421", + "underlyingAddr": "0xd9a442856c234a39a81a089c06451ebaa4306a72", + "collateralAddr": "0x9cfc9917c171a384c7168d3529fc7e851a2e0d6d", + "ftAddr": "0x5db7a477dede7d12fea665312282e052e0207fc1", + "xtAddr": "0xe8a7a6dd9218202996d9cf825426ab283b3396ed", + "gtAddr": "0x69cf2acd3499df9b322d3b3fb579e1af420f601d" + }, + "symbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "isFixed": false, + "openTime": "2025-04-09T16:52:47.000Z", + "maturity": "2025-05-30T00:00:00.000Z", + "treasurer": "0x719e77027952929ed3060dbffc5d43ec50c1cf79", + "defaultFeeConfig": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "issueFtFeeRatio": "10000000", + "issueFtFeeRef": "3000000", + "redeemFeeRatio": "0" + }, + "liquidationWindowSeconds": 7200, + "maxLtv": "92000000", + "liquidationLtv": "94000000", + "liquidatable": true, + "isEnabled": true + }, + { + "contracts": { + "routerAddr": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "marketAddr": "0xc68a2fbd7cb560c71ccafbdee971824ed9bf4556", + "underlyingAddr": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", + "collateralAddr": "0x2371e134e3455e0593363cbf89d3b6cf53740618", + "ftAddr": "0xd31d16770d10feee37fec90777697546f5388f85", + "xtAddr": "0xa7dbc90d2959e40eb093abe75c7405ff26ac3fe3", + "gtAddr": "0x9bdd5071f150d02af43a65e56a0622d03e846ddb" + }, + "symbol": "WETH/gtWETH@30MAY2025", + "isFixed": false, + "openTime": "2025-04-09T16:54:11.000Z", + "maturity": "2025-05-30T00:00:00.000Z", + "treasurer": "0x719e77027952929ed3060dbffc5d43ec50c1cf79", + "defaultFeeConfig": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "issueFtFeeRatio": "10000000", + "issueFtFeeRef": "3000000", + "redeemFeeRatio": "0" + }, + "liquidationWindowSeconds": 7200, + "maxLtv": "90000000", + "liquidationLtv": "94000000", + "liquidatable": true, + "isEnabled": true + }, + { + "contracts": { + "routerAddr": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "marketAddr": "0xc7559e952666fac90206758e664f86d09e7f1f72", + "underlyingAddr": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", + "collateralAddr": "0x9d39a5de30e57443bff2a8307a4256c8797a3497", + "ftAddr": "0x7337261cf19cc2d2146f6a30dd4fb186e31728cc", + "xtAddr": "0x0fe1a8e392f4c03eedb805260c12716b4b4ed68f", + "gtAddr": "0xdf7e3c6ba0239e1933e431ad68be7861ea51387e" + }, + "symbol": "WETH/sUSDe@20250627", + "isFixed": false, + "openTime": "2025-05-14T16:12:59.000Z", + "maturity": "2025-06-27T00:00:00.000Z", + "treasurer": "0x719e77027952929ed3060dbffc5d43ec50c1cf79", + "defaultFeeConfig": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "issueFtFeeRatio": "10000000", + "issueFtFeeRef": "3000000", + "redeemFeeRatio": "0" + }, + "liquidationWindowSeconds": 7200, + "maxLtv": "71000000", + "liquidationLtv": "75000000", + "liquidatable": true, + "isEnabled": true + }, + { + "contracts": { + "routerAddr": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "marketAddr": "0xc898fa3a26ceacae25ccfff6003b087948dede2a", + "underlyingAddr": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", + "collateralAddr": "0x9cfc9917c171a384c7168d3529fc7e851a2e0d6d", + "ftAddr": "0x0ad67bb21be025f9c47ceb0db3ac490e473afd9a", + "xtAddr": "0x0e960cfde8730da71e72b52bb1bc8ef4f4f5a9bb", + "gtAddr": "0xab490460b78c481fdf4d10ed85378cfa1dd342f1" + }, + "symbol": "WETH/PT-pufETH-26JUN2025@27JUN2025", + "isFixed": false, + "openTime": "2025-05-08T15:19:23.000Z", + "maturity": "2025-06-27T00:00:00.000Z", + "treasurer": "0x719e77027952929ed3060dbffc5d43ec50c1cf79", + "defaultFeeConfig": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "issueFtFeeRatio": "10000000", + "issueFtFeeRef": "3000000", + "redeemFeeRatio": "0" + }, + "liquidationWindowSeconds": 7200, + "maxLtv": "87500000", + "liquidationLtv": "91500000", + "liquidatable": true, + "isEnabled": true + }, + { + "contracts": { + "routerAddr": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "marketAddr": "0xce511791715d1a84cd2f7bfa279f92c187bb9d93", + "underlyingAddr": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", + "collateralAddr": "0x933b9ffee0ad3ef8e4dbb52688ea905826d73755", + "ftAddr": "0x89d6cd335090d67e6a18a63f97b55d7d177d2a1b", + "xtAddr": "0xc1a89e8c63f5162e78f339f138f3585f4372ece0", + "gtAddr": "0xd08c49be9063512c49dc113f1f7c00cd2519c654" + }, + "symbol": "USDC/PT-cUSDO-19JUN2025@20JUN2025", + "isFixed": false, + "openTime": "2025-05-10T06:05:23.000Z", + "maturity": "2025-06-20T00:00:00.000Z", + "treasurer": "0x719e77027952929ed3060dbffc5d43ec50c1cf79", + "defaultFeeConfig": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "issueFtFeeRatio": "10000000", + "issueFtFeeRef": "6000000", + "redeemFeeRatio": "0" + }, + "liquidationWindowSeconds": 7200, + "maxLtv": "87500000", + "liquidationLtv": "91500000", + "liquidatable": true, + "isEnabled": true + }, + { + "contracts": { + "routerAddr": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "marketAddr": "0xd017e469d22ab7ffb097b9aa329391874954523b", + "underlyingAddr": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", + "collateralAddr": "0x207f7205fd6c4b602fa792c8b2b60e6006d4a0b8", + "ftAddr": "0xc53c94aaeecc2f58ac64f97ef26f6947b8a1fa49", + "xtAddr": "0x13dd004a37cd8e35ecea7379ab45bd03c1f4e249", + "gtAddr": "0x022e7d8585f9214bbe29077501ce938e552f8d5e" + }, + "symbol": "USDC/PT-lvlUSD-25SEP2025@25JUL2025", + "isFixed": false, + "openTime": "2025-05-10T06:05:35.000Z", + "maturity": "2025-07-25T00:00:00.000Z", + "treasurer": "0x719e77027952929ed3060dbffc5d43ec50c1cf79", + "defaultFeeConfig": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "issueFtFeeRatio": "10000000", + "issueFtFeeRef": "6000000", + "redeemFeeRatio": "0" + }, + "liquidationWindowSeconds": 7200, + "maxLtv": "87500000", + "liquidationLtv": "91500000", + "liquidatable": true, + "isEnabled": true + }, + { + "contracts": { + "routerAddr": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "marketAddr": "0xd316d4494c840f8a758fb6184e9b60281e35cc02", + "underlyingAddr": "0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0", + "collateralAddr": "0x8e0789d39db454dbe9f4a77acef6dc7c69f6d552", + "ftAddr": "0x6b3aaab883d2b5a42276206b18c62dbd2f075b73", + "xtAddr": "0x1ad25fc3fad6b5fb2744ec684c74bc301a3a26dc", + "gtAddr": "0xce6df2c8a6b5d7f70f73a71f78c64f54bda4dbed" + }, + "symbol": "wstETH/inwstETHs@27JUN2025", + "isFixed": false, + "openTime": "2025-05-07T08:19:35.000Z", + "maturity": "2025-06-27T00:00:00.000Z", + "treasurer": "0x719e77027952929ed3060dbffc5d43ec50c1cf79", + "defaultFeeConfig": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "issueFtFeeRatio": "10000000", + "issueFtFeeRef": "3000000", + "redeemFeeRatio": "0" + }, + "liquidationWindowSeconds": 7200, + "maxLtv": "90000000", + "liquidationLtv": "94000000", + "liquidatable": true, + "isEnabled": true + }, + { + "contracts": { + "routerAddr": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "marketAddr": "0xd699efc4162d76bfd3cb553d65f850c882c29f5f", + "underlyingAddr": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", + "collateralAddr": "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599", + "ftAddr": "0x0297807b6f251431bc60d96e74daddaaacd8533e", + "xtAddr": "0x68f2e8b2b09122475c5208456a39caf87a097fe4", + "gtAddr": "0xbe53610fd2870ba0f221c40ed734f173685e3666" + }, + "symbol": "USDC/WBTC@30MAY2025", + "isFixed": false, + "openTime": "2025-04-09T16:53:23.000Z", + "maturity": "2025-05-30T00:00:00.000Z", + "treasurer": "0x719e77027952929ed3060dbffc5d43ec50c1cf79", + "defaultFeeConfig": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "issueFtFeeRatio": "10000000", + "issueFtFeeRef": "6000000", + "redeemFeeRatio": "0" + }, + "liquidationWindowSeconds": 7200, + "maxLtv": "81000000", + "liquidationLtv": "85000000", + "liquidatable": true, + "isEnabled": true + }, + { + "contracts": { + "routerAddr": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "marketAddr": "0xdbb2d44c238c459ccb820de886abf721ef6e6941", + "underlyingAddr": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", + "collateralAddr": "0x3b3fb9c57858ef816833dc91565efcd85d96f634", + "ftAddr": "0x39815280f3804a860a09b0ffbccaf8a0679ff5ba", + "xtAddr": "0x6cfa4b8506736dd838dcbec5187d777801160684", + "gtAddr": "0xa7793d67dcbcc16ef92ed455bc17594311d58d55" + }, + "symbol": "USDC/PT-sUSDE-31JUL2025@01AUG2025", + "isFixed": false, + "openTime": "2025-05-08T15:18:59.000Z", + "maturity": "2025-08-01T00:00:00.000Z", + "treasurer": "0x719e77027952929ed3060dbffc5d43ec50c1cf79", + "defaultFeeConfig": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "issueFtFeeRatio": "10000000", + "issueFtFeeRef": "6000000", + "redeemFeeRatio": "0" + }, + "liquidationWindowSeconds": 7200, + "maxLtv": "87500000", + "liquidationLtv": "91500000", + "liquidatable": true, + "isEnabled": true + }, + { + "contracts": { + "routerAddr": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "marketAddr": "0xe867255dc0c3a27c90f756ecc566a5292ce19492", + "underlyingAddr": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", + "collateralAddr": "0xb7de5dfcb74d25c2f21841fbd6230355c50d9308", + "ftAddr": "0x07ef01ba0947eb64df31a826c8a084ca005e545d", + "xtAddr": "0xb58036be9723ba7766161ddb8d4050b3c44dc273", + "gtAddr": "0x3a888cb50b4b1bfcb61507d4a453ef67ba1e4055" + }, + "symbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "isFixed": false, + "openTime": "2025-04-09T16:51:59.000Z", + "maturity": "2025-05-30T00:00:00.000Z", + "treasurer": "0x719e77027952929ed3060dbffc5d43ec50c1cf79", + "defaultFeeConfig": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "issueFtFeeRatio": "10000000", + "issueFtFeeRef": "6000000", + "redeemFeeRatio": "0" + }, + "liquidationWindowSeconds": 7200, + "maxLtv": "86000000", + "liquidationLtv": "90000000", + "liquidatable": true, + "isEnabled": true + }, + { + "contracts": { + "routerAddr": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "marketAddr": "0xed7cd45e5e6ef68261929b58539805ba3c061f14", + "underlyingAddr": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", + "collateralAddr": "0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0", + "ftAddr": "0x94b0b2679bdee922039d8b0bb952f5048ff8b87f", + "xtAddr": "0xbd99501360ffe943c60546c422f4885ea022fcbc", + "gtAddr": "0xef15c2c9d5213fe471d9d28a8908cd3b007c4539" + }, + "symbol": "USDC/wstETH@30MAY2025", + "isFixed": false, + "openTime": "2025-04-09T16:51:35.000Z", + "maturity": "2025-05-30T00:00:00.000Z", + "treasurer": "0x719e77027952929ed3060dbffc5d43ec50c1cf79", + "defaultFeeConfig": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "issueFtFeeRatio": "10000000", + "issueFtFeeRef": "6000000", + "redeemFeeRatio": "0" + }, + "liquidationWindowSeconds": 7200, + "maxLtv": "81000000", + "liquidationLtv": "85000000", + "liquidatable": true, + "isEnabled": true + }, + { + "contracts": { + "routerAddr": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "marketAddr": "0xf0de37189366f0f3aae2795160763f3f34797b11", + "underlyingAddr": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", + "collateralAddr": "0xcd5fe23c85820f7b72d0926fc9b05b43e359b7ee", + "ftAddr": "0xe8503ffecc5d4065ba0eb11dcbdcd47a4f752572", + "xtAddr": "0xf98042dd2ca30440d27373eca2727e9540897ebf", + "gtAddr": "0x272f222de90adf7b1cca859d685bec738993ba6c" + }, + "symbol": "WETH/weETH@27JUN2025", + "isFixed": false, + "openTime": "2025-05-07T08:18:11.000Z", + "maturity": "2025-06-27T00:00:00.000Z", + "treasurer": "0x719e77027952929ed3060dbffc5d43ec50c1cf79", + "defaultFeeConfig": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "issueFtFeeRatio": "10000000", + "issueFtFeeRef": "3000000", + "redeemFeeRatio": "0" + }, + "liquidationWindowSeconds": 7200, + "maxLtv": "90000000", + "liquidationLtv": "94000000", + "liquidatable": true, + "isEnabled": true + }, + { + "contracts": { + "routerAddr": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "marketAddr": "0xf4924d6189552ae5a7818088da6f23bd33281c1b", + "underlyingAddr": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", + "collateralAddr": "0xf1fd8ac6346ec7bc4116ba7adc81102b2bc4c52d", + "ftAddr": "0xe7b3c858ff8031dc6c84d899aeec343c89a246e0", + "xtAddr": "0x2568d2b892b5c761e1155f4f1c05e5b61961f126", + "gtAddr": "0x5c4db8db0ca1d040e7fd6fb2afaa81032df0a4f7" + }, + "symbol": "USDC/MC_USDCP@30MAY2025", + "isFixed": false, + "openTime": "2025-04-17T04:34:47.000Z", + "maturity": "2025-05-30T00:00:00.000Z", + "treasurer": "0x719e77027952929ed3060dbffc5d43ec50c1cf79", + "defaultFeeConfig": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "issueFtFeeRatio": "10000000", + "issueFtFeeRef": "6000000", + "redeemFeeRatio": "0" + }, + "liquidationWindowSeconds": 7200, + "maxLtv": "90000000", + "liquidationLtv": "94000000", + "liquidatable": true, + "isEnabled": true + } + ] +} \ No newline at end of file diff --git a/script/order-history-tracker.ts b/script/order-history-tracker.ts new file mode 100644 index 0000000..dda0d53 --- /dev/null +++ b/script/order-history-tracker.ts @@ -0,0 +1,1424 @@ +#!/usr/bin/env node + +import { ethers } from 'ethers'; +import * as fs from 'fs'; +import { abiTermMaxOrder } from '../abi_typescript/abiTermMaxOrder'; + +// Type definitions for the script +interface TokenInfo { + address: string; + name: string; + symbol: string; + decimals: number; + error?: string; +} + +interface MarketConfig { + treasurer: string; + maturity: string; + maturityDate: string; +} + +interface MarketTokens { + ft: TokenInfo; + xt: TokenInfo; + gt: { + address: string; + }; + collateral: TokenInfo; + debtToken: TokenInfo; +} + +interface MarketInfo { + address: string; + config: MarketConfig | null; + tokens: MarketTokens; + error?: string; +} + +interface OrderConfig { + maxXtReserve: string; + gtId: string; + swapTrigger: string; +} + +interface OrderInfo { + address: string; + marketAddress: string; + marketInfo: MarketInfo; + makerAddress: string; + ftReserve: string; + xtReserve: string; + orderConfig: OrderConfig | null; + error?: string; +} + +interface BaseEvent { + blockNumber: number; + transactionHash: string; + logIndex: number; + eventType: string; + operationType: 'Swap' | 'Deposit' | 'Withdraw' | 'UpdateCurve' | 'Create' | string; + timestamp: number | null; + date?: string; + sortKey?: string; + daysToMaturity?: number; +} + +interface SwapEvent extends BaseEvent { + tokenIn: string; + tokenOut: string; + caller: string; + recipient: string; + tokenInAmount: ethers.BigNumber; + tokenOutAmount: ethers.BigNumber; + feeAmount: ethers.BigNumber; + tokenInSymbol?: string; + tokenOutSymbol?: string; + tokenInAmountFormatted?: string; + tokenOutAmountFormatted?: string; + feeAmountFormatted?: string; + direction?: 'LEND' | 'BORROW' | 'OTHER'; + abstractTokenInSymbol?: string; + abstractTokenOutSymbol?: string; + abstractTokenInAmountFormatted?: string; + abstractTokenOutAmountFormatted?: string; + avgMatchedInterestRate?: number; +} + +interface UpdateOrderEvent extends BaseEvent { + ftChangeAmt: ethers.BigNumber; + xtChangeAmt: ethers.BigNumber; + gtId: ethers.BigNumber; + maxXtReserve: ethers.BigNumber; + swapTrigger: string; + ftChangeAmtFormatted?: string; + xtChangeAmtFormatted?: string; + maxXtReserveFormatted?: string; +} + +interface WithdrawAssetsEvent extends BaseEvent { + token: string; + owner: string; + recipient: string; + amount: ethers.BigNumber; + tokenSymbol?: string; + amountFormatted?: string; +} + +interface OrderInitializedEvent extends BaseEvent { + market: string; + maker: string; + maxXtReserve: ethers.BigNumber; + swapTrigger: string; + maxXtReserveFormatted?: string; +} + +type EventType = SwapEvent | UpdateOrderEvent | WithdrawAssetsEvent | OrderInitializedEvent; + +interface EventsCollection { + swaps: SwapEvent[]; + deposits: UpdateOrderEvent[]; + withdrawals: (UpdateOrderEvent | WithdrawAssetsEvent)[]; + updateCurves: UpdateOrderEvent[]; + creations: OrderInitializedEvent[]; + all: EventType[]; +} + +interface DisplayOptions { + limit?: number; + detailed?: boolean; +} + +/** + * Helper function to construct proper tuple type strings + * This is a critical function for correctly generating event signatures with complex tuple types + * @param input - ABI input parameter + * @returns Properly formatted type string + */ +function constructTupleType(input: any): string { + // Handle tuple type + if (input.type === 'tuple') { + // Process all components of the tuple + const componentsType = input.components.map((comp: any) => { + if (comp.type === 'tuple' || comp.type.endsWith('[]')) { + return constructTupleType(comp); + } + return comp.type; + }).join(','); + return `tuple(${componentsType})`; + } + // Handle array of tuples + else if (input.type.endsWith('[]')) { + const baseType = input.type.substring(0, input.type.length - 2); + if (baseType === 'tuple') { + const componentsType = input.components.map((comp: any) => { + if (comp.type === 'tuple' || comp.type.endsWith('[]')) { + return constructTupleType(comp); + } + return comp.type; + }).join(','); + return `tuple(${componentsType})[]`; + } + return input.type; + } + // Return simple type as is + return input.type; +} + +// Extract event signatures from ABI with additional debugging +function extractEventSignatures(abi: readonly any[]) { + const eventSignatures: Record = {}; + + // Filter to get just the events from the ABI + const events = abi.filter(item => item.type === 'event'); + + // Generate signature and hash for each event + events.forEach(event => { + try { + const paramTypes = event.inputs.map((input: any) => { + // For tuples, we need special handling to match the Solidity signature format + if (input.type === 'tuple' || input.type.endsWith('[]')) { + return constructTupleType(input); + } + return input.type; + }).join(','); + + const signature = `${event.name}(${paramTypes})`; + const hash = ethers.utils.id(signature); + eventSignatures[event.name] = hash; + } catch (error) { + console.error(`Error processing event ${event.name}: ${error instanceof Error ? error.message : String(error)}`); + } + }); + + return eventSignatures; +} + +// Extract event signatures from ABI +const eventTopics = extractEventSignatures(abiTermMaxOrder); + +// Using the imported abiTermMaxOrder instead of defining a separate orderABI + +// ABI for reading TermMaxMarket contract data +const marketABI = [ + "function tokens() external view returns (address, address, address, address, address)", + "function config() external view returns (tuple(address treasurer, uint64 maturity, tuple(uint64 borrowTakerFeeRatio, uint64 borrowMakerFeeRatio, uint64 lendTakerFeeRatio, uint64 lendMakerFeeRatio, uint64 mintGtFeeRatio, uint64 mintGtFeeRef) feeConfig))" +]; + +// ABI for basic ERC20 token information +const erc20ABI = [ + "function name() external view returns (string)", + "function symbol() external view returns (string)", + "function decimals() external view returns (uint8)" +]; + +/** + * Fetch token information + * @param tokenAddress - Address of the token + * @param provider - Ethers provider + * @returns Basic information about the token + */ +async function getTokenInfo(tokenAddress: string, provider: ethers.providers.Provider): Promise { + try { + const tokenContract = new ethers.Contract(tokenAddress, erc20ABI, provider); + + const [name, symbol, decimals] = await Promise.all([ + tokenContract.name().catch(() => 'Unknown'), + tokenContract.symbol().catch(() => 'Unknown'), + tokenContract.decimals().catch(() => 18) + ]); + + return { + address: tokenAddress, + name, + symbol, + decimals + }; + } catch (error) { + return { + address: tokenAddress, + name: 'Unknown', + symbol: 'Unknown', + decimals: 18, + error: error instanceof Error ? error.message : String(error) + }; + } +} + +/** + * Fetch market details from the contract + * @param marketAddress - Address of the TermMaxMarket contract + * @param provider - Ethers provider + * @returns Detailed information about the market + */ +async function getMarketInfo(marketAddress: string, provider: ethers.providers.Provider): Promise { + console.log(`Fetching market information for: ${marketAddress}`); + + const marketContract = new ethers.Contract(marketAddress, marketABI, provider); + + try { + // Get token addresses from the market + const [ft, xt, gt, collateral, debtToken] = await marketContract.tokens(); + console.log(`Found tokens: FT=${ft}, XT=${xt}, GT=${gt}, collateral=${collateral}, debtToken=${debtToken}`); + + // Get market configuration + let marketConfig: MarketConfig | null = null; + try { + const config = await marketContract.config(); + marketConfig = { + treasurer: config.treasurer, + maturity: config.maturity.toString(), + maturityDate: new Date(config.maturity.toNumber() * 1000).toISOString() + }; + console.log(`Market maturity: ${marketConfig.maturityDate}`); + console.log(`Market treasurer: ${marketConfig.treasurer}`); + } catch (error) { + console.log("Could not fetch market configuration details"); + } + + // Get token details + const [ftInfo, xtInfo, collateralInfo, debtTokenInfo] = await Promise.all([ + getTokenInfo(ft, provider), + getTokenInfo(xt, provider), + getTokenInfo(collateral, provider), + getTokenInfo(debtToken, provider) + ]); + + console.log(`FT Token: ${ftInfo.symbol} (${ftInfo.name})`); + console.log(`XT Token: ${xtInfo.symbol} (${xtInfo.name})`); + console.log(`Collateral: ${collateralInfo.symbol} (${collateralInfo.name})`); + console.log(`Debt Token: ${debtTokenInfo.symbol} (${debtTokenInfo.name})`); + + return { + address: marketAddress, + config: marketConfig, + tokens: { + ft: ftInfo, + xt: xtInfo, + gt: { + address: gt + }, + collateral: collateralInfo, + debtToken: debtTokenInfo + } + }; + } catch (error) { + console.error("Error fetching market information:", error instanceof Error ? error.message : String(error)); + return { + address: marketAddress, + config: null, + tokens: {} as MarketTokens, + error: error instanceof Error ? error.message : String(error) + }; + } +} + +/** + * Fetch order details from the contract + * @param orderAddress - Address of the TermMaxOrder contract + * @param provider - Ethers provider + * @returns Basic information about the order + */ +async function getOrderInfo(orderAddress: string, provider: ethers.providers.Provider): Promise { + console.log(`Fetching order information for: ${orderAddress}`); + + const orderContract = new ethers.Contract(orderAddress, abiTermMaxOrder, provider); + + try { + // Get market address + const marketAddress = await orderContract.market(); + console.log(`Market address: ${marketAddress}`); + + // Get market information + const marketInfo = await getMarketInfo(marketAddress, provider); + + // Get maker (owner) address + const makerAddress = await orderContract.maker(); + console.log(`Maker address: ${makerAddress}`); + + // Get token reserves + const [ftReserve, xtReserve] = await orderContract.tokenReserves(); + + // Format reserves based on token decimals + const ftDecimals = marketInfo.tokens?.ft?.decimals || 18; + const xtDecimals = marketInfo.tokens?.xt?.decimals || 18; + + console.log(`Current FT reserve: ${ethers.utils.formatUnits(ftReserve, ftDecimals)} ${marketInfo.tokens?.ft?.symbol || 'FT'}`); + console.log(`Current XT reserve: ${ethers.utils.formatUnits(xtReserve, xtDecimals)} ${marketInfo.tokens?.xt?.symbol || 'XT'}`); + + // Try to get order configuration (may fail if structure is different) + let orderConfig: OrderConfig | null = null; + try { + const config = await orderContract.orderConfig(); + orderConfig = { + maxXtReserve: config.maxXtReserve.toString(), + gtId: config.gtId.toString(), + swapTrigger: config.swapTrigger + }; + console.log(`Max XT reserve: ${ethers.utils.formatUnits(config.maxXtReserve, xtDecimals)} ${marketInfo.tokens?.xt?.symbol || 'XT'}`); + } catch (error) { + console.log("Could not fetch order configuration details"); + } + + return { + address: orderAddress, + marketAddress, + marketInfo, + makerAddress, + ftReserve: ftReserve.toString(), + xtReserve: xtReserve.toString(), + orderConfig + }; + } catch (error) { + console.error("Error fetching order information:", error instanceof Error ? error.message : String(error)); + return { + address: orderAddress, + marketAddress: '', + marketInfo: {} as MarketInfo, + makerAddress: '', + ftReserve: '0', + xtReserve: '0', + orderConfig: null, + error: error instanceof Error ? error.message : String(error) + }; + } +} + +/** + * Collect and categorize events from the specified order contract + * @param orderAddress - Address of the TermMaxOrder contract + * @param provider - Ethers provider + * @param startBlock - Starting block for event scanning + * @param endBlock - Ending block for event scanning + * @returns Categorized events + */ +async function collectOrderEvents( + orderAddress: string, + provider: ethers.providers.Provider, + startBlock: number, + endBlock?: number +): Promise { + // Create contract interface for parsing events + const iface = new ethers.utils.Interface(abiTermMaxOrder); + + // Events collection + const events: EventsCollection = { + swaps: [], + deposits: [], + withdrawals: [], + updateCurves: [], + creations: [], + all: [] + }; + + console.log(`Collecting events for order: ${orderAddress}`); + console.log(`Scanning blocks ${startBlock} to ${endBlock || 'latest'}...`); + + // Get current block if endBlock not specified + if (!endBlock) { + endBlock = await provider.getBlockNumber(); + console.log(`Using current block ${endBlock} as end block`); + } + + // Create contract instance for better event filtering + const orderContract = new ethers.Contract(orderAddress, abiTermMaxOrder, provider); + + try { + // Collect all relevant events using queryFilter which handles complex event types better + console.log(`Querying events from block ${startBlock} to ${endBlock}...`); + + // Define batch size to avoid too large requests + const BATCH_SIZE = 10000; + + // Arrays to hold all events + let swapExactEvents: ethers.Event[] = []; + let swapToExactEvents: ethers.Event[] = []; + let updateOrderEvents: ethers.Event[] = []; + let withdrawEvents: ethers.Event[] = []; + let initEvents: ethers.Event[] = []; + + // Process in batches + for (let fromBlock = startBlock; fromBlock <= endBlock; fromBlock += BATCH_SIZE) { + const toBlock = Math.min(fromBlock + BATCH_SIZE - 1, endBlock); + + console.log(`Querying events from block ${fromBlock} to ${toBlock}...`); + + // Collect events in this batch + const [ + batchSwapExactEvents, + batchSwapToExactEvents, + batchUpdateOrderEvents, + batchWithdrawEvents, + batchInitEvents + ] = await Promise.all([ + orderContract.queryFilter(orderContract.filters.SwapExactTokenToToken(), fromBlock, toBlock), + orderContract.queryFilter(orderContract.filters.SwapTokenToExactToken(), fromBlock, toBlock), + orderContract.queryFilter(orderContract.filters.UpdateOrder(), fromBlock, toBlock), + orderContract.queryFilter(orderContract.filters.WithdrawAssets(), fromBlock, toBlock), + orderContract.queryFilter(orderContract.filters.OrderInitialized(), fromBlock, toBlock) + ]); + + console.log(`Found in blocks ${fromBlock}-${toBlock}: ` + + `SwapExact=${batchSwapExactEvents.length}, ` + + `SwapToExact=${batchSwapToExactEvents.length}, ` + + `UpdateOrder=${batchUpdateOrderEvents.length}, ` + + `Withdraw=${batchWithdrawEvents.length}, ` + + `Init=${batchInitEvents.length}`); + + // Append batch results to the main arrays + swapExactEvents = swapExactEvents.concat(batchSwapExactEvents); + swapToExactEvents = swapToExactEvents.concat(batchSwapToExactEvents); + updateOrderEvents = updateOrderEvents.concat(batchUpdateOrderEvents); + withdrawEvents = withdrawEvents.concat(batchWithdrawEvents); + initEvents = initEvents.concat(batchInitEvents); + } + + // Log the total events found after batching + console.log(`Total events found: ` + + `SwapExact=${swapExactEvents.length}, ` + + `SwapToExact=${swapToExactEvents.length}, ` + + `UpdateOrder=${updateOrderEvents.length}, ` + + `Withdraw=${withdrawEvents.length}, ` + + `Init=${initEvents.length}`); + + // Process SwapExactTokenToToken events + for (const event of swapExactEvents) { + try { + // Use type assertion to handle the arguments + const args = event.args as any; + if (!args) { + console.error(`Missing arguments in SwapExactTokenToToken event`); + continue; + } + + const tokenIn = args.tokenIn; + const tokenOut = args.tokenOut; + const caller = args.caller || ''; + const recipient = args.recipient || ''; + const tokenAmtIn = args.tokenAmtIn; + const netTokenOut = args.netTokenOut; + const feeAmt = args.feeAmt; + + // Ensure we have the required values before proceeding + if (!tokenIn || !tokenOut) { + console.error(`Missing required parameters in SwapExactTokenToToken event`); + continue; + } + + const swapEvent: SwapEvent = { + blockNumber: event.blockNumber, + transactionHash: event.transactionHash, + logIndex: event.logIndex, + eventType: 'SwapExactTokenToToken', + operationType: 'Swap', + tokenIn, + tokenOut, + caller, + recipient, + tokenInAmount: tokenAmtIn ? ethers.BigNumber.from(tokenAmtIn) : ethers.BigNumber.from(0), + tokenOutAmount: netTokenOut ? ethers.BigNumber.from(netTokenOut) : ethers.BigNumber.from(0), + feeAmount: feeAmt ? ethers.BigNumber.from(feeAmt) : ethers.BigNumber.from(0), + timestamp: null // Will be populated later if needed + }; + + events.swaps.push(swapEvent); + events.all.push({ + ...swapEvent, + sortKey: `${event.blockNumber.toString().padStart(10, '0')}-${event.logIndex.toString().padStart(5, '0')}` + }); + } catch (error) { + console.error(`Error processing SwapExactTokenToToken event: ${error instanceof Error ? error.message : String(error)}`); + } + } + + // Process SwapTokenToExactToken events + for (const event of swapToExactEvents) { + try { + // Use type assertion to handle the arguments + const args = event.args as any; + if (!args) { + console.error(`Missing arguments in SwapTokenToExactToken event`); + continue; + } + + const tokenIn = args.tokenIn; + const tokenOut = args.tokenOut; + const caller = args.caller || ''; + const recipient = args.recipient || ''; + const tokenAmtOut = args.tokenAmtOut; + const netTokenIn = args.netTokenIn; + const feeAmt = args.feeAmt; + + // Ensure we have the required values before proceeding + if (!tokenIn || !tokenOut) { + console.error(`Missing required parameters in SwapTokenToExactToken event`); + continue; + } + + const swapEvent: SwapEvent = { + blockNumber: event.blockNumber, + transactionHash: event.transactionHash, + logIndex: event.logIndex, + eventType: 'SwapTokenToExactToken', + operationType: 'Swap', + tokenIn, + tokenOut, + caller, + recipient, + tokenInAmount: netTokenIn ? ethers.BigNumber.from(netTokenIn) : ethers.BigNumber.from(0), + tokenOutAmount: tokenAmtOut ? ethers.BigNumber.from(tokenAmtOut) : ethers.BigNumber.from(0), + feeAmount: feeAmt ? ethers.BigNumber.from(feeAmt) : ethers.BigNumber.from(0), + timestamp: null // Will be populated later if needed + }; + + events.swaps.push(swapEvent); + events.all.push({ + ...swapEvent, + sortKey: `${event.blockNumber.toString().padStart(10, '0')}-${event.logIndex.toString().padStart(5, '0')}` + }); + } catch (error) { + console.error(`Error processing SwapTokenToExactToken event: ${error instanceof Error ? error.message : String(error)}`); + } + } + + // Process UpdateOrder events + for (const event of updateOrderEvents) { + try { + // Use type assertion to handle the arguments + const args = event.args as any; + if (!args) { + console.error(`Missing arguments in UpdateOrder event`); + continue; + } + + const curveCuts = args.curveCuts; + const ftChangeAmt = args.ftChangeAmt; + const xtChangeAmt = args.xtChangeAmt; + const gtId = args.gtId; + const maxXtReserve = args.maxXtReserve; + const swapTrigger = args.swapTrigger || ''; + + // Ensure we have the required values before proceeding + if (ftChangeAmt === undefined || xtChangeAmt === undefined) { + console.error(`Missing required parameters in UpdateOrder event`); + continue; + } + + // Determine if this is a deposit, withdrawal, or just a curve update + let operationType: 'Deposit' | 'Withdraw' | 'UpdateCurve' = 'UpdateCurve'; + if (ethers.BigNumber.from(ftChangeAmt).gt(0) || ethers.BigNumber.from(xtChangeAmt).gt(0)) { + operationType = 'Deposit'; + } else if (ethers.BigNumber.from(ftChangeAmt).lt(0) || ethers.BigNumber.from(xtChangeAmt).lt(0)) { + operationType = 'Withdraw'; + } + + const updateEvent: UpdateOrderEvent = { + blockNumber: event.blockNumber, + transactionHash: event.transactionHash, + logIndex: event.logIndex, + eventType: 'UpdateOrder', + operationType, + ftChangeAmt: ethers.BigNumber.from(ftChangeAmt), + xtChangeAmt: ethers.BigNumber.from(xtChangeAmt), + gtId: gtId ? ethers.BigNumber.from(gtId) : ethers.BigNumber.from(0), + maxXtReserve: maxXtReserve ? ethers.BigNumber.from(maxXtReserve) : ethers.BigNumber.from(0), + swapTrigger, + timestamp: null, // Will be populated later if needed + }; + + events.updateCurves.push(updateEvent); + + // Add to the appropriate category + if (operationType === 'Deposit') { + events.deposits.push(updateEvent); + } else if (operationType === 'Withdraw') { + events.withdrawals.push(updateEvent); + } + + events.all.push({ + ...updateEvent, + sortKey: `${event.blockNumber.toString().padStart(10, '0')}-${event.logIndex.toString().padStart(5, '0')}` + }); + } catch (error) { + console.error(`Error processing UpdateOrder event: ${error instanceof Error ? error.message : String(error)}`); + } + } + + // Process WithdrawAssets events + for (const event of withdrawEvents) { + try { + // Use type assertion to handle the arguments + const args = event.args as any; + if (!args) { + console.error(`Missing arguments in WithdrawAssets event`); + continue; + } + + const token = args.token; + const owner = args.owner; + const caller = args.caller; + const recipient = args.recipient || ''; + const amount = args.amount; + + // Ensure we have the required values before proceeding + if (!token || !amount) { + console.error(`Missing required parameters in WithdrawAssets event`); + continue; + } + + const withdrawEvent: WithdrawAssetsEvent = { + blockNumber: event.blockNumber, + transactionHash: event.transactionHash, + logIndex: event.logIndex, + eventType: 'WithdrawAssets', + operationType: 'Withdraw', + token, + owner: owner || caller || '', + recipient, + amount: ethers.BigNumber.from(amount), + timestamp: null // Will be populated later if needed + }; + + events.withdrawals.push(withdrawEvent); + events.all.push({ + ...withdrawEvent, + sortKey: `${event.blockNumber.toString().padStart(10, '0')}-${event.logIndex.toString().padStart(5, '0')}` + }); + } catch (error) { + console.error(`Error processing WithdrawAssets event: ${error instanceof Error ? error.message : String(error)}`); + } + } + + // Process OrderInitialized events + for (const event of initEvents) { + try { + // Use type assertion to handle the arguments + const args = event.args as any; + if (!args) { + console.error(`Missing arguments in OrderInitialized event`); + continue; + } + + const market = args.market; + const maker = args.maker; + const maxXtReserve = args.maxXtReserve; + const swapTrigger = args.swapTrigger || ''; + const curveCuts = args.curveCuts; + + // Ensure we have the required values before proceeding + if (!market || !maker) { + console.error(`Missing required parameters in OrderInitialized event`); + continue; + } + + const initEvent: OrderInitializedEvent = { + blockNumber: event.blockNumber, + transactionHash: event.transactionHash, + logIndex: event.logIndex, + eventType: 'OrderInitialized', + operationType: 'Create', // New operation type for order creation + market, + maker, + maxXtReserve: maxXtReserve ? ethers.BigNumber.from(maxXtReserve) : ethers.BigNumber.from(0), + swapTrigger, + timestamp: null // Will be populated later if needed + }; + + events.creations.push(initEvent); + events.all.push({ + ...initEvent, + sortKey: `${event.blockNumber.toString().padStart(10, '0')}-${event.logIndex.toString().padStart(5, '0')}` + }); + } catch (error) { + console.error(`Error processing OrderInitialized event: ${error instanceof Error ? error.message : String(error)}`); + } + } + } catch (error) { + console.error(`Error collecting events: ${error instanceof Error ? error.message : String(error)}`); + } + + console.log(`Collected events: ${events.all.length} total`); + console.log(`- Swaps: ${events.swaps.length}`); + console.log(`- Deposits: ${events.deposits.length}`); + console.log(`- Withdrawals: ${events.withdrawals.length}`); + console.log(`- Update Curves: ${events.updateCurves.length}`); + console.log(`- Creations: ${events.creations.length}`); + + return events; +} + +/** + * Format BigNumber to human-readable string with proper decimals + * @param amount - Amount to format + * @param decimals - Number of decimals + * @returns Formatted string + */ +function formatAmount(amount: ethers.BigNumber | string | undefined, decimals: number = 18): string { + if (!amount || typeof amount === 'string') { + return amount?.toString() || '0'; + } + + try { + return ethers.utils.formatUnits(amount, decimals); + } catch (error) { + console.error(`Error formatting amount: ${error instanceof Error ? error.message : String(error)}`); + return '0'; + } +} + +/** + * Enrich events with additional data like timestamps and token details + * @param events - Object containing categorized events + * @param orderInfo - Information about the order and tokens + * @param provider - Ethers provider + * @returns - Enriched events + */ +async function enrichEvents( + events: EventsCollection, + orderInfo: OrderInfo, + provider: ethers.providers.Provider +): Promise { + console.log(`Enriching ${events.all.length} events with additional data...`); + + // Group events by block number to minimize RPC calls + const blockNumbers = [...new Set(events.all.map(event => event.blockNumber))]; + + // Get block data in batches + const blockData: Record = {}; + const BATCH_SIZE = 50; + + for (let i = 0; i < blockNumbers.length; i += BATCH_SIZE) { + const batch = blockNumbers.slice(i, i + BATCH_SIZE); + console.log(`Fetching timestamps for blocks ${i} to ${i + batch.length - 1} of ${blockNumbers.length}...`); + + const promises = batch.map(blockNum => provider.getBlock(blockNum)); + const blocks = await Promise.all(promises); + + blocks.forEach(block => { + if (block) { + blockData[block.number] = { + timestamp: block.timestamp + }; + } + }); + } + + // Token info for better display + const tokens = orderInfo?.marketInfo?.tokens || {}; + const tokenDecimals: Record = {}; + const tokenSymbols: Record = {}; + + if (tokens.ft) { + tokenDecimals[tokens.ft.address.toLowerCase()] = tokens.ft.decimals; + tokenSymbols[tokens.ft.address.toLowerCase()] = tokens.ft.symbol; + } + + if (tokens.xt) { + tokenDecimals[tokens.xt.address.toLowerCase()] = tokens.xt.decimals; + tokenSymbols[tokens.xt.address.toLowerCase()] = tokens.xt.symbol; + } + + if (tokens.debtToken) { + tokenDecimals[tokens.debtToken.address.toLowerCase()] = tokens.debtToken.decimals; + tokenSymbols[tokens.debtToken.address.toLowerCase()] = tokens.debtToken.symbol; + } + + if (tokens.collateral) { + tokenDecimals[tokens.collateral.address.toLowerCase()] = tokens.collateral.decimals; + tokenSymbols[tokens.collateral.address.toLowerCase()] = tokens.collateral.symbol; + } + + const debtTokenDecimals = tokens.debtToken?.decimals || 18; + const ftDecimals = tokens.ft?.decimals || 18; + const xtDecimals = tokens.xt?.decimals || 18; + + // Enrich swap events + events.swaps = events.swaps.map(event => { + // Add timestamp + if (blockData[event.blockNumber]) { + event.timestamp = blockData[event.blockNumber].timestamp; + event.date = new Date(event.timestamp * 1000).toISOString(); + } + + // Add token details + const tokenInLower = event.tokenIn?.toLowerCase(); + const tokenOutLower = event.tokenOut?.toLowerCase(); + + event.tokenInSymbol = tokenSymbols[tokenInLower] || 'Unknown'; + event.tokenOutSymbol = tokenSymbols[tokenOutLower] || 'Unknown'; + + const tokenInDecimals = tokenDecimals[tokenInLower] || 18; + const tokenOutDecimals = tokenDecimals[tokenOutLower] || 18; + + // Add formatted amounts with proper decimals + event.tokenInAmountFormatted = formatAmount(event.tokenInAmount, tokenInDecimals); + event.tokenOutAmountFormatted = formatAmount(event.tokenOutAmount, tokenOutDecimals); + event.feeAmountFormatted = formatAmount(event.feeAmount, debtTokenDecimals); + + // Determine transaction direction (Lend/Borrow/Other) + const ftTokenAddress = tokens.ft?.address?.toLowerCase(); + const xtTokenAddress = tokens.xt?.address?.toLowerCase(); + const debtTokenAddress = tokens.debtToken?.address?.toLowerCase(); + + // Calculate days to maturity for interest rates + if (event.timestamp && orderInfo.marketInfo.config?.maturity) { + event.daysToMaturity = Math.floor((parseInt(orderInfo.marketInfo.config.maturity) - event.timestamp) / 86400); + } + + if (tokenInLower === ftTokenAddress && tokenOutLower === debtTokenAddress) { + event.direction = 'LEND'; + event.abstractTokenInSymbol = tokens.ft.symbol; + event.abstractTokenOutSymbol = tokens.xt.symbol; + + event.abstractTokenInAmountFormatted = formatAmount( + ethers.BigNumber.from(event.tokenInAmount).sub(event.tokenOutAmount), + debtTokenDecimals + ); + event.abstractTokenOutAmountFormatted = event.tokenOutAmountFormatted; + + if (event.daysToMaturity && event.daysToMaturity > 0) { + const abstractIn = parseFloat(event.abstractTokenInAmountFormatted); + const abstractOut = parseFloat(event.abstractTokenOutAmountFormatted); + event.avgMatchedInterestRate = (abstractIn / abstractOut) * (365 / event.daysToMaturity); + } + } else if (tokenInLower === debtTokenAddress && tokenOutLower === xtTokenAddress) { + event.direction = 'LEND'; + event.abstractTokenInSymbol = tokens.ft.symbol; + event.abstractTokenOutSymbol = tokens.xt.symbol; + + event.abstractTokenInAmountFormatted = event.tokenInAmountFormatted; + event.abstractTokenOutAmountFormatted = formatAmount( + ethers.BigNumber.from(event.tokenOutAmount).sub(event.tokenInAmount), + debtTokenDecimals + ); + + if (event.daysToMaturity && event.daysToMaturity > 0) { + const abstractIn = parseFloat(event.abstractTokenInAmountFormatted); + const abstractOut = parseFloat(event.abstractTokenOutAmountFormatted); + event.avgMatchedInterestRate = (abstractIn / abstractOut) * (365 / event.daysToMaturity); + } + } else if (tokenInLower === xtTokenAddress && tokenOutLower === debtTokenAddress) { + event.direction = 'BORROW'; + event.abstractTokenInSymbol = tokens.xt.symbol; + event.abstractTokenOutSymbol = tokens.ft.symbol; + + event.abstractTokenInAmountFormatted = formatAmount( + ethers.BigNumber.from(event.tokenInAmount).sub(event.tokenOutAmount), + debtTokenDecimals + ); + event.abstractTokenOutAmountFormatted = event.tokenOutAmountFormatted; + + if (event.daysToMaturity && event.daysToMaturity > 0) { + const abstractIn = parseFloat(event.abstractTokenInAmountFormatted); + const abstractOut = parseFloat(event.abstractTokenOutAmountFormatted); + event.avgMatchedInterestRate = (abstractOut / abstractIn) * (365 / event.daysToMaturity); + } + } else if (tokenInLower === debtTokenAddress && tokenOutLower === ftTokenAddress) { + event.direction = 'BORROW'; + event.abstractTokenInSymbol = tokens.xt.symbol; + event.abstractTokenOutSymbol = tokens.ft.symbol; + + event.abstractTokenInAmountFormatted = event.tokenInAmountFormatted; + event.abstractTokenOutAmountFormatted = formatAmount( + ethers.BigNumber.from(event.tokenOutAmount).sub(event.tokenInAmount), + debtTokenDecimals + ); + + if (event.daysToMaturity && event.daysToMaturity > 0) { + const abstractIn = parseFloat(event.abstractTokenInAmountFormatted); + const abstractOut = parseFloat(event.abstractTokenOutAmountFormatted); + event.avgMatchedInterestRate = (abstractOut / abstractIn) * (365 / event.daysToMaturity); + } + } else { + event.direction = 'OTHER'; + } + + return event; + }); + + // Enrich deposit, withdrawal and update events + const updateEnrichment = (event: UpdateOrderEvent | WithdrawAssetsEvent): UpdateOrderEvent | WithdrawAssetsEvent => { + // Add timestamp + if (blockData[event.blockNumber]) { + event.timestamp = blockData[event.blockNumber].timestamp; + event.date = new Date(event.timestamp * 1000).toISOString(); + } + + // For UpdateOrder events, add formatted amounts + if (event.eventType === 'UpdateOrder' && 'ftChangeAmt' in event) { + event.ftChangeAmtFormatted = formatAmount(event.ftChangeAmt, ftDecimals); + event.xtChangeAmtFormatted = formatAmount(event.xtChangeAmt, xtDecimals); + event.maxXtReserveFormatted = formatAmount(event.maxXtReserve, xtDecimals); + } + + // For WithdrawAssets events, add token details + if (event.eventType === 'WithdrawAssets' && 'token' in event) { + const tokenLower = event.token?.toLowerCase(); + event.tokenSymbol = tokenSymbols[tokenLower] || 'Unknown'; + const tokenDecimal = tokenDecimals[tokenLower] || 18; + event.amountFormatted = formatAmount(event.amount, tokenDecimal); + } + + return event; + }; + + events.deposits = events.deposits.map(updateEnrichment) as UpdateOrderEvent[]; + events.withdrawals = events.withdrawals.map(updateEnrichment) as (UpdateOrderEvent | WithdrawAssetsEvent)[]; + events.updateCurves = events.updateCurves.map(updateEnrichment) as UpdateOrderEvent[]; + + // Enrich creation events + events.creations = events.creations.map(event => { + // Add timestamp + if (blockData[event.blockNumber]) { + event.timestamp = blockData[event.blockNumber].timestamp; + event.date = new Date(event.timestamp * 1000).toISOString(); + } + + // Format maxXtReserve with proper decimals + event.maxXtReserveFormatted = formatAmount(event.maxXtReserve, xtDecimals); + + return event; + }); + + // Enrich all events and sort them + events.all = events.all.map(event => { + if (event.eventType === 'SwapExactTokenToToken' || event.eventType === 'SwapTokenToExactToken') { + const matchingSwap = events.swaps.find( + swap => swap.transactionHash === event.transactionHash && swap.logIndex === event.logIndex + ); + return matchingSwap || event; + } else if (event.eventType === 'UpdateOrder') { + const matchingUpdate = [...events.deposits, ...events.withdrawals, ...events.updateCurves].find( + update => update.transactionHash === event.transactionHash && update.logIndex === event.logIndex + ) as UpdateOrderEvent; + return matchingUpdate || event; + } else if (event.eventType === 'WithdrawAssets') { + const matchingWithdraw = events.withdrawals.find( + withdraw => withdraw.transactionHash === event.transactionHash && withdraw.logIndex === event.logIndex + ) as WithdrawAssetsEvent; + return matchingWithdraw || event; + } else if (event.eventType === 'OrderInitialized') { + const matchingInit = events.creations.find( + creation => creation.transactionHash === event.transactionHash && creation.logIndex === event.logIndex + ) as OrderInitializedEvent; + return matchingInit || event; + } + return event; + }); + + // Sort all events by block number (descending) and log index (ascending) + events.all.sort((a, b) => { + if (a.blockNumber !== b.blockNumber) { + return b.blockNumber - a.blockNumber; // Newer blocks first + } + return a.logIndex - b.logIndex; // Earlier logs first within the same block + }); + + return events; +} + +/** + * Print event history in a readable format + * @param events - Object with categorized events + * @param options - Display options + */ +function printEventHistory(events: EventsCollection, options: DisplayOptions = {}): void { + const { limit = 20, detailed = false } = options; + + if (events.all.length === 0) { + console.log("No events found"); + return; + } + + const displayEvents = events.all.slice(0, limit); + + console.log(`\n--- Order History (showing ${displayEvents.length} of ${events.all.length} events) ---`); + console.log("Date | Block | Type | Operation | Details"); + console.log("-----------+---------+------------+-----------+------------------------------------"); + + for (const event of displayEvents) { + let dateStr = event.date ? event.date.substring(0, 10) : 'Unknown'; + let typeStr = (event.eventType || 'Unknown').padEnd(12); + let operationStr = (event.operationType || 'Unknown').padEnd(11); + let detailsStr = ''; + + switch (event.operationType) { + case 'Swap': { + const swapEvent = event as SwapEvent; + const direction = swapEvent.direction || ''; + detailsStr = `${direction}: ${swapEvent.abstractTokenInAmountFormatted} ${swapEvent.abstractTokenInSymbol} → ${swapEvent.abstractTokenOutAmountFormatted} ${swapEvent.abstractTokenOutSymbol}`; + break; + } + case 'Deposit': { + const depositEvent = event as UpdateOrderEvent; + let depositDetails: string[] = []; + if (depositEvent.ftChangeAmt && depositEvent.ftChangeAmt.gt(0)) { + depositDetails.push(`${depositEvent.ftChangeAmtFormatted} FT`); + } + if (depositEvent.xtChangeAmt && depositEvent.xtChangeAmt.gt(0)) { + depositDetails.push(`${depositEvent.xtChangeAmtFormatted} XT`); + } + detailsStr = `Add: ${depositDetails.join(' and ')}`; + break; + } + case 'Withdraw': { + if (event.eventType === 'WithdrawAssets') { + const withdrawEvent = event as WithdrawAssetsEvent; + detailsStr = `Remove: ${withdrawEvent.amountFormatted} ${withdrawEvent.tokenSymbol}`; + } else { + const withdrawEvent = event as UpdateOrderEvent; + let withdrawDetails: string[] = []; + if (withdrawEvent.ftChangeAmt && withdrawEvent.ftChangeAmt.lt(0)) { + withdrawDetails.push(`${withdrawEvent.ftChangeAmtFormatted?.replace('-', '')} FT`); + } + if (withdrawEvent.xtChangeAmt && withdrawEvent.xtChangeAmt.lt(0)) { + withdrawDetails.push(`${withdrawEvent.xtChangeAmtFormatted?.replace('-', '')} XT`); + } + detailsStr = `Remove: ${withdrawDetails.join(' and ')}`; + } + break; + } + case 'UpdateCurve': { + const updateEvent = event as UpdateOrderEvent; + detailsStr = `Max XT Reserve: ${updateEvent.maxXtReserveFormatted}`; + break; + } + case 'Create': { + const createEvent = event as OrderInitializedEvent; + detailsStr = `Order Created, Max XT Reserve: ${createEvent.maxXtReserveFormatted}, Maker: ${createEvent.maker.substring(0, 10)}...`; + break; + } + default: + detailsStr = event.eventType; + } + + console.log( + `${dateStr} | ${event.blockNumber} | ${typeStr} | ${operationStr} | ${detailsStr}` + ); + } + + // Show detailed view if requested + if (detailed && displayEvents.length > 0) { + console.log("\n--- Detailed Event View ---"); + + for (let i = 0; i < Math.min(5, displayEvents.length); i++) { + const event = displayEvents[i]; + console.log(`\nEvent #${i + 1}:`); + console.log(`Hash: ${event.transactionHash}`); + console.log(`Block: ${event.blockNumber} | Log Index: ${event.logIndex}`); + console.log(`Type: ${event.eventType}`); + console.log(`Operation: ${event.operationType}`); + console.log(`Date: ${event.date || 'Unknown'}`); + + switch (event.operationType) { + case 'Swap': { + const swapEvent = event as SwapEvent; + console.log(`Direction: ${swapEvent.direction}`); + console.log(`Token In: ${swapEvent.tokenInAmountFormatted} ${swapEvent.tokenInSymbol} (${swapEvent.tokenIn})`); + console.log(`Token Out: ${swapEvent.tokenOutAmountFormatted} ${swapEvent.tokenOutSymbol} (${swapEvent.tokenOut})`); + console.log(`Fee: ${swapEvent.feeAmountFormatted}`); + console.log(`Caller: ${swapEvent.caller}`); + console.log(`Recipient: ${swapEvent.recipient}`); + break; + } + case 'Deposit': + case 'Withdraw': + case 'UpdateCurve': { + if (event.eventType === 'UpdateOrder') { + const updateEvent = event as UpdateOrderEvent; + console.log(`FT Change: ${updateEvent.ftChangeAmtFormatted}`); + console.log(`XT Change: ${updateEvent.xtChangeAmtFormatted}`); + console.log(`Max XT Reserve: ${updateEvent.maxXtReserveFormatted}`); + console.log(`GT ID: ${updateEvent.gtId.toString()}`); + console.log(`Swap Trigger: ${updateEvent.swapTrigger}`); + } else if (event.eventType === 'WithdrawAssets') { + const withdrawEvent = event as WithdrawAssetsEvent; + console.log(`Token: ${withdrawEvent.tokenSymbol} (${withdrawEvent.token})`); + console.log(`Amount: ${withdrawEvent.amountFormatted}`); + console.log(`Owner: ${withdrawEvent.owner}`); + console.log(`Recipient: ${withdrawEvent.recipient}`); + } + break; + } + case 'Create': { + const createEvent = event as OrderInitializedEvent; + console.log(`Market: ${createEvent.market}`); + console.log(`Maker: ${createEvent.maker}`); + console.log(`Max XT Reserve: ${createEvent.maxXtReserveFormatted}`); + console.log(`Swap Trigger: ${createEvent.swapTrigger}`); + break; + } + } + } + } + + if (events.all.length > limit) { + console.log(`\n... and ${events.all.length - limit} more events`); + } +} + +/** + * Generate a CSV file with order history + * @param events - Object with categorized events + * @param filename - Output filename for the CSV + */ +function generateCsvFile(events: EventsCollection, filename: string): void { + // Define CSV header + const header = 'Date,Block,Operation,Direction,Amount,InterestRate\n'; + + // Initialize CSV content with header + let csvContent = header; + + // Sort events by block number (ascending) to show chronological order in the CSV + const sortedEvents = [...events.all].sort((a, b) => a.blockNumber - b.blockNumber); + + for (const event of sortedEvents) { + // Only include events with a date (those we've enriched with timestamps) + if (event.date) { + let date = event.date.substring(0, 10); + let blockNumber = event.blockNumber; + let operation = event.operationType || 'Unknown'; + let direction = (event as SwapEvent).direction || 'N/A'; + let amount: string | number = 0; + let interestRate = (event as SwapEvent).avgMatchedInterestRate || ''; + + // Determine amount based on direction + if (direction === 'LEND') { + const swapEvent = event as SwapEvent; + amount = swapEvent.abstractTokenOutAmountFormatted || '0'; + } else if (direction === 'BORROW') { + const swapEvent = event as SwapEvent; + amount = swapEvent.abstractTokenInAmountFormatted || '0'; + } else if (operation === 'Deposit' && (event as UpdateOrderEvent).ftChangeAmtFormatted) { + const depositEvent = event as UpdateOrderEvent; + direction = 'DEPOSIT'; + amount = depositEvent.ftChangeAmtFormatted?.replace('-', '') || '0'; + } else if (operation === 'Withdraw' && (event as UpdateOrderEvent).ftChangeAmtFormatted) { + const withdrawEvent = event as UpdateOrderEvent; + direction = 'WITHDRAW'; + amount = withdrawEvent.ftChangeAmtFormatted?.replace('-', '') || '0'; + } else if (operation === 'Create') { + const createEvent = event as OrderInitializedEvent; + direction = 'CREATE'; + amount = createEvent.maxXtReserveFormatted || '0'; + } + + // Skip rows that don't have meaningful amounts + if (amount) { + // Escape any commas in the values + csvContent += `${date},${blockNumber},${operation},${direction},${amount},${interestRate}\n`; + } + } + } + + // Write to file + fs.writeFileSync(filename, csvContent); + console.log(`\nCSV order history exported to ${filename}`); +} + +/** + * Helper function to convert BigNumber values to strings for JSON serialization + * @param event - Event object to process + * @returns Processed event with BigNumber values converted to strings + */ +function processEventForJson(event: EventType): Record { + const result: Record = { ...event }; + + // Convert known BigNumber fields to strings + const bigNumberFields = [ + 'tokenInAmount', 'tokenOutAmount', 'feeAmount', 'amount', + 'ftChangeAmt', 'xtChangeAmt', 'maxXtReserve', 'gtId' + ]; + + for (const field of bigNumberFields) { + if (result[field] && typeof result[field] !== 'string' && result[field].toString) { + result[field] = result[field].toString(); + } + } + + // Delete sort key as it's not needed in JSON output + delete result.sortKey; + + return result; +} + +/** + * Process token objects for JSON serialization + * @param tokens - Token objects to process + * @returns Processed tokens + */ +function processMappedTokens(tokens?: MarketTokens): Record { + if (!tokens) return {}; + + const result: Record = {}; + for (const key in tokens) { + if (Object.prototype.hasOwnProperty.call(tokens, key)) { + result[key] = { ...(tokens as any)[key] }; + } + } + + return result; +} + +interface CommandOptions { + startBlock?: number; + endBlock?: number; + includeTimestamps?: boolean; + showDetails?: boolean; + limit?: number; + outputFile?: string; + csvFile?: string; +} + +async function main(): Promise { + // Get command line arguments + const args = process.argv.slice(2); + + if (args.length < 2) { + console.error("Usage: node order-history-tracker.js [options]"); + console.error("Options:"); + console.error(" --start-block Starting block number (default: 0)"); + console.error(" --end-block Ending block number (default: current)"); + console.error(" --include-timestamps Include timestamps in output"); + console.error(" --show-details Show detailed information for events"); + console.error(" --limit Maximum number of events to display (default: 20)"); + console.error(" --output-file Save results to JSON file (default: order-history.json)"); + console.error(" --csv-file Export order history to CSV file"); + process.exit(1); + } + + const orderAddress = args[0]; + const rpcUrl = args[1]; + + // Parse options from remaining arguments + const options: CommandOptions = {}; + for (let i = 2; i < args.length; i++) { + if (args[i] === '--start-block' && i + 1 < args.length) { + options.startBlock = parseInt(args[i + 1]); + i++; // Skip the next argument + } else if (args[i] === '--end-block' && i + 1 < args.length) { + options.endBlock = parseInt(args[i + 1]); + i++; // Skip the next argument + } else if (args[i] === '--include-timestamps') { + options.includeTimestamps = true; + } else if (args[i] === '--show-details') { + options.showDetails = true; + } else if (args[i] === '--limit' && i + 1 < args.length) { + options.limit = parseInt(args[i + 1]); + i++; // Skip the next argument + } else if (args[i] === '--output-file' && i + 1 < args.length) { + options.outputFile = args[i + 1]; + i++; // Skip the next argument + } else if (args[i] === '--output-file') { + options.outputFile = 'order-history.json'; // Default filename if none provided + } else if (args[i] === '--csv-file' && i + 1 < args.length) { + options.csvFile = args[i + 1]; + i++; // Skip the next argument + } else if (args[i] === '--csv-file') { + options.csvFile = 'order-history.csv'; // Default filename if none provided + } + } + + try { + // Get an ethers provider + const provider = new ethers.providers.JsonRpcProvider(rpcUrl); + + // Step 0: Get order information + const orderInfo = await getOrderInfo(orderAddress, provider); + + // Step 1: Collect events + let events = await collectOrderEvents( + orderAddress, + provider, + options.startBlock || 0, + options.endBlock + ); + + // Step 2: Optionally enrich events with additional data + if (options.includeTimestamps || true) { // Always enrich for better display + events = await enrichEvents(events, orderInfo, provider); + } + + // Step 3: Print event history + printEventHistory(events, { + limit: options.limit || 20, + detailed: options.showDetails || false + }); + + // Step 4: Save to JSON file if outputFile option is specified + if (options.outputFile) { + // Convert BigNumber to string for JSON serialization + const jsonEvents = { + swaps: events.swaps.map(processEventForJson), + deposits: events.deposits.map(processEventForJson), + withdrawals: events.withdrawals.map(processEventForJson), + updateCurves: events.updateCurves.map(processEventForJson), + creations: events.creations.map(processEventForJson), + all: events.all.map(processEventForJson), + orderInfo: { + ...orderInfo, + ftReserve: orderInfo.ftReserve, + xtReserve: orderInfo.xtReserve, + marketInfo: { + ...orderInfo.marketInfo, + tokens: processMappedTokens(orderInfo.marketInfo?.tokens) + } + } + }; + + fs.writeFileSync(options.outputFile, JSON.stringify(jsonEvents, null, 2)); + console.log(`\nResults saved to ${options.outputFile}`); + } + + // Step 5: Generate CSV file if requested + if (options.csvFile) { + generateCsvFile(events, options.csvFile); + } + + // Print summary stats + console.log("\n--- Order Summary ---"); + console.log(`Total Events: ${events.all.length}`); + console.log(`- Swaps: ${events.swaps.length}`); + console.log(`- Deposits: ${events.deposits.length}`); + console.log(`- Withdrawals: ${events.withdrawals.length}`); + console.log(`- Curve Updates: ${events.updateCurves.length}`); + console.log(`- Creations: ${events.creations.length}`); + + const marketInfo = orderInfo.marketInfo; + const tokens = marketInfo?.tokens || {}; + + if (marketInfo && tokens) { + const ftDecimals = tokens.ft?.decimals || 18; + const xtDecimals = tokens.xt?.decimals || 18; + + console.log("\n--- Current Reserves ---"); + console.log(`FT Reserve: ${formatAmount(ethers.BigNumber.from(orderInfo.ftReserve), ftDecimals)} ${tokens.ft?.symbol || 'FT'}`); + console.log(`XT Reserve: ${formatAmount(ethers.BigNumber.from(orderInfo.xtReserve), xtDecimals)} ${tokens.xt?.symbol || 'XT'}`); + + if (marketInfo.config) { + console.log(`\nMarket Maturity: ${marketInfo.config.maturityDate}`); + } + } + + } catch (error) { + console.error("Error tracking order history:", error instanceof Error ? error.message : String(error)); + process.exit(1); + } +} + +// Export functions for potential use in other scripts +export { + getTokenInfo, + getMarketInfo, + getOrderInfo, + collectOrderEvents, + enrichEvents, + formatAmount, + printEventHistory +}; + +// Run if this script is executed directly +if (require.main === module) { + main(); +} \ No newline at end of file diff --git a/script/transformAbi.ts b/script/transformAbi.ts index a71c64a..309c813 100644 --- a/script/transformAbi.ts +++ b/script/transformAbi.ts @@ -10,6 +10,9 @@ const contractFiles = [ './out/TermMaxMarket.sol/TermMaxMarket.json', './out/TermMaxOrder.sol/TermMaxOrder.json', './out/TermMaxVault.sol/TermMaxVault.json', + './out/VaultFactory.sol/VaultFactory.json', + './out/OracleAggregator.sol/OracleAggregator.json', + './out/TermMaxFactory.sol/TermMaxFactory.json', ]; const transformAbi = (filePath: string) => { diff --git a/script/utils/JsonLoader.sol b/script/utils/JsonLoader.sol index aa78706..24c165d 100644 --- a/script/utils/JsonLoader.sol +++ b/script/utils/JsonLoader.sol @@ -11,28 +11,24 @@ library JsonLoader { struct UnderlyingConfig { address tokenAddr; address priceFeedAddr; + address backupPriceFeedAddr; + uint256 heartBeat; string name; string symbol; uint8 decimals; - uint256 mintAmt; int256 initialPrice; - int256 maxPrice; - uint256 heartBeat; - uint256 backupHeartBeat; } struct CollateralConfig { address tokenAddr; address priceFeedAddr; + address backupPriceFeedAddr; + uint256 heartBeat; string name; string symbol; uint8 decimals; - uint256 mintAmt; int256 initialPrice; string gtKeyIdentifier; - int256 maxPrice; - uint256 heartBeat; - uint256 backupHeartBeat; } struct Config { @@ -105,14 +101,14 @@ library JsonLoader { string memory underlyingConfigPrefix = string.concat(configPrefix, ".underlyingConfig"); underlyingConfig.tokenAddr = jsonData.readAddress(string.concat(underlyingConfigPrefix, ".tokenAddr")); underlyingConfig.priceFeedAddr = jsonData.readAddress(string.concat(underlyingConfigPrefix, ".priceFeedAddr")); + underlyingConfig.backupPriceFeedAddr = + jsonData.readAddress(string.concat(underlyingConfigPrefix, ".backupPriceFeedAddr")); underlyingConfig.name = jsonData.readString(string.concat(underlyingConfigPrefix, ".name")); underlyingConfig.symbol = jsonData.readString(string.concat(underlyingConfigPrefix, ".symbol")); underlyingConfig.decimals = uint8(vm.parseUint(jsonData.readString(string.concat(underlyingConfigPrefix, ".decimals")))); underlyingConfig.initialPrice = vm.parseInt(jsonData.readString(string.concat(underlyingConfigPrefix, ".initialPrice"))); - underlyingConfig.maxPrice = vm.parseInt(jsonData.readString(string.concat(underlyingConfigPrefix, ".maxPrice"))); - underlyingConfig.heartBeat = uint256(vm.parseUint(jsonData.readString(string.concat(underlyingConfigPrefix, ".heartBeat")))); @@ -120,6 +116,8 @@ library JsonLoader { string memory collateralConfigPrefix = string.concat(configPrefix, ".collateralConfig"); collateralConfig.tokenAddr = jsonData.readAddress(string.concat(collateralConfigPrefix, ".tokenAddr")); collateralConfig.priceFeedAddr = jsonData.readAddress(string.concat(collateralConfigPrefix, ".priceFeedAddr")); + collateralConfig.backupPriceFeedAddr = + jsonData.readAddress(string.concat(collateralConfigPrefix, ".backupPriceFeedAddr")); collateralConfig.name = jsonData.readString(string.concat(collateralConfigPrefix, ".name")); collateralConfig.symbol = jsonData.readString(string.concat(collateralConfigPrefix, ".symbol")); collateralConfig.decimals = @@ -128,11 +126,8 @@ library JsonLoader { vm.parseInt(jsonData.readString(string.concat(collateralConfigPrefix, ".initialPrice"))); collateralConfig.gtKeyIdentifier = jsonData.readString(string.concat(collateralConfigPrefix, ".gtKeyIdentifier")); - collateralConfig.maxPrice = vm.parseInt(jsonData.readString(string.concat(collateralConfigPrefix, ".maxPrice"))); collateralConfig.heartBeat = uint256(vm.parseUint(jsonData.readString(string.concat(collateralConfigPrefix, ".heartBeat")))); - collateralConfig.backupHeartBeat = - uint256(vm.parseUint(jsonData.readString(string.concat(collateralConfigPrefix, ".backupHeartBeat")))); config.salt = salt; config.collateralCapForGt = collateralCapForGt; diff --git a/script/utils/types.ts b/script/utils/types.ts index 4ed5747..330885f 100644 --- a/script/utils/types.ts +++ b/script/utils/types.ts @@ -17,6 +17,7 @@ export interface LoanConfig { export interface TokenConfig { tokenAddr: string; priceFeedAddr: string; + backupPriceFeedAddr: string; heartBeat: string; name: string; symbol: string; From 01e57ee12416cda23d587e7bc2c988b2e0d793a1 Mon Sep 17 00:00:00 2001 From: "Aaron C.-W. Liang" Date: Mon, 26 May 2025 16:52:35 +0800 Subject: [PATCH 035/194] update script --- SCRIPT_USAGE.md | 223 ++++++++++++++++++++++++++++- script/AcceptOracles.s.sol | 44 +++++- script/GrantRoles.s.sol | 52 ++++++- script/SubmitOracles.s.sol | 48 ++++++- script/deploy/DeployBase.s.sol | 21 ++- script/deploy/DeployPreTMX.s.sol | 4 +- script/deploy/DeployPriceFeeds.sol | 9 +- script/utils/ScriptBase.sol | 107 ++++++++++++++ 8 files changed, 488 insertions(+), 20 deletions(-) create mode 100644 script/utils/ScriptBase.sol diff --git a/SCRIPT_USAGE.md b/SCRIPT_USAGE.md index 500f3e6..f62f00b 100644 --- a/SCRIPT_USAGE.md +++ b/SCRIPT_USAGE.md @@ -215,4 +215,225 @@ The oracle update process consists of two steps: 2. **Accept Oracles**: After the timelock period, use the `AcceptOracles` script to accept the pending oracles. ```bash ./script.sh script:AcceptOracles --broadcast - ``` \ No newline at end of file + ``` + +## Date Suffix System for Script JSON Output + +The script system automatically appends date suffixes to JSON output files to create unique, timestamped records for each execution. + +### Overview + +The system automatically appends date suffixes to JSON output files to: +- Create unique records for each script execution +- Prevent overwriting previous execution results +- Enable historical tracking of deployments and contract interactions +- Facilitate auditing and debugging + +### Date Format + +The date suffix uses the format: `DDMMMYYYY` (e.g., `15JAN2024`) +- `DD`: Two-digit day (01-31) +- `MMM`: Three-letter month abbreviation (JAN, FEB, MAR, etc.) +- `YYYY`: Four-digit year + +### File Structure + +#### Deployment Scripts +Deployment scripts save JSON files to: `/deployments/{network}/{network}-{contractType}-{dateSuffix}.json` + +Examples: +- `/deployments/eth-sepolia/eth-sepolia-pretmx-15JAN2024.json` +- `/deployments/arb-mainnet/arb-mainnet-core-15JAN2024.json` +- `/deployments/eth-mainnet/eth-mainnet-access-manager-15JAN2024.json` + +#### Contract Call Scripts +Contract call scripts save JSON files to: `/executions/{network}/{network}-{scriptName}-{dateSuffix}.json` + +Examples: +- `/executions/eth-sepolia/eth-sepolia-SubmitOracles-15JAN2024.json` +- `/executions/arb-mainnet/arb-mainnet-AcceptOracles-15JAN2024.json` +- `/executions/eth-mainnet/eth-mainnet-GrantRoles-15JAN2024.json` + +### Implementation + +#### For Deployment Scripts + +Deployment scripts inherit from `DeployBase` which provides: + +```solidity +// Helper function to generate date suffix +function getDateSuffix() internal view returns (string memory) { + return StringHelper.convertTimestampToDateString(block.timestamp); +} + +// Helper function to create deployment file path with date suffix +function getDeploymentFilePath(string memory network, string memory contractType) + internal view returns (string memory) { + string memory dateSuffix = getDateSuffix(); + string memory deploymentsDir = string.concat(vm.projectRoot(), "/deployments/", network); + return string.concat(deploymentsDir, "/", network, "-", contractType, "-", dateSuffix, ".json"); +} +``` + +Usage in deployment scripts: +```solidity +// Write the JSON file with date suffix +string memory filePath = getDeploymentFilePath(network, "pretmx"); +vm.writeFile(filePath, deploymentJson); +``` + +#### For Contract Call Scripts + +Contract call scripts inherit from `ScriptBase` which provides: + +```solidity +// Helper function to create script execution file path with date suffix +function getScriptExecutionFilePath(string memory network, string memory scriptName) + internal view returns (string memory) { + string memory dateSuffix = getDateSuffix(); + string memory executionsDir = string.concat(vm.projectRoot(), "/executions/", network); + return string.concat(executionsDir, "/", network, "-", scriptName, "-", dateSuffix, ".json"); +} + +// Helper function to write script execution results to JSON +function writeScriptExecutionResults( + string memory network, + string memory scriptName, + string memory executionData +) internal { + // Create executions directory if it doesn't exist + string memory executionsDir = string.concat(vm.projectRoot(), "/executions/", network); + if (!vm.exists(executionsDir)) { + vm.createDir(executionsDir, true); + } + + // Write the JSON file with date suffix + string memory filePath = getScriptExecutionFilePath(network, scriptName); + vm.writeFile(filePath, executionData); + console.log("Script execution information written to:", filePath); +} +``` + +Usage in contract call scripts: +```solidity +// Generate execution results JSON +uint256 currentBlock = block.number; +uint256 currentTimestamp = block.timestamp; + +string memory baseJson = createBaseExecutionJson(network, "SubmitOracles", currentBlock, currentTimestamp); + +// Add script-specific data +string memory executionJson = string( + abi.encodePacked( + baseJson, + ',\n', + ' "results": {\n', + ' "totalConfigs": "', + vm.toString(configs.length), + '"\n', + " }\n", + "}" + ) +); + +writeScriptExecutionResults(network, "SubmitOracles", executionJson); +``` + +### JSON Structure + +#### Deployment Scripts JSON +```json +{ + "network": "eth-sepolia", + "deployedAt": "1705334400", + "gitBranch": "main", + "gitCommitHash": "0xabc123...", + "blockInfo": { + "number": "12345678", + "timestamp": "1705334400" + }, + "deployer": "0x123...", + "admin": "0x456...", + "contracts": { + "preTMX": { + "address": "0x789...", + "name": "PreTMX Token", + "symbol": "PreTMX", + "totalSupply": "1000000000000000000000000000", + "owner": "0x456...", + "transferRestricted": true + } + } +} +``` + +#### Contract Call Scripts JSON +```json +{ + "network": "eth-sepolia", + "scriptName": "SubmitOracles", + "executedAt": "1705334400", + "gitBranch": "main", + "gitCommitHash": "0xabc123...", + "blockInfo": { + "number": "12345678", + "timestamp": "1705334400" + }, + "results": { + "totalConfigs": "5", + "oracleAggregatorAddress": "0x123...", + "accessManagerAddress": "0x456..." + } +} +``` + +### Updated Scripts + +#### Deployment Scripts +- ✅ `DeployBase.s.sol` - Base contract with date suffix utilities +- ✅ `DeployPretmx.s.sol` - Updated to use date suffixes + +#### Contract Call Scripts +- ✅ `ScriptBase.sol` - Base contract with JSON output and date suffix utilities +- ✅ `SubmitOracles.s.sol` - Updated with JSON output and date suffixes +- ✅ `AcceptOracles.s.sol` - Updated with JSON output and date suffixes +- ✅ `GrantRoles.s.sol` - Updated with JSON output and date suffixes + +#### Scripts to Update +Other contract call scripts can be updated by: +1. Changing inheritance from `Script` to `ScriptBase` +2. Adding JSON output generation at the end of the `run()` function +3. Using `writeScriptExecutionResults()` to save the JSON file + +### Benefits + +1. **Historical Tracking**: Each execution creates a unique record +2. **Audit Trail**: Complete history of deployments and contract interactions +3. **Debugging**: Easy to compare different execution results +4. **No Overwrites**: Previous execution data is preserved +5. **Organized Storage**: Clear separation between deployments and executions +6. **Timestamped Records**: Easy to identify when operations occurred + +### Directory Structure + +``` +project-root/ +├── deployments/ +│ ├── eth-sepolia/ +│ │ ├── eth-sepolia-pretmx-15JAN2024.json +│ │ ├── eth-sepolia-core-15JAN2024.json +│ │ └── eth-sepolia-access-manager-14JAN2024.json +│ └── arb-mainnet/ +│ ├── arb-mainnet-pretmx-15JAN2024.json +│ └── arb-mainnet-core-15JAN2024.json +└── executions/ + ├── eth-sepolia/ + │ ├── eth-sepolia-SubmitOracles-15JAN2024.json + │ ├── eth-sepolia-AcceptOracles-15JAN2024.json + │ └── eth-sepolia-GrantRoles-14JAN2024.json + └── arb-mainnet/ + ├── arb-mainnet-SubmitOracles-15JAN2024.json + └── arb-mainnet-AcceptOracles-15JAN2024.json +``` + +This system ensures comprehensive tracking of all script executions while maintaining organized, timestamped records for audit and debugging purposes. \ No newline at end of file diff --git a/script/AcceptOracles.s.sol b/script/AcceptOracles.s.sol index 20fe8a6..d79287e 100644 --- a/script/AcceptOracles.s.sol +++ b/script/AcceptOracles.s.sol @@ -1,7 +1,6 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.27; -import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; import {IOracle} from "contracts/oracle/IOracle.sol"; import {OracleAggregator} from "contracts/oracle/OracleAggregator.sol"; @@ -10,8 +9,9 @@ import {JsonLoader} from "./utils/JsonLoader.sol"; import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; import {StringHelper} from "./utils/StringHelper.sol"; import {AccessManager} from "contracts/access/AccessManager.sol"; +import {ScriptBase} from "./utils/ScriptBase.sol"; -contract AcceptOracles is Script { +contract AcceptOracles is ScriptBase { // Network-specific config loaded from environment variables string network; uint256 deployerPrivateKey; @@ -84,7 +84,7 @@ contract AcceptOracles is Script { PendingOracleStatus memory status = acceptedOracles[i]; // Get current oracle config before accepting - (AggregatorV3Interface currentAggregator,,) = oracle.oracles(status.tokenAddr); + (AggregatorV3Interface currentAggregator,,,,) = oracle.oracles(status.tokenAddr); // Accept the oracle accessManager.acceptPendingOracle(oracle, status.tokenAddr); @@ -128,6 +128,40 @@ contract AcceptOracles is Script { console.log(" ---"); } } + + // Generate execution results JSON + uint256 currentBlock = block.number; + uint256 currentTimestamp = block.timestamp; + + string memory baseJson = createBaseExecutionJson(network, "AcceptOracles", currentBlock, currentTimestamp); + + // Add script-specific data + string memory executionJson = string( + abi.encodePacked( + baseJson, + ",\n", + ' "results": {\n', + ' "totalTokensChecked": "', + vm.toString(acceptedOracles.length + notReadyOracles.length), + '",\n', + ' "oraclesAccepted": "', + vm.toString(acceptedOracles.length), + '",\n', + ' "oraclesNotReady": "', + vm.toString(notReadyOracles.length), + '",\n', + ' "oracleAggregatorAddress": "', + vm.toString(oracleAggregatorAddr), + '",\n', + ' "accessManagerAddress": "', + vm.toString(accessManagerAddr), + '"\n', + " }\n", + "}" + ) + ); + + writeScriptExecutionResults(network, "AcceptOracles", executionJson); } function formatTimestamp(uint256 timestamp) internal pure returns (string memory) { @@ -209,7 +243,9 @@ contract AcceptOracles is Script { ( AggregatorV3Interface currentAggregator, AggregatorV3Interface currentBackupAggregator, - uint32 currentHeartbeat + int256 currentMaxPrice, + uint32 currentHeartbeat, + uint32 currentBackupHeartbeat ) = oracle.oracles(tokenAddr); if ( diff --git a/script/GrantRoles.s.sol b/script/GrantRoles.s.sol index df2e4a5..fdc4022 100644 --- a/script/GrantRoles.s.sol +++ b/script/GrantRoles.s.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.27; -import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; import {AccessManager} from "contracts/access/AccessManager.sol"; import {StringHelper} from "./utils/StringHelper.sol"; +import {ScriptBase} from "./utils/ScriptBase.sol"; /** * @title GrantRoles @@ -12,7 +12,7 @@ import {StringHelper} from "./utils/StringHelper.sol"; * @dev Uses admin private key to grant MARKET_ROLE, ORACLE_ROLE, and VAULT_ROLE * to the deployer address for deploying and managing contracts */ -contract GrantRoles is Script { +contract GrantRoles is ScriptBase { // Network-specific config loaded from environment variables string network; uint256 adminPrivateKey; @@ -90,5 +90,53 @@ contract GrantRoles is Script { console.log(""); console.log("=== Role Assignment Complete ==="); console.log("The deployer address now has all necessary roles to deploy and manage contracts"); + + // Generate execution results JSON + uint256 currentBlock = block.number; + uint256 currentTimestamp = block.timestamp; + + string memory baseJson = createBaseExecutionJson(network, "GrantRoles", currentBlock, currentTimestamp); + + // Check final role status + bool hasMarketRole = accessManager.hasRole(accessManager.MARKET_ROLE(), deployerAddr); + bool hasOracleRole = accessManager.hasRole(accessManager.ORACLE_ROLE(), deployerAddr); + bool hasVaultRole = accessManager.hasRole(accessManager.VAULT_ROLE(), deployerAddr); + bool hasConfiguratorRole = accessManager.hasRole(accessManager.CONFIGURATOR_ROLE(), deployerAddr); + + // Add script-specific data + string memory executionJson = string( + abi.encodePacked( + baseJson, + ",\n", + ' "results": {\n', + ' "adminAddress": "', + vm.toString(adminAddr), + '",\n', + ' "deployerAddress": "', + vm.toString(deployerAddr), + '",\n', + ' "accessManagerAddress": "', + vm.toString(accessManagerAddr), + '",\n', + ' "rolesGranted": {\n', + ' "MARKET_ROLE": ', + hasMarketRole ? "true" : "false", + ",\n", + ' "ORACLE_ROLE": ', + hasOracleRole ? "true" : "false", + ",\n", + ' "VAULT_ROLE": ', + hasVaultRole ? "true" : "false", + ",\n", + ' "CONFIGURATOR_ROLE": ', + hasConfiguratorRole ? "true" : "false", + "\n", + " }\n", + " }\n", + "}" + ) + ); + + writeScriptExecutionResults(network, "GrantRoles", executionJson); } } diff --git a/script/SubmitOracles.s.sol b/script/SubmitOracles.s.sol index 76112eb..1208825 100644 --- a/script/SubmitOracles.s.sol +++ b/script/SubmitOracles.s.sol @@ -1,7 +1,6 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.27; -import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; import {IOracle} from "contracts/oracle/IOracle.sol"; import {OracleAggregator} from "contracts/oracle/OracleAggregator.sol"; @@ -10,8 +9,9 @@ import {JsonLoader} from "./utils/JsonLoader.sol"; import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; import {StringHelper} from "./utils/StringHelper.sol"; import {AccessManager} from "contracts/access/AccessManager.sol"; +import {ScriptBase} from "./utils/ScriptBase.sol"; -contract SubmitOracles is Script { +contract SubmitOracles is ScriptBase { // Network-specific config loaded from environment variables string network; uint256 deployerPrivateKey; @@ -52,8 +52,13 @@ contract SubmitOracles is Script { OracleAggregator oracle = OracleAggregator(oracleAggregatorAddr); for (uint256 i; i < configs.length; i++) { JsonLoader.Config memory config = configs[i]; - (AggregatorV3Interface aggregator, AggregatorV3Interface backupAggregator, uint32 heartbeat) = - oracle.oracles(address(config.underlyingConfig.tokenAddr)); + ( + AggregatorV3Interface aggregator, + AggregatorV3Interface backupAggregator, + int256 maxPrice, + uint32 heartbeat, + uint32 backupHeartbeat + ) = oracle.oracles(address(config.underlyingConfig.tokenAddr)); if ( !tokenSubmitted[address(config.underlyingConfig.tokenAddr)] && ( @@ -68,6 +73,8 @@ contract SubmitOracles is Script { IOracle.Oracle( AggregatorV3Interface(config.underlyingConfig.priceFeedAddr), AggregatorV3Interface(config.underlyingConfig.backupPriceFeedAddr), + 0, + uint32(config.underlyingConfig.heartBeat), uint32(config.underlyingConfig.heartBeat) ) ); @@ -81,7 +88,8 @@ contract SubmitOracles is Script { console.log("Heartbeat: ", config.underlyingConfig.heartBeat); console.log("--------------------------------"); } - (aggregator, backupAggregator, heartbeat) = oracle.oracles(address(config.collateralConfig.tokenAddr)); + (aggregator, backupAggregator, maxPrice, heartbeat, backupHeartbeat) = + oracle.oracles(address(config.collateralConfig.tokenAddr)); if ( !tokenSubmitted[address(config.collateralConfig.tokenAddr)] && ( @@ -96,6 +104,8 @@ contract SubmitOracles is Script { IOracle.Oracle( AggregatorV3Interface(config.collateralConfig.priceFeedAddr), AggregatorV3Interface(config.collateralConfig.backupPriceFeedAddr), + 0, + uint32(config.collateralConfig.heartBeat), uint32(config.collateralConfig.heartBeat) ) ); @@ -112,5 +122,33 @@ contract SubmitOracles is Script { } vm.stopBroadcast(); + + // Generate execution results JSON + uint256 currentBlock = block.number; + uint256 currentTimestamp = block.timestamp; + + string memory baseJson = createBaseExecutionJson(network, "SubmitOracles", currentBlock, currentTimestamp); + + // Add script-specific data + string memory executionJson = string( + abi.encodePacked( + baseJson, + ",\n", + ' "results": {\n', + ' "totalConfigs": "', + vm.toString(configs.length), + '",\n', + ' "oracleAggregatorAddress": "', + vm.toString(oracleAggregatorAddr), + '",\n', + ' "accessManagerAddress": "', + vm.toString(accessManagerAddr), + '"\n', + " }\n", + "}" + ) + ); + + writeScriptExecutionResults(network, "SubmitOracles", executionJson); } } diff --git a/script/deploy/DeployBase.s.sol b/script/deploy/DeployBase.s.sol index 369d277..b9e842e 100644 --- a/script/deploy/DeployBase.s.sol +++ b/script/deploy/DeployBase.s.sol @@ -39,6 +39,7 @@ import {UniswapV3Adapter} from "contracts/router/swapAdapters/UniswapV3Adapter.s import {ERC4626VaultAdapter} from "contracts/router/swapAdapters/ERC4626VaultAdapter.sol"; import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; import {AccessManager} from "contracts/access/AccessManager.sol"; +import {StringHelper} from "../utils/StringHelper.sol"; contract DeployBase is Script { bytes32 constant GT_ERC20 = keccak256("GearingTokenWithERC20"); @@ -214,7 +215,7 @@ contract DeployBase is Script { accessManager.submitPendingOracle( oracle, address(collateral), - IOracle.Oracle(collateralPriceFeed, collateralPriceFeed, uint32(365 days)) + IOracle.Oracle(collateralPriceFeed, collateralPriceFeed, 0, uint32(365 days), uint32(365 days)) ); accessManager.acceptPendingOracle(oracle, address(collateral)); } else { @@ -244,7 +245,7 @@ contract DeployBase is Script { accessManager.submitPendingOracle( oracle, address(underlying), - IOracle.Oracle(underlyingPriceFeed, underlyingPriceFeed, uint32(365 days)) + IOracle.Oracle(underlyingPriceFeed, underlyingPriceFeed, 0, uint32(365 days), uint32(365 days)) ); accessManager.acceptPendingOracle(oracle, address(underlying)); } else { @@ -412,4 +413,20 @@ contract DeployBase is Script { } return string(bUpper); } + + // Helper function to generate date suffix for JSON files + function getDateSuffix() internal view returns (string memory) { + return StringHelper.convertTimestampToDateString(block.timestamp); + } + + // Helper function to create deployment file path with date suffix + function getDeploymentFilePath(string memory network, string memory contractType) + internal + view + returns (string memory) + { + string memory dateSuffix = getDateSuffix(); + string memory deploymentsDir = string.concat(vm.projectRoot(), "/deployments/", network); + return string.concat(deploymentsDir, "/", network, "-", contractType, "-", dateSuffix, ".json"); + } } diff --git a/script/deploy/DeployPreTMX.s.sol b/script/deploy/DeployPreTMX.s.sol index 6728a60..3bd55f6 100644 --- a/script/deploy/DeployPreTMX.s.sol +++ b/script/deploy/DeployPreTMX.s.sol @@ -122,8 +122,8 @@ contract DeployPreTMX is DeployBase { vm.createDir(deploymentsDir, true); } - // Write the JSON file - string memory filePath = string.concat(deploymentsDir, "/", network, "-PreTMX.json"); + // Write the JSON file with date suffix + string memory filePath = getDeploymentFilePath(network, "pretmx"); vm.writeFile(filePath, deploymentJson); console.log("Deployment information written to:", filePath); } diff --git a/script/deploy/DeployPriceFeeds.sol b/script/deploy/DeployPriceFeeds.sol index 2c6700e..1d33b94 100644 --- a/script/deploy/DeployPriceFeeds.sol +++ b/script/deploy/DeployPriceFeeds.sol @@ -4,19 +4,20 @@ pragma solidity ^0.8.27; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; -import {PriceFeedFactory} from "contracts/extensions/PriceFeedFactory.sol"; +import {TermMaxPriceFeedFactory} from "contracts/factory/TermMaxPriceFeedFactory.sol"; contract DeployPriceFeeds is Script { function run() public { uint256 deployerPrivateKey = vm.envUint("ETH_MAINNET_DEPLOYER_PRIVATE_KEY"); vm.startBroadcast(deployerPrivateKey); - PriceFeedFactory priceFeedFactory = new PriceFeedFactory(); + TermMaxPriceFeedFactory priceFeedFactory = new TermMaxPriceFeedFactory(); - console.log("PriceFeedFactory deployed at", address(priceFeedFactory)); + console.log("TermMaxPriceFeedFactory deployed at", address(priceFeedFactory)); // pendle deployments: https://github.com/pendle-finance/pendle-core-v2-public/blob/main/deployments/1-core.json address pendlePYLpOracle = 0x9a9Fa8338dd5E5B2188006f1Cd2Ef26d921650C2; address pufferEthOracle; { + address pufETH = 0xD9A442856C234a39a81a089C06451EBAa4306a72; // chainlink(pufETH/ETH): https://data.chain.link/feeds/ethereum/mainnet/pufeth-eth // heartBeat: 86400 (24hr) address pufferEthToEth = 0xDe3f7Dd92C4701BCf59F47235bCb61e727c45f80; @@ -25,7 +26,7 @@ contract DeployPriceFeeds is Script { address ethToUsd = 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419; // new price feed heartBeat = max(3600, 86400) = 86400 (24hr) AggregatorV3Interface pufferEthFeed = - AggregatorV3Interface(priceFeedFactory.createPriceFeedConverter(pufferEthToEth, ethToUsd)); + AggregatorV3Interface(priceFeedFactory.createPriceFeedConverter(pufferEthToEth, ethToUsd, pufETH)); (, int256 answer,,,) = pufferEthFeed.latestRoundData(); console.log("pufferEth price feed address", address(pufferEthFeed)); console.log("pufferEth last answer", answer); diff --git a/script/utils/ScriptBase.sol b/script/utils/ScriptBase.sol new file mode 100644 index 0000000..d422941 --- /dev/null +++ b/script/utils/ScriptBase.sol @@ -0,0 +1,107 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {Script} from "forge-std/Script.sol"; +import {console} from "forge-std/console.sol"; +import {StringHelper} from "./StringHelper.sol"; + +/** + * @title ScriptBase + * @notice Base contract for contract call scripts with JSON output functionality + */ +contract ScriptBase is Script { + // Helper function to generate date suffix for JSON files + function getDateSuffix() internal view returns (string memory) { + return StringHelper.convertTimestampToDateString(block.timestamp); + } + + // Helper function to create script execution file path with date suffix + function getScriptExecutionFilePath(string memory network, string memory scriptName) + internal + view + returns (string memory) + { + string memory dateSuffix = getDateSuffix(); + string memory executionsDir = string.concat(vm.projectRoot(), "/executions/", network); + return string.concat(executionsDir, "/", network, "-", scriptName, "-", dateSuffix, ".json"); + } + + // Helper function to write script execution results to JSON + function writeScriptExecutionResults(string memory network, string memory scriptName, string memory executionData) + internal + { + // Create executions directory if it doesn't exist + string memory executionsDir = string.concat(vm.projectRoot(), "/executions/", network); + if (!vm.exists(executionsDir)) { + vm.createDir(executionsDir, true); + } + + // Write the JSON file with date suffix + string memory filePath = getScriptExecutionFilePath(network, scriptName); + vm.writeFile(filePath, executionData); + console.log("Script execution information written to:", filePath); + } + + // Helper function to get git commit hash + function getGitCommitHash() internal returns (bytes memory) { + string[] memory inputs = new string[](3); + inputs[0] = "git"; + inputs[1] = "rev-parse"; + inputs[2] = "HEAD"; + bytes memory result = vm.ffi(inputs); + return result; + } + + // Helper function to get git branch + function getGitBranch() internal returns (string memory) { + string[] memory inputs = new string[](4); + inputs[0] = "git"; + inputs[1] = "rev-parse"; + inputs[2] = "--abbrev-ref"; + inputs[3] = "HEAD"; + bytes memory result = vm.ffi(inputs); + return string(result); + } + + // Helper function to convert string to uppercase + function toUpper(string memory str) internal pure returns (string memory) { + return StringHelper.toUpper(str); + } + + // Helper function to create base execution JSON structure + function createBaseExecutionJson( + string memory network, + string memory scriptName, + uint256 executionBlock, + uint256 executionTimestamp + ) internal returns (string memory) { + return string( + abi.encodePacked( + "{\n", + ' "network": "', + network, + '",\n', + ' "scriptName": "', + scriptName, + '",\n', + ' "executedAt": "', + vm.toString(executionTimestamp), + '",\n', + ' "gitBranch": "', + getGitBranch(), + '",\n', + ' "gitCommitHash": "0x', + vm.toString(getGitCommitHash()), + '",\n', + ' "blockInfo": {\n', + ' "number": "', + vm.toString(executionBlock), + '",\n', + ' "timestamp": "', + vm.toString(executionTimestamp), + '"\n', + " }" + ) + ); + } +} From 59be3a6eaca5bddc2083ee3eb4a0470c7c0a3587 Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 26 May 2025 16:57:51 +0800 Subject: [PATCH 036/194] ut --- contracts/tokens/StakingBuffer.sol | 20 ++- test/TermMaxToken.t.sol | 232 +++++++++++++++++++++++++++++ 2 files changed, 248 insertions(+), 4 deletions(-) create mode 100644 test/TermMaxToken.t.sol diff --git a/contracts/tokens/StakingBuffer.sol b/contracts/tokens/StakingBuffer.sol index b0c49b3..6c48387 100644 --- a/contracts/tokens/StakingBuffer.sol +++ b/contracts/tokens/StakingBuffer.sol @@ -18,15 +18,27 @@ abstract contract StakingBuffer { uint256 assetBalance = IERC20(assetAddr).balanceOf(address(this)); BufferConfig memory bufferConfig = _bufferConfig(assetAddr); if (assetBalance + amount > bufferConfig.maximumBuffer) { - _depositToPool(assetAddr, assetBalance + amount - bufferConfig.buffer); - } + _depositToPool(assetAddr, assetBalance + amount - bufferConfig.buffer); +} } function _withdrawWithBuffer(address assetAddr, address to, uint256 amount) internal { uint256 assetBalance = IERC20(assetAddr).balanceOf(address(this)); BufferConfig memory bufferConfig = _bufferConfig(assetAddr); - if (assetBalance < amount || assetBalance - amount < bufferConfig.minimumBuffer) { - _withdrawFromPool(assetAddr, to, bufferConfig.buffer + amount - assetBalance); + + if (assetBalance >= amount && assetBalance - amount >= bufferConfig.minimumBuffer) { + // Sufficient buffer, transfer directly from contract balance + IERC20(assetAddr).safeTransfer(to, amount); + } else { + // Need to withdraw from pool to maintain buffer and fulfill request + uint256 targetBalance = bufferConfig.buffer + amount; + if (targetBalance > assetBalance) { + uint256 amountFromPool = targetBalance - assetBalance; + _withdrawFromPool(assetAddr, address(this), amountFromPool); + } + + // Transfer the full amount to user + IERC20(assetAddr).safeTransfer(to, amount); } } diff --git a/test/TermMaxToken.t.sol b/test/TermMaxToken.t.sol new file mode 100644 index 0000000..03747a8 --- /dev/null +++ b/test/TermMaxToken.t.sol @@ -0,0 +1,232 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {TermMaxToken, StakingBuffer} from "contracts/tokens/TermMaxToken.sol"; +import {Test} from "forge-std/Test.sol"; +import {MockAave} from "contracts/test/MockAave.sol"; +import {MockERC20} from "contracts/test/MockERC20.sol"; +import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; + +contract TermMaxTokenTest is Test { + TermMaxToken public termMaxToken; + MockAave public aavePool; + MockERC20 public underlying; + address public admin = vm.randomAddress(); + + function setUp() public { + underlying = new MockERC20("USDC", "USDC", 6); + aavePool = new MockAave(address(underlying)); + + address implementation = address(new TermMaxToken(address(aavePool), 0)); + termMaxToken = TermMaxToken( + address( + new ERC1967Proxy( + implementation, + abi.encodeWithSelector( + TermMaxToken.initialize.selector, + admin, + address(underlying), + StakingBuffer.BufferConfig({minimumBuffer: 1000e6, maximumBuffer: 10000e6, buffer: 5000e6}) + ) + ) + ) + ); + } + + function testMint() public { + uint256 amount = 1000e6; + underlying.mint(address(this), amount); + underlying.approve(address(termMaxToken), amount); + + termMaxToken.mint(address(this), amount); + + assertEq(termMaxToken.balanceOf(address(this)), amount); + assertEq(underlying.balanceOf(address(this)), 0); + // Check that aTokens were minted to the TermMaxToken contract + assertEq(aavePool.balanceOf(address(termMaxToken)), amount); + } + + function testBurn() public { + uint256 amount = 1000e6; + underlying.mint(address(this), amount); + underlying.approve(address(termMaxToken), amount); + termMaxToken.mint(address(this), amount); + + termMaxToken.burn(address(this), amount); + + assertEq(termMaxToken.balanceOf(address(this)), 0); + assertEq(underlying.balanceOf(address(this)), amount); + assertEq(aavePool.balanceOf(address(termMaxToken)), 0); + } + + function testBurnToAToken() public { + uint256 amount = 1000e6; + underlying.mint(address(this), amount); + underlying.approve(address(termMaxToken), amount); + termMaxToken.mint(address(this), amount); + + termMaxToken.burnToAToken(address(this), amount); + + assertEq(termMaxToken.balanceOf(address(this)), 0); + assertEq(aavePool.balanceOf(address(this)), amount); + } + + function testWithdrawIncomeAssets() public { + // Setup - mint some tokens + uint256 amount = 1000e6; + underlying.mint(address(this), amount); + underlying.approve(address(termMaxToken), amount); + termMaxToken.mint(address(this), amount); + + // Simulate yield by directly minting aTokens to the TermMaxToken contract + uint256 yieldAmount = 100e6; + aavePool.simulateInterestAccrual(address(termMaxToken), yieldAmount); + + // Withdraw income as the admin + vm.startPrank(admin); + termMaxToken.withdrawIncomeAssets(address(underlying), admin, yieldAmount); + vm.stopPrank(); + + // Assert balances are correct + assertEq(underlying.balanceOf(admin), yieldAmount); + assertEq(termMaxToken.totalIncomeAssets(), 0); + } + + function testUpdateBufferConfigAndAddReserves() public { + uint256 additionalReserves = 500e6; + underlying.mint(admin, additionalReserves); + + vm.startPrank(admin); + underlying.approve(address(termMaxToken), additionalReserves); + + StakingBuffer.BufferConfig memory newConfig = StakingBuffer.BufferConfig({ + minimumBuffer: 2000e6, + maximumBuffer: 20000e6, + buffer: 10000e6 + }); + + termMaxToken.updateBufferConfigAndAddReserves(additionalReserves, newConfig); + vm.stopPrank(); + + // Get current buffer config + (uint256 minimumBuffer, uint256 maximumBuffer, uint256 buffer) = termMaxToken.bufferConfig(); + + // Assert the new config was set correctly + assertEq(minimumBuffer, newConfig.minimumBuffer); + assertEq(maximumBuffer, newConfig.maximumBuffer); + assertEq(buffer, newConfig.buffer); + + // Assert the additional reserves were added + assertEq(underlying.balanceOf(address(termMaxToken)), additionalReserves); + } + + function testTotalIncomeAssets() public { + uint256 amount = 1000e6; + underlying.mint(address(this), amount); + underlying.approve(address(termMaxToken), amount); + termMaxToken.mint(address(this), amount); + + // Simulate yield by directly minting aTokens to the TermMaxToken contract + uint256 yieldAmount = 100e6; + aavePool.simulateInterestAccrual(address(termMaxToken), yieldAmount); + + assertEq(termMaxToken.totalIncomeAssets(), yieldAmount); + } + + function testMintZeroAmount() public { + // The mint function doesn't explicitly check for zero amounts at the ERC20 level, + // but it should revert due to transferFrom of zero amount or other validations + underlying.mint(address(this), 0); + underlying.approve(address(termMaxToken), 0); + + // This should succeed as minting 0 tokens is typically allowed + termMaxToken.mint(address(this), 0); + assertEq(termMaxToken.balanceOf(address(this)), 0); + } + + function testBurnMoreThanBalance() public { + uint256 amount = 1000e6; + underlying.mint(address(this), amount); + underlying.approve(address(termMaxToken), amount); + termMaxToken.mint(address(this), amount); + + vm.expectRevert(); + termMaxToken.burn(address(this), amount + 1); + } + + function testWithdrawTooMuchIncome() public { + // Setup - mint some tokens + uint256 amount = 1000e6; + underlying.mint(address(this), amount); + underlying.approve(address(termMaxToken), amount); + termMaxToken.mint(address(this), amount); + + // Simulate yield by directly minting aTokens to the TermMaxToken contract + uint256 yieldAmount = 100e6; + aavePool.simulateInterestAccrual(address(termMaxToken), yieldAmount); + + // Try to withdraw more than available income + vm.startPrank(admin); + vm.expectRevert(); + termMaxToken.withdrawIncomeAssets(address(underlying), admin, yieldAmount + 1); + vm.stopPrank(); + } + + function testNonAdminCannotWithdrawIncome() public { + // Setup - mint some tokens + uint256 amount = 1000e6; + underlying.mint(address(this), amount); + underlying.approve(address(termMaxToken), amount); + termMaxToken.mint(address(this), amount); + + // Simulate yield by directly minting aTokens to the TermMaxToken contract + uint256 yieldAmount = 100e6; + aavePool.simulateInterestAccrual(address(termMaxToken), yieldAmount); + + // Try to withdraw as non-admin + vm.expectRevert(); + termMaxToken.withdrawIncomeAssets(address(underlying), address(this), yieldAmount); + } + + function testNonAdminCannotUpdateBufferConfig() public { + StakingBuffer.BufferConfig memory newConfig = StakingBuffer.BufferConfig({ + minimumBuffer: 2000e6, + maximumBuffer: 20000e6, + buffer: 10000e6 + }); + + vm.expectRevert(); + termMaxToken.updateBufferConfigAndAddReserves(0, newConfig); + } + + function testWithdrawIncomeAsAToken() public { + // Setup - mint some tokens + uint256 amount = 1000e6; + underlying.mint(address(this), amount); + underlying.approve(address(termMaxToken), amount); + termMaxToken.mint(address(this), amount); + + // Simulate yield by directly minting aTokens to the TermMaxToken contract + uint256 yieldAmount = 100e6; + aavePool.simulateInterestAccrual(address(termMaxToken), yieldAmount); + + // Withdraw income as aToken + vm.startPrank(admin); + termMaxToken.withdrawIncomeAssets(address(aavePool), admin, yieldAmount); + vm.stopPrank(); + + // Assert balances are correct + assertEq(aavePool.balanceOf(admin), yieldAmount); + } + + function testWithdrawIncomeAsInvalidToken() public { + // Setup + MockERC20 invalidToken = new MockERC20("Invalid", "INV", 18); + + // Attempt to withdraw income with invalid token + vm.startPrank(admin); + vm.expectRevert(); + termMaxToken.withdrawIncomeAssets(address(invalidToken), admin, 100e6); + vm.stopPrank(); + } +} From 626a4b526588d6f61ac78473af69020004bf299d Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 26 May 2025 22:14:04 +0800 Subject: [PATCH 037/194] fix ut --- contracts/tokens/StakingBuffer.sol | 28 +++++++----- contracts/tokens/TermMaxToken.sol | 6 +++ test/TermMaxToken.t.sol | 70 ++++++++++++++---------------- 3 files changed, 55 insertions(+), 49 deletions(-) diff --git a/contracts/tokens/StakingBuffer.sol b/contracts/tokens/StakingBuffer.sol index 6c48387..d36f655 100644 --- a/contracts/tokens/StakingBuffer.sol +++ b/contracts/tokens/StakingBuffer.sol @@ -18,26 +18,30 @@ abstract contract StakingBuffer { uint256 assetBalance = IERC20(assetAddr).balanceOf(address(this)); BufferConfig memory bufferConfig = _bufferConfig(assetAddr); if (assetBalance + amount > bufferConfig.maximumBuffer) { - _depositToPool(assetAddr, assetBalance + amount - bufferConfig.buffer); -} + _depositToPool(assetAddr, assetBalance + amount - bufferConfig.buffer); + } } function _withdrawWithBuffer(address assetAddr, address to, uint256 amount) internal { uint256 assetBalance = IERC20(assetAddr).balanceOf(address(this)); BufferConfig memory bufferConfig = _bufferConfig(assetAddr); - + if (assetBalance >= amount && assetBalance - amount >= bufferConfig.minimumBuffer) { // Sufficient buffer, transfer directly from contract balance IERC20(assetAddr).safeTransfer(to, amount); + return; + } + // Not enough buffer, withdraw from pool + uint256 targetBalance = bufferConfig.buffer + amount; + uint256 amountFromPool = targetBalance - assetBalance; + uint256 aTokenBalance = _aTokenBalance(assetAddr); + if (amountFromPool > aTokenBalance) { + amountFromPool = aTokenBalance; + } + if (amountFromPool == amount) { + _withdrawFromPool(assetAddr, to, amountFromPool); } else { - // Need to withdraw from pool to maintain buffer and fulfill request - uint256 targetBalance = bufferConfig.buffer + amount; - if (targetBalance > assetBalance) { - uint256 amountFromPool = targetBalance - assetBalance; - _withdrawFromPool(assetAddr, address(this), amountFromPool); - } - - // Transfer the full amount to user + _withdrawFromPool(assetAddr, address(this), amountFromPool); IERC20(assetAddr).safeTransfer(to, amount); } } @@ -48,6 +52,8 @@ abstract contract StakingBuffer { function _withdrawFromPool(address assetAddr, address to, uint256 amount) internal virtual; + function _aTokenBalance(address assetAddr) internal view virtual returns (uint256 amount); + function _checkBufferConfig(uint256 minimumBuffer, uint256 maximumBuffer, uint256 buffer) internal pure { if (minimumBuffer > maximumBuffer || buffer < minimumBuffer || buffer > maximumBuffer) { revert InvalidBuffer(minimumBuffer, maximumBuffer, buffer); diff --git a/contracts/tokens/TermMaxToken.sol b/contracts/tokens/TermMaxToken.sol index e9f5069..0ff6822 100644 --- a/contracts/tokens/TermMaxToken.sol +++ b/contracts/tokens/TermMaxToken.sol @@ -127,14 +127,20 @@ contract TermMaxToken is } function _depositToPool(address assetAddr, uint256 amount) internal virtual override { + IERC20(assetAddr).safeIncreaseAllowance(address(aavePool), amount); aavePool.supply(assetAddr, amount, address(this), referralCode); } function _withdrawFromPool(address assetAddr, address to, uint256 amount) internal virtual override { + aToken.safeIncreaseAllowance(address(aavePool), amount); uint256 receivedAmount = aavePool.withdraw(assetAddr, amount, to); require(receivedAmount == amount, AaveWithdrawFailed(amount, receivedAmount)); } + function _aTokenBalance(address) internal view virtual override returns (uint256 amount) { + amount = aToken.balanceOf(address(this)); + } + /// @notice Submit a new implementation for upgrade with timelock /// @param newImplementation The address of the new implementation contract function submitPendingUpgrade(address newImplementation) external onlyOwner { diff --git a/test/TermMaxToken.t.sol b/test/TermMaxToken.t.sol index 03747a8..a63042d 100644 --- a/test/TermMaxToken.t.sol +++ b/test/TermMaxToken.t.sol @@ -37,9 +37,9 @@ contract TermMaxTokenTest is Test { uint256 amount = 1000e6; underlying.mint(address(this), amount); underlying.approve(address(termMaxToken), amount); - + termMaxToken.mint(address(this), amount); - + assertEq(termMaxToken.balanceOf(address(this)), amount); assertEq(underlying.balanceOf(address(this)), 0); // Check that aTokens were minted to the TermMaxToken contract @@ -51,9 +51,9 @@ contract TermMaxTokenTest is Test { underlying.mint(address(this), amount); underlying.approve(address(termMaxToken), amount); termMaxToken.mint(address(this), amount); - + termMaxToken.burn(address(this), amount); - + assertEq(termMaxToken.balanceOf(address(this)), 0); assertEq(underlying.balanceOf(address(this)), amount); assertEq(aavePool.balanceOf(address(termMaxToken)), 0); @@ -64,9 +64,9 @@ contract TermMaxTokenTest is Test { underlying.mint(address(this), amount); underlying.approve(address(termMaxToken), amount); termMaxToken.mint(address(this), amount); - + termMaxToken.burnToAToken(address(this), amount); - + assertEq(termMaxToken.balanceOf(address(this)), 0); assertEq(aavePool.balanceOf(address(this)), amount); } @@ -77,16 +77,16 @@ contract TermMaxTokenTest is Test { underlying.mint(address(this), amount); underlying.approve(address(termMaxToken), amount); termMaxToken.mint(address(this), amount); - + // Simulate yield by directly minting aTokens to the TermMaxToken contract uint256 yieldAmount = 100e6; aavePool.simulateInterestAccrual(address(termMaxToken), yieldAmount); - + // Withdraw income as the admin vm.startPrank(admin); termMaxToken.withdrawIncomeAssets(address(underlying), admin, yieldAmount); vm.stopPrank(); - + // Assert balances are correct assertEq(underlying.balanceOf(admin), yieldAmount); assertEq(termMaxToken.totalIncomeAssets(), 0); @@ -95,27 +95,24 @@ contract TermMaxTokenTest is Test { function testUpdateBufferConfigAndAddReserves() public { uint256 additionalReserves = 500e6; underlying.mint(admin, additionalReserves); - + vm.startPrank(admin); underlying.approve(address(termMaxToken), additionalReserves); - - StakingBuffer.BufferConfig memory newConfig = StakingBuffer.BufferConfig({ - minimumBuffer: 2000e6, - maximumBuffer: 20000e6, - buffer: 10000e6 - }); - + + StakingBuffer.BufferConfig memory newConfig = + StakingBuffer.BufferConfig({minimumBuffer: 2000e6, maximumBuffer: 20000e6, buffer: 10000e6}); + termMaxToken.updateBufferConfigAndAddReserves(additionalReserves, newConfig); vm.stopPrank(); - + // Get current buffer config (uint256 minimumBuffer, uint256 maximumBuffer, uint256 buffer) = termMaxToken.bufferConfig(); - + // Assert the new config was set correctly assertEq(minimumBuffer, newConfig.minimumBuffer); assertEq(maximumBuffer, newConfig.maximumBuffer); assertEq(buffer, newConfig.buffer); - + // Assert the additional reserves were added assertEq(underlying.balanceOf(address(termMaxToken)), additionalReserves); } @@ -125,11 +122,11 @@ contract TermMaxTokenTest is Test { underlying.mint(address(this), amount); underlying.approve(address(termMaxToken), amount); termMaxToken.mint(address(this), amount); - + // Simulate yield by directly minting aTokens to the TermMaxToken contract uint256 yieldAmount = 100e6; aavePool.simulateInterestAccrual(address(termMaxToken), yieldAmount); - + assertEq(termMaxToken.totalIncomeAssets(), yieldAmount); } @@ -138,7 +135,7 @@ contract TermMaxTokenTest is Test { // but it should revert due to transferFrom of zero amount or other validations underlying.mint(address(this), 0); underlying.approve(address(termMaxToken), 0); - + // This should succeed as minting 0 tokens is typically allowed termMaxToken.mint(address(this), 0); assertEq(termMaxToken.balanceOf(address(this)), 0); @@ -149,7 +146,7 @@ contract TermMaxTokenTest is Test { underlying.mint(address(this), amount); underlying.approve(address(termMaxToken), amount); termMaxToken.mint(address(this), amount); - + vm.expectRevert(); termMaxToken.burn(address(this), amount + 1); } @@ -160,11 +157,11 @@ contract TermMaxTokenTest is Test { underlying.mint(address(this), amount); underlying.approve(address(termMaxToken), amount); termMaxToken.mint(address(this), amount); - + // Simulate yield by directly minting aTokens to the TermMaxToken contract uint256 yieldAmount = 100e6; aavePool.simulateInterestAccrual(address(termMaxToken), yieldAmount); - + // Try to withdraw more than available income vm.startPrank(admin); vm.expectRevert(); @@ -178,23 +175,20 @@ contract TermMaxTokenTest is Test { underlying.mint(address(this), amount); underlying.approve(address(termMaxToken), amount); termMaxToken.mint(address(this), amount); - + // Simulate yield by directly minting aTokens to the TermMaxToken contract uint256 yieldAmount = 100e6; aavePool.simulateInterestAccrual(address(termMaxToken), yieldAmount); - + // Try to withdraw as non-admin vm.expectRevert(); termMaxToken.withdrawIncomeAssets(address(underlying), address(this), yieldAmount); } function testNonAdminCannotUpdateBufferConfig() public { - StakingBuffer.BufferConfig memory newConfig = StakingBuffer.BufferConfig({ - minimumBuffer: 2000e6, - maximumBuffer: 20000e6, - buffer: 10000e6 - }); - + StakingBuffer.BufferConfig memory newConfig = + StakingBuffer.BufferConfig({minimumBuffer: 2000e6, maximumBuffer: 20000e6, buffer: 10000e6}); + vm.expectRevert(); termMaxToken.updateBufferConfigAndAddReserves(0, newConfig); } @@ -205,16 +199,16 @@ contract TermMaxTokenTest is Test { underlying.mint(address(this), amount); underlying.approve(address(termMaxToken), amount); termMaxToken.mint(address(this), amount); - + // Simulate yield by directly minting aTokens to the TermMaxToken contract uint256 yieldAmount = 100e6; aavePool.simulateInterestAccrual(address(termMaxToken), yieldAmount); - + // Withdraw income as aToken vm.startPrank(admin); termMaxToken.withdrawIncomeAssets(address(aavePool), admin, yieldAmount); vm.stopPrank(); - + // Assert balances are correct assertEq(aavePool.balanceOf(admin), yieldAmount); } @@ -222,7 +216,7 @@ contract TermMaxTokenTest is Test { function testWithdrawIncomeAsInvalidToken() public { // Setup MockERC20 invalidToken = new MockERC20("Invalid", "INV", 18); - + // Attempt to withdraw income with invalid token vm.startPrank(admin); vm.expectRevert(); From d7442688a62f991e43f2ba8e7f08b332d1eba882 Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 27 May 2025 10:06:48 +0800 Subject: [PATCH 038/194] fix ut --- contracts/tokens/StakingBuffer.sol | 6 +++--- contracts/tokens/TermMaxToken.sol | 2 +- test/TermMaxToken.t.sol | 14 +++++++++++--- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/contracts/tokens/StakingBuffer.sol b/contracts/tokens/StakingBuffer.sol index d36f655..f4d4084 100644 --- a/contracts/tokens/StakingBuffer.sol +++ b/contracts/tokens/StakingBuffer.sol @@ -14,11 +14,11 @@ abstract contract StakingBuffer { uint256 buffer; } - function _depositWithBuffer(address assetAddr, uint256 amount) internal { + function _depositWithBuffer(address assetAddr) internal { uint256 assetBalance = IERC20(assetAddr).balanceOf(address(this)); BufferConfig memory bufferConfig = _bufferConfig(assetAddr); - if (assetBalance + amount > bufferConfig.maximumBuffer) { - _depositToPool(assetAddr, assetBalance + amount - bufferConfig.buffer); + if (assetBalance > bufferConfig.maximumBuffer) { + _depositToPool(assetAddr, assetBalance - bufferConfig.buffer); } } diff --git a/contracts/tokens/TermMaxToken.sol b/contracts/tokens/TermMaxToken.sol index 0ff6822..be07e24 100644 --- a/contracts/tokens/TermMaxToken.sol +++ b/contracts/tokens/TermMaxToken.sol @@ -67,7 +67,7 @@ contract TermMaxToken is function mint(address to, uint256 amount) external nonReentrant { _mint(to, amount); underlying.safeTransferFrom(msg.sender, address(this), amount); - _depositWithBuffer(address(underlying), amount); + _depositWithBuffer(address(underlying)); } function burn(address to, uint256 amount) external nonReentrant { diff --git a/test/TermMaxToken.t.sol b/test/TermMaxToken.t.sol index a63042d..26ef4be 100644 --- a/test/TermMaxToken.t.sol +++ b/test/TermMaxToken.t.sol @@ -43,7 +43,8 @@ contract TermMaxTokenTest is Test { assertEq(termMaxToken.balanceOf(address(this)), amount); assertEq(underlying.balanceOf(address(this)), 0); // Check that aTokens were minted to the TermMaxToken contract - assertEq(aavePool.balanceOf(address(termMaxToken)), amount); + assertEq(aavePool.balanceOf(address(termMaxToken)), 0); + assertEq(underlying.balanceOf(address(termMaxToken)), amount); } function testBurn() public { @@ -65,9 +66,16 @@ contract TermMaxTokenTest is Test { underlying.approve(address(termMaxToken), amount); termMaxToken.mint(address(this), amount); + vm.expectRevert(); termMaxToken.burnToAToken(address(this), amount); - assertEq(termMaxToken.balanceOf(address(this)), 0); + underlying.mint(address(this), amount * 10); + underlying.approve(address(termMaxToken), amount * 10); + termMaxToken.mint(address(this), amount * 10); + + termMaxToken.burnToAToken(address(this), amount); + + assertEq(termMaxToken.balanceOf(address(this)), amount * 10); assertEq(aavePool.balanceOf(address(this)), amount); } @@ -89,7 +97,7 @@ contract TermMaxTokenTest is Test { // Assert balances are correct assertEq(underlying.balanceOf(admin), yieldAmount); - assertEq(termMaxToken.totalIncomeAssets(), 0); + assertEq(termMaxToken.totalIncomeAssets(), yieldAmount); } function testUpdateBufferConfigAndAddReserves() public { From dd51f60589c90ad8c462b0afb4c1f08e49f14d42 Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 27 May 2025 11:47:21 +0800 Subject: [PATCH 039/194] fuzz test --- test/TermMaxToken.t.sol | 53 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/test/TermMaxToken.t.sol b/test/TermMaxToken.t.sol index 26ef4be..c6165d1 100644 --- a/test/TermMaxToken.t.sol +++ b/test/TermMaxToken.t.sol @@ -231,4 +231,57 @@ contract TermMaxTokenTest is Test { termMaxToken.withdrawIncomeAssets(address(invalidToken), admin, 100e6); vm.stopPrank(); } + + function testTermMaxTokenFuzzActions() public { + vm.prank(admin); + termMaxToken.updateBufferConfigAndAddReserves( + 0, StakingBuffer.BufferConfig({minimumBuffer: 500e6, maximumBuffer: 1000e6, buffer: 700e6}) + ); + + address[] memory accounts = new address[](10); + for (uint256 i = 0; i < accounts.length; i++) { + accounts[i] = vm.addr(i + 1); // Create unique addresses for each account + } + uint256 totalInterest = 0; + for (uint256 i = 0; i < 1000; i++) { + uint256 amount = vm.randomUint(1e6, 1000000e6); + address account = accounts[vm.randomUint(0, accounts.length - 1)]; + vm.startPrank(account); + uint256 action = vm.randomUint(0, 2); // 0 for mint, 1 for burn + + uint256 underlyingBalanceBefore = underlying.balanceOf(account); + uint256 tmxTokenBalanceBefore = termMaxToken.balanceOf(account); + if (action == 0 || tmxTokenBalanceBefore < amount) { + if (underlyingBalanceBefore < amount) { + underlying.mint(account, amount - underlyingBalanceBefore); + } + // Mint action + underlying.mint(account, amount); + underlying.approve(address(termMaxToken), amount); + termMaxToken.mint(account, amount); + assertEq(termMaxToken.balanceOf(account), amount + tmxTokenBalanceBefore); + } else { + // Burn action + if (termMaxToken.balanceOf(account) >= amount) { + termMaxToken.burn(account, amount); + assertEq(termMaxToken.balanceOf(account), tmxTokenBalanceBefore - amount); + assertEq(underlying.balanceOf(account), underlyingBalanceBefore + amount); + } + } + + // Simulate interest accrual + uint256 rate = vm.randomUint(0.01e8, 0.1e8); + uint256 aTokenBalanceBefore = aavePool.balanceOf(address(termMaxToken)); + uint256 interest = (aTokenBalanceBefore * rate) / 1e8; // Interest accrued + aavePool.simulateInterestAccrual(address(termMaxToken), interest); + totalInterest += interest; + vm.stopPrank(); + } + + assertEq(termMaxToken.totalIncomeAssets(), totalInterest); + assertEq( + underlying.balanceOf(address(termMaxToken)) + aavePool.balanceOf(address(termMaxToken)), + totalInterest + termMaxToken.totalSupply() + ); + } } From 1877c54141294a1e10a0c85bfe681078cd3bda9b Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 27 May 2025 15:22:08 +0800 Subject: [PATCH 040/194] add ut for revert situation --- test/TermMaxToken.t.sol | 153 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 153 insertions(+) diff --git a/test/TermMaxToken.t.sol b/test/TermMaxToken.t.sol index c6165d1..06b23c2 100644 --- a/test/TermMaxToken.t.sol +++ b/test/TermMaxToken.t.sol @@ -6,6 +6,7 @@ import {Test} from "forge-std/Test.sol"; import {MockAave} from "contracts/test/MockAave.sol"; import {MockERC20} from "contracts/test/MockERC20.sol"; import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import {IERC20Errors} from "@openzeppelin/contracts/interfaces/draft-IERC6093.sol"; contract TermMaxTokenTest is Test { TermMaxToken public termMaxToken; @@ -17,6 +18,10 @@ contract TermMaxTokenTest is Test { underlying = new MockERC20("USDC", "USDC", 6); aavePool = new MockAave(address(underlying)); + vm.label(address(underlying), "USDC"); + vm.label(address(aavePool), "AavePool"); + vm.label(admin, "Admin"); + address implementation = address(new TermMaxToken(address(aavePool), 0)); termMaxToken = TermMaxToken( address( @@ -31,6 +36,8 @@ contract TermMaxTokenTest is Test { ) ) ); + + vm.label(address(termMaxToken), "tmxUSDC"); } function testMint() public { @@ -232,6 +239,152 @@ contract TermMaxTokenTest is Test { vm.stopPrank(); } + function testInvalidBufferConfiguration() public { + vm.startPrank(admin); + + // Test minimum buffer greater than maximum buffer + vm.expectRevert(abi.encodeWithSelector(StakingBuffer.InvalidBuffer.selector, 10000e6, 5000e6, 7500e6)); + termMaxToken.updateBufferConfigAndAddReserves( + 0, StakingBuffer.BufferConfig({minimumBuffer: 10000e6, maximumBuffer: 5000e6, buffer: 7500e6}) + ); + + // Test buffer outside min/max range (below minimum) + vm.expectRevert(abi.encodeWithSelector(StakingBuffer.InvalidBuffer.selector, 5000e6, 10000e6, 4000e6)); + termMaxToken.updateBufferConfigAndAddReserves( + 0, StakingBuffer.BufferConfig({minimumBuffer: 5000e6, maximumBuffer: 10000e6, buffer: 4000e6}) + ); + + // Test buffer outside min/max range (above maximum) + vm.expectRevert(abi.encodeWithSelector(StakingBuffer.InvalidBuffer.selector, 5000e6, 10000e6, 11000e6)); + termMaxToken.updateBufferConfigAndAddReserves( + 0, StakingBuffer.BufferConfig({minimumBuffer: 5000e6, maximumBuffer: 10000e6, buffer: 11000e6}) + ); + + vm.stopPrank(); + } + + function testUnauthorizedAccess() public { + address unauthorizedUser = vm.randomAddress(); + + // Test unauthorized buffer config update + vm.startPrank(unauthorizedUser); + vm.expectRevert(); + termMaxToken.updateBufferConfigAndAddReserves( + 0, StakingBuffer.BufferConfig({minimumBuffer: 2000e6, maximumBuffer: 20000e6, buffer: 10000e6}) + ); + vm.stopPrank(); + + // Test unauthorized income withdrawal + vm.startPrank(unauthorizedUser); + vm.expectRevert(); + termMaxToken.withdrawIncomeAssets(address(termMaxToken), unauthorizedUser, 100e6); + vm.stopPrank(); + } + + function testBurnToATokenInsufficientStaking() public { + uint256 amount = 1000e6; + underlying.mint(address(this), amount); + underlying.approve(address(termMaxToken), amount); + termMaxToken.mint(address(this), amount); + + // Should revert when trying to burn to aToken without sufficient staking buffer + vm.expectRevert( + abi.encodeWithSelector(IERC20Errors.ERC20InsufficientBalance.selector, address(termMaxToken), 0, amount) + ); + termMaxToken.burnToAToken(address(this), amount); + } + + function testBurnToATokenExceedsBalance() public { + uint256 amount = 1000e6; + underlying.mint(address(this), amount * 20); + underlying.approve(address(termMaxToken), amount * 20); + termMaxToken.mint(address(this), amount * 20); + + // Should revert when trying to burn more than balance + vm.expectRevert( + abi.encodeWithSelector( + IERC20Errors.ERC20InsufficientBalance.selector, address(this), amount * 20, amount * 21 + ) + ); + termMaxToken.burnToAToken(address(this), amount * 21); + } + + function testMintWithInsufficientApproval() public { + uint256 amount = 1000e6; + underlying.mint(address(this), amount); + underlying.approve(address(termMaxToken), amount - 1); // Insufficient approval + + vm.expectRevert( + abi.encodeWithSelector( + IERC20Errors.ERC20InsufficientAllowance.selector, address(termMaxToken), amount - 1, amount + ) + ); + termMaxToken.mint(address(this), amount); + } + + function testBurnWithInsufficientBalance() public { + uint256 amount = 1000e6; + underlying.mint(address(this), amount); + underlying.approve(address(termMaxToken), amount); + termMaxToken.mint(address(this), amount); + + // Try to burn more than balance + vm.expectRevert( + abi.encodeWithSelector(IERC20Errors.ERC20InsufficientBalance.selector, address(this), amount, amount + 1) + ); + termMaxToken.burn(address(this), amount + 1); + } + + function testWithdrawIncomeToZeroAddress() public { + uint256 amount = 1000e6; + underlying.mint(address(this), amount); + underlying.approve(address(termMaxToken), amount); + termMaxToken.mint(address(this), amount); + + uint256 yieldAmount = 100e6; + aavePool.simulateInterestAccrual(address(termMaxToken), yieldAmount); + + vm.startPrank(admin); + vm.expectRevert(abi.encodeWithSelector(IERC20Errors.ERC20InvalidReceiver.selector, address(0))); + termMaxToken.withdrawIncomeAssets(address(underlying), address(0), yieldAmount); + vm.stopPrank(); + } + + function testMintToZeroAddress() public { + uint256 amount = 1000e6; + underlying.mint(address(this), amount); + underlying.approve(address(termMaxToken), amount); + + vm.expectRevert(abi.encodeWithSelector(IERC20Errors.ERC20InvalidReceiver.selector, address(0))); + termMaxToken.mint(address(0), amount); + } + + function testBurnToZeroAddress() public { + uint256 amount = 1000e6; + underlying.mint(address(this), amount); + underlying.approve(address(termMaxToken), amount); + termMaxToken.mint(address(this), amount); + vm.expectRevert(abi.encodeWithSelector(IERC20Errors.ERC20InvalidReceiver.selector, address(0))); + termMaxToken.burn(address(0), amount); + } + + function testUpdateBufferWithInsufficientBalance() public { + uint256 additionalReserves = 500e6; + // Don't mint tokens to admin + + vm.startPrank(admin); + underlying.approve(address(termMaxToken), additionalReserves); + + StakingBuffer.BufferConfig memory newConfig = + StakingBuffer.BufferConfig({minimumBuffer: 2000e6, maximumBuffer: 20000e6, buffer: 10000e6}); + + vm.expectRevert( + abi.encodeWithSelector(IERC20Errors.ERC20InsufficientBalance.selector, admin, 0, additionalReserves) + ); + termMaxToken.updateBufferConfigAndAddReserves(additionalReserves, newConfig); + vm.stopPrank(); + } + function testTermMaxTokenFuzzActions() public { vm.prank(admin); termMaxToken.updateBufferConfigAndAddReserves( From da560796e9116c3d890b7263a7a19785acf725ea Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 27 May 2025 16:26:34 +0800 Subject: [PATCH 041/194] add v1 contracts --- contracts/extensions/StakingBuffer.sol | 38 - .../extensions/aave/TermMaxAaveVault.sol | 72 -- contracts/v1/IFlashLoanReceiver.sol | 21 + contracts/v1/ISwapCallback.sol | 18 + contracts/v1/ITermMaxMarket.sol | 103 +++ contracts/v1/ITermMaxOrder.sol | 100 +++ contracts/v1/TermMaxMarket.sol | 389 +++++++++ contracts/v1/TermMaxOrder.sol | 782 ++++++++++++++++++ contracts/v1/access/AccessManager.sol | 186 +++++ contracts/v1/errors/FactoryErrors.sol | 19 + contracts/v1/errors/GearingTokenErrors.sol | 48 ++ contracts/v1/errors/MarketErrors.sol | 36 + contracts/v1/errors/OrderErrors.sol | 96 +++ contracts/v1/errors/RouterErrors.sol | 27 + contracts/v1/errors/VaultErrors.sol | 134 +++ contracts/v1/events/FactoryEvents.sol | 34 + contracts/v1/events/GearingTokenEvents.sol | 51 ++ contracts/v1/events/MarketEvents.sol | 131 +++ contracts/v1/events/OrderEvents.sol | 108 +++ contracts/v1/events/RouterEvents.sol | 181 ++++ contracts/v1/events/VaultEvents.sol | 199 +++++ contracts/v1/extensions/PTWithPriceFeed.sol | 122 +++ contracts/v1/extensions/PendleHelper.sol | 40 + .../v1/extensions/PriceFeedConverter.sol | 61 ++ contracts/v1/extensions/PriceFeedFactory.sol | 34 + .../v1/extensions/PriceFeedWithERC4626.sol | 61 ++ contracts/v1/factory/ITermMaxFactory.sol | 31 + contracts/v1/factory/IVaultFactory.sol | 41 + contracts/v1/factory/TermMaxFactory.sol | 74 ++ contracts/v1/factory/VaultFactory.sol | 54 ++ contracts/v1/lib/ArrayUtils.sol | 22 + contracts/v1/lib/Constants.sol | 21 + contracts/v1/lib/GearingTokenConstants.sol | 16 + contracts/v1/lib/LinkedList.sol | 37 + contracts/v1/lib/MarketConstants.sol | 8 + contracts/v1/lib/MathLib.sol | 152 ++++ contracts/v1/lib/PendingLib.sol | 38 + contracts/v1/lib/StringUtil.sol | 8 + contracts/v1/lib/TermMaxCurve.sol | 391 +++++++++ contracts/v1/lib/TransferUtils.sol | 45 + contracts/v1/lib/VaultConstants.sol | 22 + contracts/v1/oracle/IOracle.sol | 26 + contracts/v1/oracle/OracleAggregator.sol | 115 +++ contracts/v1/router/ISwapAdapter.sol | 49 ++ contracts/v1/router/ITermMaxRouter.sol | 317 +++++++ contracts/v1/router/MarketViewer.sol | 333 ++++++++ contracts/v1/router/TermMaxRouter.sol | 562 +++++++++++++ .../router/swapAdapters/ERC20SwapAdapter.sol | 80 ++ .../swapAdapters/ERC4626VaultAdapter.sol | 50 ++ .../swapAdapters/KyberswapV2Adapter.sol | 45 + .../v1/router/swapAdapters/OdosV2Adapter.sol | 60 ++ .../swapAdapters/PendleSwapV3Adapter.sol | 68 ++ .../router/swapAdapters/UniswapV3Adapter.sol | 43 + contracts/v1/storage/TermMaxStorage.sol | 124 +++ contracts/v1/test/MockERC20.sol | 20 + contracts/v1/test/MockFlashLoanReceiver.sol | 39 + contracts/v1/test/MockFlashRepayer.sol | 29 + contracts/v1/test/MockOrder.sol | 321 +++++++ contracts/v1/test/MockPriceFeed.sol | 68 ++ contracts/v1/test/MockSwapAdapter.sol | 27 + contracts/v1/test/testnet/Faucet.sol | 109 +++ contracts/v1/test/testnet/FaucetERC20.sol | 24 + contracts/v1/test/testnet/SwapAdapter.sol | 41 + contracts/v1/tokens/AbstractGearingToken.sol | 545 ++++++++++++ contracts/v1/tokens/GearingTokenWithERC20.sol | 230 ++++++ contracts/v1/tokens/IFlashRepayer.sol | 25 + contracts/v1/tokens/IGearingToken.sol | 125 +++ contracts/v1/tokens/IMintableERC20.sol | 38 + contracts/v1/tokens/MintableERC20.sol | 56 ++ contracts/v1/vault/IOrderManager.sol | 98 +++ contracts/v1/vault/ITermMaxVault.sol | 296 +++++++ contracts/v1/vault/OrderManager.sol | 395 +++++++++ contracts/v1/vault/TermMaxVault.sol | 748 +++++++++++++++++ contracts/v1/vault/VaultStorage.sol | 58 ++ 74 files changed, 9105 insertions(+), 110 deletions(-) delete mode 100644 contracts/extensions/StakingBuffer.sol delete mode 100644 contracts/extensions/aave/TermMaxAaveVault.sol create mode 100644 contracts/v1/IFlashLoanReceiver.sol create mode 100644 contracts/v1/ISwapCallback.sol create mode 100644 contracts/v1/ITermMaxMarket.sol create mode 100644 contracts/v1/ITermMaxOrder.sol create mode 100644 contracts/v1/TermMaxMarket.sol create mode 100644 contracts/v1/TermMaxOrder.sol create mode 100644 contracts/v1/access/AccessManager.sol create mode 100644 contracts/v1/errors/FactoryErrors.sol create mode 100644 contracts/v1/errors/GearingTokenErrors.sol create mode 100644 contracts/v1/errors/MarketErrors.sol create mode 100644 contracts/v1/errors/OrderErrors.sol create mode 100644 contracts/v1/errors/RouterErrors.sol create mode 100644 contracts/v1/errors/VaultErrors.sol create mode 100644 contracts/v1/events/FactoryEvents.sol create mode 100644 contracts/v1/events/GearingTokenEvents.sol create mode 100644 contracts/v1/events/MarketEvents.sol create mode 100644 contracts/v1/events/OrderEvents.sol create mode 100644 contracts/v1/events/RouterEvents.sol create mode 100644 contracts/v1/events/VaultEvents.sol create mode 100644 contracts/v1/extensions/PTWithPriceFeed.sol create mode 100644 contracts/v1/extensions/PendleHelper.sol create mode 100644 contracts/v1/extensions/PriceFeedConverter.sol create mode 100644 contracts/v1/extensions/PriceFeedFactory.sol create mode 100644 contracts/v1/extensions/PriceFeedWithERC4626.sol create mode 100644 contracts/v1/factory/ITermMaxFactory.sol create mode 100644 contracts/v1/factory/IVaultFactory.sol create mode 100644 contracts/v1/factory/TermMaxFactory.sol create mode 100644 contracts/v1/factory/VaultFactory.sol create mode 100644 contracts/v1/lib/ArrayUtils.sol create mode 100644 contracts/v1/lib/Constants.sol create mode 100644 contracts/v1/lib/GearingTokenConstants.sol create mode 100644 contracts/v1/lib/LinkedList.sol create mode 100644 contracts/v1/lib/MarketConstants.sol create mode 100644 contracts/v1/lib/MathLib.sol create mode 100644 contracts/v1/lib/PendingLib.sol create mode 100644 contracts/v1/lib/StringUtil.sol create mode 100644 contracts/v1/lib/TermMaxCurve.sol create mode 100644 contracts/v1/lib/TransferUtils.sol create mode 100644 contracts/v1/lib/VaultConstants.sol create mode 100644 contracts/v1/oracle/IOracle.sol create mode 100644 contracts/v1/oracle/OracleAggregator.sol create mode 100644 contracts/v1/router/ISwapAdapter.sol create mode 100644 contracts/v1/router/ITermMaxRouter.sol create mode 100644 contracts/v1/router/MarketViewer.sol create mode 100644 contracts/v1/router/TermMaxRouter.sol create mode 100644 contracts/v1/router/swapAdapters/ERC20SwapAdapter.sol create mode 100644 contracts/v1/router/swapAdapters/ERC4626VaultAdapter.sol create mode 100644 contracts/v1/router/swapAdapters/KyberswapV2Adapter.sol create mode 100644 contracts/v1/router/swapAdapters/OdosV2Adapter.sol create mode 100644 contracts/v1/router/swapAdapters/PendleSwapV3Adapter.sol create mode 100644 contracts/v1/router/swapAdapters/UniswapV3Adapter.sol create mode 100644 contracts/v1/storage/TermMaxStorage.sol create mode 100644 contracts/v1/test/MockERC20.sol create mode 100644 contracts/v1/test/MockFlashLoanReceiver.sol create mode 100644 contracts/v1/test/MockFlashRepayer.sol create mode 100644 contracts/v1/test/MockOrder.sol create mode 100644 contracts/v1/test/MockPriceFeed.sol create mode 100644 contracts/v1/test/MockSwapAdapter.sol create mode 100644 contracts/v1/test/testnet/Faucet.sol create mode 100644 contracts/v1/test/testnet/FaucetERC20.sol create mode 100644 contracts/v1/test/testnet/SwapAdapter.sol create mode 100644 contracts/v1/tokens/AbstractGearingToken.sol create mode 100644 contracts/v1/tokens/GearingTokenWithERC20.sol create mode 100644 contracts/v1/tokens/IFlashRepayer.sol create mode 100644 contracts/v1/tokens/IGearingToken.sol create mode 100644 contracts/v1/tokens/IMintableERC20.sol create mode 100644 contracts/v1/tokens/MintableERC20.sol create mode 100644 contracts/v1/vault/IOrderManager.sol create mode 100644 contracts/v1/vault/ITermMaxVault.sol create mode 100644 contracts/v1/vault/OrderManager.sol create mode 100644 contracts/v1/vault/TermMaxVault.sol create mode 100644 contracts/v1/vault/VaultStorage.sol diff --git a/contracts/extensions/StakingBuffer.sol b/contracts/extensions/StakingBuffer.sol deleted file mode 100644 index f6ce74a..0000000 --- a/contracts/extensions/StakingBuffer.sol +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {TransferUtils, IERC20} from "contracts/lib/TransferUtils.sol"; - -abstract contract StakingBuffer { - using TransferUtils for IERC20; - - error InvalidBuffer(uint256 minimumBuffer, uint256 maximumBuffer, uint256 buffer); - - struct BufferConfig { - uint256 minimumBuffer; - uint256 maximumBuffer; - uint256 buffer; - } - - function _depositWithBuffer(address assetAddr, uint256 amount) internal { - uint256 assetBalance = IERC20(assetAddr).balanceOf(address(this)); - BufferConfig memory bufferConfig = _bufferConfig(assetAddr); - if (assetBalance + amount > bufferConfig.maximumBuffer) { - _depositToPool(assetAddr, assetBalance + amount - bufferConfig.buffer); - } - } - - function _withdrawWithBuffer(address assetAddr, address to, uint256 amount) internal { - uint256 assetBalance = IERC20(assetAddr).balanceOf(address(this)); - BufferConfig memory bufferConfig = _bufferConfig(assetAddr); - if (assetBalance < amount || assetBalance - amount < bufferConfig.minimumBuffer) { - _withdrawFromPool(assetAddr, to, bufferConfig.buffer + amount - assetBalance); - } - } - - function _bufferConfig(address assetAddr) internal view virtual returns (BufferConfig memory); - - function _depositToPool(address assetAddr, uint256 amount) internal virtual; - - function _withdrawFromPool(address assetAddr, address to, uint256 amount) internal virtual; -} diff --git a/contracts/extensions/aave/TermMaxAaveVault.sol b/contracts/extensions/aave/TermMaxAaveVault.sol deleted file mode 100644 index adbc014..0000000 --- a/contracts/extensions/aave/TermMaxAaveVault.sol +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import { - IERC4626, - IERC20, - ERC4626Upgradeable, - ERC20Upgradeable -} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC4626Upgradeable.sol"; -import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; -import {TransferUtils} from "contracts/lib/TransferUtils.sol"; -import {IAaveV3Minimal} from "./IAaveV3Minimal.sol"; -import {StakingBuffer} from "contracts/extensions/StakingBuffer.sol"; - -contract TermMaxAaveVault is ERC4626Upgradeable, StakingBuffer, ReentrancyGuardUpgradeable { - using TransferUtils for address; - - IERC20 public aToken; - IAaveV3Minimal public aavePool; - uint16 public referralCode; - - function initialize( - string memory name_, - string memory symbol_, - address underlyingAsset_, - address aavePool_, - uint16 referralCode_ - ) external initializer { - __ERC20_init(name_, symbol_); - __ERC4626_init(IERC20(underlyingAsset_)); - __ReentrancyGuard_init(); - - aavePool = IAaveV3Minimal(aavePool_); - aToken = IERC20(aavePool.getReserveData(underlyingAsset_).aTokenAddress); - referralCode = referralCode_; - } - - function totalAssets() public view override returns (uint256) { - return aToken.balanceOf(address(this)) + IERC20(asset()).balanceOf(address(this)); - } - - function _deposit(address caller, address receiver, uint256 assets, uint256 shares) internal override { - TransferUtils.safeTransferFrom(IERC20(asset()), caller, address(this), assets); - _mint(receiver, shares); - _depositWithBuffer(asset(), assets); - emit Deposit(caller, receiver, assets, shares); - } - - function _withdraw(address caller, address receiver, address owner, uint256 assets, uint256 shares) - internal - override - { - if (caller != owner) { - _spendAllowance(owner, caller, shares); - } - - _burn(owner, shares); - _withdrawWithBuffer(asset(), receiver, assets); - - emit Withdraw(caller, receiver, owner, assets, shares); - } - - function _bufferConfig(address assertAddr) internal view virtual override returns (BufferConfig memory) {} - - function _depositToPool(address assertAddr, uint256 amount) internal virtual override { - aavePool.supply(assertAddr, amount, address(this), referralCode); - } - - function _withdrawFromPool(address assertAddr, address to, uint256 amount) internal virtual override { - aavePool.withdraw(assertAddr, amount, to); - } -} diff --git a/contracts/v1/IFlashLoanReceiver.sol b/contracts/v1/IFlashLoanReceiver.sol new file mode 100644 index 0000000..56c9742 --- /dev/null +++ b/contracts/v1/IFlashLoanReceiver.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +/** + * @title The interface of flash loan in TermMax + * @author Term Structure Labs + */ +interface IFlashLoanReceiver { + /// @notice Execute operation to be called in flash loan function + /// @dev Add your operations logic here + /// @param gtReceiver Who will receive Gearing Token + /// @param asset Asset to be flash loaned + /// @param amount Amount to be flash loaned + /// @param data Data to be passed to the receiver + /// @return collateralData Collateral data for borrowing + function executeOperation(address gtReceiver, IERC20 asset, uint256 amount, bytes calldata data) + external + returns (bytes memory collateralData); +} diff --git a/contracts/v1/ISwapCallback.sol b/contracts/v1/ISwapCallback.sol new file mode 100644 index 0000000..4f3e615 --- /dev/null +++ b/contracts/v1/ISwapCallback.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title TermMax Swap Callback Interface + * @author Term Structure Labs + * @notice Interface for handling callbacks after swap operations in TermMax + */ +interface ISwapCallback { + /** + * @notice Callback function called after a swap operation + * @param ftReserve The reserve of the FT token + * @param xtReserve The reserve of the XT token + * @param deltaFt The change in FT token balance (positive for receiving, negative for paying) + * @param deltaXt The change in XT token balance (positive for receiving, negative for paying) + */ + function afterSwap(uint256 ftReserve, uint256 xtReserve, int256 deltaFt, int256 deltaXt) external; +} diff --git a/contracts/v1/ITermMaxMarket.sol b/contracts/v1/ITermMaxMarket.sol new file mode 100644 index 0000000..186cbe2 --- /dev/null +++ b/contracts/v1/ITermMaxMarket.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IMintableERC20, IERC20} from "./tokens/IMintableERC20.sol"; +import {IGearingToken} from "./tokens/IGearingToken.sol"; +import {ITermMaxOrder} from "./ITermMaxOrder.sol"; +import {MarketConfig, MarketInitialParams, CurveCuts, FeeConfig} from "./storage/TermMaxStorage.sol"; +import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol"; +import {ISwapCallback} from "./ISwapCallback.sol"; + +/** + * @title TermMax Market interface + * @author Term Structure Labs + */ +interface ITermMaxMarket { + /// @notice Initialize the token and configuration of the market + function initialize(MarketInitialParams memory params) external; + + /// @notice Return the configuration + function config() external view returns (MarketConfig memory); + + /// @notice Set the market configuration + function updateMarketConfig(MarketConfig calldata newConfig) external; + + /// @notice Return the tokens in TermMax Market + /// @return ft Fixed-rate Token(bond token). Earning Fixed Income with High Certainty + /// @return xt Intermediary Token for Collateralization and Leveragin + /// @return gt Gearing Token + /// @return collateral Collateral token + /// @return underlying Underlying Token(debt) + function tokens() + external + view + returns (IMintableERC20 ft, IMintableERC20 xt, IGearingToken gt, address collateral, IERC20 underlying); + + /// @notice Mint FT and XT tokens by underlying token. + /// No price slippage or handling fees. + /// @param debtTokenAmt Amount of underlying token want to lock + function mint(address recipient, uint256 debtTokenAmt) external; + + /// @notice Burn FT and XT to get underlying token. + /// No price slippage or handling fees. + /// @param debtTokenAmt Amount of underlying token want to get + function burn(address recipient, uint256 debtTokenAmt) external; + + /// @notice Using collateral to issue FT tokens. + /// Caller will get FT(bond) tokens equal to the debt amount subtract issue fee + /// @param debt The amount of debt, unit by underlying token + /// @param collateralData The encoded data of collateral + /// @return gtId The id of Gearing Token + /// + function issueFt(address recipient, uint128 debt, bytes calldata collateralData) + external + returns (uint256 gtId, uint128 ftOutAmt); + + /// @notice Return the issue fee ratio + function mintGtFeeRatio() external view returns (uint256); + + /// @notice Using collateral to issue FT tokens. + /// Caller will get FT(bond) tokens equal to the debt amount subtract issue fee + /// @param recipient Who will receive Gearing Token + /// @param debt The amount of debt, unit by underlying token + /// @param gtId The id of Gearing Token + /// @return ftOutAmt The amount of FT issued + /// + function issueFtByExistedGt(address recipient, uint128 debt, uint256 gtId) external returns (uint128 ftOutAmt); + + /// @notice Flash loan underlying token for leverage + /// @param recipient Who will receive Gearing Token + /// @param xtAmt The amount of XT token. + /// The caller will receive an equal amount of underlying token by flash loan. + /// @param callbackData The data of flash loan callback + /// @return gtId The id of Gearing Token + function leverageByXt(address recipient, uint128 xtAmt, bytes calldata callbackData) + external + returns (uint256 gtId); + + /// @notice Preview the redeem amount and delivery data + /// @param ftAmount The amount of FT want to redeem + /// @return debtTokenAmt The amount of debt token + /// @return deliveryData The delivery data + function previewRedeem(uint256 ftAmount) external view returns (uint256 debtTokenAmt, bytes memory deliveryData); + + /// @notice Redeem underlying tokens after maturity + /// @param ftAmount The amount of FT want to redeem + /// @param recipient Who will receive the underlying tokens + /// @return debtTokenAmt The amount of debt token + /// @return deliveryData The delivery data + function redeem(uint256 ftAmount, address recipient) + external + returns (uint256 debtTokenAmt, bytes memory deliveryData); + + /// @notice Set the configuration of Gearing Token + function updateGtConfig(bytes memory configData) external; + + /// @notice Set the fee rate of order + function updateOrderFeeRate(ITermMaxOrder order, FeeConfig memory newFeeConfig) external; + + /// @notice Create a new order + function createOrder(address maker, uint256 maxXtReserve, ISwapCallback swapTrigger, CurveCuts memory curveCuts) + external + returns (ITermMaxOrder order); +} diff --git a/contracts/v1/ITermMaxOrder.sol b/contracts/v1/ITermMaxOrder.sol new file mode 100644 index 0000000..cc3e460 --- /dev/null +++ b/contracts/v1/ITermMaxOrder.sol @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {IMintableERC20, IERC20} from "./tokens/IMintableERC20.sol"; +import {IGearingToken} from "./tokens/IGearingToken.sol"; +import {ITermMaxMarket} from "./ITermMaxMarket.sol"; +import {OrderConfig, MarketConfig, CurveCuts, FeeConfig} from "./storage/TermMaxStorage.sol"; +import {ISwapCallback} from "./ISwapCallback.sol"; + +/** + * @title TermMax Order interface + * @author Term Structure Labs + */ +interface ITermMaxOrder { + /// @notice Initialize the token and configuration of the order + /// @param maker The maker + /// @param tokens The tokens + /// @param gt The Gearing Token + /// @param maxXtReserve The maximum reserve of XT token + /// @param curveCuts The curve cuts + /// @param marketConfig The market configuration + /// @dev Only factory will call this function once when deploying new market + function initialize( + address maker, + IERC20[3] memory tokens, + IGearingToken gt, + uint256 maxXtReserve, + ISwapCallback trigger, + CurveCuts memory curveCuts, + MarketConfig memory marketConfig + ) external; + + /// @notice Return the configuration + function orderConfig() external view returns (OrderConfig memory); + + /// @notice Return the maker + function maker() external view returns (address); + + /// @notice Set the market configuration + /// @param newOrderConfig New order configuration + /// @param ftChangeAmt Change amount of FT reserve + /// @param xtChangeAmt Change amount of XT reserve + function updateOrder(OrderConfig memory newOrderConfig, int256 ftChangeAmt, int256 xtChangeAmt) external; + + function withdrawAssets(IERC20 token, address recipient, uint256 amount) external; + + function updateFeeConfig(FeeConfig memory newFeeConfig) external; + + /// @notice Return the token reserves + function tokenReserves() external view returns (uint256 ftReserve, uint256 xtReserve); + + /// @notice Return the tokens in TermMax Market + /// @return market The market + function market() external view returns (ITermMaxMarket market); + + /// @notice Return the current apr of the amm order book + /// @return lendApr Lend APR + /// @return borrowApr Borrow APR + function apr() external view returns (uint256 lendApr, uint256 borrowApr); + + /// @notice Swap exact token to token + /// @param tokenIn The token want to swap + /// @param tokenOut The token want to receive + /// @param recipient Who receive output tokens + /// @param tokenAmtIn The number of tokenIn tokens input + /// @param minTokenOut Minimum number of tokenOut token outputs required + /// @param deadline The timestamp after which the transaction will revert + /// @return netOut The actual number of tokenOut tokens received + function swapExactTokenToToken( + IERC20 tokenIn, + IERC20 tokenOut, + address recipient, + uint128 tokenAmtIn, + uint128 minTokenOut, + uint256 deadline + ) external returns (uint256 netOut); + + /// @notice Swap token to exact token + /// @param tokenIn The token want to swap + /// @param tokenOut The token want to receive + /// @param recipient Who receive output tokens + /// @param tokenAmtOut The number of tokenOut tokens output + /// @param maxTokenIn Maximum number of tokenIn token inputs required + /// @param deadline The timestamp after which the transaction will revert + /// @return netIn The actual number of tokenIn tokens input + function swapTokenToExactToken( + IERC20 tokenIn, + IERC20 tokenOut, + address recipient, + uint128 tokenAmtOut, + uint128 maxTokenIn, + uint256 deadline + ) external returns (uint256 netIn); + + /// @notice Suspension of market trading + function pause() external; + + /// @notice Open Market Trading + function unpause() external; +} diff --git a/contracts/v1/TermMaxMarket.sol b/contracts/v1/TermMaxMarket.sol new file mode 100644 index 0000000..feb3a95 --- /dev/null +++ b/contracts/v1/TermMaxMarket.sol @@ -0,0 +1,389 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.27; + +import { + OwnableUpgradeable, + Ownable2StepUpgradeable +} from "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; +import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; +import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol"; +import {ITermMaxMarket, IMintableERC20, IERC20} from "./ITermMaxMarket.sol"; +import {IGearingToken} from "./tokens/IGearingToken.sol"; +import {IFlashLoanReceiver} from "./IFlashLoanReceiver.sol"; +import {ITermMaxOrder} from "./ITermMaxOrder.sol"; +import {Constants} from "./lib/Constants.sol"; +import {MarketConstants} from "./lib/MarketConstants.sol"; +import {MarketErrors} from "./errors/MarketErrors.sol"; +import {MarketEvents} from "./events/MarketEvents.sol"; +import {StringUtil} from "./lib/StringUtil.sol"; +import {MarketConfig, MarketInitialParams, GtConfig, CurveCuts, FeeConfig} from "./storage/TermMaxStorage.sol"; +import {ISwapCallback} from "./ISwapCallback.sol"; +import {TransferUtils} from "./lib/TransferUtils.sol"; + +/** + * @title TermMax Market + * @author Term Structure Labs + */ +contract TermMaxMarket is + ITermMaxMarket, + ReentrancyGuardUpgradeable, + Ownable2StepUpgradeable, + MarketErrors, + MarketEvents +{ + using SafeCast for uint256; + using SafeCast for int256; + using TransferUtils for IERC20; + using TransferUtils for IMintableERC20; + using StringUtil for string; + + address immutable MINTABLE_ERC20_IMPLEMENT; + address immutable TERMMAX_ORDER_IMPLEMENT; + + MarketConfig private _config; + address private collateral; + IERC20 private debtToken; + IMintableERC20 private ft; + IMintableERC20 private xt; + IGearingToken private gt; + + /// @notice Check if the market is tradable + modifier isOpen() { + if (block.timestamp >= _config.maturity) { + revert TermIsNotOpen(); + } + _; + } + + constructor(address MINTABLE_ERC20_IMPLEMENT_, address TERMMAX_ORDER_IMPLEMENT_) { + MINTABLE_ERC20_IMPLEMENT = MINTABLE_ERC20_IMPLEMENT_; + TERMMAX_ORDER_IMPLEMENT = TERMMAX_ORDER_IMPLEMENT_; + _disableInitializers(); + } + + function mintGtFeeRatio() public view override returns (uint256) { + uint256 daysToMaturity = _daysToMaturity(_config.maturity); + return (daysToMaturity * uint256(_config.feeConfig.mintGtFeeRatio) * uint256(_config.feeConfig.mintGtFeeRef)) + / (Constants.DAYS_IN_YEAR * Constants.DECIMAL_BASE + uint256(_config.feeConfig.mintGtFeeRef) * daysToMaturity); + } + + /** + * @inheritdoc ITermMaxMarket + */ + function initialize(MarketInitialParams memory params) external override initializer { + __Ownable_init(params.admin); + __ReentrancyGuard_init(); + if (params.collateral == address(params.debtToken)) revert CollateralCanNotEqualUnderlyinng(); + MarketConfig memory config_ = params.marketConfig; + if (config_.maturity <= block.timestamp) revert InvalidMaturity(); + _checkFee(config_.feeConfig); + + debtToken = params.debtToken; + collateral = params.collateral; + _config = config_; + + (ft, xt, gt) = _deployTokens(params); + + emit MarketInitialized(params.collateral, params.debtToken, _config.maturity, ft, xt, gt); + } + + function _deployTokens(MarketInitialParams memory params) + internal + returns (IMintableERC20 ft_, IMintableERC20 xt_, IGearingToken gt_) + { + ft_ = IMintableERC20(Clones.clone(MINTABLE_ERC20_IMPLEMENT)); + xt_ = IMintableERC20(Clones.clone(MINTABLE_ERC20_IMPLEMENT)); + gt_ = IGearingToken(Clones.clone(params.gtImplementation)); + uint8 decimals = params.debtToken.decimals(); + ft_.initialize( + MarketConstants.PREFIX_FT.contact(params.tokenName), + MarketConstants.PREFIX_FT.contact(params.tokenSymbol), + decimals + ); + xt_.initialize( + MarketConstants.PREFIX_XT.contact(params.tokenName), + MarketConstants.PREFIX_XT.contact(params.tokenSymbol), + decimals + ); + gt_.initialize( + MarketConstants.PREFIX_GT.contact(params.tokenName), + MarketConstants.PREFIX_GT.contact(params.tokenSymbol), + GtConfig( + params.collateral, + params.debtToken, + ft_, + params.marketConfig.treasurer, + params.marketConfig.maturity, + params.loanConfig + ), + params.gtInitalParams + ); + } + + function _contactString(string memory a, string memory b) internal pure returns (string memory) { + return string(abi.encodePacked(a, b)); + } + + /** + * @inheritdoc ITermMaxMarket + */ + function config() public view override returns (MarketConfig memory) { + return _config; + } + + /** + * @inheritdoc ITermMaxMarket + */ + function tokens() external view override returns (IMintableERC20, IMintableERC20, IGearingToken, address, IERC20) { + return (ft, xt, gt, collateral, debtToken); + } + + /** + * @inheritdoc ITermMaxMarket + */ + function updateMarketConfig(MarketConfig calldata newConfig) external override onlyOwner { + MarketConfig memory mConfig = _config; + if (newConfig.treasurer != mConfig.treasurer) { + mConfig.treasurer = newConfig.treasurer; + gt.setTreasurer(newConfig.treasurer); + } + _checkFee(newConfig.feeConfig); + mConfig.feeConfig = newConfig.feeConfig; + + _config = mConfig; + emit UpdateMarketConfig(mConfig); + } + + function _checkFee(FeeConfig memory fee) internal pure { + if ( + fee.borrowTakerFeeRatio >= Constants.MAX_FEE_RATIO || fee.borrowMakerFeeRatio >= Constants.MAX_FEE_RATIO + || fee.lendTakerFeeRatio >= Constants.MAX_FEE_RATIO || fee.lendMakerFeeRatio >= Constants.MAX_FEE_RATIO + || fee.mintGtFeeRatio >= Constants.MAX_FEE_RATIO || fee.mintGtFeeRef > 5 * Constants.DECIMAL_BASE + ) revert FeeTooHigh(); + } + + /// @notice Calculate how many days until expiration + function _daysToMaturity(uint256 maturity) internal view returns (uint256 daysToMaturity) { + daysToMaturity = (maturity - block.timestamp + Constants.SECONDS_IN_DAY - 1) / Constants.SECONDS_IN_DAY; + } + + function mint(address recipient, uint256 debtTokenAmt) external override nonReentrant isOpen { + _mint(msg.sender, recipient, debtTokenAmt); + } + + function _mint(address caller, address recipient, uint256 debtTokenAmt) internal { + debtToken.safeTransferFrom(caller, address(this), debtTokenAmt); + + ft.mint(recipient, debtTokenAmt); + xt.mint(recipient, debtTokenAmt); + + emit Mint(caller, recipient, debtTokenAmt); + } + + function burn(address recipient, uint256 debtTokenAmt) external override nonReentrant isOpen { + _burn(msg.sender, recipient, debtTokenAmt); + } + + function _burn(address caller, address recipient, uint256 debtTokenAmt) internal { + ft.safeTransferFrom(caller, address(this), debtTokenAmt); + xt.safeTransferFrom(caller, address(this), debtTokenAmt); + + ft.burn(debtTokenAmt); + xt.burn(debtTokenAmt); + + debtToken.safeTransfer(recipient, debtTokenAmt); + + emit Burn(caller, recipient, debtTokenAmt); + } + + /** + * @inheritdoc ITermMaxMarket + */ + function leverageByXt(address recipient, uint128 xtAmt, bytes calldata callbackData) + external + override + nonReentrant + isOpen + returns (uint256 gtId) + { + return _leverageByXt(msg.sender, recipient, xtAmt, callbackData); + } + + function _leverageByXt(address loanReceiver, address gtReceiver, uint128 xtAmt, bytes calldata callbackData) + internal + returns (uint256 gtId) + { + xt.safeTransferFrom(loanReceiver, address(this), xtAmt); + + // Send debt to borrower + debtToken.safeTransfer(loanReceiver, xtAmt); + // Callback function + bytes memory collateralData = + IFlashLoanReceiver(loanReceiver).executeOperation(gtReceiver, debtToken, xtAmt, callbackData); + + uint128 debt = ((xtAmt * Constants.DECIMAL_BASE) / (Constants.DECIMAL_BASE - mintGtFeeRatio())).toUint128(); + + MarketConfig memory mConfig = _config; + uint128 leverageFee = debt - xtAmt; + ft.mint(mConfig.treasurer, leverageFee); + + // Mint GT + gtId = gt.mint(loanReceiver, gtReceiver, debt, collateralData); + + xt.burn(xtAmt); + emit LeverageByXt(loanReceiver, gtReceiver, gtId, debt, xtAmt, leverageFee, collateralData); + } + + /** + * @inheritdoc ITermMaxMarket + */ + function issueFt(address recipient, uint128 debt, bytes calldata collateralData) + external + override + nonReentrant + isOpen + returns (uint256 gtId, uint128 ftOutAmt) + { + return _issueFt(msg.sender, recipient, debt, collateralData); + } + + function _issueFt(address caller, address recipient, uint128 debt, bytes calldata collateralData) + internal + returns (uint256 gtId, uint128 ftOutAmt) + { + // Mint GT + gtId = gt.mint(caller, recipient, debt, collateralData); + + MarketConfig memory mConfig = _config; + uint128 issueFee = ((debt * mintGtFeeRatio()) / Constants.DECIMAL_BASE).toUint128(); + // Mint ft amount = debt amount, send issueFee to treasurer and other to caller + ft.mint(mConfig.treasurer, issueFee); + ftOutAmt = debt - issueFee; + ft.mint(recipient, ftOutAmt); + + emit IssueFt(caller, recipient, gtId, debt, ftOutAmt, issueFee, collateralData); + } + + /** + * @inheritdoc ITermMaxMarket + */ + function issueFtByExistedGt(address recipient, uint128 debt, uint256 gtId) + external + override + nonReentrant + isOpen + returns (uint128 ftOutAmt) + { + return _issueFtByExistedGt(msg.sender, recipient, debt, gtId); + } + + function _issueFtByExistedGt(address caller, address recipient, uint128 debt, uint256 gtId) + internal + returns (uint128 ftOutAmt) + { + gt.augmentDebt(caller, gtId, debt); + + MarketConfig memory mConfig = _config; + uint128 issueFee = ((debt * mintGtFeeRatio()) / Constants.DECIMAL_BASE).toUint128(); + // Mint ft amount = debt amount, send issueFee to treasurer and other to caller + ft.mint(mConfig.treasurer, issueFee); + ftOutAmt = debt - issueFee; + ft.mint(recipient, ftOutAmt); + + emit IssueFtByExistedGt(caller, recipient, gtId, debt, ftOutAmt, issueFee); + } + + /** + * @inheritdoc ITermMaxMarket + */ + function previewRedeem(uint256 ftAmount) + external + view + override + returns (uint256 debtTokenAmt, bytes memory deliveryData) + { + MarketConfig memory mConfig = _config; + { + uint256 liquidationDeadline = + gt.liquidatable() ? mConfig.maturity + Constants.LIQUIDATION_WINDOW : mConfig.maturity; + if (block.timestamp < liquidationDeadline) { + revert CanNotRedeemBeforeFinalLiquidationDeadline(liquidationDeadline); + } + } + + // The proportion that user will get how many debtToken and collateral should be deliveried + uint256 proportion = (ftAmount * Constants.DECIMAL_BASE_SQ) / (ft.totalSupply() - ft.balanceOf(address(this))); + + deliveryData = gt.previewDelivery(proportion); + + debtTokenAmt = ((debtToken.balanceOf(address(this))) * proportion) / Constants.DECIMAL_BASE_SQ; + } + + /** + * @inheritdoc ITermMaxMarket + */ + function redeem(uint256 ftAmount, address recipient) + external + virtual + override + nonReentrant + returns (uint256, bytes memory) + { + return _redeem(msg.sender, recipient, ftAmount); + } + + function _redeem(address caller, address recipient, uint256 ftAmount) + internal + returns (uint256 debtTokenAmt, bytes memory deliveryData) + { + MarketConfig memory mConfig = _config; + { + uint256 liquidationDeadline = + gt.liquidatable() ? mConfig.maturity + Constants.LIQUIDATION_WINDOW : mConfig.maturity; + if (block.timestamp < liquidationDeadline) { + revert CanNotRedeemBeforeFinalLiquidationDeadline(liquidationDeadline); + } + } + + // Burn ft reserves + ft.burn(ft.balanceOf(address(this))); + + ft.safeTransferFrom(caller, address(this), ftAmount); + + // The proportion that user will get how many debtToken and collateral should be deliveried + uint256 proportion = (ftAmount * Constants.DECIMAL_BASE_SQ) / ft.totalSupply(); + + deliveryData = gt.delivery(proportion, recipient); + // Transfer debtToken output + debtTokenAmt += ((debtToken.balanceOf(address(this))) * proportion) / Constants.DECIMAL_BASE_SQ; + debtToken.safeTransfer(recipient, debtTokenAmt); + emit Redeem(caller, recipient, proportion.toUint128(), debtTokenAmt.toUint128(), deliveryData); + } + + /** + * @inheritdoc ITermMaxMarket + */ + function updateGtConfig(bytes memory configData) external override onlyOwner { + gt.updateConfig(configData); + } + + /** + * @inheritdoc ITermMaxMarket + */ + function createOrder(address maker, uint256 maxXtReserve, ISwapCallback swapTrigger, CurveCuts memory curveCuts) + external + nonReentrant + isOpen + returns (ITermMaxOrder order) + { + order = ITermMaxOrder(Clones.clone(TERMMAX_ORDER_IMPLEMENT)); + order.initialize(maker, [ft, xt, debtToken], gt, maxXtReserve, swapTrigger, curveCuts, _config); + emit CreateOrder(maker, order); + } + + function updateOrderFeeRate(ITermMaxOrder order, FeeConfig memory newFeeConfig) external onlyOwner { + _checkFee(newFeeConfig); + order.updateFeeConfig(newFeeConfig); + } +} diff --git a/contracts/v1/TermMaxOrder.sol b/contracts/v1/TermMaxOrder.sol new file mode 100644 index 0000000..e1d9c16 --- /dev/null +++ b/contracts/v1/TermMaxOrder.sol @@ -0,0 +1,782 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.27; + +import { + OwnableUpgradeable, + Ownable2StepUpgradeable +} from "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; +import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; +import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; +import {ITermMaxOrder, IERC20} from "./ITermMaxOrder.sol"; +import {ITermMaxMarket} from "./ITermMaxMarket.sol"; +import {IGearingToken} from "./tokens/IGearingToken.sol"; +import {IFlashLoanReceiver} from "./IFlashLoanReceiver.sol"; +import {Constants} from "./lib/Constants.sol"; +import {TermMaxCurve, MathLib} from "./lib/TermMaxCurve.sol"; +import {OrderErrors} from "./errors/OrderErrors.sol"; +import {OrderEvents} from "./events/OrderEvents.sol"; +import {OrderConfig, MarketConfig, CurveCuts, CurveCut, FeeConfig} from "./storage/TermMaxStorage.sol"; +import {ISwapCallback} from "./ISwapCallback.sol"; +import {TransferUtils} from "./lib/TransferUtils.sol"; + +/** + * @title TermMax Order + * @author Term Structure Labs + */ +contract TermMaxOrder is + ITermMaxOrder, + ReentrancyGuardUpgradeable, + Ownable2StepUpgradeable, + PausableUpgradeable, + OrderErrors, + OrderEvents +{ + using SafeCast for uint256; + using SafeCast for int256; + using TransferUtils for IERC20; + using MathLib for *; + + ITermMaxMarket public market; + + IERC20 private ft; + IERC20 private xt; + IERC20 private debtToken; + IGearingToken private gt; + + OrderConfig private _orderConfig; + + uint64 private maturity; + + uint256 private constant T_FT_RESERVE_STORE = 0; + uint256 private constant T_XT_RESERVE_STORE = 1; + + function setInitialFtReserve(uint256 ftReserve) private { + assembly { + tstore(T_FT_RESERVE_STORE, ftReserve) + } + } + + function setInitialXtReserve(uint256 xtReserve) private { + assembly { + tstore(T_XT_RESERVE_STORE, xtReserve) + } + } + + function getInitialFtReserve() private view returns (uint256 ftReserve) { + assembly { + ftReserve := tload(T_FT_RESERVE_STORE) + } + } + + function getInitialXtReserve() private view returns (uint256 xtReserve) { + assembly { + xtReserve := tload(T_XT_RESERVE_STORE) + } + } + + /// @notice Check if the market is borrowing allowed + modifier isBorrowingAllowed(OrderConfig memory config) { + if (config.curveCuts.lendCurveCuts.length == 0) { + revert BorrowIsNotAllowed(); + } + _; + } + + /// @notice Check if the market is lending allowed + modifier isLendingAllowed(OrderConfig memory config) { + if (config.curveCuts.borrowCurveCuts.length == 0) { + revert LendIsNotAllowed(); + } + _; + } + + /// @notice Check if the order is tradable + modifier isOpen() { + _requireNotPaused(); + if (block.timestamp >= maturity) { + revert TermIsNotOpen(); + } + _; + } + + modifier onlyMarket() { + if (msg.sender != address(market)) revert OnlyMarket(); + _; + } + + constructor() { + _disableInitializers(); + } + + function maker() public view returns (address) { + return owner(); + } + + /** + * @inheritdoc ITermMaxOrder + */ + function initialize( + address maker_, + IERC20[3] memory tokens, + IGearingToken gt_, + uint256 maxXtReserve_, + ISwapCallback swapTrigger, + CurveCuts memory curveCuts_, + MarketConfig memory marketConfig + ) external override initializer { + __Ownable_init(maker_); + __ReentrancyGuard_init(); + __Pausable_init(); + market = ITermMaxMarket(_msgSender()); + + // _orderConfig.curveCuts = curveCuts_; + _updateCurve(curveCuts_); + _orderConfig.feeConfig = marketConfig.feeConfig; + _orderConfig.maxXtReserve = maxXtReserve_; + _orderConfig.swapTrigger = swapTrigger; + maturity = marketConfig.maturity; + + ft = tokens[0]; + xt = tokens[1]; + debtToken = tokens[2]; + gt = gt_; + emit OrderInitialized(market, maker_, maxXtReserve_, swapTrigger, curveCuts_); + } + + /** + * @inheritdoc ITermMaxOrder + */ + function orderConfig() external view returns (OrderConfig memory) { + return _orderConfig; + } + + /** + * @inheritdoc ITermMaxOrder + */ + function tokenReserves() public view override returns (uint256, uint256) { + return (ft.balanceOf(address(this)), xt.balanceOf(address(this))); + } + + /** + * @inheritdoc ITermMaxOrder + */ + function apr() external view override returns (uint256 lendApr_, uint256 borrowApr_) { + uint256 daysToMaturity = _daysToMaturity(); + uint256 oriXtReserve = xt.balanceOf(address(this)); + + CurveCuts memory curveCuts = _orderConfig.curveCuts; + if (curveCuts.lendCurveCuts.length == 0) { + lendApr_ = 0; + } else { + uint256 lendCutId = TermMaxCurve.calcCutId(curveCuts.lendCurveCuts, oriXtReserve); + (, uint256 lendVXtReserve, uint256 lendVFtReserve) = TermMaxCurve.calcIntervalProps( + Constants.DECIMAL_BASE, daysToMaturity, curveCuts.lendCurveCuts[lendCutId], oriXtReserve + ); + lendApr_ = + ((lendVFtReserve * Constants.DECIMAL_BASE * Constants.DAYS_IN_YEAR) / (lendVXtReserve * daysToMaturity)); + } + if (curveCuts.borrowCurveCuts.length == 0) { + borrowApr_ = type(uint256).max; + } else { + uint256 borrowCutId = TermMaxCurve.calcCutId(curveCuts.borrowCurveCuts, oriXtReserve); + (, uint256 borrowVXtReserve, uint256 borrowVFtReserve) = TermMaxCurve.calcIntervalProps( + Constants.DECIMAL_BASE, daysToMaturity, curveCuts.borrowCurveCuts[borrowCutId], oriXtReserve + ); + + borrowApr_ = ( + (borrowVFtReserve * Constants.DECIMAL_BASE * Constants.DAYS_IN_YEAR) + / (borrowVXtReserve * daysToMaturity) + ); + } + } + + /** + * @inheritdoc ITermMaxOrder + */ + function updateOrder(OrderConfig memory newOrderConfig, int256 ftChangeAmt, int256 xtChangeAmt) + external + override + onlyOwner + { + _updateCurve(newOrderConfig.curveCuts); + if (ftChangeAmt > 0) { + ft.safeTransferFrom(msg.sender, address(this), ftChangeAmt.toUint256()); + } else if (ftChangeAmt < 0) { + ft.safeTransfer(msg.sender, (-ftChangeAmt).toUint256()); + } + if (xtChangeAmt > 0) { + xt.safeTransferFrom(msg.sender, address(this), xtChangeAmt.toUint256()); + } else if (xtChangeAmt < 0) { + xt.safeTransfer(msg.sender, (-xtChangeAmt).toUint256()); + } + _orderConfig.maxXtReserve = newOrderConfig.maxXtReserve; + // check gtId + if (newOrderConfig.gtId != 0 && address(this) != gt.getApproved(newOrderConfig.gtId)) { + revert GtNotApproved(newOrderConfig.gtId); + } + _orderConfig.gtId = newOrderConfig.gtId; + _orderConfig.swapTrigger = newOrderConfig.swapTrigger; + emit UpdateOrder( + newOrderConfig.curveCuts, + ftChangeAmt, + xtChangeAmt, + newOrderConfig.gtId, + newOrderConfig.maxXtReserve, + newOrderConfig.swapTrigger + ); + } + + function _updateCurve(CurveCuts memory newCurveCuts) internal { + bytes32 newCurveCutsHash = keccak256(abi.encode(newCurveCuts)); + CurveCuts memory oldCurveCuts = _orderConfig.curveCuts; + if (keccak256(abi.encode(oldCurveCuts)) != newCurveCutsHash) { + if (newCurveCuts.lendCurveCuts.length > 0) { + if (newCurveCuts.lendCurveCuts[0].liqSquare == 0 || newCurveCuts.lendCurveCuts[0].xtReserve != 0) { + revert InvalidCurveCuts(); + } + } + for (uint256 i = 1; i < newCurveCuts.lendCurveCuts.length; i++) { + if ( + newCurveCuts.lendCurveCuts[i].liqSquare == 0 + || newCurveCuts.lendCurveCuts[i].xtReserve <= newCurveCuts.lendCurveCuts[i - 1].xtReserve + ) { + revert InvalidCurveCuts(); + } + /* + R := (x' + beta') ^ 2 * DECIMAL_BASE / (x' + beta) ^ 2 + L' ^ 2 := L ^ 2 * R / DECIMAL_BASE + */ + if ( + newCurveCuts.lendCurveCuts[i].liqSquare + != ( + newCurveCuts.lendCurveCuts[i - 1].liqSquare + * ( + ( + ( + newCurveCuts.lendCurveCuts[i].xtReserve.plusInt256( + newCurveCuts.lendCurveCuts[i].offset + ) + ) ** 2 * Constants.DECIMAL_BASE + ) + / ( + newCurveCuts.lendCurveCuts[i].xtReserve.plusInt256( + newCurveCuts.lendCurveCuts[i - 1].offset + ) ** 2 + ) + ) + ) / Constants.DECIMAL_BASE + ) revert InvalidCurveCuts(); + } + if (newCurveCuts.borrowCurveCuts.length > 0) { + if (newCurveCuts.borrowCurveCuts[0].liqSquare == 0 || newCurveCuts.borrowCurveCuts[0].xtReserve != 0) { + revert InvalidCurveCuts(); + } + } + for (uint256 i = 1; i < newCurveCuts.borrowCurveCuts.length; i++) { + if ( + newCurveCuts.borrowCurveCuts[i].liqSquare == 0 + || newCurveCuts.borrowCurveCuts[i].xtReserve <= newCurveCuts.borrowCurveCuts[i - 1].xtReserve + ) { + revert InvalidCurveCuts(); + } + if ( + newCurveCuts.borrowCurveCuts[i].liqSquare + != ( + newCurveCuts.borrowCurveCuts[i - 1].liqSquare + * ( + ( + ( + newCurveCuts.borrowCurveCuts[i].xtReserve.plusInt256( + newCurveCuts.borrowCurveCuts[i].offset + ) + ) ** 2 * Constants.DECIMAL_BASE + ) + / ( + newCurveCuts.borrowCurveCuts[i].xtReserve.plusInt256( + newCurveCuts.borrowCurveCuts[i - 1].offset + ) ** 2 + ) + ) + ) / Constants.DECIMAL_BASE + ) revert InvalidCurveCuts(); + } + _orderConfig.curveCuts = newCurveCuts; + } + } + + function updateFeeConfig(FeeConfig memory newFeeConfig) external override onlyMarket { + _orderConfig.feeConfig = newFeeConfig; + emit UpdateFeeConfig(newFeeConfig); + } + + /// @notice Calculate how many days until expiration + function _daysToMaturity() internal view returns (uint256 daysToMaturity) { + daysToMaturity = (maturity - block.timestamp + Constants.SECONDS_IN_DAY - 1) / Constants.SECONDS_IN_DAY; + } + + /** + * @inheritdoc ITermMaxOrder + */ + function swapExactTokenToToken( + IERC20 tokenIn, + IERC20 tokenOut, + address recipient, + uint128 tokenAmtIn, + uint128 minTokenOut, + uint256 deadline + ) external override nonReentrant isOpen returns (uint256 netTokenOut) { + if (block.timestamp > deadline) revert DeadlineExpired(); + if (tokenIn == tokenOut) revert CantSwapSameToken(); + OrderConfig memory config = _orderConfig; + uint256 feeAmt; + if (tokenAmtIn != 0) { + // Store ft and xt reserve before swap + setInitialFtReserve(ft.balanceOf(address(this))); + setInitialXtReserve(xt.balanceOf(address(this))); + if (tokenIn == ft && tokenOut == debtToken) { + (netTokenOut, feeAmt) = _sellFt(tokenAmtIn, minTokenOut, msg.sender, recipient, config); + } else if (tokenIn == xt && tokenOut == debtToken) { + (netTokenOut, feeAmt) = _sellXt(tokenAmtIn, minTokenOut, msg.sender, recipient, config); + } else if (tokenIn == debtToken && tokenOut == ft) { + (netTokenOut, feeAmt) = _buyFt(tokenAmtIn, minTokenOut, msg.sender, recipient, config); + } else if (tokenIn == debtToken && tokenOut == xt) { + (netTokenOut, feeAmt) = _buyXt(tokenAmtIn, minTokenOut, msg.sender, recipient, config); + } else { + revert CantNotSwapToken(tokenIn, tokenOut); + } + // transfer fee to treasurer + ft.safeTransfer(market.config().treasurer, feeAmt); + /// @dev callback the changes of ft and xt reserve to trigger + if (address(_orderConfig.swapTrigger) != address(0)) { + uint256 ftReserve = ft.balanceOf(address(this)); + uint256 xtReserve = xt.balanceOf(address(this)); + int256 deltaFt = ftReserve.toInt256() - getInitialFtReserve().toInt256(); + int256 deltaXt = xtReserve.toInt256() - getInitialXtReserve().toInt256(); + _orderConfig.swapTrigger.afterSwap(ftReserve, xtReserve, deltaFt, deltaXt); + } + } else { + if (address(_orderConfig.swapTrigger) != address(0)) { + uint256 ftReserve = ft.balanceOf(address(this)); + uint256 xtReserve = xt.balanceOf(address(this)); + _orderConfig.swapTrigger.afterSwap(ftReserve, xtReserve, 0, 0); + } + } + + emit SwapExactTokenToToken( + tokenIn, tokenOut, msg.sender, recipient, tokenAmtIn, netTokenOut.toUint128(), feeAmt.toUint128() + ); + } + + function _buyFt( + uint256 debtTokenAmtIn, + uint256 minTokenOut, + address caller, + address recipient, + OrderConfig memory config + ) internal isLendingAllowed(config) returns (uint256 netOut, uint256 feeAmt) { + (netOut, feeAmt) = _buyToken(caller, recipient, debtTokenAmtIn, minTokenOut, config, _buyFtStep); + if (xt.balanceOf(address(this)) > config.maxXtReserve) { + revert XtReserveTooHigh(); + } + } + + function _buyXt( + uint256 debtTokenAmtIn, + uint256 minTokenOut, + address caller, + address recipient, + OrderConfig memory config + ) internal isBorrowingAllowed(config) returns (uint256 netOut, uint256 feeAmt) { + (netOut, feeAmt) = _buyToken(caller, recipient, debtTokenAmtIn, minTokenOut, config, _buyXtStep); + } + + function _sellFt( + uint256 ftAmtIn, + uint256 minDebtTokenOut, + address caller, + address recipient, + OrderConfig memory config + ) internal isBorrowingAllowed(config) returns (uint256 netOut, uint256 feeAmt) { + (netOut, feeAmt) = _sellToken(caller, recipient, ftAmtIn, minDebtTokenOut, config, _sellFtStep); + } + + function _sellXt( + uint256 xtAmtIn, + uint256 minDebtTokenOut, + address caller, + address recipient, + OrderConfig memory config + ) internal isLendingAllowed(config) returns (uint256 netOut, uint256 feeAmt) { + (netOut, feeAmt) = _sellToken(caller, recipient, xtAmtIn, minDebtTokenOut, config, _sellXtStep); + if (xt.balanceOf(address(this)) > config.maxXtReserve) { + revert XtReserveTooHigh(); + } + } + + function _buyToken( + address caller, + address recipient, + uint256 debtTokenAmtIn, + uint256 minTokenOut, + OrderConfig memory config, + function(uint, uint, uint, OrderConfig memory) internal view returns (uint, uint, IERC20) func + ) internal returns (uint256, uint256) { + uint256 daysToMaturity = _daysToMaturity(); + uint256 oriXtReserve = getInitialXtReserve(); + + (uint256 tokenAmtOut, uint256 feeAmt, IERC20 tokenOut) = + func(daysToMaturity, oriXtReserve, debtTokenAmtIn, config); + + uint256 netOut = tokenAmtOut + debtTokenAmtIn; + if (netOut < minTokenOut) revert UnexpectedAmount(minTokenOut, netOut); + + debtToken.safeTransferFrom(caller, address(this), debtTokenAmtIn); + + debtToken.safeIncreaseAllowance(address(market), debtTokenAmtIn); + market.mint(address(this), debtTokenAmtIn); + if (tokenOut == ft) { + uint256 ftReserve = getInitialFtReserve(); + _issueFtToSelf(ftReserve + debtTokenAmtIn, netOut + feeAmt, config); + } + + tokenOut.safeTransfer(recipient, netOut); + + return (netOut, feeAmt); + } + + function _buyFtStep(uint256 daysToMaturity, uint256 oriXtReserve, uint256 debtTokenAmtIn, OrderConfig memory config) + internal + view + returns (uint256 tokenAmtOut, uint256 feeAmt, IERC20 tokenOut) + { + FeeConfig memory feeConfig = config.feeConfig; + CurveCut[] memory cuts = config.curveCuts.borrowCurveCuts; + uint256 nif = Constants.DECIMAL_BASE - uint256(feeConfig.lendTakerFeeRatio); + (, tokenAmtOut) = TermMaxCurve.buyFt(nif, daysToMaturity, cuts, oriXtReserve, debtTokenAmtIn); + feeAmt = (tokenAmtOut * (Constants.DECIMAL_BASE + uint256(feeConfig.borrowMakerFeeRatio))) / nif - tokenAmtOut; + tokenOut = ft; + } + + function _buyXtStep(uint256 daysToMaturity, uint256 oriXtReserve, uint256 debtTokenAmtIn, OrderConfig memory config) + internal + view + returns (uint256 tokenAmtOut, uint256 feeAmt, IERC20 tokenOut) + { + FeeConfig memory feeConfig = config.feeConfig; + CurveCut[] memory cuts = config.curveCuts.lendCurveCuts; + uint256 nif = Constants.DECIMAL_BASE + uint256(feeConfig.borrowTakerFeeRatio); + uint256 deltaFt; + (tokenAmtOut, deltaFt) = TermMaxCurve.buyXt(nif, daysToMaturity, cuts, oriXtReserve, debtTokenAmtIn); + feeAmt = deltaFt - (deltaFt * (Constants.DECIMAL_BASE - uint256(feeConfig.lendMakerFeeRatio))) / nif; + tokenOut = xt; + } + + function _sellToken( + address caller, + address recipient, + uint256 tokenAmtIn, + uint256 minDebtTokenOut, + OrderConfig memory config, + function(uint, uint, uint, OrderConfig memory) internal view returns (uint, uint, IERC20) func + ) internal returns (uint256, uint256) { + uint256 daysToMaturity = _daysToMaturity(); + uint256 oriXtReserve = getInitialXtReserve(); + + (uint256 netOut, uint256 feeAmt, IERC20 tokenIn) = func(daysToMaturity, oriXtReserve, tokenAmtIn, config); + if (netOut < minDebtTokenOut) revert UnexpectedAmount(minDebtTokenOut, netOut); + + tokenIn.safeTransferFrom(caller, address(this), tokenAmtIn); + if (tokenIn == xt) { + uint256 ftReserve = getInitialFtReserve(); + _issueFtToSelf(ftReserve, netOut + feeAmt, config); + } + ft.approve(address(market), netOut); + xt.approve(address(market), netOut); + market.burn(recipient, netOut); + return (netOut, feeAmt); + } + + function _sellFtStep(uint256 daysToMaturity, uint256 oriXtReserve, uint256 tokenAmtIn, OrderConfig memory config) + internal + view + returns (uint256 debtTokenAmtOut, uint256 feeAmt, IERC20 tokenIn) + { + FeeConfig memory feeConfig = config.feeConfig; + CurveCut[] memory cuts = config.curveCuts.lendCurveCuts; + uint256 nif = Constants.DECIMAL_BASE + uint256(feeConfig.borrowTakerFeeRatio); + uint256 deltaFt; + (debtTokenAmtOut, deltaFt) = TermMaxCurve.sellFt(nif, daysToMaturity, cuts, oriXtReserve, tokenAmtIn); + feeAmt = deltaFt - (deltaFt * (Constants.DECIMAL_BASE - uint256(feeConfig.lendMakerFeeRatio))) / nif; + tokenIn = ft; + } + + function _sellXtStep(uint256 daysToMaturity, uint256 oriXtReserve, uint256 tokenAmtIn, OrderConfig memory config) + internal + view + returns (uint256 debtTokenAmtOut, uint256 feeAmt, IERC20 tokenIn) + { + FeeConfig memory feeConfig = config.feeConfig; + CurveCut[] memory cuts = config.curveCuts.borrowCurveCuts; + uint256 nif = Constants.DECIMAL_BASE - uint256(feeConfig.lendTakerFeeRatio); + (, debtTokenAmtOut) = TermMaxCurve.sellXt(nif, daysToMaturity, cuts, oriXtReserve, tokenAmtIn); + feeAmt = (debtTokenAmtOut * (Constants.DECIMAL_BASE + uint256(feeConfig.borrowMakerFeeRatio))) / nif + - debtTokenAmtOut; + tokenIn = xt; + } + + /** + * @inheritdoc ITermMaxOrder + */ + function swapTokenToExactToken( + IERC20 tokenIn, + IERC20 tokenOut, + address recipient, + uint128 tokenAmtOut, + uint128 maxTokenIn, + uint256 deadline + ) external override nonReentrant isOpen returns (uint256 netTokenIn) { + if (block.timestamp > deadline) revert DeadlineExpired(); + if (tokenIn == tokenOut) revert CantSwapSameToken(); + OrderConfig memory config = _orderConfig; + uint256 feeAmt; + if (tokenAmtOut != 0 && maxTokenIn != 0) { + // Storage current ft and xt reserve + setInitialFtReserve(ft.balanceOf(address(this))); + setInitialXtReserve(xt.balanceOf(address(this))); + + if (tokenIn == debtToken && tokenOut == ft) { + (netTokenIn, feeAmt) = _buyExactFt(tokenAmtOut, maxTokenIn, msg.sender, recipient, config); + } else if (tokenIn == debtToken && tokenOut == xt) { + (netTokenIn, feeAmt) = _buyExactXt(tokenAmtOut, maxTokenIn, msg.sender, recipient, config); + } else if (tokenIn == ft && tokenOut == debtToken) { + (netTokenIn, feeAmt) = _sellFtForExactToken(tokenAmtOut, maxTokenIn, msg.sender, recipient, config); + } else if (tokenIn == xt && tokenOut == debtToken) { + (netTokenIn, feeAmt) = _sellXtForExactToken(tokenAmtOut, maxTokenIn, msg.sender, recipient, config); + } else { + revert CantNotSwapToken(tokenIn, tokenOut); + } + // transfer fee to treasurer + ft.safeTransfer(market.config().treasurer, feeAmt); + + /// @dev callback the changes of ft and xt reserve to trigger + if (address(_orderConfig.swapTrigger) != address(0)) { + uint256 ftReserve = ft.balanceOf(address(this)); + uint256 xtReserve = xt.balanceOf(address(this)); + int256 deltaFt = ftReserve.toInt256() - getInitialFtReserve().toInt256(); + int256 deltaXt = xtReserve.toInt256() - getInitialXtReserve().toInt256(); + _orderConfig.swapTrigger.afterSwap(ftReserve, xtReserve, deltaFt, deltaXt); + } + } else { + if (address(_orderConfig.swapTrigger) != address(0)) { + uint256 ftReserve = ft.balanceOf(address(this)); + uint256 xtReserve = xt.balanceOf(address(this)); + _orderConfig.swapTrigger.afterSwap(ftReserve, xtReserve, 0, 0); + } + } + + emit SwapTokenToExactToken( + tokenIn, tokenOut, msg.sender, recipient, tokenAmtOut, netTokenIn.toUint128(), feeAmt.toUint128() + ); + } + + function _buyExactFt( + uint256 tokenAmtOut, + uint256 maxTokenIn, + address caller, + address recipient, + OrderConfig memory config + ) internal isLendingAllowed(config) returns (uint256 netTokenIn, uint256 feeAmt) { + (netTokenIn, feeAmt) = _buyExactToken(caller, recipient, tokenAmtOut, maxTokenIn, config, _buyExactFtStep); + if (xt.balanceOf(address(this)) > config.maxXtReserve) { + revert XtReserveTooHigh(); + } + } + + function _buyExactXt( + uint256 tokenAmtOut, + uint256 maxTokenIn, + address caller, + address recipient, + OrderConfig memory config + ) internal isBorrowingAllowed(config) returns (uint256 netTokenIn, uint256 feeAmt) { + (netTokenIn, feeAmt) = _buyExactToken(caller, recipient, tokenAmtOut, maxTokenIn, config, _buyExactXtStep); + } + + function _buyExactToken( + address caller, + address recipient, + uint256 tokenAmtOut, + uint256 maxTokenIn, + OrderConfig memory config, + function(uint, uint, uint, OrderConfig memory) internal view returns (uint, uint, IERC20) func + ) internal returns (uint256, uint256) { + uint256 daysToMaturity = _daysToMaturity(); + uint256 oriXtReserve = getInitialXtReserve(); + + (uint256 netTokenIn, uint256 feeAmt, IERC20 tokenOut) = func(daysToMaturity, oriXtReserve, tokenAmtOut, config); + + if (netTokenIn > maxTokenIn) revert UnexpectedAmount(maxTokenIn, netTokenIn); + + debtToken.safeTransferFrom(caller, address(this), netTokenIn); + + debtToken.safeIncreaseAllowance(address(market), netTokenIn); + market.mint(address(this), netTokenIn); + if (tokenOut == ft) { + uint256 ftReserve = getInitialFtReserve(); + _issueFtToSelf(ftReserve + netTokenIn, tokenAmtOut + feeAmt, config); + } + + tokenOut.safeTransfer(recipient, tokenAmtOut); + + return (netTokenIn, feeAmt); + } + + function _buyExactFtStep(uint256 daysToMaturity, uint256 oriXtReserve, uint256 ftAmtOut, OrderConfig memory config) + internal + view + returns (uint256 debtTokenAmtIn, uint256 feeAmt, IERC20 tokenOut) + { + FeeConfig memory feeConfig = config.feeConfig; + CurveCut[] memory cuts = config.curveCuts.borrowCurveCuts; + uint256 nif = Constants.DECIMAL_BASE - uint256(feeConfig.lendTakerFeeRatio); + (uint256 deltaXt, uint256 negDeltaFt) = + TermMaxCurve.buyExactFt(nif, daysToMaturity, cuts, oriXtReserve, ftAmtOut); + debtTokenAmtIn = deltaXt; + feeAmt = (negDeltaFt * (Constants.DECIMAL_BASE + uint256(feeConfig.borrowMakerFeeRatio))) / nif - negDeltaFt; + tokenOut = ft; + } + + function _buyExactXtStep(uint256 daysToMaturity, uint256 oriXtReserve, uint256 xtAmtOut, OrderConfig memory config) + internal + view + returns (uint256 debtTokenAmtIn, uint256 feeAmt, IERC20 tokenOut) + { + FeeConfig memory feeConfig = config.feeConfig; + CurveCut[] memory cuts = config.curveCuts.lendCurveCuts; + uint256 nif = Constants.DECIMAL_BASE + uint256(feeConfig.borrowTakerFeeRatio); + (, uint256 deltaFt) = TermMaxCurve.buyExactXt(nif, daysToMaturity, cuts, oriXtReserve, xtAmtOut); + debtTokenAmtIn = deltaFt; + feeAmt = deltaFt - (deltaFt * (Constants.DECIMAL_BASE - uint256(feeConfig.lendMakerFeeRatio))) / nif; + tokenOut = xt; + } + + function _sellFtForExactToken( + uint256 debtTokenAmtOut, + uint256 maxFtIn, + address caller, + address recipient, + OrderConfig memory config + ) internal isBorrowingAllowed(config) returns (uint256 netIn, uint256 feeAmt) { + (netIn, feeAmt) = + _sellTokenForExactToken(caller, recipient, debtTokenAmtOut, maxFtIn, config, _sellFtForExactTokenStep); + } + + function _sellXtForExactToken( + uint256 debtTokenAmtOut, + uint256 maxXtIn, + address caller, + address recipient, + OrderConfig memory config + ) internal isLendingAllowed(config) returns (uint256 netIn, uint256 feeAmt) { + (netIn, feeAmt) = + _sellTokenForExactToken(caller, recipient, debtTokenAmtOut, maxXtIn, config, _sellXtForExactTokenStep); + if (xt.balanceOf(address(this)) > config.maxXtReserve) { + revert XtReserveTooHigh(); + } + } + + function _sellTokenForExactToken( + address caller, + address recipient, + uint256 debtTokenAmtOut, + uint256 maxTokenIn, + OrderConfig memory config, + function(uint, uint, uint, OrderConfig memory) internal view returns (uint, uint, IERC20) func + ) internal returns (uint256, uint256) { + uint256 daysToMaturity = _daysToMaturity(); + uint256 oriXtReserve = getInitialXtReserve(); + + (uint256 netTokenIn, uint256 feeAmt, IERC20 tokenIn) = + func(daysToMaturity, oriXtReserve, debtTokenAmtOut, config); + + if (netTokenIn > maxTokenIn) revert UnexpectedAmount(maxTokenIn, netTokenIn); + + tokenIn.safeTransferFrom(caller, address(this), netTokenIn); + if (tokenIn == xt) { + uint256 ftReserve = getInitialFtReserve(); + _issueFtToSelf(ftReserve, debtTokenAmtOut + feeAmt, config); + } + ft.approve(address(market), debtTokenAmtOut); + xt.approve(address(market), debtTokenAmtOut); + market.burn(recipient, debtTokenAmtOut); + return (netTokenIn, feeAmt); + } + + function _sellFtForExactTokenStep( + uint256 daysToMaturity, + uint256 oriXtReserve, + uint256 debtTokenOut, + OrderConfig memory config + ) internal view returns (uint256 ftAmtIn, uint256 feeAmt, IERC20 tokenIn) { + FeeConfig memory feeConfig = config.feeConfig; + CurveCut[] memory cuts = config.curveCuts.lendCurveCuts; + uint256 nif = Constants.DECIMAL_BASE + uint256(feeConfig.borrowTakerFeeRatio); + + (, uint256 deltaFt) = + TermMaxCurve.sellFtForExactDebtToken(nif, daysToMaturity, cuts, oriXtReserve, debtTokenOut); + ftAmtIn = deltaFt + debtTokenOut; + + feeAmt = deltaFt - (deltaFt * (Constants.DECIMAL_BASE - uint256(feeConfig.lendMakerFeeRatio))) / nif; + tokenIn = ft; + } + + function _sellXtForExactTokenStep( + uint256 daysToMaturity, + uint256 oriXtReserve, + uint256 debtTokenOut, + OrderConfig memory config + ) internal view returns (uint256 xtAmtIn, uint256 feeAmt, IERC20 tokenIn) { + FeeConfig memory feeConfig = config.feeConfig; + CurveCut[] memory cuts = config.curveCuts.borrowCurveCuts; + uint256 nif = Constants.DECIMAL_BASE - uint256(feeConfig.lendTakerFeeRatio); + (uint256 deltaXt, uint256 negDeltaFt) = + TermMaxCurve.sellXtForExactDebtToken(nif, daysToMaturity, cuts, oriXtReserve, debtTokenOut); + xtAmtIn = deltaXt + debtTokenOut; + + feeAmt = (negDeltaFt * (Constants.DECIMAL_BASE + uint256(feeConfig.borrowMakerFeeRatio))) / nif - negDeltaFt; + tokenIn = xt; + } + + /** + * @notice Issue ft by existed gt. + * @notice This fuction will be triggered when ft reserve can not cover the output amount. + */ + function _issueFtToSelf(uint256 ftReserve, uint256 targetFtReserve, OrderConfig memory config) internal { + if (ftReserve >= targetFtReserve) return; + if (config.gtId == 0) revert CantNotIssueFtWithoutGt(); + uint256 debtAmtToIssue = ((targetFtReserve - ftReserve) * Constants.DECIMAL_BASE) + / (Constants.DECIMAL_BASE - market.mintGtFeeRatio()); + market.issueFtByExistedGt(address(this), (debtAmtToIssue).toUint128(), config.gtId); + setInitialFtReserve(targetFtReserve); + } + + function withdrawAssets(IERC20 token, address recipient, uint256 amount) external onlyOwner { + token.safeTransfer(recipient, amount); + emit WithdrawAssets(token, _msgSender(), recipient, amount); + } + + /** + * @inheritdoc ITermMaxOrder + */ + function pause() external override onlyOwner { + _pause(); + } + + /** + * @inheritdoc ITermMaxOrder + */ + function unpause() external override onlyOwner { + _unpause(); + } +} diff --git a/contracts/v1/access/AccessManager.sol b/contracts/v1/access/AccessManager.sol new file mode 100644 index 0000000..33a115c --- /dev/null +++ b/contracts/v1/access/AccessManager.sol @@ -0,0 +1,186 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {AccessControlUpgradeable} from "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import {ITermMaxMarket} from "contracts/ITermMaxMarket.sol"; +import {ITermMaxFactory} from "contracts/factory/ITermMaxFactory.sol"; +import {ITermMaxRouter} from "contracts/router/ITermMaxRouter.sol"; +import {ITermMaxOrder} from "contracts/ITermMaxOrder.sol"; +import {IOracle} from "contracts/oracle/IOracle.sol"; +import {ITermMaxVault} from "contracts/vault/ITermMaxVault.sol"; +import {MarketConfig, FeeConfig, MarketInitialParams} from "contracts/storage/TermMaxStorage.sol"; + +interface IOwnable { + function transferOwnership(address newOwner) external; + + function acceptOwnership() external; +} + +interface IPausable { + function pause() external; + + function unpause() external; +} + +/** + * @title TermMax Access Manager + * @author Term Structure Labs + */ +contract AccessManager is AccessControlUpgradeable, UUPSUpgradeable { + error CannotRevokeDefaultAdminRole(); + + /// @notice Role to manage switch + bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); + /// @notice Role to manage configuration items + bytes32 public constant CONFIGURATOR_ROLE = keccak256("CONFIGURATOR_ROLE"); + /// @notice Role to manage vault + bytes32 public constant VAULT_ROLE = keccak256("VAULT_ROLE"); + /// @notice Role to manage oracle + bytes32 public constant ORACLE_ROLE = keccak256("ORACLE_ROLE"); + /// @notice Role to manage market + bytes32 public constant MARKET_ROLE = keccak256("MARKET_ROLE"); + + function initialize(address admin) public initializer { + __UUPSUpgradeable_init(); + __AccessControl_init(); + _grantRole(DEFAULT_ADMIN_ROLE, admin); + } + + /// @notice Set GT implementation to the factory + function setGtImplement(ITermMaxFactory factory, string memory gtImplementName, address gtImplement) + external + onlyRole(MARKET_ROLE) + { + factory.setGtImplement(gtImplementName, gtImplement); + } + + /// @notice Deploy a new market + function createMarket( + ITermMaxFactory factory, + bytes32 gtKey, + MarketInitialParams calldata deployParams, + uint256 salt + ) external onlyRole(MARKET_ROLE) returns (address market) { + market = factory.createMarket(gtKey, deployParams, salt); + } + + /// @notice Transfer ownable contract's ownership + function transferOwnership(IOwnable entity, address to) external onlyRole(DEFAULT_ADMIN_ROLE) { + entity.transferOwnership(to); + } + + function acceptOwnership(IOwnable entity) external onlyRole(DEFAULT_ADMIN_ROLE) { + entity.acceptOwnership(); + } + + /// @notice Upgrade the target contract using UUPS + function upgradeSubContract(UUPSUpgradeable proxy, address newImplementation, bytes memory data) + external + onlyRole(DEFAULT_ADMIN_ROLE) + { + proxy.upgradeToAndCall(newImplementation, data); + } + + /// @notice Set the adapter whitelist for router + function setAdapterWhitelist(ITermMaxRouter router, address adapter, bool isWhitelist) + external + onlyRole(MARKET_ROLE) + { + router.setAdapterWhitelist(adapter, isWhitelist); + } + + function submitPendingOracle(IOracle aggregator, address asset, IOracle.Oracle memory oracle) + external + onlyRole(ORACLE_ROLE) + { + aggregator.submitPendingOracle(asset, oracle); + } + + function acceptPendingOracle(IOracle aggregator, address asset) external onlyRole(ORACLE_ROLE) { + aggregator.acceptPendingOracle(asset); + } + + /// @notice Update the market configuration + function updateMarketConfig(ITermMaxMarket market, MarketConfig calldata newConfig) + external + onlyRole(CONFIGURATOR_ROLE) + { + market.updateMarketConfig(newConfig); + } + + /// @notice Set the configuration of Gearing Token + function updateGtConfig(ITermMaxMarket market, bytes memory configData) external onlyRole(CONFIGURATOR_ROLE) { + market.updateGtConfig(configData); + } + + /// @notice Set the fee rate of an order + function updateOrderFeeRate(ITermMaxMarket market, ITermMaxOrder order, FeeConfig memory feeConfig) + external + onlyRole(CONFIGURATOR_ROLE) + { + market.updateOrderFeeRate(order, feeConfig); + } + + /// @notice Set the switch of an entity + function setSwitch(IPausable entity, bool state) external onlyRole(PAUSER_ROLE) { + if (state) { + entity.unpause(); + } else { + entity.pause(); + } + } + + function submitVaultGuardian(ITermMaxVault vault, address newGuardian) external onlyRole(VAULT_ROLE) { + vault.submitGuardian(newGuardian); + } + + /// @notice Revoke a pending guardian for the vault + function revokeVaultPendingGuardian(ITermMaxVault vault) external onlyRole(VAULT_ROLE) { + vault.revokePendingGuardian(); + } + + /// @notice Revoke a pending timelock for the vault + function revokeVaultPendingTimelock(ITermMaxVault vault) external onlyRole(VAULT_ROLE) { + vault.revokePendingTimelock(); + } + + /// @notice Revoke a pending market for the vault + function revokeVaultPendingMarket(ITermMaxVault vault, address market) external onlyRole(VAULT_ROLE) { + vault.revokePendingMarket(market); + } + + /// @notice Set the curator for the vault, only admin role + function setCuratorForVault(ITermMaxVault vault, address newCurator) external onlyRole(VAULT_ROLE) { + vault.setCurator(newCurator); + } + + /// @notice Set the allocator for the vault + function setIsAllocatorForVault(ITermMaxVault vault, address allocator, bool isAllocator) + external + onlyRole(VAULT_ROLE) + { + vault.setIsAllocator(allocator, isAllocator); + } + + /// @notice Revoke role + /// @dev Can't revoke your own role + function revokeRole(bytes32 role, address account) public override onlyRole(getRoleAdmin(role)) { + if (msg.sender == account) { + revert AccessControlBadConfirmation(); + } + + _revokeRole(role, account); + } + + /// @notice Revoke role + /// @dev Can't revoke default admin role + function renounceRole(bytes32 role, address callerConfirmation) public override { + if (role == DEFAULT_ADMIN_ROLE) { + revert CannotRevokeDefaultAdminRole(); + } + _revokeRole(role, callerConfirmation); + } + + function _authorizeUpgrade(address newImplementation) internal virtual override onlyRole(DEFAULT_ADMIN_ROLE) {} +} diff --git a/contracts/v1/errors/FactoryErrors.sol b/contracts/v1/errors/FactoryErrors.sol new file mode 100644 index 0000000..94ace3a --- /dev/null +++ b/contracts/v1/errors/FactoryErrors.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Factory Errors Interface + * @notice Custom errors for the TermMax factory operations + */ +interface FactoryErrors { + /** + * @notice Error thrown when attempting to initialize with an invalid implementation + */ + error InvalidImplementation(); + + /** + * @notice Error thrown when a requested Gearing Token implementation cannot be found + * @dev This occurs when trying to use a GT implementation that hasn't been registered + */ + error CantNotFindGtImplementation(); +} diff --git a/contracts/v1/errors/GearingTokenErrors.sol b/contracts/v1/errors/GearingTokenErrors.sol new file mode 100644 index 0000000..46ff504 --- /dev/null +++ b/contracts/v1/errors/GearingTokenErrors.sol @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface GearingTokenErrors { + /// @notice Error for merge loans have different owners + /// @param id The id of Gearing Token has different owner + /// @param diffOwner The different owner + error CanNotMergeLoanWithDiffOwner(uint256 id, address diffOwner); + /// @notice Error for liquidate loan when Gearing Token don't support liquidation + error GtDoNotSupportLiquidation(); + /// @notice Error for repay the loan after maturity day + /// @param id The id of Gearing Token + error GtIsExpired(uint256 id); + /// @notice Error for liquidate loan when its ltv less than liquidation threshhold + /// @param id The id of Gearing Token + error GtIsSafe(uint256 id); + /// @notice Error for the ltv of loan is bigger than maxium ltv + /// @param id The id of Gearing Token + /// @param owner The owner of Gearing Token + /// @param ltv The loan to value + error GtIsNotHealthy(uint256 id, address owner, uint128 ltv); + /// @notice Error for the ltv increase after liquidation + /// @param id The id of Gearing Token + /// @param ltvBefore Loan to value before liquidation + /// @param ltvAfter Loan to value after liquidation + error LtvIncreasedAfterLiquidation(uint256 id, uint128 ltvBefore, uint128 ltvAfter); + /// @notice Error for unauthorized operation + /// @param id The id of Gearing Token + error CallerIsNotTheOwner(uint256 id); + /// @notice Error for liquidate the loan with invalid repay amount + /// @param id The id of Gearing Token + /// @param repayAmt The id of Gearing Token + /// @param maxRepayAmt The maxium repay amount when liquidating or repaying + error RepayAmtExceedsMaxRepayAmt(uint256 id, uint128 repayAmt, uint128 maxRepayAmt); + /// @notice Error for liquidate the loan after liquidation window + error CanNotLiquidationAfterFinalDeadline(uint256 id, uint256 liquidationDeadline); + /// @notice Error for debt value less than minimal limit + /// @param debtValue The debtValue is USD, decimals 1e8 + error DebtValueIsTooSmall(uint256 debtValue); + /// @notice Error for unauthorized operation + /// @param id The id of Gearing Token + /// @param caller The caller + error AuthorizationFailed(uint256 id, address caller); + /** + * @notice Error thrown when the liquidation LTV is less than the max LTV + */ + error LiquidationLtvMustBeGreaterThanMaxLtv(); +} diff --git a/contracts/v1/errors/MarketErrors.sol b/contracts/v1/errors/MarketErrors.sol new file mode 100644 index 0000000..c3a78e4 --- /dev/null +++ b/contracts/v1/errors/MarketErrors.sol @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Market Errors Interface + * @notice Custom errors for the TermMax market operations + */ +interface MarketErrors { + /** + * @notice Error thrown when a fee rate is set higher than the maximum allowed + */ + error FeeTooHigh(); + + /** + * @notice Error thrown when the maturity date is invalid + * @dev This could be due to maturity being in the past or too far in the future + */ + error InvalidMaturity(); + + /** + * @notice Error thrown when trying to use the same token as both collateral and underlying + * @dev Collateral and underlying must be different tokens for market safety + */ + error CollateralCanNotEqualUnderlyinng(); + + /** + * @notice Error thrown when trying to interact with a market before its trading period begins + */ + error TermIsNotOpen(); + + /** + * @notice Error thrown when attempting to redeem before the final liquidation deadline + * @param liquidationDeadline The timestamp after which redemption is allowed + */ + error CanNotRedeemBeforeFinalLiquidationDeadline(uint256 liquidationDeadline); +} diff --git a/contracts/v1/errors/OrderErrors.sol b/contracts/v1/errors/OrderErrors.sol new file mode 100644 index 0000000..046b97a --- /dev/null +++ b/contracts/v1/errors/OrderErrors.sol @@ -0,0 +1,96 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +/** + * @title Order Errors Interface + * @notice Custom errors for the TermMax order operations + */ +interface OrderErrors { + /** + * @notice Error thrown when attempting to interact with an order before its term is open + */ + error TermIsNotOpen(); + + /** + * @notice Error thrown when attempting to swap between unsupported token pairs + * @param tokenIn The input token + * @param tokenOut The output token + */ + error CantNotSwapToken(IERC20 tokenIn, IERC20 tokenOut); + + /** + * @notice Error thrown when attempting to swap a token for itself + */ + error CantSwapSameToken(); + + /** + * @notice Error thrown when attempting to issue FT without a corresponding GT + */ + error CantNotIssueFtWithoutGt(); + + /** + * @notice Error thrown when the curve cuts parameters are invalid + */ + error InvalidCurveCuts(); + + /** + * @notice Error thrown when borrowing is not allowed in the current state + */ + error BorrowIsNotAllowed(); + + /** + * @notice Error thrown when lending is not allowed in the current state + */ + error LendIsNotAllowed(); + + /** + * @notice Error thrown when a non-market attempts to perform a market-only action + */ + error OnlyMarket(); + + /** + * @notice Error thrown when a swap transaction is submitted after its deadline + */ + error DeadlineExpired(); + + /** + * @notice Error thrown when a GT hasn't been approved for an operation + * @param gtId The ID of the unapproved GT + */ + error GtNotApproved(uint256 gtId); + + /** + * @notice Error thrown when the XT reserve exceeds the maximum allowed + */ + error XtReserveTooHigh(); + + /** + * @notice Error thrown when the actual output amount doesn't match the expected amount + * @param expectedAmt The expected amount + * @param actualAmt The actual amount received + */ + error UnexpectedAmount(uint256 expectedAmt, uint256 actualAmt); + + /** + * @notice Error thrown when attempting to redeem before the final liquidation deadline + * @param liquidationDeadline The timestamp after which redemption is allowed + */ + error CanNotRedeemBeforeFinalLiquidationDeadline(uint256 liquidationDeadline); + + /** + * @notice Error thrown when attempting an operation that requires evacuation mode when it's not active + */ + error EvacuationIsNotActived(); + + /** + * @notice Error thrown when attempting an operation that's not allowed during evacuation mode + */ + error EvacuationIsActived(); + + /** + * @notice Error thrown when there isn't enough excess FT or XT to complete a withdrawal + */ + error NotEnoughFtOrXtToWithdraw(); +} diff --git a/contracts/v1/errors/RouterErrors.sol b/contracts/v1/errors/RouterErrors.sol new file mode 100644 index 0000000..577bbd8 --- /dev/null +++ b/contracts/v1/errors/RouterErrors.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface RouterErrors { + /// @notice Error for calling the orders and trading amts length not match + error OrdersAndAmtsLengthNotMatch(); + /// @notice Error for calling the market is not whitelisted + error MarketNotWhitelisted(address market); + /// @notice Error for calling the gt is not whitelisted + error GtNotWhitelisted(address gt); + /// @notice Error for calling the adapter is not whitelisted + error AdapterNotWhitelisted(address adapter); + /// @notice Error for the final loan to collateral is bigger than expected + error LtvBiggerThanExpected(uint128 expectedLtv, uint128 actualLtv); + /// @notice Error for approving token failed when swapping + error ApproveTokenFailWhenSwap(address token, bytes revertData); + /// @notice Error for failed swapping + error SwapFailed(address adapter, bytes revertData); + /// @notice Error for the token output is less than expected + error InsufficientTokenOut(address token, uint256 expectedTokenOut, uint256 actualTokenOut); + /// @notice Error for the token input is less than expected + error InsufficientTokenIn(address token, uint256 expectedTokenIn, uint256 actualTokenIn); + /// @notice Error for the gt is not owned by the sender + error GtNotOwnedBySender(); + /// @notice Error for the swap units is empty + error SwapUnitsIsEmpty(); +} diff --git a/contracts/v1/errors/VaultErrors.sol b/contracts/v1/errors/VaultErrors.sol new file mode 100644 index 0000000..25941e4 --- /dev/null +++ b/contracts/v1/errors/VaultErrors.sol @@ -0,0 +1,134 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Vault Errors Interface + * @notice Custom errors for the TermMax vault operations + */ +interface VaultErrors { + error InvalidImplementation(); + /** + * @notice Error thrown when attempting to interact with a vault without its proxy + */ + error OnlyProxy(); + + /** + * @notice Error thrown when attempting to interact with a non-whitelisted market + */ + error MarketNotWhitelisted(); + + /** + * @notice Error thrown when trying to deal with bad debt that doesn't exist + * @param collateral The address of the collateral token + */ + error NoBadDebt(address collateral); + + /** + * @notice Error thrown when attempting to withdraw more funds than available + * @param maxWithdraw The maximum amount that can be withdrawn + * @param expectedWithdraw The amount attempted to withdraw + */ + error InsufficientFunds(uint256 maxWithdraw, uint256 expectedWithdraw); + + /** + * @notice Error thrown when the locked FT amount exceeds the total FT + */ + error LockedFtGreaterThanTotalFt(); + + /** + * @notice Error thrown when attempting to set a performance fee rate beyond the maximum allowed + */ + error PerformanceFeeRateExceeded(); + + /** + * @notice Error thrown when there's an asset mismatch in an operation + */ + error InconsistentAsset(); + + /** + * @notice Error thrown when trying to accept a change that has no pending value + */ + error NoPendingValue(); + + /** + * @notice Error thrown when trying to accept a change before the timelock period has elapsed + */ + error TimelockNotElapsed(); + + /** + * @notice Error thrown when attempting to set a timelock period above the maximum + */ + error AboveMaxTimelock(); + + /** + * @notice Error thrown when attempting to set a timelock period below the minimum + */ + error BelowMinTimelock(); + + /** + * @notice Error thrown when attempting to set a value that's already set + */ + error AlreadySet(); + + /** + * @notice Error thrown when attempting to submit a change that's already pending + */ + error AlreadyPending(); + + /** + * @notice Error thrown when attempting to exceed the maximum queue length + */ + error MaxQueueLengthExceeded(); + + /** + * @notice Error thrown when a non-curator attempts to perform a curator-only action + */ + error NotCuratorRole(); + + /** + * @notice Error thrown when a non-allocator attempts to perform an allocator-only action + */ + error NotAllocatorRole(); + + /** + * @notice Error thrown when a non-guardian attempts to perform a guardian-only action + */ + error NotGuardianRole(); + + /** + * @notice Error thrown when attempting to set the capacity to zero + */ + error CapacityCannotSetToZero(); + + /** + * @notice Error thrown when attempting to set capacity below the currently used amount + */ + error CapacityCannotLessThanUsed(); + + /** + * @notice Error thrown when an unauthorized order attempts to interact with the vault + * @param orderAddress The address of the unauthorized order + */ + error UnauthorizedOrder(address orderAddress); + + /** + * @notice Error thrown when the supply queue length doesn't match the expected length + */ + error SupplyQueueLengthMismatch(); + + /** + * @notice Error thrown when the withdraw queue length doesn't match the expected length + */ + error WithdrawQueueLengthMismatch(); + + /** + * @notice Error thrown when attempting to add a duplicate order to a queue + * @param orderAddress The address of the duplicate order + */ + error DuplicateOrder(address orderAddress); + + /** + * @notice Error thrown when an order has negative interest + */ + error OrderHasNegativeInterest(); +} diff --git a/contracts/v1/events/FactoryEvents.sol b/contracts/v1/events/FactoryEvents.sol new file mode 100644 index 0000000..33dc3d2 --- /dev/null +++ b/contracts/v1/events/FactoryEvents.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {VaultInitialParams} from "contracts/storage/TermMaxStorage.sol"; + +/** + * @title Factory Events Interface + * @notice Events emitted by the TermMax factory contracts + */ +interface FactoryEvents { + /** + * @notice Emitted when a new Gearing Token implementation is set + * @param key The unique identifier for the GT implementation + * @param gtImplement The address of the GT implementation contract + */ + event SetGtImplement(bytes32 key, address gtImplement); + + /** + * @notice Emitted when a new market is created + * @param market The address of the newly created market + * @param collateral The address of the collateral token + * @param debtToken The debt token interface + */ + event CreateMarket(address indexed market, address indexed collateral, IERC20 indexed debtToken); + + /** + * @notice Emitted when a new vault is created + * @param vault The address of the newly created vault + * @param creator The address of the vault creator + * @param initialParams The initial parameters used to configure the vault + */ + event CreateVault(address indexed vault, address indexed creator, VaultInitialParams indexed initialParams); +} diff --git a/contracts/v1/events/GearingTokenEvents.sol b/contracts/v1/events/GearingTokenEvents.sol new file mode 100644 index 0000000..2c73a77 --- /dev/null +++ b/contracts/v1/events/GearingTokenEvents.sol @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface GearingTokenEvents { + /// @notice Emitted when updating the configuration + event UpdateConfig(bytes configData); + + /// @notice Emitted when Debt is augmented + /// @param id The id of Gearing Token + /// @param ftAmt The amount of debt augmented + event AugmentDebt(uint256 indexed id, uint256 ftAmt); + + /// @notice Emitted when merging multiple Gearing Tokens into one + /// @param owner The owner of those tokens + /// @param newId The id of new Gearing Token + /// @param ids The array of Gearing Tokens id were merged + event MergeGts(address indexed owner, uint256 indexed newId, uint256[] ids); + + /// @notice Emitted when removing collateral from the loan + /// @param id The id of Gearing Token + /// @param newCollateralData Collateral data after removal + event RemoveCollateral(uint256 indexed id, bytes newCollateralData); + + /// @notice Emitted when adding collateral to the loan + /// @param id The id of Gearing Token + /// @param newCollateralData Collateral data after additional + event AddCollateral(uint256 indexed id, bytes newCollateralData); + + /// @notice Emitted when repaying the debt of Gearing Token + /// @param id The id of Gearing Token + /// @param repayAmt The amount of debt repaid + /// @param byDebtToken Repay using debtToken token or bonds token + event Repay(uint256 indexed id, uint256 repayAmt, bool byDebtToken); + + /// @notice Emitted when liquidating Gearing Token + /// @param id The id of Gearing Token + /// @param liquidator The liquidator + /// @param repayAmt The amount of debt liquidated + /// @param cToLiquidator Collateral data assigned to liquidator + /// @param cToTreasurer Collateral data assigned to protocol + /// @param remainningC Remainning collateral data + event Liquidate( + uint256 indexed id, + address indexed liquidator, + uint128 repayAmt, + bool byDebtToken, + bytes cToLiquidator, + bytes cToTreasurer, + bytes remainningC + ); +} diff --git a/contracts/v1/events/MarketEvents.sol b/contracts/v1/events/MarketEvents.sol new file mode 100644 index 0000000..44f74b5 --- /dev/null +++ b/contracts/v1/events/MarketEvents.sol @@ -0,0 +1,131 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IMintableERC20, IERC20} from "../tokens/IMintableERC20.sol"; +import {IGearingToken} from "../tokens/IGearingToken.sol"; +import {ITermMaxOrder} from "../ITermMaxOrder.sol"; +import {MarketConfig} from "../storage/TermMaxStorage.sol"; + +/** + * @title Market Events Interface + * @notice Events emitted by the TermMax market operations + */ +interface MarketEvents { + /** + * @notice Emitted when a market is initialized + * @param collateral The collateral token address + * @param underlying The underlying token address + * @param maturity The unix timestamp of the maturity date + * @param ft The TermMax Market FT token + * @param xt The TermMax Market XT token + * @param gt The Gearing token + */ + event MarketInitialized( + address indexed collateral, + IERC20 indexed underlying, + uint64 maturity, + IMintableERC20 ft, + IMintableERC20 xt, + IGearingToken gt + ); + + /** + * @notice Emitted when the market configuration is updated + * @param config The new market configuration + */ + event UpdateMarketConfig(MarketConfig config); + + /** + * @notice Emitted when tokens are minted + * @param caller The address initiating the mint + * @param receiver The address receiving the minted tokens + * @param amount The amount of tokens minted + */ + event Mint(address indexed caller, address indexed receiver, uint256 amount); + + /** + * @notice Emitted when tokens are burned + * @param caller The address initiating the burn + * @param receiver The address whose tokens are burned + * @param amount The amount of tokens burned + */ + event Burn(address indexed caller, address indexed receiver, uint256 amount); + + /** + * @notice Emitted when a leveraged position is created + * @param loanReceiver The address receiving the loan + * @param gtReceiver The address receiving the Gearing Token + * @param gtId The ID of the Gearing Token + * @param debtAmt The amount of debt in underlying token + * @param xtAmt The amount of XT token + * @param fee The amount of minting gt fee, unit by FT token + * @param collateralData The encoded collateral data + */ + event LeverageByXt( + address indexed loanReceiver, + address indexed gtReceiver, + uint256 indexed gtId, + uint128 debtAmt, + uint256 xtAmt, + uint128 fee, + bytes collateralData + ); + + /** + * @notice Emitted when FT is issued using collateral + * @param caller The address initiating the issuance + * @param recipient The address receiving the FT + * @param gtId The ID of the Gearing Token + * @param debtAmt The amount of debt in underlying token + * @param ftAmt The amount of FT issued + * @param fee The amount of minting gt fee, unit by FT token + * @param collateralData The encoded collateral data + */ + event IssueFt( + address indexed caller, + address indexed recipient, + uint256 indexed gtId, + uint128 debtAmt, + uint128 ftAmt, + uint128 fee, + bytes collateralData + ); + + /** + * @notice Emitted when FT is issued using existed Gearing Token + * @param caller The address initiating the issuance + * @param recipient The address receiving the FT + * @param gtId The ID of the Gearing Token + * @param debtAmt The amount of debt in underlying token + * @param ftAmt The amount of FT issued + * @param issueFee The amount of issuing fee, unit by FT token + */ + event IssueFtByExistedGt( + address indexed caller, + address indexed recipient, + uint256 indexed gtId, + uint128 debtAmt, + uint128 ftAmt, + uint128 issueFee + ); + + /** + * @notice Emitted when tokens are redeemed + * @param caller The address initiating the redemption + * @param recipient The address receiving the redeemed tokens + * @param proportion The proportion of underlying token and collateral should be deliveried + * base 1e16 decimals + * @param underlyingAmt The amount of underlying received + * @param deliveryData The encoded data of collateral received + */ + event Redeem( + address indexed caller, address indexed recipient, uint128 proportion, uint128 underlyingAmt, bytes deliveryData + ); + + /** + * @notice Emitted when an order is created + * @param maker The maker of the order + * @param order The order + */ + event CreateOrder(address indexed maker, ITermMaxOrder indexed order); +} diff --git a/contracts/v1/events/OrderEvents.sol b/contracts/v1/events/OrderEvents.sol new file mode 100644 index 0000000..7db1f33 --- /dev/null +++ b/contracts/v1/events/OrderEvents.sol @@ -0,0 +1,108 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20, ITermMaxMarket} from "../ITermMaxMarket.sol"; +import {CurveCuts, FeeConfig} from "../storage/TermMaxStorage.sol"; +import {ISwapCallback} from "../ISwapCallback.sol"; + +/** + * @title Order Events Interface + * @notice Events emitted by the TermMax order operations + */ +interface OrderEvents { + /** + * @notice Emitted when an order is initialized + * @param market The market address + * @param maker The maker address + * @param maxXtReserve The maximum XT reserve + * @param swapTrigger The swap callback contract + * @param curveCuts The curve parameters + */ + event OrderInitialized( + ITermMaxMarket indexed market, + address indexed maker, + uint256 maxXtReserve, + ISwapCallback swapTrigger, + CurveCuts curveCuts + ); + + /** + * @notice Emitted when the fee configuration is updated + * @param feeConfig The new fee configuration + */ + event UpdateFeeConfig(FeeConfig feeConfig); + + /** + * @notice Emitted when an order is updated + * @param curveCuts The new curve parameters + * @param ftChangeAmt The change in FT reserves + * @param xtChangeAmt The change in XT reserves + * @param gtId The global trade ID + * @param maxXtReserve The new maximum XT reserve + * @param swapTrigger The swap callback contract + */ + event UpdateOrder( + CurveCuts curveCuts, + int256 ftChangeAmt, + int256 xtChangeAmt, + uint256 gtId, + uint256 maxXtReserve, + ISwapCallback swapTrigger + ); + + /** + * @notice Emitted when a swap occurs + * @param tokenIn The token being swapped in + * @param tokenOut The token being swapped out + * @param caller The address initiating the swap + * @param recipient The address receiving the swapped tokens + * @param tokenAmtIn The amount of tokenIn being swapped + * @param netTokenOut The amount of tokenOut being received + * @param feeAmt The amount of fee being paid + */ + event SwapExactTokenToToken( + IERC20 indexed tokenIn, + IERC20 indexed tokenOut, + address caller, + address recipient, + uint128 tokenAmtIn, + uint128 netTokenOut, + uint128 feeAmt + ); + + /** + * @notice Emitted when a swap occurs + * @param tokenIn The token being swapped in + * @param tokenOut The token being swapped out + * @param caller The address initiating the swap + * @param recipient The address receiving the swapped tokens + * @param tokenAmtOut The amount of tokenOut being received + * @param netTokenIn The amount of tokenIn being swapped + * @param feeAmt The amount of fee being paid + */ + event SwapTokenToExactToken( + IERC20 indexed tokenIn, + IERC20 indexed tokenOut, + address caller, + address recipient, + uint128 tokenAmtOut, + uint128 netTokenIn, + uint128 feeAmt + ); + + /** + * @notice Emitted when assets are withdrawn + * @param token The token being withdrawn + * @param caller The address initiating the withdrawal + * @param recipient The address receiving the withdrawn tokens + * @param amount The amount of tokens being withdrawn + */ + event WithdrawAssets(IERC20 indexed token, address indexed caller, address indexed recipient, uint256 amount); + + /** + * @notice Emitted when maker ownership is transferred + * @param oldMaker The address of the previous maker + * @param newMaker The address of the new maker + */ + event MakerOwnershipTransferred(address oldMaker, address newMaker); +} diff --git a/contracts/v1/events/RouterEvents.sol b/contracts/v1/events/RouterEvents.sol new file mode 100644 index 0000000..7b1e85b --- /dev/null +++ b/contracts/v1/events/RouterEvents.sol @@ -0,0 +1,181 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {ITermMaxMarket} from "../ITermMaxMarket.sol"; +import {ITermMaxOrder} from "../ITermMaxOrder.sol"; +import {CurveCuts} from "../storage/TermMaxStorage.sol"; + +/** + * @title Router Events Interface + * @notice Events emitted by the TermMax router operations + */ +interface RouterEvents { + /** + * @notice Emitted when a market's whitelist status is updated + * @param market The address of the market + * param isWhitelist Whether the market is whitelisted + */ + event UpdateMarketWhiteList(address market, bool isWhitelist); + + /** + * @notice Emitted when a swap adapter's whitelist status is updated + * @param adapter The address of the swap adapter + * @param isWhitelist Whether the adapter is whitelisted + */ + event UpdateSwapAdapterWhiteList(address adapter, bool isWhitelist); + + /** + * @notice Emitted when tokens are swapped for exact tokens + * @param tokenIn The input token + * @param tokenOut The output token + * @param caller The address initiating the swap + * @param recipient The address receiving the output tokens + * @param orders The array of orders used in the swap + * @param tradingAmts The array of trading amounts + * @param actualTokenOut The actual amount of output tokens + */ + event SwapExactTokenToToken( + IERC20 indexed tokenIn, + IERC20 indexed tokenOut, + address caller, + address recipient, + ITermMaxOrder[] orders, + uint128[] tradingAmts, + uint256 actualTokenOut + ); + + /** + * @notice Emitted when tokens are swapped for exact tokens + * @param tokenIn The input token + * @param tokenOut The output token + * @param caller The address initiating the swap + * @param recipient The address receiving the output tokens + * @param orders The array of orders used in the swap + * @param tradingAmts The array of trading amounts + * @param actualTokenIn The actual amount of input tokens + */ + event SwapTokenToExactToken( + IERC20 indexed tokenIn, + IERC20 indexed tokenOut, + address caller, + address recipient, + ITermMaxOrder[] orders, + uint128[] tradingAmts, + uint256 actualTokenIn + ); + + /** + * @notice Emitted when tokens are sold + * @param market The address of the market + * @param caller The address initiating the sale + * @param recipient The address receiving the output tokens + * @param ftInAmt The amount of ft tokens sold + * @param xtInAmt The amount of xt tokens sold + * @param orders The array of orders used in the sale + * @param amtsToSellTokens The array of amounts to sell tokens + * @param actualTokenOut The actual amount of output tokens + */ + event SellTokens( + ITermMaxMarket indexed market, + address caller, + address recipient, + uint128 ftInAmt, + uint128 xtInAmt, + ITermMaxOrder[] orders, + uint128[] amtsToSellTokens, + uint256 actualTokenOut + ); + + /** + * @notice Emitted when a new gt is issued + * @param market The address of the market + * @param gtId The id of the gt + * @param caller The address initiating the issue + * @param recipient The address receiving the gt + * @param debtTokenAmtIn The amount of debt tokens used to issue the gt + * @param xtAmtIn The amount of xt tokens used to issue the gt + * @param ltv The loan to value ratio + * @param collData The collateral data + */ + event IssueGt( + ITermMaxMarket indexed market, + uint256 indexed gtId, + address caller, + address recipient, + uint128 debtTokenAmtIn, + uint128 xtAmtIn, + uint128 ltv, + bytes collData + ); + + /** + * @notice Emitted when a borrow operation is performed + * @param market The address of the market + * @param gtId The id of the gt + * @param caller The address initiating the borrow + * @param recipient The address receiving the borrowed tokens + * @param collInAmt The amount of collateral tokens used + * @param actualDebtAmt The actual amount of debt tokens borrowed + * @param borrowAmt The amount of tokens borrowed + */ + event Borrow( + ITermMaxMarket indexed market, + uint256 indexed gtId, + address caller, + address recipient, + uint256 collInAmt, + uint128 actualDebtAmt, + uint128 borrowAmt + ); + + /** + * @notice Emitted when a repay operation is performed through ft + * @param market The address of the market + * @param gtId The id of the gt + * @param caller The address initiating the repay + * @param recipient The address receiving the repaid tokens + * @param repayAmt The amount of tokens repaid + * @param returnAmt The amount of tokens returned + */ + event RepayByTokenThroughFt( + ITermMaxMarket indexed market, + uint256 indexed gtId, + address caller, + address recipient, + uint256 repayAmt, + uint256 returnAmt + ); + + /** + * @notice Emitted when a redeem and swap operation is performed + * @param market The address of the market + * @param ftAmount The amount of ft tokens redeemed + * @param caller The address initiating the redeem and swap + * @param recipient The address receiving the output tokens + * @param actualTokenOut The actual amount of output tokens + */ + event RedeemAndSwap( + ITermMaxMarket indexed market, uint256 ftAmount, address caller, address recipient, uint256 actualTokenOut + ); + + /** + * @notice Emitted when an order is created and deposited + * @param market The address of the market + * @param order The order created + * @param maker The address of the maker + * @param debtTokenToDeposit The amount of debt tokens deposited + * @param ftToDeposit The amount of ft tokens deposited + * @param xtToDeposit The amount of xt tokens deposited + * @param curveCuts The curve cuts used + */ + event CreateOrderAndDeposit( + ITermMaxMarket indexed market, + ITermMaxOrder indexed order, + address maker, + uint256 debtTokenToDeposit, + uint128 ftToDeposit, + uint128 xtToDeposit, + CurveCuts curveCuts + ); +} diff --git a/contracts/v1/events/VaultEvents.sol b/contracts/v1/events/VaultEvents.sol new file mode 100644 index 0000000..cb1f43f --- /dev/null +++ b/contracts/v1/events/VaultEvents.sol @@ -0,0 +1,199 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {CurveCuts} from "../storage/TermMaxStorage.sol"; + +/** + * @title Vault Events Interface + * @notice Events emitted by the TermMax vault operations + */ +interface VaultEvents { + /** + * @notice Emitted when a new guardian is proposed + * @param newGuardian The address of the proposed guardian + * @param validAt The timestamp when the guardian change will take effect + */ + event SubmitGuardian(address newGuardian, uint64 validAt); + + /** + * @notice Emitted when the vault capacity is updated + * @param caller The address that initiated the capacity update + * @param newCapacity The new capacity value + */ + event SetCapacity(address indexed caller, uint256 newCapacity); + + /** + * @notice Emitted when a new curator is set + * @param newCurator The address of the new curator + */ + event SetCurator(address newCurator); + + /** + * @notice Emitted when a market's whitelist status is proposed + * @param market The address of the market + * @param validAt The timestamp when the market whitelist change will take effect + */ + event SubmitMarketToWhitelist(address indexed market, uint64 validAt); + + /** + * @notice Emitted when a pending market whitelist change is revoked + * @param caller The address that initiated the revocation + * @param market The address of the market + */ + event RevokePendingMarket(address indexed caller, address indexed market); + + /** + * @notice Emitted when the performance fee rate is updated + * @param caller The address that initiated the update + * @param newPerformanceFeeRate The new performance fee rate + */ + event SetPerformanceFeeRate(address indexed caller, uint256 newPerformanceFeeRate); + + /** + * @notice Emitted when a new performance fee rate is proposed + * @param newPerformanceFeeRate The proposed performance fee rate + * @param validAt The timestamp when the performance fee rate change will take effect + */ + event SubmitPerformanceFeeRate(uint256 newPerformanceFeeRate, uint64 validAt); + + /** + * @notice Emitted when a market's whitelist status is updated + * @param caller The address that initiated the update + * @param market The address of the market + * @param isWhitelisted The new whitelist status + */ + event SetMarketWhitelist(address indexed caller, address indexed market, bool isWhitelisted); + + /** + * @notice Emitted when a new order is created + * @param caller The address that created the order + * @param market The market address + * @param order The order address + * @param maxSupply The maximum supply for the order + * @param initialReserve The initial reserve amount + * @param curveCuts The curve parameters for the order + */ + event CreateOrder( + address indexed caller, + address indexed market, + address indexed order, + uint256 maxSupply, + uint256 initialReserve, + CurveCuts curveCuts + ); + + /** + * @notice Emitted when an order is updated + * @param caller The address that updated the order + * @param order The order address + * @param changes The changes made to the order + * @param maxSupply The new maximum supply for the order + * @param curveCuts The updated curve parameters for the order + */ + event UpdateOrder( + address indexed caller, address indexed order, int256 changes, uint256 maxSupply, CurveCuts curveCuts + ); + + /** + * @notice Emitted when bad debt is dealt with + * @param caller The address that initiated the bad debt deal + * @param recipient The address that received the bad debt + * @param collateral The collateral address + * @param badDebt The amount of bad debt + * @param shares The number of shares + * @param collateralOut The amount of collateral out + */ + event DealBadDebt( + address indexed caller, + address indexed recipient, + address indexed collateral, + uint256 badDebt, + uint256 shares, + uint256 collateralOut + ); + + /** + * @notice Emitted when an order is redeemed + * @param caller The address that redeemed the order + * @param order The order address + * @param ftAmt The amount of ft tokens + * @param redeemedAmt The amount redeemed + */ + event RedeemOrder(address indexed caller, address indexed order, uint128 ftAmt, uint128 redeemedAmt); + + /** + * @notice Emitted when performance fee is withdrawn + * @param caller The address that withdrew the performance fee + * @param recipient The address that received the performance fee + * @param amount The amount of performance fee withdrawn + */ + event WithdrawPerformanceFee(address indexed caller, address indexed recipient, uint256 amount); + + /** + * @notice Emitted when a new timelock is proposed + * @param newTimelock The proposed timelock value + * @param validAt The timestamp when the timelock change will take effect + */ + event SubmitTimelock(uint256 newTimelock, uint64 validAt); + + /** + * @notice Emitted when the timelock is updated + * @param caller The address that updated the timelock + * @param newTimelock The new timelock value + */ + event SetTimelock(address indexed caller, uint256 newTimelock); + + /** + * @notice Emitted when the guardian is updated + * @param caller The address that updated the guardian + * @param newGuardian The new guardian address + */ + event SetGuardian(address indexed caller, address newGuardian); + + /** + * @notice Emitted when a pending timelock change is revoked + * @param caller The address that initiated the revocation + */ + event RevokePendingTimelock(address indexed caller); + + /** + * @notice Emitted when a pending guardian change is revoked + * @param caller The address that initiated the revocation + */ + event RevokePendingGuardian(address indexed caller); + + /** + * @notice Emitted when the performance fee rate is proposed to be revoked + * @param caller The address that initiated the revocation + */ + event RevokePendingPerformanceFeeRate(address indexed caller); + + /** + * @notice Emitted when the cap for an order is updated + * @param caller The address that updated the cap + * @param order The order address + * @param newCap The new cap value + */ + event SetCap(address indexed caller, address indexed order, uint256 newCap); + + /** + * @notice Emitted when an allocator's status is updated + * @param allocator The allocator address + * @param newIsAllocator The new allocator status + */ + event SetIsAllocator(address indexed allocator, bool newIsAllocator); + + /** + * @notice Emitted when the supply queue is updated + * @param caller The address that updated the supply queue + * @param newSupplyQueue The new supply queue + */ + event UpdateSupplyQueue(address indexed caller, address[] newSupplyQueue); + + /** + * @notice Emitted when the withdraw queue is updated + * @param caller The address that updated the withdraw queue + * @param newWithdrawQueue The new withdraw queue + */ + event UpdateWithdrawQueue(address indexed caller, address[] newWithdrawQueue); +} diff --git a/contracts/v1/extensions/PTWithPriceFeed.sol b/contracts/v1/extensions/PTWithPriceFeed.sol new file mode 100644 index 0000000..ab1eb8e --- /dev/null +++ b/contracts/v1/extensions/PTWithPriceFeed.sol @@ -0,0 +1,122 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; +import {PendlePYLpOracle} from "@pendle/core-v2/contracts/oracles/PtYtLpOracle/PendlePYLpOracle.sol"; +import {PendlePYOracleLib} from "@pendle/core-v2/contracts/oracles/PtYtLpOracle/PendlePYOracleLib.sol"; +import {PMath} from "@pendle/core-v2/contracts/core/libraries/math/PMath.sol"; +import {IPMarket} from "@pendle/core-v2/contracts/interfaces/IPMarket.sol"; +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; +import {Math} from "@openzeppelin/contracts/utils/math/Math.sol"; + +/** + * @title The customized Pendle PT price feed contract mutated from Chainlink AggregatorV3Interface + * @author Term Structure Labs + * @notice Use the customized price feed contract to normalized price feed interface for TermMax Protocol + */ +contract PTWithPriceFeed is AggregatorV3Interface { + using Math for uint256; + using SafeCast for *; + using PendlePYOracleLib for IPMarket; + + // Pendle PY LP oracle, refer to `https://docs.pendle.finance/Developers/Oracles/HowToIntegratePtAndLpOracle` + PendlePYLpOracle public immutable PY_LP_ORACLE; + // Pendle market + IPMarket public immutable MARKET; + // TWAP duration + uint32 public immutable DURATION; + // Price feed interface + AggregatorV3Interface public immutable PRICE_FEED; + + // error to call `getRoundData` function + error GetRoundDataNotSupported(); + // error when Pendle PY LP oracle is not ready + error OracleIsNotReady(); + // error when price is zero + error PriceIsZero(); + + /** + * @notice Construct the PT price feed contract + * @param pendlePYLpOracle The Pendle PY LP oracle contract + * @param market The Pendle market contract + * @param duration The TWAP duration + * @param priceFeed The price feed interface + */ + constructor(address pendlePYLpOracle, address market, uint32 duration, address priceFeed) { + (, int256 answer,,,) = AggregatorV3Interface(priceFeed).latestRoundData(); + if (answer == 0) revert PriceIsZero(); + + PY_LP_ORACLE = PendlePYLpOracle(pendlePYLpOracle); + MARKET = IPMarket(market); + DURATION = duration; + PRICE_FEED = AggregatorV3Interface(priceFeed); + + if (!_oracleIsReady()) revert OracleIsNotReady(); + } + + /** + * @notice Revert this function because cannot get the chi (rate accumulator) at a specific round + */ + function getRoundData(uint80 /* _roundId */ ) + external + pure + returns ( + uint80, /* roundId */ + int256, /* answer */ + uint256, /* startedAt */ + uint256, /* updatedAt */ + uint80 /* answeredInRound */ + ) + { + // error to call this function because cannot get the chi (rate accumulator) at a specific round + revert GetRoundDataNotSupported(); + } + + /** + * @notice Get the latest round data from chainlink and calculate the PT price by multiplying PT rate in SY and SY price + * @return roundId The round ID + * @return answer The calculated PT price + * @return startedAt Timestamp of when the round started + * @return updatedAt Timestamp of when the round was updated + * @return answeredInRound The round ID of the round in which the answer was computed + */ + function latestRoundData() + external + view + returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) + { + // PT price = PT rate in SY * SY price / PT to asset rate base + uint256 ptRateInSy = MARKET.getPtToSyRate(DURATION); // PT -> SY + + (roundId, answer, startedAt, updatedAt, answeredInRound) = PRICE_FEED.latestRoundData(); + answer = ptRateInSy.mulDiv(answer.toUint256(), PMath.ONE).toInt256(); + + return (roundId, answer, startedAt, updatedAt, answeredInRound); + } + + /** + * @notice Check if the Pendle PY LP oracle is ready + * @return True if the oracle is ready, otherwise false + */ + function _oracleIsReady() internal view returns (bool) { + (bool increaseCardinalityRequired,, bool oldestObservationSatisfied) = + PY_LP_ORACLE.getOracleState(address(MARKET), DURATION); + + return !increaseCardinalityRequired && oldestObservationSatisfied; + } + + /** + * ========== Return original price feed data ========== + */ + function decimals() external view returns (uint8) { + return PRICE_FEED.decimals(); + } + + function description() external view returns (string memory) { + return PRICE_FEED.description(); + } + + function version() external view returns (uint256) { + return PRICE_FEED.version(); + } +} diff --git a/contracts/v1/extensions/PendleHelper.sol b/contracts/v1/extensions/PendleHelper.sol new file mode 100644 index 0000000..0b4cd85 --- /dev/null +++ b/contracts/v1/extensions/PendleHelper.sol @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "@pendle/core-v2/contracts/interfaces/IPAllActionV3.sol"; +import "@pendle/core-v2/contracts/interfaces/IPMarket.sol"; + +abstract contract PendleHelper { + // EmptySwap means no swap aggregator is involved + SwapData public emptySwap; + + // EmptyLimit means no limit order is involved + LimitOrderData public emptyLimit; + + // DefaultApprox means no off-chain preparation is involved, more gas consuming (~ 180k gas) + ApproxParams public defaultApprox = ApproxParams(0, type(uint256).max, 0, 256, 1e14); + + /// @notice create a simple TokenInput struct without using any aggregators. For more info please refer to + /// IPAllActionTypeV3.sol + function createTokenInputStruct(address tokenIn, uint256 netTokenIn) + internal + view + returns (TokenInput memory input) + { + input.tokenIn = tokenIn; + input.netTokenIn = netTokenIn; + input.tokenMintSy = tokenIn; + } + + /// @notice create a simple TokenOutput struct without using any aggregators. For more info please refer to + /// IPAllActionTypeV3.sol + function createTokenOutputStruct(address tokenOut, uint256 minTokenOut) + internal + view + returns (TokenOutput memory output) + { + output.tokenOut = tokenOut; + output.minTokenOut = minTokenOut; + output.tokenRedeemSy = tokenOut; + } +} diff --git a/contracts/v1/extensions/PriceFeedConverter.sol b/contracts/v1/extensions/PriceFeedConverter.sol new file mode 100644 index 0000000..4dab08e --- /dev/null +++ b/contracts/v1/extensions/PriceFeedConverter.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; +import {MathLib} from "contracts/lib/MathLib.sol"; + +contract PriceFeedConverter is AggregatorV3Interface { + using MathLib for *; + + error GetRoundDataNotSupported(); + + AggregatorV3Interface public immutable aTokenToBTokenPriceFeed; + AggregatorV3Interface public immutable bTokenToCTokenPriceFeed; + + int256 immutable priceDemonitor; + + constructor(address _aTokenToBTokenPriceFeed, address _bTokenToCTokenPriceFeed) { + aTokenToBTokenPriceFeed = AggregatorV3Interface(_aTokenToBTokenPriceFeed); + bTokenToCTokenPriceFeed = AggregatorV3Interface(_bTokenToCTokenPriceFeed); + priceDemonitor = + int256(10 ** aTokenToBTokenPriceFeed.decimals()) * int256(10 ** bTokenToCTokenPriceFeed.decimals()); + } + + function decimals() public view returns (uint8) { + return 8; + } + + function description() external view returns (string memory) { + return string( + abi.encodePacked(aTokenToBTokenPriceFeed.description(), " - ", bTokenToCTokenPriceFeed.description()) + ); + } + + function version() external view returns (uint256) { + return aTokenToBTokenPriceFeed.version().min(bTokenToCTokenPriceFeed.version()); + } + + function getRoundData(uint80 /* _roundId */ ) + external + view + returns ( + uint80, /* roundId */ + int256, /* answer */ + uint256, /* startedAt */ + uint256, /* updatedAt */ + uint80 /* answeredInRound */ + ) + { + // error to call this function because cannot get the chi (rate accumulator) at a specific round + revert GetRoundDataNotSupported(); + } + + function latestRoundData() external view returns (uint80, int256, uint256, uint256, uint80) { + (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) = + aTokenToBTokenPriceFeed.latestRoundData(); + (, int256 answer2, uint256 startedAt2, uint256 updatedAt2,) = bTokenToCTokenPriceFeed.latestRoundData(); + // tokenPrice = answer * answer2 + answer = answer * answer2 * int256((10 ** decimals())) / priceDemonitor; + return (roundId, answer, startedAt.min(startedAt2), updatedAt.min(updatedAt2), answeredInRound); + } +} diff --git a/contracts/v1/extensions/PriceFeedFactory.sol b/contracts/v1/extensions/PriceFeedFactory.sol new file mode 100644 index 0000000..5939885 --- /dev/null +++ b/contracts/v1/extensions/PriceFeedFactory.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {PriceFeedWithERC4626} from "./PriceFeedWithERC4626.sol"; +import {PriceFeedConverter} from "./PriceFeedConverter.sol"; +import {PTWithPriceFeed} from "./PTWithPriceFeed.sol"; + +contract PriceFeedFactory { + event PriceFeedCreated(address indexed priceFeed); + + function createPriceFeedWithERC4626(address _assetPriceFeed, address _vault) external returns (address) { + address priceFeed = address(new PriceFeedWithERC4626(_assetPriceFeed, _vault)); + emit PriceFeedCreated(priceFeed); + return priceFeed; + } + + function createPriceFeedConverter(address _aTokenToBTokenPriceFeed, address _bTokenToCTokenPriceFeed) + external + returns (address) + { + address priceFeed = address(new PriceFeedConverter(_aTokenToBTokenPriceFeed, _bTokenToCTokenPriceFeed)); + emit PriceFeedCreated(priceFeed); + return priceFeed; + } + + function createPTWithPriceFeed(address _pendlePYLpOracle, address _market, uint32 _duration, address _priceFeed) + external + returns (address) + { + address priceFeed = address(new PTWithPriceFeed(_pendlePYLpOracle, _market, _duration, _priceFeed)); + emit PriceFeedCreated(priceFeed); + return priceFeed; + } +} diff --git a/contracts/v1/extensions/PriceFeedWithERC4626.sol b/contracts/v1/extensions/PriceFeedWithERC4626.sol new file mode 100644 index 0000000..0f3c13e --- /dev/null +++ b/contracts/v1/extensions/PriceFeedWithERC4626.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; +import {IERC4626} from "@openzeppelin/contracts/interfaces/IERC4626.sol"; +import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import {MathLib} from "contracts/lib/MathLib.sol"; + +contract PriceFeedWithERC4626 is AggregatorV3Interface { + using MathLib for *; + + error GetRoundDataNotSupported(); + + AggregatorV3Interface public immutable assetPriceFeed; + IERC4626 public immutable vault; + int256 immutable priceDemonitor; + uint256 immutable vaultDemonitor; + + constructor(address _assetPriceFeed, address _vault) { + assetPriceFeed = AggregatorV3Interface(_assetPriceFeed); + vault = IERC4626(_vault); + vaultDemonitor = 10 ** vault.decimals(); + uint256 assetDemonitor = 10 ** IERC20Metadata(vault.asset()).decimals(); + priceDemonitor = int256(10 ** assetPriceFeed.decimals()) * int256(assetDemonitor); + } + + function decimals() public view returns (uint8) { + return 8; + } + + function description() external view returns (string memory) { + return string(abi.encodePacked("Price Feed for ", vault.name())); + } + + function version() external view returns (uint256) { + return assetPriceFeed.version(); + } + + function getRoundData(uint80 /* _roundId */ ) + external + view + returns ( + uint80, /* roundId */ + int256, /* answer */ + uint256, /* startedAt */ + uint256, /* updatedAt */ + uint80 /* answeredInRound */ + ) + { + // error to call this function because cannot get the chi (rate accumulator) at a specific round + revert GetRoundDataNotSupported(); + } + + function latestRoundData() external view returns (uint80, int256, uint256, uint256, uint80) { + (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) = + assetPriceFeed.latestRoundData(); + uint256 vaultAnswer = vault.previewRedeem(vaultDemonitor).min(vault.convertToAssets(vaultDemonitor)); + answer = answer * int256(vaultAnswer) * int256((10 ** decimals())) / priceDemonitor; + return (roundId, answer, startedAt, updatedAt, answeredInRound); + } +} diff --git a/contracts/v1/factory/ITermMaxFactory.sol b/contracts/v1/factory/ITermMaxFactory.sol new file mode 100644 index 0000000..b20c359 --- /dev/null +++ b/contracts/v1/factory/ITermMaxFactory.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {MarketInitialParams} from "../storage/TermMaxStorage.sol"; + +/** + * @title The TermMax factory interface + * @author Term Structure Labs + */ +interface ITermMaxFactory { + function TERMMAX_MARKET_IMPLEMENTATION() external view returns (address); + + function gtImplements(bytes32 gtKey) external view returns (address gtImplement); + + /// @notice Set the implementations of TermMax Gearing Token contract + function setGtImplement(string memory gtImplementName, address gtImplement) external; + + /// @notice Predict the address of token pair + function predictMarketAddress( + address deployer, + address collateral, + address debtToken, + uint64 maturity, + uint256 salt + ) external view returns (address market); + + /// @notice Deploy a new market + function createMarket(bytes32 gtKey, MarketInitialParams memory params, uint256 salt) + external + returns (address market); +} diff --git a/contracts/v1/factory/IVaultFactory.sol b/contracts/v1/factory/IVaultFactory.sol new file mode 100644 index 0000000..d471035 --- /dev/null +++ b/contracts/v1/factory/IVaultFactory.sol @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {VaultInitialParams} from "contracts/storage/TermMaxStorage.sol"; + +/** + * @title TermMax Vault Factory Interface + * @author Term Structure Labs + * @notice Interface for creating new TermMax vaults + */ +interface IVaultFactory { + /** + * @notice The implementation of TermMax Vault contract + */ + function TERMMAX_VAULT_IMPLEMENTATION() external view returns (address); + + /** + * @notice Predict the address of a new TermMax vault + * @param deployer The address of the vault deployer + * @param asset The address of the asset + * @param name The name of the vault + * @param symbol The symbol of the vault + * @param salt The salt used to create the vault + * @return vault The predicted address of the vault + */ + function predictVaultAddress( + address deployer, + address asset, + string memory name, + string memory symbol, + uint256 salt + ) external view returns (address vault); + + /** + * @notice Creates a new TermMax vault with the specified parameters + * @param initialParams Initial parameters for vault configuration + * @param salt The salt used to create the vault + * @return address The address of the newly created vault + */ + function createVault(VaultInitialParams memory initialParams, uint256 salt) external returns (address); +} diff --git a/contracts/v1/factory/TermMaxFactory.sol b/contracts/v1/factory/TermMaxFactory.sol new file mode 100644 index 0000000..2d391b1 --- /dev/null +++ b/contracts/v1/factory/TermMaxFactory.sol @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {Ownable, Ownable2Step} from "@openzeppelin/contracts/access/Ownable2Step.sol"; +import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol"; +import {TermMaxMarket} from "../TermMaxMarket.sol"; +import {GearingTokenWithERC20} from "../tokens/GearingTokenWithERC20.sol"; +import {MarketInitialParams} from "../storage/TermMaxStorage.sol"; +import {FactoryErrors} from "../errors/FactoryErrors.sol"; +import {FactoryEvents} from "../events/FactoryEvents.sol"; +import {ITermMaxMarket} from "../ITermMaxMarket.sol"; +import {ITermMaxFactory} from "./ITermMaxFactory.sol"; + +/** + * @title The TermMax factory + * @author Term Structure Labs + */ +contract TermMaxFactory is Ownable2Step, FactoryErrors, FactoryEvents, ITermMaxFactory { + bytes32 constant GT_ERC20 = keccak256("GearingTokenWithERC20"); + + /// @notice The implementation of TermMax Market contract + address public immutable TERMMAX_MARKET_IMPLEMENTATION; + + /// @notice The implementations of TermMax Gearing Token contract + /// @dev Based on the abstract GearingToken contract, + /// different GearingTokens can be adapted to various collaterals, + /// such as ERC20 tokens and ERC721 tokens. + mapping(bytes32 => address) public gtImplements; + + constructor(address admin, address TERMMAX_MARKET_IMPLEMENTATION_) Ownable(admin) { + if (TERMMAX_MARKET_IMPLEMENTATION_ == address(0)) { + revert InvalidImplementation(); + } + TERMMAX_MARKET_IMPLEMENTATION = TERMMAX_MARKET_IMPLEMENTATION_; + + gtImplements[GT_ERC20] = address(new GearingTokenWithERC20()); + } + + function setGtImplement(string memory gtImplementName, address gtImplement) external onlyOwner { + bytes32 key = keccak256(abi.encodePacked(gtImplementName)); + gtImplements[key] = gtImplement; + emit SetGtImplement(key, gtImplement); + } + + function predictMarketAddress( + address deployer, + address collateral, + address debtToken, + uint64 maturity, + uint256 salt + ) external view returns (address market) { + return Clones.predictDeterministicAddress( + TERMMAX_MARKET_IMPLEMENTATION, keccak256(abi.encode(deployer, collateral, debtToken, maturity, salt)) + ); + } + + function createMarket(bytes32 gtKey, MarketInitialParams memory params, uint256 salt) + external + onlyOwner + returns (address market) + { + params.gtImplementation = gtImplements[gtKey]; + if (params.gtImplementation == address(0)) { + revert CantNotFindGtImplementation(); + } + market = Clones.cloneDeterministic( + TERMMAX_MARKET_IMPLEMENTATION, + keccak256(abi.encode(msg.sender, params.collateral, params.debtToken, params.marketConfig.maturity, salt)) + ); + ITermMaxMarket(market).initialize(params); + + emit CreateMarket(market, params.collateral, params.debtToken); + } +} diff --git a/contracts/v1/factory/VaultFactory.sol b/contracts/v1/factory/VaultFactory.sol new file mode 100644 index 0000000..cfb376d --- /dev/null +++ b/contracts/v1/factory/VaultFactory.sol @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol"; +import {ITermMaxVault} from "contracts/vault/ITermMaxVault.sol"; +import {VaultInitialParams} from "contracts/storage/TermMaxStorage.sol"; +import {FactoryEvents} from "contracts/events/FactoryEvents.sol"; +import {FactoryErrors} from "contracts/errors/FactoryErrors.sol"; +import {IVaultFactory} from "./IVaultFactory.sol"; + +/** + * @title The TermMax vault factory + * @author Term Structure Labs + */ +contract VaultFactory is FactoryEvents, IVaultFactory, FactoryErrors { + /** + * @notice The implementation of TermMax Vault contract + */ + address public immutable TERMMAX_VAULT_IMPLEMENTATION; + + constructor(address TERMMAX_VAULT_IMPLEMENTATION_) { + if (TERMMAX_VAULT_IMPLEMENTATION_ == address(0)) { + revert InvalidImplementation(); + } + TERMMAX_VAULT_IMPLEMENTATION = TERMMAX_VAULT_IMPLEMENTATION_; + } + + /** + * @inheritdoc IVaultFactory + */ + function predictVaultAddress( + address deployer, + address asset, + string memory name, + string memory symbol, + uint256 salt + ) external view returns (address vault) { + return Clones.predictDeterministicAddress( + TERMMAX_VAULT_IMPLEMENTATION, keccak256(abi.encode(deployer, asset, name, symbol, salt)) + ); + } + + /** + * @inheritdoc IVaultFactory + */ + function createVault(VaultInitialParams memory initialParams, uint256 salt) public returns (address vault) { + vault = Clones.cloneDeterministic( + TERMMAX_VAULT_IMPLEMENTATION, + keccak256(abi.encode(msg.sender, initialParams.asset, initialParams.name, initialParams.symbol, salt)) + ); + ITermMaxVault(vault).initialize(initialParams); + emit CreateVault(vault, msg.sender, initialParams); + } +} diff --git a/contracts/v1/lib/ArrayUtils.sol b/contracts/v1/lib/ArrayUtils.sol new file mode 100644 index 0000000..a93ba97 --- /dev/null +++ b/contracts/v1/lib/ArrayUtils.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library ArrayUtils { + error IndexOutOfBounds(); + + function indexOf(address[] storage arr, address value) internal view returns (uint256) { + for (uint256 i = 0; i < arr.length; i++) { + if (arr[i] == value) { + return i; + } + } + revert IndexOutOfBounds(); + } + + function remove(address[] storage arr, uint256 index) internal { + for (uint256 i = index; i < arr.length - 1; ++i) { + arr[i] = arr[i + 1]; + } + arr.pop(); + } +} diff --git a/contracts/v1/lib/Constants.sol b/contracts/v1/lib/Constants.sol new file mode 100644 index 0000000..eb9ae7c --- /dev/null +++ b/contracts/v1/lib/Constants.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title The general constants of TermMax + * @author Term Structure Labs + */ +library Constants { + /// @notice The base decimals of ratio + uint256 constant DECIMAL_BASE = 1e8; + /// @notice The square of the base decimals + uint256 constant DECIMAL_BASE_SQ = 1e16; + /// @notice The days of one year + uint256 constant DAYS_IN_YEAR = 365; + /// @notice The seconds of one day + uint256 constant SECONDS_IN_DAY = 1 days; + /// @notice The window time left for the liquidation bot after the market expires + uint256 constant LIQUIDATION_WINDOW = 2 hours; + /// @notice The limit of fee ratio + uint32 constant MAX_FEE_RATIO = 0.2e8; +} diff --git a/contracts/v1/lib/GearingTokenConstants.sol b/contracts/v1/lib/GearingTokenConstants.sol new file mode 100644 index 0000000..1125a2b --- /dev/null +++ b/contracts/v1/lib/GearingTokenConstants.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title The constants of GearingToken + * @author Term Structure Labs + */ +library GearingTokenConstants { + /// @notice The percentage of repay amount to liquidator while do liquidate, decimals 1e8 + uint256 constant REWARD_TO_LIQUIDATOR = 0.05e8; + /// @notice The percentage of repay amount to protocol while do liquidate, decimals 1e8 + uint256 constant REWARD_TO_PROTOCOL = 0.05e8; + /// @notice Semi-liquidation threshold: if the value of the collateral reaches this value, + /// only partial liquidation can be performed, decimals 1e8. + uint256 constant HALF_LIQUIDATION_THRESHOLD = 10000e8; +} diff --git a/contracts/v1/lib/LinkedList.sol b/contracts/v1/lib/LinkedList.sol new file mode 100644 index 0000000..3fa5dfc --- /dev/null +++ b/contracts/v1/lib/LinkedList.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/// @title LinkedList +/// @author Term Structure Labs +/// @notice A linked list library +library LinkedList { + function insertWhenZeroAsRoot(mapping(uint64 => uint64) storage s, uint64 value) internal { + uint64 prev = 0; + uint64 current = s[0]; + + // find insert position + while (current != 0 && current < value) { + prev = current; + current = s[current]; + } + + // ignore if value exists + if (current == value) { + return; + } + + // insert node + s[value] = current; + s[prev] = value; + } + + function popWhenZeroAsRoot(mapping(uint64 => uint64) storage s) internal { + uint64 first = s[0]; + if (first != 0) { + // update head + s[0] = s[first]; + // delete node + delete s[first]; + } + } +} diff --git a/contracts/v1/lib/MarketConstants.sol b/contracts/v1/lib/MarketConstants.sol new file mode 100644 index 0000000..bdae5e6 --- /dev/null +++ b/contracts/v1/lib/MarketConstants.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library MarketConstants { + string constant PREFIX_FT = "FT:"; + string constant PREFIX_XT = "XT:"; + string constant PREFIX_GT = "GT:"; +} diff --git a/contracts/v1/lib/MathLib.sol b/contracts/v1/lib/MathLib.sol new file mode 100644 index 0000000..25de497 --- /dev/null +++ b/contracts/v1/lib/MathLib.sol @@ -0,0 +1,152 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; + +/// @notice Arithmetic library with operations for fixed-point numbers. +/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/FixedPointMathLib.sol) +/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/FixedPointMathLib.sol) +library MathLib { + using SafeCast for uint256; + using SafeCast for int256; + /// @dev Returns the absolute value of `x`. + + function abs(int256 x) internal pure returns (uint256 z) { + /// @solidity memory-safe-assembly + assembly { + z := xor(sar(255, x), add(sar(255, x), x)) + } + } + + /** + * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded + * towards zero. + * + * This method is based on Newton's method for computing square roots; the algorithm is restricted to only + * using integer operations. + * + * Copy from openzepplin Math lib + */ + function sqrt(uint256 a) internal pure returns (uint256) { + unchecked { + // Take care of easy edge cases when a == 0 or a == 1 + if (a <= 1) { + return a; + } + + // In this function, we use Newton's method to get a root of `f(x) := x² - a`. It involves building a + // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between + // the current value as `ε_n = | x_n - sqrt(a) |`. + // + // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root + // of the target. (i.e. `2**(e-1) ≤ sqrt(a) < 2**e`). We know that `e ≤ 128` because `(2¹²⁸)² = 2²⁵⁶` is + // bigger than any uint256. + // + // By noticing that + // `2**(e-1) ≤ sqrt(a) < 2**e → (2**(e-1))² ≤ a < (2**e)² → 2**(2*e-2) ≤ a < 2**(2*e)` + // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar + // to the msb function. + uint256 aa = a; + uint256 xn = 1; + + if (aa >= (1 << 128)) { + aa >>= 128; + xn <<= 64; + } + if (aa >= (1 << 64)) { + aa >>= 64; + xn <<= 32; + } + if (aa >= (1 << 32)) { + aa >>= 32; + xn <<= 16; + } + if (aa >= (1 << 16)) { + aa >>= 16; + xn <<= 8; + } + if (aa >= (1 << 8)) { + aa >>= 8; + xn <<= 4; + } + if (aa >= (1 << 4)) { + aa >>= 4; + xn <<= 2; + } + if (aa >= (1 << 2)) { + xn <<= 1; + } + + // We now have x_n such that `x_n = 2**(e-1) ≤ sqrt(a) < 2**e = 2 * x_n`. This implies ε_n ≤ 2**(e-1). + // + // We can refine our estimation by noticing that the middle of that interval minimizes the error. + // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to ε_n ≤ 2**(e-2). + // This is going to be our x_0 (and ε_0) + xn = (3 * xn) >> 1; // ε_0 := | x_0 - sqrt(a) | ≤ 2**(e-2) + + // From here, Newton's method give us: + // x_{n+1} = (x_n + a / x_n) / 2 + // + // One should note that: + // x_{n+1}² - a = ((x_n + a / x_n) / 2)² - a + // = ((x_n² + a) / (2 * x_n))² - a + // = (x_n⁴ + 2 * a * x_n² + a²) / (4 * x_n²) - a + // = (x_n⁴ + 2 * a * x_n² + a² - 4 * a * x_n²) / (4 * x_n²) + // = (x_n⁴ - 2 * a * x_n² + a²) / (4 * x_n²) + // = (x_n² - a)² / (2 * x_n)² + // = ((x_n² - a) / (2 * x_n))² + // ≥ 0 + // Which proves that for all n ≥ 1, sqrt(a) ≤ x_n + // + // This gives us the proof of quadratic convergence of the sequence: + // ε_{n+1} = | x_{n+1} - sqrt(a) | + // = | (x_n + a / x_n) / 2 - sqrt(a) | + // = | (x_n² + a - 2*x_n*sqrt(a)) / (2 * x_n) | + // = | (x_n - sqrt(a))² / (2 * x_n) | + // = | ε_n² / (2 * x_n) | + // = ε_n² / | (2 * x_n) | + // + // For the first iteration, we have a special case where x_0 is known: + // ε_1 = ε_0² / | (2 * x_0) | + // ≤ (2**(e-2))² / (2 * (2**(e-1) + 2**(e-2))) + // ≤ 2**(2*e-4) / (3 * 2**(e-1)) + // ≤ 2**(e-3) / 3 + // ≤ 2**(e-3-log2(3)) + // ≤ 2**(e-4.5) + // + // For the following iterations, we use the fact that, 2**(e-1) ≤ sqrt(a) ≤ x_n: + // ε_{n+1} = ε_n² / | (2 * x_n) | + // ≤ (2**(e-k))² / (2 * 2**(e-1)) + // ≤ 2**(2*e-2*k) / 2**e + // ≤ 2**(e-2*k) + xn = (xn + a / xn) >> 1; // ε_1 := | x_1 - sqrt(a) | ≤ 2**(e-4.5) -- special case, see above + xn = (xn + a / xn) >> 1; // ε_2 := | x_2 - sqrt(a) | ≤ 2**(e-9) -- general case with k = 4.5 + xn = (xn + a / xn) >> 1; // ε_3 := | x_3 - sqrt(a) | ≤ 2**(e-18) -- general case with k = 9 + xn = (xn + a / xn) >> 1; // ε_4 := | x_4 - sqrt(a) | ≤ 2**(e-36) -- general case with k = 18 + xn = (xn + a / xn) >> 1; // ε_5 := | x_5 - sqrt(a) | ≤ 2**(e-72) -- general case with k = 36 + xn = (xn + a / xn) >> 1; // ε_6 := | x_6 - sqrt(a) | ≤ 2**(e-144) -- general case with k = 72 + + // Because e ≤ 128 (as discussed during the first estimation phase), we know have reached a precision + // ε_6 ≤ 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either + // sqrt(a) or sqrt(a) + 1. + return xn - SafeCast.toUint(xn > a / xn); + } + } + + /// @dev Return the maximum value + function max(uint256 a, uint256 b) internal pure returns (uint256) { + return a > b ? a : b; + } + + /// @notice Returns the smaller of two values + function min(uint256 a, uint256 b) internal pure returns (uint256) { + return a < b ? a : b; + } + + function plusInt256(uint256 a, int256 b) internal pure returns (uint256) { + if (b < 0) { + return a - uint256(-b); + } + return a + uint256(b); + } +} diff --git a/contracts/v1/lib/PendingLib.sol b/contracts/v1/lib/PendingLib.sol new file mode 100644 index 0000000..e06f944 --- /dev/null +++ b/contracts/v1/lib/PendingLib.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +pragma solidity ^0.8.0; + +struct PendingUint192 { + /// @notice The pending value to set. + uint192 value; + /// @notice The timestamp at which the pending value becomes valid. + uint64 validAt; +} + +struct PendingAddress { + /// @notice The pending value to set. + address value; + /// @notice The timestamp at which the pending value becomes valid. + uint64 validAt; +} + +/// @title PendingLib +/// @author Morpho Labs +/// @custom:contact security@morpho.org +/// @notice Library to manage pending values and their validity timestamp. +library PendingLib { + /// @dev Updates `pending`'s value to `newValue` and its corresponding `validAt` timestamp. + /// @dev Assumes `timelock` <= `MAX_TIMELOCK`. + function update(PendingUint192 storage pending, uint184 newValue, uint256 timelock) internal { + pending.value = newValue; + // Safe "unchecked" cast because timelock <= MAX_TIMELOCK. + pending.validAt = uint64(block.timestamp + timelock); + } + + /// @dev Updates `pending`'s value to `newValue` and its corresponding `validAt` timestamp. + /// @dev Assumes `timelock` <= `MAX_TIMELOCK`. + function update(PendingAddress storage pending, address newValue, uint256 timelock) internal { + pending.value = newValue; + // Safe "unchecked" cast because timelock <= MAX_TIMELOCK. + pending.validAt = uint64(block.timestamp + timelock); + } +} diff --git a/contracts/v1/lib/StringUtil.sol b/contracts/v1/lib/StringUtil.sol new file mode 100644 index 0000000..271a231 --- /dev/null +++ b/contracts/v1/lib/StringUtil.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library StringUtil { + function contact(string memory a, string memory b) internal pure returns (string memory) { + return string(abi.encodePacked(a, b)); + } +} diff --git a/contracts/v1/lib/TermMaxCurve.sol b/contracts/v1/lib/TermMaxCurve.sol new file mode 100644 index 0000000..0b46462 --- /dev/null +++ b/contracts/v1/lib/TermMaxCurve.sol @@ -0,0 +1,391 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +import {Constants} from "./Constants.sol"; +import {MathLib, SafeCast} from "./MathLib.sol"; +import {CurveCut} from "../storage/TermMaxStorage.sol"; + +/** + * @title The TermMax curve library + * @author Term Structure Labs + */ +library TermMaxCurve { + using SafeCast for uint256; + using SafeCast for int256; + using MathLib for *; + + error InsufficientLiquidity(); + + /// @notice Calculate Curve cut id + /// @param cuts Curve cut array + /// @param xtReserve XT reserve + /// @return cutId Curve cut id + function calcCutId(CurveCut[] memory cuts, uint256 xtReserve) internal pure returns (uint256 cutId) { + cutId = cuts.length; + while (cutId > 0) { + cutId--; + if (xtReserve >= cuts[cutId].xtReserve) break; + } + } + + /// @notice Calculate interval properties + /// @param daysToMaturity Days to maturity + /// @param cut Curve cut + /// @param xtReserve XT reserve + /// @return liqSquare square of liquidity factor + /// @return vXtReserve virtual XT reserve + /// @return vFtReserve virtual FT reserve + function calcIntervalProps( + uint256 netInterestFactor, + uint256 daysToMaturity, + CurveCut memory cut, + uint256 xtReserve + ) internal pure returns (uint256 liqSquare, uint256 vXtReserve, uint256 vFtReserve) { + // reference: Eq.(8) in TermMax White Paper + liqSquare = + (cut.liqSquare * daysToMaturity * netInterestFactor) / (Constants.DAYS_IN_YEAR * Constants.DECIMAL_BASE); + vXtReserve = xtReserve.plusInt256(cut.offset); + vFtReserve = liqSquare / vXtReserve; + } + + /// @notice Forward iteration over curve cuts + /// @param daysToMaturity Days to maturity + /// @param cuts Curve cut array + /// @param oriXtReserve Original XT reserve + /// @param acc Input amount + /// @param func Function to calculate delta values + /// @return deltaXt Delta XT + /// @return negDeltaFt Negative delta FT + function cutsForwardIter( + uint256 netInterestFactor, + uint256 daysToMaturity, + CurveCut[] memory cuts, + uint256 oriXtReserve, + uint256 acc, + function(int, int, int, int, int, int) internal pure returns (int, int) func + ) internal pure returns (uint256 deltaXt, uint256 negDeltaFt) { + uint256 cutId = calcCutId(cuts, oriXtReserve); + for (uint256 i = cutId; i < cuts.length; ++i) { + uint256 xtReserve = oriXtReserve + deltaXt; + (uint256 liqSquare, uint256 vXtReserve, uint256 vFtReserve) = + calcIntervalProps(netInterestFactor, daysToMaturity, cuts[i], xtReserve); + { + (int256 dX, int256 nF) = func( + liqSquare.toInt256(), + vXtReserve.toInt256(), + vFtReserve.toInt256(), + deltaXt.toInt256(), + -negDeltaFt.toInt256(), + acc.toInt256() + ); + + if (i != cuts.length - 1) { + if ( + (dX < deltaXt.toInt256() || nF < negDeltaFt.toInt256()) + || oriXtReserve + uint256(dX) > cuts[i + 1].xtReserve + ) { + deltaXt = cuts[i + 1].xtReserve - oriXtReserve; + negDeltaFt += vFtReserve - liqSquare / (vXtReserve + (cuts[i + 1].xtReserve - xtReserve)); + continue; + } else { + return (uint256(dX), uint256(nF)); + } + } else if (dX >= deltaXt.toInt256() && nF >= negDeltaFt.toInt256()) { + return (uint256(dX), uint256(nF)); + } + } + } + revert InsufficientLiquidity(); + } + + /// @notice Reverse iteration over curve cuts + /// @param daysToMaturity Days to maturity + /// @param cuts Curve cut array + /// @param oriXtReserve Original XT reserve + /// @param acc Input amount + /// @param func Function to calculate delta values + /// @return negDeltaXt Negative delta XT + /// @return deltaFt Delta FT + function cutsReverseIter( + uint256 netInterestFactor, + uint256 daysToMaturity, + CurveCut[] memory cuts, + uint256 oriXtReserve, + uint256 acc, + function(int, int, int, int, int, int) internal pure returns (int, int) func + ) internal pure returns (uint256 negDeltaXt, uint256 deltaFt) { + uint256 cutId = calcCutId(cuts, oriXtReserve); + for (uint256 i = cutId + 1; i > 0; i--) { + uint256 idx = i - 1; + uint256 xtReserve = oriXtReserve - negDeltaXt; + (uint256 liqSquare, uint256 vXtReserve, uint256 vFtReserve) = + calcIntervalProps(netInterestFactor, daysToMaturity, cuts[idx], xtReserve); + { + (int256 nX, int256 dF) = func( + liqSquare.toInt256(), + vXtReserve.toInt256(), + vFtReserve.toInt256(), + -negDeltaXt.toInt256(), + deltaFt.toInt256(), + acc.toInt256() + ); + + if ( + (nX < negDeltaXt.toInt256() || dF < deltaFt.toInt256()) + || oriXtReserve < uint256(nX) + cuts[idx].xtReserve + ) { + negDeltaXt = oriXtReserve - cuts[idx].xtReserve; + deltaFt += liqSquare / (vXtReserve - (xtReserve - cuts[idx].xtReserve)) - vFtReserve; + continue; + } else { + return (uint256(nX), uint256(dF)); + } + } + } + revert InsufficientLiquidity(); + } + + function buyExactXt( + uint256 netInterestFactor, + uint256 daysToMaturity, + CurveCut[] memory cuts, + uint256 oriXtReserve, + uint256 outputAmount + ) internal pure returns (uint256 negDeltaXt, uint256 deltaFt) { + (negDeltaXt, deltaFt) = + cutsReverseIter(netInterestFactor, daysToMaturity, cuts, oriXtReserve, outputAmount, buyExactXtStep); + } + + function buyExactFt( + uint256 netInterestFactor, + uint256 daysToMaturity, + CurveCut[] memory cuts, + uint256 oriXtReserve, + uint256 outputAmount + ) internal pure returns (uint256 deltaXt, uint256 negDeltaFt) { + (deltaXt, negDeltaFt) = + cutsForwardIter(netInterestFactor, daysToMaturity, cuts, oriXtReserve, outputAmount, buyExactFtStep); + } + + /// @notice Buy XT + /// @param daysToMaturity Days to maturity + /// @param cuts Curve cut array + /// @param oriXtReserve Original XT reserve + /// @param inputAmount Input amount + /// @return negDeltaXt Negative delta XT + /// @return deltaFt Delta FT + function buyXt( + uint256 netInterestFactor, + uint256 daysToMaturity, + CurveCut[] memory cuts, + uint256 oriXtReserve, + uint256 inputAmount + ) internal pure returns (uint256 negDeltaXt, uint256 deltaFt) { + (negDeltaXt, deltaFt) = + cutsReverseIter(netInterestFactor, daysToMaturity, cuts, oriXtReserve, inputAmount, buyXtStep); + } + + /// @notice Buy FT + /// @param daysToMaturity Days to maturity + /// @param cuts Curve cut array + /// @param oriXtReserve Original XT reserve + /// @param inputAmount Input amount + /// @return deltaXt Delta XT + /// @return negDeltaFt Negative delta FT + function buyFt( + uint256 netInterestFactor, + uint256 daysToMaturity, + CurveCut[] memory cuts, + uint256 oriXtReserve, + uint256 inputAmount + ) internal pure returns (uint256 deltaXt, uint256 negDeltaFt) { + (deltaXt, negDeltaFt) = + cutsForwardIter(netInterestFactor, daysToMaturity, cuts, oriXtReserve, inputAmount, buyFtStep); + } + + /// @notice Sell XT + /// @param daysToMaturity Days to maturity + /// @param cuts Curve cut array + /// @param oriXtReserve Original XT reserve + /// @param inputAmount Input amount + /// @return deltaXt Delta XT + /// @return negDeltaFt Negative delta FT + function sellXt( + uint256 netInterestFactor, + uint256 daysToMaturity, + CurveCut[] memory cuts, + uint256 oriXtReserve, + uint256 inputAmount + ) internal pure returns (uint256 deltaXt, uint256 negDeltaFt) { + (deltaXt, negDeltaFt) = + cutsForwardIter(netInterestFactor, daysToMaturity, cuts, oriXtReserve, inputAmount, sellXtStep); + } + + /// @notice Sell FT + /// @param daysToMaturity Days to maturity + /// @param cuts Curve cut array + /// @param oriXtReserve Original XT reserve + /// @param inputAmount Input amount + /// @return negDeltaXt Negative delta XT + /// @return deltaFt Delta FT + function sellFt( + uint256 netInterestFactor, + uint256 daysToMaturity, + CurveCut[] memory cuts, + uint256 oriXtReserve, + uint256 inputAmount + ) internal pure returns (uint256 negDeltaXt, uint256 deltaFt) { + (negDeltaXt, deltaFt) = + cutsReverseIter(netInterestFactor, daysToMaturity, cuts, oriXtReserve, inputAmount, sellFtStep); + } + + function sellFtForExactDebtToken( + uint256 netInterestFactor, + uint256 daysToMaturity, + CurveCut[] memory cuts, + uint256 oriXtReserve, + uint256 outputAmount + ) internal pure returns (uint256 negDeltaXt, uint256 deltaFt) { + (negDeltaXt, deltaFt) = cutsReverseIter( + netInterestFactor, daysToMaturity, cuts, oriXtReserve, outputAmount, sellFtForExactDebtTokenStep + ); + } + + function sellXtForExactDebtToken( + uint256 netInterestFactor, + uint256 daysToMaturity, + CurveCut[] memory cuts, + uint256 oriXtReserve, + uint256 outputAmount + ) internal pure returns (uint256 deltaXt, uint256 negDeltaFt) { + (deltaXt, negDeltaFt) = cutsForwardIter( + netInterestFactor, daysToMaturity, cuts, oriXtReserve, outputAmount, sellXtForExactDebtTokenStep + ); + } + + function sellTokenStepBase( + int256, + int256 vLhsReserve, + int256 vRhsReserve, + int256 oriDeltaLhs, + int256 oriDeltaRhs, + int256 inputAmt + ) internal pure returns (int256 deltaLhs, int256 negDeltaRhs) { + // reference: Section 4.2.3, Section 4.2.4 in TermMax White Paper + int256 acc = (oriDeltaLhs - oriDeltaRhs) - inputAmt; + int256 b = vLhsReserve + vRhsReserve + acc; + int256 c = vLhsReserve * acc; + + int256 segDeltaLhs = (MathLib.sqrt((b * b - 4 * c).toUint256()).toInt256() - b) / 2; + deltaLhs = oriDeltaLhs + segDeltaLhs; + negDeltaRhs = -oriDeltaRhs - acc - segDeltaLhs; + } + + function buyTokenStepBase( + int256 liqSquare, + int256 vlhsReserve, + int256 vRhsReserve, + int256 oriDeltalhs, + int256 oriDeltaRhs, + int256 inputAmt + ) internal pure returns (int256 negDeltalhs, int256 deltaRhs) { + // reference: Eq.(9), Eq.(10) in TermMax White Paper + int256 remainingInputAmt = inputAmt - oriDeltaRhs; + negDeltalhs = -oriDeltalhs + vlhsReserve - liqSquare / (vRhsReserve + remainingInputAmt); + deltaRhs = inputAmt; + } + + function buyXtStep( + int256 liqSquare, + int256 vXtReserve, + int256 vFtReserve, + int256 oriDeltaXt, + int256 oriDeltaFt, + int256 inputAmt + ) internal pure returns (int256 negDeltaXt, int256 deltaFt) { + (negDeltaXt, deltaFt) = buyTokenStepBase(liqSquare, vXtReserve, vFtReserve, oriDeltaXt, oriDeltaFt, inputAmt); + } + + function buyFtStep( + int256 liqSquare, + int256 vXtReserve, + int256 vFtReserve, + int256 oriDeltaXt, + int256 oriDeltaFt, + int256 inputAmt + ) internal pure returns (int256 deltaXt, int256 negDeltaFt) { + (negDeltaFt, deltaXt) = buyTokenStepBase(liqSquare, vFtReserve, vXtReserve, oriDeltaFt, oriDeltaXt, inputAmt); + } + + function sellXtStep( + int256, + int256 vXtReserve, + int256 vFtReserve, + int256 oriDeltaXt, + int256 oriDeltaFt, + int256 inputAmt + ) internal pure returns (int256 deltaXt, int256 negDeltaFt) { + (deltaXt, negDeltaFt) = sellTokenStepBase(0, vXtReserve, vFtReserve, oriDeltaXt, oriDeltaFt, inputAmt); + } + + function sellFtStep( + int256, + int256 vXtReserve, + int256 vFtReserve, + int256 oriDeltaXt, + int256 oriDeltaFt, + int256 inputAmt + ) internal pure returns (int256 negDeltaXt, int256 deltaFt) { + (deltaFt, negDeltaXt) = sellTokenStepBase(0, vFtReserve, vXtReserve, oriDeltaFt, oriDeltaXt, inputAmt); + } + + function buyExactXtStep( + int256, + int256 vXtReserve, + int256 vFtReserve, + int256 oriDeltaXt, + int256 oriDeltaFt, + int256 outputAmt + ) internal pure returns (int256, int256) { + (int256 deltaXt, int256 negDeltaFt) = sellXtStep(0, vXtReserve, vFtReserve, oriDeltaXt, oriDeltaFt, -outputAmt); + return (-deltaXt, -negDeltaFt); + } + + function buyExactFtStep( + int256, + int256 vXtReserve, + int256 vFtReserve, + int256 oriDeltaXt, + int256 oriDeltaFt, + int256 outputAmt + ) internal pure returns (int256, int256) { + (int256 negDeltaXt, int256 deltaFt) = sellFtStep(0, vXtReserve, vFtReserve, oriDeltaXt, oriDeltaFt, -outputAmt); + return (-negDeltaXt, -deltaFt); + } + + function sellFtForExactDebtTokenStep( + int256 liqSquare, + int256 vXtReserve, + int256 vFtReserve, + int256 oriDeltaXt, + int256 oriDeltaFt, + int256 outputAmt + ) internal pure returns (int256, int256) { + (int256 deltaXt, int256 negDeltaFt) = + buyFtStep(liqSquare, vXtReserve, vFtReserve, oriDeltaXt, oriDeltaFt, -outputAmt); + return (-deltaXt, -negDeltaFt); + } + + function sellXtForExactDebtTokenStep( + int256 liqSquare, + int256 vXtReserve, + int256 vFtReserve, + int256 oriDeltaXt, + int256 oriDeltaFt, + int256 outputAmt + ) internal pure returns (int256, int256) { + (int256 negDeltaXt, int256 deltaFt) = + buyXtStep(liqSquare, vXtReserve, vFtReserve, oriDeltaXt, oriDeltaFt, -outputAmt); + return (-negDeltaXt, -deltaFt); + } +} diff --git a/contracts/v1/lib/TransferUtils.sol b/contracts/v1/lib/TransferUtils.sol new file mode 100644 index 0000000..0abbe1f --- /dev/null +++ b/contracts/v1/lib/TransferUtils.sol @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +library TransferUtils { + using SafeERC20 for IERC20; + + error CanNotTransferUintMax(); + + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + if (value == type(uint256).max) { + revert CanNotTransferUintMax(); + } + if (from == to || value == 0) { + return; + } + token.safeTransferFrom(from, to, value); + } + + function safeTransfer(IERC20 token, address to, uint256 value) internal { + if (value == type(uint256).max) { + revert CanNotTransferUintMax(); + } + if (to == address(this) || value == 0) { + return; + } + token.safeTransfer(to, value); + } + + function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { + if (value == 0 || spender == address(this)) { + return; + } + token.safeIncreaseAllowance(spender, value); + } + + function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { + if (value == 0 || spender == address(this)) { + return; + } + token.safeDecreaseAllowance(spender, value); + } +} diff --git a/contracts/v1/lib/VaultConstants.sol b/contracts/v1/lib/VaultConstants.sol new file mode 100644 index 0000000..5a135e4 --- /dev/null +++ b/contracts/v1/lib/VaultConstants.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library VaultConstants { + /// @dev The maximum delay of a timelock. + uint256 internal constant MAX_TIMELOCK = 2 weeks; + + /// @dev The minimum delay of a timelock post initialization. + uint256 internal constant POST_INITIALIZATION_MIN_TIMELOCK = 1 days; + + /// @dev The maximum number of markets in the supply/withdraw queue. + uint256 internal constant MAX_QUEUE_LENGTH = 30; + + /// @dev The maximum fee the vault can have (50%). + uint256 internal constant MAX_FEE = 0.5e18; + + /// @dev The maximum term the vault can have. + uint256 internal constant MAX_TERM = 365 days; + + /// @dev The maximum performance fee rate the vault can have. + uint256 internal constant MAX_PERFORMANCE_FEE_RATE = 0.5e8; +} diff --git a/contracts/v1/oracle/IOracle.sol b/contracts/v1/oracle/IOracle.sol new file mode 100644 index 0000000..6228777 --- /dev/null +++ b/contracts/v1/oracle/IOracle.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; + +/** + * @title IOracle + * @author Term Structure Labs + */ +interface IOracle { + struct Oracle { + AggregatorV3Interface aggregator; + AggregatorV3Interface backupAggregator; + uint32 heartbeat; + } + + /// @notice Error thrown when the oracle is not working + error OracleIsNotWorking(address asset); + + /// @notice Get the price of an asset + function getPrice(address asset) external view returns (uint256 price, uint8 decimals); + + function submitPendingOracle(address asset, Oracle memory oracle) external; + + function acceptPendingOracle(address asset) external; +} diff --git a/contracts/v1/oracle/OracleAggregator.sol b/contracts/v1/oracle/OracleAggregator.sol new file mode 100644 index 0000000..7b833db --- /dev/null +++ b/contracts/v1/oracle/OracleAggregator.sol @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {Ownable2Step, Ownable} from "@openzeppelin/contracts/access/Ownable2Step.sol"; +import {AggregatorV3Interface, IOracle} from "./IOracle.sol"; + +contract OracleAggregator is IOracle, Ownable2Step { + uint256 internal immutable _timeLock; + + struct PendingOracle { + Oracle oracle; + uint64 validAt; + } + + /// @notice Error thrown when the asset or oracle address is invalid + error InvalidAssetOrOracle(); + + /** + * @notice Error thrown when attempting to set a value that's already set + */ + error AlreadySet(); + + /** + * @notice Error thrown when attempting to submit a change that's already pending + */ + error AlreadyPending(); + + /** + * @notice Error thrown when trying to accept a change that has no pending value + */ + error NoPendingValue(); + + /** + * @notice Error thrown when trying to accept a change before the timelock period has elapsed + */ + error TimelockNotElapsed(); + + /// @notice Event emitted when the oracle of asset is updated + /// @param asset The address of the asset + /// @param aggregator The address of the aggregator + /// @param backupAggregator The address of the backup aggregator + /// @param heartbeat The heartbeat of the oracle + event UpdateOracle( + address indexed asset, + AggregatorV3Interface indexed aggregator, + AggregatorV3Interface indexed backupAggregator, + uint32 heartbeat + ); + + event SubmitPendingOracle( + address indexed asset, + AggregatorV3Interface indexed aggregator, + AggregatorV3Interface indexed backupAggregator, + uint32 heartbeat, + uint64 validAt + ); + + event RevokePendingOracle(address indexed asset); + + /// @notice Oracles + mapping(address => Oracle) public oracles; + + mapping(address => PendingOracle) public pendingOracles; + + constructor(address _owner, uint256 timeLock) Ownable(_owner) { + _timeLock = timeLock; + } + + function submitPendingOracle(address asset, Oracle memory oracle) external onlyOwner { + if (asset == address(0)) { + revert InvalidAssetOrOracle(); + } + if (address(oracle.aggregator) == address(0) && address(oracle.backupAggregator) == address(0)) { + delete oracles[asset]; + emit UpdateOracle(asset, AggregatorV3Interface(address(0)), AggregatorV3Interface(address(0)), 0); + return; + } + pendingOracles[asset].oracle = oracle; + uint64 validAt = uint64(block.timestamp + _timeLock); + pendingOracles[asset].validAt = validAt; + emit SubmitPendingOracle(asset, oracle.aggregator, oracle.backupAggregator, oracle.heartbeat, validAt); + } + + function acceptPendingOracle(address asset) external { + if (pendingOracles[asset].validAt == 0) { + revert NoPendingValue(); + } + if (block.timestamp < pendingOracles[asset].validAt) { + revert TimelockNotElapsed(); + } + Oracle memory oracle = pendingOracles[asset].oracle; + oracles[asset] = oracle; + delete pendingOracles[asset]; + emit UpdateOracle(asset, oracle.aggregator, oracle.backupAggregator, oracle.heartbeat); + } + + /** + * @inheritdoc IOracle + */ + function getPrice(address asset) external view override returns (uint256 price, uint8 decimals) { + Oracle memory oracle = oracles[asset]; + (, int256 answer,, uint256 updatedAt,) = oracle.aggregator.latestRoundData(); + if (oracle.heartbeat + updatedAt < block.timestamp || answer <= 0) { + // switch backupAggregator + (, answer,, updatedAt,) = oracle.backupAggregator.latestRoundData(); + if (oracle.heartbeat + updatedAt < block.timestamp || answer <= 0) { + revert OracleIsNotWorking(asset); + } + decimals = oracle.backupAggregator.decimals(); + } else { + decimals = oracle.aggregator.decimals(); + } + price = uint256(answer); + } +} diff --git a/contracts/v1/router/ISwapAdapter.sol b/contracts/v1/router/ISwapAdapter.sol new file mode 100644 index 0000000..52e25b8 --- /dev/null +++ b/contracts/v1/router/ISwapAdapter.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; +/// @notice Swap unit + +struct SwapUnit { + /// @notice Adapter's address + address adapter; + /// @notice Input token address + address tokenIn; + /// @notice Output token address + address tokenOut; + /// @notice Encoded swap data + bytes swapData; +} + +/** + * @title TermMax SwapAdapter interface + * @author Term Structure Labs + */ +interface ISwapAdapter { + /// @notice Swap tokenIn to tokenOut + /// @param tokenIn Input token address + /// @param tokenOut Output token address + /// @param tokenInData Encoded token input data + /// @param swapData Encoded swap data + /// @param tokenOutData Encoded token output data + function swap(address tokenIn, address tokenOut, bytes memory tokenInData, bytes memory swapData) + external + returns (bytes memory tokenOutData); + + /// @notice Approve output token + /// @param token Token address + /// @param spender Who spend tokens + /// @param tokenData Encoded token approving data + function approveOutputToken(address token, address spender, bytes memory tokenData) external; + + /// @notice Transfer output token + /// @param token Token address + /// @param to Who receive tokens + /// @param tokenData Encoded token tranfering data + function transferOutputToken(address token, address to, bytes memory tokenData) external; + + /// @notice Transfer input token from an address + /// @param token Token address + /// @param from Who provide tokens + /// @param to Who receive tokens + /// @param tokenData Encoded token tranfering data + function transferInputTokenFrom(address token, address from, address to, bytes memory tokenData) external; +} diff --git a/contracts/v1/router/ITermMaxRouter.sol b/contracts/v1/router/ITermMaxRouter.sol new file mode 100644 index 0000000..2091cba --- /dev/null +++ b/contracts/v1/router/ITermMaxRouter.sol @@ -0,0 +1,317 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {ITermMaxMarket} from "../ITermMaxMarket.sol"; +import {ITermMaxOrder} from "../ITermMaxOrder.sol"; +import {SwapUnit} from "./ISwapAdapter.sol"; +import {CurveCuts} from "../storage/TermMaxStorage.sol"; +import {ISwapCallback} from "../ISwapCallback.sol"; + +/** + * @title TermMax Router interface + * @author Term Structure Labs + * @notice Interface for the main router contract that handles all user interactions with TermMax protocol + * @dev This interface defines all external functions for swapping, leveraging, and managing positions + */ +interface ITermMaxRouter { + /** + * @notice Pauses all protocol operations + * @dev Can only be called by authorized addresses + */ + function pause() external; + + /** + * @notice Unpauses protocol operations + * @dev Can only be called by authorized addresses + */ + function unpause() external; + + /** + * @notice View the adapter whitelist status + * @dev Used for controlling which swap adapters can be used + * @param adapter The adapter's address to check whitelist status for + * @return True if whitelisted, false otherwise + */ + function adapterWhitelist(address adapter) external view returns (bool); + + /** + * @notice Set the adapter whitelist status + * @dev Used for controlling which swap adapters can be used + * @param adapter The adapter's address to set whitelist status for + * @param isWhitelist True to whitelist, false to remove from whitelist + */ + function setAdapterWhitelist(address adapter, bool isWhitelist) external; + + /** + * @notice Retrieves all assets owned by an address in a specific market + * @dev Returns both ERC20 tokens and GT (Governance Token) positions + * @param market The market to query assets from + * @param owner The address to check assets for + * @return tokens Array of ERC20 token addresses + * @return balances Corresponding balances for each token + * @return gt The GT token contract address + * @return gtIds Array of GT token IDs owned by the address + */ + function assetsWithERC20Collateral(ITermMaxMarket market, address owner) + external + view + returns (IERC20[4] memory tokens, uint256[4] memory balances, address gt, uint256[] memory gtIds); + + /** + * @notice Swaps an exact amount of input token for output token + * @dev Uses specified orders for the swap path + * @param tokenIn Input token to swap from + * @param tokenOut Output token to swap to + * @param recipient Address to receive the output tokens + * @param orders Array of orders to use for the swap path + * @param tradingAmts Array of amounts to trade for each order + * @param minTokenOut Minimum amount of output tokens to receive + * @param deadline The deadline timestamp for the transaction + * @return netTokenOut Actual amount of output tokens received + */ + function swapExactTokenToToken( + IERC20 tokenIn, + IERC20 tokenOut, + address recipient, + ITermMaxOrder[] memory orders, + uint128[] memory tradingAmts, + uint128 minTokenOut, + uint256 deadline + ) external returns (uint256 netTokenOut); + + /** + * @notice Swaps tokens to receive an exact amount of output token + * @dev Uses specified orders for the swap path + * @param tokenIn Input token to swap from + * @param tokenOut Output token to swap to + * @param recipient Address to receive the output tokens + * @param orders Array of orders to use for the swap path + * @param tradingAmts Array of amounts to trade for each order + * @param maxTokenIn Maximum amount of input tokens to spend + * @param deadline The deadline timestamp for the transaction + * @return netTokenIn Actual amount of input tokens spent + */ + function swapTokenToExactToken( + IERC20 tokenIn, + IERC20 tokenOut, + address recipient, + ITermMaxOrder[] memory orders, + uint128[] memory tradingAmts, + uint128 maxTokenIn, + uint256 deadline + ) external returns (uint256 netTokenIn); + + /** + * @notice Sells FT and XT tokens for underlying tokens + * @dev Executes multiple orders to sell tokens + * @param recipient Address to receive the output tokens + * @param market The market to sell tokens in + * @param ftInAmt Amount of FT tokens to sell + * @param xtInAmt Amount of XT tokens to sell + * @param orders Array of orders to execute + * @param amtsToSellTokens Array of amounts to sell for each order + * @param minTokenOut Minimum amount of output tokens to receive + * @param deadline The deadline timestamp for the transaction + * @return netTokenOut Actual amount of output tokens received + */ + function sellTokens( + address recipient, + ITermMaxMarket market, + uint128 ftInAmt, + uint128 xtInAmt, + ITermMaxOrder[] memory orders, + uint128[] memory amtsToSellTokens, + uint128 minTokenOut, + uint256 deadline + ) external returns (uint256 netTokenOut); + + /** + * @notice Creates a leveraged position from input tokens + * @dev Swaps tokens for XT and creates a leveraged position + * @param recipient Address to receive the position + * @param market The market to create position in + * @param orders Array of orders to execute + * @param amtsToBuyXt Array of amounts of XT to buy for each order + * @param minXtOut Minimum amount of XT to establish the position + * @param tokenToSwap Amount of tokens to swap + * @param maxLtv Maximum loan-to-value ratio + * @param units Array of swap units defining the swap path + * @param deadline The deadline timestamp for the transaction + * @return gtId ID of the generated GT token + * @return netXtOut Amount of XT tokens received + */ + function leverageFromToken( + address recipient, + ITermMaxMarket market, + ITermMaxOrder[] memory orders, + uint128[] memory amtsToBuyXt, + uint128 minXtOut, + uint128 tokenToSwap, + uint128 maxLtv, + SwapUnit[] memory units, + uint256 deadline + ) external returns (uint256 gtId, uint256 netXtOut); + + /** + * @notice Creates a leveraged position from XT tokens + * @dev Uses existing XT tokens to create a leveraged position + * @param recipient Address to receive the position + * @param market The market to create position in + * @param xtInAmt Amount of XT tokens to use + * @param tokenInAmt Amount of additional tokens to use + * @param maxLtv Maximum loan-to-value ratio + * @param units Array of swap units defining the swap path + * @return gtId ID of the generated GT token + */ + function leverageFromXt( + address recipient, + ITermMaxMarket market, + uint128 xtInAmt, + uint128 tokenInAmt, + uint128 maxLtv, + SwapUnit[] memory units + ) external returns (uint256 gtId); + + function leverageFromXtAndCollateral( + address recipient, + ITermMaxMarket market, + uint128 xtInAmt, + uint128 collateralInAmt, + uint128 maxLtv, + SwapUnit[] memory units + ) external returns (uint256 gtId); + + /** + * @notice Borrows tokens using collateral + * @dev Creates a collateralized debt position + * @param recipient Address to receive the borrowed tokens + * @param market The market to borrow from + * @param collInAmt Amount of collateral to deposit + * @param orders Array of orders to execute + * @param tokenAmtsWantBuy Array of token amounts to buy + * @param maxDebtAmt Maximum amount of debt to take on + * @param deadline The deadline timestamp for the transaction + * @return gtId ID of the generated GT token + */ + function borrowTokenFromCollateral( + address recipient, + ITermMaxMarket market, + uint256 collInAmt, + ITermMaxOrder[] memory orders, + uint128[] memory tokenAmtsWantBuy, + uint128 maxDebtAmt, + uint256 deadline + ) external returns (uint256 gtId); + + /** + * @notice Borrows tokens using collateral and XT + * @dev Creates a collateralized debt position + * @param recipient Address to receive the borrowed tokens + * @param market The market to borrow from + * @param collInAmt Amount of collateral to deposit + * @param borrowAmt Amount of tokens to borrow + * @return gtId ID of the generated GT token + */ + function borrowTokenFromCollateral(address recipient, ITermMaxMarket market, uint256 collInAmt, uint256 borrowAmt) + external + returns (uint256 gtId); + + /** + * @notice Borrows tokens from an existing GT position + * @dev Increases the debt of an existing position + * @param recipient Address to receive the borrowed tokens + * @param market The market to borrow from + * @param gtId ID of the GT token to borrow from + * @param borrowAmt Amount of tokens to borrow + */ + function borrowTokenFromGt(address recipient, ITermMaxMarket market, uint256 gtId, uint256 borrowAmt) external; + + /** + * @notice Repays debt from collateral + * @dev Repays debt and closes a position + * @param recipient Address to receive any remaining collateral + * @param market The market to repay debt in + * @param gtId ID of the GT token to repay debt from + * @param orders Array of orders to execute + * @param amtsToBuyFt Array of amounts to buy for each order + * @param byDebtToken Whether to repay debt using debt tokens + * @param units Array of swap units defining the swap path + * @param deadline The deadline timestamp for the transaction + * @return netTokenOut Actual amount of tokens received + */ + function flashRepayFromColl( + address recipient, + ITermMaxMarket market, + uint256 gtId, + ITermMaxOrder[] memory orders, + uint128[] memory amtsToBuyFt, + bool byDebtToken, + SwapUnit[] memory units, + uint256 deadline + ) external returns (uint256 netTokenOut); + + /** + * @notice Repays debt using FT tokens + * @dev Repays debt and closes a position + * @param recipient Address to receive any remaining tokens + * @param market The market to repay debt in + * @param gtId ID of the GT token to repay debt from + * @param orders Array of orders to execute + * @param ftAmtsWantBuy Array of FT amounts to buy for each order + * @param maxTokenIn Maximum amount of tokens to spend + * @param deadline The deadline timestamp for the transaction + * @return returnAmt Actual amount of tokens returned + */ + function repayByTokenThroughFt( + address recipient, + ITermMaxMarket market, + uint256 gtId, + ITermMaxOrder[] memory orders, + uint128[] memory ftAmtsWantBuy, + uint128 maxTokenIn, + uint256 deadline + ) external returns (uint256 returnAmt); + + /** + * @notice Redeems FT tokens and swaps for underlying tokens + * @dev Executes a swap to redeem FT tokens + * @param recipient Address to receive the output tokens + * @param market The market to redeem FT tokens in + * @param ftAmount Amount of FT tokens to redeem + * @param units Array of swap units defining the swap path + * @param minTokenOut Minimum amount of output tokens to receive + * @return redeemedAmt Actual amount of output tokens received + */ + function redeemAndSwap( + address recipient, + ITermMaxMarket market, + uint256 ftAmount, + SwapUnit[] memory units, + uint256 minTokenOut + ) external returns (uint256 redeemedAmt); + + /** + * @notice Creates an order and deposits tokens + * @dev Creates a new order and deposits tokens to the market + * @param market The market to create order in + * @param maker Address of the order maker + * @param maxXtReserve Maximum amount of XT to reserve + * @param swapTrigger Swap trigger callback + * @param debtTokenToDeposit Amount of debt tokens to deposit + * @param ftToDeposit Amount of FT tokens to deposit + * @param xtToDeposit Amount of XT tokens to deposit + * @param curveCuts Curve cuts for the order + * @return order The created order + */ + function createOrderAndDeposit( + ITermMaxMarket market, + address maker, + uint256 maxXtReserve, + ISwapCallback swapTrigger, + uint256 debtTokenToDeposit, + uint128 ftToDeposit, + uint128 xtToDeposit, + CurveCuts memory curveCuts + ) external returns (ITermMaxOrder order); +} diff --git a/contracts/v1/router/MarketViewer.sol b/contracts/v1/router/MarketViewer.sol new file mode 100644 index 0000000..08e13e0 --- /dev/null +++ b/contracts/v1/router/MarketViewer.sol @@ -0,0 +1,333 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import {IERC721Enumerable} from "@openzeppelin/contracts/interfaces/IERC721Enumerable.sol"; +import {Math} from "@openzeppelin/contracts/utils/math/Math.sol"; +import {ITermMaxMarket} from "../ITermMaxMarket.sol"; +import {ITermMaxOrder} from "../ITermMaxOrder.sol"; +import {IMintableERC20} from "../tokens/IMintableERC20.sol"; +import {IGearingToken} from "../tokens/IGearingToken.sol"; +import {OrderConfig, CurveCuts, FeeConfig, GtConfig} from "../storage/TermMaxStorage.sol"; +import {ITermMaxVault} from "../vault/ITermMaxVault.sol"; +import {OrderInfo} from "../vault/VaultStorage.sol"; +import {PendingAddress, PendingUint192} from "../lib/PendingLib.sol"; +import {OracleAggregator} from "../oracle/OracleAggregator.sol"; + +interface IPausable { + function paused() external view returns (bool); +} + +contract MarketViewer { + using Math for uint256; + struct LoanPosition { + uint256 loanId; + uint256 collateralAmt; + uint256 debtAmt; + } + + struct LoanPositionV2 { + address owner; + uint256 loanId; + uint256 collateralAmt; + uint256 debtAmt; + uint128 ltv; + bool isHealthy; + bool isLiquidable; + uint128 maxRepayAmt; + } + + struct Position { + uint256 underlyingBalance; + uint256 collateralBalance; + uint256 ftBalance; + uint256 xtBalance; + LoanPosition[] gtInfo; + } + + struct VaultPosition { + uint256 balance; + uint256 toAssetBalance; + uint256 usdValue; + } + + struct OrderState { + uint256 collateralReserve; + uint256 debtReserve; + uint256 ftReserve; + uint256 xtReserve; + uint256 maxXtReserve; + uint256 gtId; + CurveCuts curveCuts; + FeeConfig feeConfig; + } + + struct VaultInfo { + string name; + string symbol; + address assetAddress; + // Basic vault metrics + uint256 totalAssets; + uint256 totalSupply; + uint256 apr; + // Governance settings + address guardian; + address curator; + uint256 timelock; + uint256 maxDeposit; + uint64 performanceFeeRate; + uint256 idleFunds; // asset.balanceOf(address(this)) + // Financial metrics + uint256 totalFt; + uint256 accretingPrincipal; + uint256 annualizedInterest; + uint256 performanceFee; + // Queue information + address[] supplyQueue; + address[] withdrawQueue; + // Pending governance updates + PendingAddress pendingGuardian; + PendingUint192 pendingTimelock; + PendingUint192 pendingPerformanceFeeRate; + uint256 maxMint; // maxMint(address(0)) + uint256 convertToSharesPrice; // convertToShares(One) + bool isPaused; + } + + function getPositionDetail(ITermMaxMarket market, address owner) public view returns (Position memory position) { + (IMintableERC20 ft, IMintableERC20 xt, IGearingToken gt, address collateral, IERC20 underlying) = + market.tokens(); + position.underlyingBalance = underlying.balanceOf(owner); + position.collateralBalance = IERC20(collateral).balanceOf(owner); + position.ftBalance = ft.balanceOf(owner); + position.xtBalance = xt.balanceOf(owner); + + IERC721Enumerable gtNft = IERC721Enumerable(address(gt)); + uint256 balance = gtNft.balanceOf(owner); + LoanPosition[] memory gtInfos = new LoanPosition[](balance); + + uint256 validPositions = 0; + for (uint256 i = 0; i < balance; ++i) { + uint256 loanId = gtNft.tokenOfOwnerByIndex(owner, i); + try gt.loanInfo(loanId) returns (address, uint128 debtAmt, bytes memory collateralData) { + gtInfos[validPositions].loanId = loanId; + gtInfos[validPositions].debtAmt = debtAmt; + gtInfos[validPositions].collateralAmt = _decodeAmount(collateralData); + validPositions++; + } catch { + // Skip this loan ID if loanInfo call fails + } + } + position.gtInfo = new LoanPosition[](validPositions); + for (uint256 i = 0; i < validPositions; i++) { + position.gtInfo[i] = gtInfos[i]; + } + } + + function getPositionDetails(ITermMaxMarket[] memory market, address owner) + external + view + returns (Position[] memory) + { + Position[] memory positions = new Position[](market.length); + for (uint256 i = 0; i < market.length; ++i) { + positions[i] = getPositionDetail(market[i], owner); + } + return positions; + } + + function getAllLoanPosition(ITermMaxMarket market, address owner) external view returns (LoanPosition[] memory) { + (,, IGearingToken gt,,) = market.tokens(); + uint256 balance = gt.balanceOf(owner); + LoanPosition[] memory loanPositionsTmp = new LoanPosition[](balance); + + uint256 validPositions = 0; + for (uint256 i = 0; i < balance; ++i) { + uint256 loanId = gt.tokenOfOwnerByIndex(owner, i); + try gt.loanInfo(loanId) returns (address, uint128 debtAmt, bytes memory collateralData) { + loanPositionsTmp[validPositions].loanId = loanId; + loanPositionsTmp[validPositions].debtAmt = debtAmt; + loanPositionsTmp[validPositions].collateralAmt = _decodeAmount(collateralData); + validPositions++; + } catch { + // Skip this loan ID if loanInfo call fails + } + } + + LoanPosition[] memory loanPositions = new LoanPosition[](validPositions); + for (uint256 i = 0; i < validPositions; i++) { + loanPositions[i] = loanPositionsTmp[i]; + } + return loanPositions; + } + + function getAllLoanPositionV2(ITermMaxMarket market) external view returns (LoanPositionV2[] memory) { + (,, IGearingToken gtNft,,) = market.tokens(); + GtConfig memory config = gtNft.getGtConfig(); + uint256 supply = gtNft.totalSupply(); + LoanPositionV2[] memory loanPositionsTmp = new LoanPositionV2[](supply); + + uint256 validPositions = 0; + for (uint256 i = 0; i < supply; ++i) { + uint256 loanId = gtNft.tokenByIndex(i); + try gtNft.loanInfo(loanId) returns (address owner, uint128 debtAmt, bytes memory collateralData) { + loanPositionsTmp[validPositions].loanId = loanId; + loanPositionsTmp[validPositions].debtAmt = debtAmt; + loanPositionsTmp[validPositions].collateralAmt = _decodeAmount(collateralData); + loanPositionsTmp[validPositions].owner = owner; + try gtNft.getLiquidationInfo(loanId) returns (bool isLiquidable, uint128 ltv, uint128 maxRepayAmt) { + loanPositionsTmp[validPositions].ltv = ltv; + loanPositionsTmp[validPositions].isHealthy = ltv >= config.loanConfig.liquidationLtv; + loanPositionsTmp[validPositions].isLiquidable = isLiquidable; + loanPositionsTmp[validPositions].maxRepayAmt = maxRepayAmt; + } catch { + // Skip this loan ID if getLiquidationInfo call fails + } + validPositions++; + } catch { + // Skip this loan ID if loanInfo call fails + continue; + } + + } + + LoanPositionV2[] memory loanPositions = new LoanPositionV2[](validPositions); + for (uint256 i = 0; i < validPositions; i++) { + loanPositions[i] = loanPositionsTmp[i]; + } + return loanPositions; + } + + function getVaultBalance(address user, ITermMaxVault[] memory vaults, OracleAggregator oracleAggregator) external view returns (VaultPosition[] memory) { + VaultPosition[] memory vaultPositions = new VaultPosition[](vaults.length); + for (uint256 i = 0; i < vaults.length; i++) { + address asset = vaults[i].asset(); + uint256 balance = vaults[i].balanceOf(user); + vaultPositions[i].balance = balance; + vaultPositions[i].toAssetBalance = vaults[i].convertToAssets(balance); + try oracleAggregator.getPrice(asset) returns (uint256 price, uint8) { + uint8 assetDecimals = IERC20Metadata(asset).decimals(); + vaultPositions[i].usdValue = vaultPositions[i].toAssetBalance.mulDiv(price, 10 ** assetDecimals); + } catch { + vaultPositions[i].usdValue = 0; + } + } + return vaultPositions; + } + + function getOrderState(ITermMaxOrder order) external view returns (OrderState memory orderState) { + ITermMaxMarket market = order.market(); + (,, IGearingToken gt,,) = market.tokens(); + + (OrderConfig memory orderConfig) = order.orderConfig(); + (uint256 ftReserve, uint256 xtReserve) = order.tokenReserves(); + if (orderConfig.gtId != 0) { + try gt.loanInfo(orderConfig.gtId) returns (address, uint128 debtAmt, bytes memory collateralData) { + orderState.collateralReserve = _decodeAmount(collateralData); + orderState.debtReserve = debtAmt; + } catch { + // If loan info is unavailable, set defaults + orderState.collateralReserve = 0; + orderState.debtReserve = 0; + } + } + + orderState.ftReserve = ftReserve; + orderState.xtReserve = xtReserve; + orderState.maxXtReserve = orderConfig.maxXtReserve; + orderState.gtId = orderConfig.gtId; + orderState.curveCuts = orderConfig.curveCuts; + orderState.feeConfig = orderConfig.feeConfig; + return orderState; + } + + /** + * @notice Get comprehensive information about a TermMaxVault + * @param vault The TermMaxVault to query + * @return vaultInfo The vault information + */ + function getVaultInfo(ITermMaxVault vault) external view returns (VaultInfo memory vaultInfo) { + IERC20 asset = IERC20(vault.asset()); + + // Basic vault metrics + vaultInfo.name = vault.name(); + vaultInfo.symbol = vault.symbol(); + vaultInfo.assetAddress = address(asset); + vaultInfo.totalAssets = vault.totalAssets(); + vaultInfo.totalSupply = vault.totalSupply(); + vaultInfo.apr = vault.apr(); + + // Governance settings + vaultInfo.guardian = vault.guardian(); + vaultInfo.curator = vault.curator(); + vaultInfo.timelock = vault.timelock(); + vaultInfo.maxDeposit = vault.maxDeposit(address(0)); + + vaultInfo.idleFunds = asset.balanceOf(address(vault)); + + // Financial metrics + vaultInfo.totalFt = vault.totalFt(); + vaultInfo.accretingPrincipal = vault.accretingPrincipal(); + vaultInfo.annualizedInterest = vault.annualizedInterest(); + vaultInfo.performanceFeeRate = vault.performanceFeeRate(); + vaultInfo.performanceFee = vault.performanceFee(); + + // Queue information + uint256 supplyQueueLength = vault.supplyQueueLength(); + vaultInfo.supplyQueue = new address[](supplyQueueLength); + for (uint256 i = 0; i < supplyQueueLength; i++) { + vaultInfo.supplyQueue[i] = vault.supplyQueue(i); + } + + uint256 withdrawQueueLength = vault.withdrawQueueLength(); + vaultInfo.withdrawQueue = new address[](withdrawQueueLength); + for (uint256 i = 0; i < withdrawQueueLength; i++) { + vaultInfo.withdrawQueue[i] = vault.withdrawQueue(i); + } + + // Pending governance updates + vaultInfo.pendingGuardian = vault.pendingGuardian(); + vaultInfo.pendingTimelock = vault.pendingTimelock(); + vaultInfo.pendingPerformanceFeeRate = vault.pendingPerformanceFeeRate(); + + vaultInfo.maxMint = vault.maxMint(address(0)); + uint256 one = 10 ** vault.decimals(); + vaultInfo.convertToSharesPrice = vault.convertToShares(one); + vaultInfo.isPaused = IPausable(address(vault)).paused(); + } + + /** + * @notice Get information about all orders in a vault + * @param vault The TermMaxVault to query + * @return orderInfos Array of information about each order in the vault + */ + function getVaultOrdersInfo(ITermMaxVault vault) external view returns (OrderState[] memory) { + uint256 supplyQueueLength = vault.supplyQueueLength(); + OrderState[] memory orderInfos = new OrderState[](supplyQueueLength); + + for (uint256 i = 0; i < supplyQueueLength; i++) { + address orderAddress = vault.supplyQueue(i); + ITermMaxOrder order = ITermMaxOrder(orderAddress); + orderInfos[i] = this.getOrderState(order); + } + + return orderInfos; + } + + function getVaultPendingMarkets(ITermMaxVault vault, address[] calldata markets) + external + view + returns (PendingUint192[] memory) + { + PendingUint192[] memory pendingMarkets = new PendingUint192[](markets.length); + for (uint256 i = 0; i < markets.length; i++) { + pendingMarkets[i] = vault.pendingMarkets(markets[i]); + } + return pendingMarkets; + } + + function _decodeAmount(bytes memory collateralData) internal pure returns (uint256) { + return abi.decode(collateralData, (uint256)); + } +} diff --git a/contracts/v1/router/TermMaxRouter.sol b/contracts/v1/router/TermMaxRouter.sol new file mode 100644 index 0000000..4c62ef6 --- /dev/null +++ b/contracts/v1/router/TermMaxRouter.sol @@ -0,0 +1,562 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {IERC721Enumerable} from "@openzeppelin/contracts/interfaces/IERC721Enumerable.sol"; +import {IERC721Receiver} from "@openzeppelin/contracts/interfaces/IERC721Receiver.sol"; +import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; +import { + Ownable2StepUpgradeable, + OwnableUpgradeable +} from "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; + +import {ITermMaxMarket} from "../ITermMaxMarket.sol"; +import {ITermMaxOrder} from "../ITermMaxOrder.sol"; +import {SwapUnit, ISwapAdapter} from "./ISwapAdapter.sol"; +import {RouterErrors} from "../errors/RouterErrors.sol"; +import {RouterEvents} from "../events/RouterEvents.sol"; +import {TransferUtils} from "../lib/TransferUtils.sol"; +import {IFlashLoanReceiver} from "../IFlashLoanReceiver.sol"; +import {IFlashRepayer} from "../tokens/IFlashRepayer.sol"; +import {ITermMaxRouter} from "./ITermMaxRouter.sol"; +import {IGearingToken} from "../tokens/IGearingToken.sol"; +import {CurveCuts} from "../storage/TermMaxStorage.sol"; +import {ISwapCallback} from "../ISwapCallback.sol"; +import {Constants} from "../lib/Constants.sol"; +import {MathLib} from "../lib/MathLib.sol"; + +/** + * @title TermMax Router + * @author Term Structure Labs + */ +contract TermMaxRouter is + UUPSUpgradeable, + Ownable2StepUpgradeable, + PausableUpgradeable, + IFlashLoanReceiver, + IFlashRepayer, + IERC721Receiver, + ITermMaxRouter, + RouterErrors, + RouterEvents +{ + using SafeCast for *; + using TransferUtils for IERC20; + using MathLib for uint256; + + enum FlashLoanType { + COLLATERAL, + DEBT + } + + /// @notice whitelist mapping of adapter + mapping(address => bool) public adapterWhitelist; + + function _authorizeUpgrade(address newImplementation) internal virtual override onlyOwner {} + + function initialize(address admin) public initializer { + __UUPSUpgradeable_init(); + __Pausable_init(); + __Ownable_init(admin); + } + + /** + * @inheritdoc ITermMaxRouter + */ + function setAdapterWhitelist(address adapter, bool isWhitelist) external onlyOwner { + adapterWhitelist[adapter] = isWhitelist; + emit UpdateSwapAdapterWhiteList(adapter, isWhitelist); + } + + /** + * @inheritdoc ITermMaxRouter + */ + function assetsWithERC20Collateral(ITermMaxMarket market, address owner) + external + view + override + returns (IERC20[4] memory tokens, uint256[4] memory balances, address gtAddr, uint256[] memory gtIds) + { + (IERC20 ft, IERC20 xt, IGearingToken gt, address collateral, IERC20 underlying) = market.tokens(); + tokens[0] = ft; + tokens[1] = xt; + tokens[2] = IERC20(collateral); + tokens[3] = underlying; + for (uint256 i = 0; i < 4; ++i) { + balances[i] = tokens[i].balanceOf(owner); + } + gtAddr = address(gt); + uint256 balance = IERC721Enumerable(gtAddr).balanceOf(owner); + gtIds = new uint256[](balance); + for (uint256 i = 0; i < balance; ++i) { + gtIds[i] = IERC721Enumerable(gtAddr).tokenOfOwnerByIndex(owner, i); + } + } + + function swapExactTokenToToken( + IERC20 tokenIn, + IERC20 tokenOut, + address recipient, + ITermMaxOrder[] memory orders, + uint128[] memory tradingAmts, + uint128 minTokenOut, + uint256 deadline + ) external whenNotPaused returns (uint256 netTokenOut) { + uint256 totalAmtIn = sum(tradingAmts); + tokenIn.safeTransferFrom(msg.sender, address(this), totalAmtIn); + netTokenOut = _swapExactTokenToToken(tokenIn, tokenOut, recipient, orders, tradingAmts, minTokenOut, deadline); + emit SwapExactTokenToToken(tokenIn, tokenOut, msg.sender, recipient, orders, tradingAmts, netTokenOut); + } + + function _swapExactTokenToToken( + IERC20 tokenIn, + IERC20 tokenOut, + address recipient, + ITermMaxOrder[] memory orders, + uint128[] memory tradingAmts, + uint128 minTokenOut, + uint256 deadline + ) internal returns (uint256 netTokenOut) { + if (orders.length != tradingAmts.length) revert OrdersAndAmtsLengthNotMatch(); + for (uint256 i = 0; i < orders.length; ++i) { + ITermMaxOrder order = orders[i]; + tokenIn.safeIncreaseAllowance(address(order), tradingAmts[i]); + netTokenOut += order.swapExactTokenToToken(tokenIn, tokenOut, recipient, tradingAmts[i], 0, deadline); + } + if (netTokenOut < minTokenOut) revert InsufficientTokenOut(address(tokenOut), netTokenOut, minTokenOut); + } + + function swapTokenToExactToken( + IERC20 tokenIn, + IERC20 tokenOut, + address recipient, + ITermMaxOrder[] memory orders, + uint128[] memory tradingAmts, + uint128 maxTokenIn, + uint256 deadline + ) external whenNotPaused returns (uint256 netTokenIn) { + tokenIn.safeTransferFrom(msg.sender, address(this), maxTokenIn); + netTokenIn = _swapTokenToExactToken(tokenIn, tokenOut, recipient, orders, tradingAmts, maxTokenIn, deadline); + tokenIn.safeTransfer(msg.sender, maxTokenIn - netTokenIn); + emit SwapTokenToExactToken(tokenIn, tokenOut, msg.sender, recipient, orders, tradingAmts, netTokenIn); + } + + function _swapTokenToExactToken( + IERC20 tokenIn, + IERC20 tokenOut, + address recipient, + ITermMaxOrder[] memory orders, + uint128[] memory tradingAmts, + uint128 maxTokenIn, + uint256 deadline + ) internal returns (uint256 netTokenIn) { + if (orders.length != tradingAmts.length) revert OrdersAndAmtsLengthNotMatch(); + for (uint256 i = 0; i < orders.length; ++i) { + ITermMaxOrder order = orders[i]; + tokenIn.safeIncreaseAllowance(address(order), maxTokenIn); + netTokenIn += + order.swapTokenToExactToken(tokenIn, tokenOut, recipient, tradingAmts[i], maxTokenIn, deadline); + } + if (netTokenIn > maxTokenIn) revert InsufficientTokenIn(address(tokenIn), netTokenIn, maxTokenIn); + } + + function sum(uint128[] memory values) internal pure returns (uint256 total) { + for (uint256 i = 0; i < values.length; ++i) { + total += values[i]; + } + } + + function sellTokens( + address recipient, + ITermMaxMarket market, + uint128 ftInAmt, + uint128 xtInAmt, + ITermMaxOrder[] memory orders, + uint128[] memory amtsToSellTokens, + uint128 minTokenOut, + uint256 deadline + ) external whenNotPaused returns (uint256 netTokenOut) { + (IERC20 ft, IERC20 xt,,, IERC20 debtToken) = market.tokens(); + (uint256 maxBurn, IERC20 toenToSell) = ftInAmt > xtInAmt ? (xtInAmt, ft) : (ftInAmt, xt); + + ft.safeTransferFrom(msg.sender, address(this), ftInAmt); + ft.safeIncreaseAllowance(address(market), maxBurn); + xt.safeTransferFrom(msg.sender, address(this), xtInAmt); + xt.safeIncreaseAllowance(address(market), maxBurn); + market.burn(recipient, maxBurn); + netTokenOut = _swapExactTokenToToken(toenToSell, debtToken, recipient, orders, amtsToSellTokens, 0, deadline); + netTokenOut += maxBurn; + if (netTokenOut < minTokenOut) revert InsufficientTokenOut(address(debtToken), netTokenOut, minTokenOut); + emit SellTokens(market, msg.sender, recipient, ftInAmt, xtInAmt, orders, amtsToSellTokens, netTokenOut); + } + + function leverageFromToken( + address recipient, + ITermMaxMarket market, + ITermMaxOrder[] memory orders, + uint128[] memory amtsToBuyXt, + uint128 minXtOut, + uint128 tokenToSwap, + uint128 maxLtv, + SwapUnit[] memory units, + uint256 deadline + ) external whenNotPaused returns (uint256 gtId, uint256 netXtOut) { + (, IERC20 xt, IGearingToken gt,, IERC20 debtToken) = market.tokens(); + uint256 totalAmtToBuyXt = sum(amtsToBuyXt); + debtToken.safeTransferFrom(msg.sender, address(this), tokenToSwap + totalAmtToBuyXt); + netXtOut = _swapExactTokenToToken(debtToken, xt, address(this), orders, amtsToBuyXt, minXtOut, deadline); + + bytes memory callbackData = abi.encode(address(gt), tokenToSwap, units, FlashLoanType.DEBT); + xt.safeIncreaseAllowance(address(market), netXtOut); + + gtId = market.leverageByXt(recipient, netXtOut.toUint128(), callbackData); + (,, bytes memory collateralData) = gt.loanInfo(gtId); + (, uint128 ltv,) = gt.getLiquidationInfo(gtId); + if (ltv > maxLtv) { + revert LtvBiggerThanExpected(maxLtv, ltv); + } + emit IssueGt(market, gtId, msg.sender, recipient, tokenToSwap, netXtOut.toUint128(), ltv, collateralData); + } + + /** + * @inheritdoc ITermMaxRouter + */ + function leverageFromXt( + address recipient, + ITermMaxMarket market, + uint128 xtInAmt, + uint128 tokenInAmt, + uint128 maxLtv, + SwapUnit[] memory units + ) external whenNotPaused returns (uint256 gtId) { + (, IERC20 xt, IGearingToken gt,, IERC20 debtToken) = market.tokens(); + xt.safeTransferFrom(msg.sender, address(this), xtInAmt); + xt.safeIncreaseAllowance(address(market), xtInAmt); + + debtToken.safeTransferFrom(msg.sender, address(this), tokenInAmt); + + bytes memory callbackData = abi.encode(address(gt), tokenInAmt, units, FlashLoanType.DEBT); + gtId = market.leverageByXt(recipient, xtInAmt.toUint128(), callbackData); + + (,, bytes memory collateralData) = gt.loanInfo(gtId); + (, uint128 ltv,) = gt.getLiquidationInfo(gtId); + if (ltv > maxLtv) { + revert LtvBiggerThanExpected(maxLtv, ltv); + } + emit IssueGt(market, gtId, msg.sender, recipient, tokenInAmt, xtInAmt, ltv, collateralData); + } + + /** + * @inheritdoc ITermMaxRouter + */ + function leverageFromXtAndCollateral( + address recipient, + ITermMaxMarket market, + uint128 xtInAmt, + uint128 collateralInAmt, + uint128 maxLtv, + SwapUnit[] memory units + ) external whenNotPaused returns (uint256 gtId) { + (, IERC20 xt, IGearingToken gt, address collAddr,) = market.tokens(); + IERC20 collateral = IERC20(collAddr); + xt.safeTransferFrom(msg.sender, address(this), xtInAmt); + xt.safeIncreaseAllowance(address(market), xtInAmt); + + collateral.safeTransferFrom(msg.sender, address(this), collateralInAmt); + + bytes memory callbackData = abi.encode(address(gt), 0, units, FlashLoanType.COLLATERAL); + gtId = market.leverageByXt(recipient, xtInAmt.toUint128(), callbackData); + + (,, bytes memory collateralData) = gt.loanInfo(gtId); + (, uint128 ltv,) = gt.getLiquidationInfo(gtId); + if (ltv > maxLtv) { + revert LtvBiggerThanExpected(maxLtv, ltv); + } + emit IssueGt(market, gtId, msg.sender, recipient, 0, xtInAmt, ltv, collateralData); + } + + /** + * @inheritdoc ITermMaxRouter + */ + function borrowTokenFromCollateral( + address recipient, + ITermMaxMarket market, + uint256 collInAmt, + ITermMaxOrder[] memory orders, + uint128[] memory tokenAmtsWantBuy, + uint128 maxDebtAmt, + uint256 deadline + ) external whenNotPaused returns (uint256) { + (IERC20 ft,, IGearingToken gt, address collateralAddr, IERC20 debtToken) = market.tokens(); + IERC20(collateralAddr).safeTransferFrom(msg.sender, address(this), collInAmt); + IERC20(collateralAddr).safeIncreaseAllowance(address(gt), collInAmt); + + (uint256 gtId, uint128 ftOutAmt) = market.issueFt(address(this), maxDebtAmt, _encodeAmount(collInAmt)); + uint256 netTokenIn = + _swapTokenToExactToken(ft, debtToken, recipient, orders, tokenAmtsWantBuy, ftOutAmt, deadline); + uint256 repayAmt = ftOutAmt - netTokenIn; + if (repayAmt > 0) { + ft.safeIncreaseAllowance(address(gt), repayAmt); + gt.repay(gtId, repayAmt.toUint128(), false); + } + + gt.safeTransferFrom(address(this), recipient, gtId); + emit Borrow(market, gtId, msg.sender, recipient, collInAmt, ftOutAmt, netTokenIn.toUint128()); + return gtId; + } + + function borrowTokenFromCollateral(address recipient, ITermMaxMarket market, uint256 collInAmt, uint256 borrowAmt) + external + whenNotPaused + returns (uint256) + { + (IERC20 ft, IERC20 xt, IGearingToken gt, address collateralAddr,) = market.tokens(); + + IERC20(collateralAddr).safeTransferFrom(msg.sender, address(this), collInAmt); + IERC20(collateralAddr).safeIncreaseAllowance(address(gt), collInAmt); + + uint256 mintGtFeeRatio = market.mintGtFeeRatio(); + uint128 debtAmt = ((borrowAmt * Constants.DECIMAL_BASE) / (Constants.DECIMAL_BASE - mintGtFeeRatio)).toUint128(); + + (uint256 gtId, uint128 ftOutAmt) = market.issueFt(address(this), debtAmt, _encodeAmount(collInAmt)); + borrowAmt = borrowAmt.min(ftOutAmt); + xt.safeTransferFrom(msg.sender, address(this), borrowAmt); + + ft.safeIncreaseAllowance(address(market), borrowAmt); + xt.safeIncreaseAllowance(address(market), borrowAmt); + + market.burn(recipient, borrowAmt); + + gt.safeTransferFrom(address(this), recipient, gtId); + emit Borrow(market, gtId, msg.sender, recipient, collInAmt, debtAmt, borrowAmt.toUint128()); + return gtId; + } + + function borrowTokenFromGt(address recipient, ITermMaxMarket market, uint256 gtId, uint256 borrowAmt) + external + whenNotPaused + { + (IERC20 ft, IERC20 xt, IGearingToken gt,,) = market.tokens(); + + if (gt.ownerOf(gtId) != msg.sender) { + revert GtNotOwnedBySender(); + } + + uint256 mintGtFeeRatio = market.mintGtFeeRatio(); + uint128 debtAmt = ((borrowAmt * Constants.DECIMAL_BASE) / (Constants.DECIMAL_BASE - mintGtFeeRatio)).toUint128(); + + uint256 ftOutAmt = market.issueFtByExistedGt(address(this), debtAmt, gtId); + borrowAmt = borrowAmt.min(ftOutAmt); + xt.safeTransferFrom(msg.sender, address(this), borrowAmt); + + ft.safeIncreaseAllowance(address(market), borrowAmt); + xt.safeIncreaseAllowance(address(market), borrowAmt); + market.burn(recipient, borrowAmt); + + emit Borrow(market, gtId, msg.sender, recipient, 0, debtAmt, borrowAmt.toUint128()); + } + + /** + * @inheritdoc ITermMaxRouter + */ + function flashRepayFromColl( + address recipient, + ITermMaxMarket market, + uint256 gtId, + ITermMaxOrder[] memory orders, + uint128[] memory amtsToBuyFt, + bool byDebtToken, + SwapUnit[] memory units, + uint256 deadline + ) external whenNotPaused returns (uint256 netTokenOut) { + (IERC20 ft,, IGearingToken gt,, IERC20 debtToken) = market.tokens(); + gt.safeTransferFrom(msg.sender, address(this), gtId, ""); + gt.flashRepay(gtId, byDebtToken, abi.encode(orders, amtsToBuyFt, ft, units, deadline)); + netTokenOut = debtToken.balanceOf(address(this)); + debtToken.safeTransfer(recipient, netTokenOut); + } + + /** + * @inheritdoc ITermMaxRouter + */ + function repayByTokenThroughFt( + address recipient, + ITermMaxMarket market, + uint256 gtId, + ITermMaxOrder[] memory orders, + uint128[] memory ftAmtsWantBuy, + uint128 maxTokenIn, + uint256 deadline + ) external whenNotPaused returns (uint256 returnAmt) { + (IERC20 ft,, IGearingToken gt,, IERC20 debtToken) = market.tokens(); + + debtToken.safeTransferFrom(msg.sender, address(this), maxTokenIn); + uint256 netCost = + _swapTokenToExactToken(debtToken, ft, address(this), orders, ftAmtsWantBuy, maxTokenIn, deadline); + uint256 totalFtAmt = sum(ftAmtsWantBuy); + (, uint128 repayAmt,) = gt.loanInfo(gtId); + + if (totalFtAmt < repayAmt) { + repayAmt = totalFtAmt.toUint128(); + } + ft.safeIncreaseAllowance(address(gt), repayAmt); + gt.repay(gtId, repayAmt, false); + + returnAmt = maxTokenIn - netCost; + debtToken.safeTransfer(recipient, returnAmt); + if (totalFtAmt > repayAmt) { + ft.safeTransfer(recipient, totalFtAmt - repayAmt); + } + + emit RepayByTokenThroughFt(market, gtId, msg.sender, recipient, repayAmt, returnAmt); + } + + function redeemAndSwap( + address recipient, + ITermMaxMarket market, + uint256 ftAmount, + SwapUnit[] memory units, + uint256 minTokenOut + ) external whenNotPaused returns (uint256) { + (IERC20 ft,,, address collateralAddr, IERC20 debtToken) = market.tokens(); + ft.safeTransferFrom(msg.sender, address(this), ftAmount); + ft.safeIncreaseAllowance(address(market), ftAmount); + (uint256 redeemedAmt, bytes memory collateralData) = market.redeem(ftAmount, address(this)); + redeemedAmt += _decodeAmount(_doSwap(collateralData, units)); + if (redeemedAmt < minTokenOut) { + revert InsufficientTokenOut(address(debtToken), redeemedAmt, minTokenOut); + } + debtToken.safeTransfer(recipient, redeemedAmt); + emit RedeemAndSwap(market, ftAmount, msg.sender, recipient, redeemedAmt); + return redeemedAmt; + } + + function createOrderAndDeposit( + ITermMaxMarket market, + address maker, + uint256 maxXtReserve, + ISwapCallback swapTrigger, + uint256 debtTokenToDeposit, + uint128 ftToDeposit, + uint128 xtToDeposit, + CurveCuts memory curveCuts + ) external whenNotPaused returns (ITermMaxOrder order) { + (IERC20 ft, IERC20 xt,,, IERC20 debtToken) = market.tokens(); + order = market.createOrder(maker, maxXtReserve, swapTrigger, curveCuts); + if (debtTokenToDeposit > 0) { + debtToken.safeTransferFrom(msg.sender, address(this), debtTokenToDeposit); + debtToken.safeIncreaseAllowance(address(market), debtTokenToDeposit); + market.mint(address(order), debtTokenToDeposit); + } + if (ftToDeposit > 0) { + ft.safeTransferFrom(msg.sender, address(order), ftToDeposit); + } + if (xtToDeposit > 0) { + xt.safeTransferFrom(msg.sender, address(order), xtToDeposit); + } + + emit CreateOrderAndDeposit(market, order, maker, debtTokenToDeposit, ftToDeposit, xtToDeposit, curveCuts); + } + + /// @dev Market flash leverage flashloan callback + function executeOperation(address, IERC20, uint256 amount, bytes memory data) + external + returns (bytes memory collateralData) + { + (address gt, uint256 tokenInAmt, SwapUnit[] memory units, FlashLoanType flashLoanType) = + abi.decode(data, (address, uint256, SwapUnit[], FlashLoanType)); + uint256 totalAmount = amount + tokenInAmt; + collateralData = _doSwap(abi.encode(totalAmount), units); + SwapUnit memory lastUnit = units[units.length - 1]; + if (!adapterWhitelist[lastUnit.adapter]) { + revert AdapterNotWhitelisted(lastUnit.adapter); + } + + if (flashLoanType == FlashLoanType.COLLATERAL) { + IERC20 collateral = IERC20(lastUnit.tokenOut); + uint256 collateralBalance = collateral.balanceOf(address(this)); + collateralData = _encodeAmount(collateralBalance); + // approve all collateral if fashloan type is collateral + collateral.safeIncreaseAllowance(gt, collateralBalance); + } else if (flashLoanType == FlashLoanType.DEBT) { + bytes memory approvalData = + abi.encodeCall(ISwapAdapter.approveOutputToken, (lastUnit.tokenOut, gt, collateralData)); + (bool success, bytes memory returnData) = lastUnit.adapter.delegatecall(approvalData); + if (!success) { + revert ApproveTokenFailWhenSwap(lastUnit.tokenOut, returnData); + } + } + } + + function _balanceOf(IERC20 token, address account) internal view returns (uint256) { + return token.balanceOf(account); + } + + function _encodeAmount(uint256 amount) internal pure returns (bytes memory) { + return abi.encode(amount); + } + + function _decodeAmount(bytes memory collateralData) internal pure returns (uint256) { + return abi.decode(collateralData, (uint256)); + } + + /// @dev Gt flash repay flashloan callback + function executeOperation( + IERC20 repayToken, + uint128 debtAmt, + address, + bytes memory collateralData, + bytes memory callbackData + ) external override { + ( + ITermMaxOrder[] memory orders, + uint128[] memory amtsToBuyFt, + IERC20 ft, + SwapUnit[] memory units, + uint256 deadline + ) = abi.decode(callbackData, (ITermMaxOrder[], uint128[], IERC20, SwapUnit[], uint256)); + bytes memory outData = _doSwap(collateralData, units); + + if (address(repayToken) == address(ft)) { + IERC20 debtToken = IERC20(units[units.length - 1].tokenOut); + uint256 amount = abi.decode(outData, (uint256)); + _swapTokenToExactToken(debtToken, ft, address(this), orders, amtsToBuyFt, amount.toUint128(), deadline); + } + repayToken.safeIncreaseAllowance(msg.sender, debtAmt); + } + + function _doSwap(bytes memory inputData, SwapUnit[] memory units) internal returns (bytes memory outData) { + if (units.length == 0) { + revert SwapUnitsIsEmpty(); + } + for (uint256 i = 0; i < units.length; ++i) { + if (!adapterWhitelist[units[i].adapter]) { + revert AdapterNotWhitelisted(units[i].adapter); + } + bytes memory dataToSwap = + abi.encodeCall(ISwapAdapter.swap, (units[i].tokenIn, units[i].tokenOut, inputData, units[i].swapData)); + + (bool success, bytes memory returnData) = units[i].adapter.delegatecall(dataToSwap); + if (!success) { + revert SwapFailed(units[i].adapter, returnData); + } + inputData = abi.decode(returnData, (bytes)); + } + outData = inputData; + } + + function onERC721Received(address, address, uint256, bytes memory) external pure override returns (bytes4) { + return this.onERC721Received.selector; + } + + function pause() external onlyOwner { + _pause(); + } + + function unpause() external onlyOwner { + _unpause(); + } +} diff --git a/contracts/v1/router/swapAdapters/ERC20SwapAdapter.sol b/contracts/v1/router/swapAdapters/ERC20SwapAdapter.sol new file mode 100644 index 0000000..aa0a5d2 --- /dev/null +++ b/contracts/v1/router/swapAdapters/ERC20SwapAdapter.sol @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {TransferUtils} from "../../lib/TransferUtils.sol"; +import {ISwapAdapter} from "../ISwapAdapter.sol"; + +/** + * @title TermMax ERC20SwapAdapter + * @author Term Structure Labs + */ +abstract contract ERC20SwapAdapter is ISwapAdapter { + using TransferUtils for IERC20; + + /// @notice Error for partial swap + error ERC20InvalidPartialSwap(uint256 expectedTradeAmt, uint256 actualTradeAmt); + + /// @notice Error for less than min token out + error LessThanMinTokenOut(uint256 actual, uint256 expected); + + /** + * @inheritdoc ISwapAdapter + */ + function swap(address tokenIn, address tokenOut, bytes memory tokenInData, bytes memory swapData) + external + override + returns (bytes memory tokenOutData) + { + uint256 tokenInAmt = _decodeAmount(tokenInData); + + uint256 tokenInAmtBefore = IERC20(tokenIn).balanceOf(address(this)); + uint256 tokenOutAmt = _swap(IERC20(tokenIn), IERC20(tokenOut), tokenInAmt, swapData); + uint256 tokenInAmtAfter = IERC20(tokenIn).balanceOf(address(this)); + + // Check partial swap + if (tokenInAmtAfter + tokenInAmt != tokenInAmtBefore) { + revert ERC20InvalidPartialSwap(tokenInAmt, tokenInAmtBefore - tokenInAmtAfter); + } + tokenOutData = _encodeAmount(tokenOutAmt); + } + + function _swap(IERC20 tokenIn, IERC20 tokenOut, uint256 tokenInAmt, bytes memory swapData) + internal + virtual + returns (uint256 tokenOutAmt); + + /** + * @inheritdoc ISwapAdapter + */ + function approveOutputToken(address token, address spender, bytes memory tokenData) external override { + IERC20(token).safeIncreaseAllowance(spender, _decodeAmount(tokenData)); + } + + /** + * @inheritdoc ISwapAdapter + */ + function transferOutputToken(address token, address to, bytes memory tokenData) external override { + IERC20(token).safeTransfer(to, _decodeAmount(tokenData)); + } + + /** + * @inheritdoc ISwapAdapter + */ + function transferInputTokenFrom(address token, address from, address to, bytes memory tokenData) + external + override + { + IERC20(token).safeTransferFrom(from, to, _decodeAmount(tokenData)); + } + + /// @notice Encode uin256 to bytes + function _encodeAmount(uint256 amount) internal pure returns (bytes memory data) { + data = abi.encode(amount); + } + + /// @notice Decode uin256 from bytes + function _decodeAmount(bytes memory data) internal pure returns (uint256 amount) { + amount = abi.decode(data, (uint256)); + } +} diff --git a/contracts/v1/router/swapAdapters/ERC4626VaultAdapter.sol b/contracts/v1/router/swapAdapters/ERC4626VaultAdapter.sol new file mode 100644 index 0000000..3a5a3c8 --- /dev/null +++ b/contracts/v1/router/swapAdapters/ERC4626VaultAdapter.sol @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {ERC20SwapAdapter} from "../../router/swapAdapters/ERC20SwapAdapter.sol"; +import {IERC4626} from "@openzeppelin/contracts/interfaces/IERC4626.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +/** + * @title TermMax ERC4626VaultAdapter + * @author Term Structure Labs + */ +contract ERC4626VaultAdapter is ERC20SwapAdapter { + enum Action { + Deposit, + Redeem + } + + error InvalidAction(); + + constructor() {} + + function _swap(IERC20 tokenIn, IERC20 tokenOut, uint256 amount, bytes memory swapData) + internal + virtual + override + returns (uint256 tokenOutAmt) + { + (Action action, uint256 inAmount, uint256 minTokenOut) = abi.decode(swapData, (Action, uint256, uint256)); + /** + * Note: Scaling Input/Output amount + */ + minTokenOut = (minTokenOut * amount) / inAmount; + + if (action == Action.Deposit) { + tokenIn.approve(address(tokenOut), amount); + tokenOutAmt = IERC4626(address(tokenOut)).deposit(amount, address(this)); + if (tokenOutAmt < minTokenOut) { + revert LessThanMinTokenOut(tokenOutAmt, minTokenOut); + } + } else if (action == Action.Redeem) { + tokenIn.approve(address(tokenIn), amount); + tokenOutAmt = IERC4626(address(tokenIn)).redeem(amount, address(this), address(this)); + if (tokenOutAmt < minTokenOut) { + revert LessThanMinTokenOut(tokenOutAmt, minTokenOut); + } + } else { + revert InvalidAction(); + } + } +} diff --git a/contracts/v1/router/swapAdapters/KyberswapV2Adapter.sol b/contracts/v1/router/swapAdapters/KyberswapV2Adapter.sol new file mode 100644 index 0000000..8f5e699 --- /dev/null +++ b/contracts/v1/router/swapAdapters/KyberswapV2Adapter.sol @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {Address} from "@openzeppelin/contracts/utils/Address.sol"; +import "./ERC20SwapAdapter.sol"; + +interface IKyberScalingHelper { + function getScaledInputData(bytes calldata inputData, uint256 newAmount) + external + view + returns (bool isSuccess, bytes memory data); +} + +/** + * @title TermMax KyberswapV2Adapter + * @author Term Structure Labs + */ +contract KyberswapV2Adapter is ERC20SwapAdapter { + using Address for address; + + address public immutable router; + address public immutable KYBER_SCALING_HELPER; + + constructor(address router_, address scalingHelper_) { + router = router_; + KYBER_SCALING_HELPER = scalingHelper_; // 0x2f577A41BeC1BE1152AeEA12e73b7391d15f655D + } + + function _swap(IERC20 tokenIn, IERC20, uint256 amountIn, bytes memory swapData) + internal + virtual + override + returns (uint256) + { + IERC20(tokenIn).approve(address(router), amountIn); + (bool isSuccess, bytes memory newSwapData) = + IKyberScalingHelper(KYBER_SCALING_HELPER).getScaledInputData(swapData, amountIn); + + require(isSuccess, "PendleSwap: Kyber scaling failed"); + + bytes memory returnData = router.functionCall(newSwapData); + (uint256 tokenOutAmt,) = abi.decode(returnData, (uint256, uint256)); + return tokenOutAmt; + } +} diff --git a/contracts/v1/router/swapAdapters/OdosV2Adapter.sol b/contracts/v1/router/swapAdapters/OdosV2Adapter.sol new file mode 100644 index 0000000..98d6594 --- /dev/null +++ b/contracts/v1/router/swapAdapters/OdosV2Adapter.sol @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "./ERC20SwapAdapter.sol"; + +interface IOdosRouterV2 { + struct swapTokenInfo { + address inputToken; + uint256 inputAmount; + address inputReceiver; + address outputToken; + uint256 outputQuote; + uint256 outputMin; + address outputReceiver; + } + + function swap(swapTokenInfo memory tokenInfo, bytes calldata pathDefinition, address executor, uint32 referralCode) + external + payable + returns (uint256 amountOut); +} + +/** + * @title TermMax OdosAdapterV2Adapter + * @author Term Structure Labs + */ +contract OdosV2Adapter is ERC20SwapAdapter { + IOdosRouterV2 public immutable router; + + constructor(address router_) { + router = IOdosRouterV2(router_); + } + + function _swap(IERC20 tokenIn, IERC20 tokenOut, uint256 amountIn, bytes memory swapData) + internal + virtual + override + returns (uint256 tokenOutAmt) + { + IERC20(tokenIn).approve(address(router), amountIn); + + ( + IOdosRouterV2.swapTokenInfo memory tokenInfo, + bytes memory pathDefinition, + address executor, + uint32 referralCode + ) = abi.decode(swapData, (IOdosRouterV2.swapTokenInfo, bytes, address, uint32)); + + require(tokenInfo.outputToken == address(tokenOut), "INVALID_OUTPUT_TOKEN"); + /** + * Note: Scaling Input/Output amount + */ + tokenInfo.outputQuote = (tokenInfo.outputQuote * amountIn) / tokenInfo.inputAmount; + tokenInfo.outputMin = (tokenInfo.outputMin * amountIn) / tokenInfo.inputAmount; + tokenInfo.inputAmount = amountIn; + tokenInfo.outputReceiver = address(this); + + tokenOutAmt = router.swap(tokenInfo, pathDefinition, executor, referralCode); + } +} diff --git a/contracts/v1/router/swapAdapters/PendleSwapV3Adapter.sol b/contracts/v1/router/swapAdapters/PendleSwapV3Adapter.sol new file mode 100644 index 0000000..f4602e0 --- /dev/null +++ b/contracts/v1/router/swapAdapters/PendleSwapV3Adapter.sol @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {PendleHelper} from "../../extensions/PendleHelper.sol"; +import {IPAllActionV3} from "@pendle/core-v2/contracts/interfaces/IPAllActionV3.sol"; +import {IPMarket, IPPrincipalToken, IPYieldToken} from "@pendle/core-v2/contracts/interfaces/IPMarket.sol"; +import "./ERC20SwapAdapter.sol"; +/** + * @title TermMax PendleSwapV3Adapter + * @author Term Structure Labs + */ + +contract PendleSwapV3Adapter is ERC20SwapAdapter, PendleHelper { + IPAllActionV3 public immutable router; + + constructor(address router_) { + router = IPAllActionV3(router_); + } + + function _swap(IERC20 tokenIn, IERC20 tokenOut, uint256 amount, bytes memory swapData) + internal + virtual + override + returns (uint256 tokenOutAmt) + { + (address ptMarketAddr, uint256 inAmount, uint256 minTokenOut) = + abi.decode(swapData, (address, uint256, uint256)); + IPMarket market = IPMarket(ptMarketAddr); + + (, IPPrincipalToken PT,) = market.readTokens(); + IERC20(tokenIn).approve(address(router), amount); + + /** + * Note: Scaling Input/Output amount + */ + minTokenOut = (minTokenOut * amount) / inAmount; + + if (tokenOut == PT) { + IERC20(tokenIn).approve(address(router), amount); + (tokenOutAmt,,) = router.swapExactTokenForPt( + address(this), + address(market), + minTokenOut, + defaultApprox, + createTokenInputStruct(address(tokenIn), amount), + emptyLimit + ); + } else { + if (PT.isExpired()) { + IPYieldToken YT = IPYieldToken(PT.YT()); + IERC20(tokenIn).transfer(address(YT), amount); + tokenOutAmt = IPYieldToken(YT).redeemPY(address(this)); + if (tokenOutAmt < minTokenOut) { + revert LessThanMinTokenOut(tokenOutAmt, minTokenOut); + } + } else { + IERC20(tokenIn).approve(address(router), amount); + (tokenOutAmt,,) = router.swapExactPtForToken( + address(this), + address(market), + amount, + createTokenOutputStruct(address(tokenOut), minTokenOut), + emptyLimit + ); + } + } + } +} diff --git a/contracts/v1/router/swapAdapters/UniswapV3Adapter.sol b/contracts/v1/router/swapAdapters/UniswapV3Adapter.sol new file mode 100644 index 0000000..8f438b9 --- /dev/null +++ b/contracts/v1/router/swapAdapters/UniswapV3Adapter.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {TransferHelper} from "@uniswap/v3-periphery/contracts/libraries/TransferHelper.sol"; +import {ISwapRouter} from "@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol"; +import "./ERC20SwapAdapter.sol"; + +/** + * @title TermMax UniswapV3Adapter + * @author Term Structure Labs + */ +contract UniswapV3Adapter is ERC20SwapAdapter { + ISwapRouter public immutable router; + + constructor(address router_) { + router = ISwapRouter(router_); + } + + function _swap(IERC20 tokenIn, IERC20, uint256 amount, bytes memory swapData) + internal + virtual + override + returns (uint256 tokenOutAmt) + { + IERC20(tokenIn).approve(address(router), amount); + (bytes memory path, uint256 deadline, uint256 inAmount, uint256 amountOutMinimum) = + abi.decode(swapData, (bytes, uint256, uint256, uint256)); + /** + * Note: Scaling Input/Output amount + */ + amountOutMinimum = (amountOutMinimum * amount) / inAmount; + + tokenOutAmt = router.exactInput( + ISwapRouter.ExactInputParams({ + path: path, + recipient: address(this), + deadline: deadline, + amountIn: amount, + amountOutMinimum: amountOutMinimum + }) + ); + } +} diff --git a/contracts/v1/storage/TermMaxStorage.sol b/contracts/v1/storage/TermMaxStorage.sol new file mode 100644 index 0000000..6e67126 --- /dev/null +++ b/contracts/v1/storage/TermMaxStorage.sol @@ -0,0 +1,124 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {IOracle} from "../oracle/IOracle.sol"; +import {ISwapCallback} from "../ISwapCallback.sol"; + +/** + * @title The data struct of token pair + * @author Term Structure Labs + */ +struct CurveCut { + uint256 xtReserve; + uint256 liqSquare; + int256 offset; +} + +struct FeeConfig { + /// @notice The lending fee ratio taker + /// i.e. 0.01e8 means 1% + uint32 lendTakerFeeRatio; + /// @notice The lending fee ratio for maker + /// i.e. 0.01e8 means 1% + uint32 lendMakerFeeRatio; + /// @notice The borrowing fee ratio for taker + /// i.e. 0.01e8 means 1% + uint32 borrowTakerFeeRatio; + /// @notice The borrowing fee ratio for maker + /// i.e. 0.01e8 means 1% + uint32 borrowMakerFeeRatio; + /// @notice The fee ratio when minting GT tokens by collateral + /// i.e. 0.01e8 means 1% + uint32 mintGtFeeRatio; + /// @notice The fee ref when minting GT tokens by collateral + /// i.e. 0.01e8 means 1% + uint32 mintGtFeeRef; +} + +struct CurveCuts { + /// @notice The curve cuts of the market to lend + CurveCut[] lendCurveCuts; + /// @notice The curve cuts of the market to borrow + CurveCut[] borrowCurveCuts; +} + +struct MarketConfig { + /// @notice The treasurer's address, which will receive protocol fee + address treasurer; + /// @notice The unix time of maturity date + uint64 maturity; + /// @notice The fee ratio when tradings with the market and orders + FeeConfig feeConfig; +} + +struct LoanConfig { + /// @notice The oracle aggregator + IOracle oracle; + /// @notice The debt liquidation threshold + /// If the loan to collateral is greater than or equal to this value, + /// it will be liquidated + /// i.e. 0.9e8 means debt value is the 90% of collateral value + uint32 liquidationLtv; + /// @notice Maximum loan to collateral when borrowing + /// i.e. 0.85e8 means debt value is the 85% of collateral value + uint32 maxLtv; + /// @notice The flag to indicate debt is liquidatable or not + /// @dev If liquidatable is false, the collateral can only be delivered after maturity + bool liquidatable; +} + +/// @notice Data of Gearing Token's configuturation +struct GtConfig { + /// @notice The address of collateral token + address collateral; + /// @notice The debtToken(debt) token + IERC20Metadata debtToken; + /// @notice The bond token + IERC20 ft; + /// @notice The treasurer's address, which will receive protocol reward while liquidation + address treasurer; + /// @notice The unix time of maturity date + uint64 maturity; + /// @notice The configuration of oracle, ltv and liquidation + LoanConfig loanConfig; +} + +struct OrderConfig { + CurveCuts curveCuts; + uint256 gtId; + uint256 maxXtReserve; + ISwapCallback swapTrigger; + FeeConfig feeConfig; +} + +struct MarketInitialParams { + /// @notice The address of collateral token + address collateral; + /// @notice The debtToken(debt) token + IERC20Metadata debtToken; + /// @notice The admin address + address admin; + /// @notice The implementation of TermMax Gearing Token contract + address gtImplementation; + /// @notice The configuration of market + MarketConfig marketConfig; + /// @notice The configuration of loan + LoanConfig loanConfig; + /// @notice The encoded parameters to initialize GT implementation contract + bytes gtInitalParams; + string tokenName; + string tokenSymbol; +} + +struct VaultInitialParams { + address admin; + address curator; + uint256 timelock; + IERC20 asset; + uint256 maxCapacity; + string name; + string symbol; + uint64 performanceFeeRate; +} diff --git a/contracts/v1/test/MockERC20.sol b/contracts/v1/test/MockERC20.sol new file mode 100644 index 0000000..cd7aad2 --- /dev/null +++ b/contracts/v1/test/MockERC20.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + +contract MockERC20 is ERC20 { + uint8 private immutable _decimals; + + constructor(string memory name, string memory symbol, uint8 _dec) ERC20(name, symbol) { + _decimals = _dec; + } + + function decimals() public view virtual override returns (uint8) { + return _decimals; + } + + function mint(address to, uint256 amount) external { + _mint(to, amount); + } +} diff --git a/contracts/v1/test/MockFlashLoanReceiver.sol b/contracts/v1/test/MockFlashLoanReceiver.sol new file mode 100644 index 0000000..4bca1c2 --- /dev/null +++ b/contracts/v1/test/MockFlashLoanReceiver.sol @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {ITermMaxMarket, IFlashLoanReceiver, IGearingToken, IERC20} from "../TermMaxMarket.sol"; + +contract MockFlashLoanReceiver is IFlashLoanReceiver { + ITermMaxMarket market; + IGearingToken gt; + address collateral; + IERC20 underlying; + IERC20 xt; + + constructor(ITermMaxMarket market_) { + market = market_; + + (, xt, gt, collateral, underlying) = market.tokens(); + } + + function executeOperation(address gtReceiver, IERC20 asset, uint256 amount, bytes calldata data) + external + override + returns (bytes memory collateralData) + { + (address caller, uint256 collateralAmt) = abi.decode(data, (address, uint256)); + IERC20(collateral).approve(address(gt), collateralAmt); + + assert(gtReceiver == caller); + assert(asset == underlying); + assert(asset.balanceOf(address(this)) == amount); + + collateralData = abi.encode(collateralAmt); + } + + function leverageByXt(uint128 xtAmt, bytes calldata callbackData) external returns (uint256 gtId) { + xt.transferFrom(msg.sender, address(this), xtAmt); + xt.approve(address(market), xtAmt); + gtId = market.leverageByXt(msg.sender, xtAmt, callbackData); + } +} diff --git a/contracts/v1/test/MockFlashRepayer.sol b/contracts/v1/test/MockFlashRepayer.sol new file mode 100644 index 0000000..4b242bb --- /dev/null +++ b/contracts/v1/test/MockFlashRepayer.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {IGearingToken, IERC20, IFlashRepayer} from "../tokens/AbstractGearingToken.sol"; +import {IERC721Receiver} from "@openzeppelin/contracts/interfaces/IERC721Receiver.sol"; + +contract MockFlashRepayer is IFlashRepayer, IERC721Receiver { + IGearingToken gt; + + constructor(IGearingToken gt_) { + gt = gt_; + } + + function flashRepay(uint256 id, bool byUnderlying) external { + gt.safeTransferFrom(msg.sender, address(this), id, ""); + gt.flashRepay(id, byUnderlying, abi.encode(msg.sender)); + } + + function executeOperation(IERC20 repayToken, uint128 debtAmt, address, bytes memory, bytes calldata) + external + override + { + repayToken.approve(address(gt), debtAmt); + } + + function onERC721Received(address, address, uint256, bytes calldata) external pure override returns (bytes4) { + return this.onERC721Received.selector; + } +} diff --git a/contracts/v1/test/MockOrder.sol b/contracts/v1/test/MockOrder.sol new file mode 100644 index 0000000..f12e954 --- /dev/null +++ b/contracts/v1/test/MockOrder.sol @@ -0,0 +1,321 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; +import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; +import {ITermMaxOrder, IERC20} from "../ITermMaxOrder.sol"; +import {ITermMaxMarket} from "../ITermMaxMarket.sol"; +import {IGearingToken} from "../tokens/IGearingToken.sol"; +import {IFlashLoanReceiver} from "../IFlashLoanReceiver.sol"; +import {Constants} from "../lib/Constants.sol"; +import {TermMaxCurve, MathLib} from "../lib/TermMaxCurve.sol"; +import {OrderErrors} from "../errors/OrderErrors.sol"; +import {OrderEvents} from "../events/OrderEvents.sol"; +import {OrderConfig, MarketConfig, CurveCuts, CurveCut, FeeConfig} from "../storage/TermMaxStorage.sol"; +import {ISwapCallback} from "../ISwapCallback.sol"; +import {TransferUtils} from "../lib/TransferUtils.sol"; + +/** + * @title TermMax Order + * @author Term Structure Labs + */ +contract MockOrder is + ITermMaxOrder, + ReentrancyGuardUpgradeable, + OwnableUpgradeable, + PausableUpgradeable, + OrderErrors, + OrderEvents +{ + using SafeCast for uint256; + using SafeCast for int256; + using TransferUtils for IERC20; + + ITermMaxMarket public market; + + IERC20 private ft; + IERC20 private xt; + IERC20 private debtToken; + IGearingToken private gt; + + OrderConfig private _orderConfig; + + address public maker; + + uint64 private maturity; + + /// @notice Check if the market is borrowing allowed + modifier isBorrowingAllowed(OrderConfig memory config) { + if (config.curveCuts.borrowCurveCuts.length == 0) { + revert BorrowIsNotAllowed(); + } + _; + } + + /// @notice Check if the market is lending allowed + modifier isLendingAllowed(OrderConfig memory config) { + if (config.curveCuts.lendCurveCuts.length == 0) { + revert LendIsNotAllowed(); + } + _; + } + + /// @notice Check if the order is tradable + modifier isOpen() { + _requireNotPaused(); + if (block.timestamp >= maturity) { + revert TermIsNotOpen(); + } + _; + } + + modifier onlyMarket() { + if (msg.sender != address(market)) revert OnlyMarket(); + _; + } + + constructor() { + _disableInitializers(); + } + + /** + * @inheritdoc ITermMaxOrder + */ + function initialize( + address maker_, + IERC20[3] memory tokens, + IGearingToken gt_, + uint256 maxXtReserve_, + ISwapCallback swapTrigger, + CurveCuts memory curveCuts_, + MarketConfig memory marketConfig + ) external override initializer { + __Ownable_init(maker_); + __ReentrancyGuard_init(); + __Pausable_init(); + market = ITermMaxMarket(_msgSender()); + maker = maker_; + _orderConfig.curveCuts = curveCuts_; + _orderConfig.feeConfig = marketConfig.feeConfig; + _orderConfig.maxXtReserve = maxXtReserve_; + _orderConfig.swapTrigger = swapTrigger; + maturity = marketConfig.maturity; + + ft = tokens[0]; + xt = tokens[1]; + debtToken = tokens[2]; + gt = gt_; + emit OrderInitialized(market, maker_, maxXtReserve_, swapTrigger, curveCuts_); + } + + /** + * @inheritdoc ITermMaxOrder + */ + function orderConfig() external view returns (OrderConfig memory) { + return _orderConfig; + } + + /** + * @inheritdoc ITermMaxOrder + */ + function tokenReserves() public view override returns (uint256, uint256) { + return (ft.balanceOf(address(this)), xt.balanceOf(address(this))); + } + + /** + * @inheritdoc ITermMaxOrder + */ + function apr() external view override returns (uint256 lendApr_, uint256 borrowApr_) { + uint256 daysToMaturity = _daysToMaturity(); + uint256 oriXtReserve = xt.balanceOf(address(this)); + + CurveCuts memory curveCuts = _orderConfig.curveCuts; + + uint256 lendCutId = TermMaxCurve.calcCutId(curveCuts.lendCurveCuts, oriXtReserve); + (, uint256 lendVXtReserve, uint256 lendVFtReserve) = TermMaxCurve.calcIntervalProps( + Constants.DECIMAL_BASE, daysToMaturity, curveCuts.lendCurveCuts[lendCutId], oriXtReserve + ); + lendApr_ = + ((lendVFtReserve * Constants.DECIMAL_BASE * Constants.DAYS_IN_YEAR) / lendVXtReserve) * daysToMaturity; + + uint256 borrowCutId = TermMaxCurve.calcCutId(curveCuts.borrowCurveCuts, oriXtReserve); + (, uint256 borrowVXtReserve, uint256 borrowVFtReserve) = TermMaxCurve.calcIntervalProps( + Constants.DECIMAL_BASE, daysToMaturity, curveCuts.borrowCurveCuts[borrowCutId], oriXtReserve + ); + borrowApr_ = + ((borrowVFtReserve * Constants.DECIMAL_BASE * Constants.DAYS_IN_YEAR) / borrowVXtReserve) * daysToMaturity; + } + + /** + * @inheritdoc ITermMaxOrder + */ + function updateOrder(OrderConfig memory newOrderConfig, int256 ftChangeAmt, int256 xtChangeAmt) + external + override + onlyOwner + { + _updateCurve(newOrderConfig.curveCuts); + if (ftChangeAmt > 0) { + ft.safeTransferFrom(msg.sender, address(this), ftChangeAmt.toUint256()); + } else if (ftChangeAmt < 0) { + ft.safeTransfer(msg.sender, (-ftChangeAmt).toUint256()); + } + if (xtChangeAmt > 0) { + xt.safeTransferFrom(msg.sender, address(this), xtChangeAmt.toUint256()); + } else if (xtChangeAmt < 0) { + xt.safeTransfer(msg.sender, (-xtChangeAmt).toUint256()); + } + _orderConfig.maxXtReserve = newOrderConfig.maxXtReserve; + // check gtId + if (newOrderConfig.gtId != 0 && address(this) != gt.getApproved(newOrderConfig.gtId)) { + revert GtNotApproved(newOrderConfig.gtId); + } + _orderConfig.gtId = newOrderConfig.gtId; + _orderConfig.swapTrigger = newOrderConfig.swapTrigger; + emit UpdateOrder( + newOrderConfig.curveCuts, + ftChangeAmt, + xtChangeAmt, + newOrderConfig.gtId, + newOrderConfig.maxXtReserve, + newOrderConfig.swapTrigger + ); + } + + function _updateCurve(CurveCuts memory newCurveCuts) internal { + bytes32 newCurveCutsHash = keccak256(abi.encode(newCurveCuts)); + CurveCuts memory oldCurveCuts = _orderConfig.curveCuts; + if (keccak256(abi.encode(oldCurveCuts)) != newCurveCutsHash) { + if (newCurveCuts.lendCurveCuts.length > 0) { + if (newCurveCuts.lendCurveCuts[0].xtReserve != 0) revert InvalidCurveCuts(); + } + for (uint256 i = 1; i < newCurveCuts.lendCurveCuts.length; i++) { + if (newCurveCuts.lendCurveCuts[i].xtReserve <= newCurveCuts.lendCurveCuts[i - 1].xtReserve) { + revert InvalidCurveCuts(); + } + } + if (newCurveCuts.borrowCurveCuts.length > 0) { + if (newCurveCuts.borrowCurveCuts[0].xtReserve != 0) revert InvalidCurveCuts(); + } + for (uint256 i = 1; i < newCurveCuts.borrowCurveCuts.length; i++) { + if (newCurveCuts.borrowCurveCuts[i].xtReserve <= newCurveCuts.borrowCurveCuts[i - 1].xtReserve) { + revert InvalidCurveCuts(); + } + } + _orderConfig.curveCuts = newCurveCuts; + } + } + + function updateFeeConfig(FeeConfig memory newFeeConfig) external override onlyMarket { + _orderConfig.feeConfig = newFeeConfig; + emit UpdateFeeConfig(newFeeConfig); + } + + /// @notice Calculate how many days until expiration + function _daysToMaturity() internal view returns (uint256 daysToMaturity) { + daysToMaturity = (maturity - block.timestamp + Constants.SECONDS_IN_DAY - 1) / Constants.SECONDS_IN_DAY; + } + + /** + * @inheritdoc ITermMaxOrder + */ + function swapExactTokenToToken( + IERC20 tokenIn, + IERC20 tokenOut, + address recipient, + uint128 tokenAmtIn, + uint128 minTokenOut, + uint256 + ) external override nonReentrant isOpen returns (uint256 netTokenOut) { + if (tokenIn == tokenOut) revert CantSwapSameToken(); + uint256 feeAmt = 0; + uint256 ftBlanceBefore = ft.balanceOf(address(this)); + uint256 xtBlanceBefore = xt.balanceOf(address(this)); + + tokenIn.safeTransferFrom(msg.sender, address(this), tokenAmtIn); + if (tokenIn == debtToken) { + tokenIn.safeIncreaseAllowance(address(market), tokenAmtIn); + market.mint(address(this), tokenAmtIn); + } + if (tokenOut == debtToken) { + ft.safeIncreaseAllowance(address(market), minTokenOut); + xt.safeIncreaseAllowance(address(market), minTokenOut); + market.burn(recipient, minTokenOut); + } else { + tokenOut.safeTransfer(recipient, minTokenOut); + } + + netTokenOut = minTokenOut; + + if (address(_orderConfig.swapTrigger) != address(0)) { + uint256 ftReserve = ft.balanceOf(address(this)); + uint256 xtReserve = xt.balanceOf(address(this)); + int256 deltaFt = ftReserve.toInt256() - ftBlanceBefore.toInt256(); + int256 deltaXt = xtReserve.toInt256() - xtBlanceBefore.toInt256(); + _orderConfig.swapTrigger.afterSwap(ftReserve, xtReserve, deltaFt, deltaXt); + } + emit SwapExactTokenToToken( + tokenIn, tokenOut, msg.sender, recipient, tokenAmtIn, netTokenOut.toUint128(), feeAmt.toUint128() + ); + } + + function swapTokenToExactToken( + IERC20 tokenIn, + IERC20 tokenOut, + address recipient, + uint128 tokenAmtOut, + uint128 maxTokenIn, + uint256 + ) external nonReentrant isOpen returns (uint256 netTokenIn) { + if (tokenIn == tokenOut) revert CantSwapSameToken(); + uint256 feeAmt = 0; + uint256 ftBlanceBefore = ft.balanceOf(address(this)); + uint256 xtBlanceBefore = xt.balanceOf(address(this)); + + tokenIn.safeTransferFrom(msg.sender, address(this), maxTokenIn); + if (tokenIn == debtToken) { + tokenIn.safeIncreaseAllowance(address(market), maxTokenIn); + market.mint(address(this), maxTokenIn); + } + if (tokenOut == debtToken) { + ft.safeIncreaseAllowance(address(market), tokenAmtOut); + xt.safeIncreaseAllowance(address(market), tokenAmtOut); + market.burn(recipient, tokenAmtOut); + } else { + tokenOut.safeTransfer(recipient, tokenAmtOut); + } + netTokenIn = maxTokenIn; + + if (address(_orderConfig.swapTrigger) != address(0)) { + uint256 ftReserve = ft.balanceOf(address(this)); + uint256 xtReserve = xt.balanceOf(address(this)); + int256 deltaFt = ftReserve.toInt256() - ftBlanceBefore.toInt256(); + int256 deltaXt = xtReserve.toInt256() - xtBlanceBefore.toInt256(); + _orderConfig.swapTrigger.afterSwap(ftReserve, xtReserve, deltaFt, deltaXt); + } + emit SwapTokenToExactToken( + tokenIn, tokenOut, msg.sender, recipient, tokenAmtOut, netTokenIn.toUint128(), feeAmt.toUint128() + ); + } + + function withdrawAssets(IERC20 token, address recipient, uint256 amount) external onlyOwner { + token.safeTransfer(recipient, amount); + emit WithdrawAssets(token, _msgSender(), recipient, amount); + } + + /** + * @inheritdoc ITermMaxOrder + */ + function pause() external override onlyOwner { + _pause(); + } + + /** + * @inheritdoc ITermMaxOrder + */ + function unpause() external override onlyOwner { + _unpause(); + } +} diff --git a/contracts/v1/test/MockPriceFeed.sol b/contracts/v1/test/MockPriceFeed.sol new file mode 100644 index 0000000..3cca82c --- /dev/null +++ b/contracts/v1/test/MockPriceFeed.sol @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; + +contract MockPriceFeed is AggregatorV3Interface, Ownable { + struct RoundData { + uint80 roundId; + int256 answer; + uint256 startedAt; + uint256 updatedAt; + uint80 answeredInRound; + } + + event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 updatedAt); + + RoundData private _latestRoundData; + + constructor(address admin) Ownable(admin) {} + + function decimals() external pure override returns (uint8) { + return 8; + } + + function description() external pure override returns (string memory) { + return "Test Oracle"; + } + + function version() external pure override returns (uint256) { + return 1; + } + + function getRoundData(uint80) + external + view + override + returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) + { + return ( + _latestRoundData.roundId, + _latestRoundData.answer, + _latestRoundData.startedAt, + _latestRoundData.updatedAt, + _latestRoundData.answeredInRound + ); + } + + function latestRoundData() + external + view + override + returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) + { + return ( + _latestRoundData.roundId, + _latestRoundData.answer, + _latestRoundData.startedAt, + _latestRoundData.updatedAt, + _latestRoundData.answeredInRound + ); + } + + function updateRoundData(RoundData memory roundData) external onlyOwner { + _latestRoundData = roundData; + emit AnswerUpdated(roundData.answer, roundData.roundId, roundData.updatedAt); + } +} diff --git a/contracts/v1/test/MockSwapAdapter.sol b/contracts/v1/test/MockSwapAdapter.sol new file mode 100644 index 0000000..c2b444c --- /dev/null +++ b/contracts/v1/test/MockSwapAdapter.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {IMintableERC20, IERC20} from "../tokens/IMintableERC20.sol"; +import "../router/swapAdapters/ERC20SwapAdapter.sol"; + +contract MockSwapAdapter is ERC20SwapAdapter { + address public immutable pool; + + constructor(address pool_) { + pool = pool_; + } + + function _swap(IERC20 tokenIn, IERC20 tokenOut, uint256 amount, bytes memory swapData) + internal + virtual + override + returns (uint256 tokenOutAmt) + { + uint256 minTokenOut = abi.decode(swapData, (uint256)); + + IERC20(tokenIn).transfer(pool, amount); + + tokenOutAmt = minTokenOut; + IMintableERC20(address(tokenOut)).mint(address(this), tokenOutAmt); + } +} diff --git a/contracts/v1/test/testnet/Faucet.sol b/contracts/v1/test/testnet/Faucet.sol new file mode 100644 index 0000000..dd513e0 --- /dev/null +++ b/contracts/v1/test/testnet/Faucet.sol @@ -0,0 +1,109 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; +import {FaucetERC20} from "./FaucetERC20.sol"; +import {MockPriceFeed} from "../MockPriceFeed.sol"; + +contract Faucet is Ownable { + error OnlyMintOnce(); + error TokenExisted(string name, string symbol, uint8 decimals); + + struct TokenConfig { + address tokenAddr; + address priceFeedAddr; + } + + uint256 public tokenNum; + mapping(address => uint256) public getTokenId; + mapping(uint256 => TokenConfig) public tokenConfigs; + mapping(address => bool) public isMinted; + mapping(bytes32 => uint256) public getTokenIdByKey; + bool public canOnlyMintOnce; + uint256 public mintUsdValue; + + constructor(address adminAddr) Ownable(adminAddr) { + mintUsdValue = 10000; + } + + function getTokenConfig(uint256 index) public view returns (TokenConfig memory) { + return tokenConfigs[index]; + } + + function addToken(string memory name, string memory symbol, uint8 decimals) + public + onlyOwner + returns (FaucetERC20 token, MockPriceFeed priceFeed) + { + if (getTokenIdByKey[calcTokenKey(name, symbol, decimals)] != 0) { + revert TokenExisted(name, symbol, decimals); + } else { + token = new FaucetERC20(address(this), name, symbol, decimals); + priceFeed = new MockPriceFeed(owner()); + tokenNum++; + tokenConfigs[tokenNum] = TokenConfig(address(token), address(priceFeed)); + getTokenId[address(token)] = tokenNum; + getTokenIdByKey[calcTokenKey(name, symbol, decimals)] = tokenNum; + } + } + + function setMintUsdValue(uint256 _mintUsdValue) public onlyOwner { + mintUsdValue = _mintUsdValue; + } + + function setPriceFeed(uint256 index, address priceFeedAddr) public onlyOwner { + tokenConfigs[index].priceFeedAddr = priceFeedAddr; + } + + function setCanOnlyMintOnce(bool _canOnlyMintOnce) public onlyOwner { + canOnlyMintOnce = _canOnlyMintOnce; + } + + function batchMint() public { + if (canOnlyMintOnce && isMinted[msg.sender]) revert OnlyMintOnce(); + isMinted[msg.sender] = true; + for (uint256 i = 1; i < tokenNum + 1; i++) { + TokenConfig memory tokenConfig = tokenConfigs[i]; + MockPriceFeed priceFeed = MockPriceFeed(tokenConfig.priceFeedAddr); + (, int256 answer,,,) = priceFeed.latestRoundData(); + uint8 tokenDecimals = FaucetERC20(tokenConfig.tokenAddr).decimals(); + uint8 priceFeedDecimals = priceFeed.decimals(); + uint256 mintAmt = (mintUsdValue * 10 ** (priceFeedDecimals + tokenDecimals)) / uint256(answer); + FaucetERC20(tokenConfig.tokenAddr).mint(msg.sender, mintAmt); + } + } + + function batchMintWithValue(uint256 mintValue) public { + if (canOnlyMintOnce && isMinted[msg.sender]) revert OnlyMintOnce(); + isMinted[msg.sender] = true; + for (uint256 i = 1; i < tokenNum + 1; i++) { + TokenConfig memory tokenConfig = tokenConfigs[i]; + MockPriceFeed priceFeed = MockPriceFeed(tokenConfig.priceFeedAddr); + (, int256 answer,,,) = priceFeed.latestRoundData(); + uint8 tokenDecimals = FaucetERC20(tokenConfig.tokenAddr).decimals(); + uint8 priceFeedDecimals = priceFeed.decimals(); + uint256 mintAmt = (mintValue * 10 ** (priceFeedDecimals + tokenDecimals)) / uint256(answer); + FaucetERC20(tokenConfig.tokenAddr).mint(msg.sender, mintAmt); + } + } + + function devBatchMint(address to) public onlyOwner { + for (uint256 i = 1; i < tokenNum + 1; i++) { + TokenConfig memory tokenConfig = tokenConfigs[i]; + MockPriceFeed priceFeed = MockPriceFeed(tokenConfig.priceFeedAddr); + (, int256 answer,,,) = priceFeed.latestRoundData(); + uint8 tokenDecimals = FaucetERC20(tokenConfig.tokenAddr).decimals(); + uint8 priceFeedDecimals = priceFeed.decimals(); + uint256 mintAmt = (mintUsdValue * 10 ** (priceFeedDecimals + tokenDecimals)) / uint256(answer); + FaucetERC20(tokenConfig.tokenAddr).mint(to, mintAmt); + } + } + + function devMint(address to, address tokenAddr, uint256 mintAmt) public onlyOwner { + FaucetERC20(tokenAddr).mint(to, mintAmt); + } + + function calcTokenKey(string memory name, string memory symbol, uint8 decimals) public pure returns (bytes32) { + return keccak256(abi.encodePacked(name, symbol, decimals)); + } +} diff --git a/contracts/v1/test/testnet/FaucetERC20.sol b/contracts/v1/test/testnet/FaucetERC20.sol new file mode 100644 index 0000000..cb0749a --- /dev/null +++ b/contracts/v1/test/testnet/FaucetERC20.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; + +contract FaucetERC20 is ERC20, Ownable { + uint8 private immutable _decimals; + + constructor(address adminAddr, string memory name, string memory symbol, uint8 _dec) + ERC20(name, symbol) + Ownable(adminAddr) + { + _decimals = _dec; + } + + function decimals() public view virtual override returns (uint8) { + return _decimals; + } + + function mint(address to, uint256 amount) external { + _mint(to, amount); + } +} diff --git a/contracts/v1/test/testnet/SwapAdapter.sol b/contracts/v1/test/testnet/SwapAdapter.sol new file mode 100644 index 0000000..927833f --- /dev/null +++ b/contracts/v1/test/testnet/SwapAdapter.sol @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {console} from "forge-std/console.sol"; +import {IMintableERC20, IERC20} from "../../tokens/IMintableERC20.sol"; +import "../../router/swapAdapters/ERC20SwapAdapter.sol"; +import {MockPriceFeed} from "../../test/MockPriceFeed.sol"; + +contract SwapAdapter is ERC20SwapAdapter { + address public immutable pool; + + constructor(address pool_) { + pool = pool_; + } + + function _swap(IERC20 tokenIn, IERC20 tokenOut, uint256 amount, bytes memory swapData) + internal + virtual + override + returns (uint256 tokenOutAmt) + { + (address tokenInPriceFeedAddr, address tokenOutPriceFeedAddr) = abi.decode(swapData, (address, address)); + + uint8 tokenInDecimals = IMintableERC20(address(tokenIn)).decimals(); + uint8 tokenOutDecimals = IMintableERC20(address(tokenOut)).decimals(); + + MockPriceFeed tokenInPriceFeed = MockPriceFeed(tokenInPriceFeedAddr); + MockPriceFeed tokenOutPriceFeed = MockPriceFeed(address(tokenOutPriceFeedAddr)); + (, int256 tokenInPrice,,,) = tokenInPriceFeed.latestRoundData(); + uint8 tokenInPriceDecimals = tokenInPriceFeed.decimals(); + (, int256 tokenOutPrice,,,) = tokenOutPriceFeed.latestRoundData(); + uint8 tokenOutPriceDecimals = tokenOutPriceFeed.decimals(); + + tokenOutAmt = (amount * uint256(tokenInPrice) * 10 ** tokenOutPriceDecimals * 10 ** tokenOutDecimals) + / (uint256(tokenOutPrice) * 10 ** tokenInPriceDecimals * 10 ** tokenInDecimals); + console.log("tokenInAmt: %d", amount); + console.log("tokenOutAmt: %d", tokenOutAmt); + IERC20(tokenIn).transfer(pool, amount); + IMintableERC20(address(tokenOut)).mint(address(this), tokenOutAmt); + } +} diff --git a/contracts/v1/tokens/AbstractGearingToken.sol b/contracts/v1/tokens/AbstractGearingToken.sol new file mode 100644 index 0000000..3321cd8 --- /dev/null +++ b/contracts/v1/tokens/AbstractGearingToken.sol @@ -0,0 +1,545 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.27; + +import {ERC721EnumerableUpgradeable} from + "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol"; +import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; +import {Constants} from "../lib/Constants.sol"; +import {GearingTokenConstants} from "../lib/GearingTokenConstants.sol"; +import {TransferUtils} from "../lib/TransferUtils.sol"; +import {IFlashRepayer} from "./IFlashRepayer.sol"; +import {IGearingToken, IERC20Metadata, IERC20} from "./IGearingToken.sol"; +import {GearingTokenErrors} from "../errors/GearingTokenErrors.sol"; +import {GearingTokenEvents} from "../events/GearingTokenEvents.sol"; +import {GtConfig, IOracle} from "../storage/TermMaxStorage.sol"; + +/** + * @title TermMax Gearing Token + * @author Term Structure Labs + */ +abstract contract AbstractGearingToken is + OwnableUpgradeable, + ERC721EnumerableUpgradeable, + ReentrancyGuardUpgradeable, + IGearingToken, + GearingTokenErrors, + GearingTokenEvents +{ + using SafeCast for uint256; + using SafeCast for int256; + using TransferUtils for IERC20; + using TransferUtils for IERC20Metadata; + + struct LoanInfo { + /// @notice Debt amount in debtToken token + uint128 debtAmt; + /// @notice Encoded collateral data + bytes collateralData; + } + + struct ValueAndPrice { + /// @notice USD value of collateral + uint256 collateralValue; + /// @notice USD value of debt with price and token decimals + uint256 debtValueWithDecimals; + /// @notice USD price of debt token + uint256 debtPrice; + /// @notice Denominator of USD price + uint256 priceDenominator; + /// @notice Denominator of debt token + uint256 debtDenominator; + /// @notice Encoded USD price of collateral token + bytes collateralPriceData; + } + + /// @notice Configuturation of Gearing Token + GtConfig _config; + /// @notice Total supply of Gearing Token + uint256 total; + /// @notice Mapping relationship between Gearing Token id and loan + mapping(uint256 => LoanInfo) loanMapping; + + uint8 debtDecimals; + + /** + * @inheritdoc IGearingToken + */ + function initialize(string memory name, string memory symbol, GtConfig memory config_, bytes memory initalParams) + external + override + initializer + { + __AbstractGearingToken_init(name, symbol, config_); + __GearingToken_Implement_init(initalParams); + } + + function __AbstractGearingToken_init(string memory name, string memory symbol, GtConfig memory config_) + internal + onlyInitializing + { + if (config_.loanConfig.liquidationLtv <= config_.loanConfig.maxLtv) { + revert LiquidationLtvMustBeGreaterThanMaxLtv(); + } + __ERC721_init(name, symbol); + __Ownable_init(msg.sender); + _config = config_; + debtDecimals = _config.debtToken.decimals(); + } + + function __GearingToken_Implement_init(bytes memory initalParams) internal virtual; + + /** + * @inheritdoc IGearingToken + */ + function setTreasurer(address treasurer) external onlyOwner { + _config.treasurer = treasurer; + } + + /** + * @inheritdoc IGearingToken + */ + function updateConfig(bytes memory configData) external onlyOwner { + _updateConfig(configData); + emit UpdateConfig(configData); + } + + function _updateConfig(bytes memory configData) internal virtual; + + /** + * @inheritdoc IGearingToken + */ + function getGtConfig() external view override returns (GtConfig memory) { + return _config; + } + + /** + * @inheritdoc IGearingToken + */ + function marketAddr() public view override returns (address) { + return owner(); + } + + /** + * @inheritdoc IGearingToken + */ + function liquidatable() external view returns (bool) { + return _config.loanConfig.liquidatable; + } + + /** + * @inheritdoc IGearingToken + */ + function mint(address collateralProvider, address to, uint128 debtAmt, bytes memory collateralData) + external + override + nonReentrant + onlyOwner + returns (uint256 id) + { + _checkBeforeMint(debtAmt, collateralData); + _transferCollateralFrom(collateralProvider, address(this), collateralData); + id = _mintInternal(to, debtAmt, collateralData, _config); + } + + /// @notice Check if the loan can be minted + function _checkBeforeMint(uint128 debtAmt, bytes memory collateralData) internal virtual; + + function _mintInternal(address to, uint128 debtAmt, bytes memory collateralData, GtConfig memory config) + internal + returns (uint256 id) + { + LoanInfo memory loan = LoanInfo(debtAmt, collateralData); + ValueAndPrice memory valueAndPrice = _getValueAndPrice(config, loan); + uint128 ltv = _calculateLtv(valueAndPrice); + if (ltv > config.loanConfig.maxLtv) { + revert GtIsNotHealthy(0, to, ltv); + } + id = ++total; + loanMapping[id] = loan; + _mint(to, id); + } + + /** + * @inheritdoc IGearingToken + */ + function augmentDebt(address caller, uint256 id, uint256 ftAmt) external override nonReentrant onlyOwner { + if (caller != ownerOf(id) && caller != getApproved(id)) { + revert AuthorizationFailed(id, caller); + } + GtConfig memory config = _config; + if (config.maturity <= block.timestamp) { + revert GtIsExpired(id); + } + + LoanInfo memory loan = loanMapping[id]; + loan.debtAmt += ftAmt.toUint128(); + + ValueAndPrice memory valueAndPrice = _getValueAndPrice(config, loan); + uint128 ltv = _calculateLtv(valueAndPrice); + if (ltv > config.loanConfig.maxLtv) { + revert GtIsNotHealthy(id, msg.sender, ltv); + } + loanMapping[id] = loan; + + emit AugmentDebt(id, ftAmt); + } + + /** + * @inheritdoc IGearingToken + */ + function loanInfo(uint256 id) + external + view + override + returns (address owner, uint128 debtAmt, bytes memory collateralData) + { + owner = ownerOf(id); + LoanInfo memory loan = loanMapping[id]; + debtAmt = loan.debtAmt; + collateralData = loan.collateralData; + } + + function _burnInternal(uint256 id) internal { + _burn(id); + delete loanMapping[id]; + } + + /** + * @inheritdoc IGearingToken + */ + function merge(uint256[] memory ids) external nonReentrant returns (uint256 newId) { + uint128 totalDebtAmt; + bytes memory mergedCollateralData; + for (uint256 i = 0; i < ids.length; ++i) { + uint256 id = ids[i]; + LoanInfo memory loan = loanMapping[id]; + address owner = ownerOf(id); + if (msg.sender != owner) { + revert CanNotMergeLoanWithDiffOwner(id, owner); + } + totalDebtAmt += loan.debtAmt; + mergedCollateralData = + i == 0 ? loan.collateralData : _mergeCollateral(mergedCollateralData, loan.collateralData); + _burnInternal(id); + } + newId = _mintInternal(msg.sender, totalDebtAmt, mergedCollateralData, _config); + emit MergeGts(msg.sender, newId, ids); + } + + /** + * @inheritdoc IGearingToken + */ + function repay(uint256 id, uint128 repayAmt, bool byDebtToken) external override nonReentrant { + GtConfig memory config = _config; + if (config.maturity <= block.timestamp) { + revert GtIsExpired(id); + } + + if (byDebtToken) { + config.debtToken.safeTransferFrom(msg.sender, marketAddr(), repayAmt); + } else { + // Those ft tokens have been approved to market and will be burn after maturity + config.ft.safeTransferFrom(msg.sender, marketAddr(), repayAmt); + } + _repay(id, repayAmt); + emit Repay(id, repayAmt, byDebtToken); + } + + function flashRepay(uint256 id, bool byDebtToken, bytes calldata callbackData) external override nonReentrant { + GtConfig memory config = _config; + if (config.maturity <= block.timestamp) { + revert GtIsExpired(id); + } + LoanInfo memory loan = loanMapping[id]; + if (ownerOf(id) != msg.sender) { + revert CallerIsNotTheOwner(id); + } + // Transfer collateral to the owner + _transferCollateral(msg.sender, loan.collateralData); + IERC20 repayToken = byDebtToken ? config.debtToken : config.ft; + + IFlashRepayer(msg.sender).executeOperation( + repayToken, loan.debtAmt, config.collateral, loan.collateralData, callbackData + ); + repayToken.safeTransferFrom(msg.sender, owner(), loan.debtAmt); + _burnInternal(id); + emit Repay(id, loan.debtAmt, byDebtToken); + } + + function _repay(uint256 id, uint128 repayAmt) internal { + LoanInfo memory loan = loanMapping[id]; + if (repayAmt > loan.debtAmt) { + revert RepayAmtExceedsMaxRepayAmt(id, repayAmt, loan.debtAmt); + } + if (repayAmt == loan.debtAmt) { + address gtOwner = ownerOf(id); + // Burn this nft + _burnInternal(id); + _transferCollateral(gtOwner, loan.collateralData); + } else { + uint128 debtAmt = loan.debtAmt - repayAmt; + loanMapping[id].debtAmt = debtAmt; + } + } + + /** + * @inheritdoc IGearingToken + */ + function removeCollateral(uint256 id, bytes memory collateralData) external override nonReentrant { + if (msg.sender != ownerOf(id)) { + revert CallerIsNotTheOwner(id); + } + + GtConfig memory config = _config; + if (config.maturity <= block.timestamp) { + revert GtIsExpired(id); + } + + LoanInfo memory loan = loanMapping[id]; + loan.collateralData = _removeCollateral(loan, collateralData); + + _transferCollateral(msg.sender, collateralData); + + ValueAndPrice memory valueAndPrice = _getValueAndPrice(config, loan); + uint128 ltv = _calculateLtv(valueAndPrice); + if (ltv > config.loanConfig.maxLtv) { + revert GtIsNotHealthy(id, msg.sender, ltv); + } + loanMapping[id] = loan; + + emit RemoveCollateral(id, loan.collateralData); + } + + function _removeCollateral(LoanInfo memory loan, bytes memory collateralData) + internal + virtual + returns (bytes memory); + + /** + * @inheritdoc IGearingToken + */ + function addCollateral(uint256 id, bytes memory collateralData) external override nonReentrant { + if (_config.maturity <= block.timestamp) { + revert GtIsExpired(id); + } + LoanInfo memory loan = loanMapping[id]; + + _transferCollateralFrom(msg.sender, address(this), collateralData); + loan.collateralData = _addCollateral(loan, collateralData); + loanMapping[id] = loan; + emit AddCollateral(id, loan.collateralData); + } + + function _addCollateral(LoanInfo memory loan, bytes memory collateralData) + internal + virtual + returns (bytes memory); + + /** + * @inheritdoc IGearingToken + */ + function getLiquidationInfo(uint256 id) + external + view + returns (bool isLiquidable, uint128 ltv, uint128 maxRepayAmt) + { + LoanInfo memory loan = loanMapping[id]; + GtConfig memory config = _config; + (isLiquidable, maxRepayAmt, ltv,) = _getLiquidationInfo(loan, config); + } + + function _getLiquidationInfo(LoanInfo memory loan, GtConfig memory config) + internal + view + returns (bool isLiquidable, uint128 maxRepayAmt, uint128 ltv, ValueAndPrice memory valueAndPrice) + { + valueAndPrice = _getValueAndPrice(config, loan); + ltv = _calculateLtv(valueAndPrice); + + if (config.loanConfig.liquidatable) { + // Liquidation cases: + // t >= m + w => F, "No liquidation after maturity plus liquidation window + // t >= m && t < m + w => T, "Liquidation allowed during liquidation window" + // t < m => ltv >= lltv => T, "Liquidation only allowed before maturity if ltv >= lltv" + + if (block.timestamp >= config.maturity + Constants.LIQUIDATION_WINDOW) { + isLiquidable = false; + } else if (block.timestamp >= config.maturity) { + isLiquidable = true; + maxRepayAmt = loan.debtAmt; + } else if (ltv >= config.loanConfig.liquidationLtv) { + isLiquidable = true; + // collateralValue(price decimals) and HALF_LIQUIDATION_THRESHOLD(base decimals 1e8) + maxRepayAmt = (valueAndPrice.collateralValue * Constants.DECIMAL_BASE) / valueAndPrice.priceDenominator + < GearingTokenConstants.HALF_LIQUIDATION_THRESHOLD ? loan.debtAmt : loan.debtAmt / 2; + } + } + } + + /** + * @inheritdoc IGearingToken + */ + function liquidate(uint256 id, uint128 repayAmt, bool byDebtToken) external override nonReentrant { + LoanInfo memory loan = loanMapping[id]; + GtConfig memory config = _config; + if (!config.loanConfig.liquidatable) { + revert GtDoNotSupportLiquidation(); + } + (bool isLiquidable, uint128 maxRepayAmt, uint128 ltvBefore, ValueAndPrice memory valueAndPrice) = + _getLiquidationInfo(loan, config); + + if (!isLiquidable) { + uint256 liquidationDeadline = config.maturity + Constants.LIQUIDATION_WINDOW; + if (block.timestamp >= liquidationDeadline) { + revert CanNotLiquidationAfterFinalDeadline(id, liquidationDeadline); + } + revert GtIsSafe(id); + } + if (repayAmt > maxRepayAmt) { + revert RepayAmtExceedsMaxRepayAmt(id, repayAmt, maxRepayAmt); + } + // Transfer token + if (byDebtToken) { + config.debtToken.safeTransferFrom(msg.sender, marketAddr(), repayAmt); + } else { + config.ft.safeTransferFrom(msg.sender, marketAddr(), repayAmt); + } + + // Do liquidate + (bytes memory cToLiquidator, bytes memory cToTreasurer, bytes memory remainningC) = + _calcLiquidationResult(loan, repayAmt, valueAndPrice); + + if (repayAmt == loan.debtAmt) { + if (remainningC.length > 0) { + _transferCollateral(ownerOf(id), remainningC); + } + // update storage + _burnInternal(id); + } else { + loan.debtAmt -= repayAmt; + loan.collateralData = remainningC; + + // Check ltv after partial liquidation + { + valueAndPrice.collateralValue = _getCollateralValue(remainningC, valueAndPrice.collateralPriceData); + valueAndPrice.debtValueWithDecimals = + (loan.debtAmt * valueAndPrice.debtPrice) / valueAndPrice.debtDenominator; + uint128 ltvAfter = _calculateLtv(valueAndPrice); + if (ltvBefore < ltvAfter) { + revert LtvIncreasedAfterLiquidation(id, ltvBefore, ltvAfter); + } + } + // update storage + loanMapping[id] = loan; + } + // Transfer collateral + if (cToTreasurer.length > 0) { + _transferCollateral(config.treasurer, cToTreasurer); + } + _transferCollateral(msg.sender, cToLiquidator); + + emit Liquidate(id, msg.sender, repayAmt, byDebtToken, cToLiquidator, cToTreasurer, remainningC); + } + + /// @notice Return the collateral distribution plan after liquidation + /// @param loan The loan data, contains debt amount and collateral data + /// @param repayAmt The amount of the debt to be liquidate + /// @param valueAndPrice Debt and collateral prices, values + /// @return cToLiquidator Collateral data assigned to liquidator + /// @return cToTreasurer Collateral data assigned to protocol + /// @return remainningC Remainning collateral data, will assigned to debt's owner + /// if the debt is fully liquidated. + function _calcLiquidationResult(LoanInfo memory loan, uint128 repayAmt, ValueAndPrice memory valueAndPrice) + internal + virtual + returns (bytes memory cToLiquidator, bytes memory cToTreasurer, bytes memory remainningC); + + /** + * @inheritdoc IGearingToken + */ + function getCollateralValue(bytes memory collateralData) external view override returns (uint256 collateralValue) { + bytes memory priceData = _getCollateralPriceData(_config); + return _getCollateralValue(collateralData, priceData); + } + + /** + * @inheritdoc IGearingToken + */ + function previewDelivery(uint256 proportion) external view override returns (bytes memory deliveryData) { + deliveryData = _delivery(proportion); + } + + /** + * @inheritdoc IGearingToken + */ + function delivery(uint256 proportion, address to) + external + override + nonReentrant + onlyOwner + returns (bytes memory deliveryData) + { + deliveryData = _delivery(proportion); + _transferCollateral(to, deliveryData); + } + + function _delivery(uint256 proportion) internal view virtual returns (bytes memory deliveryData); + + function _getValueAndPrice(GtConfig memory config, LoanInfo memory loan) + internal + view + returns (ValueAndPrice memory valueAndPrice) + { + valueAndPrice.collateralPriceData = _getCollateralPriceData(config); + valueAndPrice.collateralValue = _getCollateralValue(loan.collateralData, valueAndPrice.collateralPriceData); + + uint8 priceDecimals; + (valueAndPrice.debtPrice, priceDecimals) = config.loanConfig.oracle.getPrice(address(config.debtToken)); + valueAndPrice.priceDenominator = 10 ** priceDecimals; + + valueAndPrice.debtDenominator = 10 ** debtDecimals; + + valueAndPrice.debtValueWithDecimals = (loan.debtAmt * valueAndPrice.debtPrice) / valueAndPrice.debtDenominator; + } + + /// @notice Return the loan to value of this loan + /// @param valueAndPrice Debt and collateral prices, values + /// @return ltv The loan to value of this loan + function _calculateLtv(ValueAndPrice memory valueAndPrice) internal pure returns (uint128 ltv) { + if (valueAndPrice.collateralValue == 0) { + return type(uint128).max; + } + // debtValueWithDecimals(price decimals) collateralValue(base decimals) + ltv = ( + (valueAndPrice.debtValueWithDecimals * Constants.DECIMAL_BASE_SQ) + / (valueAndPrice.collateralValue * valueAndPrice.priceDenominator) + ).toUint128(); + } + + /// @notice Merge collateral data + function _mergeCollateral(bytes memory collateralDataA, bytes memory collateralDataB) + internal + virtual + returns (bytes memory collateralData); + + /// @notice Transfer collateral from 'from' to 'to' + function _transferCollateralFrom(address from, address to, bytes memory collateralData) internal virtual; + + /// @notice Transfer collateral from this contracct to 'to' + function _transferCollateral(address to, bytes memory collateralData) internal virtual; + + /// @notice Return the value of collateral in USD with base decimals + /// @param collateralData encoded collateral data + /// @param priceData encoded price data of the collateral + /// @return collateralValue collateral's value in USD + function _getCollateralValue(bytes memory collateralData, bytes memory priceData) + internal + view + virtual + returns (uint256 collateralValue); + + /// @notice Return the encoded price of collateral in USD + function _getCollateralPriceData(GtConfig memory config) internal view virtual returns (bytes memory priceData); +} diff --git a/contracts/v1/tokens/GearingTokenWithERC20.sol b/contracts/v1/tokens/GearingTokenWithERC20.sol new file mode 100644 index 0000000..23de9d0 --- /dev/null +++ b/contracts/v1/tokens/GearingTokenWithERC20.sol @@ -0,0 +1,230 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.27; + +import {MathLib} from "../lib/MathLib.sol"; +import "./AbstractGearingToken.sol"; + +/** + * @title TermMax Gearing Token, using ERC20 token as collateral + * @author Term Structure Labs + */ +contract GearingTokenWithERC20 is AbstractGearingToken { + using SafeCast for uint256; + using SafeCast for int256; + using TransferUtils for IERC20; + using TransferUtils for IERC20Metadata; + using MathLib for *; + + /// @notice The operation failed because the collateral capacity is exceeded + error CollateralCapacityExceeded(); + + /// @notice The operation failed because the amount can not be uint256 max + error AmountCanNotBeUint256Max(); + + /// @notice The max capacity of collateral token + uint256 public collateralCapacity; + + uint8 collateralDecimals; + + constructor() { + _disableInitializers(); + } + + function __GearingToken_Implement_init(bytes memory initalParams) internal override onlyInitializing { + collateralCapacity = abi.decode(initalParams, (uint256)); + collateralDecimals = IERC20Metadata(_config.collateral).decimals(); + } + + function _updateConfig(bytes memory configData) internal virtual override { + collateralCapacity = abi.decode(configData, (uint256)); + } + + function _checkBeforeMint(uint128, bytes memory collateralData) internal virtual override { + if (IERC20(_config.collateral).balanceOf(address(this)) + _decodeAmount(collateralData) > collateralCapacity) { + revert CollateralCapacityExceeded(); + } + } + + function _delivery(uint256 proportion) internal view virtual override returns (bytes memory deliveryData) { + uint256 collateralReserve = IERC20(_config.collateral).balanceOf(address(this)); + uint256 amount = (collateralReserve * proportion) / Constants.DECIMAL_BASE_SQ; + deliveryData = abi.encode(amount); + } + + /** + * @inheritdoc AbstractGearingToken + */ + function _mergeCollateral(bytes memory collateralDataA, bytes memory collateralDataB) + internal + virtual + override + returns (bytes memory collateralData) + { + uint256 total = _decodeAmount(collateralDataA) + _decodeAmount(collateralDataB); + collateralData = abi.encode(total); + } + + /** + * @inheritdoc AbstractGearingToken + */ + function _transferCollateralFrom(address from, address to, bytes memory collateralData) internal virtual override { + uint256 amount = _decodeAmount(collateralData); + if (amount == 0) { + return; + } + IERC20(_config.collateral).safeTransferFrom(from, to, amount); + } + + /** + * @inheritdoc AbstractGearingToken + */ + function _transferCollateral(address to, bytes memory collateralData) internal virtual override { + uint256 amount = _decodeAmount(collateralData); + if (amount == 0) { + return; + } + IERC20(_config.collateral).safeTransfer(to, amount); + } + + /** + * @inheritdoc AbstractGearingToken + */ + function _getCollateralValue(bytes memory collateralData, bytes memory priceData) + internal + view + virtual + override + returns (uint256) + { + uint256 collateralAmt = _decodeAmount(collateralData); + (uint256 price, uint256 priceDenominator, uint256 collateralDemonimator) = + abi.decode(priceData, (uint256, uint256, uint256)); + return (collateralAmt * price * Constants.DECIMAL_BASE) / (priceDenominator * collateralDemonimator); + } + + /** + * @inheritdoc AbstractGearingToken + */ + function _getCollateralPriceData(GtConfig memory config) + internal + view + virtual + override + returns (bytes memory priceData) + { + (uint256 price, uint8 decimals) = config.loanConfig.oracle.getPrice(config.collateral); + uint256 priceDenominator = 10 ** decimals; + + uint256 cTokenDenominator = 10 ** collateralDecimals; + priceData = abi.encode(price, priceDenominator, cTokenDenominator); + } + + /// @notice Encode amount to collateral data + function _decodeAmount(bytes memory collateralData) internal pure returns (uint256 amount) { + amount = abi.decode(collateralData, (uint256)); + if (amount == type(uint256).max) { + revert AmountCanNotBeUint256Max(); + } + } + + /// @notice Decode amount from collateral data + function _encodeAmount(uint256 amount) internal pure returns (bytes memory) { + return abi.encode(amount); + } + + /** + * @inheritdoc AbstractGearingToken + */ + function _removeCollateral(LoanInfo memory loan, bytes memory collateralData) + internal + virtual + override + returns (bytes memory) + { + uint256 amount = _decodeAmount(loan.collateralData) - _decodeAmount(collateralData); + return _encodeAmount(amount); + } + + /** + * @inheritdoc AbstractGearingToken + */ + function _addCollateral(LoanInfo memory loan, bytes memory collateralData) + internal + virtual + override + returns (bytes memory) + { + uint256 amount = _decodeAmount(loan.collateralData) + _decodeAmount(collateralData); + return _encodeAmount(amount); + } + + /** + * @inheritdoc AbstractGearingToken + */ + function _calcLiquidationResult(LoanInfo memory loan, uint128 repayAmt, ValueAndPrice memory valueAndPrice) + internal + virtual + override + returns (bytes memory cToLiquidator, bytes memory cToTreasurer, bytes memory remainningC) + { + uint256 collateralAmt = _decodeAmount(loan.collateralData); + + (uint256 collateralPrice, uint256 cPriceDenominator, uint256 cTokenDenominator) = + abi.decode(valueAndPrice.collateralPriceData, (uint256, uint256, uint256)); + + // maxRomvedCollateral = min( + // (repayAmt * (1 + REWARD_TO_LIQUIDATOR + REWARD_TO_PROTOCOL)) * debtTokenPrice / collateralTokenPrice , + // collateralAmt *(repayAmt / debtAmt) + // ) + + /* DP := debt token price (valueAndPrice.debtPrice) + * DPD := debt token price decimal (valueAndPrice.priceDenominator) + * CP := collateral token price (collateralPrice) + * CPD := collateral token price decimal (cPriceDenominator) + * SD := scaling decimal = DPD * CPD * 10 + * The value of 1(decimal) debt token / The value of 1(decimal) collateral token + * ddPriceToCdPrice = roundUp((DP/DPD) / (CP/CPD) = (DP*CPD*SD) / (CP*DPD)) + * = roundUp((DP*CPD*CPD*10) / CP) + */ + uint256 ddPriceToCdPrice = ( + valueAndPrice.debtPrice * cPriceDenominator * cPriceDenominator * 10 + collateralPrice - 1 + ) / collateralPrice; + + // calculate the amount of collateral that is equivalent to repayAmt + // with debt to collateral price + uint256 cEqualRepayAmt = (repayAmt * ddPriceToCdPrice * cTokenDenominator) + / (valueAndPrice.debtDenominator * cPriceDenominator * valueAndPrice.priceDenominator * 10); + + uint256 rewardToLiquidator = + (cEqualRepayAmt * GearingTokenConstants.REWARD_TO_LIQUIDATOR) / Constants.DECIMAL_BASE; + uint256 rewardToProtocol = (cEqualRepayAmt * GearingTokenConstants.REWARD_TO_PROTOCOL) / Constants.DECIMAL_BASE; + + uint256 removedCollateralAmt = cEqualRepayAmt + rewardToLiquidator + rewardToProtocol; + + if (loan.debtAmt == 0) { + removedCollateralAmt = 0; + } else { + removedCollateralAmt = removedCollateralAmt.min((collateralAmt * repayAmt) / loan.debtAmt); + } + + // Case 1: removed collateral can not cover repayAmt + rewardToLiquidator + if (removedCollateralAmt <= cEqualRepayAmt + rewardToLiquidator) { + cToLiquidator = _encodeAmount(removedCollateralAmt); + cToTreasurer = _encodeAmount(0); + remainningC = _encodeAmount(0); + } + // Case 2: removed collateral can cover repayAmt + rewardToLiquidator but not rewardToProtocol + else if (removedCollateralAmt < cEqualRepayAmt + rewardToLiquidator + rewardToProtocol) { + cToLiquidator = _encodeAmount(cEqualRepayAmt + rewardToLiquidator); + cToTreasurer = _encodeAmount(removedCollateralAmt - cEqualRepayAmt - rewardToLiquidator); + remainningC = _encodeAmount(0); + } + // Case 3: removed collateral equal repayAmt + rewardToLiquidator + rewardToProtocol + else { + cToLiquidator = _encodeAmount(cEqualRepayAmt + rewardToLiquidator); + cToTreasurer = _encodeAmount(rewardToProtocol); + } + // Calculate remainning collateral + remainningC = _encodeAmount(collateralAmt - removedCollateralAmt); + } +} diff --git a/contracts/v1/tokens/IFlashRepayer.sol b/contracts/v1/tokens/IFlashRepayer.sol new file mode 100644 index 0000000..898fa6a --- /dev/null +++ b/contracts/v1/tokens/IFlashRepayer.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +/** + * @title The interface of flash repayer + * @author Term Structure Labs + */ +interface IFlashRepayer { + /// @notice Execute operation to be called in flash repay function + /// @dev Add your operations logic here + /// @param repayToken DebtToken or FT token + /// @param debtAmt Amount of debt + /// @param collateralToken Collateral token + /// @param collateralData Encoded collateral data + /// @param callbackData The data of flash repay callback + function executeOperation( + IERC20 repayToken, + uint128 debtAmt, + address collateralToken, + bytes memory collateralData, + bytes calldata callbackData + ) external; +} diff --git a/contracts/v1/tokens/IGearingToken.sol b/contracts/v1/tokens/IGearingToken.sol new file mode 100644 index 0000000..58939d9 --- /dev/null +++ b/contracts/v1/tokens/IGearingToken.sol @@ -0,0 +1,125 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {IERC20Metadata, IERC20} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import {IERC721Enumerable} from "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol"; +import {GtConfig} from "../storage/TermMaxStorage.sol"; + +/** + * @title TermMax Gearing token interface + * @author Term Structure Labs + */ +interface IGearingToken is IERC721Enumerable { + // @notice Initial function + /// @param name The token's name + /// @param symbol The token's symbol + /// @param config Configuration of GT + /// @param initalParams The initilization parameters of implementation + function initialize(string memory name, string memory symbol, GtConfig memory config, bytes memory initalParams) + external; + + /// @notice Set the treasurer address + /// @param treasurer New address of treasurer + /// @dev Only the market can call this function + function setTreasurer(address treasurer) external; + + /// @notice Set the configuration of Gearing Token + function updateConfig(bytes memory configData) external; + + /// @notice Return the configuration of Gearing Token + function getGtConfig() external view returns (GtConfig memory); + + /// @notice Return the flag to indicate debt is liquidatable or not + function liquidatable() external view returns (bool); + + /// @notice Return the market address + function marketAddr() external view returns (address); + + /// @notice Mint this token to an address + /// @param collateralProvider Who provide collateral token + /// @param to The address receiving token + /// @param debtAmt The amount of debt, unit by debtToken token + /// @param collateralData The encoded data of collateral + /// @return id The id of Gearing Token + /// @dev Only the market can mint Gearing Token + function mint(address collateralProvider, address to, uint128 debtAmt, bytes memory collateralData) + external + returns (uint256 id); + + /// @notice Augment the debt of Gearing Token + /// @param id The id of Gearing Token + /// @param ftAmt The amount of debt, unit by debtToken token + function augmentDebt(address caller, uint256 id, uint256 ftAmt) external; + + /// @notice Return the loan information of Gearing Token + /// @param id The id of Gearing Token + /// @return owner The owner of Gearing Token + /// @return debtAmt The amount of debt, unit by debtToken token + /// @return collateralData The encoded data of collateral + function loanInfo(uint256 id) external view returns (address owner, uint128 debtAmt, bytes memory collateralData); + + /// @notice Merge multiple Gearing Tokens into one + /// @param ids The array of Gearing Tokens to be merged + /// @return newId The id of new Gearing Token + function merge(uint256[] memory ids) external returns (uint256 newId); + + /// @notice Repay the debt of Gearing Token. + /// If repay amount equals the debt amount, Gearing Token's owner will get his collateral. + /// @param id The id of Gearing Token + /// @param repayAmt The amount of debt you want to repay + /// @param byDebtToken Repay using debtToken token or bonds token + function repay(uint256 id, uint128 repayAmt, bool byDebtToken) external; + + /// @notice Repay the debt of Gearing Token, + /// the collateral will send by flashloan first. + /// @param id The id of Gearing Token + /// @param byDebtToken Repay using debtToken token or bonds token + function flashRepay(uint256 id, bool byDebtToken, bytes calldata callbackData) external; + + /// @notice Remove collateral from the loan. + /// Require the loan to value bigger than maxLtv after this action. + /// @param id The id of Gearing Token + /// @param collateralData Collateral data to be removed + function removeCollateral(uint256 id, bytes memory collateralData) external; + + /// @notice Add collateral to the loan + /// @param id The id of Gearing Token + /// @param collateralData Collateral data to be added + function addCollateral(uint256 id, bytes memory collateralData) external; + + /// @notice Return the liquidation info of the loan + /// @param id The id of the G-token + /// @return isLiquidable Whether the loan is liquidable + /// @return ltv The loan to collateral + /// @return maxRepayAmt The maximum amount of the debt to be repaid + function getLiquidationInfo(uint256 id) + external + view + returns (bool isLiquidable, uint128 ltv, uint128 maxRepayAmt); + + /// @notice Liquidate the loan when its ltv bigger than liquidationLtv or expired. + /// The ltv can not inscrease after liquidation. + /// A maximum of 10% of the repayment amount of collateral is given as a + /// reward to the protocol and liquidator, + /// The proportion of collateral liquidated will not exceed the debt liquidation ratio. + /// @param id The id of the G-token + /// @param repayAmt The amount of the debt to be liquidate + /// @param byDebtToken Repay using debtToken token or bonds token + function liquidate(uint256 id, uint128 repayAmt, bool byDebtToken) external; + + /// @notice Preview the delivery data + /// @param proportion The proportion of collateral that should be obtained + /// @return deliveryData The delivery data + function previewDelivery(uint256 proportion) external view returns (bytes memory deliveryData); + + /// @notice Deilivery outstanding debts after maturity + /// @param proportion The proportion of collateral that should be obtained + /// @param to The address receiving collateral token + /// @dev Only the market can delivery collateral + function delivery(uint256 proportion, address to) external returns (bytes memory deliveryData); + + /// @notice Return the value of collateral in USD with base decimals + /// @param collateralData encoded collateral data + /// @return collateralValue collateral's value in USD + function getCollateralValue(bytes memory collateralData) external view returns (uint256 collateralValue); +} diff --git a/contracts/v1/tokens/IMintableERC20.sol b/contracts/v1/tokens/IMintableERC20.sol new file mode 100644 index 0000000..203a075 --- /dev/null +++ b/contracts/v1/tokens/IMintableERC20.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +/** + * @title TermMax ERC20 token interface + * @author Term Structure Labs + */ +interface IMintableERC20 is IERC20 { + /// @notice Error when using offline signature but spender is not the maerket + error SpenderIsNotMarket(address spender); + + // @notice Initial function + /// @param name The token's name + /// @param symbol The token's symbol + /// @param _decimals The token's decimals + function initialize(string memory name, string memory symbol, uint8 _decimals) external; + + /// @notice Mint this token to an address + /// @param to The address receiving token + /// @param amount The amount of token minted + /// @dev Only the market can mint TermMax tokens + function mint(address to, uint256 amount) external; + + /// @notice Return the market's address + function marketAddr() external view returns (address); + + /// @notice Burn tokens from sender + /// @param amount The number of tokens to be burned + /// @dev Only the market can burn TermMax tokens + function burn(uint256 amount) external; + + /** + * @dev Returns the decimals places of the token. + */ + function decimals() external view returns (uint8); +} diff --git a/contracts/v1/tokens/MintableERC20.sol b/contracts/v1/tokens/MintableERC20.sol new file mode 100644 index 0000000..73aa8f9 --- /dev/null +++ b/contracts/v1/tokens/MintableERC20.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {ERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; +import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import {IMintableERC20} from "./IMintableERC20.sol"; + +/** + * @title TermMax ERC20 token + * @author Term Structure Labs + */ +contract MintableERC20 is ERC20Upgradeable, OwnableUpgradeable, IMintableERC20 { + /// @notice The token's decimals + uint8 _decimals; + + constructor() { + _disableInitializers(); + } + + /** + * @inheritdoc IMintableERC20 + */ + function initialize(string memory name, string memory symbol, uint8 decimals_) public override initializer { + __ERC20_init(name, symbol); + __Ownable_init(_msgSender()); + _decimals = decimals_; + } + + /** + * @inheritdoc IMintableERC20 + */ + function mint(address to, uint256 amount) external override onlyOwner { + _mint(to, amount); + } + + /** + * @inheritdoc IMintableERC20 + */ + function marketAddr() public view override returns (address) { + return owner(); + } + + /** + * @inheritdoc IMintableERC20 + */ + function burn(uint256 amount) external override onlyOwner { + _burn(msg.sender, amount); + } + + /** + * @inheritdoc IMintableERC20 + */ + function decimals() public view override(ERC20Upgradeable, IMintableERC20) returns (uint8) { + return _decimals; + } +} diff --git a/contracts/v1/vault/IOrderManager.sol b/contracts/v1/vault/IOrderManager.sol new file mode 100644 index 0000000..053783e --- /dev/null +++ b/contracts/v1/vault/IOrderManager.sol @@ -0,0 +1,98 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {ITermMaxMarket} from "../ITermMaxMarket.sol"; +import {ITermMaxOrder} from "../ITermMaxOrder.sol"; +import {CurveCuts} from "../storage/TermMaxStorage.sol"; + +/** + * @title Order Manager Interface + * @author Term Structure Labs + */ +interface IOrderManager { + /** + * @notice Creates a new order + * @param asset The asset token address + * @param market The market address + * @param maxSupply The maximum xt supply of the order + * @param initialReserve The initial reserve of the order + * @param curveCuts The curve cuts for the order + * @return order The order address + */ + function createOrder( + IERC20 asset, + ITermMaxMarket market, + uint256 maxSupply, + uint256 initialReserve, + CurveCuts memory curveCuts + ) external returns (ITermMaxOrder order); + + /** + * @notice Deals bad debt + * @param recipient The recipient of the collateral token + * @param collateral The collateral token address + * @param amount The amount of bad debt to deal + */ + function dealBadDebt(address recipient, address collateral, uint256 amount) + external + returns (uint256 collateralOut); + + /** + * @notice Updates multiple orders + * @param asset The asset token address + * @param orders The orders to update + * @param changes The changes to apply to each order + * @param maxSupplies The maximum xt supplies to update for each order + * @param curveCuts The curve cuts to update for each order + */ + function updateOrders( + IERC20 asset, + ITermMaxOrder[] memory orders, + int256[] memory changes, + uint256[] memory maxSupplies, + CurveCuts[] memory curveCuts + ) external; + + /** + * @notice Withdraws performance fee + * @param asset The asset token address + * @param recipient The recipient of the performance fee + * @param amount The amount of performance fee to withdraw + */ + function withdrawPerformanceFee(IERC20 asset, address recipient, uint256 amount) external; + + /** + * @notice Deposits assets + * @param asset The asset token address + * @param amount The amount of assets to deposit + */ + function depositAssets(IERC20 asset, uint256 amount) external; + + /** + * @notice Withdraws assets + * @param asset The asset token address + * @param recipient The recipient of the assets + * @param amount The amount of assets to withdraw + */ + function withdrawAssets(IERC20 asset, address recipient, uint256 amount) external; + + /** + * @notice Accrues interest + */ + function accruedInterest() external; + + /** + * @notice Redeems an order + * @param order The order to redeem + */ + function redeemOrder(ITermMaxOrder order) external; + + /** + * @notice Swaps callback to calculate interest + * @param ftReserve The reserve of the FT token + * @param xtReserve The reserve of the XT token + * @param deltaFt The deltaFt of the swap + */ + function afterSwap(uint256 ftReserve, uint256 xtReserve, int256 deltaFt) external; +} diff --git a/contracts/v1/vault/ITermMaxVault.sol b/contracts/v1/vault/ITermMaxVault.sol new file mode 100644 index 0000000..5cc1549 --- /dev/null +++ b/contracts/v1/vault/ITermMaxVault.sol @@ -0,0 +1,296 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {IERC4626} from "@openzeppelin/contracts/interfaces/IERC4626.sol"; +import {IERC20} from "@openzeppelin/contracts/interfaces/IERC20.sol"; +import {ITermMaxMarket} from "../ITermMaxMarket.sol"; +import {CurveCuts, VaultInitialParams} from "../storage/TermMaxStorage.sol"; +import {ITermMaxOrder} from "../ITermMaxOrder.sol"; +import {PendingAddress, PendingUint192} from "../lib/PendingLib.sol"; +import {OrderInfo} from "./VaultStorage.sol"; + +/** + * @title TermMax Vault Interface + * @author Term Structure Labs + * @notice Interface for TermMax vaults that extends the ERC4626 standard + * @dev Implements ERC4626 tokenized vault standard with additional TermMax-specific functionality + */ +interface ITermMaxVault is IERC4626 { + /** + * @notice Initializes the vault + * @param params The initial parameters of the vault + */ + function initialize(VaultInitialParams memory params) external; + + /** + * @notice Handles bad debt by exchanging shares for collateral + * @param collaretal The collateral token address + * @param badDebtAmt The amount of bad debt to handle + * @param recipient The recipient of the collateral + * @param owner The owner of the shares + * @return shares The amount of shares burned + * @return collaretalOut The amount of collateral released + */ + function dealBadDebt(address collaretal, uint256 badDebtAmt, address recipient, address owner) + external + returns (uint256 shares, uint256 collaretalOut); + + /** + * @notice Returns the current Annual Percentage Rate (APR) + * @return The current APR as a percentage with 8 decimals + */ + function apr() external view returns (uint256); + + /** + * @notice Returns the guardian address + * @return The address of the guardian + */ + function guardian() external view returns (address); + + /** + * @notice Returns the curator address + * @return The address of the curator + */ + function curator() external view returns (address); + + /** + * @notice Checks if an address is an allocator + * @param allocator The address to check + * @return True if the address is an allocator, false otherwise + */ + function isAllocator(address allocator) external view returns (bool); + + /** + * @notice Checks if a market is whitelisted + * @param market The market address to check + * @return True if the market is whitelisted, false otherwise + */ + function marketWhitelist(address market) external view returns (bool); + + /** + * @notice Returns the timelock duration + * @return The timelock duration in seconds + */ + function timelock() external view returns (uint256); + + /** + * @notice Returns the pending market information + * @param market The market address to check + */ + function pendingMarkets(address market) external view returns (PendingUint192 memory); + + /** + * @notice Returns the pending timelock information + */ + function pendingTimelock() external view returns (PendingUint192 memory); + + /** + * @notice Returns the pending performance fee rate information + */ + function pendingPerformanceFeeRate() external view returns (PendingUint192 memory); + + /** + * @notice Returns the pending guardian information + */ + function pendingGuardian() external view returns (PendingAddress memory); + + /** + * @notice Returns the performance fee rate + * @return The performance fee rate as a percentage with 18 decimals + */ + function performanceFeeRate() external view returns (uint64); + + /** + * @notice Returns the total amount of ft tokens + * @return The total amount of ft tokens + */ + function totalFt() external view returns (uint256); + + /** + * @notice Returns the accreting principal amount + * @return The accreting principal amount + */ + function accretingPrincipal() external view returns (uint256); + + /** + * @notice Returns the annualized interest + * @return The annualized interest + */ + function annualizedInterest() external view returns (uint256); + + /** + * @notice Returns the performance fee amount + * @return The performance fee amount + */ + function performanceFee() external view returns (uint256); + + /** + * @notice Returns the supply queue information + * @param index The index of the supply queue to retrieve + * @return The address of the supply queue at the specified index + */ + function supplyQueue(uint256 index) external view returns (address); + + /** + * @notice Returns the withdraw queue information + * @param index The index of the withdraw queue to retrieve + * @return The address of the withdraw queue at the specified index + */ + function withdrawQueue(uint256 index) external view returns (address); + + /// @notice Return the length of the supply queue + function supplyQueueLength() external view returns (uint256); + + /// @notice Return the length of the withdraw queue + function withdrawQueueLength() external view returns (uint256); + + /** + * @notice Returns the order mapping information + * @param order The order address to retrieve + */ + function orderMapping(address order) external view returns (OrderInfo memory); + + /** + * @notice Returns the bad debt mapping information + * @param collateral The collateral address to retrieve + * @return The bad debt amount associated with the collateral + */ + function badDebtMapping(address collateral) external view returns (uint256); + + /** + * @notice Creates a new order + * @param market The market address to create the order for + * @param maxSupply The maximum supply of the order + * @param initialReserve The initial reserve amount of the order + * @param curveCuts The curve cuts to use for the order + * @return order The newly created order + */ + function createOrder(ITermMaxMarket market, uint256 maxSupply, uint256 initialReserve, CurveCuts calldata curveCuts) + external + returns (ITermMaxOrder order); + + /** + * @notice Updates multiple orders + * @param orders The orders to update + * @param changes The changes to apply to each order + * @param maxSupplies The maximum supplies to update for each order + * @param curveCuts The curve cuts to update for each order + */ + function updateOrders( + ITermMaxOrder[] calldata orders, + int256[] calldata changes, + uint256[] calldata maxSupplies, + CurveCuts[] calldata curveCuts + ) external; + + /** + * @notice Updates the supply queue + * @param indexes The indexes to update in the supply queue + */ + function updateSupplyQueue(uint256[] calldata indexes) external; + + /** + * @notice Updates the withdraw queue + * @param indexes The indexes to update in the withdraw queue + */ + function updateWithdrawQueue(uint256[] calldata indexes) external; + + /** + * @notice Redeems an order + * @param order The order to redeem + */ + function redeemOrder(ITermMaxOrder order) external; + + /** + * @notice Withdraws performance fee + * @param recipient The recipient of the performance fee + * @param amount The amount of performance fee to withdraw + */ + function withdrawPerformanceFee(address recipient, uint256 amount) external; + + /** + * @notice Submits a new guardian address + * @param newGuardian The new guardian address + */ + function submitGuardian(address newGuardian) external; + + /** + * @notice Sets a new curator address + * @param newCurator The new curator address + */ + function setCurator(address newCurator) external; + + /** + * @notice Submits a new timelock duration + * @param newTimelock The new timelock duration + */ + function submitTimelock(uint256 newTimelock) external; + + /** + * @notice Sets a new capacity + * @param newCapacity The new capacity + */ + function setCapacity(uint256 newCapacity) external; + + /** + * @notice Sets whether an address is an allocator + * @param newAllocator The address to set as an allocator + * @param newIsAllocator Whether the address is an allocator + */ + function setIsAllocator(address newAllocator, bool newIsAllocator) external; + + /** + * @notice Submits a new performance fee rate + * @param newPerformanceFeeRate The new performance fee rate + */ + function submitPerformanceFeeRate(uint184 newPerformanceFeeRate) external; + + /** + * @notice Submits a new market for whitelisting + * @param market The market address to whitelist + * @param isWhitelisted Whether the market is whitelisted + */ + function submitMarket(address market, bool isWhitelisted) external; + + /** + * @notice Revokes the pending timelock + */ + function revokePendingTimelock() external; + + /** + * @notice Revokes the pending guardian + */ + function revokePendingGuardian() external; + + /** + * @notice Revokes the pending market + * @param market The market address to revoke + */ + function revokePendingMarket(address market) external; + + /** + * @notice Revokes the pending performance fee rate + */ + function revokePendingPerformanceFeeRate() external; + + /** + * @notice Accepts the pending timelock + */ + function acceptTimelock() external; + + /** + * @notice Accepts the pending guardian + */ + function acceptGuardian() external; + + /** + * @notice Accepts the pending market + * @param market The market address to accept + */ + function acceptMarket(address market) external; + + /** + * @notice Accepts the pending performance fee rate + */ + function acceptPerformanceFeeRate() external; +} diff --git a/contracts/v1/vault/OrderManager.sol b/contracts/v1/vault/OrderManager.sol new file mode 100644 index 0000000..a8e9df3 --- /dev/null +++ b/contracts/v1/vault/OrderManager.sol @@ -0,0 +1,395 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.27; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; +import {PendingLib, PendingAddress, PendingUint192} from "../lib/PendingLib.sol"; +import {ITermMaxMarket} from "../ITermMaxMarket.sol"; +import {CurveCuts, OrderConfig} from "../storage/TermMaxStorage.sol"; +import {VaultErrors} from "../errors/VaultErrors.sol"; +import {VaultEvents} from "../events/VaultEvents.sol"; +import {ITermMaxRouter} from "../router/ITermMaxRouter.sol"; +import {ITermMaxOrder} from "../ITermMaxOrder.sol"; +import {VaultConstants} from "../lib/VaultConstants.sol"; +import {TransferUtils} from "../lib/TransferUtils.sol"; +import {Constants} from "../lib/Constants.sol"; +import {ArrayUtils} from "../lib/ArrayUtils.sol"; +import {MathLib} from "../lib/MathLib.sol"; +import {LinkedList} from "../lib/LinkedList.sol"; +import {IOrderManager} from "./IOrderManager.sol"; +import {ISwapCallback} from "../ISwapCallback.sol"; +import {OrderInfo, VaultStorage} from "./VaultStorage.sol"; +/** + * @title Order Manager + * @author Term Structure Labs + * @notice The extension of the TermMaxVault that manages orders and calculates interest + */ + +contract OrderManager is VaultStorage, VaultErrors, VaultEvents, IOrderManager { + using SafeCast for uint256; + using SafeCast for int256; + using TransferUtils for IERC20; + using ArrayUtils for address[]; + using MathLib for uint256; + using LinkedList for mapping(uint64 => uint64); + + address private immutable ORDER_MANAGER_SINGLETON; + + /** + * @notice Reverts if the caller is not the proxy + */ + modifier onlyProxy() { + if (address(this) == ORDER_MANAGER_SINGLETON) revert OnlyProxy(); + _; + } + + constructor() { + ORDER_MANAGER_SINGLETON = address(this); + } + + /** + * @inheritdoc IOrderManager + */ + function updateOrders( + IERC20 asset, + ITermMaxOrder[] memory orders, + int256[] memory changes, + uint256[] memory maxSupplies, + CurveCuts[] memory curveCuts + ) external override onlyProxy { + _accruedInterest(); + for (uint256 i = 0; i < orders.length; ++i) { + _updateOrder(asset, ITermMaxOrder(orders[i]), changes[i], maxSupplies[i], curveCuts[i]); + } + } + + /** + * @inheritdoc IOrderManager + */ + function withdrawPerformanceFee(IERC20 asset, address recipient, uint256 amount) external override onlyProxy { + _accruedInterest(); + _withdrawPerformanceFee(asset, recipient, amount); + } + + /** + * @inheritdoc IOrderManager + */ + function redeemOrder(ITermMaxOrder order) external override onlyProxy { + _redeemFromMarket(address(order), _orderMapping[address(order)]); + } + + /** + * @inheritdoc IOrderManager + */ + function createOrder( + IERC20 asset, + ITermMaxMarket market, + uint256 maxSupply, + uint256 initialReserve, + CurveCuts memory curveCuts + ) external onlyProxy returns (ITermMaxOrder order) { + if ( + _supplyQueue.length + 1 >= VaultConstants.MAX_QUEUE_LENGTH + || _withdrawQueue.length + 1 >= VaultConstants.MAX_QUEUE_LENGTH + ) revert MaxQueueLengthExceeded(); + + (IERC20 ft, IERC20 xt,,, IERC20 debtToken) = market.tokens(); + if (asset != debtToken) revert InconsistentAsset(); + + order = market.createOrder(address(this), maxSupply, ISwapCallback(address(this)), curveCuts); + if (initialReserve > 0) { + asset.safeIncreaseAllowance(address(market), initialReserve); + market.mint(address(order), initialReserve); + } + _supplyQueue.push(address(order)); + _withdrawQueue.push(address(order)); + + uint64 orderMaturity = market.config().maturity; + _orderMapping[address(order)] = + OrderInfo({market: market, ft: ft, xt: xt, maxSupply: maxSupply.toUint128(), maturity: orderMaturity}); + _maturityMapping.insertWhenZeroAsRoot(orderMaturity); + emit CreateOrder(msg.sender, address(market), address(order), maxSupply, initialReserve, curveCuts); + } + + function _updateOrder( + IERC20 asset, + ITermMaxOrder order, + int256 changes, + uint256 maxSupply, + CurveCuts memory curveCuts + ) internal { + _checkOrder(address(order)); + OrderInfo memory orderInfo = _orderMapping[address(order)]; + orderInfo.maxSupply = maxSupply.toUint128(); + OrderConfig memory newOrderConfig; + newOrderConfig.curveCuts = curveCuts; + newOrderConfig.maxXtReserve = maxSupply; + newOrderConfig.swapTrigger = ISwapCallback(address(this)); + if (changes < 0) { + // withdraw assets from order and burn to assets + order.updateOrder(newOrderConfig, changes, changes); + uint256 withdrawChanges = (-changes).toUint256(); + orderInfo.ft.safeIncreaseAllowance(address(orderInfo.market), withdrawChanges); + orderInfo.xt.safeIncreaseAllowance(address(orderInfo.market), withdrawChanges); + orderInfo.market.burn(address(this), withdrawChanges); + } else { + // deposit assets to order + uint256 depositChanges = uint256(changes); + asset.safeIncreaseAllowance(address(orderInfo.market), depositChanges); + orderInfo.market.mint(address(order), depositChanges); + // update curve cuts + order.updateOrder(newOrderConfig, 0, 0); + } + _orderMapping[address(order)] = orderInfo; + emit UpdateOrder(msg.sender, address(order), changes, maxSupply, curveCuts); + } + + /** + * @inheritdoc IOrderManager + */ + function depositAssets(IERC20 asset, uint256 amount) external override onlyProxy { + _accruedInterest(); + uint256 amountLeft = amount; + for (uint256 i = 0; i < _supplyQueue.length; ++i) { + address order = _supplyQueue[i]; + + //check maturity + OrderInfo memory orderInfo = _orderMapping[order]; + if (block.timestamp > orderInfo.maturity) continue; + + //check supply + uint256 xtReserve = orderInfo.xt.balanceOf(order); + if (xtReserve >= orderInfo.maxSupply) continue; + + uint256 depositAmt = (orderInfo.maxSupply - xtReserve).min(amountLeft); + + asset.safeIncreaseAllowance(address(orderInfo.market), depositAmt); + orderInfo.market.mint(order, depositAmt); + amountLeft -= depositAmt; + if (amountLeft == 0) break; + } + // deposit to lpers + uint256 amplifiedAmt = amount * Constants.DECIMAL_BASE_SQ; + _totalFt += amplifiedAmt; + _accretingPrincipal += amplifiedAmt; + } + + /** + * @inheritdoc IOrderManager + */ + function withdrawAssets(IERC20 asset, address recipient, uint256 amount) external override onlyProxy { + _accruedInterest(); + uint256 amountLeft = amount; + uint256 assetBalance = asset.balanceOf(address(this)); + if (assetBalance >= amount) { + asset.safeTransfer(recipient, amount); + } else { + amountLeft -= assetBalance; + uint256 length = _withdrawQueue.length; + // withdraw from orders + uint256 i; + while (length > 0 && i < length) { + address order = _withdrawQueue[i]; + OrderInfo memory orderInfo = _orderMapping[order]; + if (block.timestamp >= orderInfo.maturity + Constants.LIQUIDATION_WINDOW) { + // redeem assets from expired order + uint256 totalRedeem = _redeemFromMarket(order, orderInfo); + length--; + if (totalRedeem < amountLeft) { + amountLeft -= totalRedeem; + continue; + } else { + // transfer all assets to recipient + asset.safeTransfer(recipient, amount); + amountLeft = 0; + break; + } + } else if (block.timestamp < orderInfo.maturity) { + // withdraw ft and xt from order to burn + uint256 maxWithdraw = orderInfo.xt.balanceOf(order).min(orderInfo.ft.balanceOf(order)); + + if (maxWithdraw < amountLeft) { + amountLeft -= maxWithdraw; + _burnFromOrder(ITermMaxOrder(order), orderInfo, maxWithdraw); + ++i; + } else { + _burnFromOrder(ITermMaxOrder(order), orderInfo, amountLeft); + // transfer all assets to recipient + asset.safeTransfer(recipient, amount); + amountLeft = 0; + break; + } + } else { + // ignore orders that are in liquidation window + ++i; + } + } + if (amountLeft > 0) { + uint256 maxWithdraw = amount - amountLeft; + revert InsufficientFunds(maxWithdraw, amount); + } + } + uint256 amplifiedAmt = amount * Constants.DECIMAL_BASE_SQ; + _totalFt -= amplifiedAmt; + _accretingPrincipal -= amplifiedAmt; + } + + function _withdrawPerformanceFee(IERC20 asset, address recipient, uint256 amount) internal { + uint256 amplifiedAmt = amount * Constants.DECIMAL_BASE_SQ; + if (amplifiedAmt > _performanceFee) { + revert InsufficientFunds(_performanceFee / Constants.DECIMAL_BASE_SQ, amount); + } + asset.safeTransfer(recipient, amount); + _performanceFee -= amplifiedAmt; + _totalFt -= amplifiedAmt; + + emit WithdrawPerformanceFee(msg.sender, recipient, amount); + } + + /** + * @inheritdoc IOrderManager + */ + function dealBadDebt(address recipient, address collateral, uint256 amount) + external + onlyProxy + returns (uint256 collateralOut) + { + _accruedInterest(); + uint256 badDebtAmt = _badDebtMapping[collateral]; + if (badDebtAmt == 0) revert NoBadDebt(collateral); + if (amount > badDebtAmt) revert InsufficientFunds(badDebtAmt, amount); + uint256 collateralBalance = IERC20(collateral).balanceOf(address(this)); + collateralOut = (amount * collateralBalance) / badDebtAmt; + IERC20(collateral).safeTransfer(recipient, collateralOut); + + _badDebtMapping[collateral] -= amount; + uint256 amplifiedAmt = amount * Constants.DECIMAL_BASE_SQ; + _accretingPrincipal -= amplifiedAmt; + _totalFt -= amplifiedAmt; + } + + function _burnFromOrder(ITermMaxOrder order, OrderInfo memory orderInfo, uint256 amount) internal { + order.withdrawAssets(orderInfo.ft, address(this), amount); + order.withdrawAssets(orderInfo.xt, address(this), amount); + orderInfo.ft.safeIncreaseAllowance(address(orderInfo.market), amount); + orderInfo.xt.safeIncreaseAllowance(address(orderInfo.market), amount); + + orderInfo.market.burn(address(this), amount); + } + + function _redeemFromMarket(address order, OrderInfo memory orderInfo) internal returns (uint256 totalRedeem) { + uint256 ftReserve = orderInfo.ft.balanceOf(order); + if (ftReserve != 0) { + ITermMaxOrder(order).withdrawAssets(orderInfo.ft, address(this), ftReserve); + orderInfo.ft.safeIncreaseAllowance(address(orderInfo.market), ftReserve); + (totalRedeem,) = orderInfo.market.redeem(ftReserve, address(this)); + if (totalRedeem < ftReserve) { + // storage bad debt + (,,, address collateral,) = orderInfo.market.tokens(); + _badDebtMapping[collateral] += ftReserve - totalRedeem; + } + } + emit RedeemOrder(msg.sender, order, ftReserve.toUint128(), totalRedeem.toUint128()); + + delete _orderMapping[order]; + _supplyQueue.remove(_supplyQueue.indexOf(order)); + _withdrawQueue.remove(_withdrawQueue.indexOf(order)); + } + + /// @notice Calculate and distribute accrued the interest from start to end time + function _accruedPeriodInterest(uint256 startTime, uint256 endTime) internal { + uint256 interest = (_annualizedInterest * (endTime - startTime)) / 365 days; + uint256 _performanceFeeToCurator = (interest * _performanceFeeRate) / Constants.DECIMAL_BASE; + // accrue interest + _performanceFee += _performanceFeeToCurator; + _accretingPrincipal += (interest - _performanceFeeToCurator); + } + + /** + * @inheritdoc IOrderManager + */ + function accruedInterest() external onlyProxy { + _accruedInterest(); + } + + /// @notice Distribute interest + function _accruedInterest() internal { + uint64 currentTime = block.timestamp.toUint64(); + uint256 lastTime = _lastUpdateTime; + if (currentTime == lastTime) return; + uint64 recentMaturity = _maturityMapping[0]; + if (recentMaturity == 0) return; + while (recentMaturity != 0 && recentMaturity <= currentTime) { + // pop first maturity + _maturityMapping.popWhenZeroAsRoot(); + _accruedPeriodInterest(lastTime, recentMaturity); + // update last time + lastTime = recentMaturity; + // update annualized interest + _annualizedInterest -= _maturityToInterest[recentMaturity]; + delete _maturityToInterest[recentMaturity]; + // get next maturity + recentMaturity = _maturityMapping[0]; + } + // accrued interest for the remaining maturity + if (recentMaturity > 0) { + _accruedPeriodInterest(lastTime, currentTime); + } else { + // all orders are expired + _annualizedInterest = 0; + } + _lastUpdateTime = currentTime; + } + + function _checkLockedFt() internal view { + if (_accretingPrincipal + _performanceFee > _totalFt) revert LockedFtGreaterThanTotalFt(); + } + + function _checkOrder(address orderAddress) internal view { + if (address(_orderMapping[orderAddress].market) == address(0)) { + revert UnauthorizedOrder(orderAddress); + } + } + + /// @notice Callback function for the swap + /// @param deltaFt The change in the ft balance of the order + function afterSwap(uint256 ftReserve, uint256 xtReserve, int256 deltaFt) external onlyProxy { + if (ftReserve < xtReserve) { + revert OrderHasNegativeInterest(); + } + address orderAddress = msg.sender; + /// @dev Check if the order is valid + _checkOrder(orderAddress); + uint64 maturity = _orderMapping[orderAddress].maturity; + /// @dev Calculate interest from last update time to now + _accruedInterest(); + + /// @dev If ft increases, interest increases, and if ft decreases, + /// interest decreases. Update the expected annualized return based on the change + uint256 ftChanges; + + if (deltaFt > 0) { + ftChanges = uint256(deltaFt) * Constants.DECIMAL_BASE_SQ; + _totalFt += ftChanges; + uint256 deltaAnnualizedInterest = ftChanges * 365 days / uint256(maturity - block.timestamp); + + _maturityToInterest[maturity] += deltaAnnualizedInterest; + + _annualizedInterest += deltaAnnualizedInterest; + } else { + ftChanges = uint256(-deltaFt) * Constants.DECIMAL_BASE_SQ; + _totalFt -= ftChanges; + uint256 deltaAnnualizedInterest = (ftChanges * 365 days) / uint256(maturity - block.timestamp); + if ( + _maturityToInterest[maturity] < deltaAnnualizedInterest || _annualizedInterest < deltaAnnualizedInterest + ) { + revert LockedFtGreaterThanTotalFt(); + } + _maturityToInterest[maturity] -= deltaAnnualizedInterest; + _annualizedInterest -= deltaAnnualizedInterest; + } + /// @dev Ensure that the total assets after the transaction are + ///greater than or equal to the principal and the allocated interest + _checkLockedFt(); + } +} diff --git a/contracts/v1/vault/TermMaxVault.sol b/contracts/v1/vault/TermMaxVault.sol new file mode 100644 index 0000000..9ab0295 --- /dev/null +++ b/contracts/v1/vault/TermMaxVault.sol @@ -0,0 +1,748 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +pragma solidity ^0.8.27; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; +import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; +import { + IERC4626, + ERC4626Upgradeable, + ERC20Upgradeable +} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC4626Upgradeable.sol"; +import {Ownable2StepUpgradeable} from "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; +import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; +import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import {PendingLib, PendingAddress, PendingUint192} from "../lib/PendingLib.sol"; +import {ITermMaxMarket} from "../ITermMaxMarket.sol"; +import {CurveCuts, VaultInitialParams} from "../storage/TermMaxStorage.sol"; +import {ITermMaxRouter} from "../router/ITermMaxRouter.sol"; +import {ITermMaxOrder} from "../ITermMaxOrder.sol"; +import {VaultConstants} from "../lib/VaultConstants.sol"; +import {TransferUtils} from "../lib/TransferUtils.sol"; +import {ISwapCallback} from "../ISwapCallback.sol"; +import {VaultErrors} from "../errors/VaultErrors.sol"; +import {VaultEvents} from "../events/VaultEvents.sol"; +import {IOrderManager} from "./IOrderManager.sol"; +import {VaultStorage, OrderInfo} from "./VaultStorage.sol"; +import {Constants} from "../lib/Constants.sol"; +import {ITermMaxVault} from "./ITermMaxVault.sol"; + +contract TermMaxVault is + VaultStorage, + ITermMaxVault, + Ownable2StepUpgradeable, + ReentrancyGuardUpgradeable, + ERC4626Upgradeable, + PausableUpgradeable, + VaultErrors, + VaultEvents, + ISwapCallback +{ + using SafeCast for uint256; + using TransferUtils for IERC20; + using PendingLib for *; + + address public immutable ORDER_MANAGER_SINGLETON; + + modifier onlyCuratorRole() { + address sender = _msgSender(); + if (sender != _curator && sender != owner()) revert NotCuratorRole(); + _; + } + + /// @dev Reverts if the caller doesn't have the guardian role. + modifier onlyGuardianRole() { + address sender = _msgSender(); + if (sender != _guardian && sender != owner()) revert NotGuardianRole(); + + _; + } + + /// @dev Reverts if the caller doesn't have the allocator role. + modifier onlyAllocatorRole() { + address sender = _msgSender(); + if (!_isAllocator[sender] && sender != _curator && sender != owner()) { + revert NotAllocatorRole(); + } + _; + } + + modifier marketIsWhitelisted(address market) { + if (_pendingMarkets[market].validAt != 0 && block.timestamp > _pendingMarkets[market].validAt) { + _marketWhitelist[market] = true; + } + if (!_marketWhitelist[market]) revert MarketNotWhitelisted(); + _; + } + + /// @dev Makes sure conditions are met to accept a pending value. + /// @dev Reverts if: + /// - there's no pending value; + /// - the timelock has not elapsed since the pending value has been submitted. + modifier afterTimelock(uint256 validAt) { + if (validAt == 0) revert NoPendingValue(); + if (block.timestamp < validAt) revert TimelockNotElapsed(); + _; + } + + constructor(address ORDER_MANAGER_SINGLETON_) { + if (ORDER_MANAGER_SINGLETON_ == address(0)) revert InvalidImplementation(); + ORDER_MANAGER_SINGLETON = ORDER_MANAGER_SINGLETON_; + _disableInitializers(); + } + + function initialize(VaultInitialParams memory params) external initializer { + __ERC20_init(params.name, params.symbol); + __Ownable_init(params.admin); + __ERC4626_init(params.asset); + __ReentrancyGuard_init(); + __Pausable_init(); + + _setPerformanceFeeRate(params.performanceFeeRate); + _checkTimelockBounds(params.timelock); + _timelock = params.timelock; + _maxCapacity = params.maxCapacity; + _curator = params.curator; + } + + function _setPerformanceFeeRate(uint64 newPerformanceFeeRate) internal { + _delegateCall(abi.encodeCall(IOrderManager.accruedInterest, ())); + _performanceFeeRate = newPerformanceFeeRate; + } + + /// @notice View functions + + /** + * @inheritdoc ITermMaxVault + */ + function guardian() external view returns (address) { + return _guardian; + } + + /** + * @inheritdoc ITermMaxVault + */ + function curator() external view returns (address) { + return _curator; + } + + /** + * @inheritdoc ITermMaxVault + */ + function isAllocator(address allocator) external view returns (bool) { + return _isAllocator[allocator]; + } + + /** + * @inheritdoc ITermMaxVault + */ + function marketWhitelist(address market) external view returns (bool) { + return _marketWhitelist[market]; + } + + /** + * @inheritdoc ITermMaxVault + */ + function timelock() external view returns (uint256) { + return _timelock; + } + + /** + * @inheritdoc ITermMaxVault + */ + function pendingMarkets(address market) external view returns (PendingUint192 memory) { + return _pendingMarkets[market]; + } + + /** + * @inheritdoc ITermMaxVault + */ + function pendingTimelock() external view returns (PendingUint192 memory) { + return _pendingTimelock; + } + + /** + * @inheritdoc ITermMaxVault + */ + function pendingPerformanceFeeRate() external view returns (PendingUint192 memory) { + return _pendingPerformanceFeeRate; + } + + /** + * @inheritdoc ITermMaxVault + */ + function pendingGuardian() external view returns (PendingAddress memory) { + return _pendingGuardian; + } + + /** + * @inheritdoc ITermMaxVault + */ + function performanceFeeRate() external view returns (uint64) { + return _performanceFeeRate; + } + + /** + * @inheritdoc ITermMaxVault + */ + function totalFt() external view returns (uint256) { + return _totalFt / Constants.DECIMAL_BASE_SQ; + } + + /** + * @inheritdoc ITermMaxVault + */ + function accretingPrincipal() external view returns (uint256) { + (uint256 ap,) = _previewAccruedInterest(); + return ap / Constants.DECIMAL_BASE_SQ; + } + + /** + * @inheritdoc ITermMaxVault + */ + function annualizedInterest() external view returns (uint256) { + return _annualizedInterest / Constants.DECIMAL_BASE_SQ; + } + + /** + * @inheritdoc ITermMaxVault + */ + function performanceFee() external view returns (uint256) { + (, uint256 pf) = _previewAccruedInterest(); + return pf / Constants.DECIMAL_BASE_SQ; + } + + /** + * @inheritdoc ITermMaxVault + */ + function supplyQueue(uint256 index) external view returns (address) { + return _supplyQueue[index]; + } + + /** + * @inheritdoc ITermMaxVault + */ + function withdrawQueue(uint256 index) external view returns (address) { + return _withdrawQueue[index]; + } + + /** + * @inheritdoc ITermMaxVault + */ + function orderMapping(address order) external view returns (OrderInfo memory) { + return _orderMapping[order]; + } + + /** + * @inheritdoc ITermMaxVault + */ + function badDebtMapping(address collateral) external view returns (uint256) { + return _badDebtMapping[collateral]; + } + + /** + * @inheritdoc ITermMaxVault + */ + function apr() external view returns (uint256) { + if (_accretingPrincipal == 0) return 0; + return (_annualizedInterest * (Constants.DECIMAL_BASE - _performanceFeeRate)) / (_accretingPrincipal); + } + + /** + * @inheritdoc ITermMaxVault + */ + function supplyQueueLength() external view returns (uint256) { + return _supplyQueue.length; + } + + /** + * @inheritdoc ITermMaxVault + */ + function withdrawQueueLength() external view returns (uint256) { + return _withdrawQueue.length; + } + + // Ordermanager functions + /** + * @inheritdoc ITermMaxVault + */ + function createOrder(ITermMaxMarket market, uint256 maxSupply, uint256 initialReserve, CurveCuts memory curveCuts) + external + onlyCuratorRole + marketIsWhitelisted(address(market)) + whenNotPaused + returns (ITermMaxOrder order) + { + order = abi.decode( + _delegateCall( + abi.encodeCall( + IOrderManager.createOrder, (IERC20(asset()), market, maxSupply, initialReserve, curveCuts) + ) + ), + (ITermMaxOrder) + ); + } + + /** + * @inheritdoc ITermMaxVault + */ + function updateOrders( + ITermMaxOrder[] memory orders, + int256[] memory changes, + uint256[] memory maxSupplies, + CurveCuts[] memory curveCuts + ) external onlyCuratorRole whenNotPaused { + _delegateCall( + abi.encodeCall(IOrderManager.updateOrders, (IERC20(asset()), orders, changes, maxSupplies, curveCuts)) + ); + } + + /** + * @inheritdoc ITermMaxVault + */ + function redeemOrder(ITermMaxOrder order) external onlyCuratorRole { + _delegateCall(abi.encodeCall(IOrderManager.redeemOrder, (order))); + } + + /** + * @inheritdoc ITermMaxVault + */ + function withdrawPerformanceFee(address recipient, uint256 amount) + external + nonReentrant + whenNotPaused + onlyCuratorRole + { + _delegateCall(abi.encodeCall(IOrderManager.withdrawPerformanceFee, (IERC20(asset()), recipient, amount))); + } + + // ERC4626 functions + + /** + * @dev See {IERC4626-maxDeposit}. + */ + function maxDeposit(address) public view override(IERC4626, ERC4626Upgradeable) returns (uint256) { + if (paused()) return 0; + if (totalAssets() >= _maxCapacity) return 0; + return _maxCapacity - totalAssets(); + } + + /** + * @dev See {IERC4626-maxMint}. + */ + function maxMint(address) public view override(IERC4626, ERC4626Upgradeable) returns (uint256) { + if (paused()) return 0; + return convertToShares(maxDeposit(address(0))); + } + + /** + * @dev Get total assets, falling back to real assets if virtual assets exceed limit + */ + function totalAssets() public view override(IERC4626, ERC4626Upgradeable) returns (uint256) { + (uint256 previewPrincipal,) = _previewAccruedInterest(); + return previewPrincipal / Constants.DECIMAL_BASE_SQ; + } + + /** + * @dev Deposit/mint common workflow. + */ + function _deposit(address caller, address recipient, uint256 assets, uint256 shares) + internal + override + nonReentrant + whenNotPaused + { + IERC20(asset()).safeTransferFrom(caller, address(this), assets); + + _delegateCall(abi.encodeCall(IOrderManager.depositAssets, (IERC20(asset()), assets))); + _mint(recipient, shares); + + emit Deposit(caller, recipient, assets, shares); + } + + /** + * @dev Withdraw/redeem common workflow. + */ + function _withdraw(address caller, address receiver, address owner, uint256 assets, uint256 shares) + internal + override + nonReentrant + { + if (caller != owner) { + _spendAllowance(owner, caller, shares); + } + + _delegateCall(abi.encodeCall(IOrderManager.withdrawAssets, (IERC20(asset()), receiver, assets))); + _burn(owner, shares); + + emit Withdraw(caller, receiver, owner, assets, shares); + } + + function _delegateCall(bytes memory data) internal returns (bytes memory) { + (bool success, bytes memory returnData) = ORDER_MANAGER_SINGLETON.delegatecall(data); + if (!success) { + assembly { + let ptr := add(returnData, 0x20) + let len := mload(returnData) + revert(ptr, len) + } + } + return returnData; + } + + /** + * @inheritdoc ITermMaxVault + */ + function dealBadDebt(address collateral, uint256 badDebtAmt, address recipient, address owner) + external + nonReentrant + returns (uint256 shares, uint256 collateralOut) + { + address caller = msg.sender; + shares = previewWithdraw(badDebtAmt); + uint256 maxShares = maxRedeem(owner); + if (shares > maxShares) { + revert ERC4626ExceededMaxMint(recipient, shares, maxShares); + } + + if (caller != owner) { + _spendAllowance(owner, caller, shares); + } + + _burn(owner, shares); + + collateralOut = abi.decode( + _delegateCall(abi.encodeCall(IOrderManager.dealBadDebt, (recipient, collateral, badDebtAmt))), (uint256) + ); + + emit DealBadDebt(caller, recipient, collateral, badDebtAmt, shares, collateralOut); + } + + // Guardian functions + function _setTimelock(uint256 newTimelock) internal { + _timelock = newTimelock; + + emit SetTimelock(msg.sender, newTimelock); + + delete _pendingTimelock; + } + + /** + * @inheritdoc ITermMaxVault + */ + function submitTimelock(uint256 newTimelock) external onlyCuratorRole { + if (newTimelock == _timelock) revert AlreadySet(); + if (_pendingTimelock.validAt != 0) revert AlreadyPending(); + _checkTimelockBounds(newTimelock); + + if (newTimelock > _timelock) { + _setTimelock(newTimelock); + } else { + // Safe "unchecked" cast because newTimelock <= MAX_TIMELOCK. + _pendingTimelock.update(uint184(newTimelock), _timelock); + + emit SubmitTimelock(newTimelock, _pendingTimelock.validAt); + } + } + + /** + * @inheritdoc ITermMaxVault + */ + function setCapacity(uint256 newCapacity) external onlyCuratorRole { + if (newCapacity == _maxCapacity) revert AlreadySet(); + _maxCapacity = newCapacity; + emit SetCapacity(_msgSender(), newCapacity); + } + + function _checkTimelockBounds(uint256 newTimelock) internal pure { + if (newTimelock > VaultConstants.MAX_TIMELOCK) revert AboveMaxTimelock(); + if (newTimelock < VaultConstants.POST_INITIALIZATION_MIN_TIMELOCK) revert BelowMinTimelock(); + } + + /** + * @inheritdoc ITermMaxVault + */ + function submitPerformanceFeeRate(uint184 newPerformanceFeeRate) external onlyCuratorRole { + if (newPerformanceFeeRate == _performanceFeeRate) revert AlreadySet(); + if (_pendingPerformanceFeeRate.validAt != 0) revert AlreadyPending(); + if (newPerformanceFeeRate > VaultConstants.MAX_PERFORMANCE_FEE_RATE) revert PerformanceFeeRateExceeded(); + if (newPerformanceFeeRate < _performanceFeeRate) { + _setPerformanceFeeRate(uint256(newPerformanceFeeRate).toUint64()); + emit SetPerformanceFeeRate(_msgSender(), newPerformanceFeeRate); + return; + } else { + _pendingPerformanceFeeRate.update(newPerformanceFeeRate, _timelock); + emit SubmitPerformanceFeeRate(newPerformanceFeeRate, _pendingPerformanceFeeRate.validAt); + } + } + + /** + * @inheritdoc ITermMaxVault + */ + function submitGuardian(address newGuardian) external onlyOwner { + if (newGuardian == _guardian) revert AlreadySet(); + if (_pendingGuardian.validAt != 0) revert AlreadyPending(); + + if (_guardian == address(0)) { + _setGuardian(newGuardian); + } else { + _pendingGuardian.update(newGuardian, _timelock); + emit SubmitGuardian(newGuardian, _pendingGuardian.validAt); + } + } + + /// @dev Sets `guardian` to `newGuardian`. + function _setGuardian(address newGuardian) internal { + _guardian = newGuardian; + emit SetGuardian(_msgSender(), newGuardian); + + delete _pendingGuardian; + } + + /** + * @inheritdoc ITermMaxVault + */ + function submitMarket(address market, bool isWhitelisted) external onlyCuratorRole { + if (_marketWhitelist[market] && isWhitelisted) revert AlreadySet(); + if (_pendingMarkets[market].validAt != 0) revert AlreadyPending(); + if (!isWhitelisted) { + _setMarketWhitelist(market, isWhitelisted); + } else { + _pendingMarkets[market].update(0, _timelock); + emit SubmitMarketToWhitelist(market, _pendingMarkets[market].validAt); + } + } + + function _setMarketWhitelist(address market, bool isWhitelisted) internal { + _marketWhitelist[market] = isWhitelisted; + emit SetMarketWhitelist(_msgSender(), market, isWhitelisted); + delete _pendingMarkets[market]; + } + + /** + * @inheritdoc ITermMaxVault + */ + function setIsAllocator(address newAllocator, bool newIsAllocator) external onlyOwner { + if (_isAllocator[newAllocator] == newIsAllocator) revert AlreadySet(); + + _isAllocator[newAllocator] = newIsAllocator; + + emit SetIsAllocator(newAllocator, newIsAllocator); + } + + /** + * @inheritdoc ITermMaxVault + */ + function setCurator(address newCurator) external onlyOwner { + if (newCurator == _curator) revert AlreadySet(); + + _curator = newCurator; + + emit SetCurator(newCurator); + } + + /** + * @inheritdoc ITermMaxVault + */ + function updateSupplyQueue(uint256[] memory indexes) external onlyAllocatorRole { + _updateSupplyQueue(indexes); + } + + /** + * @inheritdoc ITermMaxVault + */ + function updateWithdrawQueue(uint256[] memory indexes) external onlyAllocatorRole { + _updateWithdrawQueue(indexes); + } + + function _updateWithdrawQueue(uint256[] memory indexes) internal { + uint256 length = _withdrawQueue.length; + if (indexes.length != length) { + revert WithdrawQueueLengthMismatch(); + } + bool[] memory seen = new bool[](length); + address[] memory newWithdrawQueue = new address[](length); + + for (uint256 i; i < length; ++i) { + uint256 prevIndex = indexes[i]; + + // If prevIndex >= currLength, it will revert with native "Index out of bounds". + address order = _withdrawQueue[prevIndex]; + if (seen[prevIndex]) revert DuplicateOrder(order); + seen[prevIndex] = true; + + newWithdrawQueue[i] = order; + } + _withdrawQueue = newWithdrawQueue; + + emit UpdateWithdrawQueue(msg.sender, newWithdrawQueue); + } + + function _updateSupplyQueue(uint256[] memory indexes) internal { + uint256 length = _supplyQueue.length; + if (indexes.length != length) { + revert SupplyQueueLengthMismatch(); + } + bool[] memory seen = new bool[](length); + address[] memory newSupplyQueue = new address[](length); + + for (uint256 i; i < length; ++i) { + uint256 prevIndex = indexes[i]; + + // If prevIndex >= currLength, it will revert with native "Index out of bounds". + address order = _supplyQueue[prevIndex]; + if (seen[prevIndex]) revert DuplicateOrder(order); + seen[prevIndex] = true; + + newSupplyQueue[i] = order; + } + _supplyQueue = newSupplyQueue; + + emit UpdateSupplyQueue(msg.sender, newSupplyQueue); + } + + /** + * Revoke functions + */ + + /** + * @inheritdoc ITermMaxVault + */ + function revokePendingTimelock() external onlyGuardianRole { + delete _pendingTimelock; + + emit RevokePendingTimelock(_msgSender()); + } + + /** + * @inheritdoc ITermMaxVault + */ + function revokePendingGuardian() external onlyGuardianRole { + delete _pendingGuardian; + + emit RevokePendingGuardian(_msgSender()); + } + + /** + * @inheritdoc ITermMaxVault + */ + function revokePendingMarket(address market) external onlyGuardianRole { + delete _pendingMarkets[market]; + + emit RevokePendingMarket(_msgSender(), market); + } + + /** + * @inheritdoc ITermMaxVault + */ + function revokePendingPerformanceFeeRate() external onlyGuardianRole { + delete _pendingPerformanceFeeRate; + + emit RevokePendingPerformanceFeeRate(_msgSender()); + } + + /** + * @inheritdoc ITermMaxVault + */ + function acceptTimelock() external afterTimelock(_pendingTimelock.validAt) { + _setTimelock(_pendingTimelock.value); + } + + /** + * @inheritdoc ITermMaxVault + */ + function acceptGuardian() external afterTimelock(_pendingGuardian.validAt) { + _setGuardian(_pendingGuardian.value); + } + + /** + * @inheritdoc ITermMaxVault + */ + function acceptMarket(address market) external afterTimelock(_pendingMarkets[market].validAt) { + _setMarketWhitelist(market, true); + } + + /** + * @inheritdoc ITermMaxVault + */ + function acceptPerformanceFeeRate() external afterTimelock(_pendingPerformanceFeeRate.validAt) { + _setPerformanceFeeRate(uint256(_pendingPerformanceFeeRate.value).toUint64()); + delete _pendingPerformanceFeeRate; + emit SetPerformanceFeeRate(_msgSender(), _performanceFeeRate); + } + + /** + * @notice Pauses the contract + */ + function pause() external onlyOwner { + _pause(); + // pause orders + for (uint256 i = 0; i < _supplyQueue.length; ++i) { + ITermMaxOrder(_supplyQueue[i]).pause(); + } + } + + /** + * @notice Unpauses the contract + */ + function unpause() external onlyOwner { + _unpause(); + // unpause orders + for (uint256 i = 0; i < _supplyQueue.length; ++i) { + ITermMaxOrder(_supplyQueue[i]).unpause(); + } + } + + function _previewAccruedInterest() + internal + view + returns (uint256 previewPrincipal, uint256 previewPerformanceFee) + { + uint64 currentTime = block.timestamp.toUint64(); + + uint256 lastTime = _lastUpdateTime; + if (lastTime == 0) { + return (_accretingPrincipal, _performanceFee); + } + uint64 recentMaturity = _maturityMapping[0]; + uint256 previewAnnualizedInterest = _annualizedInterest; + previewPrincipal = _accretingPrincipal; + previewPerformanceFee = _performanceFee; + + while (currentTime >= recentMaturity && recentMaturity != 0) { + (uint256 previewInterest, uint256 previewPerformanceFeeToCurator) = + _previewAccruedPeriodInterest(lastTime, recentMaturity, previewAnnualizedInterest); + lastTime = recentMaturity; + uint64 nextMaturity = _maturityMapping[recentMaturity]; + // update annualized interest + previewAnnualizedInterest -= _maturityToInterest[recentMaturity]; + + previewPerformanceFee += previewPerformanceFeeToCurator; + previewPrincipal += previewInterest; + + recentMaturity = nextMaturity; + } + if (recentMaturity > 0) { + (uint256 previewInterest, uint256 previewPerformanceFeeToCurator) = + _previewAccruedPeriodInterest(lastTime, currentTime, previewAnnualizedInterest); + previewPerformanceFee += previewPerformanceFeeToCurator; + previewPrincipal += previewInterest; + } + } + + function _previewAccruedPeriodInterest(uint256 startTime, uint256 endTime, uint256 previewAnnualizedInterest) + internal + view + returns (uint256, uint256) + { + uint256 interest = (previewAnnualizedInterest * (endTime - startTime)) / 365 days; + uint256 performanceFeeToCurator = (interest * _performanceFeeRate) / Constants.DECIMAL_BASE; + return (interest - performanceFeeToCurator, performanceFeeToCurator); + } + + /// @notice Callback function for the swap + /// @param deltaFt The change in the ft balance of the order + function afterSwap(uint256 ftReserve, uint256 xtReserve, int256 deltaFt, int256) external override { + _delegateCall(abi.encodeCall(IOrderManager.afterSwap, (ftReserve, xtReserve, deltaFt))); + } +} diff --git a/contracts/v1/vault/VaultStorage.sol b/contracts/v1/vault/VaultStorage.sol new file mode 100644 index 0000000..ab2f756 --- /dev/null +++ b/contracts/v1/vault/VaultStorage.sol @@ -0,0 +1,58 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {ITermMaxMarket} from "../ITermMaxMarket.sol"; +import {PendingAddress, PendingUint192} from "../lib/PendingLib.sol"; + +struct OrderInfo { + ITermMaxMarket market; + IERC20 ft; + IERC20 xt; + uint128 maxSupply; + uint64 maturity; +} + +contract VaultStorage { + // State variables + address internal _guardian; + address internal _curator; + + mapping(address => bool) internal _isAllocator; + mapping(address => bool) internal _marketWhitelist; + mapping(address => PendingUint192) internal _pendingMarkets; + + PendingUint192 internal _pendingTimelock; + PendingUint192 internal _pendingPerformanceFeeRate; + PendingAddress internal _pendingGuardian; + + uint256 internal _timelock; + uint256 internal _maxCapacity; + + /// @dev The total ft in the vault + uint256 internal _totalFt; + /// @notice The locked ft = accretingPrincipal + performanceFee; + uint256 internal _accretingPrincipal; + /// @notice The performance fee is paid to the curators + uint256 internal _performanceFee; + /// @notice Annualize the interest income + uint256 internal _annualizedInterest; + + uint64 internal _performanceFeeRate; + + address[] internal _supplyQueue; + address[] internal _withdrawQueue; + + /// @dev A mapping from collateral address to bad debt + mapping(address => uint256) internal _badDebtMapping; + mapping(address => OrderInfo) internal _orderMapping; + + /// @dev The last time the interest was accurately calculated + uint64 internal _lastUpdateTime; + /// @dev A one-way linked list presented using a mapping structure, recorded in order according to matiruty + /// @dev The key is the maturity, and the value is the next maturity + /// Etc. day 0 => day 1 => day 2 => day 3 => ... + mapping(uint64 => uint64) internal _maturityMapping; + /// @dev A mapping from maturity to its annualized interest + mapping(uint64 => uint256) internal _maturityToInterest; +} From 3a021ad051420a4164e5a3338c31fa138da4a236 Mon Sep 17 00:00:00 2001 From: Evan Date: Wed, 28 May 2025 11:06:43 +0800 Subject: [PATCH 042/194] fix pt oracle issues --- contracts/oracle/OracleAggregator.sol | 3 +- .../oracle/priceFeeds/TermMaxPTPriceFeed.sol | 15 ++++- contracts/vault/TermMaxVault.sol | 1 - test/integration/ForkPriceFeed.t.sol | 58 +++++++++++++++++++ 4 files changed, 71 insertions(+), 6 deletions(-) create mode 100644 test/integration/ForkPriceFeed.t.sol diff --git a/contracts/oracle/OracleAggregator.sol b/contracts/oracle/OracleAggregator.sol index 02c2f88..e955175 100644 --- a/contracts/oracle/OracleAggregator.sol +++ b/contracts/oracle/OracleAggregator.sol @@ -4,11 +4,10 @@ pragma solidity ^0.8.27; /** * @title OracleAggregator * @notice This contract references design concepts from AAVE's oracle system - * @dev Implements price feed aggregation with primary and backup oracles, + * @dev Implements price feed aggregation with primary and backup oracles, * staleness checks via heartbeats, and governance-controlled updates with timelocks * similar to AAVE's oracle architecture */ - import {Ownable2Step, Ownable} from "@openzeppelin/contracts/access/Ownable2Step.sol"; import {AggregatorV3Interface, IOracle} from "./IOracle.sol"; diff --git a/contracts/oracle/priceFeeds/TermMaxPTPriceFeed.sol b/contracts/oracle/priceFeeds/TermMaxPTPriceFeed.sol index abd2a39..f6c55d5 100644 --- a/contracts/oracle/priceFeeds/TermMaxPTPriceFeed.sol +++ b/contracts/oracle/priceFeeds/TermMaxPTPriceFeed.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.27; import {PendlePYLpOracle} from "@pendle/core-v2/contracts/oracles/PtYtLpOracle/PendlePYLpOracle.sol"; import {PendlePYOracleLib} from "@pendle/core-v2/contracts/oracles/PtYtLpOracle/PendlePYOracleLib.sol"; import {PMath} from "@pendle/core-v2/contracts/core/libraries/math/PMath.sol"; -import {IPMarket, IPPrincipalToken} from "@pendle/core-v2/contracts/interfaces/IPMarket.sol"; +import {IPMarket, IPPrincipalToken, IStandardizedYield} from "@pendle/core-v2/contracts/interfaces/IPMarket.sol"; import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; import {Math} from "@openzeppelin/contracts/utils/math/Math.sol"; @@ -30,6 +30,8 @@ contract TermMaxPTPriceFeed is ITermMaxPriceFeed { AggregatorV3Interface public immutable PRICE_FEED; address public immutable asset; + uint256 private immutable PT_TO_SY_RATE_BASE; + // error to call `getRoundData` function error GetRoundDataNotSupported(); // error when Pendle PY LP oracle is not ready @@ -52,7 +54,14 @@ contract TermMaxPTPriceFeed is ITermMaxPriceFeed { MARKET = IPMarket(market); DURATION = duration; PRICE_FEED = AggregatorV3Interface(priceFeed); - (, IPPrincipalToken _PT,) = MARKET.readTokens(); + (IStandardizedYield _SY, IPPrincipalToken _PT,) = MARKET.readTokens(); + uint8 syDecimals = _SY.decimals(); + uint8 ptDecimals = _PT.decimals(); + if (syDecimals < ptDecimals) { + PT_TO_SY_RATE_BASE = PMath.ONE / (10 ** (ptDecimals - syDecimals)); + } else { + PT_TO_SY_RATE_BASE = PMath.ONE * (10 ** (syDecimals - ptDecimals)); + } asset = address(_PT); if (!_oracleIsReady()) revert OracleIsNotReady(); } @@ -92,7 +101,7 @@ contract TermMaxPTPriceFeed is ITermMaxPriceFeed { uint256 ptRateInSy = MARKET.getPtToSyRate(DURATION); // PT -> SY (roundId, answer, startedAt, updatedAt, answeredInRound) = PRICE_FEED.latestRoundData(); - answer = ptRateInSy.mulDiv(answer.toUint256(), PMath.ONE).toInt256(); + answer = ptRateInSy.mulDiv(answer.toUint256(), PT_TO_SY_RATE_BASE).toInt256(); return (roundId, answer, startedAt, updatedAt, answeredInRound); } diff --git a/contracts/vault/TermMaxVault.sol b/contracts/vault/TermMaxVault.sol index be18978..2e3f400 100644 --- a/contracts/vault/TermMaxVault.sol +++ b/contracts/vault/TermMaxVault.sol @@ -7,7 +7,6 @@ pragma solidity ^0.8.27; * @dev The role management structure is based on Morpho's role system (https://docs.morpho.org/curation/concepts/roles/) * with similar separation of curator, guardian, and allocator roles for enhanced governance and risk management. */ - import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; diff --git a/test/integration/ForkPriceFeed.t.sol b/test/integration/ForkPriceFeed.t.sol new file mode 100644 index 0000000..ffa1d3d --- /dev/null +++ b/test/integration/ForkPriceFeed.t.sol @@ -0,0 +1,58 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; +import {ITermMaxMarket} from "contracts/ITermMaxMarket.sol"; +import {ITermMaxOrder} from "contracts/ITermMaxOrder.sol"; +import {SwapUnit, ITermMaxRouter, TermMaxRouter} from "contracts/router/TermMaxRouter.sol"; +import { + IGearingToken, + GearingTokenEvents, + AbstractGearingToken, + GtConfig +} from "contracts/tokens/AbstractGearingToken.sol"; +import {PendleSwapV3Adapter} from "contracts/router/swapAdapters/PendleSwapV3Adapter.sol"; +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; +import {IOracle} from "contracts/oracle/IOracleV1.sol"; +import { + ForkBaseTest, + TermMaxFactory, + MarketConfig, + IERC20, + MarketInitialParams, + IERC20Metadata +} from "test/mainnet-fork/ForkBaseTest.sol"; +import {TermMaxPriceFeedFactory} from "contracts/factory/TermMaxPriceFeedFactory.sol"; +import {console} from "forge-std/console.sol"; + +interface TestOracle is IOracle { + function acceptPendingOracle(address asset) external; + function oracles(address asset) external returns (address aggregator, address backupAggregator, uint32 heartbeat); +} + +contract ForkPriceFeed is ForkBaseTest { + string MAINNET_RPC_URL = vm.envString("MAINNET_RPC_URL"); + string DATA_PATH = string.concat(vm.projectRoot(), "/test/testdata/fork/mainnet.json"); + + function _getForkRpcUrl() internal view override returns (string memory) { + return MAINNET_RPC_URL; + } + + function _getDataPath() internal view override returns (string memory) { + return DATA_PATH; + } + + function _finishSetup() internal override {} + + function testPriceFeed() public { + TermMaxPriceFeedFactory priceFeedFactory = new TermMaxPriceFeedFactory(); + address pendlePYLpOracle = 0x9a9Fa8338dd5E5B2188006f1Cd2Ef26d921650C2; + address ptMarket = 0x266728b30c98B24De810E3325aDC615486988Cb2; + address mMEVToUsd = 0x5f09Aff8B9b1f488B7d1bbaD4D89648579e55d61; + AggregatorV3Interface ptFeed = + AggregatorV3Interface(priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, ptMarket, 900, mMEVToUsd)); + (, int256 answer,,,) = ptFeed.latestRoundData(); + console.log("pt_mMEV_31JUL2025 price feed address", address(ptFeed)); + console.log("pt_mMEV_31JUL2025 last answer", answer); + } +} From eb26cd3d414fb4ef40989bdae14bcde28d494b6e Mon Sep 17 00:00:00 2001 From: Evan Date: Wed, 28 May 2025 11:20:55 +0800 Subject: [PATCH 043/194] migration --- contracts/v1/router/MarketViewer.sol | 16 +- contracts/v2/ITermMaxMarketV2.sol | 18 + contracts/v2/TermMaxMarketV2.sol | 431 +++++++++++++++++++++++ contracts/v2/lib/MarketConstantsV2.sol | 9 + contracts/v2/tokens/IGearingTokenV2.sol | 24 ++ contracts/v2/tokens/IMintableERC20V2.sol | 17 + contracts/v2/tokens/MintableERC20V2.sol | 21 ++ 7 files changed, 530 insertions(+), 6 deletions(-) create mode 100644 contracts/v2/ITermMaxMarketV2.sol create mode 100644 contracts/v2/TermMaxMarketV2.sol create mode 100644 contracts/v2/lib/MarketConstantsV2.sol create mode 100644 contracts/v2/tokens/IGearingTokenV2.sol create mode 100644 contracts/v2/tokens/IMintableERC20V2.sol create mode 100644 contracts/v2/tokens/MintableERC20V2.sol diff --git a/contracts/v1/router/MarketViewer.sol b/contracts/v1/router/MarketViewer.sol index 08e13e0..0f1a220 100644 --- a/contracts/v1/router/MarketViewer.sol +++ b/contracts/v1/router/MarketViewer.sol @@ -21,6 +21,7 @@ interface IPausable { contract MarketViewer { using Math for uint256; + struct LoanPosition { uint256 loanId; uint256 collateralAmt; @@ -45,7 +46,7 @@ contract MarketViewer { uint256 xtBalance; LoanPosition[] gtInfo; } - + struct VaultPosition { uint256 balance; uint256 toAssetBalance; @@ -141,7 +142,7 @@ contract MarketViewer { (,, IGearingToken gt,,) = market.tokens(); uint256 balance = gt.balanceOf(owner); LoanPosition[] memory loanPositionsTmp = new LoanPosition[](balance); - + uint256 validPositions = 0; for (uint256 i = 0; i < balance; ++i) { uint256 loanId = gt.tokenOfOwnerByIndex(owner, i); @@ -167,7 +168,7 @@ contract MarketViewer { GtConfig memory config = gtNft.getGtConfig(); uint256 supply = gtNft.totalSupply(); LoanPositionV2[] memory loanPositionsTmp = new LoanPositionV2[](supply); - + uint256 validPositions = 0; for (uint256 i = 0; i < supply; ++i) { uint256 loanId = gtNft.tokenByIndex(i); @@ -189,9 +190,8 @@ contract MarketViewer { // Skip this loan ID if loanInfo call fails continue; } - } - + LoanPositionV2[] memory loanPositions = new LoanPositionV2[](validPositions); for (uint256 i = 0; i < validPositions; i++) { loanPositions[i] = loanPositionsTmp[i]; @@ -199,7 +199,11 @@ contract MarketViewer { return loanPositions; } - function getVaultBalance(address user, ITermMaxVault[] memory vaults, OracleAggregator oracleAggregator) external view returns (VaultPosition[] memory) { + function getVaultBalance(address user, ITermMaxVault[] memory vaults, OracleAggregator oracleAggregator) + external + view + returns (VaultPosition[] memory) + { VaultPosition[] memory vaultPositions = new VaultPosition[](vaults.length); for (uint256 i = 0; i < vaults.length; i++) { address asset = vaults[i].asset(); diff --git a/contracts/v2/ITermMaxMarketV2.sol b/contracts/v2/ITermMaxMarketV2.sol new file mode 100644 index 0000000..5104606 --- /dev/null +++ b/contracts/v2/ITermMaxMarketV2.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title TermMax Market V2 interface + * @author Term Structure Labs + */ +interface ITermMaxMarketV2 { + function name() external view returns (string memory); + + function burn(address owner, address recipient, uint256 debtTokenAmt) external; + + function leverageByXt(address xtOwner, address recipient, uint128 xtAmt, bytes calldata callbackData) + external + returns (uint256 gtId); + + function redeem(address ftOwner, address recipient, uint256 ftAmount) external returns (uint256, bytes memory); +} diff --git a/contracts/v2/TermMaxMarketV2.sol b/contracts/v2/TermMaxMarketV2.sol new file mode 100644 index 0000000..b4ccb95 --- /dev/null +++ b/contracts/v2/TermMaxMarketV2.sol @@ -0,0 +1,431 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.27; + +import { + OwnableUpgradeable, + Ownable2StepUpgradeable +} from "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; +import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; +import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol"; +import {ITermMaxMarketV2} from "./ITermMaxMarketV2.sol"; +import {IGearingToken} from "../v1/tokens/IGearingToken.sol"; +import {IFlashLoanReceiver} from "../v1/IFlashLoanReceiver.sol"; +import {ITermMaxOrder} from "../v1/ITermMaxOrder.sol"; +import {Constants} from "../v1/lib/Constants.sol"; +import {MarketConstantsV2} from "./lib/MarketConstantsV2.sol"; +import {MarketErrors} from "../v1/errors/MarketErrors.sol"; +import {MarketEvents} from "../v1/events/MarketEvents.sol"; +import {StringUtil} from "../v1/lib/StringUtil.sol"; +import {MarketConfig, MarketInitialParams, GtConfig, CurveCuts, FeeConfig} from "../v1/storage/TermMaxStorage.sol"; +import {ISwapCallback} from "../v1/ISwapCallback.sol"; +import {TransferUtils} from "../v1/lib/TransferUtils.sol"; +import {ITermMaxMarket, IMintableERC20, IERC20} from "../v1/ITermMaxMarket.sol"; +import {IMintableERC20V2} from "./tokens/IMintableERC20V2.sol"; + +/** + * @title TermMax Market V2 + * @author Term Structure Labs + */ +contract TermMaxMarketV2 is + ITermMaxMarket, + ITermMaxMarketV2, + ReentrancyGuardUpgradeable, + Ownable2StepUpgradeable, + MarketErrors, + MarketEvents +{ + using SafeCast for uint256; + using SafeCast for int256; + using TransferUtils for IERC20; + using TransferUtils for IMintableERC20; + using StringUtil for string; + + address immutable MINTABLE_ERC20_IMPLEMENT; + address immutable TERMMAX_ORDER_IMPLEMENT; + + MarketConfig private _config; + address private collateral; + IERC20 private debtToken; + IMintableERC20 private ft; + IMintableERC20 private xt; + IGearingToken private gt; + + string public name; + + /// @notice Check if the market is tradable + modifier isOpen() { + if (block.timestamp >= _config.maturity) { + revert TermIsNotOpen(); + } + _; + } + + constructor(address MINTABLE_ERC20_IMPLEMENT_, address TERMMAX_ORDER_IMPLEMENT_) { + MINTABLE_ERC20_IMPLEMENT = MINTABLE_ERC20_IMPLEMENT_; + TERMMAX_ORDER_IMPLEMENT = TERMMAX_ORDER_IMPLEMENT_; + _disableInitializers(); + } + + function mintGtFeeRatio() public view override returns (uint256) { + uint256 daysToMaturity = _daysToMaturity(_config.maturity); + return (daysToMaturity * uint256(_config.feeConfig.mintGtFeeRatio) * uint256(_config.feeConfig.mintGtFeeRef)) + / (Constants.DAYS_IN_YEAR * Constants.DECIMAL_BASE + uint256(_config.feeConfig.mintGtFeeRef) * daysToMaturity); + } + + /** + * @inheritdoc ITermMaxMarket + */ + function initialize(MarketInitialParams memory params) external override initializer { + __Ownable_init(params.admin); + __ReentrancyGuard_init(); + if (params.collateral == address(params.debtToken)) revert CollateralCanNotEqualUnderlyinng(); + MarketConfig memory config_ = params.marketConfig; + if (config_.maturity <= block.timestamp) revert InvalidMaturity(); + _checkFee(config_.feeConfig); + + debtToken = params.debtToken; + collateral = params.collateral; + _config = config_; + + (ft, xt, gt) = _deployTokens(params); + name = _contactString(MarketConstantsV2.PREFIX_MARKET, params.tokenName); + emit MarketInitialized(params.collateral, params.debtToken, _config.maturity, ft, xt, gt); + } + + function _deployTokens(MarketInitialParams memory params) + internal + returns (IMintableERC20 ft_, IMintableERC20 xt_, IGearingToken gt_) + { + ft_ = IMintableERC20(Clones.clone(MINTABLE_ERC20_IMPLEMENT)); + xt_ = IMintableERC20(Clones.clone(MINTABLE_ERC20_IMPLEMENT)); + gt_ = IGearingToken(Clones.clone(params.gtImplementation)); + uint8 decimals = params.debtToken.decimals(); + ft_.initialize( + MarketConstantsV2.PREFIX_FT.contact(params.tokenName), + MarketConstantsV2.PREFIX_FT.contact(params.tokenSymbol), + decimals + ); + xt_.initialize( + MarketConstantsV2.PREFIX_XT.contact(params.tokenName), + MarketConstantsV2.PREFIX_XT.contact(params.tokenSymbol), + decimals + ); + gt_.initialize( + MarketConstantsV2.PREFIX_GT.contact(params.tokenName), + MarketConstantsV2.PREFIX_GT.contact(params.tokenSymbol), + GtConfig( + params.collateral, + params.debtToken, + ft_, + params.marketConfig.treasurer, + params.marketConfig.maturity, + params.loanConfig + ), + params.gtInitalParams + ); + } + + function _contactString(string memory a, string memory b) internal pure returns (string memory) { + return string(abi.encodePacked(a, b)); + } + + /** + * @inheritdoc ITermMaxMarket + */ + function config() public view override returns (MarketConfig memory) { + return _config; + } + + /** + * @inheritdoc ITermMaxMarket + */ + function tokens() external view override returns (IMintableERC20, IMintableERC20, IGearingToken, address, IERC20) { + return (ft, xt, IGearingToken(gt), collateral, debtToken); + } + + /** + * @inheritdoc ITermMaxMarket + */ + function updateMarketConfig(MarketConfig calldata newConfig) external override onlyOwner { + MarketConfig memory mConfig = _config; + if (newConfig.treasurer != mConfig.treasurer) { + mConfig.treasurer = newConfig.treasurer; + gt.setTreasurer(newConfig.treasurer); + } + _checkFee(newConfig.feeConfig); + mConfig.feeConfig = newConfig.feeConfig; + + _config = mConfig; + emit UpdateMarketConfig(mConfig); + } + + function _checkFee(FeeConfig memory fee) internal pure { + if ( + fee.borrowTakerFeeRatio >= Constants.MAX_FEE_RATIO || fee.borrowMakerFeeRatio >= Constants.MAX_FEE_RATIO + || fee.lendTakerFeeRatio >= Constants.MAX_FEE_RATIO || fee.lendMakerFeeRatio >= Constants.MAX_FEE_RATIO + || fee.mintGtFeeRatio >= Constants.MAX_FEE_RATIO || fee.mintGtFeeRef > 5 * Constants.DECIMAL_BASE + ) revert FeeTooHigh(); + } + + /// @notice Calculate how many days until expiration + function _daysToMaturity(uint256 maturity) internal view returns (uint256 daysToMaturity) { + daysToMaturity = (maturity - block.timestamp + Constants.SECONDS_IN_DAY - 1) / Constants.SECONDS_IN_DAY; + } + + function mint(address recipient, uint256 debtTokenAmt) external override nonReentrant isOpen { + _mint(msg.sender, recipient, debtTokenAmt); + } + + function _mint(address caller, address recipient, uint256 debtTokenAmt) internal { + debtToken.safeTransferFrom(caller, address(this), debtTokenAmt); + + ft.mint(recipient, debtTokenAmt); + xt.mint(recipient, debtTokenAmt); + + emit Mint(caller, recipient, debtTokenAmt); + } + + /** + * @inheritdoc ITermMaxMarket + */ + function burn(address recipient, uint256 debtTokenAmt) external override nonReentrant isOpen { + _burn(msg.sender, msg.sender, recipient, debtTokenAmt); + } + + /** + * @inheritdoc ITermMaxMarketV2 + */ + function burn(address owner, address recipient, uint256 debtTokenAmt) external override nonReentrant isOpen { + _burn(owner, msg.sender, recipient, debtTokenAmt); + } + + function _burn(address owner, address spender, address recipient, uint256 debtTokenAmt) internal { + IMintableERC20V2(address(ft)).burn(owner, spender, debtTokenAmt); + IMintableERC20V2(address(xt)).burn(owner, spender, debtTokenAmt); + + debtToken.safeTransfer(recipient, debtTokenAmt); + + emit Burn(owner, recipient, debtTokenAmt); + } + + /** + * @inheritdoc ITermMaxMarket + */ + function leverageByXt(address recipient, uint128 xtAmt, bytes calldata callbackData) + external + override + nonReentrant + isOpen + returns (uint256 gtId) + { + return _leverageByXt(msg.sender, msg.sender, recipient, xtAmt, callbackData); + } + + /** + * @inheritdoc ITermMaxMarketV2 + */ + function leverageByXt(address xtOwner, address recipient, uint128 xtAmt, bytes calldata callbackData) + external + override + nonReentrant + isOpen + returns (uint256 gtId) + { + return _leverageByXt(xtOwner, msg.sender, recipient, xtAmt, callbackData); + } + + function _leverageByXt( + address xtOwner, + address loanReceiver, + address gtReceiver, + uint128 xtAmt, + bytes calldata callbackData + ) internal returns (uint256 gtId) { + // Send debt to borrower + debtToken.safeTransfer(loanReceiver, xtAmt); + // Callback function + bytes memory collateralData = + IFlashLoanReceiver(loanReceiver).executeOperation(gtReceiver, debtToken, xtAmt, callbackData); + + uint128 debt = ((xtAmt * Constants.DECIMAL_BASE) / (Constants.DECIMAL_BASE - mintGtFeeRatio())).toUint128(); + + MarketConfig memory mConfig = _config; + uint128 leverageFee = debt - xtAmt; + ft.mint(mConfig.treasurer, leverageFee); + + // Mint GT + gtId = gt.mint(loanReceiver, gtReceiver, debt, collateralData); + + IMintableERC20V2(address(xt)).burn(xtOwner, msg.sender, xtAmt); + emit LeverageByXt(loanReceiver, gtReceiver, gtId, debt, xtAmt, leverageFee, collateralData); + } + + /** + * @inheritdoc ITermMaxMarket + */ + function issueFt(address recipient, uint128 debt, bytes calldata collateralData) + external + override + nonReentrant + isOpen + returns (uint256 gtId, uint128 ftOutAmt) + { + return _issueFt(msg.sender, recipient, debt, collateralData); + } + + function _issueFt(address caller, address recipient, uint128 debt, bytes calldata collateralData) + internal + returns (uint256 gtId, uint128 ftOutAmt) + { + // Mint GT + gtId = gt.mint(caller, recipient, debt, collateralData); + + MarketConfig memory mConfig = _config; + uint128 issueFee = ((debt * mintGtFeeRatio()) / Constants.DECIMAL_BASE).toUint128(); + // Mint ft amount = debt amount, send issueFee to treasurer and other to caller + ft.mint(mConfig.treasurer, issueFee); + ftOutAmt = debt - issueFee; + ft.mint(recipient, ftOutAmt); + + emit IssueFt(caller, recipient, gtId, debt, ftOutAmt, issueFee, collateralData); + } + + /** + * @inheritdoc ITermMaxMarket + */ + function issueFtByExistedGt(address recipient, uint128 debt, uint256 gtId) + external + override + nonReentrant + isOpen + returns (uint128 ftOutAmt) + { + return _issueFtByExistedGt(msg.sender, recipient, debt, gtId); + } + + function _issueFtByExistedGt(address caller, address recipient, uint128 debt, uint256 gtId) + internal + returns (uint128 ftOutAmt) + { + gt.augmentDebt(caller, gtId, debt); + + MarketConfig memory mConfig = _config; + uint128 issueFee = ((debt * mintGtFeeRatio()) / Constants.DECIMAL_BASE).toUint128(); + // Mint ft amount = debt amount, send issueFee to treasurer and other to caller + ft.mint(mConfig.treasurer, issueFee); + ftOutAmt = debt - issueFee; + ft.mint(recipient, ftOutAmt); + + emit IssueFtByExistedGt(caller, recipient, gtId, debt, ftOutAmt, issueFee); + } + + /** + * @inheritdoc ITermMaxMarket + */ + function previewRedeem(uint256 ftAmount) + external + view + override + returns (uint256 debtTokenAmt, bytes memory deliveryData) + { + MarketConfig memory mConfig = _config; + { + uint256 liquidationDeadline = + gt.liquidatable() ? mConfig.maturity + Constants.LIQUIDATION_WINDOW : mConfig.maturity; + if (block.timestamp < liquidationDeadline) { + revert CanNotRedeemBeforeFinalLiquidationDeadline(liquidationDeadline); + } + } + + // The proportion that user will get how many debtToken and collateral should be deliveried + uint256 proportion = (ftAmount * Constants.DECIMAL_BASE_SQ) / (ft.totalSupply() - ft.balanceOf(address(this))); + + deliveryData = gt.previewDelivery(proportion); + + debtTokenAmt = ((debtToken.balanceOf(address(this))) * proportion) / Constants.DECIMAL_BASE_SQ; + } + + /** + * @inheritdoc ITermMaxMarket + */ + function redeem(uint256 ftAmount, address recipient) + external + virtual + override + nonReentrant + returns (uint256, bytes memory) + { + return _redeem(msg.sender, msg.sender, recipient, ftAmount); + } + + /** + * @inheritdoc ITermMaxMarketV2 + */ + function redeem(address ftOwner, address recipient, uint256 ftAmount) + external + virtual + override + nonReentrant + returns (uint256, bytes memory) + { + return _redeem(ftOwner, msg.sender, recipient, ftAmount); + } + + function _redeem(address ftOwner, address caller, address recipient, uint256 ftAmount) + internal + returns (uint256 debtTokenAmt, bytes memory deliveryData) + { + MarketConfig memory mConfig = _config; + { + uint256 liquidationDeadline = + gt.liquidatable() ? mConfig.maturity + Constants.LIQUIDATION_WINDOW : mConfig.maturity; + if (block.timestamp < liquidationDeadline) { + revert CanNotRedeemBeforeFinalLiquidationDeadline(liquidationDeadline); + } + } + // burn ft reserves(from repayment or liquidation) + uint256 ftReserve = ft.balanceOf(address(this)); + if (ftReserve > 0) { + IMintableERC20V2(address(ft)).burn(address(this), address(this), ftReserve); + } + + // The proportion that user will get how many debtToken and collateral should be deliveried + uint256 proportion = (ftAmount * Constants.DECIMAL_BASE_SQ) / ft.totalSupply(); + + // Burn ft + IMintableERC20V2(address(ft)).burn(ftOwner, caller, ftAmount); + + deliveryData = gt.delivery(proportion, recipient); + // Transfer debtToken output + debtTokenAmt += ((debtToken.balanceOf(address(this))) * proportion) / Constants.DECIMAL_BASE_SQ; + debtToken.safeTransfer(recipient, debtTokenAmt); + emit Redeem(caller, recipient, proportion.toUint128(), debtTokenAmt.toUint128(), deliveryData); + } + + /** + * @inheritdoc ITermMaxMarket + */ + function updateGtConfig(bytes memory configData) external override onlyOwner { + gt.updateConfig(configData); + } + + /** + * @inheritdoc ITermMaxMarket + */ + function createOrder(address maker, uint256 maxXtReserve, ISwapCallback swapTrigger, CurveCuts memory curveCuts) + external + nonReentrant + isOpen + returns (ITermMaxOrder order) + { + order = ITermMaxOrder(Clones.clone(TERMMAX_ORDER_IMPLEMENT)); + order.initialize(maker, [ft, xt, debtToken], gt, maxXtReserve, swapTrigger, curveCuts, _config); + emit CreateOrder(maker, order); + } + + function updateOrderFeeRate(ITermMaxOrder order, FeeConfig memory newFeeConfig) external onlyOwner { + _checkFee(newFeeConfig); + order.updateFeeConfig(newFeeConfig); + } +} diff --git a/contracts/v2/lib/MarketConstantsV2.sol b/contracts/v2/lib/MarketConstantsV2.sol new file mode 100644 index 0000000..ac631eb --- /dev/null +++ b/contracts/v2/lib/MarketConstantsV2.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library MarketConstantsV2 { + string constant PREFIX_FT = "FT:"; + string constant PREFIX_XT = "XT:"; + string constant PREFIX_GT = "GT:"; + string constant PREFIX_MARKET = "Termmax Market:"; +} diff --git a/contracts/v2/tokens/IGearingTokenV2.sol b/contracts/v2/tokens/IGearingTokenV2.sol new file mode 100644 index 0000000..de7c926 --- /dev/null +++ b/contracts/v2/tokens/IGearingTokenV2.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +/** + * @title TermMax Gearing token interface V2 + * @author Term Structure Labs + */ +interface IGearingTokenV2 { + /// @notice Repay the debt of Gearing Token, + /// the collateral will send by flashloan first. + /// @param id The id of Gearing Token + /// @param byDebtToken Repay using debtToken token or bonds token + /// @param repayAmt The amount of debt you want to repay + /// @param removedCollateral The collateral data to be removed + /// @param callbackData The data to be passed to the callback function + /// @return repayAll Whether the repayment is complete + function flashRepay( + uint256 id, + uint128 repayAmt, + bool byDebtToken, + bytes memory removedCollateral, + bytes calldata callbackData + ) external returns (bool repayAll); +} diff --git a/contracts/v2/tokens/IMintableERC20V2.sol b/contracts/v2/tokens/IMintableERC20V2.sol new file mode 100644 index 0000000..30ce1e3 --- /dev/null +++ b/contracts/v2/tokens/IMintableERC20V2.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "../../v1/tokens/IMintableERC20.sol"; + +/** + * @title TermMax ERC20 token interface + * @author Term Structure Labs + */ +interface IMintableERC20V2 { + /// @notice Burn tokens from sender + /// @param owner The address of the token holder + /// @param spender The address of the token spender + /// @param amount The number of tokens to be burned + /// @dev Only the market can burn TermMax tokens + function burn(address owner, address spender, uint256 amount) external; +} diff --git a/contracts/v2/tokens/MintableERC20V2.sol b/contracts/v2/tokens/MintableERC20V2.sol new file mode 100644 index 0000000..3074dbf --- /dev/null +++ b/contracts/v2/tokens/MintableERC20V2.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {IMintableERC20V2} from "./IMintableERC20V2.sol"; +import {MintableERC20} from "../../v1/tokens/MintableERC20.sol"; + +/** + * @title TermMax ERC20 token + * @author Term Structure Labs + */ +contract MintableERC20V2 is MintableERC20, IMintableERC20V2 { + /** + * @inheritdoc IMintableERC20V2 + */ + function burn(address owner, address spender, uint256 amount) external override onlyOwner { + if (owner != spender) { + _spendAllowance(owner, spender, amount); + } + _burn(owner, amount); + } +} From 9cd93698b76e6bc5316c01ea75c9bf4b2bc68bb7 Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 29 May 2025 12:00:35 +0800 Subject: [PATCH 044/194] v2 contracts --- contracts/interfaces/IGearingToken.sol | 11 + contracts/interfaces/ITermMaxMarket.sol | 11 + contracts/v2/TermMaxMarketV2.sol | 34 +- contracts/v2/TermMaxOrderV2.sol | 780 ++++++++++++++++++ contracts/v2/events/GearingTokenEventsV2.sol | 23 + contracts/v2/oracle/IOracleV2.sol | 30 + contracts/v2/oracle/OracleAggregatorV2.sol | 158 ++++ .../oracle/priceFeeds/ITermMaxPriceFeed.sol | 14 + .../priceFeeds/TermMaxERC4626PriceFeed.sol | 63 ++ .../oracle/priceFeeds/TermMaxPTPriceFeed.sol | 135 +++ .../priceFeeds/TermMaxPriceFeedConverter.sol | 63 ++ .../v2/tokens/AbstractGearingTokenV2.sol | 606 ++++++++++++++ .../v2/tokens/GearingTokenWithERC20V2.sol | 228 +++++ contracts/v2/tokens/MintableERC20V2.sol | 2 +- contracts/v2/vault/ITermMaxVaultV2.sol | 6 + contracts/v2/vault/TermMaxVaultV2.sol | 764 +++++++++++++++++ 16 files changed, 2919 insertions(+), 9 deletions(-) create mode 100644 contracts/interfaces/IGearingToken.sol create mode 100644 contracts/interfaces/ITermMaxMarket.sol create mode 100644 contracts/v2/TermMaxOrderV2.sol create mode 100644 contracts/v2/events/GearingTokenEventsV2.sol create mode 100644 contracts/v2/oracle/IOracleV2.sol create mode 100644 contracts/v2/oracle/OracleAggregatorV2.sol create mode 100644 contracts/v2/oracle/priceFeeds/ITermMaxPriceFeed.sol create mode 100644 contracts/v2/oracle/priceFeeds/TermMaxERC4626PriceFeed.sol create mode 100644 contracts/v2/oracle/priceFeeds/TermMaxPTPriceFeed.sol create mode 100644 contracts/v2/oracle/priceFeeds/TermMaxPriceFeedConverter.sol create mode 100644 contracts/v2/tokens/AbstractGearingTokenV2.sol create mode 100644 contracts/v2/tokens/GearingTokenWithERC20V2.sol create mode 100644 contracts/v2/vault/ITermMaxVaultV2.sol create mode 100644 contracts/v2/vault/TermMaxVaultV2.sol diff --git a/contracts/interfaces/IGearingToken.sol b/contracts/interfaces/IGearingToken.sol new file mode 100644 index 0000000..9de0474 --- /dev/null +++ b/contracts/interfaces/IGearingToken.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IGearingToken as IGearingTokenV1} from "../v1/tokens/IGearingToken.sol"; +import {IGearingTokenV2} from "../v2/tokens/IGearingTokenV2.sol"; + +/** + * @title Gearing Token interface + * @author Term Structure Labs + */ +interface IGearingToken is IGearingTokenV1, IGearingTokenV2 {} diff --git a/contracts/interfaces/ITermMaxMarket.sol b/contracts/interfaces/ITermMaxMarket.sol new file mode 100644 index 0000000..700a67e --- /dev/null +++ b/contracts/interfaces/ITermMaxMarket.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {ITermMaxMarket as ITermMaxMarketV1} from "../v1/ITermMaxMarket.sol"; +import {ITermMaxMarketV2} from "../v2/ITermMaxMarketV2.sol"; + +/** + * @title TermMax Market interface + * @author Term Structure Labs + */ +interface ITermMaxMarket is ITermMaxMarketV1, ITermMaxMarketV2 {} diff --git a/contracts/v2/TermMaxMarketV2.sol b/contracts/v2/TermMaxMarketV2.sol index b4ccb95..e1e5f3d 100644 --- a/contracts/v2/TermMaxMarketV2.sol +++ b/contracts/v2/TermMaxMarketV2.sol @@ -76,7 +76,7 @@ contract TermMaxMarketV2 is /** * @inheritdoc ITermMaxMarket */ - function initialize(MarketInitialParams memory params) external override initializer { + function initialize(MarketInitialParams memory params) external virtual override initializer { __Ownable_init(params.admin); __ReentrancyGuard_init(); if (params.collateral == address(params.debtToken)) revert CollateralCanNotEqualUnderlyinng(); @@ -140,14 +140,20 @@ contract TermMaxMarketV2 is /** * @inheritdoc ITermMaxMarket */ - function tokens() external view override returns (IMintableERC20, IMintableERC20, IGearingToken, address, IERC20) { + function tokens() + external + view + virtual + override + returns (IMintableERC20, IMintableERC20, IGearingToken, address, IERC20) + { return (ft, xt, IGearingToken(gt), collateral, debtToken); } /** * @inheritdoc ITermMaxMarket */ - function updateMarketConfig(MarketConfig calldata newConfig) external override onlyOwner { + function updateMarketConfig(MarketConfig calldata newConfig) external virtual override onlyOwner { MarketConfig memory mConfig = _config; if (newConfig.treasurer != mConfig.treasurer) { mConfig.treasurer = newConfig.treasurer; @@ -173,7 +179,7 @@ contract TermMaxMarketV2 is daysToMaturity = (maturity - block.timestamp + Constants.SECONDS_IN_DAY - 1) / Constants.SECONDS_IN_DAY; } - function mint(address recipient, uint256 debtTokenAmt) external override nonReentrant isOpen { + function mint(address recipient, uint256 debtTokenAmt) external virtual override nonReentrant isOpen { _mint(msg.sender, recipient, debtTokenAmt); } @@ -189,14 +195,20 @@ contract TermMaxMarketV2 is /** * @inheritdoc ITermMaxMarket */ - function burn(address recipient, uint256 debtTokenAmt) external override nonReentrant isOpen { + function burn(address recipient, uint256 debtTokenAmt) external virtual override nonReentrant isOpen { _burn(msg.sender, msg.sender, recipient, debtTokenAmt); } /** * @inheritdoc ITermMaxMarketV2 */ - function burn(address owner, address recipient, uint256 debtTokenAmt) external override nonReentrant isOpen { + function burn(address owner, address recipient, uint256 debtTokenAmt) + external + virtual + override + nonReentrant + isOpen + { _burn(owner, msg.sender, recipient, debtTokenAmt); } @@ -214,6 +226,7 @@ contract TermMaxMarketV2 is */ function leverageByXt(address recipient, uint128 xtAmt, bytes calldata callbackData) external + virtual override nonReentrant isOpen @@ -227,6 +240,7 @@ contract TermMaxMarketV2 is */ function leverageByXt(address xtOwner, address recipient, uint128 xtAmt, bytes calldata callbackData) external + virtual override nonReentrant isOpen @@ -266,6 +280,7 @@ contract TermMaxMarketV2 is */ function issueFt(address recipient, uint128 debt, bytes calldata collateralData) external + virtual override nonReentrant isOpen @@ -296,6 +311,7 @@ contract TermMaxMarketV2 is */ function issueFtByExistedGt(address recipient, uint128 debt, uint256 gtId) external + virtual override nonReentrant isOpen @@ -326,6 +342,7 @@ contract TermMaxMarketV2 is function previewRedeem(uint256 ftAmount) external view + virtual override returns (uint256 debtTokenAmt, bytes memory deliveryData) { @@ -406,7 +423,7 @@ contract TermMaxMarketV2 is /** * @inheritdoc ITermMaxMarket */ - function updateGtConfig(bytes memory configData) external override onlyOwner { + function updateGtConfig(bytes memory configData) external virtual override onlyOwner { gt.updateConfig(configData); } @@ -415,6 +432,7 @@ contract TermMaxMarketV2 is */ function createOrder(address maker, uint256 maxXtReserve, ISwapCallback swapTrigger, CurveCuts memory curveCuts) external + virtual nonReentrant isOpen returns (ITermMaxOrder order) @@ -424,7 +442,7 @@ contract TermMaxMarketV2 is emit CreateOrder(maker, order); } - function updateOrderFeeRate(ITermMaxOrder order, FeeConfig memory newFeeConfig) external onlyOwner { + function updateOrderFeeRate(ITermMaxOrder order, FeeConfig memory newFeeConfig) external virtual onlyOwner { _checkFee(newFeeConfig); order.updateFeeConfig(newFeeConfig); } diff --git a/contracts/v2/TermMaxOrderV2.sol b/contracts/v2/TermMaxOrderV2.sol new file mode 100644 index 0000000..2796c45 --- /dev/null +++ b/contracts/v2/TermMaxOrderV2.sol @@ -0,0 +1,780 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.27; + +import { + OwnableUpgradeable, + Ownable2StepUpgradeable +} from "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; +import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; +import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; +import {ITermMaxOrder, IERC20} from "../v1/ITermMaxOrder.sol"; +import {ITermMaxMarket} from "../v1/ITermMaxMarket.sol"; +import {IGearingToken} from "../v1/tokens/IGearingToken.sol"; +import {IFlashLoanReceiver} from "../v1/IFlashLoanReceiver.sol"; +import {Constants} from "../v1/lib/Constants.sol"; +import {TermMaxCurve, MathLib} from "../v1/lib/TermMaxCurve.sol"; +import {OrderErrors} from "../v1/errors/OrderErrors.sol"; +import {OrderEvents} from "../v1/events/OrderEvents.sol"; +import {OrderConfig, MarketConfig, CurveCuts, CurveCut, FeeConfig} from "../v1/storage/TermMaxStorage.sol"; +import {ISwapCallback} from "../v1/ISwapCallback.sol"; +import {TransferUtils} from "../v1/lib/TransferUtils.sol"; +import {ITermMaxMarketV2} from "./ITermMaxMarketV2.sol"; + +/** + * @title TermMax Order + * @author Term Structure Labs + */ +contract TermMaxOrder is + ITermMaxOrder, + ReentrancyGuardUpgradeable, + Ownable2StepUpgradeable, + PausableUpgradeable, + OrderErrors, + OrderEvents +{ + using SafeCast for uint256; + using SafeCast for int256; + using TransferUtils for IERC20; + using MathLib for *; + + ITermMaxMarket public market; + + IERC20 private ft; + IERC20 private xt; + IERC20 private debtToken; + IGearingToken private gt; + + OrderConfig private _orderConfig; + + uint64 private maturity; + + uint256 private constant T_FT_RESERVE_STORE = 0; + uint256 private constant T_XT_RESERVE_STORE = 1; + + function setInitialFtReserve(uint256 ftReserve) private { + assembly { + tstore(T_FT_RESERVE_STORE, ftReserve) + } + } + + function setInitialXtReserve(uint256 xtReserve) private { + assembly { + tstore(T_XT_RESERVE_STORE, xtReserve) + } + } + + function getInitialFtReserve() private view returns (uint256 ftReserve) { + assembly { + ftReserve := tload(T_FT_RESERVE_STORE) + } + } + + function getInitialXtReserve() private view returns (uint256 xtReserve) { + assembly { + xtReserve := tload(T_XT_RESERVE_STORE) + } + } + + /// @notice Check if the market is borrowing allowed + modifier isBorrowingAllowed(OrderConfig memory config) { + if (config.curveCuts.lendCurveCuts.length == 0) { + revert BorrowIsNotAllowed(); + } + _; + } + + /// @notice Check if the market is lending allowed + modifier isLendingAllowed(OrderConfig memory config) { + if (config.curveCuts.borrowCurveCuts.length == 0) { + revert LendIsNotAllowed(); + } + _; + } + + /// @notice Check if the order is tradable + modifier isOpen() { + _requireNotPaused(); + if (block.timestamp >= maturity) { + revert TermIsNotOpen(); + } + _; + } + + modifier onlyMarket() { + if (msg.sender != address(market)) revert OnlyMarket(); + _; + } + + constructor() { + _disableInitializers(); + } + + function maker() public view returns (address) { + return owner(); + } + + /** + * @inheritdoc ITermMaxOrder + */ + function initialize( + address maker_, + IERC20[3] memory tokens, + IGearingToken gt_, + uint256 maxXtReserve_, + ISwapCallback swapTrigger, + CurveCuts memory curveCuts_, + MarketConfig memory marketConfig + ) external virtual override initializer { + __Ownable_init(maker_); + __ReentrancyGuard_init(); + __Pausable_init(); + market = ITermMaxMarket(_msgSender()); + + // _orderConfig.curveCuts = curveCuts_; + _updateCurve(curveCuts_); + _orderConfig.feeConfig = marketConfig.feeConfig; + _orderConfig.maxXtReserve = maxXtReserve_; + _orderConfig.swapTrigger = swapTrigger; + maturity = marketConfig.maturity; + + ft = tokens[0]; + xt = tokens[1]; + debtToken = tokens[2]; + gt = gt_; + emit OrderInitialized(market, maker_, maxXtReserve_, swapTrigger, curveCuts_); + } + + /** + * @inheritdoc ITermMaxOrder + */ + function orderConfig() external view virtual returns (OrderConfig memory) { + return _orderConfig; + } + + /** + * @inheritdoc ITermMaxOrder + */ + function tokenReserves() public view override returns (uint256, uint256) { + return (ft.balanceOf(address(this)), xt.balanceOf(address(this))); + } + + /** + * @inheritdoc ITermMaxOrder + */ + function apr() external view virtual override returns (uint256 lendApr_, uint256 borrowApr_) { + uint256 daysToMaturity = _daysToMaturity(); + uint256 oriXtReserve = xt.balanceOf(address(this)); + + CurveCuts memory curveCuts = _orderConfig.curveCuts; + if (curveCuts.lendCurveCuts.length == 0) { + lendApr_ = 0; + } else { + uint256 lendCutId = TermMaxCurve.calcCutId(curveCuts.lendCurveCuts, oriXtReserve); + (, uint256 lendVXtReserve, uint256 lendVFtReserve) = TermMaxCurve.calcIntervalProps( + Constants.DECIMAL_BASE, daysToMaturity, curveCuts.lendCurveCuts[lendCutId], oriXtReserve + ); + lendApr_ = + ((lendVFtReserve * Constants.DECIMAL_BASE * Constants.DAYS_IN_YEAR) / (lendVXtReserve * daysToMaturity)); + } + if (curveCuts.borrowCurveCuts.length == 0) { + borrowApr_ = type(uint256).max; + } else { + uint256 borrowCutId = TermMaxCurve.calcCutId(curveCuts.borrowCurveCuts, oriXtReserve); + (, uint256 borrowVXtReserve, uint256 borrowVFtReserve) = TermMaxCurve.calcIntervalProps( + Constants.DECIMAL_BASE, daysToMaturity, curveCuts.borrowCurveCuts[borrowCutId], oriXtReserve + ); + + borrowApr_ = ( + (borrowVFtReserve * Constants.DECIMAL_BASE * Constants.DAYS_IN_YEAR) + / (borrowVXtReserve * daysToMaturity) + ); + } + } + + /** + * @inheritdoc ITermMaxOrder + */ + function updateOrder(OrderConfig memory newOrderConfig, int256 ftChangeAmt, int256 xtChangeAmt) + external + virtual + override + onlyOwner + { + _updateCurve(newOrderConfig.curveCuts); + if (ftChangeAmt > 0) { + ft.safeTransferFrom(msg.sender, address(this), ftChangeAmt.toUint256()); + } else if (ftChangeAmt < 0) { + ft.safeTransfer(msg.sender, (-ftChangeAmt).toUint256()); + } + if (xtChangeAmt > 0) { + xt.safeTransferFrom(msg.sender, address(this), xtChangeAmt.toUint256()); + } else if (xtChangeAmt < 0) { + xt.safeTransfer(msg.sender, (-xtChangeAmt).toUint256()); + } + _orderConfig.maxXtReserve = newOrderConfig.maxXtReserve; + _orderConfig.gtId = newOrderConfig.gtId; + _orderConfig.swapTrigger = newOrderConfig.swapTrigger; + emit UpdateOrder( + newOrderConfig.curveCuts, + ftChangeAmt, + xtChangeAmt, + newOrderConfig.gtId, + newOrderConfig.maxXtReserve, + newOrderConfig.swapTrigger + ); + } + + function _updateCurve(CurveCuts memory newCurveCuts) internal { + bytes32 newCurveCutsHash = keccak256(abi.encode(newCurveCuts)); + CurveCuts memory oldCurveCuts = _orderConfig.curveCuts; + if (keccak256(abi.encode(oldCurveCuts)) != newCurveCutsHash) { + if (newCurveCuts.lendCurveCuts.length > 0) { + if (newCurveCuts.lendCurveCuts[0].liqSquare == 0 || newCurveCuts.lendCurveCuts[0].xtReserve != 0) { + revert InvalidCurveCuts(); + } + } + for (uint256 i = 1; i < newCurveCuts.lendCurveCuts.length; i++) { + if ( + newCurveCuts.lendCurveCuts[i].liqSquare == 0 + || newCurveCuts.lendCurveCuts[i].xtReserve <= newCurveCuts.lendCurveCuts[i - 1].xtReserve + ) { + revert InvalidCurveCuts(); + } + /* + R := (x' + beta') ^ 2 * DECIMAL_BASE / (x' + beta) ^ 2 + L' ^ 2 := L ^ 2 * R / DECIMAL_BASE + */ + if ( + newCurveCuts.lendCurveCuts[i].liqSquare + != ( + newCurveCuts.lendCurveCuts[i - 1].liqSquare + * ( + ( + ( + newCurveCuts.lendCurveCuts[i].xtReserve.plusInt256( + newCurveCuts.lendCurveCuts[i].offset + ) + ) ** 2 * Constants.DECIMAL_BASE + ) + / ( + newCurveCuts.lendCurveCuts[i].xtReserve.plusInt256( + newCurveCuts.lendCurveCuts[i - 1].offset + ) ** 2 + ) + ) + ) / Constants.DECIMAL_BASE + ) revert InvalidCurveCuts(); + } + if (newCurveCuts.borrowCurveCuts.length > 0) { + if (newCurveCuts.borrowCurveCuts[0].liqSquare == 0 || newCurveCuts.borrowCurveCuts[0].xtReserve != 0) { + revert InvalidCurveCuts(); + } + } + for (uint256 i = 1; i < newCurveCuts.borrowCurveCuts.length; i++) { + if ( + newCurveCuts.borrowCurveCuts[i].liqSquare == 0 + || newCurveCuts.borrowCurveCuts[i].xtReserve <= newCurveCuts.borrowCurveCuts[i - 1].xtReserve + ) { + revert InvalidCurveCuts(); + } + if ( + newCurveCuts.borrowCurveCuts[i].liqSquare + != ( + newCurveCuts.borrowCurveCuts[i - 1].liqSquare + * ( + ( + ( + newCurveCuts.borrowCurveCuts[i].xtReserve.plusInt256( + newCurveCuts.borrowCurveCuts[i].offset + ) + ) ** 2 * Constants.DECIMAL_BASE + ) + / ( + newCurveCuts.borrowCurveCuts[i].xtReserve.plusInt256( + newCurveCuts.borrowCurveCuts[i - 1].offset + ) ** 2 + ) + ) + ) / Constants.DECIMAL_BASE + ) revert InvalidCurveCuts(); + } + _orderConfig.curveCuts = newCurveCuts; + } + } + + function updateFeeConfig(FeeConfig memory newFeeConfig) external virtual override onlyMarket { + _orderConfig.feeConfig = newFeeConfig; + emit UpdateFeeConfig(newFeeConfig); + } + + /// @notice Calculate how many days until expiration + function _daysToMaturity() internal view returns (uint256 daysToMaturity) { + daysToMaturity = (maturity - block.timestamp + Constants.SECONDS_IN_DAY - 1) / Constants.SECONDS_IN_DAY; + } + + /** + * @inheritdoc ITermMaxOrder + */ + function swapExactTokenToToken( + IERC20 tokenIn, + IERC20 tokenOut, + address recipient, + uint128 tokenAmtIn, + uint128 minTokenOut, + uint256 deadline + ) external virtual override nonReentrant isOpen returns (uint256 netTokenOut) { + if (block.timestamp > deadline) revert DeadlineExpired(); + if (tokenIn == tokenOut) revert CantSwapSameToken(); + OrderConfig memory config = _orderConfig; + uint256 feeAmt; + if (tokenAmtIn != 0) { + // Store ft and xt reserve before swap + setInitialFtReserve(ft.balanceOf(address(this))); + setInitialXtReserve(xt.balanceOf(address(this))); + if (tokenIn == ft && tokenOut == debtToken) { + (netTokenOut, feeAmt) = _sellFt(tokenAmtIn, minTokenOut, msg.sender, recipient, config); + } else if (tokenIn == xt && tokenOut == debtToken) { + (netTokenOut, feeAmt) = _sellXt(tokenAmtIn, minTokenOut, msg.sender, recipient, config); + } else if (tokenIn == debtToken && tokenOut == ft) { + (netTokenOut, feeAmt) = _buyFt(tokenAmtIn, minTokenOut, msg.sender, recipient, config); + } else if (tokenIn == debtToken && tokenOut == xt) { + (netTokenOut, feeAmt) = _buyXt(tokenAmtIn, minTokenOut, msg.sender, recipient, config); + } else { + revert CantNotSwapToken(tokenIn, tokenOut); + } + // transfer fee to treasurer + ft.safeTransfer(market.config().treasurer, feeAmt); + /// @dev callback the changes of ft and xt reserve to trigger + if (address(_orderConfig.swapTrigger) != address(0)) { + uint256 ftReserve = ft.balanceOf(address(this)); + uint256 xtReserve = xt.balanceOf(address(this)); + int256 deltaFt = ftReserve.toInt256() - getInitialFtReserve().toInt256(); + int256 deltaXt = xtReserve.toInt256() - getInitialXtReserve().toInt256(); + _orderConfig.swapTrigger.afterSwap(ftReserve, xtReserve, deltaFt, deltaXt); + } + } else { + if (address(_orderConfig.swapTrigger) != address(0)) { + uint256 ftReserve = ft.balanceOf(address(this)); + uint256 xtReserve = xt.balanceOf(address(this)); + _orderConfig.swapTrigger.afterSwap(ftReserve, xtReserve, 0, 0); + } + } + + emit SwapExactTokenToToken( + tokenIn, tokenOut, msg.sender, recipient, tokenAmtIn, netTokenOut.toUint128(), feeAmt.toUint128() + ); + } + + function _buyFt( + uint256 debtTokenAmtIn, + uint256 minTokenOut, + address caller, + address recipient, + OrderConfig memory config + ) internal isLendingAllowed(config) returns (uint256 netOut, uint256 feeAmt) { + (netOut, feeAmt) = _buyToken(caller, recipient, debtTokenAmtIn, minTokenOut, config, _buyFtStep); + if (xt.balanceOf(address(this)) > config.maxXtReserve) { + revert XtReserveTooHigh(); + } + } + + function _buyXt( + uint256 debtTokenAmtIn, + uint256 minTokenOut, + address caller, + address recipient, + OrderConfig memory config + ) internal isBorrowingAllowed(config) returns (uint256 netOut, uint256 feeAmt) { + (netOut, feeAmt) = _buyToken(caller, recipient, debtTokenAmtIn, minTokenOut, config, _buyXtStep); + } + + function _sellFt( + uint256 ftAmtIn, + uint256 minDebtTokenOut, + address caller, + address recipient, + OrderConfig memory config + ) internal isBorrowingAllowed(config) returns (uint256 netOut, uint256 feeAmt) { + (netOut, feeAmt) = _sellToken(caller, recipient, ftAmtIn, minDebtTokenOut, config, _sellFtStep); + } + + function _sellXt( + uint256 xtAmtIn, + uint256 minDebtTokenOut, + address caller, + address recipient, + OrderConfig memory config + ) internal isLendingAllowed(config) returns (uint256 netOut, uint256 feeAmt) { + (netOut, feeAmt) = _sellToken(caller, recipient, xtAmtIn, minDebtTokenOut, config, _sellXtStep); + if (xt.balanceOf(address(this)) > config.maxXtReserve) { + revert XtReserveTooHigh(); + } + } + + function _buyToken( + address caller, + address recipient, + uint256 debtTokenAmtIn, + uint256 minTokenOut, + OrderConfig memory config, + function(uint, uint, uint, OrderConfig memory) internal view returns (uint, uint, IERC20) func + ) internal returns (uint256, uint256) { + uint256 daysToMaturity = _daysToMaturity(); + uint256 oriXtReserve = getInitialXtReserve(); + + (uint256 tokenAmtOut, uint256 feeAmt, IERC20 tokenOut) = + func(daysToMaturity, oriXtReserve, debtTokenAmtIn, config); + + uint256 netOut = tokenAmtOut + debtTokenAmtIn; + if (netOut < minTokenOut) revert UnexpectedAmount(minTokenOut, netOut); + + debtToken.safeTransferFrom(caller, address(this), debtTokenAmtIn); + + debtToken.safeIncreaseAllowance(address(market), debtTokenAmtIn); + market.mint(address(this), debtTokenAmtIn); + if (tokenOut == ft) { + uint256 ftReserve = getInitialFtReserve(); + _issueFtToSelf(ftReserve + debtTokenAmtIn, netOut + feeAmt, config); + } + + tokenOut.safeTransfer(recipient, netOut); + + return (netOut, feeAmt); + } + + function _buyFtStep(uint256 daysToMaturity, uint256 oriXtReserve, uint256 debtTokenAmtIn, OrderConfig memory config) + internal + view + returns (uint256 tokenAmtOut, uint256 feeAmt, IERC20 tokenOut) + { + FeeConfig memory feeConfig = config.feeConfig; + CurveCut[] memory cuts = config.curveCuts.borrowCurveCuts; + uint256 nif = Constants.DECIMAL_BASE - uint256(feeConfig.lendTakerFeeRatio); + (, tokenAmtOut) = TermMaxCurve.buyFt(nif, daysToMaturity, cuts, oriXtReserve, debtTokenAmtIn); + feeAmt = (tokenAmtOut * (Constants.DECIMAL_BASE + uint256(feeConfig.borrowMakerFeeRatio))) / nif - tokenAmtOut; + tokenOut = ft; + } + + function _buyXtStep(uint256 daysToMaturity, uint256 oriXtReserve, uint256 debtTokenAmtIn, OrderConfig memory config) + internal + view + returns (uint256 tokenAmtOut, uint256 feeAmt, IERC20 tokenOut) + { + FeeConfig memory feeConfig = config.feeConfig; + CurveCut[] memory cuts = config.curveCuts.lendCurveCuts; + uint256 nif = Constants.DECIMAL_BASE + uint256(feeConfig.borrowTakerFeeRatio); + uint256 deltaFt; + (tokenAmtOut, deltaFt) = TermMaxCurve.buyXt(nif, daysToMaturity, cuts, oriXtReserve, debtTokenAmtIn); + feeAmt = deltaFt - (deltaFt * (Constants.DECIMAL_BASE - uint256(feeConfig.lendMakerFeeRatio))) / nif; + tokenOut = xt; + } + + function _sellToken( + address caller, + address recipient, + uint256 tokenAmtIn, + uint256 minDebtTokenOut, + OrderConfig memory config, + function(uint, uint, uint, OrderConfig memory) internal view returns (uint, uint, IERC20) func + ) internal returns (uint256, uint256) { + uint256 daysToMaturity = _daysToMaturity(); + uint256 oriXtReserve = getInitialXtReserve(); + + (uint256 netOut, uint256 feeAmt, IERC20 tokenIn) = func(daysToMaturity, oriXtReserve, tokenAmtIn, config); + if (netOut < minDebtTokenOut) revert UnexpectedAmount(minDebtTokenOut, netOut); + + tokenIn.safeTransferFrom(caller, address(this), tokenAmtIn); + if (tokenIn == xt) { + uint256 ftReserve = getInitialFtReserve(); + _issueFtToSelf(ftReserve, netOut + feeAmt, config); + } + ITermMaxMarketV2(address(market)).burn(address(this), recipient, netOut); + return (netOut, feeAmt); + } + + function _sellFtStep(uint256 daysToMaturity, uint256 oriXtReserve, uint256 tokenAmtIn, OrderConfig memory config) + internal + view + returns (uint256 debtTokenAmtOut, uint256 feeAmt, IERC20 tokenIn) + { + FeeConfig memory feeConfig = config.feeConfig; + CurveCut[] memory cuts = config.curveCuts.lendCurveCuts; + uint256 nif = Constants.DECIMAL_BASE + uint256(feeConfig.borrowTakerFeeRatio); + uint256 deltaFt; + (debtTokenAmtOut, deltaFt) = TermMaxCurve.sellFt(nif, daysToMaturity, cuts, oriXtReserve, tokenAmtIn); + feeAmt = deltaFt - (deltaFt * (Constants.DECIMAL_BASE - uint256(feeConfig.lendMakerFeeRatio))) / nif; + tokenIn = ft; + } + + function _sellXtStep(uint256 daysToMaturity, uint256 oriXtReserve, uint256 tokenAmtIn, OrderConfig memory config) + internal + view + returns (uint256 debtTokenAmtOut, uint256 feeAmt, IERC20 tokenIn) + { + FeeConfig memory feeConfig = config.feeConfig; + CurveCut[] memory cuts = config.curveCuts.borrowCurveCuts; + uint256 nif = Constants.DECIMAL_BASE - uint256(feeConfig.lendTakerFeeRatio); + (, debtTokenAmtOut) = TermMaxCurve.sellXt(nif, daysToMaturity, cuts, oriXtReserve, tokenAmtIn); + feeAmt = (debtTokenAmtOut * (Constants.DECIMAL_BASE + uint256(feeConfig.borrowMakerFeeRatio))) / nif + - debtTokenAmtOut; + tokenIn = xt; + } + + /** + * @inheritdoc ITermMaxOrder + */ + function swapTokenToExactToken( + IERC20 tokenIn, + IERC20 tokenOut, + address recipient, + uint128 tokenAmtOut, + uint128 maxTokenIn, + uint256 deadline + ) external virtual override nonReentrant isOpen returns (uint256 netTokenIn) { + if (block.timestamp > deadline) revert DeadlineExpired(); + if (tokenIn == tokenOut) revert CantSwapSameToken(); + OrderConfig memory config = _orderConfig; + uint256 feeAmt; + if (tokenAmtOut != 0 && maxTokenIn != 0) { + // Storage current ft and xt reserve + setInitialFtReserve(ft.balanceOf(address(this))); + setInitialXtReserve(xt.balanceOf(address(this))); + + if (tokenIn == debtToken && tokenOut == ft) { + (netTokenIn, feeAmt) = _buyExactFt(tokenAmtOut, maxTokenIn, msg.sender, recipient, config); + } else if (tokenIn == debtToken && tokenOut == xt) { + (netTokenIn, feeAmt) = _buyExactXt(tokenAmtOut, maxTokenIn, msg.sender, recipient, config); + } else if (tokenIn == ft && tokenOut == debtToken) { + (netTokenIn, feeAmt) = _sellFtForExactToken(tokenAmtOut, maxTokenIn, msg.sender, recipient, config); + } else if (tokenIn == xt && tokenOut == debtToken) { + (netTokenIn, feeAmt) = _sellXtForExactToken(tokenAmtOut, maxTokenIn, msg.sender, recipient, config); + } else { + revert CantNotSwapToken(tokenIn, tokenOut); + } + // transfer fee to treasurer + ft.safeTransfer(market.config().treasurer, feeAmt); + + /// @dev callback the changes of ft and xt reserve to trigger + if (address(_orderConfig.swapTrigger) != address(0)) { + uint256 ftReserve = ft.balanceOf(address(this)); + uint256 xtReserve = xt.balanceOf(address(this)); + int256 deltaFt = ftReserve.toInt256() - getInitialFtReserve().toInt256(); + int256 deltaXt = xtReserve.toInt256() - getInitialXtReserve().toInt256(); + _orderConfig.swapTrigger.afterSwap(ftReserve, xtReserve, deltaFt, deltaXt); + } + } else { + if (address(_orderConfig.swapTrigger) != address(0)) { + uint256 ftReserve = ft.balanceOf(address(this)); + uint256 xtReserve = xt.balanceOf(address(this)); + _orderConfig.swapTrigger.afterSwap(ftReserve, xtReserve, 0, 0); + } + } + + emit SwapTokenToExactToken( + tokenIn, tokenOut, msg.sender, recipient, tokenAmtOut, netTokenIn.toUint128(), feeAmt.toUint128() + ); + } + + function _buyExactFt( + uint256 tokenAmtOut, + uint256 maxTokenIn, + address caller, + address recipient, + OrderConfig memory config + ) internal isLendingAllowed(config) returns (uint256 netTokenIn, uint256 feeAmt) { + (netTokenIn, feeAmt) = _buyExactToken(caller, recipient, tokenAmtOut, maxTokenIn, config, _buyExactFtStep); + if (xt.balanceOf(address(this)) > config.maxXtReserve) { + revert XtReserveTooHigh(); + } + } + + function _buyExactXt( + uint256 tokenAmtOut, + uint256 maxTokenIn, + address caller, + address recipient, + OrderConfig memory config + ) internal isBorrowingAllowed(config) returns (uint256 netTokenIn, uint256 feeAmt) { + (netTokenIn, feeAmt) = _buyExactToken(caller, recipient, tokenAmtOut, maxTokenIn, config, _buyExactXtStep); + } + + function _buyExactToken( + address caller, + address recipient, + uint256 tokenAmtOut, + uint256 maxTokenIn, + OrderConfig memory config, + function(uint, uint, uint, OrderConfig memory) internal view returns (uint, uint, IERC20) func + ) internal returns (uint256, uint256) { + uint256 daysToMaturity = _daysToMaturity(); + uint256 oriXtReserve = getInitialXtReserve(); + + (uint256 netTokenIn, uint256 feeAmt, IERC20 tokenOut) = func(daysToMaturity, oriXtReserve, tokenAmtOut, config); + + if (netTokenIn > maxTokenIn) revert UnexpectedAmount(maxTokenIn, netTokenIn); + + debtToken.safeTransferFrom(caller, address(this), netTokenIn); + + debtToken.safeIncreaseAllowance(address(market), netTokenIn); + market.mint(address(this), netTokenIn); + if (tokenOut == ft) { + uint256 ftReserve = getInitialFtReserve(); + _issueFtToSelf(ftReserve + netTokenIn, tokenAmtOut + feeAmt, config); + } + + tokenOut.safeTransfer(recipient, tokenAmtOut); + + return (netTokenIn, feeAmt); + } + + function _buyExactFtStep(uint256 daysToMaturity, uint256 oriXtReserve, uint256 ftAmtOut, OrderConfig memory config) + internal + view + returns (uint256 debtTokenAmtIn, uint256 feeAmt, IERC20 tokenOut) + { + FeeConfig memory feeConfig = config.feeConfig; + CurveCut[] memory cuts = config.curveCuts.borrowCurveCuts; + uint256 nif = Constants.DECIMAL_BASE - uint256(feeConfig.lendTakerFeeRatio); + (uint256 deltaXt, uint256 negDeltaFt) = + TermMaxCurve.buyExactFt(nif, daysToMaturity, cuts, oriXtReserve, ftAmtOut); + debtTokenAmtIn = deltaXt; + feeAmt = (negDeltaFt * (Constants.DECIMAL_BASE + uint256(feeConfig.borrowMakerFeeRatio))) / nif - negDeltaFt; + tokenOut = ft; + } + + function _buyExactXtStep(uint256 daysToMaturity, uint256 oriXtReserve, uint256 xtAmtOut, OrderConfig memory config) + internal + view + returns (uint256 debtTokenAmtIn, uint256 feeAmt, IERC20 tokenOut) + { + FeeConfig memory feeConfig = config.feeConfig; + CurveCut[] memory cuts = config.curveCuts.lendCurveCuts; + uint256 nif = Constants.DECIMAL_BASE + uint256(feeConfig.borrowTakerFeeRatio); + (, uint256 deltaFt) = TermMaxCurve.buyExactXt(nif, daysToMaturity, cuts, oriXtReserve, xtAmtOut); + debtTokenAmtIn = deltaFt; + feeAmt = deltaFt - (deltaFt * (Constants.DECIMAL_BASE - uint256(feeConfig.lendMakerFeeRatio))) / nif; + tokenOut = xt; + } + + function _sellFtForExactToken( + uint256 debtTokenAmtOut, + uint256 maxFtIn, + address caller, + address recipient, + OrderConfig memory config + ) internal isBorrowingAllowed(config) returns (uint256 netIn, uint256 feeAmt) { + (netIn, feeAmt) = + _sellTokenForExactToken(caller, recipient, debtTokenAmtOut, maxFtIn, config, _sellFtForExactTokenStep); + } + + function _sellXtForExactToken( + uint256 debtTokenAmtOut, + uint256 maxXtIn, + address caller, + address recipient, + OrderConfig memory config + ) internal isLendingAllowed(config) returns (uint256 netIn, uint256 feeAmt) { + (netIn, feeAmt) = + _sellTokenForExactToken(caller, recipient, debtTokenAmtOut, maxXtIn, config, _sellXtForExactTokenStep); + if (xt.balanceOf(address(this)) > config.maxXtReserve) { + revert XtReserveTooHigh(); + } + } + + function _sellTokenForExactToken( + address caller, + address recipient, + uint256 debtTokenAmtOut, + uint256 maxTokenIn, + OrderConfig memory config, + function(uint, uint, uint, OrderConfig memory) internal view returns (uint, uint, IERC20) func + ) internal returns (uint256, uint256) { + uint256 daysToMaturity = _daysToMaturity(); + uint256 oriXtReserve = getInitialXtReserve(); + + (uint256 netTokenIn, uint256 feeAmt, IERC20 tokenIn) = + func(daysToMaturity, oriXtReserve, debtTokenAmtOut, config); + + if (netTokenIn > maxTokenIn) revert UnexpectedAmount(maxTokenIn, netTokenIn); + + tokenIn.safeTransferFrom(caller, address(this), netTokenIn); + if (tokenIn == xt) { + uint256 ftReserve = getInitialFtReserve(); + _issueFtToSelf(ftReserve, debtTokenAmtOut + feeAmt, config); + } + ITermMaxMarketV2(address(market)).burn(address(this), recipient, debtTokenAmtOut); + return (netTokenIn, feeAmt); + } + + function _sellFtForExactTokenStep( + uint256 daysToMaturity, + uint256 oriXtReserve, + uint256 debtTokenOut, + OrderConfig memory config + ) internal view returns (uint256 ftAmtIn, uint256 feeAmt, IERC20 tokenIn) { + FeeConfig memory feeConfig = config.feeConfig; + CurveCut[] memory cuts = config.curveCuts.lendCurveCuts; + uint256 nif = Constants.DECIMAL_BASE + uint256(feeConfig.borrowTakerFeeRatio); + + (, uint256 deltaFt) = + TermMaxCurve.sellFtForExactDebtToken(nif, daysToMaturity, cuts, oriXtReserve, debtTokenOut); + ftAmtIn = deltaFt + debtTokenOut; + + feeAmt = deltaFt - (deltaFt * (Constants.DECIMAL_BASE - uint256(feeConfig.lendMakerFeeRatio))) / nif; + tokenIn = ft; + } + + function _sellXtForExactTokenStep( + uint256 daysToMaturity, + uint256 oriXtReserve, + uint256 debtTokenOut, + OrderConfig memory config + ) internal view returns (uint256 xtAmtIn, uint256 feeAmt, IERC20 tokenIn) { + FeeConfig memory feeConfig = config.feeConfig; + CurveCut[] memory cuts = config.curveCuts.borrowCurveCuts; + uint256 nif = Constants.DECIMAL_BASE - uint256(feeConfig.lendTakerFeeRatio); + (uint256 deltaXt, uint256 negDeltaFt) = + TermMaxCurve.sellXtForExactDebtToken(nif, daysToMaturity, cuts, oriXtReserve, debtTokenOut); + xtAmtIn = deltaXt + debtTokenOut; + + feeAmt = (negDeltaFt * (Constants.DECIMAL_BASE + uint256(feeConfig.borrowMakerFeeRatio))) / nif - negDeltaFt; + tokenIn = xt; + } + + /** + * @notice Issue ft by existed gt. + * @notice This fuction will be triggered when ft reserve can not cover the output amount. + */ + function _issueFtToSelf(uint256 ftReserve, uint256 targetFtReserve, OrderConfig memory config) internal { + if (ftReserve >= targetFtReserve) return; + if (config.gtId == 0) revert CantNotIssueFtWithoutGt(); + uint256 debtAmtToIssue = ((targetFtReserve - ftReserve) * Constants.DECIMAL_BASE) + / (Constants.DECIMAL_BASE - market.mintGtFeeRatio()); + market.issueFtByExistedGt(address(this), (debtAmtToIssue).toUint128(), config.gtId); + setInitialFtReserve(targetFtReserve); + } + + function withdrawAssets(IERC20 token, address recipient, uint256 amount) external virtual onlyOwner { + if (token == debtToken) { + ITermMaxMarketV2(address(market)).burn(address(this), recipient, amount); + } else { + token.safeTransfer(recipient, amount); + } + emit WithdrawAssets(token, _msgSender(), recipient, amount); + } + + /** + * @inheritdoc ITermMaxOrder + */ + function pause() external virtual override onlyOwner { + _pause(); + } + + /** + * @inheritdoc ITermMaxOrder + */ + function unpause() external virtual override onlyOwner { + _unpause(); + } +} diff --git a/contracts/v2/events/GearingTokenEventsV2.sol b/contracts/v2/events/GearingTokenEventsV2.sol new file mode 100644 index 0000000..19b87b3 --- /dev/null +++ b/contracts/v2/events/GearingTokenEventsV2.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface GearingTokenEventsV2 { + /// @notice Emitted when a new Gearing Token is initialized + event GearingTokenInitialized(address indexed market, string name, string symbol, bytes initialData); + + /// @notice Emitted when repaying the debt of Gearing Token + /// @param id The id of Gearing Token + /// @param repayAmt The amount of debt repaid + /// @param byDebtToken Repay using debtToken token or bonds token + /// @param repayAll Repay all the debt + event Repay(uint256 indexed id, uint256 repayAmt, bool byDebtToken, bool repayAll); + + event FlashRepay( + uint256 indexed id, + address indexed caller, + uint128 repayAmt, + bool byDebtToken, + bool repayAll, + bytes removedCollateral + ); +} diff --git a/contracts/v2/oracle/IOracleV2.sol b/contracts/v2/oracle/IOracleV2.sol new file mode 100644 index 0000000..0b7afc1 --- /dev/null +++ b/contracts/v2/oracle/IOracleV2.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; + +/** + * @title IOracleV2 + * @author Term Structure Labs + */ +interface IOracleV2 { + struct Oracle { + AggregatorV3Interface aggregator; + AggregatorV3Interface backupAggregator; + int256 maxPrice; + uint32 heartbeat; + uint32 backupHeartbeat; + } + + /// @notice Error thrown when the oracle is not working + error OracleIsNotWorking(address asset); + + /// @notice Get the price of an asset + function getPrice(address asset) external view returns (uint256 price, uint8 decimals); + + function submitPendingOracle(address asset, Oracle memory oracle) external; + + function acceptPendingOracle(address asset) external; + + function revokePendingOracle(address asset) external; +} diff --git a/contracts/v2/oracle/OracleAggregatorV2.sol b/contracts/v2/oracle/OracleAggregatorV2.sol new file mode 100644 index 0000000..95023ce --- /dev/null +++ b/contracts/v2/oracle/OracleAggregatorV2.sol @@ -0,0 +1,158 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +/** + * @title OracleAggregatorV2 + * @notice This contract references design concepts from AAVE's oracle system + * @dev Implements price feed aggregation with primary and backup oracles, + * staleness checks via heartbeats, and governance-controlled updates with timelocks + * similar to AAVE's oracle architecture + */ +import {Ownable2Step, Ownable} from "@openzeppelin/contracts/access/Ownable2Step.sol"; +import {AggregatorV3Interface, IOracleV2} from "./IOracleV2.sol"; + +contract OracleAggregatorV2 is IOracleV2, Ownable2Step { + uint256 internal immutable _timeLock; + + struct PendingOracle { + Oracle oracle; + uint64 validAt; + } + + /// @notice Error thrown when the asset or oracle address is invalid + error InvalidAssetOrOracle(); + + /** + * @notice Error thrown when attempting to set a value that's already set + */ + error AlreadySet(); + + /** + * @notice Error thrown when attempting to submit a change that's already pending + */ + error AlreadyPending(); + + /** + * @notice Error thrown when trying to accept a change that has no pending value + */ + error NoPendingValue(); + + /** + * @notice Error thrown when trying to accept a change before the timelock period has elapsed + */ + error TimelockNotElapsed(); + + /// @notice Event emitted when the oracle of asset is updated + /// @param asset The address of the asset + /// @param aggregator The address of the aggregator + /// @param backupAggregator The address of the backup aggregator + /// @param heartbeat The heartbeat of the oracle + event UpdateOracle( + address indexed asset, + AggregatorV3Interface indexed aggregator, + AggregatorV3Interface indexed backupAggregator, + int256 maxPrice, + uint32 heartbeat, + uint32 backupHeartbeat + ); + + event SubmitPendingOracle( + address indexed asset, + AggregatorV3Interface indexed aggregator, + AggregatorV3Interface indexed backupAggregator, + int256 maxPrice, + uint32 heartbeat, + uint32 backupHeartbeat, + uint64 validAt + ); + + event RevokePendingOracle(address indexed asset); + + /// @notice Oracles + mapping(address => Oracle) public oracles; + + mapping(address => PendingOracle) public pendingOracles; + + constructor(address _owner, uint256 timeLock) Ownable(_owner) { + _timeLock = timeLock; + } + + function submitPendingOracle(address asset, Oracle memory oracle) external onlyOwner { + if (address(oracle.aggregator) == address(0) && address(oracle.backupAggregator) == address(0)) { + delete oracles[asset]; + emit UpdateOracle(asset, AggregatorV3Interface(address(0)), AggregatorV3Interface(address(0)), 0, 0, 0); + return; + } + if (asset == address(0) || oracle.aggregator == AggregatorV3Interface(address(0))) { + revert InvalidAssetOrOracle(); + } + if (address(oracle.backupAggregator) != address(0)) { + if (oracle.aggregator.decimals() != oracle.backupAggregator.decimals()) { + revert InvalidAssetOrOracle(); + } + } + pendingOracles[asset].oracle = oracle; + uint64 validAt = uint64(block.timestamp + _timeLock); + pendingOracles[asset].validAt = validAt; + emit SubmitPendingOracle( + asset, + oracle.aggregator, + oracle.backupAggregator, + oracle.maxPrice, + oracle.heartbeat, + oracle.backupHeartbeat, + validAt + ); + } + + function acceptPendingOracle(address asset) external { + if (pendingOracles[asset].validAt == 0) { + revert NoPendingValue(); + } + if (block.timestamp < pendingOracles[asset].validAt) { + revert TimelockNotElapsed(); + } + Oracle memory oracle = pendingOracles[asset].oracle; + oracles[asset] = oracle; + delete pendingOracles[asset]; + emit UpdateOracle( + asset, oracle.aggregator, oracle.backupAggregator, oracle.maxPrice, oracle.heartbeat, oracle.backupHeartbeat + ); + } + + function revokePendingOracle(address asset) external onlyOwner { + if (pendingOracles[asset].validAt == 0) { + revert NoPendingValue(); + } + delete pendingOracles[asset]; + emit RevokePendingOracle(asset); + } + + /** + * @inheritdoc IOracleV2 + */ + function getPrice(address asset) external view override returns (uint256, uint8) { + Oracle memory oracle = oracles[asset]; + { + (, int256 answer,, uint256 updatedAt,) = oracle.aggregator.latestRoundData(); + if ((oracle.heartbeat == 0 || oracle.heartbeat + updatedAt >= block.timestamp) && answer > 0) { + if (oracle.maxPrice == 0 || answer <= oracle.maxPrice) { + return (uint256(answer), oracle.aggregator.decimals()); + } else if (address(oracle.backupAggregator) == address(0)) { + return (uint256(oracle.maxPrice), oracle.aggregator.decimals()); + } + } + } + if (address(oracle.backupAggregator) != address(0)) { + (, int256 answer,, uint256 updatedAt,) = oracle.backupAggregator.latestRoundData(); + if ((oracle.backupHeartbeat == 0 || oracle.backupHeartbeat + updatedAt >= block.timestamp) && answer > 0) { + if (oracle.maxPrice == 0 || answer <= oracle.maxPrice) { + return (uint256(answer), oracle.backupAggregator.decimals()); + } else { + return (uint256(oracle.maxPrice), oracle.backupAggregator.decimals()); + } + } + } + revert OracleIsNotWorking(asset); + } +} diff --git a/contracts/v2/oracle/priceFeeds/ITermMaxPriceFeed.sol b/contracts/v2/oracle/priceFeeds/ITermMaxPriceFeed.sol new file mode 100644 index 0000000..fa24904 --- /dev/null +++ b/contracts/v2/oracle/priceFeeds/ITermMaxPriceFeed.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; + +/** + * @title The customized price feed interface mutated from Chainlink AggregatorV3Interface + * @author Term Structure Labs + * @notice Use the customized price feed interface to normalize price feed interface for TermMax Protocol + */ +interface ITermMaxPriceFeed is AggregatorV3Interface { + function description() external view returns (string memory); + function asset() external view returns (address); +} diff --git a/contracts/v2/oracle/priceFeeds/TermMaxERC4626PriceFeed.sol b/contracts/v2/oracle/priceFeeds/TermMaxERC4626PriceFeed.sol new file mode 100644 index 0000000..97a99ac --- /dev/null +++ b/contracts/v2/oracle/priceFeeds/TermMaxERC4626PriceFeed.sol @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {IERC4626} from "@openzeppelin/contracts/interfaces/IERC4626.sol"; +import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import {ITermMaxPriceFeed, AggregatorV3Interface} from "./ITermMaxPriceFeed.sol"; +import {MathLib} from "contracts/lib/MathLib.sol"; + +contract TermMaxERC4626PriceFeed is ITermMaxPriceFeed { + using MathLib for *; + + error GetRoundDataNotSupported(); + + AggregatorV3Interface public immutable assetPriceFeed; + address public immutable asset; + int256 immutable priceDemonitor; + uint256 immutable vaultDemonitor; + + constructor(address _assetPriceFeed, address _asset) { + (, int256 answer,,,) = AggregatorV3Interface(_assetPriceFeed).latestRoundData(); + assetPriceFeed = AggregatorV3Interface(_assetPriceFeed); + asset = _asset; + vaultDemonitor = 10 ** IERC4626(asset).decimals(); + priceDemonitor = int256(10 ** assetPriceFeed.decimals()) * int256(vaultDemonitor); + } + + function decimals() public view returns (uint8) { + return 8; + } + + function description() external view returns (string memory) { + string memory symbol = IERC20Metadata(asset).symbol(); + return string(abi.encodePacked("TermMax price feed: ", symbol, "/USD")); + } + + function version() external view returns (uint256) { + return assetPriceFeed.version(); + } + + function getRoundData(uint80 /* _roundId */ ) + external + view + returns ( + uint80, /* roundId */ + int256, /* answer */ + uint256, /* startedAt */ + uint256, /* updatedAt */ + uint80 /* answeredInRound */ + ) + { + // error to call this function because cannot get the chi (rate accumulator) at a specific round + revert GetRoundDataNotSupported(); + } + + function latestRoundData() external view returns (uint80, int256, uint256, uint256, uint80) { + (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) = + assetPriceFeed.latestRoundData(); + uint256 vaultAnswer = + IERC4626(asset).previewRedeem(vaultDemonitor).min(IERC4626(asset).convertToAssets(vaultDemonitor)); + answer = answer * int256(vaultAnswer) * int256((10 ** decimals())) / priceDemonitor; + return (roundId, answer, startedAt, updatedAt, answeredInRound); + } +} diff --git a/contracts/v2/oracle/priceFeeds/TermMaxPTPriceFeed.sol b/contracts/v2/oracle/priceFeeds/TermMaxPTPriceFeed.sol new file mode 100644 index 0000000..f6c55d5 --- /dev/null +++ b/contracts/v2/oracle/priceFeeds/TermMaxPTPriceFeed.sol @@ -0,0 +1,135 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {PendlePYLpOracle} from "@pendle/core-v2/contracts/oracles/PtYtLpOracle/PendlePYLpOracle.sol"; +import {PendlePYOracleLib} from "@pendle/core-v2/contracts/oracles/PtYtLpOracle/PendlePYOracleLib.sol"; +import {PMath} from "@pendle/core-v2/contracts/core/libraries/math/PMath.sol"; +import {IPMarket, IPPrincipalToken, IStandardizedYield} from "@pendle/core-v2/contracts/interfaces/IPMarket.sol"; +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; +import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import {Math} from "@openzeppelin/contracts/utils/math/Math.sol"; +import {ITermMaxPriceFeed, AggregatorV3Interface} from "./ITermMaxPriceFeed.sol"; + +/** + * @title The customized Pendle PT price feed contract mutated from Chainlink AggregatorV3Interface + * @author Term Structure Labs + * @notice Use the customized price feed contract to normalized price feed interface for TermMax Protocol + */ +contract TermMaxPTPriceFeed is ITermMaxPriceFeed { + using Math for uint256; + using SafeCast for *; + using PendlePYOracleLib for IPMarket; + + // Pendle PY LP oracle, refer to `https://docs.pendle.finance/Developers/Oracles/HowToIntegratePtAndLpOracle` + PendlePYLpOracle public immutable PY_LP_ORACLE; + // Pendle market + IPMarket public immutable MARKET; + // TWAP duration + uint32 public immutable DURATION; + // Price feed interface + AggregatorV3Interface public immutable PRICE_FEED; + address public immutable asset; + + uint256 private immutable PT_TO_SY_RATE_BASE; + + // error to call `getRoundData` function + error GetRoundDataNotSupported(); + // error when Pendle PY LP oracle is not ready + error OracleIsNotReady(); + // error when price is zero + error PriceIsZero(); + + /** + * @notice Construct the PT price feed contract + * @param pendlePYLpOracle The Pendle PY LP oracle contract + * @param market The Pendle market contract + * @param duration The TWAP duration + * @param priceFeed The price feed interface + */ + constructor(address pendlePYLpOracle, address market, uint32 duration, address priceFeed) { + (, int256 answer,,,) = AggregatorV3Interface(priceFeed).latestRoundData(); + if (answer == 0) revert PriceIsZero(); + + PY_LP_ORACLE = PendlePYLpOracle(pendlePYLpOracle); + MARKET = IPMarket(market); + DURATION = duration; + PRICE_FEED = AggregatorV3Interface(priceFeed); + (IStandardizedYield _SY, IPPrincipalToken _PT,) = MARKET.readTokens(); + uint8 syDecimals = _SY.decimals(); + uint8 ptDecimals = _PT.decimals(); + if (syDecimals < ptDecimals) { + PT_TO_SY_RATE_BASE = PMath.ONE / (10 ** (ptDecimals - syDecimals)); + } else { + PT_TO_SY_RATE_BASE = PMath.ONE * (10 ** (syDecimals - ptDecimals)); + } + asset = address(_PT); + if (!_oracleIsReady()) revert OracleIsNotReady(); + } + + /** + * @notice Revert this function because cannot get the chi (rate accumulator) at a specific round + */ + function getRoundData(uint80 /* _roundId */ ) + external + pure + returns ( + uint80, /* roundId */ + int256, /* answer */ + uint256, /* startedAt */ + uint256, /* updatedAt */ + uint80 /* answeredInRound */ + ) + { + // error to call this function because cannot get the chi (rate accumulator) at a specific round + revert GetRoundDataNotSupported(); + } + + /** + * @notice Get the latest round data from chainlink and calculate the PT price by multiplying PT rate in SY and SY price + * @return roundId The round ID + * @return answer The calculated PT price + * @return startedAt Timestamp of when the round started + * @return updatedAt Timestamp of when the round was updated + * @return answeredInRound The round ID of the round in which the answer was computed + */ + function latestRoundData() + external + view + returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) + { + // PT price = PT rate in SY * SY price / PT to asset rate base + uint256 ptRateInSy = MARKET.getPtToSyRate(DURATION); // PT -> SY + + (roundId, answer, startedAt, updatedAt, answeredInRound) = PRICE_FEED.latestRoundData(); + answer = ptRateInSy.mulDiv(answer.toUint256(), PT_TO_SY_RATE_BASE).toInt256(); + + return (roundId, answer, startedAt, updatedAt, answeredInRound); + } + + /** + * @notice Check if the Pendle PY LP oracle is ready + * @return True if the oracle is ready, otherwise false + */ + function _oracleIsReady() internal view returns (bool) { + (bool increaseCardinalityRequired,, bool oldestObservationSatisfied) = + PY_LP_ORACLE.getOracleState(address(MARKET), DURATION); + + return !increaseCardinalityRequired && oldestObservationSatisfied; + } + + /** + * ========== Return original price feed data ========== + */ + function decimals() external view returns (uint8) { + return PRICE_FEED.decimals(); + } + + function description() external view returns (string memory) { + string memory symbol = IERC20Metadata(asset).symbol(); + return string(abi.encodePacked("TermMax price feed: ", symbol, "/USD")); + } + + function version() external view returns (uint256) { + return PRICE_FEED.version(); + } +} diff --git a/contracts/v2/oracle/priceFeeds/TermMaxPriceFeedConverter.sol b/contracts/v2/oracle/priceFeeds/TermMaxPriceFeedConverter.sol new file mode 100644 index 0000000..60d9754 --- /dev/null +++ b/contracts/v2/oracle/priceFeeds/TermMaxPriceFeedConverter.sol @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import {ITermMaxPriceFeed, AggregatorV3Interface} from "./ITermMaxPriceFeed.sol"; +import {MathLib} from "contracts/lib/MathLib.sol"; + +contract TermMaxPriceFeedConverter is ITermMaxPriceFeed { + using MathLib for *; + + error GetRoundDataNotSupported(); + + AggregatorV3Interface public immutable aTokenToBTokenPriceFeed; + AggregatorV3Interface public immutable bTokenToCTokenPriceFeed; + + int256 immutable priceDemonitor; + address public immutable asset; + + constructor(address _aTokenToBTokenPriceFeed, address _bTokenToCTokenPriceFeed, address _asset) { + asset = _asset; + aTokenToBTokenPriceFeed = AggregatorV3Interface(_aTokenToBTokenPriceFeed); + bTokenToCTokenPriceFeed = AggregatorV3Interface(_bTokenToCTokenPriceFeed); + priceDemonitor = + int256(10 ** aTokenToBTokenPriceFeed.decimals()) * int256(10 ** bTokenToCTokenPriceFeed.decimals()); + } + + function decimals() public view returns (uint8) { + return 8; + } + + function description() external view returns (string memory) { + string memory symbol = IERC20Metadata(asset).symbol(); + return string(abi.encodePacked("TermMax price feed: ", symbol, "/USD")); + } + + function version() external view returns (uint256) { + return aTokenToBTokenPriceFeed.version().min(bTokenToCTokenPriceFeed.version()); + } + + function getRoundData(uint80 /* _roundId */ ) + external + view + returns ( + uint80, /* roundId */ + int256, /* answer */ + uint256, /* startedAt */ + uint256, /* updatedAt */ + uint80 /* answeredInRound */ + ) + { + // error to call this function because cannot get the chi (rate accumulator) at a specific round + revert GetRoundDataNotSupported(); + } + + function latestRoundData() external view returns (uint80, int256, uint256, uint256, uint80) { + (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) = + aTokenToBTokenPriceFeed.latestRoundData(); + (, int256 answer2, uint256 startedAt2, uint256 updatedAt2,) = bTokenToCTokenPriceFeed.latestRoundData(); + // tokenPrice = answer * answer2 + answer = answer * answer2 * int256((10 ** decimals())) / priceDemonitor; + return (roundId, answer, startedAt.min(startedAt2), updatedAt.min(updatedAt2), answeredInRound); + } +} diff --git a/contracts/v2/tokens/AbstractGearingTokenV2.sol b/contracts/v2/tokens/AbstractGearingTokenV2.sol new file mode 100644 index 0000000..83fd13d --- /dev/null +++ b/contracts/v2/tokens/AbstractGearingTokenV2.sol @@ -0,0 +1,606 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.27; + +import {ERC721EnumerableUpgradeable} from + "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol"; +import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; +import {Constants} from "../../v1/lib/Constants.sol"; +import {GearingTokenConstants} from "../../v1/lib/GearingTokenConstants.sol"; +import {TransferUtils} from "../../v1/lib/TransferUtils.sol"; +import {IFlashRepayer} from "../../v1/tokens/IFlashRepayer.sol"; +import {IGearingToken, IERC20Metadata, IERC20} from "../../v1/tokens/IGearingToken.sol"; +import {GearingTokenErrors} from "../../v1/errors/GearingTokenErrors.sol"; +import {GearingTokenEvents} from "../../v1/events/GearingTokenEvents.sol"; +import {GtConfig, IOracle} from "../../v1/storage/TermMaxStorage.sol"; +import {IGearingTokenV2} from "./IGearingTokenV2.sol"; +import {GearingTokenEventsV2} from "../events/GearingTokenEventsV2.sol"; + +/** + * @title TermMax Gearing Token + * @author Term Structure Labs + */ +abstract contract AbstractGearingTokenV2 is + OwnableUpgradeable, + ERC721EnumerableUpgradeable, + ReentrancyGuardUpgradeable, + IGearingToken, + IGearingTokenV2, + GearingTokenErrors, + GearingTokenEvents, + GearingTokenEventsV2 +{ + using SafeCast for uint256; + using SafeCast for int256; + using TransferUtils for IERC20; + using TransferUtils for IERC20Metadata; + + struct LoanInfo { + /// @notice Debt amount in debtToken token + uint128 debtAmt; + /// @notice Encoded collateral data + bytes collateralData; + } + + struct ValueAndPrice { + /// @notice USD value of collateral + uint256 collateralValue; + /// @notice USD value of debt with price and token decimals + uint256 debtValueWithDecimals; + /// @notice USD price of debt token + uint256 debtPrice; + /// @notice Denominator of USD price + uint256 priceDenominator; + /// @notice Denominator of debt token + uint256 debtDenominator; + /// @notice Encoded USD price of collateral token + bytes collateralPriceData; + } + + /// @notice Configuturation of Gearing Token + GtConfig _config; + /// @notice Total supply of Gearing Token + uint256 total; + /// @notice Mapping relationship between Gearing Token id and loan + mapping(uint256 => LoanInfo) loanMapping; + + uint8 debtDecimals; + + /** + * @inheritdoc IGearingToken + */ + function initialize(string memory name, string memory symbol, GtConfig memory config_, bytes memory initalParams) + external + virtual + override + initializer + { + __AbstractGearingToken_init(name, symbol, config_); + __GearingToken_Implement_init(initalParams); + emit GearingTokenInitialized(msg.sender, name, symbol, initalParams); + } + + function __AbstractGearingToken_init(string memory name, string memory symbol, GtConfig memory config_) + internal + onlyInitializing + { + if (config_.loanConfig.liquidationLtv <= config_.loanConfig.maxLtv) { + revert LiquidationLtvMustBeGreaterThanMaxLtv(); + } + __ERC721_init(name, symbol); + __Ownable_init(msg.sender); + _config = config_; + debtDecimals = _config.debtToken.decimals(); + } + + function __GearingToken_Implement_init(bytes memory initalParams) internal virtual; + + /** + * @inheritdoc IGearingToken + */ + function setTreasurer(address treasurer) external virtual onlyOwner { + _config.treasurer = treasurer; + } + + /** + * @inheritdoc IGearingToken + */ + function updateConfig(bytes memory configData) external virtual onlyOwner { + _updateConfig(configData); + emit UpdateConfig(configData); + } + + function _updateConfig(bytes memory configData) internal virtual; + + /** + * @inheritdoc IGearingToken + */ + function getGtConfig() external view virtual override returns (GtConfig memory) { + return _config; + } + + /** + * @inheritdoc IGearingToken + */ + function marketAddr() public view override returns (address) { + return owner(); + } + + /** + * @inheritdoc IGearingToken + */ + function liquidatable() external view virtual returns (bool) { + return _config.loanConfig.liquidatable; + } + + /** + * @inheritdoc IGearingToken + */ + function mint(address collateralProvider, address to, uint128 debtAmt, bytes memory collateralData) + external + virtual + override + nonReentrant + onlyOwner + returns (uint256 id) + { + _checkBeforeMint(debtAmt, collateralData); + _transferCollateralFrom(collateralProvider, address(this), collateralData); + id = _mintInternal(to, debtAmt, collateralData, _config); + } + + /// @notice Check if the loan can be minted + function _checkBeforeMint(uint128 debtAmt, bytes memory collateralData) internal virtual; + + function _mintInternal(address to, uint128 debtAmt, bytes memory collateralData, GtConfig memory config) + internal + returns (uint256 id) + { + LoanInfo memory loan = LoanInfo(debtAmt, collateralData); + ValueAndPrice memory valueAndPrice = _getValueAndPrice(config, loan); + uint128 ltv = _calculateLtv(valueAndPrice); + if (ltv > config.loanConfig.maxLtv) { + revert GtIsNotHealthy(0, to, ltv); + } + id = ++total; + loanMapping[id] = loan; + _safeMint(to, id); + } + + /** + * @inheritdoc IGearingToken + */ + function augmentDebt(address caller, uint256 id, uint256 ftAmt) external virtual override nonReentrant onlyOwner { + if (caller != ownerOf(id) && caller != getApproved(id)) { + revert AuthorizationFailed(id, caller); + } + GtConfig memory config = _config; + if (config.maturity <= block.timestamp) { + revert GtIsExpired(id); + } + + LoanInfo memory loan = loanMapping[id]; + loan.debtAmt += ftAmt.toUint128(); + + ValueAndPrice memory valueAndPrice = _getValueAndPrice(config, loan); + uint128 ltv = _calculateLtv(valueAndPrice); + if (ltv > config.loanConfig.maxLtv) { + revert GtIsNotHealthy(id, msg.sender, ltv); + } + loanMapping[id] = loan; + + emit AugmentDebt(id, ftAmt); + } + + /** + * @inheritdoc IGearingToken + */ + function loanInfo(uint256 id) + external + view + virtual + override + returns (address owner, uint128 debtAmt, bytes memory collateralData) + { + owner = ownerOf(id); + LoanInfo memory loan = loanMapping[id]; + debtAmt = loan.debtAmt; + collateralData = loan.collateralData; + } + + function _burnInternal(uint256 id) internal { + _burn(id); + delete loanMapping[id]; + } + + /** + * @inheritdoc IGearingToken + */ + function merge(uint256[] memory ids) external virtual nonReentrant returns (uint256 newId) { + uint128 totalDebtAmt; + bytes memory mergedCollateralData; + for (uint256 i = 0; i < ids.length; ++i) { + uint256 id = ids[i]; + LoanInfo memory loan = loanMapping[id]; + address owner = ownerOf(id); + if (msg.sender != owner) { + revert CanNotMergeLoanWithDiffOwner(id, owner); + } + totalDebtAmt += loan.debtAmt; + mergedCollateralData = + i == 0 ? loan.collateralData : _mergeCollateral(mergedCollateralData, loan.collateralData); + _burnInternal(id); + } + newId = _mintInternal(msg.sender, totalDebtAmt, mergedCollateralData, _config); + emit MergeGts(msg.sender, newId, ids); + } + + /** + * @inheritdoc IGearingToken + */ + function repay(uint256 id, uint128 repayAmt, bool byDebtToken) external virtual override nonReentrant { + GtConfig memory config = _config; + if (config.maturity <= block.timestamp) { + revert GtIsExpired(id); + } + + if (byDebtToken) { + config.debtToken.safeTransferFrom(msg.sender, marketAddr(), repayAmt); + } else { + // Those ft tokens have been approved to market and will be burn after maturity + config.ft.safeTransferFrom(msg.sender, marketAddr(), repayAmt); + } + (, bool repayAll) = _repay(id, repayAmt); + emit Repay(id, repayAmt, byDebtToken, repayAll); + } + + /// @inheritdoc IGearingToken + /// @notice This function is deprecated, please use `flashRepay( + // uint256 id, + // uint128 repayAmt, + // bool byDebtToken, + // bytes memory removedCollateral, + // bytes calldata callbackData + // )` instead + function flashRepay(uint256 id, bool byDebtToken, bytes calldata callbackData) + external + virtual + override + nonReentrant + { + LoanInfo memory loan = loanMapping[id]; + _flashRepay(id, loan.debtAmt, byDebtToken, loan.collateralData, callbackData); + } + + function flashRepay( + uint256 id, + uint128 repayAmt, + bool byDebtToken, + bytes memory removedCollateral, + bytes calldata callbackData + ) external virtual override nonReentrant returns (bool) { + return _flashRepay(id, repayAmt, byDebtToken, removedCollateral, callbackData); + } + + function _flashRepay( + uint256 id, + uint128 repayAmt, + bool byDebtToken, + bytes memory removedCollateral, + bytes calldata callbackData + ) internal returns (bool) { + GtConfig memory config = _config; + if (config.maturity <= block.timestamp) { + revert GtIsExpired(id); + } + if (ownerOf(id) != msg.sender) { + revert CallerIsNotTheOwner(id); + } + (LoanInfo memory loan, bool repayAll) = _repay(id, repayAmt); + // Check ltv after partial repayment + if (!repayAll) { + loan.collateralData = _removeCollateral(loan, removedCollateral); + ValueAndPrice memory valueAndPrice = _getValueAndPrice(config, loan); + uint128 ltv = _calculateLtv(valueAndPrice); + require(ltv <= config.loanConfig.maxLtv, GtIsNotHealthy(id, msg.sender, ltv)); + loanMapping[id] = loan; + // Transfer collateral to the owner + _transferCollateral(msg.sender, removedCollateral); + } + + IERC20 repayToken = byDebtToken ? config.debtToken : config.ft; + + IFlashRepayer(msg.sender).executeOperation( + repayToken, repayAmt, config.collateral, removedCollateral, callbackData + ); + repayToken.safeTransferFrom(msg.sender, owner(), repayAmt); + emit FlashRepay(id, msg.sender, repayAmt, byDebtToken, repayAll, removedCollateral); + return repayAll; + } + + function _repay(uint256 id, uint128 repayAmt) internal returns (LoanInfo memory loan, bool repayAll) { + loan = loanMapping[id]; + if (repayAmt > loan.debtAmt) { + revert RepayAmtExceedsMaxRepayAmt(id, repayAmt, loan.debtAmt); + } + loan.debtAmt = loan.debtAmt - repayAmt; + if (loan.debtAmt == 0) { + address gtOwner = ownerOf(id); + // Burn this nft + _burnInternal(id); + _transferCollateral(gtOwner, loan.collateralData); + repayAll = true; + } else { + loanMapping[id].debtAmt = loan.debtAmt; + } + } + + /** + * @inheritdoc IGearingToken + */ + function removeCollateral(uint256 id, bytes memory collateralData) external virtual override nonReentrant { + if (msg.sender != ownerOf(id)) { + revert CallerIsNotTheOwner(id); + } + + GtConfig memory config = _config; + if (config.maturity <= block.timestamp) { + revert GtIsExpired(id); + } + + LoanInfo memory loan = loanMapping[id]; + loan.collateralData = _removeCollateral(loan, collateralData); + + ValueAndPrice memory valueAndPrice = _getValueAndPrice(config, loan); + uint128 ltv = _calculateLtv(valueAndPrice); + if (ltv > config.loanConfig.maxLtv) { + revert GtIsNotHealthy(id, msg.sender, ltv); + } + loanMapping[id] = loan; + + // Transfer collateral to the owner + _transferCollateral(msg.sender, collateralData); + + emit RemoveCollateral(id, loan.collateralData); + } + + function _removeCollateral(LoanInfo memory loan, bytes memory collateralData) + internal + virtual + returns (bytes memory); + + /** + * @inheritdoc IGearingToken + */ + function addCollateral(uint256 id, bytes memory collateralData) external virtual override nonReentrant { + if (_config.maturity <= block.timestamp) { + revert GtIsExpired(id); + } + LoanInfo memory loan = loanMapping[id]; + + _transferCollateralFrom(msg.sender, address(this), collateralData); + loan.collateralData = _addCollateral(loan, collateralData); + loanMapping[id] = loan; + emit AddCollateral(id, loan.collateralData); + } + + function _addCollateral(LoanInfo memory loan, bytes memory collateralData) + internal + virtual + returns (bytes memory); + + /** + * @inheritdoc IGearingToken + */ + function getLiquidationInfo(uint256 id) + external + view + virtual + returns (bool isLiquidable, uint128 ltv, uint128 maxRepayAmt) + { + LoanInfo memory loan = loanMapping[id]; + GtConfig memory config = _config; + (isLiquidable, maxRepayAmt, ltv,) = _getLiquidationInfo(loan, config); + } + + function _getLiquidationInfo(LoanInfo memory loan, GtConfig memory config) + internal + view + returns (bool isLiquidable, uint128 maxRepayAmt, uint128 ltv, ValueAndPrice memory valueAndPrice) + { + valueAndPrice = _getValueAndPrice(config, loan); + ltv = _calculateLtv(valueAndPrice); + + if (config.loanConfig.liquidatable) { + // Liquidation cases: + // t >= m + w => F, "No liquidation after maturity plus liquidation window + // t >= m && t < m + w => T, "Liquidation allowed during liquidation window" + // t < m => ltv >= lltv => T, "Liquidation only allowed before maturity if ltv >= lltv" + + if (block.timestamp >= config.maturity + Constants.LIQUIDATION_WINDOW) { + isLiquidable = false; + } else if (block.timestamp >= config.maturity) { + isLiquidable = true; + maxRepayAmt = loan.debtAmt; + } else if (ltv >= config.loanConfig.liquidationLtv) { + isLiquidable = true; + // collateralValue(price decimals) and HALF_LIQUIDATION_THRESHOLD(base decimals 1e8) + maxRepayAmt = (valueAndPrice.collateralValue * Constants.DECIMAL_BASE) / valueAndPrice.priceDenominator + < GearingTokenConstants.HALF_LIQUIDATION_THRESHOLD ? loan.debtAmt : loan.debtAmt / 2; + } + } + } + + /** + * @inheritdoc IGearingToken + */ + function liquidate(uint256 id, uint128 repayAmt, bool byDebtToken) external virtual override nonReentrant { + LoanInfo memory loan = loanMapping[id]; + GtConfig memory config = _config; + if (!config.loanConfig.liquidatable) { + revert GtDoNotSupportLiquidation(); + } + (bool isLiquidable, uint128 maxRepayAmt, uint128 ltvBefore, ValueAndPrice memory valueAndPrice) = + _getLiquidationInfo(loan, config); + + if (!isLiquidable) { + uint256 liquidationDeadline = config.maturity + Constants.LIQUIDATION_WINDOW; + if (block.timestamp >= liquidationDeadline) { + revert CanNotLiquidationAfterFinalDeadline(id, liquidationDeadline); + } + revert GtIsSafe(id); + } + if (repayAmt > maxRepayAmt) { + revert RepayAmtExceedsMaxRepayAmt(id, repayAmt, maxRepayAmt); + } + // Transfer token + if (byDebtToken) { + config.debtToken.safeTransferFrom(msg.sender, marketAddr(), repayAmt); + } else { + config.ft.safeTransferFrom(msg.sender, marketAddr(), repayAmt); + } + + // Do liquidate + (bytes memory cToLiquidator, bytes memory cToTreasurer, bytes memory remainningC) = + _calcLiquidationResult(loan, repayAmt, valueAndPrice); + + if (repayAmt == loan.debtAmt) { + if (remainningC.length > 0) { + _transferCollateral(ownerOf(id), remainningC); + } + // update storage + _burnInternal(id); + } else { + loan.debtAmt -= repayAmt; + loan.collateralData = remainningC; + + // Check ltv after partial liquidation + { + valueAndPrice.collateralValue = _getCollateralValue(remainningC, valueAndPrice.collateralPriceData); + valueAndPrice.debtValueWithDecimals = + (loan.debtAmt * valueAndPrice.debtPrice) / valueAndPrice.debtDenominator; + uint128 ltvAfter = _calculateLtv(valueAndPrice); + if (ltvBefore < ltvAfter) { + revert LtvIncreasedAfterLiquidation(id, ltvBefore, ltvAfter); + } + } + // update storage + loanMapping[id] = loan; + } + // Transfer collateral + if (cToTreasurer.length > 0) { + _transferCollateral(config.treasurer, cToTreasurer); + } + _transferCollateral(msg.sender, cToLiquidator); + + emit Liquidate(id, msg.sender, repayAmt, byDebtToken, cToLiquidator, cToTreasurer, remainningC); + } + + /// @notice Return the collateral distribution plan after liquidation + /// @param loan The loan data, contains debt amount and collateral data + /// @param repayAmt The amount of the debt to be liquidate + /// @param valueAndPrice Debt and collateral prices, values + /// @return cToLiquidator Collateral data assigned to liquidator + /// @return cToTreasurer Collateral data assigned to protocol + /// @return remainningC Remainning collateral data, will assigned to debt's owner + /// if the debt is fully liquidated. + function _calcLiquidationResult(LoanInfo memory loan, uint128 repayAmt, ValueAndPrice memory valueAndPrice) + internal + virtual + returns (bytes memory cToLiquidator, bytes memory cToTreasurer, bytes memory remainningC); + + /** + * @inheritdoc IGearingToken + */ + function getCollateralValue(bytes memory collateralData) + external + view + virtual + override + returns (uint256 collateralValue) + { + bytes memory priceData = _getCollateralPriceData(_config); + return _getCollateralValue(collateralData, priceData); + } + + /** + * @inheritdoc IGearingToken + */ + function previewDelivery(uint256 proportion) external view virtual override returns (bytes memory deliveryData) { + deliveryData = _delivery(proportion); + } + + /** + * @inheritdoc IGearingToken + */ + function delivery(uint256 proportion, address to) + external + virtual + override + nonReentrant + onlyOwner + returns (bytes memory deliveryData) + { + deliveryData = _delivery(proportion); + _transferCollateral(to, deliveryData); + } + + function _delivery(uint256 proportion) internal view virtual returns (bytes memory deliveryData); + + function _getValueAndPrice(GtConfig memory config, LoanInfo memory loan) + internal + view + returns (ValueAndPrice memory valueAndPrice) + { + valueAndPrice.collateralPriceData = _getCollateralPriceData(config); + valueAndPrice.collateralValue = _getCollateralValue(loan.collateralData, valueAndPrice.collateralPriceData); + + uint8 priceDecimals; + (valueAndPrice.debtPrice, priceDecimals) = config.loanConfig.oracle.getPrice(address(config.debtToken)); + valueAndPrice.priceDenominator = 10 ** priceDecimals; + + valueAndPrice.debtDenominator = 10 ** debtDecimals; + + valueAndPrice.debtValueWithDecimals = (loan.debtAmt * valueAndPrice.debtPrice) / valueAndPrice.debtDenominator; + } + + /// @notice Return the loan to value of this loan + /// @param valueAndPrice Debt and collateral prices, values + /// @return ltv The loan to value of this loan + function _calculateLtv(ValueAndPrice memory valueAndPrice) internal pure returns (uint128 ltv) { + if (valueAndPrice.collateralValue == 0) { + return type(uint128).max; + } + // debtValueWithDecimals(price decimals) collateralValue(base decimals) + ltv = ( + (valueAndPrice.debtValueWithDecimals * Constants.DECIMAL_BASE_SQ) + / (valueAndPrice.collateralValue * valueAndPrice.priceDenominator) + ).toUint128(); + } + + /// @notice Merge collateral data + function _mergeCollateral(bytes memory collateralDataA, bytes memory collateralDataB) + internal + virtual + returns (bytes memory collateralData); + + /// @notice Transfer collateral from 'from' to 'to' + function _transferCollateralFrom(address from, address to, bytes memory collateralData) internal virtual; + + /// @notice Transfer collateral from this contracct to 'to' + function _transferCollateral(address to, bytes memory collateralData) internal virtual; + + /// @notice Return the value of collateral in USD with base decimals + /// @param collateralData encoded collateral data + /// @param priceData encoded price data of the collateral + /// @return collateralValue collateral's value in USD + function _getCollateralValue(bytes memory collateralData, bytes memory priceData) + internal + view + virtual + returns (uint256 collateralValue); + + /// @notice Return the encoded price of collateral in USD + function _getCollateralPriceData(GtConfig memory config) internal view virtual returns (bytes memory priceData); +} diff --git a/contracts/v2/tokens/GearingTokenWithERC20V2.sol b/contracts/v2/tokens/GearingTokenWithERC20V2.sol new file mode 100644 index 0000000..bd5f111 --- /dev/null +++ b/contracts/v2/tokens/GearingTokenWithERC20V2.sol @@ -0,0 +1,228 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.27; + +import {MathLib} from "../../v1/lib/MathLib.sol"; +import "./AbstractGearingTokenV2.sol"; + +/** + * @title TermMax Gearing Token, using ERC20 token as collateral + * @author Term Structure Labs + */ +contract GearingTokenWithERC20V2 is AbstractGearingTokenV2 { + using SafeCast for uint256; + using SafeCast for int256; + using TransferUtils for IERC20; + using TransferUtils for IERC20Metadata; + using MathLib for *; + + /// @notice The operation failed because the collateral capacity is exceeded + error CollateralCapacityExceeded(); + + /// @notice The operation failed because the amount can not be uint256 max + error AmountCanNotBeUint256Max(); + + /// @notice Emitted when the collateral capacity is updated + event CollateralCapacityUpdated(uint256 newCapacity); + + /// @notice The max capacity of collateral token + uint256 public collateralCapacity; + + uint8 collateralDecimals; + + constructor() { + _disableInitializers(); + } + + function __GearingToken_Implement_init(bytes memory initalParams) internal override onlyInitializing { + _updateConfig(initalParams); + collateralDecimals = IERC20Metadata(_config.collateral).decimals(); + } + + function _updateConfig(bytes memory configData) internal virtual override { + collateralCapacity = abi.decode(configData, (uint256)); + emit CollateralCapacityUpdated(collateralCapacity); + } + + function _checkBeforeMint(uint128, bytes memory collateralData) internal virtual override { + if (IERC20(_config.collateral).balanceOf(address(this)) + _decodeAmount(collateralData) > collateralCapacity) { + revert CollateralCapacityExceeded(); + } + } + + function _delivery(uint256 proportion) internal view virtual override returns (bytes memory deliveryData) { + uint256 collateralReserve = IERC20(_config.collateral).balanceOf(address(this)); + uint256 amount = (collateralReserve * proportion) / Constants.DECIMAL_BASE_SQ; + deliveryData = abi.encode(amount); + } + + /** + * @inheritdoc AbstractGearingTokenV2 + */ + function _mergeCollateral(bytes memory collateralDataA, bytes memory collateralDataB) + internal + virtual + override + returns (bytes memory collateralData) + { + uint256 total = _decodeAmount(collateralDataA) + _decodeAmount(collateralDataB); + collateralData = abi.encode(total); + } + + /** + * @inheritdoc AbstractGearingTokenV2 + */ + function _transferCollateralFrom(address from, address to, bytes memory collateralData) internal virtual override { + uint256 amount = _decodeAmount(collateralData); + IERC20(_config.collateral).safeTransferFrom(from, to, amount); + } + + /** + * @inheritdoc AbstractGearingTokenV2 + */ + function _transferCollateral(address to, bytes memory collateralData) internal virtual override { + uint256 amount = _decodeAmount(collateralData); + IERC20(_config.collateral).safeTransfer(to, amount); + } + + /** + * @inheritdoc AbstractGearingTokenV2 + */ + function _getCollateralValue(bytes memory collateralData, bytes memory priceData) + internal + view + virtual + override + returns (uint256) + { + uint256 collateralAmt = _decodeAmount(collateralData); + (uint256 price, uint256 priceDenominator, uint256 collateralDemonimator) = + abi.decode(priceData, (uint256, uint256, uint256)); + return (collateralAmt * price * Constants.DECIMAL_BASE) / (priceDenominator * collateralDemonimator); + } + + /** + * @inheritdoc AbstractGearingTokenV2 + */ + function _getCollateralPriceData(GtConfig memory config) + internal + view + virtual + override + returns (bytes memory priceData) + { + (uint256 price, uint8 decimals) = config.loanConfig.oracle.getPrice(config.collateral); + uint256 priceDenominator = 10 ** decimals; + + uint256 cTokenDenominator = 10 ** collateralDecimals; + priceData = abi.encode(price, priceDenominator, cTokenDenominator); + } + + /// @notice Encode amount to collateral data + function _decodeAmount(bytes memory collateralData) internal pure returns (uint256 amount) { + amount = abi.decode(collateralData, (uint256)); + if (amount == type(uint256).max) { + revert AmountCanNotBeUint256Max(); + } + } + + /// @notice Decode amount from collateral data + function _encodeAmount(uint256 amount) internal pure returns (bytes memory) { + return abi.encode(amount); + } + + /** + * @inheritdoc AbstractGearingTokenV2 + */ + function _removeCollateral(LoanInfo memory loan, bytes memory collateralData) + internal + virtual + override + returns (bytes memory) + { + uint256 amount = _decodeAmount(loan.collateralData) - _decodeAmount(collateralData); + return _encodeAmount(amount); + } + + /** + * @inheritdoc AbstractGearingTokenV2 + */ + function _addCollateral(LoanInfo memory loan, bytes memory collateralData) + internal + virtual + override + returns (bytes memory) + { + uint256 amount = _decodeAmount(loan.collateralData) + _decodeAmount(collateralData); + return _encodeAmount(amount); + } + + /** + * @inheritdoc AbstractGearingTokenV2 + */ + function _calcLiquidationResult(LoanInfo memory loan, uint128 repayAmt, ValueAndPrice memory valueAndPrice) + internal + virtual + override + returns (bytes memory cToLiquidator, bytes memory cToTreasurer, bytes memory remainningC) + { + uint256 collateralAmt = _decodeAmount(loan.collateralData); + + (uint256 collateralPrice, uint256 cPriceDenominator, uint256 cTokenDenominator) = + abi.decode(valueAndPrice.collateralPriceData, (uint256, uint256, uint256)); + + // maxRomvedCollateral = min( + // (repayAmt * (1 + REWARD_TO_LIQUIDATOR + REWARD_TO_PROTOCOL)) * debtTokenPrice / collateralTokenPrice , + // collateralAmt *(repayAmt / debtAmt) + // ) + + /* DP := debt token price (valueAndPrice.debtPrice) + * DPD := debt token price decimal (valueAndPrice.priceDenominator) + * CP := collateral token price (collateralPrice) + * CPD := collateral token price decimal (cPriceDenominator) + * SD := scaling decimal = DPD * CPD * 10 + * The value of 1(decimal) debt token / The value of 1(decimal) collateral token + * ddPriceToCdPrice = roundUp((DP/DPD) / (CP/CPD) = (DP*CPD*SD) / (CP*DPD)) + * = roundUp((DP*CPD*CPD*10) / CP) + */ + uint256 ddPriceToCdPrice = ( + valueAndPrice.debtPrice * cPriceDenominator * cPriceDenominator * 10 + collateralPrice - 1 + ) / collateralPrice; + + // calculate the amount of collateral that is equivalent to repayAmt + // with debt to collateral price + uint256 cEqualRepayAmt = (repayAmt * ddPriceToCdPrice * cTokenDenominator) + / (valueAndPrice.debtDenominator * cPriceDenominator * valueAndPrice.priceDenominator * 10); + + uint256 rewardToLiquidator = + (cEqualRepayAmt * GearingTokenConstants.REWARD_TO_LIQUIDATOR) / Constants.DECIMAL_BASE; + uint256 rewardToProtocol = (cEqualRepayAmt * GearingTokenConstants.REWARD_TO_PROTOCOL) / Constants.DECIMAL_BASE; + + uint256 removedCollateralAmt = cEqualRepayAmt + rewardToLiquidator + rewardToProtocol; + + if (loan.debtAmt == 0) { + removedCollateralAmt = 0; + } else { + removedCollateralAmt = removedCollateralAmt.min((collateralAmt * repayAmt) / loan.debtAmt); + } + + // Case 1: removed collateral can not cover repayAmt + rewardToLiquidator + if (removedCollateralAmt <= cEqualRepayAmt + rewardToLiquidator) { + cToLiquidator = _encodeAmount(removedCollateralAmt); + cToTreasurer = _encodeAmount(0); + remainningC = _encodeAmount(0); + } + // Case 2: removed collateral can cover repayAmt + rewardToLiquidator but not rewardToProtocol + else if (removedCollateralAmt < cEqualRepayAmt + rewardToLiquidator + rewardToProtocol) { + cToLiquidator = _encodeAmount(cEqualRepayAmt + rewardToLiquidator); + cToTreasurer = _encodeAmount(removedCollateralAmt - cEqualRepayAmt - rewardToLiquidator); + remainningC = _encodeAmount(0); + } + // Case 3: removed collateral equal repayAmt + rewardToLiquidator + rewardToProtocol + else { + cToLiquidator = _encodeAmount(cEqualRepayAmt + rewardToLiquidator); + cToTreasurer = _encodeAmount(rewardToProtocol); + } + // Calculate remainning collateral + remainningC = _encodeAmount(collateralAmt - removedCollateralAmt); + } +} diff --git a/contracts/v2/tokens/MintableERC20V2.sol b/contracts/v2/tokens/MintableERC20V2.sol index 3074dbf..0dc6063 100644 --- a/contracts/v2/tokens/MintableERC20V2.sol +++ b/contracts/v2/tokens/MintableERC20V2.sol @@ -12,7 +12,7 @@ contract MintableERC20V2 is MintableERC20, IMintableERC20V2 { /** * @inheritdoc IMintableERC20V2 */ - function burn(address owner, address spender, uint256 amount) external override onlyOwner { + function burn(address owner, address spender, uint256 amount) external virtual override onlyOwner { if (owner != spender) { _spendAllowance(owner, spender, amount); } diff --git a/contracts/v2/vault/ITermMaxVaultV2.sol b/contracts/v2/vault/ITermMaxVaultV2.sol new file mode 100644 index 0000000..a486fea --- /dev/null +++ b/contracts/v2/vault/ITermMaxVaultV2.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +interface ITermMaxVaultV2 { + function apy() external view returns (uint256); +} diff --git a/contracts/v2/vault/TermMaxVaultV2.sol b/contracts/v2/vault/TermMaxVaultV2.sol new file mode 100644 index 0000000..118f9af --- /dev/null +++ b/contracts/v2/vault/TermMaxVaultV2.sol @@ -0,0 +1,764 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +pragma solidity ^0.8.27; + +/** + * @title TermMaxVaultV2 + * @notice This contract is inspired by MetaMorphoV1_1 (https://github.com/morpho-org/metamorpho-v1.1/blob/main/src/MetaMorphoV1_1.sol) + * @dev The role management structure is based on Morpho's role system (https://docs.morpho.org/curation/concepts/roles/) + * with similar separation of curator, guardian, and allocator roles for enhanced governance and risk management. + */ +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; +import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; +import { + IERC4626, + ERC4626Upgradeable, + ERC20Upgradeable +} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC4626Upgradeable.sol"; +import {Ownable2StepUpgradeable} from "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; +import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; +import {PendingLib, PendingAddress, PendingUint192} from "../../v1/lib/PendingLib.sol"; +import {ITermMaxMarket} from "../../v1/ITermMaxMarket.sol"; +import {CurveCuts, VaultInitialParams} from "../../v1/storage/TermMaxStorage.sol"; +import {ITermMaxOrder} from "../../v1/ITermMaxOrder.sol"; +import {VaultConstants} from "../../v1/lib/VaultConstants.sol"; +import {TransferUtils} from "../../v1/lib/TransferUtils.sol"; +import {ISwapCallback} from "../../v1/ISwapCallback.sol"; +import {VaultErrors} from "../../v1/errors/VaultErrors.sol"; +import {VaultEvents} from "../../v1/events/VaultEvents.sol"; +import {IOrderManager} from "../../v1/vault/IOrderManager.sol"; +import {VaultStorage, OrderInfo} from "../../v1/vault/VaultStorage.sol"; +import {Constants} from "../../v1/lib/Constants.sol"; +import {ITermMaxVault} from "../../v1/vault/ITermMaxVault.sol"; +import {ITermMaxVaultV2} from "./ITermMaxVaultV2.sol"; + +contract TermMaxVaultV2 is + VaultStorage, + ITermMaxVault, + Ownable2StepUpgradeable, + ReentrancyGuardUpgradeable, + ERC4626Upgradeable, + PausableUpgradeable, + VaultErrors, + VaultEvents, + ISwapCallback, + ITermMaxVaultV2 +{ + using SafeCast for uint256; + using TransferUtils for IERC20; + using PendingLib for *; + + address public immutable ORDER_MANAGER_SINGLETON; + + modifier onlyCuratorRole() { + address sender = _msgSender(); + if (sender != _curator && sender != owner()) revert NotCuratorRole(); + _; + } + + /// @dev Reverts if the caller doesn't have the guardian role. + modifier onlyGuardianRole() { + address sender = _msgSender(); + if (sender != _guardian && sender != owner()) revert NotGuardianRole(); + + _; + } + + /// @dev Reverts if the caller doesn't have the allocator role. + modifier onlyAllocatorRole() { + address sender = _msgSender(); + if (!_isAllocator[sender] && sender != _curator && sender != owner()) { + revert NotAllocatorRole(); + } + _; + } + + modifier marketIsWhitelisted(address market) { + if (_pendingMarkets[market].validAt != 0 && block.timestamp > _pendingMarkets[market].validAt) { + _marketWhitelist[market] = true; + } + if (!_marketWhitelist[market]) revert MarketNotWhitelisted(); + _; + } + + /// @dev Makes sure conditions are met to accept a pending value. + /// @dev Reverts if: + /// - there's no pending value; + /// - the timelock has not elapsed since the pending value has been submitted. + modifier afterTimelock(uint256 validAt) { + if (validAt == 0) revert NoPendingValue(); + if (block.timestamp < validAt) revert TimelockNotElapsed(); + _; + } + + constructor(address ORDER_MANAGER_SINGLETON_) { + if (ORDER_MANAGER_SINGLETON_ == address(0)) revert InvalidImplementation(); + ORDER_MANAGER_SINGLETON = ORDER_MANAGER_SINGLETON_; + _disableInitializers(); + } + + function initialize(VaultInitialParams memory params) external virtual initializer { + __ERC20_init(params.name, params.symbol); + __Ownable_init(params.admin); + __ERC4626_init(params.asset); + __ReentrancyGuard_init(); + __Pausable_init(); + + _setPerformanceFeeRate(params.performanceFeeRate); + _checkTimelockBounds(params.timelock); + _timelock = params.timelock; + _maxCapacity = params.maxCapacity; + _curator = params.curator; + } + + function _setPerformanceFeeRate(uint64 newPerformanceFeeRate) internal { + _delegateCall(abi.encodeCall(IOrderManager.accruedInterest, ())); + _performanceFeeRate = newPerformanceFeeRate; + } + + /// @notice View functions + + /** + * @inheritdoc ITermMaxVault + */ + function guardian() external view virtual returns (address) { + return _guardian; + } + + /** + * @inheritdoc ITermMaxVault + */ + function curator() external view virtual returns (address) { + return _curator; + } + + /** + * @inheritdoc ITermMaxVault + */ + function isAllocator(address allocator) external view virtual returns (bool) { + return _isAllocator[allocator]; + } + + /** + * @inheritdoc ITermMaxVault + */ + function marketWhitelist(address market) external view virtual returns (bool) { + return _marketWhitelist[market]; + } + + /** + * @inheritdoc ITermMaxVault + */ + function timelock() external view virtual returns (uint256) { + return _timelock; + } + + /** + * @inheritdoc ITermMaxVault + */ + function pendingMarkets(address market) external view virtual returns (PendingUint192 memory) { + return _pendingMarkets[market]; + } + + /** + * @inheritdoc ITermMaxVault + */ + function pendingTimelock() external view virtual returns (PendingUint192 memory) { + return _pendingTimelock; + } + + /** + * @inheritdoc ITermMaxVault + */ + function pendingPerformanceFeeRate() external view virtual returns (PendingUint192 memory) { + return _pendingPerformanceFeeRate; + } + + /** + * @inheritdoc ITermMaxVault + */ + function pendingGuardian() external view virtual returns (PendingAddress memory) { + return _pendingGuardian; + } + + /** + * @inheritdoc ITermMaxVault + */ + function performanceFeeRate() external view virtual returns (uint64) { + return _performanceFeeRate; + } + + /** + * @inheritdoc ITermMaxVault + */ + function totalFt() external view virtual returns (uint256) { + return _totalFt / Constants.DECIMAL_BASE_SQ; + } + + /** + * @inheritdoc ITermMaxVault + */ + function accretingPrincipal() external view virtual returns (uint256) { + (uint256 ap,) = _previewAccruedInterest(); + return ap / Constants.DECIMAL_BASE_SQ; + } + + /** + * @inheritdoc ITermMaxVault + */ + function annualizedInterest() external view virtual returns (uint256) { + return _annualizedInterest / Constants.DECIMAL_BASE_SQ; + } + + /** + * @inheritdoc ITermMaxVault + */ + function performanceFee() external view virtual returns (uint256) { + (, uint256 pf) = _previewAccruedInterest(); + return pf / Constants.DECIMAL_BASE_SQ; + } + + /** + * @inheritdoc ITermMaxVault + */ + function supplyQueue(uint256 index) external view virtual returns (address) { + return _supplyQueue[index]; + } + + /** + * @inheritdoc ITermMaxVault + */ + function withdrawQueue(uint256 index) external view virtual returns (address) { + return _withdrawQueue[index]; + } + + /** + * @inheritdoc ITermMaxVault + */ + function orderMapping(address order) external view virtual returns (OrderInfo memory) { + return _orderMapping[order]; + } + + /** + * @inheritdoc ITermMaxVault + */ + function badDebtMapping(address collateral) external view virtual returns (uint256) { + return _badDebtMapping[collateral]; + } + + /** + * @inheritdoc ITermMaxVault + */ + function apr() external view virtual returns (uint256) { + revert("Method not implemented, use apy() instead"); + } + + /** + * @inheritdoc ITermMaxVaultV2 + */ + function apy() external view virtual override returns (uint256) { + if (_accretingPrincipal == 0) return 0; + return (_annualizedInterest * (Constants.DECIMAL_BASE - _performanceFeeRate)) / (_accretingPrincipal); + } + + /** + * @inheritdoc ITermMaxVault + */ + function supplyQueueLength() external view virtual returns (uint256) { + return _supplyQueue.length; + } + + /** + * @inheritdoc ITermMaxVault + */ + function withdrawQueueLength() external view virtual returns (uint256) { + return _withdrawQueue.length; + } + + // Ordermanager functions + /** + * @inheritdoc ITermMaxVault + */ + function createOrder(ITermMaxMarket market, uint256 maxSupply, uint256 initialReserve, CurveCuts memory curveCuts) + external + virtual + onlyCuratorRole + marketIsWhitelisted(address(market)) + whenNotPaused + returns (ITermMaxOrder order) + { + order = abi.decode( + _delegateCall( + abi.encodeCall( + IOrderManager.createOrder, (IERC20(asset()), market, maxSupply, initialReserve, curveCuts) + ) + ), + (ITermMaxOrder) + ); + } + + /** + * @inheritdoc ITermMaxVault + */ + function updateOrders( + ITermMaxOrder[] memory orders, + int256[] memory changes, + uint256[] memory maxSupplies, + CurveCuts[] memory curveCuts + ) external virtual onlyCuratorRole whenNotPaused { + _delegateCall( + abi.encodeCall(IOrderManager.updateOrders, (IERC20(asset()), orders, changes, maxSupplies, curveCuts)) + ); + } + + /** + * @inheritdoc ITermMaxVault + */ + function redeemOrder(ITermMaxOrder order) external virtual onlyCuratorRole { + _delegateCall(abi.encodeCall(IOrderManager.redeemOrder, (order))); + } + + /** + * @inheritdoc ITermMaxVault + */ + function withdrawPerformanceFee(address recipient, uint256 amount) + external + virtual + nonReentrant + whenNotPaused + onlyCuratorRole + { + _delegateCall(abi.encodeCall(IOrderManager.withdrawPerformanceFee, (IERC20(asset()), recipient, amount))); + } + + // ERC4626 functions + + /** + * @dev See {IERC4626-maxDeposit}. + */ + function maxDeposit(address) public view override(IERC4626, ERC4626Upgradeable) returns (uint256) { + if (paused()) return 0; + if (totalAssets() >= _maxCapacity) return 0; + return _maxCapacity - totalAssets(); + } + + /** + * @dev See {IERC4626-maxMint}. + */ + function maxMint(address) public view override(IERC4626, ERC4626Upgradeable) returns (uint256) { + if (paused()) return 0; + return convertToShares(maxDeposit(address(0))); + } + + /** + * @dev Get total assets, falling back to real assets if virtual assets exceed limit + */ + function totalAssets() public view override(IERC4626, ERC4626Upgradeable) returns (uint256) { + (uint256 previewPrincipal,) = _previewAccruedInterest(); + return previewPrincipal / Constants.DECIMAL_BASE_SQ; + } + + /** + * @dev Deposit/mint common workflow. + */ + function _deposit(address caller, address recipient, uint256 assets, uint256 shares) + internal + override + nonReentrant + whenNotPaused + { + IERC20(asset()).safeTransferFrom(caller, address(this), assets); + + _delegateCall(abi.encodeCall(IOrderManager.depositAssets, (IERC20(asset()), assets))); + _mint(recipient, shares); + + emit Deposit(caller, recipient, assets, shares); + } + + /** + * @dev Withdraw/redeem common workflow. + */ + function _withdraw(address caller, address receiver, address owner, uint256 assets, uint256 shares) + internal + override + nonReentrant + { + if (caller != owner) { + _spendAllowance(owner, caller, shares); + } + + _delegateCall(abi.encodeCall(IOrderManager.withdrawAssets, (IERC20(asset()), receiver, assets))); + _burn(owner, shares); + + emit Withdraw(caller, receiver, owner, assets, shares); + } + + function _delegateCall(bytes memory data) internal returns (bytes memory) { + (bool success, bytes memory returnData) = ORDER_MANAGER_SINGLETON.delegatecall(data); + if (!success) { + assembly { + let ptr := add(returnData, 0x20) + let len := mload(returnData) + revert(ptr, len) + } + } + return returnData; + } + + /** + * @inheritdoc ITermMaxVault + */ + function dealBadDebt(address collateral, uint256 badDebtAmt, address recipient, address owner) + external + virtual + nonReentrant + returns (uint256 shares, uint256 collateralOut) + { + address caller = msg.sender; + shares = previewWithdraw(badDebtAmt); + uint256 maxShares = maxRedeem(owner); + if (shares > maxShares) { + revert ERC4626ExceededMaxMint(recipient, shares, maxShares); + } + + if (caller != owner) { + _spendAllowance(owner, caller, shares); + } + + _burn(owner, shares); + + collateralOut = abi.decode( + _delegateCall(abi.encodeCall(IOrderManager.dealBadDebt, (recipient, collateral, badDebtAmt))), (uint256) + ); + + emit DealBadDebt(caller, recipient, collateral, badDebtAmt, shares, collateralOut); + } + + // Guardian functions + function _setTimelock(uint256 newTimelock) internal { + _timelock = newTimelock; + + emit SetTimelock(msg.sender, newTimelock); + + delete _pendingTimelock; + } + + /** + * @inheritdoc ITermMaxVault + */ + function submitTimelock(uint256 newTimelock) external virtual onlyCuratorRole { + if (newTimelock == _timelock) revert AlreadySet(); + if (_pendingTimelock.validAt != 0) revert AlreadyPending(); + _checkTimelockBounds(newTimelock); + + if (newTimelock > _timelock) { + _setTimelock(newTimelock); + } else { + // Safe "unchecked" cast because newTimelock <= MAX_TIMELOCK. + _pendingTimelock.update(uint184(newTimelock), _timelock); + + emit SubmitTimelock(newTimelock, _pendingTimelock.validAt); + } + } + + /** + * @inheritdoc ITermMaxVault + */ + function setCapacity(uint256 newCapacity) external virtual onlyCuratorRole { + if (newCapacity == _maxCapacity) revert AlreadySet(); + _maxCapacity = newCapacity; + emit SetCapacity(_msgSender(), newCapacity); + } + + function _checkTimelockBounds(uint256 newTimelock) internal pure { + if (newTimelock > VaultConstants.MAX_TIMELOCK) revert AboveMaxTimelock(); + if (newTimelock < VaultConstants.POST_INITIALIZATION_MIN_TIMELOCK) revert BelowMinTimelock(); + } + + /** + * @inheritdoc ITermMaxVault + */ + function submitPerformanceFeeRate(uint184 newPerformanceFeeRate) external virtual onlyCuratorRole { + if (newPerformanceFeeRate == _performanceFeeRate) revert AlreadySet(); + if (_pendingPerformanceFeeRate.validAt != 0) revert AlreadyPending(); + if (newPerformanceFeeRate > VaultConstants.MAX_PERFORMANCE_FEE_RATE) revert PerformanceFeeRateExceeded(); + if (newPerformanceFeeRate < _performanceFeeRate) { + _setPerformanceFeeRate(uint256(newPerformanceFeeRate).toUint64()); + emit SetPerformanceFeeRate(_msgSender(), newPerformanceFeeRate); + return; + } else { + _pendingPerformanceFeeRate.update(newPerformanceFeeRate, _timelock); + emit SubmitPerformanceFeeRate(newPerformanceFeeRate, _pendingPerformanceFeeRate.validAt); + } + } + + /** + * @inheritdoc ITermMaxVault + */ + function submitGuardian(address newGuardian) external virtual onlyOwner { + if (newGuardian == _guardian) revert AlreadySet(); + if (_pendingGuardian.validAt != 0) revert AlreadyPending(); + + if (_guardian == address(0)) { + _setGuardian(newGuardian); + } else { + _pendingGuardian.update(newGuardian, _timelock); + emit SubmitGuardian(newGuardian, _pendingGuardian.validAt); + } + } + + /// @dev Sets `guardian` to `newGuardian`. + function _setGuardian(address newGuardian) internal { + _guardian = newGuardian; + emit SetGuardian(_msgSender(), newGuardian); + + delete _pendingGuardian; + } + + /** + * @inheritdoc ITermMaxVault + */ + function submitMarket(address market, bool isWhitelisted) external virtual onlyCuratorRole { + if (_marketWhitelist[market] && isWhitelisted) revert AlreadySet(); + if (_pendingMarkets[market].validAt != 0) revert AlreadyPending(); + if (!isWhitelisted) { + _setMarketWhitelist(market, isWhitelisted); + } else { + _pendingMarkets[market].update(0, _timelock); + emit SubmitMarketToWhitelist(market, _pendingMarkets[market].validAt); + } + } + + function _setMarketWhitelist(address market, bool isWhitelisted) internal { + _marketWhitelist[market] = isWhitelisted; + emit SetMarketWhitelist(_msgSender(), market, isWhitelisted); + delete _pendingMarkets[market]; + } + + /** + * @inheritdoc ITermMaxVault + */ + function setIsAllocator(address newAllocator, bool newIsAllocator) external virtual onlyOwner { + if (_isAllocator[newAllocator] == newIsAllocator) revert AlreadySet(); + + _isAllocator[newAllocator] = newIsAllocator; + + emit SetIsAllocator(newAllocator, newIsAllocator); + } + + /** + * @inheritdoc ITermMaxVault + */ + function setCurator(address newCurator) external virtual onlyOwner { + if (newCurator == _curator) revert AlreadySet(); + + _curator = newCurator; + + emit SetCurator(newCurator); + } + + /** + * @inheritdoc ITermMaxVault + */ + function updateSupplyQueue(uint256[] memory indexes) external virtual onlyAllocatorRole { + _updateSupplyQueue(indexes); + } + + /** + * @inheritdoc ITermMaxVault + */ + function updateWithdrawQueue(uint256[] memory indexes) external virtual onlyAllocatorRole { + _updateWithdrawQueue(indexes); + } + + function _updateWithdrawQueue(uint256[] memory indexes) internal { + uint256 length = _withdrawQueue.length; + if (indexes.length != length) { + revert WithdrawQueueLengthMismatch(); + } + bool[] memory seen = new bool[](length); + address[] memory newWithdrawQueue = new address[](length); + + for (uint256 i; i < length; ++i) { + uint256 prevIndex = indexes[i]; + + // If prevIndex >= currLength, it will revert with native "Index out of bounds". + address order = _withdrawQueue[prevIndex]; + if (seen[prevIndex]) revert DuplicateOrder(order); + seen[prevIndex] = true; + + newWithdrawQueue[i] = order; + } + _withdrawQueue = newWithdrawQueue; + + emit UpdateWithdrawQueue(msg.sender, newWithdrawQueue); + } + + function _updateSupplyQueue(uint256[] memory indexes) internal { + uint256 length = _supplyQueue.length; + if (indexes.length != length) { + revert SupplyQueueLengthMismatch(); + } + bool[] memory seen = new bool[](length); + address[] memory newSupplyQueue = new address[](length); + + for (uint256 i; i < length; ++i) { + uint256 prevIndex = indexes[i]; + + // If prevIndex >= currLength, it will revert with native "Index out of bounds". + address order = _supplyQueue[prevIndex]; + if (seen[prevIndex]) revert DuplicateOrder(order); + seen[prevIndex] = true; + + newSupplyQueue[i] = order; + } + _supplyQueue = newSupplyQueue; + + emit UpdateSupplyQueue(msg.sender, newSupplyQueue); + } + + /** + * Revoke functions + */ + + /** + * @inheritdoc ITermMaxVault + */ + function revokePendingTimelock() external virtual onlyGuardianRole { + delete _pendingTimelock; + + emit RevokePendingTimelock(_msgSender()); + } + + /** + * @inheritdoc ITermMaxVault + */ + function revokePendingGuardian() external virtual onlyGuardianRole { + delete _pendingGuardian; + + emit RevokePendingGuardian(_msgSender()); + } + + /** + * @inheritdoc ITermMaxVault + */ + function revokePendingMarket(address market) external virtual onlyGuardianRole { + delete _pendingMarkets[market]; + + emit RevokePendingMarket(_msgSender(), market); + } + + /** + * @inheritdoc ITermMaxVault + */ + function revokePendingPerformanceFeeRate() external virtual onlyGuardianRole { + delete _pendingPerformanceFeeRate; + + emit RevokePendingPerformanceFeeRate(_msgSender()); + } + + /** + * @inheritdoc ITermMaxVault + */ + function acceptTimelock() external virtual afterTimelock(_pendingTimelock.validAt) { + _setTimelock(_pendingTimelock.value); + } + + /** + * @inheritdoc ITermMaxVault + */ + function acceptGuardian() external virtual afterTimelock(_pendingGuardian.validAt) { + _setGuardian(_pendingGuardian.value); + } + + /** + * @inheritdoc ITermMaxVault + */ + function acceptMarket(address market) external virtual afterTimelock(_pendingMarkets[market].validAt) { + _setMarketWhitelist(market, true); + } + + /** + * @inheritdoc ITermMaxVault + */ + function acceptPerformanceFeeRate() external virtual afterTimelock(_pendingPerformanceFeeRate.validAt) { + _setPerformanceFeeRate(uint256(_pendingPerformanceFeeRate.value).toUint64()); + delete _pendingPerformanceFeeRate; + emit SetPerformanceFeeRate(_msgSender(), _performanceFeeRate); + } + + /** + * @notice Pauses the contract + */ + function pause() external virtual onlyOwner { + _pause(); + // pause orders + for (uint256 i = 0; i < _supplyQueue.length; ++i) { + ITermMaxOrder(_supplyQueue[i]).pause(); + } + } + + /** + * @notice Unpauses the contract + */ + function unpause() external virtual onlyOwner { + _unpause(); + // unpause orders + for (uint256 i = 0; i < _supplyQueue.length; ++i) { + ITermMaxOrder(_supplyQueue[i]).unpause(); + } + } + + function _previewAccruedInterest() + internal + view + returns (uint256 previewPrincipal, uint256 previewPerformanceFee) + { + uint64 currentTime = block.timestamp.toUint64(); + + uint256 lastTime = _lastUpdateTime; + if (lastTime == 0) { + return (_accretingPrincipal, _performanceFee); + } + uint64 recentMaturity = _maturityMapping[0]; + uint256 previewAnnualizedInterest = _annualizedInterest; + previewPrincipal = _accretingPrincipal; + previewPerformanceFee = _performanceFee; + + while (currentTime >= recentMaturity && recentMaturity != 0) { + (uint256 previewInterest, uint256 previewPerformanceFeeToCurator) = + _previewAccruedPeriodInterest(lastTime, recentMaturity, previewAnnualizedInterest); + lastTime = recentMaturity; + uint64 nextMaturity = _maturityMapping[recentMaturity]; + // update annualized interest + previewAnnualizedInterest -= _maturityToInterest[recentMaturity]; + + previewPerformanceFee += previewPerformanceFeeToCurator; + previewPrincipal += previewInterest; + + recentMaturity = nextMaturity; + } + if (recentMaturity > 0) { + (uint256 previewInterest, uint256 previewPerformanceFeeToCurator) = + _previewAccruedPeriodInterest(lastTime, currentTime, previewAnnualizedInterest); + previewPerformanceFee += previewPerformanceFeeToCurator; + previewPrincipal += previewInterest; + } + } + + function _previewAccruedPeriodInterest(uint256 startTime, uint256 endTime, uint256 previewAnnualizedInterest) + internal + view + returns (uint256, uint256) + { + uint256 interest = (previewAnnualizedInterest * (endTime - startTime)) / 365 days; + uint256 performanceFeeToCurator = (interest * _performanceFeeRate) / Constants.DECIMAL_BASE; + return (interest - performanceFeeToCurator, performanceFeeToCurator); + } + + /// @notice Callback function for the swap + /// @param deltaFt The change in the ft balance of the order + function afterSwap(uint256 ftReserve, uint256 xtReserve, int256 deltaFt, int256) external virtual override { + _delegateCall(abi.encodeCall(IOrderManager.afterSwap, (ftReserve, xtReserve, deltaFt))); + } +} From 493071f4fb9a5c53c3240fb5874a75a21aaa1c6e Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 29 May 2025 15:06:18 +0800 Subject: [PATCH 045/194] V2 router contract --- contracts/interfaces/IFlashLoanReceiver.sol | 4 + contracts/interfaces/IFlashRepayer.sol | 4 + contracts/interfaces/ISwapCallback.sol | 4 + contracts/interfaces/ITermMaxOrder.sol | 10 + .../v2/extensions/aave/IAaveV3Minimal.sol | 94 +++ .../v2/extensions/pendle/PendleHelper.sol | 40 + contracts/v2/router/ITermMaxRouterV2.sol | 333 ++++++++ contracts/v2/router/TermMaxRouterV2.sol | 746 ++++++++++++++++++ .../swapAdapters/ERC4626VaultAdapterV2.sol | 44 ++ .../swapAdapters/KyberswapV2AdapterV2.sol | 34 + .../router/swapAdapters/OdosV2AdapterV2.sol | 45 ++ .../swapAdapters/PendleSwapV3Adapter.sol | 57 ++ .../router/swapAdapters/UniswapV3Adapter.sol | 39 + 13 files changed, 1454 insertions(+) create mode 100644 contracts/interfaces/IFlashLoanReceiver.sol create mode 100644 contracts/interfaces/IFlashRepayer.sol create mode 100644 contracts/interfaces/ISwapCallback.sol create mode 100644 contracts/interfaces/ITermMaxOrder.sol create mode 100644 contracts/v2/extensions/aave/IAaveV3Minimal.sol create mode 100644 contracts/v2/extensions/pendle/PendleHelper.sol create mode 100644 contracts/v2/router/ITermMaxRouterV2.sol create mode 100644 contracts/v2/router/TermMaxRouterV2.sol create mode 100644 contracts/v2/router/swapAdapters/ERC4626VaultAdapterV2.sol create mode 100644 contracts/v2/router/swapAdapters/KyberswapV2AdapterV2.sol create mode 100644 contracts/v2/router/swapAdapters/OdosV2AdapterV2.sol create mode 100644 contracts/v2/router/swapAdapters/PendleSwapV3Adapter.sol create mode 100644 contracts/v2/router/swapAdapters/UniswapV3Adapter.sol diff --git a/contracts/interfaces/IFlashLoanReceiver.sol b/contracts/interfaces/IFlashLoanReceiver.sol new file mode 100644 index 0000000..da3c84d --- /dev/null +++ b/contracts/interfaces/IFlashLoanReceiver.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "../v1/IFlashLoanReceiver.sol"; diff --git a/contracts/interfaces/IFlashRepayer.sol b/contracts/interfaces/IFlashRepayer.sol new file mode 100644 index 0000000..b483015 --- /dev/null +++ b/contracts/interfaces/IFlashRepayer.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "../v1/tokens/IFlashRepayer.sol"; diff --git a/contracts/interfaces/ISwapCallback.sol b/contracts/interfaces/ISwapCallback.sol new file mode 100644 index 0000000..44622c3 --- /dev/null +++ b/contracts/interfaces/ISwapCallback.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "../v1/ISwapCallback.sol"; diff --git a/contracts/interfaces/ITermMaxOrder.sol b/contracts/interfaces/ITermMaxOrder.sol new file mode 100644 index 0000000..da88eed --- /dev/null +++ b/contracts/interfaces/ITermMaxOrder.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {ITermMaxOrder as ITermMaxOrderV1} from "../v1/ITermMaxOrder.sol"; + +/** + * @title TermMax Order interface + * @author Term Structure Labs + */ +interface ITermMaxOrder is ITermMaxOrderV1 {} diff --git a/contracts/v2/extensions/aave/IAaveV3Minimal.sol b/contracts/v2/extensions/aave/IAaveV3Minimal.sol new file mode 100644 index 0000000..56d979f --- /dev/null +++ b/contracts/v2/extensions/aave/IAaveV3Minimal.sol @@ -0,0 +1,94 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface IAaveV3Minimal { + struct ReserveData { + //stores the reserve configuration + ReserveConfigurationMap configuration; + //the liquidity index. Expressed in ray + uint128 liquidityIndex; + //the current supply rate. Expressed in ray + uint128 currentLiquidityRate; + //variable borrow index. Expressed in ray + uint128 variableBorrowIndex; + //the current variable borrow rate. Expressed in ray + uint128 currentVariableBorrowRate; + //the current stable borrow rate. Expressed in ray + uint128 currentStableBorrowRate; + //timestamp of last update + uint40 lastUpdateTimestamp; + //the id of the reserve. Represents the position in the list of the active reserves + uint16 id; + //aToken address + address aTokenAddress; + //stableDebtToken address + address stableDebtTokenAddress; + //variableDebtToken address + address variableDebtTokenAddress; + //address of the interest rate strategy + address interestRateStrategyAddress; + //the current treasury balance, scaled + uint128 accruedToTreasury; + //the outstanding unbacked aTokens minted through the bridging feature + uint128 unbacked; + //the outstanding debt borrowed against this asset in isolation mode + uint128 isolationModeTotalDebt; + } + + struct ReserveConfigurationMap { + //bit 0-15: LTV + //bit 16-31: Liq. threshold + //bit 32-47: Liq. bonus + //bit 48-55: Decimals + //bit 56: reserve is active + //bit 57: reserve is frozen + //bit 58: borrowing is enabled + //bit 59: stable rate borrowing enabled + //bit 60: asset is paused + //bit 61: borrowing in isolation mode is enabled + //bit 62: siloed borrowing enabled + //bit 63: flashloaning enabled + //bit 64-79: reserve factor + //bit 80-115 borrow cap in whole tokens, borrowCap == 0 => no cap + //bit 116-151 supply cap in whole tokens, supplyCap == 0 => no cap + //bit 152-167 liquidation protocol fee + //bit 168-175 eMode category + //bit 176-211 unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled + //bit 212-251 debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals + //bit 252-255 unused + uint256 data; + } + + /** + * @notice Returns the state and configuration of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The state and configuration data of the reserve + */ + function getReserveData(address asset) external view returns (ReserveData memory); + + /** + * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. + * - E.g. User supplies 100 USDC and gets in return 100 aUSDC + * @param asset The address of the underlying asset to supply + * @param amount The amount to be supplied + * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user + * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens + * is a different wallet + * @param referralCode Code used to register the integrator originating the operation, for potential rewards. + * 0 if the action is executed directly by the user, without any middle-man + */ + function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + + /** + * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned + * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC + * @param asset The address of the underlying asset to withdraw + * @param amount The underlying amount to be withdrawn + * - Send the value type(uint256).max in order to withdraw the whole aToken balance + * @param to The address that will receive the underlying, same as msg.sender if the user + * wants to receive it on his own wallet, or a different address if the beneficiary is a + * different wallet + * @return The final amount withdrawn + */ + function withdraw(address asset, uint256 amount, address to) external returns (uint256); +} diff --git a/contracts/v2/extensions/pendle/PendleHelper.sol b/contracts/v2/extensions/pendle/PendleHelper.sol new file mode 100644 index 0000000..0b4cd85 --- /dev/null +++ b/contracts/v2/extensions/pendle/PendleHelper.sol @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "@pendle/core-v2/contracts/interfaces/IPAllActionV3.sol"; +import "@pendle/core-v2/contracts/interfaces/IPMarket.sol"; + +abstract contract PendleHelper { + // EmptySwap means no swap aggregator is involved + SwapData public emptySwap; + + // EmptyLimit means no limit order is involved + LimitOrderData public emptyLimit; + + // DefaultApprox means no off-chain preparation is involved, more gas consuming (~ 180k gas) + ApproxParams public defaultApprox = ApproxParams(0, type(uint256).max, 0, 256, 1e14); + + /// @notice create a simple TokenInput struct without using any aggregators. For more info please refer to + /// IPAllActionTypeV3.sol + function createTokenInputStruct(address tokenIn, uint256 netTokenIn) + internal + view + returns (TokenInput memory input) + { + input.tokenIn = tokenIn; + input.netTokenIn = netTokenIn; + input.tokenMintSy = tokenIn; + } + + /// @notice create a simple TokenOutput struct without using any aggregators. For more info please refer to + /// IPAllActionTypeV3.sol + function createTokenOutputStruct(address tokenOut, uint256 minTokenOut) + internal + view + returns (TokenOutput memory output) + { + output.tokenOut = tokenOut; + output.minTokenOut = minTokenOut; + output.tokenRedeemSy = tokenOut; + } +} diff --git a/contracts/v2/router/ITermMaxRouterV2.sol b/contracts/v2/router/ITermMaxRouterV2.sol new file mode 100644 index 0000000..6668ac9 --- /dev/null +++ b/contracts/v2/router/ITermMaxRouterV2.sol @@ -0,0 +1,333 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {ITermMaxMarket} from "../../v1/ITermMaxMarket.sol"; +import {ITermMaxOrder} from "../../v1/ITermMaxOrder.sol"; +import {SwapUnit} from "../../v1/router/ISwapAdapter.sol"; +import {ISwapCallback} from "../../v1/ISwapCallback.sol"; +import {CurveCuts} from "../../v1/storage/TermMaxStorage.sol"; + +/** + * @title TermMax RouterV2 interface + * @author Term Structure Labs + * @notice Interface for the main router contract that handles all user interactions with TermMax protocol + * @dev This interface defines all external functions for swapping, leveraging, and managing positions + */ +interface ITermMaxRouterV2 { + struct TermMaxSwapData { + address tokenIn; + address tokenOut; + ITermMaxOrder[] orders; + uint128[] tradingAmts; + uint128 netTokenAmt; + uint256 deadline; + } + + /** + * @notice Pauses all protocol operations + * @dev Can only be called by authorized addresses + */ + function pause() external; + + /** + * @notice Unpauses protocol operations + * @dev Can only be called by authorized addresses + */ + function unpause() external; + + /** + * @notice View the adapter whitelist status + * @dev Used for controlling which swap adapters can be used + * @param adapter The adapter's address to check whitelist status for + * @return True if whitelisted, false otherwise + */ + function adapterWhitelist(address adapter) external view returns (bool); + + /** + * @notice Set the adapter whitelist status + * @dev Used for controlling which swap adapters can be used + * @param adapter The adapter's address to set whitelist status for + * @param isWhitelist True to whitelist, false to remove from whitelist + */ + function setAdapterWhitelist(address adapter, bool isWhitelist) external; + + /** + * @notice Retrieves all assets owned by an address in a specific market + * @dev Returns both ERC20 tokens and GT (Governance Token) positions + * @param market The market to query assets from + * @param owner The address to check assets for + * @return tokens Array of ERC20 token addresses + * @return balances Corresponding balances for each token + * @return gt The GT token contract address + * @return gtIds Array of GT token IDs owned by the address + */ + function assetsWithERC20Collateral(ITermMaxMarket market, address owner) + external + view + returns (IERC20[4] memory tokens, uint256[4] memory balances, address gt, uint256[] memory gtIds); + + /** + * @notice Swaps an exact amount of input token for output token + * @dev Uses specified orders for the swap path + * @param tokenIn Input token to swap from + * @param tokenOut Output token to swap to + * @param recipient Address to receive the output tokens + * @param orders Array of orders to use for the swap path + * @param tradingAmts Array of amounts to trade for each order + * @param minTokenOut Minimum amount of output tokens to receive + * @param deadline The deadline timestamp for the transaction + * @return netTokenOut Actual amount of output tokens received + */ + function swapExactTokenToToken( + IERC20 tokenIn, + IERC20 tokenOut, + address recipient, + ITermMaxOrder[] memory orders, + uint128[] memory tradingAmts, + uint128 minTokenOut, + uint256 deadline + ) external returns (uint256 netTokenOut); + + /** + * @notice Swaps tokens to receive an exact amount of output token + * @dev Uses specified orders for the swap path + * @param tokenIn Input token to swap from + * @param tokenOut Output token to swap to + * @param recipient Address to receive the output tokens + * @param orders Array of orders to use for the swap path + * @param tradingAmts Array of amounts to trade for each order + * @param maxTokenIn Maximum amount of input tokens to spend + * @param deadline The deadline timestamp for the transaction + * @return netTokenIn Actual amount of input tokens spent + */ + function swapTokenToExactToken( + IERC20 tokenIn, + IERC20 tokenOut, + address recipient, + ITermMaxOrder[] memory orders, + uint128[] memory tradingAmts, + uint128 maxTokenIn, + uint256 deadline + ) external returns (uint256 netTokenIn); + + /** + * @notice Sells FT and XT tokens for underlying tokens + * @dev Executes multiple orders to sell tokens + * @param recipient Address to receive the output tokens + * @param market The market to sell tokens in + * @param ftInAmt Amount of FT tokens to sell + * @param xtInAmt Amount of XT tokens to sell + * @param orders Array of orders to execute + * @param amtsToSellTokens Array of amounts to sell for each order + * @param minTokenOut Minimum amount of output tokens to receive + * @param deadline The deadline timestamp for the transaction + * @return netTokenOut Actual amount of output tokens received + */ + function sellTokens( + address recipient, + ITermMaxMarket market, + uint128 ftInAmt, + uint128 xtInAmt, + ITermMaxOrder[] memory orders, + uint128[] memory amtsToSellTokens, + uint128 minTokenOut, + uint256 deadline + ) external returns (uint256 netTokenOut); + + /** + * @notice Creates a leveraged position from input tokens + * @dev Swaps tokens for XT and creates a leveraged position + * @param recipient Address to receive the position + * @param market The market to create position in + * @param orders Array of orders to execute + * @param amtsToBuyXt Array of amounts of XT to buy for each order + * @param minXtOut Minimum amount of XT to establish the position + * @param tokenToSwap Amount of tokens to swap + * @param maxLtv Maximum loan-to-value ratio + * @param units Array of swap units defining the swap path + * @param deadline The deadline timestamp for the transaction + * @return gtId ID of the generated GT token + * @return netXtOut Amount of XT tokens received + */ + function leverageFromToken( + address recipient, + ITermMaxMarket market, + ITermMaxOrder[] memory orders, + uint128[] memory amtsToBuyXt, + uint128 minXtOut, + uint128 tokenToSwap, + uint128 maxLtv, + SwapUnit[] memory units, + uint256 deadline + ) external returns (uint256 gtId, uint256 netXtOut); + + /** + * @notice Creates a leveraged position from XT tokens + * @dev Uses existing XT tokens to create a leveraged position + * @param recipient Address to receive the position + * @param market The market to create position in + * @param xtInAmt Amount of XT tokens to use + * @param tokenInAmt Amount of additional tokens to use + * @param maxLtv Maximum loan-to-value ratio + * @param units Array of swap units defining the swap path + * @return gtId ID of the generated GT token + */ + function leverageFromXt( + address recipient, + ITermMaxMarket market, + uint128 xtInAmt, + uint128 tokenInAmt, + uint128 maxLtv, + SwapUnit[] memory units + ) external returns (uint256 gtId); + + function leverageFromXtAndCollateral( + address recipient, + ITermMaxMarket market, + uint128 xtInAmt, + uint128 collateralInAmt, + uint128 maxLtv, + SwapUnit[] memory units + ) external returns (uint256 gtId); + + /** + * @notice Borrows tokens using collateral + * @dev Creates a collateralized debt position + * @param recipient Address to receive the borrowed tokens + * @param market The market to borrow from + * @param collInAmt Amount of collateral to deposit + * @param orders Array of orders to execute + * @param tokenAmtsWantBuy Array of token amounts to buy + * @param maxDebtAmt Maximum amount of debt to take on + * @param deadline The deadline timestamp for the transaction + * @return gtId ID of the generated GT token + */ + function borrowTokenFromCollateral( + address recipient, + ITermMaxMarket market, + uint256 collInAmt, + ITermMaxOrder[] memory orders, + uint128[] memory tokenAmtsWantBuy, + uint128 maxDebtAmt, + uint256 deadline + ) external returns (uint256 gtId); + + /** + * @notice Borrows tokens using collateral and XT + * @dev Creates a collateralized debt position + * @param recipient Address to receive the borrowed tokens + * @param market The market to borrow from + * @param collInAmt Amount of collateral to deposit + * @param borrowAmt Amount of tokens to borrow + * @return gtId ID of the generated GT token + */ + function borrowTokenFromCollateral(address recipient, ITermMaxMarket market, uint256 collInAmt, uint256 borrowAmt) + external + returns (uint256 gtId); + + /** + * @notice Borrows tokens from an existing GT position + * @dev Increases the debt of an existing position + * @param recipient Address to receive the borrowed tokens + * @param market The market to borrow from + * @param gtId ID of the GT token to borrow from + * @param borrowAmt Amount of tokens to borrow + */ + function borrowTokenFromGt(address recipient, ITermMaxMarket market, uint256 gtId, uint256 borrowAmt) external; + + /** + * @notice Repays debt from collateral + * @dev Repays debt and closes a position + * @param recipient Address to receive any remaining collateral + * @param market The market to repay debt in + * @param gtId ID of the GT token to repay debt from + * @param byDebtToken True if repaying with debt token, false if using FT token + * @param units Array of swap units defining the external swap path + * @param swapData Data for the termmax swap operation + * @return netTokenOut Actual amount of tokens received + */ + function flashRepayFromColl( + address recipient, + ITermMaxMarket market, + uint256 gtId, + bool byDebtToken, + SwapUnit[] memory units, + TermMaxSwapData memory swapData + ) external returns (uint256 netTokenOut); + + function flashRepayFromCollV2( + address recipient, + ITermMaxMarket market, + uint256 gtId, + uint128 repayAmt, + bool byDebtToken, + bytes memory removedCollateral, + SwapUnit[] memory units, + TermMaxSwapData memory swapData + ) external returns (uint256 netTokenOut); + + /** + * @notice Repays debt using FT tokens + * @dev Repays debt and closes a position + * @param recipient Address to receive any remaining tokens + * @param market The market to repay debt in + * @param gtId ID of the GT token to repay debt from + * @param orders Array of orders to execute + * @param ftAmtsWantBuy Array of FT amounts to buy for each order + * @param maxTokenIn Maximum amount of tokens to spend + * @param deadline The deadline timestamp for the transaction + * @return returnAmt Actual amount of tokens returned + */ + function repayByTokenThroughFt( + address recipient, + ITermMaxMarket market, + uint256 gtId, + ITermMaxOrder[] memory orders, + uint128[] memory ftAmtsWantBuy, + uint128 maxTokenIn, + uint256 deadline + ) external returns (uint256 returnAmt); + + /** + * @notice Redeems FT tokens and swaps for underlying tokens + * @dev Executes a swap to redeem FT tokens + * @param recipient Address to receive the output tokens + * @param market The market to redeem FT tokens in + * @param ftAmount Amount of FT tokens to redeem + * @param units Array of swap units defining the swap path + * @param minTokenOut Minimum amount of output tokens to receive + * @return redeemedAmt Actual amount of output tokens received + */ + function redeemAndSwap( + address recipient, + ITermMaxMarket market, + uint256 ftAmount, + SwapUnit[] memory units, + uint256 minTokenOut + ) external returns (uint256 redeemedAmt); + + /** + * @notice Creates an order and deposits tokens + * @dev Creates a new order and deposits tokens to the market + * @param market The market to create order in + * @param maker Address of the order maker + * @param maxXtReserve Maximum amount of XT to reserve + * @param swapTrigger Swap trigger callback + * @param debtTokenToDeposit Amount of debt tokens to deposit + * @param ftToDeposit Amount of FT tokens to deposit + * @param xtToDeposit Amount of XT tokens to deposit + * @param curveCuts Curve cuts for the order + * @return order The created order + */ + function createOrderAndDeposit( + ITermMaxMarket market, + address maker, + uint256 maxXtReserve, + ISwapCallback swapTrigger, + uint256 debtTokenToDeposit, + uint128 ftToDeposit, + uint128 xtToDeposit, + CurveCuts memory curveCuts + ) external returns (ITermMaxOrder order); +} diff --git a/contracts/v2/router/TermMaxRouterV2.sol b/contracts/v2/router/TermMaxRouterV2.sol new file mode 100644 index 0000000..d5ec77d --- /dev/null +++ b/contracts/v2/router/TermMaxRouterV2.sol @@ -0,0 +1,746 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {IERC4626} from "@openzeppelin/contracts/interfaces/IERC4626.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {IERC721Enumerable} from "@openzeppelin/contracts/interfaces/IERC721Enumerable.sol"; +import {IERC721Receiver} from "@openzeppelin/contracts/interfaces/IERC721Receiver.sol"; +import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; +import { + Ownable2StepUpgradeable, + OwnableUpgradeable +} from "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; +import {ITermMaxMarket} from "../../v1/ITermMaxMarket.sol"; +import {ITermMaxMarketV2} from "../../v2/ITermMaxMarketV2.sol"; +import {ITermMaxOrder} from "../../v1/ITermMaxOrder.sol"; +import {SwapUnit, ISwapAdapter} from "../../v1/router/ISwapAdapter.sol"; +import {RouterErrors} from "../../v1/errors/RouterErrors.sol"; +import {RouterEvents} from "../../v1/events/RouterEvents.sol"; +import {TransferUtils} from "../../v1/lib/TransferUtils.sol"; +import {IFlashLoanReceiver} from "../../v1/IFlashLoanReceiver.sol"; +import {IFlashRepayer} from "../../v1/tokens/IFlashRepayer.sol"; +import {ITermMaxRouterV2} from "./ITermMaxRouterV2.sol"; +import {IGearingToken} from "../../v1/tokens/IGearingToken.sol"; +import {IGearingTokenV2} from "../../v2/tokens/IGearingTokenV2.sol"; +import {CurveCuts} from "../../v1/storage/TermMaxStorage.sol"; +import {ISwapCallback} from "../../v1/ISwapCallback.sol"; +import {Constants} from "../../v1/lib/Constants.sol"; +import {MathLib} from "../../v1/lib/MathLib.sol"; + +/** + * @title TermMax Router + * @author Term Structure Labs + */ +contract TermMaxRouter is + UUPSUpgradeable, + Ownable2StepUpgradeable, + PausableUpgradeable, + IFlashLoanReceiver, + IFlashRepayer, + IERC721Receiver, + ITermMaxRouterV2, + RouterErrors, + RouterEvents +{ + using SafeCast for *; + using TransferUtils for IERC20; + using MathLib for uint256; + + enum FlashLoanType { + COLLATERAL, + DEBT + } + + enum FlashRepayOptions { + REPAY, + ROLLOVER + } + + /// @notice whitelist mapping of adapter + mapping(address => bool) public adapterWhitelist; + + uint256 private constant T_ROLLOVER_GT_RESERVE_STORE = 0; + + function _authorizeUpgrade(address newImplementation) internal virtual override onlyOwner {} + + function initialize(address admin) public initializer { + __UUPSUpgradeable_init(); + __Pausable_init(); + __Ownable_init(admin); + } + + function depositAndMint(ITermMaxMarket market, address recipient, uint256 amount) external whenNotPaused { + (,,,, IERC20 underlying) = market.tokens(); + IERC4626 vault = IERC4626(address(underlying)); + IERC20(vault.asset()).safeTransferFrom(msg.sender, address(this), amount); + underlying.safeIncreaseAllowance(address(market), amount); + market.mint(recipient, amount); + } + + function burnAndWithdraw(ITermMaxMarket market, address recipient, uint256 amount) external whenNotPaused { + (IERC20 ft, IERC20 xt,,, IERC20 underlying) = market.tokens(); + ft.safeTransferFrom(msg.sender, address(this), amount); + xt.safeTransferFrom(msg.sender, address(this), amount); + ITermMaxMarketV2(address(market)).burn(address(this), address(this), amount); + IERC4626(address(underlying)).redeem(amount, recipient, address(this)); + } + + /** + * @inheritdoc ITermMaxRouterV2 + */ + function setAdapterWhitelist(address adapter, bool isWhitelist) external onlyOwner { + adapterWhitelist[adapter] = isWhitelist; + emit UpdateSwapAdapterWhiteList(adapter, isWhitelist); + } + + /** + * @inheritdoc ITermMaxRouterV2 + */ + function assetsWithERC20Collateral(ITermMaxMarket market, address owner) + external + view + override + returns (IERC20[4] memory tokens, uint256[4] memory balances, address gtAddr, uint256[] memory gtIds) + { + (IERC20 ft, IERC20 xt, IGearingToken gt, address collateral, IERC20 underlying) = market.tokens(); + tokens[0] = ft; + tokens[1] = xt; + tokens[2] = IERC20(collateral); + tokens[3] = underlying; + for (uint256 i = 0; i < 4; ++i) { + balances[i] = tokens[i].balanceOf(owner); + } + gtAddr = address(gt); + uint256 balance = IERC721Enumerable(gtAddr).balanceOf(owner); + gtIds = new uint256[](balance); + for (uint256 i = 0; i < balance; ++i) { + gtIds[i] = IERC721Enumerable(gtAddr).tokenOfOwnerByIndex(owner, i); + } + } + + function swapExactTokenToToken( + IERC20 tokenIn, + IERC20 tokenOut, + address recipient, + ITermMaxOrder[] memory orders, + uint128[] memory tradingAmts, + uint128 minTokenOut, + uint256 deadline + ) external whenNotPaused returns (uint256 netTokenOut) { + uint256 totalAmtIn = sum(tradingAmts); + tokenIn.safeTransferFrom(msg.sender, address(this), totalAmtIn); + netTokenOut = _swapExactTokenToToken(tokenIn, tokenOut, recipient, orders, tradingAmts, minTokenOut, deadline); + emit SwapExactTokenToToken(tokenIn, tokenOut, msg.sender, recipient, orders, tradingAmts, netTokenOut); + } + + function _swapExactTokenToToken( + IERC20 tokenIn, + IERC20 tokenOut, + address recipient, + ITermMaxOrder[] memory orders, + uint128[] memory tradingAmts, + uint128 minTokenOut, + uint256 deadline + ) internal returns (uint256 netTokenOut) { + if (orders.length != tradingAmts.length) revert OrdersAndAmtsLengthNotMatch(); + for (uint256 i = 0; i < orders.length; ++i) { + ITermMaxOrder order = orders[i]; + tokenIn.safeIncreaseAllowance(address(order), tradingAmts[i]); + netTokenOut += order.swapExactTokenToToken(tokenIn, tokenOut, recipient, tradingAmts[i], 0, deadline); + } + if (netTokenOut < minTokenOut) revert InsufficientTokenOut(address(tokenOut), netTokenOut, minTokenOut); + } + + function swapTokenToExactToken( + IERC20 tokenIn, + IERC20 tokenOut, + address recipient, + ITermMaxOrder[] memory orders, + uint128[] memory tradingAmts, + uint128 maxTokenIn, + uint256 deadline + ) external whenNotPaused returns (uint256 netTokenIn) { + tokenIn.safeTransferFrom(msg.sender, address(this), maxTokenIn); + netTokenIn = _swapTokenToExactToken(tokenIn, tokenOut, recipient, orders, tradingAmts, maxTokenIn, deadline); + tokenIn.safeTransfer(msg.sender, maxTokenIn - netTokenIn); + emit SwapTokenToExactToken(tokenIn, tokenOut, msg.sender, recipient, orders, tradingAmts, netTokenIn); + } + + function _swapTokenToExactToken( + IERC20 tokenIn, + IERC20 tokenOut, + address recipient, + ITermMaxOrder[] memory orders, + uint128[] memory tradingAmts, + uint128 maxTokenIn, + uint256 deadline + ) internal returns (uint256 netTokenIn) { + if (orders.length != tradingAmts.length) revert OrdersAndAmtsLengthNotMatch(); + for (uint256 i = 0; i < orders.length; ++i) { + ITermMaxOrder order = orders[i]; + tokenIn.safeIncreaseAllowance(address(order), maxTokenIn); + netTokenIn += + order.swapTokenToExactToken(tokenIn, tokenOut, recipient, tradingAmts[i], maxTokenIn, deadline); + } + if (netTokenIn > maxTokenIn) revert InsufficientTokenIn(address(tokenIn), netTokenIn, maxTokenIn); + } + + function sum(uint128[] memory values) internal pure returns (uint256 total) { + for (uint256 i = 0; i < values.length; ++i) { + total += values[i]; + } + } + + function sellTokens( + address recipient, + ITermMaxMarket market, + uint128 ftInAmt, + uint128 xtInAmt, + ITermMaxOrder[] memory orders, + uint128[] memory amtsToSellTokens, + uint128 minTokenOut, + uint256 deadline + ) external whenNotPaused returns (uint256 netTokenOut) { + (IERC20 ft, IERC20 xt,,, IERC20 debtToken) = market.tokens(); + (uint256 maxBurn, IERC20 toenToSell) = ftInAmt > xtInAmt ? (xtInAmt, ft) : (ftInAmt, xt); + ft.transferFrom(msg.sender, address(this), ftInAmt); + xt.transferFrom(msg.sender, address(this), xtInAmt); + ITermMaxMarketV2(address(market)).burn(address(this), recipient, maxBurn); + + netTokenOut = _swapExactTokenToToken(toenToSell, debtToken, recipient, orders, amtsToSellTokens, 0, deadline); + netTokenOut += maxBurn; + if (netTokenOut < minTokenOut) revert InsufficientTokenOut(address(debtToken), netTokenOut, minTokenOut); + emit SellTokens(market, msg.sender, recipient, ftInAmt, xtInAmt, orders, amtsToSellTokens, netTokenOut); + } + + function leverageFromToken( + address recipient, + ITermMaxMarket market, + ITermMaxOrder[] memory orders, + uint128[] memory amtsToBuyXt, + uint128 minXtOut, + uint128 tokenToSwap, + uint128 maxLtv, + SwapUnit[] memory units, + uint256 deadline + ) external whenNotPaused returns (uint256 gtId, uint256 netXtOut) { + (, IERC20 xt, IGearingToken gt,, IERC20 debtToken) = market.tokens(); + uint256 totalAmtToBuyXt = sum(amtsToBuyXt); + debtToken.safeTransferFrom(msg.sender, address(this), tokenToSwap + totalAmtToBuyXt); + netXtOut = _swapExactTokenToToken(debtToken, xt, address(this), orders, amtsToBuyXt, minXtOut, deadline); + + bytes memory callbackData = abi.encode(address(gt), tokenToSwap, units, FlashLoanType.DEBT); + gtId = + ITermMaxMarketV2(address(market)).leverageByXt(address(this), recipient, netXtOut.toUint128(), callbackData); + (,, bytes memory collateralData) = gt.loanInfo(gtId); + (, uint128 ltv,) = gt.getLiquidationInfo(gtId); + if (ltv > maxLtv) { + revert LtvBiggerThanExpected(maxLtv, ltv); + } + emit IssueGt(market, gtId, msg.sender, recipient, tokenToSwap, netXtOut.toUint128(), ltv, collateralData); + } + + /** + * @inheritdoc ITermMaxRouterV2 + */ + function leverageFromXt( + address recipient, + ITermMaxMarket market, + uint128 xtInAmt, + uint128 tokenInAmt, + uint128 maxLtv, + SwapUnit[] memory units + ) external whenNotPaused returns (uint256 gtId) { + (, IERC20 xt, IGearingToken gt,, IERC20 debtToken) = market.tokens(); + debtToken.safeTransferFrom(msg.sender, address(this), tokenInAmt); + + bytes memory callbackData = abi.encode(address(gt), tokenInAmt, units, FlashLoanType.DEBT); + gtId = ITermMaxMarketV2(address(market)).leverageByXt(msg.sender, recipient, xtInAmt.toUint128(), callbackData); + + (,, bytes memory collateralData) = gt.loanInfo(gtId); + (, uint128 ltv,) = gt.getLiquidationInfo(gtId); + if (ltv > maxLtv) { + revert LtvBiggerThanExpected(maxLtv, ltv); + } + emit IssueGt(market, gtId, msg.sender, recipient, tokenInAmt, xtInAmt, ltv, collateralData); + } + + /** + * @inheritdoc ITermMaxRouterV2 + */ + function leverageFromXtAndCollateral( + address recipient, + ITermMaxMarket market, + uint128 xtInAmt, + uint128 collateralInAmt, + uint128 maxLtv, + SwapUnit[] memory units + ) external whenNotPaused returns (uint256 gtId) { + (, IERC20 xt, IGearingToken gt, address collAddr,) = market.tokens(); + IERC20 collateral = IERC20(collAddr); + + collateral.safeTransferFrom(msg.sender, address(this), collateralInAmt); + + bytes memory callbackData = abi.encode(address(gt), 0, units, FlashLoanType.COLLATERAL); + gtId = ITermMaxMarketV2(address(market)).leverageByXt(msg.sender, recipient, xtInAmt.toUint128(), callbackData); + + (,, bytes memory collateralData) = gt.loanInfo(gtId); + (, uint128 ltv,) = gt.getLiquidationInfo(gtId); + if (ltv > maxLtv) { + revert LtvBiggerThanExpected(maxLtv, ltv); + } + emit IssueGt(market, gtId, msg.sender, recipient, 0, xtInAmt, ltv, collateralData); + } + + /** + * @inheritdoc ITermMaxRouterV2 + */ + function borrowTokenFromCollateral( + address recipient, + ITermMaxMarket market, + uint256 collInAmt, + ITermMaxOrder[] memory orders, + uint128[] memory tokenAmtsWantBuy, + uint128 maxDebtAmt, + uint256 deadline + ) external whenNotPaused returns (uint256) { + (IERC20 ft,, IGearingToken gt, address collateralAddr, IERC20 debtToken) = market.tokens(); + IERC20(collateralAddr).safeTransferFrom(msg.sender, address(this), collInAmt); + IERC20(collateralAddr).safeIncreaseAllowance(address(gt), collInAmt); + + (uint256 gtId, uint128 ftOutAmt) = market.issueFt(address(this), maxDebtAmt, _encodeAmount(collInAmt)); + uint256 netTokenIn = + _swapTokenToExactToken(ft, debtToken, recipient, orders, tokenAmtsWantBuy, ftOutAmt, deadline); + uint256 repayAmt = ftOutAmt - netTokenIn; + if (repayAmt > 0) { + ft.safeIncreaseAllowance(address(gt), repayAmt); + gt.repay(gtId, repayAmt.toUint128(), false); + } + + gt.safeTransferFrom(address(this), recipient, gtId); + emit Borrow(market, gtId, msg.sender, recipient, collInAmt, ftOutAmt, netTokenIn.toUint128()); + return gtId; + } + + function borrowTokenFromCollateral(address recipient, ITermMaxMarket market, uint256 collInAmt, uint256 borrowAmt) + external + whenNotPaused + returns (uint256) + { + (IERC20 ft, IERC20 xt, IGearingToken gt, address collateralAddr,) = market.tokens(); + + IERC20(collateralAddr).safeTransferFrom(msg.sender, address(this), collInAmt); + IERC20(collateralAddr).safeIncreaseAllowance(address(gt), collInAmt); + + uint256 mintGtFeeRatio = market.mintGtFeeRatio(); + uint128 debtAmt = ((borrowAmt * Constants.DECIMAL_BASE) / (Constants.DECIMAL_BASE - mintGtFeeRatio)).toUint128(); + + (uint256 gtId, uint128 ftOutAmt) = market.issueFt(address(this), debtAmt, _encodeAmount(collInAmt)); + borrowAmt = borrowAmt.min(ftOutAmt); + xt.safeTransferFrom(msg.sender, address(this), borrowAmt); + + ITermMaxMarketV2(address(market)).burn(address(this), recipient, borrowAmt); + + gt.safeTransferFrom(address(this), recipient, gtId); + emit Borrow(market, gtId, msg.sender, recipient, collInAmt, debtAmt, borrowAmt.toUint128()); + return gtId; + } + + function borrowTokenFromGt(address recipient, ITermMaxMarket market, uint256 gtId, uint256 borrowAmt) + external + whenNotPaused + { + (IERC20 ft, IERC20 xt, IGearingToken gt,,) = market.tokens(); + + if (gt.ownerOf(gtId) != msg.sender) { + revert GtNotOwnedBySender(); + } + + uint256 mintGtFeeRatio = market.mintGtFeeRatio(); + uint128 debtAmt = ((borrowAmt * Constants.DECIMAL_BASE) / (Constants.DECIMAL_BASE - mintGtFeeRatio)).toUint128(); + + uint256 ftOutAmt = market.issueFtByExistedGt(address(this), debtAmt, gtId); + borrowAmt = borrowAmt.min(ftOutAmt); + xt.safeTransferFrom(msg.sender, address(this), borrowAmt); + + ITermMaxMarketV2(address(market)).burn(address(this), recipient, borrowAmt); + + emit Borrow(market, gtId, msg.sender, recipient, 0, debtAmt, borrowAmt.toUint128()); + } + + /** + * Deprecated function + * @dev use `flashRepayFromCollV2` instead + */ + function flashRepayFromColl( + address recipient, + ITermMaxMarket market, + uint256 gtId, + bool byDebtToken, + SwapUnit[] memory units, + TermMaxSwapData memory swapData + ) external whenNotPaused returns (uint256 netTokenOut) { + (,, IGearingToken gt,, IERC20 debtToken) = market.tokens(); + gt.safeTransferFrom(msg.sender, address(this), gtId, ""); + bytes memory callbackData = abi.encode(units, swapData); + callbackData = abi.encode(FlashRepayOptions.REPAY, callbackData); + gt.flashRepay(gtId, byDebtToken, callbackData); + netTokenOut = debtToken.balanceOf(address(this)); + debtToken.safeTransfer(recipient, netTokenOut); + } + + function flashRepayFromCollV2( + address recipient, + ITermMaxMarket market, + uint256 gtId, + uint128 repayAmt, + bool byDebtToken, + bytes memory removedCollateral, + SwapUnit[] memory units, + TermMaxSwapData memory swapData + ) external whenNotPaused returns (uint256 netTokenOut) { + (,, IGearingToken gt,, IERC20 debtToken) = market.tokens(); + gt.safeTransferFrom(msg.sender, address(this), gtId, ""); + bytes memory callbackData = abi.encode(units, swapData); + callbackData = abi.encode(FlashRepayOptions.REPAY, callbackData); + bool repayAll = + IGearingTokenV2(address(gt)).flashRepay(gtId, repayAmt, byDebtToken, removedCollateral, callbackData); + if (!repayAll) { + gt.safeTransferFrom(address(this), msg.sender, gtId); + } + netTokenOut = debtToken.balanceOf(address(this)); + debtToken.safeTransfer(recipient, netTokenOut); + } + + /** + * @inheritdoc ITermMaxRouterV2 + */ + function repayByTokenThroughFt( + address recipient, + ITermMaxMarket market, + uint256 gtId, + ITermMaxOrder[] memory orders, + uint128[] memory ftAmtsWantBuy, + uint128 maxTokenIn, + uint256 deadline + ) external whenNotPaused returns (uint256 returnAmt) { + (IERC20 ft,, IGearingToken gt,, IERC20 debtToken) = market.tokens(); + + debtToken.safeTransferFrom(msg.sender, address(this), maxTokenIn); + uint256 netCost = + _swapTokenToExactToken(debtToken, ft, address(this), orders, ftAmtsWantBuy, maxTokenIn, deadline); + uint256 totalFtAmt = sum(ftAmtsWantBuy); + (, uint128 repayAmt,) = gt.loanInfo(gtId); + + if (totalFtAmt < repayAmt) { + repayAmt = totalFtAmt.toUint128(); + } + ft.safeIncreaseAllowance(address(gt), repayAmt); + gt.repay(gtId, repayAmt, false); + + returnAmt = maxTokenIn - netCost; + debtToken.safeTransfer(recipient, returnAmt); + if (totalFtAmt > repayAmt) { + ft.safeTransfer(recipient, totalFtAmt - repayAmt); + } + + emit RepayByTokenThroughFt(market, gtId, msg.sender, recipient, repayAmt, returnAmt); + } + + function redeemAndSwap( + address recipient, + ITermMaxMarket market, + uint256 ftAmount, + SwapUnit[] memory units, + uint256 minTokenOut + ) external whenNotPaused returns (uint256) { + (,,,, IERC20 debtToken) = market.tokens(); + (uint256 redeemedAmt, bytes memory collateralData) = + ITermMaxMarketV2(address(market)).redeem(msg.sender, address(this), ftAmount); + redeemedAmt += _decodeAmount(_doSwap(collateralData, units)); + if (redeemedAmt < minTokenOut) { + revert InsufficientTokenOut(address(debtToken), redeemedAmt, minTokenOut); + } + debtToken.safeTransfer(recipient, redeemedAmt); + emit RedeemAndSwap(market, ftAmount, msg.sender, recipient, redeemedAmt); + return redeemedAmt; + } + + function createOrderAndDeposit( + ITermMaxMarket market, + address maker, + uint256 maxXtReserve, + ISwapCallback swapTrigger, + uint256 debtTokenToDeposit, + uint128 ftToDeposit, + uint128 xtToDeposit, + CurveCuts memory curveCuts + ) external whenNotPaused returns (ITermMaxOrder order) { + (IERC20 ft, IERC20 xt,,, IERC20 debtToken) = market.tokens(); + order = market.createOrder(maker, maxXtReserve, swapTrigger, curveCuts); + if (debtTokenToDeposit > 0) { + debtToken.safeTransferFrom(msg.sender, address(this), debtTokenToDeposit); + debtToken.safeIncreaseAllowance(address(market), debtTokenToDeposit); + market.mint(address(order), debtTokenToDeposit); + } + if (ftToDeposit > 0) { + ft.safeTransferFrom(msg.sender, address(order), ftToDeposit); + } + if (xtToDeposit > 0) { + xt.safeTransferFrom(msg.sender, address(order), xtToDeposit); + } + + emit CreateOrderAndDeposit(market, order, maker, debtTokenToDeposit, ftToDeposit, xtToDeposit, curveCuts); + } + + function rolloverGt( + address recipient, + IGearingToken gt, + uint256 gtId, + uint128 additionalAssets, + SwapUnit[] memory units, + ITermMaxMarket nextMarket, + uint256 additionnalNextCollateral, + TermMaxSwapData memory swapData, + uint128 maxLtv + ) external whenNotPaused returns (uint256 newGtId) { + // clear ts stograge + assembly { + tstore(T_ROLLOVER_GT_RESERVE_STORE, 0) + } + // additional debt token to reduce the ltv + if (additionalAssets != 0) { + IERC20(swapData.tokenOut).safeTransferFrom(msg.sender, address(this), additionalAssets); + } + // additional collateral to reduce the ltv + if (additionnalNextCollateral != 0) { + IERC20(units[units.length - 1].tokenOut).safeTransferFrom( + msg.sender, address(this), additionnalNextCollateral + ); + } + gt.safeTransferFrom(msg.sender, address(this), gtId, ""); + bytes memory callbackData = + abi.encode(recipient, maxLtv, additionalAssets, nextMarket, additionnalNextCollateral, units, swapData); + callbackData = abi.encode(FlashRepayOptions.ROLLOVER, callbackData); + gt.flashRepay(gtId, true, callbackData); + assembly { + newGtId := tload(T_ROLLOVER_GT_RESERVE_STORE) + } + } + + function rolloverGtV2( + address recipient, + IGearingToken gt, + uint256 gtId, + uint128 repayAmt, + uint128 additionalAssets, + uint256 removedCollateral, + SwapUnit[] memory units, + ITermMaxMarket nextMarket, + uint256 additionnalNextCollateral, + TermMaxSwapData memory swapData, + uint128 maxLtv + ) external whenNotPaused returns (uint256 newGtId) { + // clear ts stograge + assembly { + tstore(T_ROLLOVER_GT_RESERVE_STORE, 0) + } + // additional debt token to reduce the ltv + if (additionalAssets != 0) { + IERC20(swapData.tokenOut).safeTransferFrom(msg.sender, address(this), additionalAssets); + } + // additional collateral to reduce the ltv + if (additionnalNextCollateral != 0) { + IERC20(units[units.length - 1].tokenOut).safeTransferFrom( + msg.sender, address(this), additionnalNextCollateral + ); + } + gt.safeTransferFrom(msg.sender, address(this), gtId, ""); + bytes memory callbackData = + abi.encode(recipient, maxLtv, additionalAssets, nextMarket, additionnalNextCollateral, units, swapData); + callbackData = abi.encode(FlashRepayOptions.ROLLOVER, callbackData); + if (!IGearingTokenV2(address(gt)).flashRepay(gtId, repayAmt, true, abi.encode(removedCollateral), callbackData)) + { + gt.safeTransferFrom(address(this), recipient, gtId); + } + assembly { + newGtId := tload(T_ROLLOVER_GT_RESERVE_STORE) + } + } + + /// @dev Market flash leverage flashloan callback + function executeOperation(address, IERC20, uint256 amount, bytes memory data) + external + returns (bytes memory collateralData) + { + (address gt, uint256 tokenInAmt, SwapUnit[] memory units, FlashLoanType flashLoanType) = + abi.decode(data, (address, uint256, SwapUnit[], FlashLoanType)); + uint256 totalAmount = amount + tokenInAmt; + collateralData = _doSwap(abi.encode(totalAmount), units); + SwapUnit memory lastUnit = units[units.length - 1]; + if (!adapterWhitelist[lastUnit.adapter]) { + revert AdapterNotWhitelisted(lastUnit.adapter); + } + + if (flashLoanType == FlashLoanType.COLLATERAL) { + IERC20 collateral = IERC20(lastUnit.tokenOut); + uint256 collateralBalance = collateral.balanceOf(address(this)); + collateralData = _encodeAmount(collateralBalance); + // approve all collateral if fashloan type is collateral + collateral.safeIncreaseAllowance(gt, collateralBalance); + } else if (flashLoanType == FlashLoanType.DEBT) { + bytes memory approvalData = + abi.encodeCall(ISwapAdapter.approveOutputToken, (lastUnit.tokenOut, gt, collateralData)); + (bool success, bytes memory returnData) = lastUnit.adapter.delegatecall(approvalData); + if (!success) { + revert ApproveTokenFailWhenSwap(lastUnit.tokenOut, returnData); + } + } + } + + function _balanceOf(IERC20 token, address account) internal view returns (uint256) { + return token.balanceOf(account); + } + + function _encodeAmount(uint256 amount) internal pure returns (bytes memory) { + return abi.encode(amount); + } + + function _decodeAmount(bytes memory collateralData) internal pure returns (uint256) { + return abi.decode(collateralData, (uint256)); + } + + /// @dev Gt flash repay flashloan callback + function executeOperation( + IERC20 repayToken, + uint128 debtAmt, + address, + bytes memory collateralData, + bytes memory callbackData + ) external override { + (FlashRepayOptions option, bytes memory data) = abi.decode(callbackData, (FlashRepayOptions, bytes)); + if (option == FlashRepayOptions.REPAY) { + _flashRepay(repayToken, collateralData, data); + } else if (option == FlashRepayOptions.ROLLOVER) { + _rollover(repayToken, debtAmt, collateralData, data); + } + repayToken.safeIncreaseAllowance(msg.sender, debtAmt); + } + + function _flashRepay(IERC20 repayToken, bytes memory collateralData, bytes memory callbackData) internal { + (SwapUnit[] memory units, TermMaxSwapData memory swapData) = + abi.decode(callbackData, (SwapUnit[], TermMaxSwapData)); + bytes memory outData = _doSwap(collateralData, units); + + if (swapData.orders.length > 0) { + // swap token to exact token + uint256 amount = abi.decode(outData, (uint256)); + _swapTokenToExactToken( + IERC20(swapData.tokenIn), + IERC20(swapData.tokenOut), + address(this), + swapData.orders, + swapData.tradingAmts, + amount.toUint128(), + swapData.deadline + ); + } + } + + function _rollover(IERC20 debtToken, uint256 debtAmt, bytes memory collateralData, bytes memory callbackData) + internal + { + ( + address recipient, + uint128 maxLtv, + uint128 additionalAssets, + ITermMaxMarket market, + uint256 additionnalNextCollateral, + SwapUnit[] memory units, + TermMaxSwapData memory swapData + ) = abi.decode(callbackData, (address, uint128, uint128, ITermMaxMarket, uint256, SwapUnit[], TermMaxSwapData)); + { + // swap collateral + collateralData = units.length == 0 ? collateralData : _doSwap(collateralData, units); + } + (IERC20 ft,, IGearingToken gt, address collateral,) = market.tokens(); + uint256 gtId; + { + // issue new gt + uint256 mintGtFeeRatio = market.mintGtFeeRatio(); + uint128 newDebtAmt = ( + (swapData.netTokenAmt * Constants.DECIMAL_BASE) / (Constants.DECIMAL_BASE - mintGtFeeRatio) + ).toUint128(); + uint256 newCollateralAmt = _decodeAmount(collateralData) + additionnalNextCollateral; + IERC20(collateral).safeIncreaseAllowance(address(gt), newCollateralAmt); + (gtId,) = market.issueFt(address(this), newDebtAmt, abi.encode(newCollateralAmt)); + } + { + uint256 netFtIn = _swapTokenToExactToken( + ft, + debtToken, + address(this), + swapData.orders, + swapData.tradingAmts, + swapData.netTokenAmt, + swapData.deadline + ); + // check remaining ft amount + if (swapData.netTokenAmt > netFtIn) { + uint256 repaidFtAmt = swapData.netTokenAmt - netFtIn; + ft.safeIncreaseAllowance(address(gt), repaidFtAmt); + gt.repay(gtId, repaidFtAmt.toUint128(), false); + } + // check remaining debt token amount + uint256 totalDebtTokenAmt = sum(swapData.tradingAmts) + additionalAssets; + if (totalDebtTokenAmt > debtAmt) { + uint256 repaidDebtAmt = totalDebtTokenAmt - debtAmt; + debtToken.safeIncreaseAllowance(address(gt), repaidDebtAmt); + gt.repay(gtId, repaidDebtAmt.toUint128(), true); + } + (, uint128 ltv,) = gt.getLiquidationInfo(gtId); + if (ltv > maxLtv) { + revert LtvBiggerThanExpected(maxLtv, ltv); + } + } + // transfer new gt to recipient + gt.safeTransferFrom(address(this), recipient, gtId); + assembly { + tstore(T_ROLLOVER_GT_RESERVE_STORE, gtId) + } + } + + function _doSwap(bytes memory inputData, SwapUnit[] memory units) internal returns (bytes memory outData) { + if (units.length == 0) { + revert SwapUnitsIsEmpty(); + } + for (uint256 i = 0; i < units.length; ++i) { + if (!adapterWhitelist[units[i].adapter]) { + revert AdapterNotWhitelisted(units[i].adapter); + } + bytes memory dataToSwap = + abi.encodeCall(ISwapAdapter.swap, (units[i].tokenIn, units[i].tokenOut, inputData, units[i].swapData)); + + (bool success, bytes memory returnData) = units[i].adapter.delegatecall(dataToSwap); + if (!success) { + revert SwapFailed(units[i].adapter, returnData); + } + inputData = abi.decode(returnData, (bytes)); + } + outData = inputData; + } + + function onERC721Received(address, address, uint256, bytes memory) external pure override returns (bytes4) { + return this.onERC721Received.selector; + } + + function pause() external onlyOwner { + _pause(); + } + + function unpause() external onlyOwner { + _unpause(); + } +} diff --git a/contracts/v2/router/swapAdapters/ERC4626VaultAdapterV2.sol b/contracts/v2/router/swapAdapters/ERC4626VaultAdapterV2.sol new file mode 100644 index 0000000..2ae0a62 --- /dev/null +++ b/contracts/v2/router/swapAdapters/ERC4626VaultAdapterV2.sol @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "../../../v1/router/swapAdapters/ERC4626VaultAdapter.sol"; +import {TransferUtils} from "../../../v1/lib/TransferUtils.sol"; + +/** + * @title TermMax ERC4626VaultAdapterV2 + * @author Term Structure Labs + */ +contract ERC4626VaultAdapterV2 is ERC4626VaultAdapter { + using TransferUtils for IERC20; + + constructor() {} + + function _swap(IERC20 tokenIn, IERC20 tokenOut, uint256 amount, bytes memory swapData) + internal + virtual + override + returns (uint256 tokenOutAmt) + { + (Action action, uint256 inAmount, uint256 minTokenOut) = abi.decode(swapData, (Action, uint256, uint256)); + /** + * Note: Scaling Input/Output amount + */ + minTokenOut = (minTokenOut * amount) / inAmount; + + if (action == Action.Deposit) { + tokenIn.safeIncreaseAllowance(address(tokenOut), amount); + tokenOutAmt = IERC4626(address(tokenOut)).deposit(amount, address(this)); + if (tokenOutAmt < minTokenOut) { + revert LessThanMinTokenOut(tokenOutAmt, minTokenOut); + } + } else if (action == Action.Redeem) { + tokenIn.safeIncreaseAllowance(address(tokenIn), amount); + tokenOutAmt = IERC4626(address(tokenIn)).redeem(amount, address(this), address(this)); + if (tokenOutAmt < minTokenOut) { + revert LessThanMinTokenOut(tokenOutAmt, minTokenOut); + } + } else { + revert InvalidAction(); + } + } +} diff --git a/contracts/v2/router/swapAdapters/KyberswapV2AdapterV2.sol b/contracts/v2/router/swapAdapters/KyberswapV2AdapterV2.sol new file mode 100644 index 0000000..22a5313 --- /dev/null +++ b/contracts/v2/router/swapAdapters/KyberswapV2AdapterV2.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "../../../v1/router/swapAdapters/KyberswapV2Adapter.sol"; + +/** + * @title TermMax KyberswapV2AdapterV2 + * @author Term Structure Labs + */ +contract KyberswapV2AdapterV2 is KyberswapV2Adapter { + using Address for address; + using TransferUtils for IERC20; + + error KyberScalingFailed(); + + constructor(address router_, address scalingHelper_) KyberswapV2Adapter(router_, scalingHelper_) {} + + function _swap(IERC20 tokenIn, IERC20, uint256 amountIn, bytes memory swapData) + internal + virtual + override + returns (uint256) + { + IERC20(tokenIn).safeIncreaseAllowance(address(router), amountIn); + (bool isSuccess, bytes memory newSwapData) = + IKyberScalingHelper(KYBER_SCALING_HELPER).getScaledInputData(swapData, amountIn); + + require(isSuccess, KyberScalingFailed()); + + bytes memory returnData = router.functionCall(newSwapData); + (uint256 tokenOutAmt,) = abi.decode(returnData, (uint256, uint256)); + return tokenOutAmt; + } +} diff --git a/contracts/v2/router/swapAdapters/OdosV2AdapterV2.sol b/contracts/v2/router/swapAdapters/OdosV2AdapterV2.sol new file mode 100644 index 0000000..904e543 --- /dev/null +++ b/contracts/v2/router/swapAdapters/OdosV2AdapterV2.sol @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "../../../v1/router/swapAdapters/OdosV2Adapter.sol"; + +/** + * @title TermMax OdosAdapterV2AdapterV2 + * @author Term Structure Labs + */ +contract OdosV2AdapterV2 is OdosV2Adapter { + using TransferUtils for IERC20; + + error InvalidOutputToken(); + + constructor(address router_) OdosV2Adapter(router_) {} + + function _swap(IERC20 tokenIn, IERC20 tokenOut, uint256 amountIn, bytes memory swapData) + internal + virtual + override + returns (uint256 tokenOutAmt) + { + tokenIn.safeIncreaseAllowance(address(router), amountIn); + + ( + IOdosRouterV2.swapTokenInfo memory tokenInfo, + bytes memory pathDefinition, + address executor, + uint32 referralCode + ) = abi.decode(swapData, (IOdosRouterV2.swapTokenInfo, bytes, address, uint32)); + + if (tokenInfo.outputToken != address(tokenOut)) { + revert InvalidOutputToken(); + } + /** + * Note: Scaling Input/Output amount + */ + tokenInfo.outputQuote = (tokenInfo.outputQuote * amountIn) / tokenInfo.inputAmount; + tokenInfo.outputMin = (tokenInfo.outputMin * amountIn) / tokenInfo.inputAmount; + tokenInfo.inputAmount = amountIn; + tokenInfo.outputReceiver = address(this); + + tokenOutAmt = router.swap(tokenInfo, pathDefinition, executor, referralCode); + } +} diff --git a/contracts/v2/router/swapAdapters/PendleSwapV3Adapter.sol b/contracts/v2/router/swapAdapters/PendleSwapV3Adapter.sol new file mode 100644 index 0000000..200e6a1 --- /dev/null +++ b/contracts/v2/router/swapAdapters/PendleSwapV3Adapter.sol @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "../../../v1/router/swapAdapters/PendleSwapV3Adapter.sol"; + +/** + * @title TermMax PendleSwapV3Adapter + * @author Term Structure Labs + */ +contract PendleSwapV3AdapterV2 is PendleSwapV3Adapter { + using TransferUtils for IERC20; + + constructor(address router_) PendleSwapV3Adapter(router_) {} + + function _swap(IERC20 tokenIn, IERC20 tokenOut, uint256 amount, bytes memory swapData) + internal + virtual + override + returns (uint256 tokenOutAmt) + { + (address ptMarketAddr, uint256 inAmount, uint256 minTokenOut) = + abi.decode(swapData, (address, uint256, uint256)); + IPMarket market = IPMarket(ptMarketAddr); + + (, IPPrincipalToken PT,) = market.readTokens(); + IERC20(tokenIn).safeIncreaseAllowance(address(router), amount); + + /** + * Note: Scaling Input/Output amount + */ + minTokenOut = (minTokenOut * amount) / inAmount; + if (tokenOut == PT) { + (tokenOutAmt,,) = router.swapExactTokenForPt( + address(this), + address(market), + minTokenOut, + defaultApprox, + createTokenInputStruct(address(tokenIn), amount), + emptyLimit + ); + } else { + if (PT.isExpired()) { + (tokenOutAmt,) = router.redeemPyToToken( + address(this), PT.YT(), amount, createTokenOutputStruct(address(tokenOut), minTokenOut) + ); + } else { + (tokenOutAmt,,) = router.swapExactPtForToken( + address(this), + address(market), + amount, + createTokenOutputStruct(address(tokenOut), minTokenOut), + emptyLimit + ); + } + } + } +} diff --git a/contracts/v2/router/swapAdapters/UniswapV3Adapter.sol b/contracts/v2/router/swapAdapters/UniswapV3Adapter.sol new file mode 100644 index 0000000..a3a0e92 --- /dev/null +++ b/contracts/v2/router/swapAdapters/UniswapV3Adapter.sol @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "../../../v1/router/swapAdapters/UniswapV3Adapter.sol"; + +/** + * @title TermMax UniswapV3AdapterV2 + * @author Term Structure Labs + */ +contract UniswapV3AdapterV2 is UniswapV3Adapter { + using TransferUtils for IERC20; + + constructor(address router_) UniswapV3Adapter(router_) {} + + function _swap(IERC20 tokenIn, IERC20, uint256 amount, bytes memory swapData) + internal + virtual + override + returns (uint256 tokenOutAmt) + { + IERC20(tokenIn).safeIncreaseAllowance(address(router), amount); + (bytes memory path, uint256 deadline, uint256 inAmount, uint256 amountOutMinimum) = + abi.decode(swapData, (bytes, uint256, uint256, uint256)); + /** + * Note: Scaling Input/Output amount + */ + amountOutMinimum = (amountOutMinimum * amount) / inAmount; + + tokenOutAmt = router.exactInput( + ISwapRouter.ExactInputParams({ + path: path, + recipient: address(this), + deadline: deadline, + amountIn: amount, + amountOutMinimum: amountOutMinimum + }) + ); + } +} From 1d6b18b3681215b1b8dda5c48117b4dbb017aeae Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 29 May 2025 15:11:51 +0800 Subject: [PATCH 046/194] v2 termmax token contract --- contracts/interfaces/IMintableERC20.sol | 11 ++ contracts/v2/errors/TermMaxTokenErrors.sol | 20 +++ contracts/v2/events/TermMaxTokenEvents.sol | 19 +++ contracts/v2/tokens/StakingBuffer.sol | 62 +++++++ contracts/v2/tokens/TermMaxToken.sol | 180 +++++++++++++++++++++ 5 files changed, 292 insertions(+) create mode 100644 contracts/interfaces/IMintableERC20.sol create mode 100644 contracts/v2/errors/TermMaxTokenErrors.sol create mode 100644 contracts/v2/events/TermMaxTokenEvents.sol create mode 100644 contracts/v2/tokens/StakingBuffer.sol create mode 100644 contracts/v2/tokens/TermMaxToken.sol diff --git a/contracts/interfaces/IMintableERC20.sol b/contracts/interfaces/IMintableERC20.sol new file mode 100644 index 0000000..d22fa4f --- /dev/null +++ b/contracts/interfaces/IMintableERC20.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IMintableERC20 as IMintableERC20V1} from "../v1/tokens/IMintableERC20.sol"; +import {IMintableERC20V2} from "../v2/tokens/IMintableERC20V2.sol"; + +/** + * @title Mintable ERC20 interface + * @author Term Structure Labs + */ +interface IMintableERC20 is IMintableERC20V1, IMintableERC20V2 {} diff --git a/contracts/v2/errors/TermMaxTokenErrors.sol b/contracts/v2/errors/TermMaxTokenErrors.sol new file mode 100644 index 0000000..c197dc1 --- /dev/null +++ b/contracts/v2/errors/TermMaxTokenErrors.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface TermMaxTokenErrors { + error InvalidToken(); + error InsufficientIncomeAmount(uint256 availableAmount, uint256 requestedAmount); + error AaveWithdrawFailed(uint256 aTokenAmount, uint256 recieivedAmount); + + /// @notice Error thrown when trying to accept a change that has no pending value + error NoPendingValue(); + + /// @notice Error thrown when trying to accept a change before the timelock period has elapsed + error TimelockNotElapsed(); + + /// @notice Error thrown when attempting to submit a change that's already pending + error AlreadyPending(); + + /// @notice Error thrown when the implementation address is invalid + error InvalidImplementation(); +} diff --git a/contracts/v2/events/TermMaxTokenEvents.sol b/contracts/v2/events/TermMaxTokenEvents.sol new file mode 100644 index 0000000..793bb39 --- /dev/null +++ b/contracts/v2/events/TermMaxTokenEvents.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface TermMaxTokenEvents { + event TermMaxTokenInitialized(address indexed admin, address indexed underlying); + event Mint(address indexed to, uint256 amount); + event Burn(address indexed to, uint256 amount); + event WithdrawIncome(address indexed to, uint256 amount); + event UpdateBufferConfig(uint256 minimumBuffer, uint256 maximumBuffer, uint256 buffer); + + /// @notice Event emitted when a new implementation upgrade is submitted with timelock + event SubmitUpgrade(address indexed newImplementation, uint64 validAt); + + /// @notice Event emitted when a pending upgrade is accepted + event AcceptUpgrade(address indexed caller, address indexed newImplementation); + + /// @notice Event emitted when a pending upgrade is revoked + event RevokeUpgrade(address indexed caller); +} diff --git a/contracts/v2/tokens/StakingBuffer.sol b/contracts/v2/tokens/StakingBuffer.sol new file mode 100644 index 0000000..031eb4f --- /dev/null +++ b/contracts/v2/tokens/StakingBuffer.sol @@ -0,0 +1,62 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {TransferUtils, IERC20} from "../../v1/lib/TransferUtils.sol"; + +abstract contract StakingBuffer { + using TransferUtils for IERC20; + + error InvalidBuffer(uint256 minimumBuffer, uint256 maximumBuffer, uint256 buffer); + + struct BufferConfig { + uint256 minimumBuffer; + uint256 maximumBuffer; + uint256 buffer; + } + + function _depositWithBuffer(address assetAddr) internal { + uint256 assetBalance = IERC20(assetAddr).balanceOf(address(this)); + BufferConfig memory bufferConfig = _bufferConfig(assetAddr); + if (assetBalance > bufferConfig.maximumBuffer) { + _depositToPool(assetAddr, assetBalance - bufferConfig.buffer); + } + } + + function _withdrawWithBuffer(address assetAddr, address to, uint256 amount) internal { + uint256 assetBalance = IERC20(assetAddr).balanceOf(address(this)); + BufferConfig memory bufferConfig = _bufferConfig(assetAddr); + + if (assetBalance >= amount && assetBalance - amount >= bufferConfig.minimumBuffer) { + // Sufficient buffer, transfer directly from contract balance + IERC20(assetAddr).safeTransfer(to, amount); + return; + } + // Not enough buffer, withdraw from pool + uint256 targetBalance = bufferConfig.buffer + amount; + uint256 amountFromPool = targetBalance - assetBalance; + uint256 aTokenBalance = _aTokenBalance(assetAddr); + if (amountFromPool > aTokenBalance) { + amountFromPool = aTokenBalance; + } + if (amountFromPool == amount) { + _withdrawFromPool(assetAddr, to, amountFromPool); + } else { + _withdrawFromPool(assetAddr, address(this), amountFromPool); + IERC20(assetAddr).safeTransfer(to, amount); + } + } + + function _bufferConfig(address assetAddr) internal view virtual returns (BufferConfig memory); + + function _depositToPool(address assetAddr, uint256 amount) internal virtual; + + function _withdrawFromPool(address assetAddr, address to, uint256 amount) internal virtual; + + function _aTokenBalance(address assetAddr) internal view virtual returns (uint256 amount); + + function _checkBufferConfig(uint256 minimumBuffer, uint256 maximumBuffer, uint256 buffer) internal pure { + if (minimumBuffer > maximumBuffer || buffer < minimumBuffer || buffer > maximumBuffer) { + revert InvalidBuffer(minimumBuffer, maximumBuffer, buffer); + } + } +} diff --git a/contracts/v2/tokens/TermMaxToken.sol b/contracts/v2/tokens/TermMaxToken.sol new file mode 100644 index 0000000..97d994f --- /dev/null +++ b/contracts/v2/tokens/TermMaxToken.sol @@ -0,0 +1,180 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {ERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; +import { + OwnableUpgradeable, + Ownable2StepUpgradeable +} from "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; +import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import {IERC20Metadata, IERC20} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; +import {IAaveV3Minimal} from "../extensions/aave/IAaveV3Minimal.sol"; +import {TransferUtils} from "../../v1/lib/TransferUtils.sol"; +import {StakingBuffer} from "./StakingBuffer.sol"; +import {TermMaxTokenEvents} from "../events/TermMaxTokenEvents.sol"; +import {TermMaxTokenErrors} from "../errors/TermMaxTokenErrors.sol"; +import {PendingLib, PendingAddress} from "../../v1/lib/PendingLib.sol"; + +contract TermMaxToken is + StakingBuffer, + ERC20Upgradeable, + Ownable2StepUpgradeable, + UUPSUpgradeable, + ReentrancyGuardUpgradeable, + TermMaxTokenEvents, + TermMaxTokenErrors +{ + using TransferUtils for IERC20; + using PendingLib for PendingAddress; + + IAaveV3Minimal public immutable aavePool; + uint16 public immutable referralCode; + + IERC20 public aToken; + IERC20 public underlying; + BufferConfig public bufferConfig; + /// @notice The token's decimals + uint8 _decimals; + uint256 internal withdawedIncomeAssets; + + /// @notice The timelock period for upgrade operations (in seconds) + uint256 public constant UPGRADE_TIMELOCK = 1 days; + + /// @notice Pending upgrade implementation address with timelock + PendingAddress internal _pendingImplementation; + + constructor(address aavePool_, uint16 referralCode_) { + aavePool = IAaveV3Minimal(aavePool_); + referralCode = referralCode_; + _disableInitializers(); + } + + function initialize(address admin, address underlying_, BufferConfig memory bufferConfig_) public initializer { + underlying = IERC20(underlying_); + string memory name = string(abi.encodePacked("TermMax ", IERC20Metadata(underlying_).name())); + string memory symbol = string(abi.encodePacked("tmx", IERC20Metadata(underlying_).symbol())); + _decimals = IERC20Metadata(underlying_).decimals(); + __ERC20_init(name, symbol); + __Ownable_init(admin); + __ReentrancyGuard_init(); + _updateBufferConfig(bufferConfig_); + aToken = IERC20(aavePool.getReserveData(underlying_).aTokenAddress); + + emit TermMaxTokenInitialized(admin, underlying_); + } + + function mint(address to, uint256 amount) external nonReentrant { + _mint(to, amount); + underlying.safeTransferFrom(msg.sender, address(this), amount); + _depositWithBuffer(address(underlying)); + } + + function burn(address to, uint256 amount) external nonReentrant { + _burn(msg.sender, amount); + _withdrawWithBuffer(address(underlying), to, amount); + } + + function burnToAToken(address to, uint256 amount) external nonReentrant { + _burn(msg.sender, amount); + aToken.safeTransfer(to, amount); + } + + function totalIncomeAssets() external view returns (uint256) { + uint256 aTokenBalance = aToken.balanceOf(address(this)); + uint256 underlyingBalance = underlying.balanceOf(address(this)); + return aTokenBalance + underlyingBalance - totalSupply() + withdawedIncomeAssets; + } + + function withdrawIncomeAssets(address asset, address to, uint256 amount) external nonReentrant onlyOwner { + uint256 aTokenBalance = aToken.balanceOf(address(this)); + uint256 underlyingBalance = underlying.balanceOf(address(this)); + uint256 avaliableAmount = aTokenBalance + underlyingBalance - totalSupply(); + require(avaliableAmount >= amount, InsufficientIncomeAmount(avaliableAmount, amount)); + withdawedIncomeAssets += amount; + if (asset == address(underlying)) { + _withdrawWithBuffer(address(underlying), to, amount); + } else if (asset == address(aToken)) { + aToken.safeTransfer(to, amount); + } else { + revert InvalidToken(); + } + emit WithdrawIncome(to, amount); + } + + function updateBufferConfigAndAddReserves(uint256 additionalReserves, BufferConfig memory bufferConfig_) + external + onlyOwner + { + // Admin may add additional reserves when liquidity is low + // to avoid the situation that the underlying liquidity is too low to withdraw + underlying.safeTransferFrom(msg.sender, address(this), additionalReserves); + _updateBufferConfig(bufferConfig_); + } + + function _updateBufferConfig(BufferConfig memory bufferConfig_) internal { + _checkBufferConfig(bufferConfig_.minimumBuffer, bufferConfig_.maximumBuffer, bufferConfig_.buffer); + bufferConfig = BufferConfig(bufferConfig_.minimumBuffer, bufferConfig_.maximumBuffer, bufferConfig_.buffer); + emit UpdateBufferConfig(bufferConfig_.minimumBuffer, bufferConfig_.maximumBuffer, bufferConfig_.buffer); + } + + function decimals() public view override(ERC20Upgradeable) returns (uint8) { + return _decimals; + } + + function _bufferConfig(address) internal view virtual override returns (BufferConfig memory) { + return bufferConfig; + } + + function _depositToPool(address assetAddr, uint256 amount) internal virtual override { + IERC20(assetAddr).safeIncreaseAllowance(address(aavePool), amount); + aavePool.supply(assetAddr, amount, address(this), referralCode); + } + + function _withdrawFromPool(address assetAddr, address to, uint256 amount) internal virtual override { + aToken.safeIncreaseAllowance(address(aavePool), amount); + uint256 receivedAmount = aavePool.withdraw(assetAddr, amount, to); + require(receivedAmount == amount, AaveWithdrawFailed(amount, receivedAmount)); + } + + function _aTokenBalance(address) internal view virtual override returns (uint256 amount) { + amount = aToken.balanceOf(address(this)); + } + + /// @notice Submit a new implementation for upgrade with timelock + /// @param newImplementation The address of the new implementation contract + function submitPendingUpgrade(address newImplementation) external onlyOwner { + if (newImplementation == address(0)) revert InvalidImplementation(); + if (_pendingImplementation.validAt != 0) revert AlreadyPending(); + + _pendingImplementation.update(newImplementation, UPGRADE_TIMELOCK); + + emit SubmitUpgrade(newImplementation, _pendingImplementation.validAt); + } + + /// @notice Revoke the pending implementation upgrade + function revokeUpgrade() external onlyOwner { + if (_pendingImplementation.validAt == 0) revert NoPendingValue(); + + delete _pendingImplementation; + + emit RevokeUpgrade(msg.sender); + } + + /// @notice Get the pending implementation upgrade details + /// @return implementation The pending implementation address + /// @return validAt The timestamp when the upgrade becomes valid + function pendingImplementation() external view returns (address implementation, uint64 validAt) { + return (_pendingImplementation.value, _pendingImplementation.validAt); + } + + /// @notice Override _authorizeUpgrade to prevent direct upgrades without timelock + /// @dev This function should never allow upgrades as they must go through the timelock process + function _authorizeUpgrade(address newImplementation) internal virtual override onlyOwner { + if (_pendingImplementation.validAt == 0) revert NoPendingValue(); + if (newImplementation != _pendingImplementation.value) revert InvalidImplementation(); + if (block.timestamp < _pendingImplementation.validAt) revert TimelockNotElapsed(); + delete _pendingImplementation; + emit AcceptUpgrade(msg.sender, newImplementation); + } +} From a28d3e79e2b2228192f6926f1c22bdb9ca24fee5 Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 29 May 2025 16:05:53 +0800 Subject: [PATCH 047/194] v2 factory and access --- contracts/v2/access/AccessManagerV2.sol | 26 ++ contracts/v2/events/FactoryEventsV2.sol | 22 ++ contracts/v2/factory/TermMaxFactoryV2.sol | 74 ++++ .../v2/factory/TermMaxPriceFeedFactory.sol | 36 ++ contracts/v2/test/MockAave.sol | 58 ++++ contracts/v2/test/MockFlashRepayer.sol | 32 ++ contracts/v2/test/MockOrder.sol | 318 ++++++++++++++++++ 7 files changed, 566 insertions(+) create mode 100644 contracts/v2/access/AccessManagerV2.sol create mode 100644 contracts/v2/events/FactoryEventsV2.sol create mode 100644 contracts/v2/factory/TermMaxFactoryV2.sol create mode 100644 contracts/v2/factory/TermMaxPriceFeedFactory.sol create mode 100644 contracts/v2/test/MockAave.sol create mode 100644 contracts/v2/test/MockFlashRepayer.sol create mode 100644 contracts/v2/test/MockOrder.sol diff --git a/contracts/v2/access/AccessManagerV2.sol b/contracts/v2/access/AccessManagerV2.sol new file mode 100644 index 0000000..455242c --- /dev/null +++ b/contracts/v2/access/AccessManagerV2.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "../../v1/access/AccessManager.sol"; +import {IOracleV2} from "../oracle/IOracleV2.sol"; + +/** + * @title TermMax Access Manager V2 + * @author Term Structure Labs + */ +contract AccessManagerV2 is AccessManager { + function revokePendingOracle(IOracleV2 aggregator, address asset) external onlyRole(ORACLE_ROLE) { + aggregator.revokePendingOracle(asset); + } + + /// @notice Set the switch of multiple entities + function batchSetSwitch(IPausable[] calldata entities, bool state) external onlyRole(PAUSER_ROLE) { + for (uint256 i = 0; i < entities.length; i++) { + if (state) { + entities[i].unpause(); + } else { + entities[i].pause(); + } + } + } +} diff --git a/contracts/v2/events/FactoryEventsV2.sol b/contracts/v2/events/FactoryEventsV2.sol new file mode 100644 index 0000000..07c5eb4 --- /dev/null +++ b/contracts/v2/events/FactoryEventsV2.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {MarketInitialParams} from "../../v1/storage/TermMaxStorage.sol"; + +/** + * @title Factory Events Interface V2 + * @notice Events emitted by the TermMax factory contracts + */ +interface FactoryEventsV2 { + /** + * @notice Emitted when a new market is created + * @param market The address of the newly created market + * @param collateral The address of the collateral token + * @param debtToken The debt token interface + * @param params The initial parameters for the market + */ + event CreateMarket( + address indexed market, address indexed collateral, IERC20 indexed debtToken, MarketInitialParams params + ); +} diff --git a/contracts/v2/factory/TermMaxFactoryV2.sol b/contracts/v2/factory/TermMaxFactoryV2.sol new file mode 100644 index 0000000..1d44e00 --- /dev/null +++ b/contracts/v2/factory/TermMaxFactoryV2.sol @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {Ownable, Ownable2Step} from "@openzeppelin/contracts/access/Ownable2Step.sol"; +import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol"; +import {GearingTokenWithERC20V2} from "../tokens/GearingTokenWithERC20V2.sol"; +import {MarketInitialParams} from "../../v1/storage/TermMaxStorage.sol"; +import {FactoryErrors} from "../../v1/errors/FactoryErrors.sol"; +import {FactoryEvents} from "../../v1/events/FactoryEvents.sol"; +import {ITermMaxMarket} from "../../v1/ITermMaxMarket.sol"; +import {ITermMaxFactory} from "../../v1/factory/ITermMaxFactory.sol"; +import {FactoryEventsV2} from "../events/FactoryEventsV2.sol"; + +/** + * @title The TermMax factory + * @author Term Structure Labs + */ +contract TermMaxFactoryV2 is Ownable2Step, FactoryErrors, FactoryEvents, ITermMaxFactory, FactoryEventsV2 { + bytes32 constant GT_ERC20 = keccak256("GearingTokenWithERC20V2"); + + /// @notice The implementation of TermMax Market contract + address public immutable TERMMAX_MARKET_IMPLEMENTATION; + + /// @notice The implementations of TermMax Gearing Token contract + /// @dev Based on the abstract GearingToken contract, + /// different GearingTokens can be adapted to various collaterals, + /// such as ERC20 tokens and ERC721 tokens. + mapping(bytes32 => address) public gtImplements; + + constructor(address admin, address TERMMAX_MARKET_IMPLEMENTATION_) Ownable(admin) { + if (TERMMAX_MARKET_IMPLEMENTATION_ == address(0)) { + revert InvalidImplementation(); + } + TERMMAX_MARKET_IMPLEMENTATION = TERMMAX_MARKET_IMPLEMENTATION_; + + gtImplements[GT_ERC20] = address(new GearingTokenWithERC20V2()); + } + + function setGtImplement(string memory gtImplementName, address gtImplement) external onlyOwner { + bytes32 key = keccak256(abi.encodePacked(gtImplementName)); + gtImplements[key] = gtImplement; + emit SetGtImplement(key, gtImplement); + } + + function predictMarketAddress( + address deployer, + address collateral, + address debtToken, + uint64 maturity, + uint256 salt + ) external view returns (address market) { + return Clones.predictDeterministicAddress( + TERMMAX_MARKET_IMPLEMENTATION, keccak256(abi.encode(deployer, collateral, debtToken, maturity, salt)) + ); + } + + function createMarket(bytes32 gtKey, MarketInitialParams memory params, uint256 salt) + external + onlyOwner + returns (address market) + { + params.gtImplementation = gtImplements[gtKey]; + if (params.gtImplementation == address(0)) { + revert CantNotFindGtImplementation(); + } + market = Clones.cloneDeterministic( + TERMMAX_MARKET_IMPLEMENTATION, + keccak256(abi.encode(msg.sender, params.collateral, params.debtToken, params.marketConfig.maturity, salt)) + ); + ITermMaxMarket(market).initialize(params); + + emit CreateMarket(market, params.collateral, params.debtToken, params); + } +} diff --git a/contracts/v2/factory/TermMaxPriceFeedFactory.sol b/contracts/v2/factory/TermMaxPriceFeedFactory.sol new file mode 100644 index 0000000..6d1ad58 --- /dev/null +++ b/contracts/v2/factory/TermMaxPriceFeedFactory.sol @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {TermMaxERC4626PriceFeed} from "../oracle/priceFeeds/TermMaxERC4626PriceFeed.sol"; +import {TermMaxPriceFeedConverter} from "../oracle/priceFeeds/TermMaxPriceFeedConverter.sol"; +import {TermMaxPTPriceFeed} from "../oracle/priceFeeds/TermMaxPTPriceFeed.sol"; + +contract TermMaxPriceFeedFactory { + event PriceFeedCreated(address indexed priceFeed); + + function createPriceFeedWithERC4626(address _assetPriceFeed, address _vault) external returns (address) { + address priceFeed = address(new TermMaxERC4626PriceFeed(_assetPriceFeed, _vault)); + emit PriceFeedCreated(priceFeed); + return priceFeed; + } + + function createPriceFeedConverter( + address _aTokenToBTokenPriceFeed, + address _bTokenToCTokenPriceFeed, + address _asset + ) external returns (address) { + address priceFeed = + address(new TermMaxPriceFeedConverter(_aTokenToBTokenPriceFeed, _bTokenToCTokenPriceFeed, _asset)); + emit PriceFeedCreated(priceFeed); + return priceFeed; + } + + function createPTWithPriceFeed(address _pendlePYLpOracle, address _market, uint32 _duration, address _priceFeed) + external + returns (address) + { + address priceFeed = address(new TermMaxPTPriceFeed(_pendlePYLpOracle, _market, _duration, _priceFeed)); + emit PriceFeedCreated(priceFeed); + return priceFeed; + } +} diff --git a/contracts/v2/test/MockAave.sol b/contracts/v2/test/MockAave.sol new file mode 100644 index 0000000..e78f6ec --- /dev/null +++ b/contracts/v2/test/MockAave.sol @@ -0,0 +1,58 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import {IAaveV3Minimal} from "../extensions/aave/IAaveV3Minimal.sol"; +import {IMintableERC20, IERC20} from "../../v1/tokens/IMintableERC20.sol"; + +contract MockAave is ERC20, IAaveV3Minimal { + IERC20 public immutable underlying; + + constructor(address underlying_) ERC20("MockAave", "mAAVE") { + underlying = IERC20(underlying_); + } + + function getReserveData(address) external view override returns (ReserveData memory) { + return ReserveData({ + configuration: ReserveConfigurationMap({data: 0}), + liquidityIndex: 1e27, + currentLiquidityRate: 0, + variableBorrowIndex: 1e27, + currentVariableBorrowRate: 0, + currentStableBorrowRate: 0, + lastUpdateTimestamp: uint40(block.timestamp), + id: 0, + aTokenAddress: address(this), + stableDebtTokenAddress: address(0), + variableDebtTokenAddress: address(0), + interestRateStrategyAddress: address(0), + accruedToTreasury: 0, + unbacked: 0, + isolationModeTotalDebt: 0 + }); + } + + function supply(address asset, uint256 amount, address onBehalfOf, uint16 /* referralCode */ ) external override { + // Transfer tokens from sender to this contract + IERC20(asset).transferFrom(msg.sender, address(this), amount); + // Mint aTokens to the onBehalfOf address + _mint(onBehalfOf, amount); + } + + function withdraw(address asset, uint256 amount, address to) external override returns (uint256) { + // Burn aTokens from sender + _burn(msg.sender, amount); + uint256 balance = IERC20(asset).balanceOf(address(this)); + if (balance < amount) { + IMintableERC20(asset).mint(address(this), amount - balance); + } + // Transfer underlying tokens to the recipient + IERC20(asset).transfer(to, amount); + return amount; + } + + function simulateInterestAccrual(address to, uint256 amount) external { + // Simulate interest accrual by minting aTokens + _mint(to, amount); + } +} diff --git a/contracts/v2/test/MockFlashRepayer.sol b/contracts/v2/test/MockFlashRepayer.sol new file mode 100644 index 0000000..4781d44 --- /dev/null +++ b/contracts/v2/test/MockFlashRepayer.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {IGearingToken, IGearingTokenV2, IERC20, IFlashRepayer} from "../tokens/AbstractGearingTokenV2.sol"; +import {IERC721Receiver} from "@openzeppelin/contracts/interfaces/IERC721Receiver.sol"; + +contract MockFlashRepayer is IFlashRepayer, IERC721Receiver { + IGearingToken gt; + + constructor(IGearingToken gt_) { + gt = gt_; + } + + function flashRepay(uint256 id, uint128 repayAmt, bool byUnderlying, bytes calldata removedCollateral) external { + gt.safeTransferFrom(msg.sender, address(this), id, ""); + bool repayAll = IGearingTokenV2(address(gt)).flashRepay(id, repayAmt, byUnderlying, removedCollateral, ""); + if (!repayAll) { + gt.safeTransferFrom(address(this), msg.sender, id, ""); + } + } + + function executeOperation(IERC20 repayToken, uint128 debtAmt, address, bytes memory, bytes calldata) + external + override + { + repayToken.approve(address(gt), debtAmt); + } + + function onERC721Received(address, address, uint256, bytes calldata) external pure override returns (bytes4) { + return this.onERC721Received.selector; + } +} diff --git a/contracts/v2/test/MockOrder.sol b/contracts/v2/test/MockOrder.sol new file mode 100644 index 0000000..90c9e7c --- /dev/null +++ b/contracts/v2/test/MockOrder.sol @@ -0,0 +1,318 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; +import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; +import {ITermMaxOrder, IERC20} from "../../v1/ITermMaxOrder.sol"; +import {ITermMaxMarket} from "../../v1/ITermMaxMarket.sol"; +import {IGearingToken} from "../../v1/tokens/IGearingToken.sol"; +import {IFlashLoanReceiver} from "../../v1/IFlashLoanReceiver.sol"; +import {Constants} from "../../v1/lib/Constants.sol"; +import {TermMaxCurve, MathLib} from "../../v1/lib/TermMaxCurve.sol"; +import {OrderErrors} from "../../v1/errors/OrderErrors.sol"; +import {OrderEvents} from "../../v1/events/OrderEvents.sol"; +import {OrderConfig, MarketConfig, CurveCuts, CurveCut, FeeConfig} from "../../v1/storage/TermMaxStorage.sol"; +import {ISwapCallback} from "../../v1/ISwapCallback.sol"; +import {TransferUtils} from "../../v1/lib/TransferUtils.sol"; +import {ITermMaxMarketV2} from "../ITermMaxMarketV2.sol"; + +/** + * @title TermMax Order + * @author Term Structure Labs + */ +contract MockOrder is + ITermMaxOrder, + ReentrancyGuardUpgradeable, + OwnableUpgradeable, + PausableUpgradeable, + OrderErrors, + OrderEvents +{ + using SafeCast for uint256; + using SafeCast for int256; + using TransferUtils for IERC20; + + ITermMaxMarket public market; + + IERC20 private ft; + IERC20 private xt; + IERC20 private debtToken; + IGearingToken private gt; + + OrderConfig private _orderConfig; + + address public maker; + + uint64 private maturity; + + /// @notice Check if the market is borrowing allowed + modifier isBorrowingAllowed(OrderConfig memory config) { + if (config.curveCuts.borrowCurveCuts.length == 0) { + revert BorrowIsNotAllowed(); + } + _; + } + + /// @notice Check if the market is lending allowed + modifier isLendingAllowed(OrderConfig memory config) { + if (config.curveCuts.lendCurveCuts.length == 0) { + revert LendIsNotAllowed(); + } + _; + } + + /// @notice Check if the order is tradable + modifier isOpen() { + _requireNotPaused(); + if (block.timestamp >= maturity) { + revert TermIsNotOpen(); + } + _; + } + + modifier onlyMarket() { + if (msg.sender != address(market)) revert OnlyMarket(); + _; + } + + constructor() { + _disableInitializers(); + } + + /** + * @inheritdoc ITermMaxOrder + */ + function initialize( + address maker_, + IERC20[3] memory tokens, + IGearingToken gt_, + uint256 maxXtReserve_, + ISwapCallback swapTrigger, + CurveCuts memory curveCuts_, + MarketConfig memory marketConfig + ) external override initializer { + __Ownable_init(maker_); + __ReentrancyGuard_init(); + __Pausable_init(); + market = ITermMaxMarket(_msgSender()); + maker = maker_; + _orderConfig.curveCuts = curveCuts_; + _orderConfig.feeConfig = marketConfig.feeConfig; + _orderConfig.maxXtReserve = maxXtReserve_; + _orderConfig.swapTrigger = swapTrigger; + maturity = marketConfig.maturity; + + ft = tokens[0]; + xt = tokens[1]; + debtToken = tokens[2]; + gt = gt_; + emit OrderInitialized(market, maker_, maxXtReserve_, swapTrigger, curveCuts_); + } + + /** + * @inheritdoc ITermMaxOrder + */ + function orderConfig() external view returns (OrderConfig memory) { + return _orderConfig; + } + + /** + * @inheritdoc ITermMaxOrder + */ + function tokenReserves() public view override returns (uint256, uint256) { + return (ft.balanceOf(address(this)), xt.balanceOf(address(this))); + } + + /** + * @inheritdoc ITermMaxOrder + */ + function apr() external view override returns (uint256 lendApr_, uint256 borrowApr_) { + uint256 daysToMaturity = _daysToMaturity(); + uint256 oriXtReserve = xt.balanceOf(address(this)); + + CurveCuts memory curveCuts = _orderConfig.curveCuts; + + uint256 lendCutId = TermMaxCurve.calcCutId(curveCuts.lendCurveCuts, oriXtReserve); + (, uint256 lendVXtReserve, uint256 lendVFtReserve) = TermMaxCurve.calcIntervalProps( + Constants.DECIMAL_BASE, daysToMaturity, curveCuts.lendCurveCuts[lendCutId], oriXtReserve + ); + lendApr_ = + ((lendVFtReserve * Constants.DECIMAL_BASE * Constants.DAYS_IN_YEAR) / lendVXtReserve) * daysToMaturity; + + uint256 borrowCutId = TermMaxCurve.calcCutId(curveCuts.borrowCurveCuts, oriXtReserve); + (, uint256 borrowVXtReserve, uint256 borrowVFtReserve) = TermMaxCurve.calcIntervalProps( + Constants.DECIMAL_BASE, daysToMaturity, curveCuts.borrowCurveCuts[borrowCutId], oriXtReserve + ); + borrowApr_ = + ((borrowVFtReserve * Constants.DECIMAL_BASE * Constants.DAYS_IN_YEAR) / borrowVXtReserve) * daysToMaturity; + } + + /** + * @inheritdoc ITermMaxOrder + */ + function updateOrder(OrderConfig memory newOrderConfig, int256 ftChangeAmt, int256 xtChangeAmt) + external + override + onlyOwner + { + _updateCurve(newOrderConfig.curveCuts); + if (ftChangeAmt > 0) { + ft.safeTransferFrom(msg.sender, address(this), ftChangeAmt.toUint256()); + } else if (ftChangeAmt < 0) { + ft.safeTransfer(msg.sender, (-ftChangeAmt).toUint256()); + } + if (xtChangeAmt > 0) { + xt.safeTransferFrom(msg.sender, address(this), xtChangeAmt.toUint256()); + } else if (xtChangeAmt < 0) { + xt.safeTransfer(msg.sender, (-xtChangeAmt).toUint256()); + } + _orderConfig.maxXtReserve = newOrderConfig.maxXtReserve; + _orderConfig.gtId = newOrderConfig.gtId; + _orderConfig.swapTrigger = newOrderConfig.swapTrigger; + emit UpdateOrder( + newOrderConfig.curveCuts, + ftChangeAmt, + xtChangeAmt, + newOrderConfig.gtId, + newOrderConfig.maxXtReserve, + newOrderConfig.swapTrigger + ); + } + + function _updateCurve(CurveCuts memory newCurveCuts) internal { + bytes32 newCurveCutsHash = keccak256(abi.encode(newCurveCuts)); + CurveCuts memory oldCurveCuts = _orderConfig.curveCuts; + if (keccak256(abi.encode(oldCurveCuts)) != newCurveCutsHash) { + if (newCurveCuts.lendCurveCuts.length > 0) { + if (newCurveCuts.lendCurveCuts[0].xtReserve != 0) revert InvalidCurveCuts(); + } + for (uint256 i = 1; i < newCurveCuts.lendCurveCuts.length; i++) { + if (newCurveCuts.lendCurveCuts[i].xtReserve <= newCurveCuts.lendCurveCuts[i - 1].xtReserve) { + revert InvalidCurveCuts(); + } + } + if (newCurveCuts.borrowCurveCuts.length > 0) { + if (newCurveCuts.borrowCurveCuts[0].xtReserve != 0) revert InvalidCurveCuts(); + } + for (uint256 i = 1; i < newCurveCuts.borrowCurveCuts.length; i++) { + if (newCurveCuts.borrowCurveCuts[i].xtReserve <= newCurveCuts.borrowCurveCuts[i - 1].xtReserve) { + revert InvalidCurveCuts(); + } + } + _orderConfig.curveCuts = newCurveCuts; + } + } + + function updateFeeConfig(FeeConfig memory newFeeConfig) external override onlyMarket { + _orderConfig.feeConfig = newFeeConfig; + emit UpdateFeeConfig(newFeeConfig); + } + + /// @notice Calculate how many days until expiration + function _daysToMaturity() internal view returns (uint256 daysToMaturity) { + daysToMaturity = (maturity - block.timestamp + Constants.SECONDS_IN_DAY - 1) / Constants.SECONDS_IN_DAY; + } + + /** + * @inheritdoc ITermMaxOrder + */ + function swapExactTokenToToken( + IERC20 tokenIn, + IERC20 tokenOut, + address recipient, + uint128 tokenAmtIn, + uint128 minTokenOut, + uint256 + ) external override nonReentrant isOpen returns (uint256 netTokenOut) { + if (tokenIn == tokenOut) revert CantSwapSameToken(); + uint256 feeAmt = 0; + uint256 ftBlanceBefore = ft.balanceOf(address(this)); + uint256 xtBlanceBefore = xt.balanceOf(address(this)); + + tokenIn.safeTransferFrom(msg.sender, address(this), tokenAmtIn); + if (tokenIn == debtToken) { + tokenIn.safeIncreaseAllowance(address(market), tokenAmtIn); + market.mint(address(this), tokenAmtIn); + } + if (tokenOut == debtToken) { + ITermMaxMarketV2(address(market)).burn(address(this), recipient, minTokenOut); + } else { + tokenOut.safeTransfer(recipient, minTokenOut); + } + + netTokenOut = minTokenOut; + + if (address(_orderConfig.swapTrigger) != address(0)) { + uint256 ftReserve = ft.balanceOf(address(this)); + uint256 xtReserve = xt.balanceOf(address(this)); + int256 deltaFt = ftReserve.toInt256() - ftBlanceBefore.toInt256(); + int256 deltaXt = xtReserve.toInt256() - xtBlanceBefore.toInt256(); + _orderConfig.swapTrigger.afterSwap(ftReserve, xtReserve, deltaFt, deltaXt); + } + emit SwapExactTokenToToken( + tokenIn, tokenOut, msg.sender, recipient, tokenAmtIn, netTokenOut.toUint128(), feeAmt.toUint128() + ); + } + + function swapTokenToExactToken( + IERC20 tokenIn, + IERC20 tokenOut, + address recipient, + uint128 tokenAmtOut, + uint128 maxTokenIn, + uint256 + ) external nonReentrant isOpen returns (uint256 netTokenIn) { + if (tokenIn == tokenOut) revert CantSwapSameToken(); + uint256 feeAmt = 0; + uint256 ftBlanceBefore = ft.balanceOf(address(this)); + uint256 xtBlanceBefore = xt.balanceOf(address(this)); + + tokenIn.safeTransferFrom(msg.sender, address(this), maxTokenIn); + if (tokenIn == debtToken) { + tokenIn.safeIncreaseAllowance(address(market), maxTokenIn); + market.mint(address(this), maxTokenIn); + } + if (tokenOut == debtToken) { + ITermMaxMarketV2(address(market)).burn(address(this), recipient, tokenAmtOut); + } else { + tokenOut.safeTransfer(recipient, tokenAmtOut); + } + netTokenIn = maxTokenIn; + + if (address(_orderConfig.swapTrigger) != address(0)) { + uint256 ftReserve = ft.balanceOf(address(this)); + uint256 xtReserve = xt.balanceOf(address(this)); + int256 deltaFt = ftReserve.toInt256() - ftBlanceBefore.toInt256(); + int256 deltaXt = xtReserve.toInt256() - xtBlanceBefore.toInt256(); + _orderConfig.swapTrigger.afterSwap(ftReserve, xtReserve, deltaFt, deltaXt); + } + emit SwapTokenToExactToken( + tokenIn, tokenOut, msg.sender, recipient, tokenAmtOut, netTokenIn.toUint128(), feeAmt.toUint128() + ); + } + + function withdrawAssets(IERC20 token, address recipient, uint256 amount) external onlyOwner { + if (token == debtToken) { + ITermMaxMarketV2(address(market)).burn(address(this), recipient, amount); + } else { + token.safeTransfer(recipient, amount); + } + emit WithdrawAssets(token, _msgSender(), recipient, amount); + } + + /** + * @inheritdoc ITermMaxOrder + */ + function pause() external override onlyOwner { + _pause(); + } + + /** + * @inheritdoc ITermMaxOrder + */ + function unpause() external override onlyOwner { + _unpause(); + } +} From 85f3ecdf3e504997224eea9bd9f8e36eb5b9cd57 Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 29 May 2025 17:07:55 +0800 Subject: [PATCH 048/194] add tokennomics to v2 folder --- contracts/v2/tokenomics/PreTMX.sol | 84 ++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 contracts/v2/tokenomics/PreTMX.sol diff --git a/contracts/v2/tokenomics/PreTMX.sol b/contracts/v2/tokenomics/PreTMX.sol new file mode 100644 index 0000000..4ef590f --- /dev/null +++ b/contracts/v2/tokenomics/PreTMX.sol @@ -0,0 +1,84 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import {Ownable2Step, Ownable} from "@openzeppelin/contracts/access/Ownable2Step.sol"; + +contract PreTMX is ERC20, Ownable2Step { + bool public transferRestricted; + + mapping(address => bool) public isTransferredFromWhitelisted; + mapping(address => bool) public isTransferredToWhitelisted; + + error TransferFromNotWhitelisted(address from); + error TransferToNotWhitelisted(address to); + + event TransferRestricted(bool restricted); + event TransferFromWhitelisted(address from, bool isWhitelisted); + event TransferToWhitelisted(address to, bool isWhitelisted); + + constructor(address admin) ERC20("Pre TermMax Token", "pTMX") Ownable(admin) { + _mint(admin, 1e9 ether); + _setTransferRestricted(true); + _setTransferFromWhitelisted(admin, true); + _setTransferToWhitelisted(admin, true); + } + + function enableTransfer() external onlyOwner { + _setTransferRestricted(false); + } + + function disableTransfer() external onlyOwner { + _setTransferRestricted(true); + } + + function whitelistTransferFrom(address from, bool isWhitelisted) external onlyOwner { + _setTransferFromWhitelisted(from, isWhitelisted); + } + + function whitelistTransferTo(address to, bool isWhitelisted) external onlyOwner { + _setTransferToWhitelisted(to, isWhitelisted); + } + + function transfer(address to, uint256 amount) public override returns (bool) { + _beforeTokenTransfer(msg.sender, to); + return super.transfer(to, amount); + } + + function transferFrom(address from, address to, uint256 amount) public override returns (bool) { + _beforeTokenTransfer(from, to); + return super.transferFrom(from, to, amount); + } + + function mint(address to, uint256 amount) external onlyOwner { + _mint(to, amount); + } + + function burn(uint256 amount) external { + _burn(msg.sender, amount); + } + + function _beforeTokenTransfer(address from, address to) internal view { + if (transferRestricted && !isTransferredFromWhitelisted[from]) { + revert TransferFromNotWhitelisted(from); + } + if (transferRestricted && !isTransferredToWhitelisted[to]) { + revert TransferToNotWhitelisted(to); + } + } + + function _setTransferRestricted(bool restricted) internal { + transferRestricted = restricted; + emit TransferRestricted(restricted); + } + + function _setTransferFromWhitelisted(address from, bool isWhitelisted) internal { + isTransferredFromWhitelisted[from] = isWhitelisted; + emit TransferFromWhitelisted(from, isWhitelisted); + } + + function _setTransferToWhitelisted(address to, bool isWhitelisted) internal { + isTransferredToWhitelisted[to] = isWhitelisted; + emit TransferToWhitelisted(to, isWhitelisted); + } +} From bf71ea54ed5aa4002109e03494f441766ddecfa8 Mon Sep 17 00:00:00 2001 From: Evan Date: Fri, 30 May 2025 08:12:33 +0800 Subject: [PATCH 049/194] ut utils --- test/v2/AccessManagerV2.t.sol | 658 +++++++++++++++++++++++++++++++++ test/v2/utils/DeployUtils.sol | 314 ++++++++++++++++ test/v2/utils/JSONLoader.sol | 113 ++++++ test/v2/utils/LoanUtils.sol | 81 ++++ test/v2/utils/StateChecker.sol | 51 +++ test/v2/utils/SwapUtils.sol | 26 ++ 6 files changed, 1243 insertions(+) create mode 100644 test/v2/AccessManagerV2.t.sol create mode 100644 test/v2/utils/DeployUtils.sol create mode 100644 test/v2/utils/JSONLoader.sol create mode 100644 test/v2/utils/LoanUtils.sol create mode 100644 test/v2/utils/StateChecker.sol create mode 100644 test/v2/utils/SwapUtils.sol diff --git a/test/v2/AccessManagerV2.t.sol b/test/v2/AccessManagerV2.t.sol new file mode 100644 index 0000000..67ff19d --- /dev/null +++ b/test/v2/AccessManagerV2.t.sol @@ -0,0 +1,658 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "forge-std/Test.sol"; +import {console} from "forge-std/console.sol"; +import {DeployUtils} from "./utils/DeployUtils.sol"; +import {JSONLoader} from "./utils/JSONLoader.sol"; +import {IAccessControl} from "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import {IERC1967} from "@openzeppelin/contracts/interfaces/IERC1967.sol"; +import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; +import {Ownable2StepUpgradeable} from "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; +import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; +import {GearingTokenWithERC20} from "contracts/v1/tokens/GearingTokenWithERC20.sol"; +import {ITermMaxMarket} from "contracts/interfaces/ITermMaxMarket.sol"; +import {MockERC20} from "contracts/v1/test/MockERC20.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {ITermMaxFactory} from "contracts/v1/factory/ITermMaxFactory.sol"; +import {MarketConfig, FeeConfig, MarketInitialParams} from "contracts/v1/storage/TermMaxStorage.sol"; +import {IOwnable, IPausable, AccessManagerV2, AccessManager} from "contracts/v2/access/AccessManagerV2.sol"; +import {ITermMaxRouter, TermMaxRouter} from "contracts/router/TermMaxRouter.sol"; +import {ITermMaxVault, TermMaxVaultV2} from "contracts/v2/vault/TermMaxVaultV2.sol"; +import {Constants} from "contracts/lib/Constants.sol"; +import "contracts/v1/storage/TermMaxStorage.sol"; +import {IOracleV2} from "contracts/v2/oracle/IOracleV2.sol"; + +contract AccessManagerTestV2 is Test { + using JSONLoader for *; + + DeployUtils.Res res; + + OrderConfig orderConfig; + MarketConfig marketConfig; + + address deployer = vm.randomAddress(); + address maker = vm.randomAddress(); + address sender = vm.randomAddress(); + address treasurer = vm.randomAddress(); + string testdata; + AccessManagerV2 manager; + + function setUp() public { + vm.startPrank(deployer); + testdata = vm.readFile(string.concat(vm.projectRoot(), "/test/testdata/testdata.json")); + + uint32 maxLtv = 0.89e8; + uint32 liquidationLtv = 0.9e8; + + marketConfig = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); + orderConfig = JSONLoader.getOrderConfigFromJson(testdata, ".orderConfig"); + + res = DeployUtils.deployMarket(deployer, marketConfig, maxLtv, liquidationLtv); + + res.order = + res.market.createOrder(maker, orderConfig.maxXtReserve, ISwapCallback(address(0)), orderConfig.curveCuts); + + vm.warp(vm.parseUint(vm.parseJsonString(testdata, ".currentTime"))); + + // update oracle + res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.eth")); + res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.dai")); + + uint256 amount = 150e8; + res.debt.mint(deployer, amount); + res.debt.approve(address(res.market), amount); + res.market.mint(deployer, amount); + res.ft.transfer(address(res.order), amount); + res.xt.transfer(address(res.order), amount); + + res.router = DeployUtils.deployRouter(deployer); + + AccessManagerV2 implementation = new AccessManagerV2(); + bytes memory data = abi.encodeCall(AccessManager.initialize, deployer); + address proxy = address(new ERC1967Proxy(address(implementation), data)); + + manager = AccessManagerV2(proxy); + + IOwnable(address(res.factory)).transferOwnership(address(manager)); + IOwnable(address(res.market)).transferOwnership(address(manager)); + IOwnable(address(res.router)).transferOwnership(address(manager)); + IOwnable(address(res.oracle)).transferOwnership(address(manager)); + + manager.acceptOwnership(IOwnable(address(res.factory))); + + manager.acceptOwnership(IOwnable(address(res.market))); + + manager.acceptOwnership(IOwnable(address(res.router))); + + manager.acceptOwnership(IOwnable(address(res.oracle))); + + manager.grantRole(manager.CONFIGURATOR_ROLE(), deployer); + manager.grantRole(manager.PAUSER_ROLE(), deployer); + manager.grantRole(manager.VAULT_ROLE(), deployer); + manager.grantRole(manager.MARKET_ROLE(), deployer); + manager.grantRole(manager.ORACLE_ROLE(), deployer); + + vm.stopPrank(); + } + + function testTransferOwnership() public { + vm.prank(deployer); + manager.transferOwnership(IOwnable(address(res.router)), sender); + vm.prank(sender); + IOwnable(address(res.router)).acceptOwnership(); + assert(res.router.owner() == sender); + } + + function testTransferOwnershipWithoutAuth() public { + vm.prank(sender); + + vm.expectRevert( + abi.encodeWithSelector(IAccessControl.AccessControlUnauthorizedAccount.selector, sender, uint256(0)) + ); + manager.transferOwnership(IOwnable(address(res.router)), sender); + } + + function testRoleManagement() public { + address newUser = vm.randomAddress(); + + // Test granting roles + vm.startPrank(deployer); + manager.grantRole(manager.PAUSER_ROLE(), newUser); + manager.grantRole(manager.CONFIGURATOR_ROLE(), newUser); + manager.grantRole(manager.VAULT_ROLE(), newUser); + + assertTrue(manager.hasRole(manager.PAUSER_ROLE(), newUser)); + assertTrue(manager.hasRole(manager.CONFIGURATOR_ROLE(), newUser)); + assertTrue(manager.hasRole(manager.VAULT_ROLE(), newUser)); + + // Test revoking roles + manager.revokeRole(manager.PAUSER_ROLE(), newUser); + manager.revokeRole(manager.CONFIGURATOR_ROLE(), newUser); + manager.revokeRole(manager.VAULT_ROLE(), newUser); + + assertFalse(manager.hasRole(manager.PAUSER_ROLE(), newUser)); + assertFalse(manager.hasRole(manager.CONFIGURATOR_ROLE(), newUser)); + assertFalse(manager.hasRole(manager.VAULT_ROLE(), newUser)); + + vm.stopPrank(); + } + + function testRevokeRole() public { + bytes32 pauserRole = manager.PAUSER_ROLE(); + address user = vm.randomAddress(); + + // Grant role first + vm.prank(deployer); + manager.grantRole(pauserRole, user); + + // Revoke role + vm.prank(deployer); + manager.revokeRole(pauserRole, user); + + assertFalse(manager.hasRole(pauserRole, user)); + } + + function testCannotRevokeSelfRole() public { + bytes32 pauserRole = manager.PAUSER_ROLE(); + + // Try to revoke own role + vm.prank(deployer); + vm.expectRevert(abi.encodeWithSignature("AccessControlBadConfirmation()")); + manager.revokeRole(pauserRole, deployer); + } + + function testRenounceRole() public { + bytes32 pauserRole = manager.PAUSER_ROLE(); + address user = vm.randomAddress(); + + // Grant role first + vm.prank(deployer); + manager.grantRole(pauserRole, user); + + // Renounce role + vm.prank(user); + manager.renounceRole(pauserRole, user); + + assertFalse(manager.hasRole(pauserRole, user)); + } + + function testCannotRenounceDefaultAdminRole() public { + bytes32 defaultAdminRole = 0x00; + + vm.prank(deployer); + vm.expectRevert(AccessManager.CannotRevokeDefaultAdminRole.selector); + manager.renounceRole(defaultAdminRole, deployer); + } + + function testPausingFunctionality() public { + address pauser = vm.randomAddress(); + bytes32 pauserRole = manager.PAUSER_ROLE(); + // Grant PAUSER_ROLE to the pauser + vm.prank(deployer); + manager.grantRole(pauserRole, pauser); + + // Test pausing with PAUSER_ROLE + vm.startPrank(pauser); + manager.setSwitch(IPausable(address(res.router)), false); + assertTrue(PausableUpgradeable(address(res.router)).paused()); + + // Test unpausing with PAUSER_ROLE + manager.setSwitch(IPausable(address(res.router)), true); + assertFalse(PausableUpgradeable(address(res.router)).paused()); + vm.stopPrank(); + + // Test pausing without PAUSER_ROLE + address nonPauser = vm.randomAddress(); + vm.startPrank(nonPauser); + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, nonPauser, manager.PAUSER_ROLE() + ) + ); + manager.setSwitch(IPausable(address(res.router)), false); + vm.stopPrank(); + } + + function testBatchSetSwitch() public { + // Create vault initialization parameters + VaultInitialParams memory params = VaultInitialParams({ + admin: address(manager), + curator: address(0), // Will be set through AccessManager + timelock: 1 days, + asset: IERC20(address(res.debt)), + maxCapacity: 1000000e18, + name: "Test Vault", + symbol: "tVAULT", + performanceFeeRate: 0.2e8 // 20% + }); + + // Deploy vault + res.vault = DeployUtils.deployVault(params); + + address pauser = vm.randomAddress(); + bytes32 pauserRole = manager.PAUSER_ROLE(); + + // Create multiple pausable test entities + IPausable[] memory entities = new IPausable[](2); + entities[0] = IPausable(address(res.router)); + entities[1] = IPausable(address(res.vault)); + + // Grant PAUSER_ROLE to the pauser + vm.prank(deployer); + manager.grantRole(pauserRole, pauser); + + // Test batch pausing with PAUSER_ROLE + vm.startPrank(pauser); + manager.batchSetSwitch(entities, false); + + // Verify all entities are paused + assertTrue(PausableUpgradeable(address(res.router)).paused()); + assertTrue(PausableUpgradeable(address(res.vault)).paused()); + + // Test batch unpausing with PAUSER_ROLE + manager.batchSetSwitch(entities, true); + + // Verify all entities are unpaused + assertFalse(PausableUpgradeable(address(res.router)).paused()); + assertFalse(PausableUpgradeable(address(res.vault)).paused()); + vm.stopPrank(); + + // Test batch pausing without PAUSER_ROLE + address nonPauser = vm.randomAddress(); + vm.startPrank(nonPauser); + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, nonPauser, manager.PAUSER_ROLE() + ) + ); + manager.batchSetSwitch(entities, false); + vm.stopPrank(); + } + + function testVaultManagement() public { + address vaultManager = vm.randomAddress(); + address newCurator = vm.randomAddress(); + + // Create vault initialization parameters + VaultInitialParams memory params = VaultInitialParams({ + admin: address(manager), + curator: address(0), // Will be set through AccessManager + timelock: 1 days, + asset: IERC20(address(res.debt)), + maxCapacity: 1000000e18, + name: "Test Vault", + symbol: "tVAULT", + performanceFeeRate: 0.2e8 // 20% + }); + + // Deploy vault + ITermMaxVault vault = DeployUtils.deployVault(params); + + // Grant VAULT_ROLE to the vault manager + vm.startPrank(deployer); + manager.grantRole(manager.VAULT_ROLE(), vaultManager); + vm.stopPrank(); + + vm.startPrank(vaultManager); + + // Test setting curator + manager.setCuratorForVault(ITermMaxVault(address(vault)), newCurator); + assertEq(ITermMaxVault(address(vault)).curator(), newCurator); + + vm.stopPrank(); + + // Test without VAULT_ROLE + address nonVaultManager = vm.randomAddress(); + vm.startPrank(nonVaultManager); + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, nonVaultManager, manager.VAULT_ROLE() + ) + ); + manager.setCuratorForVault(ITermMaxVault(address(vault)), newCurator); + vm.stopPrank(); + + // Test that non-vault role cannot set allocator + address allocator = vm.randomAddress(); + vm.startPrank(allocator); + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, allocator, manager.VAULT_ROLE() + ) + ); + manager.setIsAllocatorForVault(ITermMaxVault(address(vault)), allocator, true); + vm.stopPrank(); + + // Test that vault role can set allocator + vm.prank(deployer); + manager.setIsAllocatorForVault(ITermMaxVault(address(vault)), allocator, true); + assertTrue(vault.isAllocator(allocator)); + } + + function testRevokeVaultPendingValues() public { + address vaultManager = vm.randomAddress(); + address newMarket = vm.randomAddress(); + address newGuardian = vm.randomAddress(); + address curator = vm.randomAddress(); + + // Create vault initialization parameters + VaultInitialParams memory params = VaultInitialParams({ + admin: address(manager), + curator: curator, + timelock: 1 days, + asset: IERC20(address(res.debt)), + maxCapacity: 1000000e18, + name: "Test Vault", + symbol: "tVAULT", + performanceFeeRate: 0.2e8 + }); + + // Deploy vault + ITermMaxVault vault = DeployUtils.deployVault(params); + + // Grant VAULT_ROLE to the vault manager and set curator + vm.startPrank(deployer); + manager.grantRole(manager.VAULT_ROLE(), vaultManager); + vm.stopPrank(); + + vm.startPrank(curator); + vault.submitTimelock(2 days); + vault.submitTimelock(1 days); + vault.submitMarket(newMarket, true); + vm.stopPrank(); + + vm.startPrank(vaultManager); + manager.setCuratorForVault(ITermMaxVault(address(vault)), vaultManager); + + // Test revoking pending timelock + manager.revokeVaultPendingTimelock(ITermMaxVault(address(vault))); + assertEq(vault.timelock(), 2 days); // Original timelock + + // Test revoking pending market + manager.revokeVaultPendingMarket(ITermMaxVault(address(vault)), newMarket); + assertTrue(!vault.marketWhitelist(newMarket)); // Market not whitelisted + + // Test revoking pending guardian + manager.submitVaultGuardian(vault, curator); + manager.submitVaultGuardian(vault, newGuardian); + manager.revokeVaultPendingGuardian(ITermMaxVault(address(vault))); + assertEq(vault.guardian(), curator); // Original guardian + + vm.stopPrank(); + + // Test without VAULT_ROLE + address nonVaultManager = vm.randomAddress(); + vm.startPrank(nonVaultManager); + + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, nonVaultManager, manager.VAULT_ROLE() + ) + ); + manager.revokeVaultPendingTimelock(ITermMaxVault(address(vault))); + + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, nonVaultManager, manager.VAULT_ROLE() + ) + ); + manager.revokeVaultPendingMarket(ITermMaxVault(address(vault)), newMarket); + + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, nonVaultManager, manager.VAULT_ROLE() + ) + ); + manager.revokeVaultPendingGuardian(ITermMaxVault(address(vault))); + + vm.stopPrank(); + } + + function testUpgradeSubContract() public { + vm.startPrank(deployer); + + // Deploy a new router implementation + TermMaxRouter routerV2 = new TermMaxRouter(); + + // Test upgrade with DEFAULT_ADMIN_ROLE + manager.upgradeSubContract(UUPSUpgradeable(address(res.router)), address(routerV2), ""); + + // Test upgrade without DEFAULT_ADMIN_ROLE + address nonAdmin = vm.randomAddress(); + vm.stopPrank(); + + vm.startPrank(nonAdmin); + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, nonAdmin, manager.DEFAULT_ADMIN_ROLE() + ) + ); + manager.upgradeSubContract(UUPSUpgradeable(address(res.router)), address(routerV2), ""); + vm.stopPrank(); + } + + function testSetGtImplement() public { + address newImplement = vm.randomAddress(); + string memory gtImplementName = "TestGT"; + + // Test that non-market role cannot set GT implement + vm.startPrank(sender); + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, sender, manager.MARKET_ROLE() + ) + ); + manager.setGtImplement(ITermMaxFactory(address(res.factory)), gtImplementName, newImplement); + vm.stopPrank(); + + // Test that market role can set GT implement + vm.startPrank(deployer); + manager.setGtImplement(ITermMaxFactory(address(res.factory)), gtImplementName, newImplement); + assertEq(res.factory.gtImplements(keccak256(abi.encodePacked(gtImplementName))), newImplement); + vm.stopPrank(); + } + + function testCreateMarket() public { + bytes32 gtKey = keccak256("TestGT"); + MarketInitialParams memory params = MarketInitialParams({ + collateral: address(res.collateral), + debtToken: IERC20Metadata(address(res.debt)), + admin: address(manager), + gtImplementation: address(0), + marketConfig: marketConfig, + loanConfig: LoanConfig({oracle: IOracle(address(0)), liquidatable: true, liquidationLtv: 0.9e8, maxLtv: 0.85e8}), + gtInitalParams: abi.encode(1e18), + tokenName: "Test Market", + tokenSymbol: "Test" + }); + uint256 salt = 123; + + // Test that non-market role cannot create market + vm.startPrank(sender); + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, sender, manager.MARKET_ROLE() + ) + ); + manager.createMarket(ITermMaxFactory(address(res.factory)), gtKey, params, salt); + vm.stopPrank(); + + // Test that market role can create market + vm.startPrank(deployer); + address newMarket = manager.createMarket( + ITermMaxFactory(address(res.factory)), keccak256("GearingTokenWithERC20"), params, salt + ); + assertTrue(newMarket != address(0)); + vm.stopPrank(); + } + + function testSetAdapterWhitelist() public { + address adapter = vm.randomAddress(); + + // Test that non-market role cannot set adapter whitelist + vm.startPrank(sender); + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, sender, manager.MARKET_ROLE() + ) + ); + manager.setAdapterWhitelist(ITermMaxRouter(address(res.router)), adapter, true); + vm.stopPrank(); + + // Test that market role can set adapter whitelist + vm.startPrank(deployer); + manager.setAdapterWhitelist(ITermMaxRouter(address(res.router)), adapter, true); + assertTrue(res.router.adapterWhitelist(adapter)); + + // Test setting adapter whitelist to false + manager.setAdapterWhitelist(ITermMaxRouter(address(res.router)), adapter, false); + assertFalse(res.router.adapterWhitelist(adapter)); + vm.stopPrank(); + } + + function testSubmitAndAcceptPendingOracle() public { + address asset = address(res.collateral); + IOracle.Oracle memory oracle = IOracle.Oracle({ + aggregator: AggregatorV3Interface(address(new MockPriceFeed(sender))), + backupAggregator: AggregatorV3Interface(address(new MockPriceFeed(sender))), + heartbeat: 3600, + backupHeartbeat: 7200, + maxPrice: 1e8 + }); + + // Test that non-oracle role cannot submit pending oracle + vm.startPrank(sender); + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, sender, manager.ORACLE_ROLE() + ) + ); + manager.submitPendingOracle(IOracle(address(res.oracle)), asset, oracle); + vm.stopPrank(); + + // Test that oracle role can submit pending oracle + vm.startPrank(deployer); + manager.submitPendingOracle(IOracle(address(res.oracle)), asset, oracle); + + // Test that non-oracle role cannot accept pending oracle + vm.stopPrank(); + vm.startPrank(sender); + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, sender, manager.ORACLE_ROLE() + ) + ); + manager.acceptPendingOracle(IOracle(address(res.oracle)), asset); + vm.stopPrank(); + + // Test that oracle role can accept pending oracle + vm.startPrank(deployer); + manager.acceptPendingOracle(IOracle(address(res.oracle)), asset); + vm.stopPrank(); + } + + function testRevokePendingOracle() public { + address asset = address(res.collateral); + IOracle.Oracle memory oracle = IOracle.Oracle({ + aggregator: AggregatorV3Interface(address(new MockPriceFeed(sender))), + backupAggregator: AggregatorV3Interface(address(new MockPriceFeed(sender))), + heartbeat: 3600, + backupHeartbeat: 7200, + maxPrice: 1e8 + }); + + // Submit a pending oracle + vm.startPrank(deployer); + manager.submitPendingOracle(IOracle(address(res.oracle)), asset, oracle); + vm.stopPrank(); + + // Test that non-oracle role cannot revoke pending oracle + vm.startPrank(sender); + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, sender, manager.ORACLE_ROLE() + ) + ); + manager.revokePendingOracle(IOracleV2(address(res.oracle)), asset); + vm.stopPrank(); + + // Test that oracle role can revoke pending oracle + vm.startPrank(deployer); + + // We'll capture the event to verify that revocation happened + vm.expectEmit(true, true, true, true); + // Define the expected event + emit RevokePendingOracle(asset); + + // Call the revoke function + manager.revokePendingOracle(IOracleV2(address(res.oracle)), asset); + + // Try to accept the oracle after revocation, which should fail + // since there's no longer a pending oracle + vm.expectRevert(); // Should revert with NoPendingValue error + IOracle(address(res.oracle)).acceptPendingOracle(asset); + + vm.stopPrank(); + } + + // Define the event to match OracleAggregator's event + event RevokePendingOracle(address indexed asset); + + function testUpdateGtConfig() public { + bytes memory configData = abi.encode(1234); + + // Test that non-configurator role cannot update GT config + vm.startPrank(sender); + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, sender, manager.CONFIGURATOR_ROLE() + ) + ); + manager.updateGtConfig(ITermMaxMarket(address(res.market)), configData); + vm.stopPrank(); + + // Test that configurator role can update GT config + vm.startPrank(deployer); + manager.updateGtConfig(ITermMaxMarket(address(res.market)), configData); + vm.stopPrank(); + } + + function testUpdateOrderFeeRate() public { + // Get new fee config from testdata + FeeConfig memory newFeeConfig = res.order.orderConfig().feeConfig; + + // Test that non-admin cannot update fee rate + vm.startPrank(sender); + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, sender, manager.CONFIGURATOR_ROLE() + ) + ); + manager.updateOrderFeeRate(res.market, res.order, newFeeConfig); + vm.stopPrank(); + // Test that admin can update fee rate + vm.prank(deployer); + manager.updateOrderFeeRate(res.market, res.order, newFeeConfig); + + // Verify fee config was updated + OrderConfig memory updatedConfig = res.order.orderConfig(); + assertEq(updatedConfig.feeConfig.lendTakerFeeRatio, newFeeConfig.lendTakerFeeRatio); + assertEq(updatedConfig.feeConfig.borrowTakerFeeRatio, newFeeConfig.borrowTakerFeeRatio); + } + + function testUpdateMarketConfig() public { + // Get new market config from testdata + MarketConfig memory newMarketConfig = marketConfig; + newMarketConfig.treasurer = address(0x123); + // Test that configurator role can update market config + vm.prank(deployer); + manager.updateMarketConfig(res.market, newMarketConfig); + + // Verify market config was updated + MarketConfig memory updatedConfig = res.market.config(); + assertEq(updatedConfig.treasurer, newMarketConfig.treasurer); + } +} diff --git a/test/v2/utils/DeployUtils.sol b/test/v2/utils/DeployUtils.sol new file mode 100644 index 0000000..ffdbfb4 --- /dev/null +++ b/test/v2/utils/DeployUtils.sol @@ -0,0 +1,314 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {console} from "forge-std/Script.sol"; +import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +import {ITermMaxMarket, TermMaxMarket} from "contracts/TermMaxMarket.sol"; +import {ITermMaxOrder, ISwapCallback, TermMaxOrder} from "contracts/TermMaxOrder.sol"; +import {MockERC20, ERC20} from "contracts/test/MockERC20.sol"; +import {MockPriceFeed} from "contracts/test/MockPriceFeed.sol"; +import {IMintableERC20, MintableERC20} from "contracts/tokens/MintableERC20.sol"; +import {IGearingToken} from "contracts/tokens/IGearingToken.sol"; +import {ITermMaxFactory, TermMaxFactory} from "contracts/factory/TermMaxFactory.sol"; +import {TermMaxRouter} from "contracts/router/TermMaxRouter.sol"; +import {IOracle, OracleAggregator, AggregatorV3Interface} from "contracts/oracle/OracleAggregator.sol"; +import {MockOrder} from "contracts/test/MockOrder.sol"; +import {VaultFactory, IVaultFactory} from "contracts/factory/VaultFactory.sol"; +import {OrderManager} from "contracts/vault/OrderManager.sol"; +import {TermMaxVault, ITermMaxVault} from "contracts/vault/TermMaxVault.sol"; +import {AccessManager} from "contracts/access/AccessManager.sol"; +import "contracts/storage/TermMaxStorage.sol"; + +library DeployUtils { + bytes32 constant GT_ERC20 = keccak256("GearingTokenWithERC20"); + + struct SwapRange { + uint256 buyFtMax; + uint256 buyXtMax; + uint256 sellFtMax; + uint256 sellXtMax; + uint256 buyExactFtMax; + uint256 buyExactXtMax; + uint256 sellFtForExactTokenMax; + uint256 sellXtForExactTokenMax; + } + + struct Res { + ITermMaxVault vault; + IVaultFactory vaultFactory; + TermMaxFactory factory; + ITermMaxOrder order; + TermMaxRouter router; + MarketConfig marketConfig; + OrderConfig orderConfig; + ITermMaxMarket market; + IMintableERC20 ft; + IMintableERC20 xt; + IGearingToken gt; + MockPriceFeed debtOracle; + MockPriceFeed collateralOracle; + OracleAggregator oracle; + MockERC20 collateral; + MockERC20 debt; + SwapRange swapRange; + } + + function deployMarket(address admin, MarketConfig memory marketConfig, uint32 maxLtv, uint32 liquidationLtv) + internal + returns (Res memory res) + { + res.factory = deployFactory(admin); + + res.collateral = new MockERC20("ETH", "ETH", 18); + res.debt = new MockERC20("DAI", "DAI", 8); + + res.debtOracle = new MockPriceFeed(admin); + res.collateralOracle = new MockPriceFeed(admin); + res.oracle = deployOracle(admin, 0); + + res.oracle.submitPendingOracle( + address(res.debt), IOracle.Oracle(res.debtOracle, res.debtOracle, 0, 365 days, 0) + ); + res.oracle.submitPendingOracle( + address(res.collateral), IOracle.Oracle(res.collateralOracle, res.collateralOracle, 0, 365 days, 0) + ); + + res.oracle.acceptPendingOracle(address(res.debt)); + res.oracle.acceptPendingOracle(address(res.collateral)); + + MockPriceFeed.RoundData memory roundData = MockPriceFeed.RoundData({ + roundId: 1, + answer: int256(1e1 ** res.collateralOracle.decimals()), + startedAt: 0, + updatedAt: 0, + answeredInRound: 0 + }); + res.collateralOracle.updateRoundData(roundData); + + MarketInitialParams memory initialParams = MarketInitialParams({ + collateral: address(res.collateral), + debtToken: res.debt, + admin: admin, + gtImplementation: address(0), + marketConfig: marketConfig, + loanConfig: LoanConfig({oracle: res.oracle, liquidationLtv: liquidationLtv, maxLtv: maxLtv, liquidatable: true}), + gtInitalParams: abi.encode(type(uint256).max), + tokenName: "DAI-ETH", + tokenSymbol: "DAI-ETH" + }); + + res.marketConfig = marketConfig; + res.market = ITermMaxMarket(res.factory.createMarket(GT_ERC20, initialParams, 0)); + + (res.ft, res.xt, res.gt,,) = res.market.tokens(); + } + + function deployMarket( + address admin, + MarketConfig memory marketConfig, + uint32 maxLtv, + uint32 liquidationLtv, + address collateral, + address debt + ) internal returns (Res memory res) { + res.factory = deployFactory(admin); + + res.collateral = MockERC20(collateral); + res.debt = MockERC20(debt); + + res.debtOracle = new MockPriceFeed(admin); + res.collateralOracle = new MockPriceFeed(admin); + res.oracle = deployOracle(admin, 0); + + res.oracle.submitPendingOracle( + address(res.debt), IOracle.Oracle(res.debtOracle, res.debtOracle, 0, 365 days, 0) + ); + res.oracle.submitPendingOracle( + address(res.collateral), IOracle.Oracle(res.collateralOracle, res.collateralOracle, 0, 365 days, 0) + ); + res.oracle.acceptPendingOracle(address(res.debt)); + res.oracle.acceptPendingOracle(address(res.collateral)); + + MockPriceFeed.RoundData memory roundData = MockPriceFeed.RoundData({ + roundId: 1, + answer: int256(1e1 ** res.collateralOracle.decimals()), + startedAt: 0, + updatedAt: 0, + answeredInRound: 0 + }); + res.collateralOracle.updateRoundData(roundData); + + MarketInitialParams memory initialParams = MarketInitialParams({ + collateral: address(res.collateral), + debtToken: res.debt, + admin: admin, + gtImplementation: address(0), + marketConfig: marketConfig, + loanConfig: LoanConfig({oracle: res.oracle, liquidationLtv: liquidationLtv, maxLtv: maxLtv, liquidatable: true}), + gtInitalParams: abi.encode(type(uint256).max), + tokenName: "DAI-ETH", + tokenSymbol: "DAI-ETH" + }); + + res.marketConfig = marketConfig; + res.market = ITermMaxMarket(res.factory.createMarket(GT_ERC20, initialParams, 0)); + + (res.ft, res.xt, res.gt,,) = res.market.tokens(); + } + + function deployMockMarket2( + address admin, + IERC20 debt, + uint256 duration, + MarketConfig memory mc, + uint32 maxLtv, + uint32 liquidationLtv + ) internal returns (Res memory res) { + res.factory = deployFactoryWithMockOrder(admin); + res.debt = MockERC20(address(debt)); + MarketConfig memory marketConfig = mc; + marketConfig.maturity += uint64(duration * 1 days); + + res.collateral = new MockERC20("ETH", "ETH", 18); + + res.debtOracle = new MockPriceFeed(admin); + res.collateralOracle = new MockPriceFeed(admin); + res.oracle = deployOracle(admin, 0); + + res.oracle.submitPendingOracle( + address(res.debt), IOracle.Oracle(res.debtOracle, res.debtOracle, 0, 365 days, 0) + ); + res.oracle.submitPendingOracle( + address(res.collateral), IOracle.Oracle(res.collateralOracle, res.collateralOracle, 0, 365 days, 0) + ); + res.oracle.acceptPendingOracle(address(res.debt)); + res.oracle.acceptPendingOracle(address(res.collateral)); + + MockPriceFeed.RoundData memory roundData = MockPriceFeed.RoundData({ + roundId: 1, + answer: int256(1e1 ** res.collateralOracle.decimals()), + startedAt: 0, + updatedAt: 0, + answeredInRound: 0 + }); + res.collateralOracle.updateRoundData(roundData); + + MarketInitialParams memory initialParams = MarketInitialParams({ + collateral: address(res.collateral), + debtToken: res.debt, + admin: admin, + gtImplementation: address(0), + marketConfig: marketConfig, + loanConfig: LoanConfig({oracle: res.oracle, liquidationLtv: liquidationLtv, maxLtv: maxLtv, liquidatable: true}), + gtInitalParams: abi.encode(type(uint256).max), + tokenName: "DAI-ETH", + tokenSymbol: "DAI-ETH" + }); + + res.marketConfig = marketConfig; + res.market = ITermMaxMarket(res.factory.createMarket(GT_ERC20, initialParams, 0)); + + (res.ft, res.xt, res.gt,,) = res.market.tokens(); + } + + function deployMockMarket(address admin, MarketConfig memory marketConfig, uint32 maxLtv, uint32 liquidationLtv) + internal + returns (Res memory res) + { + res.factory = deployFactoryWithMockOrder(admin); + + res.collateral = new MockERC20("ETH", "ETH", 18); + res.debt = new MockERC20("DAI", "DAI", 8); + + res.debtOracle = new MockPriceFeed(admin); + res.collateralOracle = new MockPriceFeed(admin); + res.oracle = deployOracle(admin, 0); + + res.oracle.submitPendingOracle( + address(res.debt), IOracle.Oracle(res.debtOracle, res.debtOracle, 0, 365 days, 0) + ); + res.oracle.submitPendingOracle( + address(res.collateral), IOracle.Oracle(res.collateralOracle, res.collateralOracle, 0, 365 days, 0) + ); + res.oracle.acceptPendingOracle(address(res.debt)); + res.oracle.acceptPendingOracle(address(res.collateral)); + + MockPriceFeed.RoundData memory roundData = MockPriceFeed.RoundData({ + roundId: 1, + answer: int256(1e1 ** res.collateralOracle.decimals()), + startedAt: 0, + updatedAt: 0, + answeredInRound: 0 + }); + res.collateralOracle.updateRoundData(roundData); + + MarketInitialParams memory initialParams = MarketInitialParams({ + collateral: address(res.collateral), + debtToken: res.debt, + admin: admin, + gtImplementation: address(0), + marketConfig: marketConfig, + loanConfig: LoanConfig({oracle: res.oracle, liquidationLtv: liquidationLtv, maxLtv: maxLtv, liquidatable: true}), + gtInitalParams: abi.encode(type(uint256).max), + tokenName: "DAI-ETH", + tokenSymbol: "DAI-ETH" + }); + + res.marketConfig = marketConfig; + res.market = ITermMaxMarket(res.factory.createMarket(GT_ERC20, initialParams, 0)); + + (res.ft, res.xt, res.gt,,) = res.market.tokens(); + } + + function deployOrder( + ITermMaxMarket market, + address maker, + uint256 maxXtReserve, + ISwapCallback swapTrigger, + CurveCuts memory curveCuts + ) public returns (ITermMaxOrder order) { + order = market.createOrder(maker, maxXtReserve, swapTrigger, curveCuts); + } + + function deployFactory(address admin) public returns (TermMaxFactory factory) { + address tokenImplementation = address(new MintableERC20()); + address orderImplementation = address(new TermMaxOrder()); + TermMaxMarket m = new TermMaxMarket(tokenImplementation, orderImplementation); + factory = new TermMaxFactory(admin, address(m)); + } + + function deployFactoryWithMockOrder(address admin) public returns (TermMaxFactory factory) { + address tokenImplementation = address(new MintableERC20()); + address orderImplementation = address(new MockOrder()); + TermMaxMarket m = new TermMaxMarket(tokenImplementation, orderImplementation); + factory = new TermMaxFactory(admin, address(m)); + } + + function deployOracle(address admin, uint256 timeLock) public returns (OracleAggregator oracle) { + oracle = new OracleAggregator(admin, timeLock); + } + + function deployRouter(address admin) public returns (TermMaxRouter router) { + TermMaxRouter implementation = new TermMaxRouter(); + bytes memory data = abi.encodeCall(TermMaxRouter.initialize, admin); + ERC1967Proxy proxy = new ERC1967Proxy(address(implementation), data); + router = TermMaxRouter(address(proxy)); + } + + function deployVault(VaultInitialParams memory initialParams) public returns (ITermMaxVault vault) { + OrderManager orderManager = new OrderManager(); + TermMaxVault implementation = new TermMaxVault(address(orderManager)); + VaultFactory vaultFactory = new VaultFactory(address(implementation)); + + vault = ITermMaxVault(vaultFactory.createVault(initialParams, 0)); + } + + function deployAccessManager(address admin) internal returns (AccessManager accessManager) { + AccessManager implementation = new AccessManager(); + bytes memory data = abi.encodeCall(AccessManager.initialize, admin); + ERC1967Proxy proxy = new ERC1967Proxy(address(implementation), data); + accessManager = AccessManager(address(proxy)); + } +} diff --git a/test/v2/utils/JSONLoader.sol b/test/v2/utils/JSONLoader.sol new file mode 100644 index 0000000..8692ca5 --- /dev/null +++ b/test/v2/utils/JSONLoader.sol @@ -0,0 +1,113 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "forge-std/Test.sol"; +import {StateChecker} from "./StateChecker.sol"; +import "contracts/v1/storage/TermMaxStorage.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {DeployUtils} from "./DeployUtils.sol"; + +library JSONLoader { + Vm constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); + + function getOrderStateFromJson(string memory testdataJSON, string memory key) + internal + pure + returns (StateChecker.OrderState memory state) + { + state.ftReserve = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".ftReserve"))); + state.xtReserve = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".xtReserve"))); + } + + function getMarketConfigFromJson(address treasurer, string memory testdataJSON, string memory key) + internal + pure + returns (MarketConfig memory marketConfig) + { + marketConfig.treasurer = treasurer; + marketConfig.maturity = uint64(vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".maturity")))); + marketConfig.feeConfig.mintGtFeeRatio = + uint32(vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".mintGtFeeRatio")))); + marketConfig.feeConfig.mintGtFeeRef = + uint32(vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".mintGtFeeRef")))); + marketConfig.feeConfig.lendTakerFeeRatio = + uint32(vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".lendTakerFeeRatio")))); + marketConfig.feeConfig.borrowTakerFeeRatio = + uint32(vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".borrowTakerFeeRatio")))); + marketConfig.feeConfig.lendMakerFeeRatio = + uint32(vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".lendMakerFeeRatio")))); + marketConfig.feeConfig.borrowMakerFeeRatio = + uint32(vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".borrowMakerFeeRatio")))); + } + + function getOrderConfigFromJson(string memory testdataJSON, string memory key) + internal + pure + returns (OrderConfig memory orderConfig) + { + orderConfig.maxXtReserve = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".maxXtReserve"))); + orderConfig.gtId = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".gtId"))); + + { + string memory curveCutsPath = string.concat(key, ".borrowCurveCuts"); + uint256 length = + vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".borrowCurveCuts.length"))); + orderConfig.curveCuts.borrowCurveCuts = new CurveCut[](length); + + for (uint256 i = 0; i < length; i++) { + string memory indexPath = string.concat(curveCutsPath, ".", vm.toString(i)); + orderConfig.curveCuts.borrowCurveCuts[i].xtReserve = + vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(indexPath, ".xtReserve"))); + orderConfig.curveCuts.borrowCurveCuts[i].liqSquare = + vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(indexPath, ".liqSquare"))); + orderConfig.curveCuts.borrowCurveCuts[i].offset = + vm.parseInt(vm.parseJsonString(testdataJSON, string.concat(indexPath, ".offset"))); + } + } + { + string memory curveCutsPath = string.concat(key, ".lendCurveCuts"); + uint256 length = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".lendCurveCuts.length"))); + orderConfig.curveCuts.lendCurveCuts = new CurveCut[](length); + + for (uint256 i = 0; i < length; i++) { + string memory indexPath = string.concat(curveCutsPath, ".", vm.toString(i)); + orderConfig.curveCuts.lendCurveCuts[i].xtReserve = + vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(indexPath, ".xtReserve"))); + orderConfig.curveCuts.lendCurveCuts[i].liqSquare = + vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(indexPath, ".liqSquare"))); + orderConfig.curveCuts.lendCurveCuts[i].offset = + vm.parseInt(vm.parseJsonString(testdataJSON, string.concat(indexPath, ".offset"))); + } + } + } + + function getSwapRangeFromJson(string memory testdataJSON, string memory key) + internal + pure + returns (DeployUtils.SwapRange memory swapRange) + { + swapRange.buyFtMax = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".buyFtMax"))); + swapRange.buyXtMax = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".buyXtMax"))); + swapRange.sellFtMax = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".sellFtMax"))); + swapRange.sellXtMax = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".sellXtMax"))); + swapRange.buyExactFtMax = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".buyExactFtMax"))); + swapRange.buyExactXtMax = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".buyExactXtMax"))); + swapRange.sellFtForExactTokenMax = + vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".sellFtForExactTokenMax"))); + swapRange.sellXtForExactTokenMax = + vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".sellXtForExactTokenMax"))); + } + + function getRoundDataFromJson(string memory testdataJSON, string memory key) + internal + pure + returns (MockPriceFeed.RoundData memory priceData) + { + priceData.roundId = uint80(vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".roundId")))); + priceData.answer = vm.parseInt(vm.parseJsonString(testdataJSON, string.concat(key, ".answer"))); + priceData.startedAt = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".startedAt"))); + priceData.updatedAt = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".updatedAt"))); + priceData.answeredInRound = + uint80(vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".answeredInRound")))); + } +} diff --git a/test/v2/utils/LoanUtils.sol b/test/v2/utils/LoanUtils.sol new file mode 100644 index 0000000..f7578c4 --- /dev/null +++ b/test/v2/utils/LoanUtils.sol @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {console} from "forge-std/Script.sol"; +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; +import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import {Constants} from "contracts/lib/Constants.sol"; +import {DeployUtils} from "./DeployUtils.sol"; + +library LoanUtils { + using SafeCast for uint256; + using SafeCast for int256; + + function calcLtv(DeployUtils.Res memory res, uint256 debtAmt, uint256 collateralAmt) + internal + view + returns (uint256 ltv) + { + (, int256 cPrice,,,) = res.collateralOracle.latestRoundData(); + (, int256 uPrice,,,) = res.debtOracle.latestRoundData(); + uint256 cpDecimals = 10 ** res.collateralOracle.decimals(); + uint256 upDecimals = 10 ** res.debtOracle.decimals(); + uint256 cDecimals = 10 ** res.collateral.decimals(); + uint256 uDecimals = 10 ** res.debt.decimals(); + uint256 debtValue = (debtAmt * uPrice.toUint256()) / uDecimals; + uint256 collateralValue = (collateralAmt * cPrice.toUint256()) / (cpDecimals * cDecimals); + if (collateralValue == 0) { + return 2 ** 128 - 1; + } + ltv = (debtValue * Constants.DECIMAL_BASE) / (collateralValue * upDecimals); + } + + function calcLiquidationResult(DeployUtils.Res memory res, uint256 debtAmt, uint256 collateralAmt, uint256 repayAmt) + internal + view + returns (uint256 cToLiquidator, uint256 cToTreasurer, uint256 remainningC) + { + uint256 REWARD_TO_LIQUIDATOR = 0.05e8; + uint256 REWARD_TO_PROTOCOL = 0.05e8; + (, int256 cPrice,,,) = res.collateralOracle.latestRoundData(); + (, int256 uPrice,,,) = res.debtOracle.latestRoundData(); + uint256 cpDecimals = 10 ** res.collateralOracle.decimals(); + uint256 upDecimals = 10 ** res.debtOracle.decimals(); + uint256 cDecimals = 10 ** res.collateral.decimals(); + uint256 uDecimals = 10 ** res.debt.decimals(); + + uint256 udPriceToCdPrice = + (uPrice.toUint256() * cpDecimals * cpDecimals * 10 + cPrice.toUint256() - 1) / (cPrice.toUint256()); + + uint256 cEqualRepayAmt = (repayAmt * udPriceToCdPrice * cDecimals) / (uDecimals * cpDecimals * upDecimals * 10); + + uint256 rewardToLiquidator = (cEqualRepayAmt * REWARD_TO_LIQUIDATOR) / Constants.DECIMAL_BASE; + uint256 rewardToProtocol = (cEqualRepayAmt * REWARD_TO_PROTOCOL) / Constants.DECIMAL_BASE; + + uint256 removedCollateralAmt = cEqualRepayAmt + rewardToLiquidator + rewardToProtocol; + if (removedCollateralAmt > (collateralAmt * repayAmt) / debtAmt) { + removedCollateralAmt = (collateralAmt * repayAmt) / debtAmt; + } + if (cEqualRepayAmt + rewardToLiquidator >= removedCollateralAmt) { + cToLiquidator = removedCollateralAmt; + } else if (cEqualRepayAmt + rewardToLiquidator + rewardToProtocol >= removedCollateralAmt) { + cToLiquidator = cEqualRepayAmt + rewardToLiquidator; + cToTreasurer = removedCollateralAmt - cToLiquidator; + } else { + cToLiquidator = cEqualRepayAmt + rewardToLiquidator; + cToTreasurer = rewardToProtocol; + } + remainningC = collateralAmt - removedCollateralAmt; + } + + function fastMintGt(DeployUtils.Res memory res, address to, uint128 debtAmt, uint256 collateralAmt) + internal + returns (uint256 gtId, uint128 ftOutAmt) + { + res.collateral.mint(to, collateralAmt); + res.collateral.approve(address(res.gt), collateralAmt); + bytes memory collateralData = abi.encode(collateralAmt); + + (gtId, ftOutAmt) = res.market.issueFt(to, debtAmt, collateralData); + } +} diff --git a/test/v2/utils/StateChecker.sol b/test/v2/utils/StateChecker.sol new file mode 100644 index 0000000..df21156 --- /dev/null +++ b/test/v2/utils/StateChecker.sol @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {console} from "forge-std/console.sol"; +import {DeployUtils} from "./DeployUtils.sol"; +import "contracts/storage/TermMaxStorage.sol"; + +library StateChecker { + struct MarketState { + uint256 collateralReserve; + uint256 debtReserve; + } + + struct OrderState { + uint256 ftReserve; + uint256 xtReserve; + } + + function checkMarketState(DeployUtils.Res memory res, MarketState memory expect) internal view { + require(res.collateral.balanceOf(address(res.gt)) == expect.collateralReserve, "collateralReserve unexpect"); + require(res.debt.balanceOf(address(res.market)) == expect.debtReserve, "debtReserve unexpect"); + } + + function getMarketState(DeployUtils.Res memory res) internal view returns (MarketState memory state) { + state.collateralReserve = res.collateral.balanceOf(address(res.gt)); + state.debtReserve = res.debt.balanceOf(address(res.market)); + } + + function checkOrderState(DeployUtils.Res memory res, OrderState memory expect) internal view { + address order = address(res.order); + require(res.ft.balanceOf(order) == expect.ftReserve, "ftReserve unexpect"); + require(res.xt.balanceOf(order) == expect.xtReserve, "xtReserve unexpect"); + } + + function getOrderState(DeployUtils.Res memory res) internal view returns (OrderState memory state) { + address order = address(res.order); + state.ftReserve = res.ft.balanceOf(order); + state.xtReserve = res.xt.balanceOf(order); + } + + function getUserBalances(DeployUtils.Res memory res, address user) + internal + view + returns (uint256[6] memory balances) + { + balances[0] = res.ft.balanceOf(user); + balances[1] = res.xt.balanceOf(user); + balances[2] = res.debt.balanceOf(user); + balances[3] = res.collateral.balanceOf(user); + } +} diff --git a/test/v2/utils/SwapUtils.sol b/test/v2/utils/SwapUtils.sol new file mode 100644 index 0000000..54a2a6b --- /dev/null +++ b/test/v2/utils/SwapUtils.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {console} from "forge-std/Script.sol"; +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; +import {Constants} from "contracts/lib/Constants.sol"; +import {DeployUtils} from "./DeployUtils.sol"; + +library SwapUtils { + using SafeCast for uint256; + using SafeCast for int256; + + function getPrice(DeployUtils.Res memory res) internal view returns (uint256 pFt, uint256 pXt) { + (uint256 lendApr_, uint256 borrowApr_) = res.order.apr(); + + uint256 dtm = daysToMaturity(res.market.config().maturity); + pFt = Constants.DECIMAL_BASE_SQ / (Constants.DECIMAL_BASE + (lendApr_ * dtm) / Constants.DAYS_IN_YEAR); + uint256 pFtBorrow = + Constants.DECIMAL_BASE_SQ / (Constants.DECIMAL_BASE + (borrowApr_ * dtm) / Constants.DAYS_IN_YEAR); + pXt = Constants.DECIMAL_BASE - pFtBorrow / Constants.DECIMAL_BASE; + } + + function daysToMaturity(uint256 maturity) internal view returns (uint256) { + return (maturity - block.timestamp + Constants.SECONDS_IN_DAY - 1) / Constants.SECONDS_IN_DAY; + } +} From af281090a197961f24db2a9641c258680984456b Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 2 Jun 2025 15:02:09 +0800 Subject: [PATCH 050/194] fix version --- contracts/v1/access/AccessManager.sol | 14 +-- contracts/v1/events/FactoryEvents.sol | 2 +- contracts/v1/factory/IVaultFactory.sol | 2 +- contracts/v1/factory/VaultFactory.sol | 8 +- contracts/v2/TermMaxOrderV2.sol | 4 +- contracts/v2/access/AccessManagerV2.sol | 15 ++- contracts/v2/router/TermMaxRouterV2.sol | 4 +- test/v2/AccessManagerV2.t.sol | 19 ++-- test/v2/utils/DeployUtils.sol | 121 +++++++++++++++--------- test/v2/utils/StateChecker.sol | 2 +- 10 files changed, 114 insertions(+), 77 deletions(-) diff --git a/contracts/v1/access/AccessManager.sol b/contracts/v1/access/AccessManager.sol index 33a115c..27e59ef 100644 --- a/contracts/v1/access/AccessManager.sol +++ b/contracts/v1/access/AccessManager.sol @@ -3,13 +3,13 @@ pragma solidity ^0.8.27; import {AccessControlUpgradeable} from "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; -import {ITermMaxMarket} from "contracts/ITermMaxMarket.sol"; -import {ITermMaxFactory} from "contracts/factory/ITermMaxFactory.sol"; -import {ITermMaxRouter} from "contracts/router/ITermMaxRouter.sol"; -import {ITermMaxOrder} from "contracts/ITermMaxOrder.sol"; -import {IOracle} from "contracts/oracle/IOracle.sol"; -import {ITermMaxVault} from "contracts/vault/ITermMaxVault.sol"; -import {MarketConfig, FeeConfig, MarketInitialParams} from "contracts/storage/TermMaxStorage.sol"; +import {ITermMaxMarket} from "../ITermMaxMarket.sol"; +import {ITermMaxFactory} from "../factory/ITermMaxFactory.sol"; +import {ITermMaxRouter} from "../router/ITermMaxRouter.sol"; +import {ITermMaxOrder} from "../ITermMaxOrder.sol"; +import {IOracle} from "../oracle/IOracle.sol"; +import {ITermMaxVault} from "../vault/ITermMaxVault.sol"; +import {MarketConfig, FeeConfig, MarketInitialParams} from "../storage/TermMaxStorage.sol"; interface IOwnable { function transferOwnership(address newOwner) external; diff --git a/contracts/v1/events/FactoryEvents.sol b/contracts/v1/events/FactoryEvents.sol index 33dc3d2..ae55d9d 100644 --- a/contracts/v1/events/FactoryEvents.sol +++ b/contracts/v1/events/FactoryEvents.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.0; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {VaultInitialParams} from "contracts/storage/TermMaxStorage.sol"; +import {VaultInitialParams} from "../storage/TermMaxStorage.sol"; /** * @title Factory Events Interface diff --git a/contracts/v1/factory/IVaultFactory.sol b/contracts/v1/factory/IVaultFactory.sol index d471035..5220a69 100644 --- a/contracts/v1/factory/IVaultFactory.sol +++ b/contracts/v1/factory/IVaultFactory.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {VaultInitialParams} from "contracts/storage/TermMaxStorage.sol"; +import {VaultInitialParams} from "../storage/TermMaxStorage.sol"; /** * @title TermMax Vault Factory Interface diff --git a/contracts/v1/factory/VaultFactory.sol b/contracts/v1/factory/VaultFactory.sol index cfb376d..51e018f 100644 --- a/contracts/v1/factory/VaultFactory.sol +++ b/contracts/v1/factory/VaultFactory.sol @@ -2,10 +2,10 @@ pragma solidity ^0.8.27; import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol"; -import {ITermMaxVault} from "contracts/vault/ITermMaxVault.sol"; -import {VaultInitialParams} from "contracts/storage/TermMaxStorage.sol"; -import {FactoryEvents} from "contracts/events/FactoryEvents.sol"; -import {FactoryErrors} from "contracts/errors/FactoryErrors.sol"; +import {ITermMaxVault} from "../vault/ITermMaxVault.sol"; +import {VaultInitialParams} from "../storage/TermMaxStorage.sol"; +import {FactoryEvents} from "../events/FactoryEvents.sol"; +import {FactoryErrors} from "../errors/FactoryErrors.sol"; import {IVaultFactory} from "./IVaultFactory.sol"; /** diff --git a/contracts/v2/TermMaxOrderV2.sol b/contracts/v2/TermMaxOrderV2.sol index 2796c45..397f760 100644 --- a/contracts/v2/TermMaxOrderV2.sol +++ b/contracts/v2/TermMaxOrderV2.sol @@ -22,10 +22,10 @@ import {TransferUtils} from "../v1/lib/TransferUtils.sol"; import {ITermMaxMarketV2} from "./ITermMaxMarketV2.sol"; /** - * @title TermMax Order + * @title TermMax Order V2 * @author Term Structure Labs */ -contract TermMaxOrder is +contract TermMaxOrderV2 is ITermMaxOrder, ReentrancyGuardUpgradeable, Ownable2StepUpgradeable, diff --git a/contracts/v2/access/AccessManagerV2.sol b/contracts/v2/access/AccessManagerV2.sol index 455242c..a32c455 100644 --- a/contracts/v2/access/AccessManagerV2.sol +++ b/contracts/v2/access/AccessManagerV2.sol @@ -9,10 +9,6 @@ import {IOracleV2} from "../oracle/IOracleV2.sol"; * @author Term Structure Labs */ contract AccessManagerV2 is AccessManager { - function revokePendingOracle(IOracleV2 aggregator, address asset) external onlyRole(ORACLE_ROLE) { - aggregator.revokePendingOracle(asset); - } - /// @notice Set the switch of multiple entities function batchSetSwitch(IPausable[] calldata entities, bool state) external onlyRole(PAUSER_ROLE) { for (uint256 i = 0; i < entities.length; i++) { @@ -23,4 +19,15 @@ contract AccessManagerV2 is AccessManager { } } } + + function submitPendingOracle(IOracleV2 aggregator, address asset, IOracleV2.Oracle memory oracle) + external + onlyRole(ORACLE_ROLE) + { + aggregator.submitPendingOracle(asset, oracle); + } + + function revokePendingOracle(IOracleV2 aggregator, address asset) external onlyRole(ORACLE_ROLE) { + aggregator.revokePendingOracle(asset); + } } diff --git a/contracts/v2/router/TermMaxRouterV2.sol b/contracts/v2/router/TermMaxRouterV2.sol index d5ec77d..9d8cf5e 100644 --- a/contracts/v2/router/TermMaxRouterV2.sol +++ b/contracts/v2/router/TermMaxRouterV2.sol @@ -30,10 +30,10 @@ import {Constants} from "../../v1/lib/Constants.sol"; import {MathLib} from "../../v1/lib/MathLib.sol"; /** - * @title TermMax Router + * @title TermMax Router V2 * @author Term Structure Labs */ -contract TermMaxRouter is +contract TermMaxRouterV2 is UUPSUpgradeable, Ownable2StepUpgradeable, PausableUpgradeable, diff --git a/test/v2/AccessManagerV2.t.sol b/test/v2/AccessManagerV2.t.sol index 67ff19d..a505d11 100644 --- a/test/v2/AccessManagerV2.t.sol +++ b/test/v2/AccessManagerV2.t.sol @@ -13,15 +13,16 @@ import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/Pau import {Ownable2StepUpgradeable} from "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; import {GearingTokenWithERC20} from "contracts/v1/tokens/GearingTokenWithERC20.sol"; -import {ITermMaxMarket} from "contracts/interfaces/ITermMaxMarket.sol"; +import {ITermMaxMarket} from "contracts/v1/ITermMaxMarket.sol"; import {MockERC20} from "contracts/v1/test/MockERC20.sol"; import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; import {ITermMaxFactory} from "contracts/v1/factory/ITermMaxFactory.sol"; import {MarketConfig, FeeConfig, MarketInitialParams} from "contracts/v1/storage/TermMaxStorage.sol"; import {IOwnable, IPausable, AccessManagerV2, AccessManager} from "contracts/v2/access/AccessManagerV2.sol"; -import {ITermMaxRouter, TermMaxRouter} from "contracts/router/TermMaxRouter.sol"; +import {TermMaxRouterV2} from "contracts/v2/router/TermMaxRouterV2.sol"; +import {ITermMaxRouter} from "contracts/v1/router/ITermMaxRouter.sol"; import {ITermMaxVault, TermMaxVaultV2} from "contracts/v2/vault/TermMaxVaultV2.sol"; -import {Constants} from "contracts/lib/Constants.sol"; +import {Constants} from "contracts/v1/lib/Constants.sol"; import "contracts/v1/storage/TermMaxStorage.sol"; import {IOracleV2} from "contracts/v2/oracle/IOracleV2.sol"; @@ -415,7 +416,7 @@ contract AccessManagerTestV2 is Test { vm.startPrank(deployer); // Deploy a new router implementation - TermMaxRouter routerV2 = new TermMaxRouter(); + TermMaxRouterV2 routerV2 = new TermMaxRouterV2(); // Test upgrade with DEFAULT_ADMIN_ROLE manager.upgradeSubContract(UUPSUpgradeable(address(res.router)), address(routerV2), ""); @@ -515,7 +516,7 @@ contract AccessManagerTestV2 is Test { function testSubmitAndAcceptPendingOracle() public { address asset = address(res.collateral); - IOracle.Oracle memory oracle = IOracle.Oracle({ + IOracleV2.Oracle memory oracle = IOracleV2.Oracle({ aggregator: AggregatorV3Interface(address(new MockPriceFeed(sender))), backupAggregator: AggregatorV3Interface(address(new MockPriceFeed(sender))), heartbeat: 3600, @@ -530,12 +531,12 @@ contract AccessManagerTestV2 is Test { IAccessControl.AccessControlUnauthorizedAccount.selector, sender, manager.ORACLE_ROLE() ) ); - manager.submitPendingOracle(IOracle(address(res.oracle)), asset, oracle); + manager.submitPendingOracle(IOracleV2(address(res.oracle)), asset, oracle); vm.stopPrank(); // Test that oracle role can submit pending oracle vm.startPrank(deployer); - manager.submitPendingOracle(IOracle(address(res.oracle)), asset, oracle); + manager.submitPendingOracle(IOracleV2(address(res.oracle)), asset, oracle); // Test that non-oracle role cannot accept pending oracle vm.stopPrank(); @@ -556,7 +557,7 @@ contract AccessManagerTestV2 is Test { function testRevokePendingOracle() public { address asset = address(res.collateral); - IOracle.Oracle memory oracle = IOracle.Oracle({ + IOracleV2.Oracle memory oracle = IOracleV2.Oracle({ aggregator: AggregatorV3Interface(address(new MockPriceFeed(sender))), backupAggregator: AggregatorV3Interface(address(new MockPriceFeed(sender))), heartbeat: 3600, @@ -566,7 +567,7 @@ contract AccessManagerTestV2 is Test { // Submit a pending oracle vm.startPrank(deployer); - manager.submitPendingOracle(IOracle(address(res.oracle)), asset, oracle); + manager.submitPendingOracle(IOracleV2(address(res.oracle)), asset, oracle); vm.stopPrank(); // Test that non-oracle role cannot revoke pending oracle diff --git a/test/v2/utils/DeployUtils.sol b/test/v2/utils/DeployUtils.sol index ffdbfb4..c2f8ee5 100644 --- a/test/v2/utils/DeployUtils.sol +++ b/test/v2/utils/DeployUtils.sol @@ -5,21 +5,30 @@ import {console} from "forge-std/Script.sol"; import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {ITermMaxMarket, TermMaxMarket} from "contracts/TermMaxMarket.sol"; -import {ITermMaxOrder, ISwapCallback, TermMaxOrder} from "contracts/TermMaxOrder.sol"; -import {MockERC20, ERC20} from "contracts/test/MockERC20.sol"; -import {MockPriceFeed} from "contracts/test/MockPriceFeed.sol"; -import {IMintableERC20, MintableERC20} from "contracts/tokens/MintableERC20.sol"; -import {IGearingToken} from "contracts/tokens/IGearingToken.sol"; -import {ITermMaxFactory, TermMaxFactory} from "contracts/factory/TermMaxFactory.sol"; -import {TermMaxRouter} from "contracts/router/TermMaxRouter.sol"; -import {IOracle, OracleAggregator, AggregatorV3Interface} from "contracts/oracle/OracleAggregator.sol"; -import {MockOrder} from "contracts/test/MockOrder.sol"; -import {VaultFactory, IVaultFactory} from "contracts/factory/VaultFactory.sol"; -import {OrderManager} from "contracts/vault/OrderManager.sol"; -import {TermMaxVault, ITermMaxVault} from "contracts/vault/TermMaxVault.sol"; -import {AccessManager} from "contracts/access/AccessManager.sol"; -import "contracts/storage/TermMaxStorage.sol"; +import {ITermMaxMarket, ITermMaxMarketV2, TermMaxMarketV2} from "contracts/v2/TermMaxMarketV2.sol"; +import {ITermMaxOrder, ISwapCallback, TermMaxOrderV2} from "contracts/v2/TermMaxOrderV2.sol"; +import {MockERC20, ERC20} from "contracts/v1/test/MockERC20.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {IMintableERC20} from "contracts/v1/tokens/IMintableERC20.sol"; +import {IMintableERC20V2, MintableERC20V2} from "contracts/v2/tokens/MintableERC20V2.sol"; +import {IGearingToken} from "contracts/v1/tokens/IGearingToken.sol"; +import {ITermMaxFactory, TermMaxFactoryV2} from "contracts/v2/factory/TermMaxFactoryV2.sol"; +import {TermMaxRouterV2} from "contracts/v2/router/TermMaxRouterV2.sol"; +import {IOracleV2, OracleAggregatorV2, AggregatorV3Interface} from "contracts/v2/oracle/OracleAggregatorV2.sol"; +import {IOracle} from "contracts/v1/oracle/IOracle.sol"; +import {MockOrder} from "contracts/v2/test/MockOrder.sol"; +import {VaultFactory, IVaultFactory} from "contracts/v1/factory/VaultFactory.sol"; +import {OrderManager} from "contracts/v1/vault/OrderManager.sol"; +import {TermMaxVaultV2, ITermMaxVault} from "contracts/v2/vault/TermMaxVaultV2.sol"; +import {AccessManager} from "contracts/v2/access/AccessManagerV2.sol"; +import { + VaultInitialParams, + MarketConfig, + MarketInitialParams, + LoanConfig, + OrderConfig, + CurveCuts +} from "contracts/v1/storage/TermMaxStorage.sol"; library DeployUtils { bytes32 constant GT_ERC20 = keccak256("GearingTokenWithERC20"); @@ -38,9 +47,9 @@ library DeployUtils { struct Res { ITermMaxVault vault; IVaultFactory vaultFactory; - TermMaxFactory factory; + TermMaxFactoryV2 factory; ITermMaxOrder order; - TermMaxRouter router; + TermMaxRouterV2 router; MarketConfig marketConfig; OrderConfig orderConfig; ITermMaxMarket market; @@ -49,7 +58,7 @@ library DeployUtils { IGearingToken gt; MockPriceFeed debtOracle; MockPriceFeed collateralOracle; - OracleAggregator oracle; + OracleAggregatorV2 oracle; MockERC20 collateral; MockERC20 debt; SwapRange swapRange; @@ -69,10 +78,10 @@ library DeployUtils { res.oracle = deployOracle(admin, 0); res.oracle.submitPendingOracle( - address(res.debt), IOracle.Oracle(res.debtOracle, res.debtOracle, 0, 365 days, 0) + address(res.debt), IOracleV2.Oracle(res.debtOracle, res.debtOracle, 0, 365 days, 0) ); res.oracle.submitPendingOracle( - address(res.collateral), IOracle.Oracle(res.collateralOracle, res.collateralOracle, 0, 365 days, 0) + address(res.collateral), IOracleV2.Oracle(res.collateralOracle, res.collateralOracle, 0, 365 days, 0) ); res.oracle.acceptPendingOracle(address(res.debt)); @@ -93,7 +102,12 @@ library DeployUtils { admin: admin, gtImplementation: address(0), marketConfig: marketConfig, - loanConfig: LoanConfig({oracle: res.oracle, liquidationLtv: liquidationLtv, maxLtv: maxLtv, liquidatable: true}), + loanConfig: LoanConfig({ + oracle: IOracle(address(res.oracle)), + liquidationLtv: liquidationLtv, + maxLtv: maxLtv, + liquidatable: true + }), gtInitalParams: abi.encode(type(uint256).max), tokenName: "DAI-ETH", tokenSymbol: "DAI-ETH" @@ -123,10 +137,10 @@ library DeployUtils { res.oracle = deployOracle(admin, 0); res.oracle.submitPendingOracle( - address(res.debt), IOracle.Oracle(res.debtOracle, res.debtOracle, 0, 365 days, 0) + address(res.debt), IOracleV2.Oracle(res.debtOracle, res.debtOracle, 0, 365 days, 0) ); res.oracle.submitPendingOracle( - address(res.collateral), IOracle.Oracle(res.collateralOracle, res.collateralOracle, 0, 365 days, 0) + address(res.collateral), IOracleV2.Oracle(res.collateralOracle, res.collateralOracle, 0, 365 days, 0) ); res.oracle.acceptPendingOracle(address(res.debt)); res.oracle.acceptPendingOracle(address(res.collateral)); @@ -146,7 +160,12 @@ library DeployUtils { admin: admin, gtImplementation: address(0), marketConfig: marketConfig, - loanConfig: LoanConfig({oracle: res.oracle, liquidationLtv: liquidationLtv, maxLtv: maxLtv, liquidatable: true}), + loanConfig: LoanConfig({ + oracle: IOracle(address(res.oracle)), + liquidationLtv: liquidationLtv, + maxLtv: maxLtv, + liquidatable: true + }), gtInitalParams: abi.encode(type(uint256).max), tokenName: "DAI-ETH", tokenSymbol: "DAI-ETH" @@ -178,10 +197,10 @@ library DeployUtils { res.oracle = deployOracle(admin, 0); res.oracle.submitPendingOracle( - address(res.debt), IOracle.Oracle(res.debtOracle, res.debtOracle, 0, 365 days, 0) + address(res.debt), IOracleV2.Oracle(res.debtOracle, res.debtOracle, 0, 365 days, 0) ); res.oracle.submitPendingOracle( - address(res.collateral), IOracle.Oracle(res.collateralOracle, res.collateralOracle, 0, 365 days, 0) + address(res.collateral), IOracleV2.Oracle(res.collateralOracle, res.collateralOracle, 0, 365 days, 0) ); res.oracle.acceptPendingOracle(address(res.debt)); res.oracle.acceptPendingOracle(address(res.collateral)); @@ -201,7 +220,12 @@ library DeployUtils { admin: admin, gtImplementation: address(0), marketConfig: marketConfig, - loanConfig: LoanConfig({oracle: res.oracle, liquidationLtv: liquidationLtv, maxLtv: maxLtv, liquidatable: true}), + loanConfig: LoanConfig({ + oracle: IOracle(address(res.oracle)), + liquidationLtv: liquidationLtv, + maxLtv: maxLtv, + liquidatable: true + }), gtInitalParams: abi.encode(type(uint256).max), tokenName: "DAI-ETH", tokenSymbol: "DAI-ETH" @@ -227,10 +251,10 @@ library DeployUtils { res.oracle = deployOracle(admin, 0); res.oracle.submitPendingOracle( - address(res.debt), IOracle.Oracle(res.debtOracle, res.debtOracle, 0, 365 days, 0) + address(res.debt), IOracleV2.Oracle(res.debtOracle, res.debtOracle, 0, 365 days, 0) ); res.oracle.submitPendingOracle( - address(res.collateral), IOracle.Oracle(res.collateralOracle, res.collateralOracle, 0, 365 days, 0) + address(res.collateral), IOracleV2.Oracle(res.collateralOracle, res.collateralOracle, 0, 365 days, 0) ); res.oracle.acceptPendingOracle(address(res.debt)); res.oracle.acceptPendingOracle(address(res.collateral)); @@ -250,7 +274,12 @@ library DeployUtils { admin: admin, gtImplementation: address(0), marketConfig: marketConfig, - loanConfig: LoanConfig({oracle: res.oracle, liquidationLtv: liquidationLtv, maxLtv: maxLtv, liquidatable: true}), + loanConfig: LoanConfig({ + oracle: IOracle(address(res.oracle)), + liquidationLtv: liquidationLtv, + maxLtv: maxLtv, + liquidatable: true + }), gtInitalParams: abi.encode(type(uint256).max), tokenName: "DAI-ETH", tokenSymbol: "DAI-ETH" @@ -272,34 +301,34 @@ library DeployUtils { order = market.createOrder(maker, maxXtReserve, swapTrigger, curveCuts); } - function deployFactory(address admin) public returns (TermMaxFactory factory) { - address tokenImplementation = address(new MintableERC20()); - address orderImplementation = address(new TermMaxOrder()); - TermMaxMarket m = new TermMaxMarket(tokenImplementation, orderImplementation); - factory = new TermMaxFactory(admin, address(m)); + function deployFactory(address admin) public returns (TermMaxFactoryV2 factory) { + address tokenImplementation = address(new MintableERC20V2()); + address orderImplementation = address(new TermMaxOrderV2()); + TermMaxMarketV2 m = new TermMaxMarketV2(tokenImplementation, orderImplementation); + factory = new TermMaxFactoryV2(admin, address(m)); } - function deployFactoryWithMockOrder(address admin) public returns (TermMaxFactory factory) { - address tokenImplementation = address(new MintableERC20()); + function deployFactoryWithMockOrder(address admin) public returns (TermMaxFactoryV2 factory) { + address tokenImplementation = address(new MintableERC20V2()); address orderImplementation = address(new MockOrder()); - TermMaxMarket m = new TermMaxMarket(tokenImplementation, orderImplementation); - factory = new TermMaxFactory(admin, address(m)); + TermMaxMarketV2 m = new TermMaxMarketV2(tokenImplementation, orderImplementation); + factory = new TermMaxFactoryV2(admin, address(m)); } - function deployOracle(address admin, uint256 timeLock) public returns (OracleAggregator oracle) { - oracle = new OracleAggregator(admin, timeLock); + function deployOracle(address admin, uint256 timeLock) public returns (OracleAggregatorV2 oracle) { + oracle = new OracleAggregatorV2(admin, timeLock); } - function deployRouter(address admin) public returns (TermMaxRouter router) { - TermMaxRouter implementation = new TermMaxRouter(); - bytes memory data = abi.encodeCall(TermMaxRouter.initialize, admin); + function deployRouter(address admin) public returns (TermMaxRouterV2 router) { + TermMaxRouterV2 implementation = new TermMaxRouterV2(); + bytes memory data = abi.encodeCall(TermMaxRouterV2.initialize, admin); ERC1967Proxy proxy = new ERC1967Proxy(address(implementation), data); - router = TermMaxRouter(address(proxy)); + router = TermMaxRouterV2(address(proxy)); } function deployVault(VaultInitialParams memory initialParams) public returns (ITermMaxVault vault) { OrderManager orderManager = new OrderManager(); - TermMaxVault implementation = new TermMaxVault(address(orderManager)); + TermMaxVaultV2 implementation = new TermMaxVaultV2(address(orderManager)); VaultFactory vaultFactory = new VaultFactory(address(implementation)); vault = ITermMaxVault(vaultFactory.createVault(initialParams, 0)); diff --git a/test/v2/utils/StateChecker.sol b/test/v2/utils/StateChecker.sol index df21156..d04ec9d 100644 --- a/test/v2/utils/StateChecker.sol +++ b/test/v2/utils/StateChecker.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.27; import {console} from "forge-std/console.sol"; import {DeployUtils} from "./DeployUtils.sol"; -import "contracts/storage/TermMaxStorage.sol"; +import "contracts/v1/storage/TermMaxStorage.sol"; library StateChecker { struct MarketState { From ceff13cb05ddff9b133b4370da747bcc069c8c72 Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 2 Jun 2025 15:21:26 +0800 Subject: [PATCH 051/194] fix ut --- contracts/v2/factory/TermMaxFactoryV2.sol | 2 +- test/AccessManager.t.sol | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/contracts/v2/factory/TermMaxFactoryV2.sol b/contracts/v2/factory/TermMaxFactoryV2.sol index 1d44e00..c9f1d44 100644 --- a/contracts/v2/factory/TermMaxFactoryV2.sol +++ b/contracts/v2/factory/TermMaxFactoryV2.sol @@ -16,7 +16,7 @@ import {FactoryEventsV2} from "../events/FactoryEventsV2.sol"; * @author Term Structure Labs */ contract TermMaxFactoryV2 is Ownable2Step, FactoryErrors, FactoryEvents, ITermMaxFactory, FactoryEventsV2 { - bytes32 constant GT_ERC20 = keccak256("GearingTokenWithERC20V2"); + bytes32 constant GT_ERC20 = keccak256("GearingTokenWithERC20"); /// @notice The implementation of TermMax Market contract address public immutable TERMMAX_MARKET_IMPLEMENTATION; diff --git a/test/AccessManager.t.sol b/test/AccessManager.t.sol index c3e6ba6..2ce38aa 100644 --- a/test/AccessManager.t.sol +++ b/test/AccessManager.t.sol @@ -25,7 +25,7 @@ import {ITermMaxVault, TermMaxVault} from "contracts/vault/TermMaxVault.sol"; import {Constants} from "contracts/lib/Constants.sol"; import "contracts/storage/TermMaxStorage.sol"; -contract AccessManagerTest is Test { +contract AccessManagerTestV2 is Test { using JSONLoader for *; DeployUtils.Res res; @@ -471,10 +471,11 @@ contract AccessManagerTest is Test { uint256 salt = 123; // Test that non-market role cannot create market - vm.startPrank(sender); + address caller = 0x1234567890123456789012345678901234567890; + vm.startPrank(caller); vm.expectRevert( abi.encodeWithSelector( - IAccessControl.AccessControlUnauthorizedAccount.selector, sender, manager.MARKET_ROLE() + IAccessControl.AccessControlUnauthorizedAccount.selector, caller, manager.MARKET_ROLE() ) ); manager.createMarket(ITermMaxFactory(address(res.factory)), gtKey, params, salt); From f0da5904dbd324faa3dbdf1a5f662d5cd3373292 Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 2 Jun 2025 16:40:50 +0800 Subject: [PATCH 052/194] v2 unit tests --- ...lashRepayer.sol => MockFlashRepayerV2.sol} | 2 +- .../test/{MockOrder.sol => MockOrderV2.sol} | 2 +- contracts/v2/test/MockPriceFeedV2.sol | 75 + test/v2/FactoryV2.t.sol | 249 +++ test/v2/FuzzActionsV2.t.sol | 222 +++ test/v2/FuzzSwapV2.t.sol | 254 +++ test/v2/GtV2.t.sol | 1465 +++++++++++++++++ test/v2/MarketV2.t.sol | 422 +++++ test/v2/OracleAggregatorV2.t.sol | 646 ++++++++ test/v2/OrderV2.t.sol | 858 ++++++++++ test/v2/TermMaxToken.t.sol | 440 +++++ test/v2/VaultDustV2.t.sol | 273 +++ test/v2/VaultV2.t.sol | 1107 +++++++++++++ test/v2/utils/DeployUtils.sol | 5 +- 14 files changed, 6016 insertions(+), 4 deletions(-) rename contracts/v2/test/{MockFlashRepayer.sol => MockFlashRepayerV2.sol} (94%) rename contracts/v2/test/{MockOrder.sol => MockOrderV2.sol} (99%) create mode 100644 contracts/v2/test/MockPriceFeedV2.sol create mode 100644 test/v2/FactoryV2.t.sol create mode 100644 test/v2/FuzzActionsV2.t.sol create mode 100644 test/v2/FuzzSwapV2.t.sol create mode 100644 test/v2/GtV2.t.sol create mode 100644 test/v2/MarketV2.t.sol create mode 100644 test/v2/OracleAggregatorV2.t.sol create mode 100644 test/v2/OrderV2.t.sol create mode 100644 test/v2/TermMaxToken.t.sol create mode 100644 test/v2/VaultDustV2.t.sol create mode 100644 test/v2/VaultV2.t.sol diff --git a/contracts/v2/test/MockFlashRepayer.sol b/contracts/v2/test/MockFlashRepayerV2.sol similarity index 94% rename from contracts/v2/test/MockFlashRepayer.sol rename to contracts/v2/test/MockFlashRepayerV2.sol index 4781d44..e958578 100644 --- a/contracts/v2/test/MockFlashRepayer.sol +++ b/contracts/v2/test/MockFlashRepayerV2.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.27; import {IGearingToken, IGearingTokenV2, IERC20, IFlashRepayer} from "../tokens/AbstractGearingTokenV2.sol"; import {IERC721Receiver} from "@openzeppelin/contracts/interfaces/IERC721Receiver.sol"; -contract MockFlashRepayer is IFlashRepayer, IERC721Receiver { +contract MockFlashRepayerV2 is IFlashRepayer, IERC721Receiver { IGearingToken gt; constructor(IGearingToken gt_) { diff --git a/contracts/v2/test/MockOrder.sol b/contracts/v2/test/MockOrderV2.sol similarity index 99% rename from contracts/v2/test/MockOrder.sol rename to contracts/v2/test/MockOrderV2.sol index 90c9e7c..6258134 100644 --- a/contracts/v2/test/MockOrder.sol +++ b/contracts/v2/test/MockOrderV2.sol @@ -22,7 +22,7 @@ import {ITermMaxMarketV2} from "../ITermMaxMarketV2.sol"; * @title TermMax Order * @author Term Structure Labs */ -contract MockOrder is +contract MockOrderV2 is ITermMaxOrder, ReentrancyGuardUpgradeable, OwnableUpgradeable, diff --git a/contracts/v2/test/MockPriceFeedV2.sol b/contracts/v2/test/MockPriceFeedV2.sol new file mode 100644 index 0000000..4a455e3 --- /dev/null +++ b/contracts/v2/test/MockPriceFeedV2.sol @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; + +contract MockPriceFeedV2 is AggregatorV3Interface, Ownable { + struct RoundData { + uint80 roundId; + int256 answer; + uint256 startedAt; + uint256 updatedAt; + uint80 answeredInRound; + } + + event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 updatedAt); + + RoundData private _latestRoundData; + uint8 private _decimals; + + constructor(address admin) Ownable(admin) { + _decimals = 8; + } + + function decimals() external view override returns (uint8) { + return _decimals; + } + + function setDecimals(uint8 decimals_) external onlyOwner { + _decimals = decimals_; + } + + function description() external pure override returns (string memory) { + return "Test Oracle"; + } + + function version() external pure override returns (uint256) { + return 1; + } + + function getRoundData(uint80) + external + view + override + returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) + { + return ( + _latestRoundData.roundId, + _latestRoundData.answer, + _latestRoundData.startedAt, + _latestRoundData.updatedAt, + _latestRoundData.answeredInRound + ); + } + + function latestRoundData() + external + view + override + returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) + { + return ( + _latestRoundData.roundId, + _latestRoundData.answer, + _latestRoundData.startedAt, + _latestRoundData.updatedAt, + _latestRoundData.answeredInRound + ); + } + + function updateRoundData(RoundData memory roundData) external onlyOwner { + _latestRoundData = roundData; + emit AnswerUpdated(roundData.answer, roundData.roundId, roundData.updatedAt); + } +} diff --git a/test/v2/FactoryV2.t.sol b/test/v2/FactoryV2.t.sol new file mode 100644 index 0000000..b482bcf --- /dev/null +++ b/test/v2/FactoryV2.t.sol @@ -0,0 +1,249 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "forge-std/Test.sol"; +import {console} from "forge-std/console.sol"; +import {DeployUtils} from "./utils/DeployUtils.sol"; +import {JSONLoader} from "./utils/JSONLoader.sol"; + +import {ITermMaxMarketV2, TermMaxMarketV2, Constants, MarketErrors} from "contracts/v2/TermMaxMarketV2.sol"; +import {MockERC20, ERC20} from "contracts/v1/test/MockERC20.sol"; + +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {IMintableERC20} from "contracts/v1/tokens/MintableERC20.sol"; +import {IGearingToken} from "contracts/v1/tokens/IGearingToken.sol"; +import { + GearingTokenWithERC20V2, + GearingTokenEvents, + GearingTokenEventsV2, + GtConfig +} from "contracts/v2/tokens/GearingTokenWithERC20V2.sol"; +import { + ITermMaxFactory, + TermMaxFactoryV2, + FactoryErrors, + FactoryEvents, + FactoryEventsV2 +} from "contracts/v2/factory/TermMaxFactoryV2.sol"; +import {IOracleV2, OracleAggregatorV2, AggregatorV3Interface} from "contracts/v2/oracle/OracleAggregatorV2.sol"; +import {IOracle} from "contracts/v1/oracle/IOracle.sol"; +import { + VaultInitialParams, + MarketConfig, + MarketInitialParams, + LoanConfig, + OrderConfig, + CurveCuts +} from "contracts/v1/storage/TermMaxStorage.sol"; + +contract FactoryTestV2 is Test { + address deployer = vm.randomAddress(); + + address treasurer = vm.randomAddress(); + uint32 maxLtv = 0.89e8; + uint32 liquidationLtv = 0.9e8; + MarketConfig marketConfig; + + function setUp() public { + string memory testdata = vm.readFile(string.concat(vm.projectRoot(), "/test/testdata/testdata.json")); + + marketConfig = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); + } + + function testDeploy() public { + vm.startPrank(deployer); + DeployUtils.Res memory res = DeployUtils.deployMarket(deployer, marketConfig, maxLtv, liquidationLtv); + + address predictedMarketAddress = res.factory.predictMarketAddress( + deployer, address(res.collateral), address(res.debt), marketConfig.maturity, 0 + ); + assert(address(res.market) == predictedMarketAddress); + + assert( + keccak256(abi.encode(ITermMaxMarketV2(address(res.market)).name())) + == keccak256(abi.encode("Termmax Market:DAI-ETH")) + ); + + assert(keccak256(abi.encode(res.market.config())) == keccak256(abi.encode(marketConfig))); + GtConfig memory gtConfig = res.gt.getGtConfig(); + assert(gtConfig.maturity == marketConfig.maturity); + assert(gtConfig.loanConfig.maxLtv == maxLtv); + assert(gtConfig.loanConfig.liquidationLtv == liquidationLtv); + assert(gtConfig.loanConfig.liquidatable == true); + assert(gtConfig.collateral == address(res.collateral)); + assert(gtConfig.debtToken == res.debt); + assert(gtConfig.ft == res.ft); + assert(GearingTokenWithERC20V2(address(res.gt)).collateralCapacity() == type(uint256).max); + vm.stopPrank(); + } + + function testDeployRepeatedly() public { + vm.startPrank(deployer); + DeployUtils.Res memory res = DeployUtils.deployMarket(deployer, marketConfig, maxLtv, liquidationLtv); + + LoanConfig memory loanConfig = res.gt.getGtConfig().loanConfig; + vm.expectRevert(abi.encodeWithSignature("FailedDeployment()")); + res.factory.createMarket( + DeployUtils.GT_ERC20, + MarketInitialParams({ + collateral: address(res.collateral), + debtToken: res.debt, + admin: deployer, + gtImplementation: address(0), + marketConfig: marketConfig, + loanConfig: loanConfig, + gtInitalParams: abi.encode(type(uint256).max), + tokenName: "test", + tokenSymbol: "test" + }), + 0 + ); + vm.stopPrank(); + } + + function testDeployMarketWithInvalidParams() public { + vm.startPrank(deployer); + TermMaxFactoryV2 factory = DeployUtils.deployFactory(deployer); + + MockERC20 collateral = new MockERC20("ETH", "ETH", 18); + MockERC20 debt = new MockERC20("DAI", "DAI", 8); + + MarketInitialParams memory params = MarketInitialParams({ + collateral: address(collateral), + debtToken: debt, + admin: deployer, + gtImplementation: factory.gtImplements(DeployUtils.GT_ERC20), + marketConfig: marketConfig, + loanConfig: LoanConfig({ + maxLtv: maxLtv, + liquidationLtv: liquidationLtv, + liquidatable: true, + oracle: IOracle(vm.randomAddress()) + }), + gtInitalParams: abi.encode(type(uint256).max), + tokenName: "test", + tokenSymbol: "test" + }); + uint64 maturity = marketConfig.maturity; + vm.warp(maturity + 1 days); + vm.expectRevert(abi.encodeWithSelector(MarketErrors.InvalidMaturity.selector)); + factory.createMarket(DeployUtils.GT_ERC20, params, 0); + + vm.warp(maturity - 1 days); + params.marketConfig.feeConfig.borrowTakerFeeRatio = Constants.MAX_FEE_RATIO; + vm.expectRevert(abi.encodeWithSelector(MarketErrors.FeeTooHigh.selector)); + factory.createMarket(DeployUtils.GT_ERC20, params, 0); + + params.marketConfig.feeConfig.borrowTakerFeeRatio = 0; + params.marketConfig.feeConfig.mintGtFeeRef = uint32(Constants.DECIMAL_BASE * 5 + 1); + vm.expectRevert(abi.encodeWithSelector(MarketErrors.FeeTooHigh.selector)); + factory.createMarket(DeployUtils.GT_ERC20, params, 0); + + params.marketConfig.feeConfig.mintGtFeeRef = 0; + address predictMarketAddress = + factory.predictMarketAddress(deployer, address(collateral), address(debt), maturity, 0); + vm.expectEmit(); + emit GearingTokenEventsV2.GearingTokenInitialized( + predictMarketAddress, "GT:test", "GT:test", abi.encode(type(uint256).max) + ); + emit GearingTokenWithERC20V2.CollateralCapacityUpdated(type(uint256).max); + emit FactoryEventsV2.CreateMarket(predictMarketAddress, address(collateral), debt, params); + factory.createMarket(DeployUtils.GT_ERC20, params, 0); + vm.stopPrank(); + } + + function testLiquidationLtvMustBeGreaterThanMaxLtv() public { + vm.startPrank(deployer); + TermMaxFactoryV2 factory = DeployUtils.deployFactory(deployer); + + MockERC20 collateral = new MockERC20("ETH", "ETH", 18); + MockERC20 debt = new MockERC20("DAI", "DAI", 8); + + maxLtv = 3; + liquidationLtv = 2; + + MarketInitialParams memory params = MarketInitialParams({ + collateral: address(collateral), + debtToken: debt, + admin: deployer, + gtImplementation: address(0), + marketConfig: marketConfig, + loanConfig: LoanConfig({ + maxLtv: maxLtv, + liquidationLtv: liquidationLtv, + liquidatable: true, + oracle: IOracle(vm.randomAddress()) + }), + gtInitalParams: abi.encode(type(uint256).max), + tokenName: "test", + tokenSymbol: "test" + }); + + vm.expectRevert(abi.encodeWithSignature("LiquidationLtvMustBeGreaterThanMaxLtv()")); + factory.createMarket(DeployUtils.GT_ERC20, params, 0); + + vm.stopPrank(); + } + + function testRevertByCantNotFindGtImplementation() public { + vm.startPrank(deployer); + TermMaxFactoryV2 factory = DeployUtils.deployFactory(deployer); + + MockERC20 collateral = new MockERC20("ETH", "ETH", 18); + MockERC20 debt = new MockERC20("DAI", "DAI", 8); + + vm.expectRevert(abi.encodeWithSelector(FactoryErrors.CantNotFindGtImplementation.selector)); + factory.createMarket( + bytes32(0), + MarketInitialParams({ + collateral: address(collateral), + debtToken: debt, + admin: deployer, + gtImplementation: address(0), + marketConfig: marketConfig, + loanConfig: LoanConfig({ + maxLtv: maxLtv, + liquidationLtv: liquidationLtv, + liquidatable: true, + oracle: IOracle(vm.randomAddress()) + }), + gtInitalParams: abi.encode(type(uint256).max), + tokenName: "test", + tokenSymbol: "test" + }), + 0 + ); + vm.stopPrank(); + } + + function testSetGtImplement() public { + vm.startPrank(deployer); + TermMaxFactoryV2 factory = DeployUtils.deployFactory(deployer); + GearingTokenWithERC20V2 gt = new GearingTokenWithERC20V2(); + string memory gtImplemtName = "gt-test"; + bytes32 key = keccak256(abi.encodePacked(gtImplemtName)); + vm.expectEmit(); + emit FactoryEvents.SetGtImplement(key, address(gt)); + factory.setGtImplement(gtImplemtName, address(gt)); + assert(factory.gtImplements(key) == address(gt)); + vm.stopPrank(); + } + + function testSetGtImplementWithoutAuth() public { + address sender = vm.randomAddress(); + vm.startPrank(sender); + TermMaxFactoryV2 factory = DeployUtils.deployFactory(deployer); + GearingTokenWithERC20V2 gt = new GearingTokenWithERC20V2(); + string memory key = "gt-test"; + + vm.expectRevert(abi.encodePacked(bytes4(keccak256("OwnableUnauthorizedAccount(address)")), abi.encode(sender))); + factory.setGtImplement(key, address(gt)); + + vm.stopPrank(); + } + + function testInvalidMarketImplementation() public { + vm.expectRevert(abi.encodeWithSelector(FactoryErrors.InvalidImplementation.selector)); + new TermMaxFactoryV2(deployer, address(0)); + } +} diff --git a/test/v2/FuzzActionsV2.t.sol b/test/v2/FuzzActionsV2.t.sol new file mode 100644 index 0000000..a24e8f3 --- /dev/null +++ b/test/v2/FuzzActionsV2.t.sol @@ -0,0 +1,222 @@ +pragma solidity ^0.8.27; + +import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; +import {IFlashLoanReceiver} from "contracts/v1/IFlashLoanReceiver.sol"; +import { + ITermMaxMarketV2, TermMaxMarketV2, Constants, MarketErrors, MarketEvents +} from "contracts/v2/TermMaxMarketV2.sol"; +import {ITermMaxOrder, TermMaxOrderV2, ISwapCallback, OrderEvents, OrderErrors} from "contracts/v2/TermMaxOrderV2.sol"; +import {MockERC20, ERC20} from "contracts/v1/test/MockERC20.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {MockFlashLoanReceiver} from "contracts/v1/test/MockFlashLoanReceiver.sol"; +import {IGearingToken} from "contracts/v1/tokens/IGearingToken.sol"; +import { + VaultInitialParams, + MarketConfig, + MarketInitialParams, + LoanConfig, + OrderConfig, + CurveCut, + CurveCuts, + FeeConfig +} from "contracts/v1/storage/TermMaxStorage.sol"; +import {DeployUtils} from "./utils/DeployUtils.sol"; +import {JSONLoader} from "./utils/JSONLoader.sol"; +import "forge-std/Test.sol"; + +contract FuzzActionsTestV2 is Test { + using JSONLoader for *; + using SafeCast for *; + using DeployUtils for *; + + enum OpType { + BUY_FT, + BUY_XT, + SELL_FT, + SELL_XT, + BUY_EXACT_FT, + BUY_EXACT_XT, + SELL_FT_FOR_EXACT_TOKEN, + SELL_XT_FOR_EXACT_TOKEN + } + + struct Action { + uint256 opType; + uint256 firstAmt; + uint256 ftReserve; + uint256 xtReserve; + uint256 secondAmt; + uint256 fee; + } + + address admin = vm.randomAddress(); + address maker = vm.randomAddress(); + address taker = vm.randomAddress(); + address treasurer = vm.randomAddress(); + + string path = string.concat(vm.projectRoot(), "/test/testdata/fuzzSwap/v2.json"); + + function setUp() public {} + + function _initResources() internal returns (DeployUtils.Res memory res) { + uint32 maxLtv = 0.89e8; + uint32 liquidationLtv = 0.9e8; + string memory entityPath = path; + string memory testdata = vm.readFile(entityPath); + uint256 currentTime = vm.parseJsonUint(testdata, ".currentTime"); + vm.warp(currentTime); + + MarketConfig memory marketConfig = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); + + vm.startPrank(admin); + + res = DeployUtils.deployMarket(admin, marketConfig, maxLtv, liquidationLtv); + + res.orderConfig = JSONLoader.getOrderConfigFromJson(testdata, ".orderConfig"); + + MockSwapCallback afterSwap = new MockSwapCallback(res.ft, res.xt); + res.order = res.market.createOrder(maker, res.orderConfig.maxXtReserve, afterSwap, res.orderConfig.curveCuts); + + uint256 ftReserve = vm.parseJsonUint(testdata, ".orderConfig.ftReserve"); + uint256 xtReserve = vm.parseJsonUint(testdata, ".orderConfig.xtReserve"); + res.debt.mint(admin, ftReserve + xtReserve); + res.debt.approve(address(res.market), ftReserve + xtReserve); + res.market.mint(admin, ftReserve + xtReserve); + res.ft.transfer(address(res.order), ftReserve); + res.xt.transfer(address(res.order), xtReserve); + + vm.stopPrank(); + } + + function _parseActions() internal returns (Action[] memory actions) { + string memory json = vm.readFile(path); + uint256 length = vm.parseJsonUint(json, ".actions.length"); + actions = new Action[](length); + for (uint256 i = 0; i < length; i++) { + string memory key = string.concat(".actions.", vm.toString(i)); + actions[i].opType = vm.parseJsonUint(json, string.concat(key, ".opType")); + actions[i].firstAmt = vm.parseJsonUint(json, string.concat(key, ".firstAmt")); + actions[i].secondAmt = vm.parseJsonUint(json, string.concat(key, ".secondAmt")); + actions[i].ftReserve = vm.parseJsonUint(json, string.concat(key, ".contractState.ftReserve")); + actions[i].xtReserve = vm.parseJsonUint(json, string.concat(key, ".contractState.xtReserve")); + actions[i].fee = vm.parseJsonUint(json, string.concat(key, ".fee")); + } + } + + function testActions() public { + DeployUtils.Res memory res = _initResources(); + Action[] memory actions = _parseActions(); + vm.startPrank(taker); + uint256 max128 = type(uint128).max; + res.debt.mint(taker, max128); + res.debt.approve(address(res.market), max128); + res.market.mint(taker, max128 / 2); + res.debt.approve(address(res.order), max128); + res.ft.approve(address(res.order), max128); + res.xt.approve(address(res.order), max128); + vm.stopPrank(); + + for (uint256 i = 0; i < actions.length; i++) { + _swapToken(res, actions[i]); + } + } + + function _swapToken(DeployUtils.Res memory res, Action memory action) internal { + IERC20 tokenIn; + IERC20 tokenOut; + bool isExact; + if (action.opType == uint256(OpType.BUY_FT)) { + tokenIn = res.debt; + tokenOut = res.ft; + isExact = false; + console.log("buy ft"); + } else if (action.opType == uint256(OpType.BUY_XT)) { + tokenIn = res.debt; + tokenOut = res.xt; + isExact = false; + console.log("buy xt"); + } else if (action.opType == uint256(OpType.SELL_FT)) { + tokenIn = res.ft; + tokenOut = res.debt; + isExact = false; + console.log("sell ft"); + } else if (action.opType == uint256(OpType.SELL_XT)) { + tokenIn = res.xt; + tokenOut = res.debt; + isExact = false; + console.log("sell xt"); + } else if (action.opType == uint256(OpType.BUY_EXACT_FT)) { + tokenIn = res.debt; + tokenOut = res.ft; + isExact = true; + console.log("buy exact ft"); + } else if (action.opType == uint256(OpType.BUY_EXACT_XT)) { + tokenIn = res.debt; + tokenOut = res.xt; + isExact = true; + console.log("buy exact xt"); + } else if (action.opType == uint256(OpType.SELL_FT_FOR_EXACT_TOKEN)) { + tokenIn = res.ft; + tokenOut = res.debt; + isExact = true; + console.log("sell ft for exact token"); + } else if (action.opType == uint256(OpType.SELL_XT_FOR_EXACT_TOKEN)) { + tokenIn = res.xt; + tokenOut = res.debt; + isExact = true; + console.log("sell xt for exact token"); + } + + vm.startPrank(taker); + + uint256 netAmt; + if (isExact) { + netAmt = res.order.swapTokenToExactToken( + tokenIn, tokenOut, taker, uint128(action.firstAmt), type(uint128).max, block.timestamp + 1 hours + ); + } else { + netAmt = res.order.swapExactTokenToToken( + tokenIn, tokenOut, taker, uint128(action.firstAmt), 0, block.timestamp + 1 hours + ); + } + assertEq(netAmt, action.secondAmt, "net amt not as expected"); + assertEq(res.ft.balanceOf(address(res.order)), action.ftReserve); + assertEq(res.xt.balanceOf(address(res.order)), action.xtReserve); + vm.stopPrank(); + } +} + +// Mock contracts for testing +contract MockSwapCallback is ISwapCallback { + using SafeCast for *; + + int256 public deltaFt; + int256 public deltaXt; + int256 ftReserve; + int256 xtReserve; + IERC20 public ft; + IERC20 public xt; + + constructor(IERC20 ft_, IERC20 xt_) { + ft = ft_; + xt = xt_; + } + + function afterSwap(uint256 ftReserve_, uint256 xtReserve_, int256 deltaFt_, int256 deltaXt_) external override { + deltaFt = deltaFt_; + deltaXt = deltaXt_; + if (ftReserve == 0 || xtReserve == 0) { + ftReserve = int256(ftReserve_); + xtReserve = int256(xtReserve_); + return; + } else { + ftReserve += deltaFt; + xtReserve += deltaXt; + require(uint256(ftReserve) == ftReserve_, "ft reserve not as expected"); + require(uint256(xtReserve) == xtReserve_, "xt reserve not as expected"); + } + } +} diff --git a/test/v2/FuzzSwapV2.t.sol b/test/v2/FuzzSwapV2.t.sol new file mode 100644 index 0000000..f75fe54 --- /dev/null +++ b/test/v2/FuzzSwapV2.t.sol @@ -0,0 +1,254 @@ +pragma solidity ^0.8.27; + +import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; +import {IFlashLoanReceiver} from "contracts/v1/IFlashLoanReceiver.sol"; +import { + ITermMaxMarketV2, TermMaxMarketV2, Constants, MarketErrors, MarketEvents +} from "contracts/v2/TermMaxMarketV2.sol"; +import {ITermMaxOrder, TermMaxOrderV2, ISwapCallback, OrderEvents, OrderErrors} from "contracts/v2/TermMaxOrderV2.sol"; +import {MockERC20, ERC20} from "contracts/v1/test/MockERC20.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {MockFlashLoanReceiver} from "contracts/v1/test/MockFlashLoanReceiver.sol"; +import {IGearingToken} from "contracts/v1/tokens/IGearingToken.sol"; +import { + VaultInitialParams, + MarketConfig, + MarketInitialParams, + LoanConfig, + OrderConfig, + CurveCut, + CurveCuts, + FeeConfig +} from "contracts/v1/storage/TermMaxStorage.sol"; +import {DeployUtils} from "./utils/DeployUtils.sol"; +import {JSONLoader} from "./utils/JSONLoader.sol"; +import "forge-std/Test.sol"; + +contract FuzzSwapTestV2 is Test { + using JSONLoader for *; + using SafeCast for *; + using DeployUtils for *; + + uint256 entities; + + address admin = vm.randomAddress(); + address maker = vm.randomAddress(); + address taker = vm.randomAddress(); + address treasurer = vm.randomAddress(); + + string[] indexs = ["0", "1", "2", "3", "4", "5"]; + + function setUp() public { + string memory entitiesData = string.concat(vm.projectRoot(), "/test/testdata/fuzzSwap/entities.json"); + entities = vm.parseJsonUint(vm.readFile(entitiesData), ".entities"); + } + + function _initResources(string memory index) internal returns (DeployUtils.Res memory res) { + uint32 maxLtv = 0.89e8; + uint32 liquidationLtv = 0.9e8; + string memory entityPath = string.concat(vm.projectRoot(), "/test/testdata/fuzzSwap/", index, ".json"); + string memory testdata = vm.readFile(entityPath); + uint256 currentTime = vm.parseJsonUint(testdata, ".currentTime"); + vm.warp(currentTime); + + MarketConfig memory marketConfig = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); + + vm.startPrank(admin); + + res = DeployUtils.deployMarket(admin, marketConfig, maxLtv, liquidationLtv); + + res.orderConfig = JSONLoader.getOrderConfigFromJson(testdata, ".orderConfig"); + + MockSwapCallback afterSwap = new MockSwapCallback(res.ft, res.xt); + + res.order = res.market.createOrder(maker, res.orderConfig.maxXtReserve, afterSwap, res.orderConfig.curveCuts); + + uint256 orderInitialAmount = vm.parseJsonUint(testdata, ".orderInitialAmount"); + res.debt.mint(admin, orderInitialAmount); + res.debt.approve(address(res.market), orderInitialAmount); + res.market.mint(address(res.order), orderInitialAmount); + + res.swapRange = JSONLoader.getSwapRangeFromJson(testdata, ".maxInput"); + + vm.stopPrank(); + } + + function testBuyFt(uint256 index, uint128 tokenAmtIn) public { + console.log("buy ft", index, tokenAmtIn); + vm.assume(index < entities); + DeployUtils.Res memory res = _initResources(indexs[index]); + vm.assume(tokenAmtIn > 0 && tokenAmtIn <= res.swapRange.buyFtMax); + _buyFt(res, tokenAmtIn, 0); + } + + function testBuyXt(uint256 index, uint128 tokenAmtIn) public { + console.log("buy xt", index, tokenAmtIn); + vm.assume(index < entities); + DeployUtils.Res memory res = _initResources(indexs[index]); + vm.assume(tokenAmtIn > 0 && tokenAmtIn <= res.swapRange.buyXtMax); + _buyXt(res, tokenAmtIn, 0); + } + + function testSellFt(uint256 index, uint128 ftAmtIn) public { + console.log("sell ft", index, ftAmtIn); + vm.assume(index < entities); + DeployUtils.Res memory res = _initResources(indexs[index]); + vm.assume(ftAmtIn > 0 && ftAmtIn <= res.swapRange.sellFtMax); + _sellFt(res, ftAmtIn, 0); + } + + function testSellXt(uint256 index, uint128 xtAmtIn) public { + console.log("sell xt", index, xtAmtIn); + vm.assume(index < entities); + DeployUtils.Res memory res = _initResources(indexs[index]); + vm.assume(xtAmtIn > 0 && xtAmtIn <= res.swapRange.sellXtMax); + _sellXt(res, xtAmtIn, 0); + } + + function testBuyExactFt(uint256 index, uint128 ftAmtOut) public { + console.log("buy exact ft", index, ftAmtOut); + vm.assume(index < entities); + DeployUtils.Res memory res = _initResources(indexs[index]); + vm.assume(ftAmtOut > 0 && ftAmtOut <= res.swapRange.buyExactFtMax); + _buyExactFt(res, ftAmtOut, ftAmtOut); + } + + function testBuyExactXt(uint256 index, uint128 xtAmtOut) public { + console.log("buy exact xt", index, xtAmtOut); + vm.assume(index < entities); + DeployUtils.Res memory res = _initResources(indexs[index]); + vm.assume(xtAmtOut > 0 && xtAmtOut <= res.swapRange.buyExactXtMax); + _buyExactXt(res, xtAmtOut, xtAmtOut); + } + + function testSellFtForExactToken(uint256 index, uint128 tokenAmtOut) public { + console.log("sell ft for exact token", index, tokenAmtOut); + vm.assume(index < entities); + DeployUtils.Res memory res = _initResources(indexs[index]); + vm.assume(tokenAmtOut > 0 && tokenAmtOut <= res.swapRange.sellFtForExactTokenMax); + _sellFtForExactToken(res, tokenAmtOut, tokenAmtOut * 10); + } + + function testSellXtForExactToken(uint256 index, uint128 tokenAmtOut) public { + console.log("sell xt for exact token", index, tokenAmtOut); + vm.assume(index < entities); + DeployUtils.Res memory res = _initResources(indexs[index]); + vm.assume(tokenAmtOut > 0 && tokenAmtOut <= res.swapRange.sellXtForExactTokenMax); + _sellXtForExactToken(res, tokenAmtOut, tokenAmtOut * 10000); + } + + function _buyFt(DeployUtils.Res memory res, uint128 tokenAmtIn, uint128 minFtAmtOut) internal { + vm.startPrank(taker); + + res.debt.mint(taker, tokenAmtIn); + res.debt.approve(address(res.order), tokenAmtIn); + + res.order.swapExactTokenToToken(res.debt, res.ft, taker, tokenAmtIn, minFtAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function _buyXt(DeployUtils.Res memory res, uint128 tokenAmtIn, uint128 minXtAmtOut) internal { + vm.startPrank(taker); + + res.debt.mint(taker, tokenAmtIn); + res.debt.approve(address(res.order), tokenAmtIn); + + res.order.swapExactTokenToToken(res.debt, res.xt, taker, tokenAmtIn, minXtAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function _sellFt(DeployUtils.Res memory res, uint128 ftAmtIn, uint128 minTokenAmtOut) internal { + vm.startPrank(taker); + res.debt.mint(taker, ftAmtIn); + res.debt.approve(address(res.market), ftAmtIn); + res.market.mint(taker, ftAmtIn); + + res.ft.approve(address(res.order), ftAmtIn); + res.order.swapExactTokenToToken(res.ft, res.debt, taker, ftAmtIn, minTokenAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function _sellXt(DeployUtils.Res memory res, uint128 xtAmtIn, uint128 minTokenAmtOut) internal { + vm.startPrank(taker); + res.debt.mint(taker, xtAmtIn); + res.debt.approve(address(res.market), xtAmtIn); + res.market.mint(taker, xtAmtIn); + + res.xt.approve(address(res.order), xtAmtIn); + res.order.swapExactTokenToToken(res.xt, res.debt, taker, xtAmtIn, minTokenAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function _buyExactFt(DeployUtils.Res memory res, uint128 ftAmtOut, uint128 maxTokenAmtIn) internal { + vm.startPrank(taker); + res.debt.mint(taker, maxTokenAmtIn); + res.debt.approve(address(res.order), maxTokenAmtIn); + res.order.swapTokenToExactToken(res.debt, res.ft, taker, ftAmtOut, maxTokenAmtIn, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function _buyExactXt(DeployUtils.Res memory res, uint128 xtAmtOut, uint128 maxTokenAmtIn) internal { + vm.startPrank(taker); + res.debt.mint(taker, maxTokenAmtIn); + res.debt.approve(address(res.order), maxTokenAmtIn); + res.order.swapTokenToExactToken(res.debt, res.xt, taker, xtAmtOut, maxTokenAmtIn, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function _sellFtForExactToken(DeployUtils.Res memory res, uint128 tokenAmtOut, uint128 maxFtAmtIn) internal { + vm.startPrank(taker); + res.debt.mint(taker, maxFtAmtIn); + res.debt.approve(address(res.market), maxFtAmtIn); + res.market.mint(taker, maxFtAmtIn); + + res.ft.approve(address(res.order), maxFtAmtIn); + res.order.swapTokenToExactToken(res.ft, res.debt, taker, tokenAmtOut, maxFtAmtIn, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function _sellXtForExactToken(DeployUtils.Res memory res, uint128 tokenAmtOut, uint128 maxXtAmtIn) internal { + vm.startPrank(taker); + res.debt.mint(taker, maxXtAmtIn); + res.debt.approve(address(res.market), maxXtAmtIn); + res.market.mint(taker, maxXtAmtIn); + + res.xt.approve(address(res.order), maxXtAmtIn); + res.order.swapTokenToExactToken(res.xt, res.debt, taker, tokenAmtOut, maxXtAmtIn, block.timestamp + 1 hours); + vm.stopPrank(); + } +} + +// Mock contracts for testing +contract MockSwapCallback is ISwapCallback { + using SafeCast for *; + + int256 public deltaFt; + int256 public deltaXt; + int256 ftReserve; + int256 xtReserve; + IERC20 public ft; + IERC20 public xt; + + constructor(IERC20 ft_, IERC20 xt_) { + ft = ft_; + xt = xt_; + } + + function afterSwap(uint256 ftReserve_, uint256 xtReserve_, int256 deltaFt_, int256 deltaXt_) external override { + deltaFt = deltaFt_; + deltaXt = deltaXt_; + if (ftReserve == 0 || xtReserve == 0) { + ftReserve = int256(ftReserve_); + xtReserve = int256(xtReserve_); + return; + } else { + ftReserve += deltaFt; + xtReserve += deltaXt; + require(uint256(ftReserve) == ftReserve_, "ft reserve not as expected"); + require(uint256(xtReserve) == xtReserve_, "xt reserve not as expected"); + } + } +} diff --git a/test/v2/GtV2.t.sol b/test/v2/GtV2.t.sol new file mode 100644 index 0000000..def78e2 --- /dev/null +++ b/test/v2/GtV2.t.sol @@ -0,0 +1,1465 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "forge-std/Test.sol"; +import {console} from "forge-std/console.sol"; +import {DeployUtils} from "./utils/DeployUtils.sol"; +import {JSONLoader} from "./utils/JSONLoader.sol"; +import {StateChecker} from "./utils/StateChecker.sol"; +import {SwapUtils} from "./utils/SwapUtils.sol"; +import {LoanUtils} from "./utils/LoanUtils.sol"; + +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {Constants} from "contracts/v1/lib/Constants.sol"; +import { + ITermMaxMarketV2, TermMaxMarketV2, Constants, MarketErrors, MarketEvents +} from "contracts/v2/TermMaxMarketV2.sol"; +import {MockERC20, ERC20} from "contracts/v1/test/MockERC20.sol"; + +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {IMintableERC20} from "contracts/v1/tokens/MintableERC20.sol"; +import {IGearingToken} from "contracts/v1/tokens/IGearingToken.sol"; +import { + GearingTokenWithERC20V2, + GearingTokenEvents, + GearingTokenErrors, + GearingTokenEventsV2, + GtConfig +} from "contracts/v2/tokens/GearingTokenWithERC20V2.sol"; +import { + ITermMaxFactory, + TermMaxFactoryV2, + FactoryErrors, + FactoryEvents, + FactoryEventsV2 +} from "contracts/v2/factory/TermMaxFactoryV2.sol"; +import {IOracleV2, OracleAggregatorV2, AggregatorV3Interface} from "contracts/v2/oracle/OracleAggregatorV2.sol"; +import {IOracle} from "contracts/v1/oracle/IOracle.sol"; +import { + VaultInitialParams, + MarketConfig, + MarketInitialParams, + LoanConfig, + OrderConfig, + CurveCuts +} from "contracts/v1/storage/TermMaxStorage.sol"; +import {MockFlashLoanReceiver} from "contracts/v1/test/MockFlashLoanReceiver.sol"; +import {MockFlashRepayerV2} from "contracts/v2/test/MockFlashRepayerV2.sol"; +import {ISwapCallback} from "contracts/v1/ISwapCallback.sol"; + +contract GtTestV2 is Test { + using JSONLoader for *; + using SafeCast for uint256; + using SafeCast for int256; + + DeployUtils.Res res; + + OrderConfig orderConfig; + MarketConfig marketConfig; + + address deployer = vm.randomAddress(); + address sender = vm.randomAddress(); + address treasurer = vm.randomAddress(); + address maker = vm.randomAddress(); + string testdata; + + MockFlashLoanReceiver flashLoanReceiver; + + MockFlashRepayerV2 flashRepayer; + + uint32 maxLtv = 0.89e8; + uint32 liquidationLtv = 0.9e8; + + function setUp() public { + vm.startPrank(deployer); + testdata = vm.readFile(string.concat(vm.projectRoot(), "/test/testdata/testdata.json")); + + marketConfig = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); + orderConfig = JSONLoader.getOrderConfigFromJson(testdata, ".orderConfig"); + orderConfig.maxXtReserve = type(uint128).max; + res = DeployUtils.deployMarket(deployer, marketConfig, maxLtv, liquidationLtv); + + res.order = + res.market.createOrder(maker, orderConfig.maxXtReserve, ISwapCallback(address(0)), orderConfig.curveCuts); + + vm.warp(vm.parseUint(vm.parseJsonString(testdata, ".currentTime"))); + + // update oracle + res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.eth")); + res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.dai")); + + uint256 amount = 15000e8; + res.debt.mint(deployer, amount); + res.debt.approve(address(res.market), amount); + res.market.mint(deployer, amount); + res.ft.transfer(address(res.order), amount); + res.xt.transfer(address(res.order), amount); + + flashLoanReceiver = new MockFlashLoanReceiver(res.market); + flashRepayer = new MockFlashRepayerV2(res.gt); + + vm.stopPrank(); + } + + function testMintGtByIssueFt() public { + uint128 debtAmt = 100e8; + uint256 collateralAmt = 1e18; + res.collateral.mint(sender, collateralAmt); + + vm.startPrank(sender); + + res.collateral.approve(address(res.gt), collateralAmt); + bytes memory collateralData = abi.encode(collateralAmt); + + StateChecker.MarketState memory state = StateChecker.getMarketState(res); + + uint256 issueFee = (debtAmt * res.market.mintGtFeeRatio()) / Constants.DECIMAL_BASE; + vm.expectEmit(); + emit MarketEvents.IssueFt( + sender, sender, 1, debtAmt, uint128(debtAmt - issueFee), uint128(issueFee), collateralData + ); + + (uint256 gtId, uint128 ftOutAmt) = res.market.issueFt(sender, debtAmt, collateralData); + + assert(ftOutAmt == (debtAmt - issueFee)); + assert(gtId == 1); + + state.collateralReserve += collateralAmt; + StateChecker.checkMarketState(res, state); + + assert(res.ft.balanceOf(marketConfig.treasurer) == issueFee); + assert(res.ft.balanceOf(sender) == ftOutAmt); + + (address owner, uint128 d, bytes memory cd) = res.gt.loanInfo(gtId); + assert(owner == sender); + assert(d == debtAmt); + assert(collateralAmt == abi.decode(cd, (uint256))); + (, uint128 ltv,) = res.gt.getLiquidationInfo(gtId); + assert(LoanUtils.calcLtv(res, debtAmt, collateralAmt) == ltv); + + vm.stopPrank(); + } + + function testMintGtByLeverage() public { + vm.startPrank(sender); + uint256 collateralAmt = 1e18; + bytes memory callbackData = abi.encode(sender, collateralAmt); + res.collateral.mint(address(flashLoanReceiver), collateralAmt); + + uint128 xtAmt = 90e8; + uint256 debtAmt = xtAmt * Constants.DECIMAL_BASE / (Constants.DECIMAL_BASE - res.market.mintGtFeeRatio()); + + uint128 debtAmtInForBuyXt = 5e8; + uint128 minXTOut = 0e8; + res.debt.mint(sender, debtAmtInForBuyXt); + res.debt.approve(address(res.order), debtAmtInForBuyXt); + res.order.swapExactTokenToToken( + res.debt, res.xt, sender, debtAmtInForBuyXt, minXTOut, block.timestamp + 1 hours + ); + StateChecker.MarketState memory state = StateChecker.getMarketState(res); + uint256 xtBefore = res.xt.balanceOf(address(sender)); + + res.xt.approve(address(flashLoanReceiver), xtAmt); + + vm.expectEmit(); + emit MarketEvents.LeverageByXt( + address(flashLoanReceiver), + sender, + 1, + uint128(debtAmt), + xtAmt, + uint128(debtAmt - xtAmt), + abi.encode(collateralAmt) + ); + uint256 gtId = flashLoanReceiver.leverageByXt(xtAmt, callbackData); + + assert(gtId == 1); + state.collateralReserve += collateralAmt; + state.debtReserve -= xtAmt; + StateChecker.checkMarketState(res, state); + + uint256 xtAfter = res.xt.balanceOf(address(sender)); + assert(xtBefore - xtAfter == xtAmt); + + (address owner, uint128 d, bytes memory cd) = res.gt.loanInfo(gtId); + assert(owner == sender); + assert(d == debtAmt); + assert(collateralAmt == abi.decode(cd, (uint256))); + + vm.stopPrank(); + } + + function testMintGtWhenOracleOutdated() public { + uint128 debtAmt = 1000e8; + uint256 collateralAmt = 1e18; + res.collateral.mint(sender, collateralAmt); + + vm.prank(deployer); + res.oracle.submitPendingOracle( + address(res.collateral), IOracleV2.Oracle(res.collateralOracle, res.collateralOracle, 0, 3600, 3600) + ); + res.oracle.acceptPendingOracle(address(res.collateral)); + vm.warp(block.timestamp + 3600); + + vm.startPrank(sender); + res.collateral.approve(address(res.gt), collateralAmt); + bytes memory collateralData = abi.encode(collateralAmt); + + vm.expectRevert(abi.encodeWithSelector(IOracleV2.OracleIsNotWorking.selector, address(res.collateral))); + res.market.issueFt(sender, debtAmt, collateralData); + + vm.stopPrank(); + + vm.startPrank(deployer); + res.oracle.submitPendingOracle( + address(res.collateral), IOracleV2.Oracle(res.collateralOracle, res.collateralOracle, 0, 365 days, 0) + ); + res.oracle.acceptPendingOracle(address(res.collateral)); + vm.stopPrank(); + + vm.startPrank(sender); + res.collateral.approve(address(res.gt), collateralAmt); + res.market.issueFt(sender, debtAmt, collateralData); + + vm.stopPrank(); + } + + function testRevertByGtIsNotHealthyWhenIssueFt() public { + // debt 1790 USD collaretal 2000USD ltv 0.891 + uint128 debtAmt = 1790e8; + uint256 collateralAmt = 1e18; + res.collateral.mint(sender, collateralAmt); + + vm.startPrank(sender); + + res.collateral.approve(address(res.gt), collateralAmt); + bytes memory collateralData = abi.encode(collateralAmt); + + vm.expectRevert( + abi.encodeWithSelector( + GearingTokenErrors.GtIsNotHealthy.selector, 0, sender, LoanUtils.calcLtv(res, debtAmt, collateralAmt) + ) + ); + res.market.issueFt(sender, debtAmt, collateralData); + + vm.stopPrank(); + } + + function testRevertByGtIsNotHealthyWhenCollateralCloseZero() public { + // debt 5 USD collaretal 2e-7 USD + uint128 debtAmt = 5e8; + uint256 collateralAmt = 1; + res.collateral.mint(sender, collateralAmt); + + vm.startPrank(sender); + + res.collateral.approve(address(res.gt), collateralAmt); + bytes memory collateralData = abi.encode(collateralAmt); + + vm.expectRevert( + abi.encodeWithSelector( + GearingTokenErrors.GtIsNotHealthy.selector, 0, sender, LoanUtils.calcLtv(res, debtAmt, collateralAmt) + ) + ); + res.market.issueFt(sender, debtAmt, collateralData); + + vm.stopPrank(); + } + + function testRevertByGtIsNotHealthyWhenLeverage() public { + vm.startPrank(sender); + uint256 collateralAmt = 0.001e18; + bytes memory callbackData = abi.encode(sender, collateralAmt); + res.collateral.mint(address(flashLoanReceiver), collateralAmt); + + uint128 xtAmt = 90e8; + uint256 debtAmt = xtAmt * Constants.DECIMAL_BASE / (Constants.DECIMAL_BASE - res.market.mintGtFeeRatio()); + + uint128 debtAmtInForBuyXt = 5e8; + uint128 minXTOut = 0e8; + res.debt.mint(sender, debtAmtInForBuyXt); + res.debt.approve(address(res.order), debtAmtInForBuyXt); + res.order.swapExactTokenToToken( + res.debt, res.xt, sender, debtAmtInForBuyXt, minXTOut, block.timestamp + 1 hours + ); + + res.xt.approve(address(flashLoanReceiver), xtAmt); + + vm.expectRevert( + abi.encodeWithSelector( + GearingTokenErrors.GtIsNotHealthy.selector, 0, sender, LoanUtils.calcLtv(res, debtAmt, collateralAmt) + ) + ); + flashLoanReceiver.leverageByXt(xtAmt, callbackData); + + vm.stopPrank(); + } + + function testReapyByDebtToken() public { + uint128 debtAmt = 100e8; + uint256 collateralAmt = 1e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + + res.debt.mint(sender, debtAmt); + + res.debt.approve(address(res.gt), debtAmt); + uint256 collateralBalanceBefore = res.collateral.balanceOf(sender); + uint256 debtBalanceBefore = res.debt.balanceOf(sender); + StateChecker.MarketState memory state = StateChecker.getMarketState(res); + bool byDebtToken = true; + vm.expectEmit(); + emit GearingTokenEventsV2.Repay(gtId, debtAmt, byDebtToken, true); + res.gt.repay(gtId, debtAmt, byDebtToken); + + uint256 collateralBalanceAfter = res.collateral.balanceOf(sender); + uint256 debtBalanceAfter = res.debt.balanceOf(sender); + state.debtReserve += debtAmt; + state.collateralReserve -= collateralAmt; + StateChecker.checkMarketState(res, state); + + assert(collateralBalanceAfter - collateralBalanceBefore == collateralAmt); + assert(debtBalanceAfter + debtAmt == debtBalanceBefore); + vm.expectRevert(abi.encodePacked(bytes4(keccak256("ERC721NonexistentToken(uint256)")), gtId)); + res.gt.loanInfo(gtId); + + vm.stopPrank(); + } + + function testReapyByFt() public { + uint128 debtAmt = 100e8; + uint256 collateralAmt = 1e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + + // get FT token + uint128 debtAmtInForBuyFt = 100e8; + uint128 minFTOut = 0e8; + res.debt.mint(sender, debtAmtInForBuyFt); + res.debt.approve(address(res.order), debtAmtInForBuyFt); + res.order.swapExactTokenToToken( + res.debt, res.ft, sender, debtAmtInForBuyFt, minFTOut, block.timestamp + 1 hours + ); + + uint256 collateralBalanceBefore = res.collateral.balanceOf(sender); + uint256 ftBalanceBefore = res.ft.balanceOf(sender); + uint256 ftInMarketBefore = res.ft.balanceOf(address(res.market)); + StateChecker.MarketState memory state = StateChecker.getMarketState(res); + + res.ft.approve(address(res.gt), debtAmt); + + bool byDebtToken = false; + vm.expectEmit(); + emit GearingTokenEventsV2.Repay(gtId, debtAmt, byDebtToken, true); + res.gt.repay(gtId, debtAmt, byDebtToken); + + uint256 collateralBalanceAfter = res.collateral.balanceOf(sender); + uint256 ftBalanceAfter = res.ft.balanceOf(sender); + uint256 ftInMarketAfter = res.ft.balanceOf(address(res.market)); + state.collateralReserve -= collateralAmt; + StateChecker.checkMarketState(res, state); + assert(ftInMarketAfter - debtAmt == ftInMarketBefore); + assert(collateralBalanceAfter - collateralBalanceBefore == collateralAmt); + assert(ftBalanceAfter + debtAmt == ftBalanceBefore); + vm.expectRevert(abi.encodePacked(bytes4(keccak256("ERC721NonexistentToken(uint256)")), gtId)); + res.gt.loanInfo(gtId); + + vm.stopPrank(); + } + + function testPatriallyReapy() public { + uint128 debtAmt = 100e8; + uint128 repayAmt = 10e8; + uint256 collateralAmt = 1e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.stopPrank(); + // Repay repayAmt + address thirdPeople = vm.randomAddress(); + res.debt.mint(thirdPeople, debtAmt); + // Repay repayAmt + vm.startPrank(thirdPeople); + res.debt.approve(address(res.gt), debtAmt); + StateChecker.MarketState memory state = StateChecker.getMarketState(res); + + bool byDebtToken = true; + vm.expectEmit(); + emit GearingTokenEventsV2.Repay(gtId, repayAmt, byDebtToken, false); + res.gt.repay(gtId, repayAmt, byDebtToken); + state.debtReserve += repayAmt; + StateChecker.checkMarketState(res, state); + assert(res.debt.balanceOf(thirdPeople) == debtAmt - repayAmt); + assert(res.collateral.balanceOf(thirdPeople) == 0); + + (address owner, uint128 d, bytes memory cd) = res.gt.loanInfo(gtId); + assert(owner == sender); + assert(d == debtAmt - repayAmt); + assert(collateralAmt == abi.decode(cd, (uint256))); + + // Repay all + uint256 debtBalanceBefore = res.debt.balanceOf(sender); + uint256 collateralBalanceBefore = res.collateral.balanceOf(sender); + + vm.expectEmit(); + emit GearingTokenEventsV2.Repay(gtId, debtAmt - repayAmt, byDebtToken, true); + res.gt.repay(gtId, debtAmt - repayAmt, byDebtToken); + + state.debtReserve += (debtAmt - repayAmt); + state.collateralReserve -= collateralAmt; + uint256 collateralBalanceAfter = res.collateral.balanceOf(sender); + uint256 debtBalanceAfter = res.debt.balanceOf(sender); + StateChecker.checkMarketState(res, state); + + assert(collateralBalanceAfter - collateralBalanceBefore == collateralAmt); + assert(debtBalanceAfter == debtBalanceBefore); + assert(res.debt.balanceOf(thirdPeople) == 0); + assert(res.collateral.balanceOf(thirdPeople) == 0); + + vm.expectRevert(abi.encodePacked(bytes4(keccak256("ERC721NonexistentToken(uint256)")), gtId)); + res.gt.loanInfo(gtId); + + vm.stopPrank(); + } + + function testFlashRepay() public { + uint128 debtAmt = 100e8; + uint256 collateralAmt = 1e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + + res.debt.mint(address(flashRepayer), debtAmt); + res.gt.approve(address(flashRepayer), gtId); + + uint256 removedCollateral = 0.5e18; + uint128 repayAmt = 50e8; + uint256 collateralBalanceBefore = res.collateral.balanceOf(sender); + uint256 debtBalanceBefore = res.debt.balanceOf(sender); + StateChecker.MarketState memory state = StateChecker.getMarketState(res); + bool byDebtToken = true; + vm.expectEmit(); + emit GearingTokenEventsV2.FlashRepay( + gtId, address(flashRepayer), repayAmt, byDebtToken, false, abi.encode(removedCollateral) + ); + flashRepayer.flashRepay(gtId, repayAmt, byDebtToken, abi.encode(removedCollateral)); + + uint256 collateralBalanceAfter = res.collateral.balanceOf(sender); + uint256 debtBalanceAfter = res.debt.balanceOf(sender); + state.debtReserve += repayAmt; + state.collateralReserve -= removedCollateral; + StateChecker.checkMarketState(res, state); + + assertEq(res.collateral.balanceOf(address(flashRepayer)), removedCollateral, "flashRepayer collateral balance"); + assertEq(res.debt.balanceOf(address(flashRepayer)), repayAmt, "flashRepayer debt balance"); + assertEq(collateralBalanceAfter, collateralBalanceBefore, "sender collateral balance"); + assertEq(debtBalanceAfter, debtBalanceBefore, "sender debt balance"); + (address owner, uint128 currentDebt, bytes memory currentCollateral) = res.gt.loanInfo(gtId); + assertEq(owner, sender, "gt owner"); + assertEq(currentDebt, debtAmt - repayAmt, "current debt after repayment"); + assertEq( + collateralAmt - removedCollateral, + abi.decode(currentCollateral, (uint256)), + "current collateral after repayment" + ); + + res.gt.approve(address(flashRepayer), gtId); + flashRepayer.flashRepay(gtId, currentDebt, byDebtToken, currentCollateral); + vm.expectRevert(abi.encodePacked(bytes4(keccak256("ERC721NonexistentToken(uint256)")), gtId)); + res.gt.loanInfo(gtId); + vm.stopPrank(); + } + + function testRevertByGtIsNotHealthyWhenFlashRepay() public { + uint128 debtAmt = 100e8; + uint256 collateralAmt = 1e18; + uint128 repayAmt = 50e8; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + res.debt.mint(address(flashRepayer), debtAmt); + res.gt.approve(address(flashRepayer), gtId); + + vm.expectRevert( + abi.encodeWithSelector( + GearingTokenErrors.GtIsNotHealthy.selector, gtId, address(flashRepayer), type(uint128).max + ) + ); + flashRepayer.flashRepay(gtId, repayAmt, true, abi.encode(collateralAmt)); + } + + // function testFlashRepayThroughFt() public { + // uint128 debtAmt = 100e8; + // uint256 collateralAmt = 1e18; + + // vm.startPrank(sender); + + // (uint256 gtId, ) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + // deal(address(res.ft), address(flashRepayer), debtAmt); + + // res.gt.approve(address(flashRepayer), gtId); + + // uint collateralBalanceBefore = res.collateral.balanceOf(sender); + // uint ftBalanceBefore = res.ft.balanceOf(sender); + // StateChecker.MarketState memory state = StateChecker.getMarketState(res); + // bool byDebtToken = false; + // vm.expectEmit(); + // emit GearingTokenEvents.Repay(gtId, debtAmt, byDebtToken); + // flashRepayer.flashRepay(gtId, byDebtToken); + + // uint collateralBalanceAfter = res.collateral.balanceOf(sender); + // uint ftBalanceAfter = res.ft.balanceOf(sender); + // state.ftReserve += debtAmt; + // state.collateralReserve -= collateralAmt; + // StateChecker.checkMarketState(res, state); + + // assert(res.collateral.balanceOf(address(flashRepayer)) == collateralAmt); + // assert(res.debt.balanceOf(address(flashRepayer)) == 0); + // assert(collateralBalanceAfter == collateralBalanceBefore); + // assert(ftBalanceAfter == ftBalanceBefore); + // vm.expectRevert(abi.encodePacked(bytes4(keccak256("ERC721NonexistentToken(uint256)")), gtId)); + // res.gt.loanInfo(gtId); + + // vm.stopPrank(); + // } + + function testRevertByGtIsExpiredWhenRepay() public { + uint128 debtAmt = 100e8; + uint256 collateralAmt = 1e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.warp(marketConfig.maturity); + res.debt.mint(sender, debtAmt); + + res.debt.approve(address(res.gt), debtAmt); + + vm.expectRevert(abi.encodeWithSelector(GearingTokenErrors.GtIsExpired.selector, gtId)); + res.gt.repay(gtId, debtAmt, true); + + vm.stopPrank(); + } + + function testRevertByGtIsExpiredWhenFlashRepay() public { + uint128 debtAmt = 100e8; + uint256 collateralAmt = 1e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.warp(marketConfig.maturity); + res.debt.mint(address(flashRepayer), debtAmt); + res.gt.approve(address(flashRepayer), gtId); + + vm.expectRevert(abi.encodeWithSelector(GearingTokenErrors.GtIsExpired.selector, gtId)); + flashRepayer.flashRepay(gtId, debtAmt, true, abi.encode(collateralAmt)); + } + + function testMerge() public { + uint40[3] memory debts = [100e8, 30e8, 5e8]; + uint64[3] memory collaterals = [1e18, 0.5e18, 0.05e18]; + + vm.startPrank(sender); + + uint256[] memory ids = new uint256[](3); + for (uint256 i = 0; i < ids.length; ++i) { + (ids[i],) = LoanUtils.fastMintGt(res, sender, debts[i], collaterals[i]); + } + StateChecker.MarketState memory state = StateChecker.getMarketState(res); + + vm.expectEmit(); + uint256 newId = 4; + emit GearingTokenEvents.MergeGts(sender, newId, ids); + newId = res.gt.merge(ids); + StateChecker.checkMarketState(res, state); + + (address owner, uint128 d, bytes memory cd) = res.gt.loanInfo(newId); + assert(owner == sender); + assert(d == debts[0] + debts[1] + debts[2]); + assert(collaterals[0] + collaterals[1] + collaterals[2] == abi.decode(cd, (uint256))); + for (uint256 i = 0; i < ids.length; i++) { + vm.expectRevert(abi.encodePacked(bytes4(keccak256("ERC721NonexistentToken(uint256)")), ids[i])); + res.gt.loanInfo(ids[i]); + } + + vm.stopPrank(); + } + + function testRevertByCanNotMergeLoanWithDiffOwnerWhenMerge() public { + uint40[3] memory debts = [100e8, 30e8, 5e8]; + uint64[3] memory collaterals = [1e18, 0.5e18, 0.005e18]; + + vm.startPrank(sender); + + uint256[] memory ids = new uint256[](3); + for (uint256 i = 0; i < ids.length; ++i) { + (ids[i],) = LoanUtils.fastMintGt(res, sender, debts[i], collaterals[i]); + } + vm.stopPrank(); + vm.prank(vm.randomAddress()); + vm.expectRevert( + abi.encodeWithSelector(GearingTokenErrors.CanNotMergeLoanWithDiffOwner.selector, ids[0], sender) + ); + res.gt.merge(ids); + } + + function testAddCollateral() public { + uint128 debtAmt = 1700e8; + uint256 collateralAmt = 1e18; + uint256 addedCollateral = 0.1e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.stopPrank(); + // Add collateral by third address + address thirdPeople = vm.randomAddress(); + res.collateral.mint(thirdPeople, addedCollateral); + vm.startPrank(thirdPeople); + + res.collateral.approve(address(res.gt), addedCollateral); + + StateChecker.MarketState memory state = StateChecker.getMarketState(res); + + vm.expectEmit(); + emit GearingTokenEvents.AddCollateral(gtId, abi.encode(collateralAmt + addedCollateral)); + res.gt.addCollateral(gtId, abi.encode(addedCollateral)); + + state.collateralReserve += addedCollateral; + StateChecker.checkMarketState(res, state); + assert(res.debt.balanceOf(thirdPeople) == 0); + assert(res.collateral.balanceOf(thirdPeople) == 0); + + (address owner, uint128 d, bytes memory cd) = res.gt.loanInfo(gtId); + assert(owner == sender); + assert(d == debtAmt); + assert(collateralAmt + addedCollateral == abi.decode(cd, (uint256))); + + // Add collateral by self + vm.startPrank(sender); + + res.collateral.mint(sender, addedCollateral); + res.collateral.approve(address(res.gt), addedCollateral); + + res.gt.addCollateral(gtId, abi.encode(addedCollateral)); + vm.stopPrank(); + } + + function testRevertByGtIsExpiredWhenAddCollateral() public { + uint128 debtAmt = 100e8; + uint256 collateralAmt = 1e18; + uint256 addedCollateral = 0.1e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + + vm.stopPrank(); + + address thirdPeople = vm.randomAddress(); + vm.warp(marketConfig.maturity); + res.collateral.mint(thirdPeople, addedCollateral); + + vm.startPrank(thirdPeople); + res.collateral.approve(address(res.gt), addedCollateral); + + vm.expectRevert(abi.encodeWithSelector(GearingTokenErrors.GtIsExpired.selector, gtId)); + + res.gt.addCollateral(gtId, abi.encode(addedCollateral)); + vm.stopPrank(); + } + + function testRemoveCollateral() public { + uint128 debtAmt = 100e8; + uint256 collateralAmt = 1e18; + uint256 removedCollateral = 0.1e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + + StateChecker.MarketState memory state = StateChecker.getMarketState(res); + uint256 collateralBlanceBefore = res.collateral.balanceOf(sender); + + vm.expectEmit(); + emit GearingTokenEvents.RemoveCollateral(gtId, abi.encode(collateralAmt - removedCollateral)); + res.gt.removeCollateral(gtId, abi.encode(removedCollateral)); + + state.collateralReserve -= removedCollateral; + StateChecker.checkMarketState(res, state); + + uint256 collateralBlanceAfter = res.collateral.balanceOf(sender); + + assert(collateralBlanceAfter - collateralBlanceBefore == removedCollateral); + + (address owner, uint128 d, bytes memory cd) = res.gt.loanInfo(gtId); + assert(owner == sender); + assert(d == debtAmt); + assert(collateralAmt - removedCollateral == abi.decode(cd, (uint256))); + + vm.stopPrank(); + } + + function testRemoveCollateralWhenOracleOutdated() public { + // debt 100 USD collaretal 2200USD + uint128 debtAmt = 100e8; + uint256 collateralAmt = 1.1e18; + uint256 removedCollateral = 0.1e18; + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.stopPrank(); + + vm.prank(deployer); + res.oracle.submitPendingOracle( + address(res.collateral), IOracleV2.Oracle(res.collateralOracle, res.collateralOracle, 0, 3500, 3500) + ); + vm.prank(deployer); + res.oracle.acceptPendingOracle(address(res.collateral)); + vm.warp(block.timestamp + 3600); + + vm.expectRevert(abi.encodeWithSelector(IOracleV2.OracleIsNotWorking.selector, address(res.collateral))); + vm.prank(sender); + res.gt.removeCollateral(gtId, abi.encode(removedCollateral)); + + vm.prank(deployer); + res.oracle.submitPendingOracle( + address(res.collateral), IOracleV2.Oracle(res.collateralOracle, res.collateralOracle, 0, 0, 0) + ); + vm.prank(deployer); + res.oracle.acceptPendingOracle(address(res.collateral)); + + vm.prank(sender); + res.gt.removeCollateral(gtId, abi.encode(removedCollateral)); + } + + function testRevertByGtIsNotHealthyWhenRemoveCollateral() public { + // debt 1780 USD collaretal 2200USD + uint128 debtAmt = 1790e8; + uint256 collateralAmt = 1.1e18; + uint256 removedCollateral = 0.1e18; + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + + vm.expectRevert( + abi.encodeWithSelector( + GearingTokenErrors.GtIsNotHealthy.selector, + gtId, + sender, + LoanUtils.calcLtv(res, debtAmt, collateralAmt - removedCollateral) + ) + ); + res.gt.removeCollateral(gtId, abi.encode(removedCollateral)); + + vm.stopPrank(); + } + + function testRevertByCallerIsNotTheOwnerWhenRemoveCollateral() public { + // debt 1780 USD collaretal 2200USD + uint128 debtAmt = 1780e8; + uint256 collateralAmt = 1.1e18; + uint256 removedCollateral = 0.1e18; + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.stopPrank(); + + address thirdPeople = vm.randomAddress(); + vm.expectRevert(abi.encodeWithSelector(GearingTokenErrors.CallerIsNotTheOwner.selector, gtId)); + vm.prank(thirdPeople); + res.gt.removeCollateral(gtId, abi.encode(removedCollateral)); + } + + function testRevertByGtIsExpiredWhenRemoveCollateral() public { + // debt 200 USD collaretal 2200USD + uint128 debtAmt = 200e8; + uint256 collateralAmt = 1.1e18; + uint256 removedCollateral = 0.1e18; + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + + vm.stopPrank(); + + vm.warp(marketConfig.maturity); + + vm.expectRevert(abi.encodeWithSelector(GearingTokenErrors.GtIsExpired.selector, gtId)); + vm.prank(sender); + res.gt.removeCollateral(gtId, abi.encode(removedCollateral)); + } + + // Case 1: removed collateral can not cover repayAmt + rewardToLiquidator + function testLiquidateCase1() public { + uint128 debtAmt = 1000e8; + uint256 collateralAmt = 1e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.stopPrank(); + vm.startPrank(deployer); + // update oracle + res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth")); + res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.dai")); + vm.stopPrank(); + address liquidator = vm.randomAddress(); + vm.startPrank(liquidator); + + res.debt.mint(liquidator, debtAmt); + res.debt.approve(address(res.gt), debtAmt); + + uint256 senderCBalanceBefore = res.collateral.balanceOf(sender); + StateChecker.MarketState memory state = StateChecker.getMarketState(res); + + vm.expectEmit(); + uint256 cToLiquidator = collateralAmt; + uint256 cToTreasurer = 0; + uint256 remainningC = 0; + emit GearingTokenEvents.Liquidate( + gtId, + liquidator, + debtAmt, + true, + abi.encode(cToLiquidator), + abi.encode(cToTreasurer), + abi.encode(remainningC) + ); + + res.gt.liquidate(gtId, debtAmt, true); + state.collateralReserve -= collateralAmt; + state.debtReserve += debtAmt; + StateChecker.checkMarketState(res, state); + + assert(res.collateral.balanceOf(marketConfig.treasurer) == cToTreasurer); + assert(res.collateral.balanceOf(liquidator) == cToLiquidator); + assert(res.collateral.balanceOf(sender) == remainningC + senderCBalanceBefore); + vm.stopPrank(); + } + + // Case 2: removed collateral can cover repayAmt + rewardToLiquidator but not rewardToProtocol + function testLiquidateCase2() public { + uint128 debtAmt = 950e8; + uint256 collateralAmt = 1e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.stopPrank(); + vm.startPrank(deployer); + // update oracle + res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth")); + res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.dai")); + vm.stopPrank(); + address liquidator = vm.randomAddress(); + vm.startPrank(liquidator); + + res.debt.mint(liquidator, debtAmt); + res.debt.approve(address(res.gt), debtAmt); + + uint256 senderCBalanceBefore = res.collateral.balanceOf(sender); + StateChecker.MarketState memory state = StateChecker.getMarketState(res); + + vm.expectEmit(); + // uint cToLiquidator = 0.9975e18; + // uint cToTreasurer = 0.0025e18; + // uint remainningC = 0; + (uint256 cToLiquidator, uint256 cToTreasurer, uint256 remainningC) = + LoanUtils.calcLiquidationResult(res, debtAmt, collateralAmt, debtAmt); + emit GearingTokenEvents.Liquidate( + gtId, + liquidator, + debtAmt, + true, + abi.encode(cToLiquidator), + abi.encode(cToTreasurer), + abi.encode(remainningC) + ); + + res.gt.liquidate(gtId, debtAmt, true); + state.collateralReserve -= collateralAmt; + state.debtReserve += debtAmt; + StateChecker.checkMarketState(res, state); + + assert(res.collateral.balanceOf(marketConfig.treasurer) == cToTreasurer); + assert(res.collateral.balanceOf(liquidator) == cToLiquidator); + assert(res.collateral.balanceOf(sender) == remainningC + senderCBalanceBefore); + vm.stopPrank(); + } + + // Case 3: removed collateral equal repayAmt + rewardToLiquidator + rewardToProtocol + function testLiquidateCase3() public { + uint128 debtAmt = 900e8; + uint256 collateralAmt = 1e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.stopPrank(); + vm.startPrank(deployer); + // update oracle + res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth")); + res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.dai")); + vm.stopPrank(); + address liquidator = vm.randomAddress(); + vm.startPrank(liquidator); + + res.debt.mint(liquidator, debtAmt); + res.debt.approve(address(res.gt), debtAmt); + + uint256 senderCBalanceBefore = res.collateral.balanceOf(sender); + StateChecker.MarketState memory state = StateChecker.getMarketState(res); + + vm.expectEmit(); + // uint cToLiquidator = 0.945e18; + // uint cToTreasurer = 0.045e18; + // uint remainningC = 0.01e18; + (uint256 cToLiquidator, uint256 cToTreasurer, uint256 remainningC) = + LoanUtils.calcLiquidationResult(res, debtAmt, collateralAmt, debtAmt); + emit GearingTokenEvents.Liquidate( + gtId, + liquidator, + debtAmt, + true, + abi.encode(cToLiquidator), + abi.encode(cToTreasurer), + abi.encode(remainningC) + ); + + res.gt.liquidate(gtId, debtAmt, true); + state.collateralReserve -= collateralAmt; + state.debtReserve += debtAmt; + StateChecker.checkMarketState(res, state); + + assert(res.collateral.balanceOf(marketConfig.treasurer) == cToTreasurer); + assert(res.collateral.balanceOf(liquidator) == cToLiquidator); + assert(res.collateral.balanceOf(sender) == remainningC + senderCBalanceBefore); + vm.stopPrank(); + } + + function testLiquidateByFt() public { + uint128 debtAmt = 1000e8; + uint256 collateralAmt = 1e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.stopPrank(); + vm.startPrank(deployer); + // update oracle + res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth")); + res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.dai")); + vm.stopPrank(); + address liquidator = vm.randomAddress(); + vm.startPrank(liquidator); + + res.debt.mint(liquidator, debtAmt); + res.debt.approve(address(res.market), debtAmt); + res.market.mint(liquidator, debtAmt); + res.ft.approve(address(res.gt), debtAmt); + + uint256 senderCBalanceBefore = res.collateral.balanceOf(sender); + StateChecker.MarketState memory state = StateChecker.getMarketState(res); + + vm.expectEmit(); + uint256 cToLiquidator = collateralAmt; + uint256 cToTreasurer = 0; + uint256 remainningC = 0; + emit GearingTokenEvents.Liquidate( + gtId, + liquidator, + debtAmt, + false, + abi.encode(cToLiquidator), + abi.encode(cToTreasurer), + abi.encode(remainningC) + ); + + res.gt.liquidate(gtId, debtAmt, false); + state.collateralReserve -= collateralAmt; + StateChecker.checkMarketState(res, state); + + assert(res.ft.balanceOf(address(res.market)) == debtAmt); + assert(res.collateral.balanceOf(marketConfig.treasurer) == cToTreasurer); + assert(res.collateral.balanceOf(liquidator) == cToLiquidator); + assert(res.collateral.balanceOf(sender) == remainningC + senderCBalanceBefore); + vm.stopPrank(); + } + + function testRemovedCollateralLessThanRepayAmt() public { + uint128 debtAmt = 900e8; + uint256 collateralAmt = 0.93e18; + uint128 repayAmt = 300e8; + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.stopPrank(); + vm.startPrank(deployer); + // update oracle + res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth")); + res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.dai")); + vm.stopPrank(); + address liquidator = vm.randomAddress(); + vm.startPrank(liquidator); + + res.debt.mint(liquidator, repayAmt); + res.debt.approve(address(res.gt), repayAmt); + + uint256 senderCBalanceBefore = res.collateral.balanceOf(sender); + StateChecker.MarketState memory state = StateChecker.getMarketState(res); + + vm.expectEmit(); + // uint cToLiquidator = 0.31e18; + // uint cToTreasurer = 0; + // uint remainningC = 0.62e18; + (uint256 cToLiquidator, uint256 cToTreasurer, uint256 remainningC) = + LoanUtils.calcLiquidationResult(res, debtAmt, collateralAmt, repayAmt); + emit GearingTokenEvents.Liquidate( + gtId, + liquidator, + repayAmt, + true, + abi.encode(cToLiquidator), + abi.encode(cToTreasurer), + abi.encode(remainningC) + ); + + res.gt.liquidate(gtId, repayAmt, true); + state.collateralReserve -= (cToLiquidator + cToTreasurer); + state.debtReserve += repayAmt; + StateChecker.checkMarketState(res, state); + + assert(res.collateral.balanceOf(marketConfig.treasurer) == cToTreasurer); + assert(res.collateral.balanceOf(liquidator) == cToLiquidator); + assert(res.collateral.balanceOf(sender) == senderCBalanceBefore); + vm.stopPrank(); + } + + function testHalfLiquidate() public { + uint128 debtAmt = 9000e8; + uint256 collateralAmt = 10e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.stopPrank(); + vm.startPrank(deployer); + // update oracle + res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth")); + res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.dai")); + vm.stopPrank(); + (bool isLiquidable,, uint128 maxRepayAmt) = res.gt.getLiquidationInfo(gtId); + assert(isLiquidable); + assert(maxRepayAmt == debtAmt / 2); + address liquidator = vm.randomAddress(); + vm.startPrank(liquidator); + + res.debt.mint(liquidator, maxRepayAmt); + res.debt.approve(address(res.gt), maxRepayAmt); + + uint256 senderCBalanceBefore = res.collateral.balanceOf(sender); + StateChecker.MarketState memory state = StateChecker.getMarketState(res); + + vm.expectEmit(); + // uint cToLiquidator = 4.725e18; + // uint cToTreasurer = 0.225e18; + // uint remainningC = 5.05e18; + (uint256 cToLiquidator, uint256 cToTreasurer, uint256 remainningC) = + LoanUtils.calcLiquidationResult(res, debtAmt, collateralAmt, maxRepayAmt); + emit GearingTokenEvents.Liquidate( + gtId, + liquidator, + maxRepayAmt, + true, + abi.encode(cToLiquidator), + abi.encode(cToTreasurer), + abi.encode(remainningC) + ); + + res.gt.liquidate(gtId, maxRepayAmt, true); + state.collateralReserve -= (cToLiquidator + cToTreasurer); + state.debtReserve += maxRepayAmt; + StateChecker.checkMarketState(res, state); + + assert(res.collateral.balanceOf(marketConfig.treasurer) == cToTreasurer); + assert(res.collateral.balanceOf(liquidator) == cToLiquidator); + assert(res.collateral.balanceOf(sender) == senderCBalanceBefore); + vm.stopPrank(); + + (address owner, uint128 newDebtAmt, bytes memory collateralData) = res.gt.loanInfo(gtId); + assert(owner == sender); + assert(newDebtAmt == debtAmt - maxRepayAmt); + + assert(remainningC == abi.decode(collateralData, (uint256))); + uint128 ltv; + (isLiquidable, ltv, maxRepayAmt) = res.gt.getLiquidationInfo(gtId); + assert(ltv < liquidationLtv); + assert(!isLiquidable); + assert(maxRepayAmt == 0); + } + + function testLiquidateInWindowTime(uint16 exceedTime) public { + vm.assume(exceedTime < Constants.LIQUIDATION_WINDOW); + uint256 liquidateTime = marketConfig.maturity + exceedTime; + uint128 debtAmt = 1000e8; + uint256 collateralAmt = 1e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.stopPrank(); + vm.startPrank(deployer); + // update oracle + res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth")); + res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.dai")); + vm.stopPrank(); + + vm.warp(liquidateTime); + address liquidator = vm.randomAddress(); + vm.startPrank(liquidator); + + res.debt.mint(liquidator, debtAmt); + res.debt.approve(address(res.gt), debtAmt); + + uint256 senderCBalanceBefore = res.collateral.balanceOf(sender); + StateChecker.MarketState memory state = StateChecker.getMarketState(res); + + vm.expectEmit(); + uint256 cToLiquidator = collateralAmt; + uint256 cToTreasurer = 0; + uint256 remainningC = 0; + emit GearingTokenEvents.Liquidate( + gtId, + liquidator, + debtAmt, + true, + abi.encode(cToLiquidator), + abi.encode(cToTreasurer), + abi.encode(remainningC) + ); + + res.gt.liquidate(gtId, debtAmt, true); + state.collateralReserve -= collateralAmt; + state.debtReserve += debtAmt; + StateChecker.checkMarketState(res, state); + + assert(res.collateral.balanceOf(marketConfig.treasurer) == cToTreasurer); + assert(res.collateral.balanceOf(liquidator) == cToLiquidator); + assert(res.collateral.balanceOf(sender) == remainningC + senderCBalanceBefore); + vm.stopPrank(); + } + + function testLiquidatable() public { + uint128 debtAmt = 10000e8; + uint256 collateralAmt = 10e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.stopPrank(); + vm.startPrank(deployer); + // update oracle + res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth")); + res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.dai")); + vm.stopPrank(); + + vm.warp(marketConfig.maturity - 1); + (bool isLiquidable,, uint128 maxRepayAmt) = res.gt.getLiquidationInfo(gtId); + assert(isLiquidable); + assert(maxRepayAmt == debtAmt / 2); + + vm.warp(marketConfig.maturity); + (isLiquidable,, maxRepayAmt) = res.gt.getLiquidationInfo(gtId); + assert(isLiquidable); + assert(maxRepayAmt == debtAmt); + + vm.warp(marketConfig.maturity + Constants.LIQUIDATION_WINDOW); + (isLiquidable,, maxRepayAmt) = res.gt.getLiquidationInfo(gtId); + assert(!isLiquidable); + assert(maxRepayAmt == 0); + } + + function testLiquidateWithDecimalsExceed8() public { + uint128 debtAmt = 1e8; + uint256 collateralAmt = 1.01e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.stopPrank(); + vm.startPrank(deployer); + // update oracle + MockPriceFeed.RoundData memory data = JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth"); + data.answer = 1e18; // eth price 1e8 + res.collateralOracle.updateRoundData(data); + data.answer = 1e8; // dai price 1e18 + res.debtOracle.updateRoundData(data); + vm.stopPrank(); + + vm.warp(marketConfig.maturity + 1); + + address liquidator = vm.randomAddress(); + vm.startPrank(liquidator); + + res.debt.mint(liquidator, debtAmt); + res.debt.approve(address(res.gt), debtAmt); + + uint256 senderCBalanceBefore = res.collateral.balanceOf(sender); + StateChecker.MarketState memory state = StateChecker.getMarketState(res); + + vm.expectEmit(); + (uint256 cToLiquidator, uint256 cToTreasurer, uint256 remainningC) = + LoanUtils.calcLiquidationResult(res, debtAmt, collateralAmt, debtAmt); + emit GearingTokenEvents.Liquidate( + gtId, + liquidator, + debtAmt, + true, + abi.encode(cToLiquidator), + abi.encode(cToTreasurer), + abi.encode(remainningC) + ); + + res.gt.liquidate(gtId, debtAmt, true); + state.collateralReserve -= collateralAmt; + state.debtReserve += debtAmt; + StateChecker.checkMarketState(res, state); + + assert(res.collateral.balanceOf(marketConfig.treasurer) == cToTreasurer); + assert(res.collateral.balanceOf(liquidator) == cToLiquidator); + assert(res.collateral.balanceOf(sender) == remainningC + senderCBalanceBefore); + vm.stopPrank(); + } + + function testLiquidateWhenOracleOutdated() public { + uint128 debtAmt = 1000e8; + uint256 collateralAmt = 1e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.stopPrank(); + vm.startPrank(deployer); + MockPriceFeed.RoundData memory peth = JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth"); + MockPriceFeed.RoundData memory pdai = JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.dai"); + peth.updatedAt = block.timestamp - 1; + pdai.updatedAt = block.timestamp - 1; + res.collateralOracle.updateRoundData(peth); + res.debtOracle.updateRoundData(pdai); + + vm.stopPrank(); + + vm.prank(deployer); + res.oracle.submitPendingOracle( + address(res.collateral), IOracleV2.Oracle(res.collateralOracle, res.collateralOracle, 0, 3600, 3600) + ); + res.oracle.acceptPendingOracle(address(res.collateral)); + + vm.warp(block.timestamp + 3600); + address liquidator = vm.randomAddress(); + vm.startPrank(liquidator); + + res.debt.mint(liquidator, debtAmt); + res.debt.approve(address(res.gt), debtAmt); + + vm.expectRevert(abi.encodeWithSelector(IOracleV2.OracleIsNotWorking.selector, address(res.collateral))); + res.gt.liquidate(gtId, debtAmt, true); + + vm.stopPrank(); + vm.warp(block.timestamp - 1); + vm.prank(liquidator); + res.gt.liquidate(gtId, debtAmt, true); + } + + function testRevertByGtIsSafeWhenLiquidate() public { + uint128 debtAmt = 1000e8; + uint256 collateralAmt = 1e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.stopPrank(); + + address liquidator = vm.randomAddress(); + vm.startPrank(liquidator); + + res.debt.mint(liquidator, debtAmt); + res.debt.approve(address(res.gt), debtAmt); + + vm.expectRevert(abi.encodeWithSelector(GearingTokenErrors.GtIsSafe.selector, gtId)); + res.gt.liquidate(gtId, debtAmt, true); + + vm.stopPrank(); + } + + function testRevertByCanNotLiquidationAfterFinalDeadline() public { + uint256 liquidateTime = marketConfig.maturity + Constants.LIQUIDATION_WINDOW; + uint128 debtAmt = 1000e8; + uint256 collateralAmt = 1e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.stopPrank(); + vm.startPrank(deployer); + // update oracle + res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth")); + res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.dai")); + vm.stopPrank(); + + vm.warp(liquidateTime); + address liquidator = vm.randomAddress(); + vm.startPrank(liquidator); + + res.debt.mint(liquidator, debtAmt); + res.debt.approve(address(res.gt), debtAmt); + + vm.expectRevert( + abi.encodeWithSelector( + GearingTokenErrors.CanNotLiquidationAfterFinalDeadline.selector, + gtId, + marketConfig.maturity + Constants.LIQUIDATION_WINDOW + ) + ); + res.gt.liquidate(gtId, debtAmt, true); + } + + function testRevertByRepayAmtExceedsMaxRepayAmt() public { + uint128 debtAmt = 9000e8; + uint256 collateralAmt = 10e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.stopPrank(); + vm.startPrank(deployer); + // update oracle + res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth")); + res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.dai")); + vm.stopPrank(); + (bool isLiquidable,, uint128 maxRepayAmt) = res.gt.getLiquidationInfo(gtId); + assert(isLiquidable); + assert(maxRepayAmt == debtAmt / 2); + address liquidator = vm.randomAddress(); + vm.startPrank(liquidator); + + uint128 repayAmt = maxRepayAmt + 1; + res.debt.mint(liquidator, repayAmt); + res.debt.approve(address(res.gt), repayAmt); + + vm.expectRevert( + abi.encodeWithSelector(GearingTokenErrors.RepayAmtExceedsMaxRepayAmt.selector, gtId, repayAmt, maxRepayAmt) + ); + res.gt.liquidate(gtId, repayAmt, true); + + vm.stopPrank(); + } + + function testNoRevertByLtvIncreasedAfterLiquidation(uint128 repayAmt) public { + uint128 debtAmt = 900e8; + vm.assume(repayAmt >= 5e8 && repayAmt <= debtAmt - 5e8); + uint256 collateralAmt = 0.6e18; + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.stopPrank(); + vm.startPrank(deployer); + // update oracle + res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth")); + res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.dai")); + vm.stopPrank(); + address liquidator = vm.randomAddress(); + vm.startPrank(liquidator); + + res.debt.mint(liquidator, repayAmt); + res.debt.approve(address(res.gt), repayAmt); + + StateChecker.MarketState memory state = StateChecker.getMarketState(res); + (uint256 cToLiquidator, uint256 cToTreasurer, uint256 remainningC) = + LoanUtils.calcLiquidationResult(res, debtAmt, collateralAmt, repayAmt); + emit GearingTokenEvents.Liquidate( + gtId, + liquidator, + repayAmt, + true, + abi.encode(cToLiquidator), + abi.encode(cToTreasurer), + abi.encode(remainningC) + ); + res.gt.liquidate(gtId, repayAmt, true); + if (repayAmt < debtAmt) { + state.collateralReserve -= (cToLiquidator + cToTreasurer); + } else { + state.collateralReserve -= collateralAmt; + } + state.debtReserve += repayAmt; + StateChecker.checkMarketState(res, state); + + assert(res.collateral.balanceOf(marketConfig.treasurer) == cToTreasurer); + assert(res.collateral.balanceOf(liquidator) == cToLiquidator); + + vm.stopPrank(); + } + + function testFuzzMintGt(uint128 debtAmt, uint128 debtAmt2) public { + uint256 collateralAmt = 1e18; + vm.assume(debtAmt <= 1000e8); + vm.assume(debtAmt2 <= 600e8); + vm.startPrank(sender); + res.collateral.mint(sender, collateralAmt); + bytes memory collateralData = abi.encode(collateralAmt); + res.collateral.approve(address(res.gt), collateralAmt); + (uint256 gtId,) = res.market.issueFt(sender, debtAmt, collateralData); + + res.market.issueFtByExistedGt(sender, debtAmt2, gtId); + vm.stopPrank(); + } + + function testLiquidateZeroDebt() public { + uint256 collateralAmt = 1e18; + uint128 debtAmt = 0; + vm.startPrank(sender); + res.collateral.mint(sender, collateralAmt); + bytes memory collateralData = abi.encode(collateralAmt); + res.collateral.approve(address(res.gt), collateralAmt); + (uint256 gtId,) = res.market.issueFt(sender, debtAmt, collateralData); + vm.stopPrank(); + + address liquidator = vm.randomAddress(); + uint128 repayAmt = 0; + vm.startPrank(liquidator); + vm.expectRevert(abi.encodeWithSelector(GearingTokenErrors.GtIsSafe.selector, gtId)); + res.gt.liquidate(gtId, repayAmt, true); + + vm.warp(marketConfig.maturity); + res.gt.liquidate(gtId, repayAmt, true); + + assertEq(res.collateral.balanceOf(liquidator), 0); + assertEq(res.collateral.balanceOf(marketConfig.treasurer), 0); + assertEq(res.debt.balanceOf(sender), debtAmt); + vm.stopPrank(); + } + + function testRepayZeroDebt() public { + uint256 collateralAmt = 1e18; + uint128 debtAmt = 0; + vm.startPrank(sender); + res.collateral.mint(sender, collateralAmt); + bytes memory collateralData = abi.encode(collateralAmt); + res.collateral.approve(address(res.gt), collateralAmt); + (uint256 gtId,) = res.market.issueFt(sender, debtAmt, collateralData); + + res.gt.repay(gtId, 0, true); + assertEq(res.collateral.balanceOf(sender), collateralAmt); + vm.stopPrank(); + } +} diff --git a/test/v2/MarketV2.t.sol b/test/v2/MarketV2.t.sol new file mode 100644 index 0000000..e86cbe4 --- /dev/null +++ b/test/v2/MarketV2.t.sol @@ -0,0 +1,422 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "forge-std/Test.sol"; +import {console} from "forge-std/console.sol"; +import {DeployUtils} from "./utils/DeployUtils.sol"; +import {JSONLoader} from "./utils/JSONLoader.sol"; +import {StateChecker} from "./utils/StateChecker.sol"; +import {SwapUtils} from "./utils/SwapUtils.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; +import {IFlashLoanReceiver} from "contracts/v1/IFlashLoanReceiver.sol"; +import { + ITermMaxMarketV2, TermMaxMarketV2, Constants, MarketErrors, MarketEvents +} from "contracts/v2/TermMaxMarketV2.sol"; +import {ITermMaxOrder, TermMaxOrderV2, ISwapCallback, OrderEvents} from "contracts/v2/TermMaxOrderV2.sol"; +import {MockERC20, ERC20} from "contracts/v1/test/MockERC20.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {MockFlashLoanReceiver} from "contracts/v1/test/MockFlashLoanReceiver.sol"; +import {IGearingToken} from "contracts/v1/tokens/IGearingToken.sol"; +import { + VaultInitialParams, + MarketConfig, + MarketInitialParams, + LoanConfig, + OrderConfig, + CurveCuts +} from "contracts/v1/storage/TermMaxStorage.sol"; + +contract MarketV2Test is Test { + using JSONLoader for *; + + DeployUtils.Res res; + + OrderConfig orderConfig; + MarketConfig marketConfig; + + address deployer = vm.randomAddress(); + address maker = vm.randomAddress(); + address sender = vm.randomAddress(); + address treasurer = vm.randomAddress(); + string testdata; + + function setUp() public { + vm.startPrank(deployer); + testdata = vm.readFile(string.concat(vm.projectRoot(), "/test/testdata/testdata.json")); + + uint32 maxLtv = 0.89e8; + uint32 liquidationLtv = 0.9e8; + + marketConfig = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); + orderConfig = JSONLoader.getOrderConfigFromJson(testdata, ".orderConfig"); + res = DeployUtils.deployMarket(deployer, marketConfig, maxLtv, liquidationLtv); + + res.order = + res.market.createOrder(maker, orderConfig.maxXtReserve, ISwapCallback(address(0)), orderConfig.curveCuts); + + vm.warp(vm.parseUint(vm.parseJsonString(testdata, ".currentTime"))); + + // update oracle + res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.eth")); + res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.dai")); + + vm.stopPrank(); + } + + function testUpdateMarketConfig() public { + vm.startPrank(deployer); + marketConfig.treasurer = vm.randomAddress(); + marketConfig.feeConfig.mintGtFeeRatio = 0.02e8; + marketConfig.feeConfig.borrowTakerFeeRatio = 0.03e8; + marketConfig.feeConfig.borrowMakerFeeRatio = 0.04e8; + marketConfig.feeConfig.lendTakerFeeRatio = 0.05e8; + marketConfig.feeConfig.lendMakerFeeRatio = 0.06e8; + + vm.expectEmit(); + emit MarketEvents.UpdateMarketConfig(marketConfig); + res.market.updateMarketConfig(marketConfig); + + assertEq(res.market.config().treasurer, marketConfig.treasurer); + assertEq(res.gt.getGtConfig().treasurer, marketConfig.treasurer); + assertEq(res.market.config().feeConfig.mintGtFeeRatio, marketConfig.feeConfig.mintGtFeeRatio); + assertEq(res.market.config().feeConfig.borrowTakerFeeRatio, marketConfig.feeConfig.borrowTakerFeeRatio); + assertEq(res.market.config().feeConfig.borrowMakerFeeRatio, marketConfig.feeConfig.borrowMakerFeeRatio); + assertEq(res.market.config().feeConfig.lendTakerFeeRatio, marketConfig.feeConfig.lendTakerFeeRatio); + assertEq(res.market.config().feeConfig.lendMakerFeeRatio, marketConfig.feeConfig.lendMakerFeeRatio); + + vm.stopPrank(); + } + + function testUpdateMarketConfigWhenNotOwner() public { + vm.startPrank(sender); + marketConfig.treasurer = vm.randomAddress(); + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, address(sender))); + res.market.updateMarketConfig(marketConfig); + vm.stopPrank(); + } + + function testUpdateOrderConfigInvalidParams() public { + vm.startPrank(deployer); + + MarketConfig memory newConfig = res.market.config(); + newConfig.feeConfig.mintGtFeeRef = uint32(Constants.DECIMAL_BASE * 5 + 1); + vm.expectRevert(abi.encodeWithSelector(MarketErrors.FeeTooHigh.selector)); + res.market.updateMarketConfig(newConfig); + + newConfig.feeConfig.mintGtFeeRef = 0; + newConfig.feeConfig.borrowMakerFeeRatio = uint32(Constants.MAX_FEE_RATIO); + vm.expectRevert(abi.encodeWithSelector(MarketErrors.FeeTooHigh.selector)); + res.market.updateMarketConfig(newConfig); + vm.stopPrank(); + } + + function testMint() public { + vm.startPrank(sender); + uint256 amount = 150e8; + res.debt.mint(sender, amount); + res.debt.approve(address(res.market), amount); + + emit MarketEvents.Mint(sender, sender, amount); + res.market.mint(sender, amount); + + assertEq(res.debt.balanceOf(sender), 0); + assertEq(res.ft.balanceOf(sender), amount); + assertEq(res.xt.balanceOf(sender), amount); + assertEq(res.debt.balanceOf(address(res.market)), amount); + + vm.stopPrank(); + } + + function testMintWhenTermIsNotOpen() public { + vm.startPrank(sender); + uint256 amount = 150e8; + res.debt.mint(sender, amount); + res.debt.approve(address(res.market), amount); + + vm.warp(marketConfig.maturity); + vm.expectRevert(abi.encodeWithSelector(MarketErrors.TermIsNotOpen.selector)); + res.market.mint(sender, amount); + + vm.stopPrank(); + } + + function testBurn() public { + vm.startPrank(sender); + uint256 amount = 150e8; + res.debt.mint(sender, amount); + res.debt.approve(address(res.market), amount); + res.market.mint(sender, amount); + + emit MarketEvents.Burn(sender, sender, amount); + ITermMaxMarketV2(address(res.market)).burn(sender, sender, amount); + assertEq(res.debt.balanceOf(sender), amount); + assertEq(res.ft.balanceOf(sender), 0); + assertEq(res.xt.balanceOf(sender), 0); + assertEq(res.debt.balanceOf(address(res.market)), 0); + vm.stopPrank(); + } + + function testBurnWhenTermIsNotOpen() public { + vm.startPrank(sender); + uint256 amount = 150e8; + res.debt.mint(sender, amount); + res.debt.approve(address(res.market), amount); + vm.warp(marketConfig.maturity); + vm.expectRevert(abi.encodeWithSelector(MarketErrors.TermIsNotOpen.selector)); + ITermMaxMarketV2(address(res.market)).burn(sender, sender, amount); + vm.stopPrank(); + } + + function testIssueFt() public { + vm.startPrank(sender); + uint128 debtAmt = 1000e8; + res.debt.mint(sender, debtAmt); + res.debt.approve(address(res.market), debtAmt); + res.market.mint(sender, debtAmt); + + uint256 fee = (res.market.mintGtFeeRatio() * debtAmt) / Constants.DECIMAL_BASE; + uint256 collateralAmt = 1e18; + res.collateral.mint(sender, collateralAmt); + res.collateral.approve(address(res.gt), collateralAmt); + vm.expectEmit(); + emit MarketEvents.IssueFt( + sender, sender, 1, debtAmt, uint128(debtAmt - fee), uint128(fee), abi.encode(collateralAmt) + ); + (uint256 gtId, uint128 ftOutAmt) = res.market.issueFt(sender, debtAmt, abi.encode(collateralAmt)); + + assertEq(gtId, 1); + assertEq(res.debt.balanceOf(sender), 0); + assertEq(debtAmt - fee, ftOutAmt); + assertEq(res.ft.balanceOf(sender), ftOutAmt + debtAmt); + assertEq(res.collateral.balanceOf(address(res.gt)), collateralAmt); + assertEq(res.debt.balanceOf(address(res.market)), debtAmt); + + (address owner, uint128 dAmt, bytes memory collateralData) = res.gt.loanInfo(gtId); + assertEq(owner, sender); + assertEq(dAmt, debtAmt); + + assertEq(abi.decode(collateralData, (uint256)), collateralAmt); + + vm.stopPrank(); + } + + function testIssueFtByExistGt() public { + vm.startPrank(sender); + uint128 debtAmt = 1000e8; + + uint256 collateralAmt = 1e18; + res.collateral.mint(sender, collateralAmt); + res.collateral.approve(address(res.gt), collateralAmt); + (uint256 gtId, uint128 ftOutAmt) = res.market.issueFt(sender, debtAmt, abi.encode(collateralAmt)); + + uint128 debtAmt2 = debtAmt / 2; + uint256 fee = (res.market.mintGtFeeRatio() * debtAmt2) / Constants.DECIMAL_BASE; + vm.expectEmit(); + emit MarketEvents.IssueFtByExistedGt(sender, sender, gtId, debtAmt2, uint128(debtAmt2 - fee), uint128(fee)); + uint256 ftOutAmt2 = res.market.issueFtByExistedGt(sender, debtAmt2, gtId); + + assertEq(res.ft.balanceOf(sender), ftOutAmt + ftOutAmt2); + (address owner, uint128 dAmt, bytes memory collateralData) = res.gt.loanInfo(gtId); + assertEq(owner, sender); + assertEq(dAmt, debtAmt + debtAmt2); + assertEq(abi.decode(collateralData, (uint256)), collateralAmt); + vm.stopPrank(); + } + + function testIssueFtByExistedGtWhenTermIsNotOpen() public { + vm.startPrank(sender); + uint128 debtAmt = 1000e8; + + vm.warp(marketConfig.maturity); + vm.expectRevert(abi.encodeWithSelector(MarketErrors.TermIsNotOpen.selector)); + res.market.issueFtByExistedGt(sender, debtAmt, 1); + vm.stopPrank(); + } + + function testIssueFtWhenTermIsNotOpen() public { + vm.startPrank(sender); + uint128 debtAmt = 1000e8; + + vm.warp(marketConfig.maturity); + vm.expectRevert(abi.encodeWithSelector(MarketErrors.TermIsNotOpen.selector)); + res.market.issueFt(sender, debtAmt, abi.encode(1e18)); + vm.stopPrank(); + } + + function testLeverage() public { + uint128 xtAmt = 1000e8; + uint256 collateralAmt = 1e18; + vm.startPrank(deployer); + res.debt.mint(deployer, xtAmt); + res.debt.approve(address(res.market), xtAmt); + res.market.mint(deployer, xtAmt); + res.xt.transfer(sender, xtAmt); + vm.stopPrank(); + + vm.startPrank(sender); + MockFlashLoanReceiver receiver = new MockFlashLoanReceiver(res.market); + res.xt.approve(address(receiver), xtAmt); + + res.collateral.mint(address(receiver), collateralAmt); + + uint256 debtAmt = xtAmt * Constants.DECIMAL_BASE / (Constants.DECIMAL_BASE - res.market.mintGtFeeRatio()); + + vm.expectEmit(); + emit MarketEvents.LeverageByXt( + address(receiver), sender, 1, uint128(debtAmt), xtAmt, uint128(debtAmt - xtAmt), abi.encode(collateralAmt) + ); + receiver.leverageByXt(xtAmt, abi.encode(sender, collateralAmt)); + + assertEq(res.debt.balanceOf(sender), 0); + assertEq(res.debt.balanceOf(address(res.market)), 0); + assertEq(res.debt.balanceOf(address(receiver)), xtAmt); + assertEq(res.xt.balanceOf(sender), 0); + + (address owner, uint128 dAmt, bytes memory collateralData) = res.gt.loanInfo(1); + assertEq(owner, sender); + + assertEq(dAmt, uint128(debtAmt)); + + assertEq(abi.decode(collateralData, (uint256)), collateralAmt); + + vm.stopPrank(); + } + + function testLeverageWhenTermIsNotOpen() public { + uint128 debtAmt = 1000e8; + uint256 collateralAmt = 1e18; + vm.startPrank(deployer); + res.debt.mint(deployer, debtAmt); + res.debt.approve(address(res.market), debtAmt); + res.market.mint(deployer, debtAmt); + res.xt.transfer(sender, debtAmt); + vm.stopPrank(); + + vm.startPrank(sender); + MockFlashLoanReceiver receiver = new MockFlashLoanReceiver(res.market); + res.xt.approve(address(receiver), debtAmt); + + vm.warp(marketConfig.maturity); + vm.expectRevert(abi.encodeWithSelector(MarketErrors.TermIsNotOpen.selector)); + receiver.leverageByXt(debtAmt, abi.encode(sender, collateralAmt)); + vm.stopPrank(); + } + + function testCreateOrder() public { + vm.startPrank(sender); + + vm.expectEmit(); + emit OrderEvents.OrderInitialized( + res.market, sender, orderConfig.maxXtReserve, ISwapCallback(address(0)), orderConfig.curveCuts + ); + ITermMaxOrder order = + res.market.createOrder(sender, orderConfig.maxXtReserve, ISwapCallback(address(0)), orderConfig.curveCuts); + assertEq(address(order.market()), address(res.market)); + assertEq(Ownable(address(order)).owner(), sender); + assertEq(order.orderConfig().maxXtReserve, orderConfig.maxXtReserve); + assertEq(order.maker(), sender); + + vm.stopPrank(); + } + + function testCreateOrderWhenTermIsNotOpen() public { + vm.startPrank(sender); + vm.warp(marketConfig.maturity); + vm.expectRevert(abi.encodeWithSelector(MarketErrors.TermIsNotOpen.selector)); + res.market.createOrder(sender, orderConfig.maxXtReserve, ISwapCallback(address(0)), orderConfig.curveCuts); + vm.stopPrank(); + } + + function testRedeem() public { + address bob = vm.randomAddress(); + address alice = vm.randomAddress(); + + uint128 depositAmt = 1000e8; + uint128 debtAmt = 100e8; + uint256 collateralAmt = 1e18; + + vm.startPrank(bob); + res.debt.mint(bob, depositAmt); + res.debt.approve(address(res.market), depositAmt); + res.market.mint(bob, depositAmt); + + res.xt.transfer(alice, debtAmt); + vm.stopPrank(); + + vm.startPrank(alice); + + MockFlashLoanReceiver receiver = new MockFlashLoanReceiver(res.market); + res.collateral.mint(address(receiver), collateralAmt); + + res.xt.approve(address(receiver), debtAmt); + receiver.leverageByXt(debtAmt, abi.encode(alice, collateralAmt)); + uint128 leverageFee = + uint128(debtAmt * Constants.DECIMAL_BASE / (Constants.DECIMAL_BASE - res.market.mintGtFeeRatio())) - debtAmt; + vm.stopPrank(); + + vm.warp(marketConfig.maturity + Constants.LIQUIDATION_WINDOW); + + vm.startPrank(bob); + res.ft.approve(address(res.market), depositAmt); + + (uint256 expectDebt, bytes memory collateralData) = res.market.previewRedeem(depositAmt); + vm.expectEmit(); + uint128 proportion = uint128(Constants.DECIMAL_BASE_SQ) * depositAmt / (depositAmt + leverageFee); + emit MarketEvents.Redeem(bob, bob, proportion, uint128(expectDebt), collateralData); + ITermMaxMarketV2(address(res.market)).redeem(bob, bob, depositAmt); + uint256 expectCollateral = abi.decode(collateralData, (uint256)); + + assertEq(res.debt.balanceOf(bob), expectDebt); + assertEq(res.collateral.balanceOf(bob), expectCollateral); + assertEq(res.debt.balanceOf(address(res.market)), (depositAmt - debtAmt) - expectDebt); + assertEq(res.collateral.balanceOf(address(res.gt)), collateralAmt - expectCollateral); + assertEq(res.ft.balanceOf(bob), 0); + vm.stopPrank(); + } + + function testRedeemBeforeDeadline() public { + uint128 depositAmt = 1000e8; + + vm.startPrank(sender); + res.debt.mint(sender, depositAmt); + res.debt.approve(address(res.market), depositAmt); + res.market.mint(sender, depositAmt); + + res.ft.approve(address(res.market), depositAmt); + uint256 deadline = marketConfig.maturity + Constants.LIQUIDATION_WINDOW; + vm.warp(deadline - 1); + vm.expectRevert( + abi.encodeWithSelector(MarketErrors.CanNotRedeemBeforeFinalLiquidationDeadline.selector, deadline) + ); + ITermMaxMarketV2(address(res.market)).redeem(sender, sender, depositAmt); + + vm.warp(marketConfig.maturity - 1); + vm.expectRevert( + abi.encodeWithSelector(MarketErrors.CanNotRedeemBeforeFinalLiquidationDeadline.selector, deadline) + ); + ITermMaxMarketV2(address(res.market)).redeem(sender, sender, depositAmt); + + vm.stopPrank(); + } + + function testFuzzIssueFtByExistedGtDebtAmount(uint128 issueAmount) public { + vm.assume(issueAmount >= 1); + vm.assume(issueAmount <= type(uint64).max); + + uint128 debt = + uint128((issueAmount * Constants.DECIMAL_BASE) / (Constants.DECIMAL_BASE - res.market.mintGtFeeRatio())); + + vm.startPrank(sender); + + uint256 collateralAmt = type(uint128).max; + bytes memory collateralData = abi.encode(collateralAmt); + res.collateral.mint(sender, collateralAmt); + res.collateral.approve(address(res.gt), collateralAmt); + res.market.issueFt(sender, issueAmount, collateralData); + + uint128 ftOutAmt = res.market.issueFtByExistedGt(sender, debt, 1); + assertTrue(ftOutAmt == issueAmount); + vm.stopPrank(); + } +} diff --git a/test/v2/OracleAggregatorV2.t.sol b/test/v2/OracleAggregatorV2.t.sol new file mode 100644 index 0000000..0ce45d5 --- /dev/null +++ b/test/v2/OracleAggregatorV2.t.sol @@ -0,0 +1,646 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {Test} from "forge-std/Test.sol"; +import {OracleAggregatorV2, IOracleV2, AggregatorV3Interface} from "contracts/v2/oracle/OracleAggregatorV2.sol"; +import {MockPriceFeedV2} from "contracts/v2/test/MockPriceFeedV2.sol"; + +contract OracleAggregatorTestV2 is Test { + OracleAggregatorV2 public oracleAggregator; + MockPriceFeedV2 public primaryFeed; + MockPriceFeedV2 public backupFeed; + + address public constant OWNER = address(0x1); + address public constant ASSET = address(0x2); + uint256 public constant TIMELOCK = 1 days; + uint32 public constant HEARTBEAT = 1 hours; + uint32 public constant BACKUP_HEARTBEAT = 2 hours; + int256 public constant MAX_PRICE = 10000e8; + + // Price feed configuration + uint8 public constant DECIMALS = 8; + int256 public constant INITIAL_PRICE = 3000e8; + + function setUp() public { + // Deploy mock price feeds + primaryFeed = new MockPriceFeedV2(OWNER); + backupFeed = new MockPriceFeedV2(OWNER); + + // Set initial price data + MockPriceFeedV2.RoundData memory roundData = MockPriceFeedV2.RoundData({ + roundId: 1, + answer: INITIAL_PRICE, + startedAt: block.timestamp, + updatedAt: block.timestamp, + answeredInRound: 1 + }); + + vm.startPrank(OWNER); + primaryFeed.updateRoundData(roundData); + backupFeed.updateRoundData(roundData); + vm.stopPrank(); + + // Deploy OracleAggregator with owner and timelock + vm.prank(OWNER); + oracleAggregator = new OracleAggregatorV2(OWNER, TIMELOCK); + } + + function test_SubmitPendingOracle() public { + IOracleV2.Oracle memory oracle = IOracleV2.Oracle({ + aggregator: primaryFeed, + backupAggregator: backupFeed, + heartbeat: HEARTBEAT, + backupHeartbeat: BACKUP_HEARTBEAT, + maxPrice: MAX_PRICE + }); + + vm.prank(OWNER); + oracleAggregator.submitPendingOracle(ASSET, oracle); + + // Access the Oracle struct directly from the mapping + ( + AggregatorV3Interface aggregator, + AggregatorV3Interface backupAggregator, + int256 maxPrice, + uint32 heartbeat, + uint32 backupHeartbeat + ) = oracleAggregator.oracles(ASSET); + assertEq(address(aggregator), address(0), "Oracle should not be set yet"); + assertEq(address(backupAggregator), address(0), "Backup oracle should not be set yet"); + assertEq(heartbeat, 0, "Heartbeat should not be set yet"); + assertEq(backupHeartbeat, 0, "Backup heartbeat should not be set yet"); + assertEq(maxPrice, 0, "Max price should not be set yet"); + + (IOracleV2.Oracle memory pendingOracle, uint64 validAt) = oracleAggregator.pendingOracles(ASSET); + assertEq(address(pendingOracle.aggregator), address(primaryFeed)); + assertEq(address(pendingOracle.backupAggregator), address(backupFeed)); + assertEq(pendingOracle.heartbeat, HEARTBEAT); + assertEq(pendingOracle.backupHeartbeat, BACKUP_HEARTBEAT); + assertEq(pendingOracle.maxPrice, MAX_PRICE); + assertEq(validAt, block.timestamp + TIMELOCK); + } + + function test_AcceptPendingOracle() public { + // Submit pending oracle + IOracleV2.Oracle memory oracle = IOracleV2.Oracle({ + aggregator: primaryFeed, + backupAggregator: backupFeed, + heartbeat: HEARTBEAT, + backupHeartbeat: BACKUP_HEARTBEAT, + maxPrice: MAX_PRICE + }); + + vm.prank(OWNER); + oracleAggregator.submitPendingOracle(ASSET, oracle); + + // Warp time past timelock + vm.warp(block.timestamp + TIMELOCK + 1); + + oracleAggregator.acceptPendingOracle(ASSET); + + // Access the Oracle struct directly from the mapping + ( + AggregatorV3Interface aggregator, + AggregatorV3Interface backupAggregator, + int256 maxPrice, + uint32 heartbeat, + uint32 backupHeartbeat + ) = oracleAggregator.oracles(ASSET); + assertEq(address(aggregator), address(primaryFeed)); + assertEq(address(backupAggregator), address(backupFeed)); + assertEq(heartbeat, HEARTBEAT); + assertEq(backupHeartbeat, BACKUP_HEARTBEAT); + assertEq(maxPrice, MAX_PRICE); + + // Verify pending oracle is cleared + (IOracleV2.Oracle memory pendingOracle, uint64 validAt) = oracleAggregator.pendingOracles(ASSET); + assertEq(address(pendingOracle.aggregator), address(0)); + assertEq(address(pendingOracle.backupAggregator), address(0)); + assertEq(pendingOracle.heartbeat, 0); + assertEq(pendingOracle.backupHeartbeat, 0); + assertEq(pendingOracle.maxPrice, 0); + assertEq(validAt, 0); + } + + function test_GetPrice_PrimaryOracle() public { + // Setup oracle + IOracleV2.Oracle memory oracle = IOracleV2.Oracle({ + aggregator: primaryFeed, + backupAggregator: backupFeed, + heartbeat: HEARTBEAT, + backupHeartbeat: BACKUP_HEARTBEAT, + maxPrice: MAX_PRICE + }); + + vm.startPrank(OWNER); + oracleAggregator.submitPendingOracle(ASSET, oracle); + vm.warp(block.timestamp + TIMELOCK + 1); + vm.stopPrank(); + + oracleAggregator.acceptPendingOracle(ASSET); + + // Update primary oracle timestamp to match current time + MockPriceFeedV2.RoundData memory roundData = MockPriceFeedV2.RoundData({ + roundId: 1, + answer: INITIAL_PRICE, + startedAt: block.timestamp, + updatedAt: block.timestamp, + answeredInRound: 1 + }); + vm.prank(OWNER); + primaryFeed.updateRoundData(roundData); + + // Get price + (uint256 price, uint8 decimals) = oracleAggregator.getPrice(ASSET); + assertEq(price, uint256(INITIAL_PRICE)); + assertEq(decimals, DECIMALS); + } + + function test_GetPrice_FallbackToBackup() public { + // Setup oracle + IOracleV2.Oracle memory oracle = IOracleV2.Oracle({ + aggregator: primaryFeed, + backupAggregator: backupFeed, + heartbeat: HEARTBEAT, + backupHeartbeat: BACKUP_HEARTBEAT, + maxPrice: MAX_PRICE + }); + + vm.startPrank(OWNER); + oracleAggregator.submitPendingOracle(ASSET, oracle); + vm.warp(block.timestamp + TIMELOCK + 1); + vm.stopPrank(); + + oracleAggregator.acceptPendingOracle(ASSET); + + // Make primary oracle stale + vm.warp(block.timestamp + HEARTBEAT + 1); + + // Update backup price + int256 backupPrice = 3100e8; + MockPriceFeedV2.RoundData memory roundData = MockPriceFeedV2.RoundData({ + roundId: 2, + answer: backupPrice, + startedAt: block.timestamp, + updatedAt: block.timestamp, + answeredInRound: 2 + }); + vm.prank(OWNER); + backupFeed.updateRoundData(roundData); + + // Get price - should use backup + (uint256 price, uint8 decimals) = oracleAggregator.getPrice(ASSET); + assertEq(price, uint256(backupPrice)); + assertEq(decimals, DECIMALS); + } + + function test_RevertGetPrice_BothOraclesStale() public { + // Setup oracle + IOracleV2.Oracle memory oracle = IOracleV2.Oracle({ + aggregator: primaryFeed, + backupAggregator: backupFeed, + heartbeat: HEARTBEAT, + backupHeartbeat: BACKUP_HEARTBEAT, + maxPrice: MAX_PRICE + }); + + vm.startPrank(OWNER); + oracleAggregator.submitPendingOracle(ASSET, oracle); + vm.warp(block.timestamp + TIMELOCK + 1); + vm.stopPrank(); + + oracleAggregator.acceptPendingOracle(ASSET); + + // Make both oracles stale + vm.warp(block.timestamp + HEARTBEAT + 1); + + vm.expectRevert(abi.encodeWithSignature("OracleIsNotWorking(address)", ASSET)); + // Should revert + oracleAggregator.getPrice(ASSET); + } + + function test_RevertSubmitPendingOracle_NotOwner() public { + IOracleV2.Oracle memory oracle = IOracleV2.Oracle({ + aggregator: primaryFeed, + backupAggregator: backupFeed, + heartbeat: HEARTBEAT, + backupHeartbeat: BACKUP_HEARTBEAT, + maxPrice: MAX_PRICE + }); + + vm.prank(address(0x3)); + vm.expectRevert(abi.encodeWithSignature("OwnableUnauthorizedAccount(address)", address(0x3))); + oracleAggregator.submitPendingOracle(ASSET, oracle); + } + + function test_RevertAcceptPendingOracle_BeforeTimelock() public { + // Submit pending oracle + IOracleV2.Oracle memory oracle = IOracleV2.Oracle({ + aggregator: primaryFeed, + backupAggregator: backupFeed, + heartbeat: HEARTBEAT, + backupHeartbeat: BACKUP_HEARTBEAT, + maxPrice: MAX_PRICE + }); + + vm.prank(OWNER); + oracleAggregator.submitPendingOracle(ASSET, oracle); + vm.expectRevert(abi.encodeWithSignature("TimelockNotElapsed()")); + // Try to accept before timelock expires + oracleAggregator.acceptPendingOracle(ASSET); + } + + function test_RemoveOracle() public { + // First add an oracle + IOracleV2.Oracle memory oracle = IOracleV2.Oracle({ + aggregator: primaryFeed, + backupAggregator: backupFeed, + heartbeat: HEARTBEAT, + backupHeartbeat: BACKUP_HEARTBEAT, + maxPrice: MAX_PRICE + }); + + vm.startPrank(OWNER); + oracleAggregator.submitPendingOracle(ASSET, oracle); + vm.warp(block.timestamp + TIMELOCK + 1); + vm.stopPrank(); + + oracleAggregator.acceptPendingOracle(ASSET); + + // Now remove it by submitting empty oracle + vm.prank(OWNER); + oracleAggregator.submitPendingOracle( + ASSET, + IOracleV2.Oracle({ + aggregator: AggregatorV3Interface(address(0)), + backupAggregator: AggregatorV3Interface(address(0)), + heartbeat: 0, + backupHeartbeat: 0, + maxPrice: 0 + }) + ); + + // Verify oracle is removed + ( + AggregatorV3Interface aggregator, + AggregatorV3Interface backupAggregator, + int256 maxPrice, + uint32 heartbeat, + uint32 backupHeartbeat + ) = oracleAggregator.oracles(ASSET); + assertEq(address(aggregator), address(0)); + assertEq(address(backupAggregator), address(0)); + assertEq(heartbeat, 0); + assertEq(backupHeartbeat, 0); + assertEq(maxPrice, 0); + } + + function test_GetPrice_PrimaryExceedsMaxPrice_NoBackup() public { + // Create an oracle with maxPrice and no backup + IOracleV2.Oracle memory oracle = IOracleV2.Oracle({ + aggregator: primaryFeed, + backupAggregator: AggregatorV3Interface(address(0)), + heartbeat: HEARTBEAT, + backupHeartbeat: 0, + maxPrice: MAX_PRICE + }); + + vm.startPrank(OWNER); + oracleAggregator.submitPendingOracle(ASSET, oracle); + vm.warp(block.timestamp + TIMELOCK + 1); + vm.stopPrank(); + + oracleAggregator.acceptPendingOracle(ASSET); + + // Set primary price above maxPrice + int256 highPrice = MAX_PRICE + 1000e8; + MockPriceFeedV2.RoundData memory roundData = MockPriceFeedV2.RoundData({ + roundId: 2, + answer: highPrice, + startedAt: block.timestamp, + updatedAt: block.timestamp, + answeredInRound: 2 + }); + vm.prank(OWNER); + primaryFeed.updateRoundData(roundData); + + // Get price - should return maxPrice instead of actual price + (uint256 price, uint8 decimals) = oracleAggregator.getPrice(ASSET); + assertEq(price, uint256(MAX_PRICE)); + assertEq(decimals, DECIMALS); + } + + function test_GetPrice_PrimaryExceedsMaxPrice_WithBackup() public { + // Create an oracle with maxPrice + IOracleV2.Oracle memory oracle = IOracleV2.Oracle({ + aggregator: primaryFeed, + backupAggregator: backupFeed, + heartbeat: HEARTBEAT, + backupHeartbeat: BACKUP_HEARTBEAT, + maxPrice: MAX_PRICE + }); + + vm.startPrank(OWNER); + oracleAggregator.submitPendingOracle(ASSET, oracle); + vm.warp(block.timestamp + TIMELOCK + 1); + vm.stopPrank(); + + oracleAggregator.acceptPendingOracle(ASSET); + + // Set primary price above maxPrice + int256 highPrice = MAX_PRICE + 1000e8; + MockPriceFeedV2.RoundData memory primaryRoundData = MockPriceFeedV2.RoundData({ + roundId: 2, + answer: highPrice, + startedAt: block.timestamp, + updatedAt: block.timestamp, + answeredInRound: 2 + }); + + // Set backup price below maxPrice + int256 validBackupPrice = MAX_PRICE - 1000e8; + MockPriceFeedV2.RoundData memory backupRoundData = MockPriceFeedV2.RoundData({ + roundId: 2, + answer: validBackupPrice, + startedAt: block.timestamp, + updatedAt: block.timestamp, + answeredInRound: 2 + }); + + vm.startPrank(OWNER); + primaryFeed.updateRoundData(primaryRoundData); + backupFeed.updateRoundData(backupRoundData); + vm.stopPrank(); + + // Get price - should fallback to backup oracle + (uint256 price, uint8 decimals) = oracleAggregator.getPrice(ASSET); + assertEq(price, uint256(validBackupPrice)); + assertEq(decimals, DECIMALS); + } + + function test_GetPrice_BothExceedMaxPrice() public { + // Create an oracle with maxPrice + IOracleV2.Oracle memory oracle = IOracleV2.Oracle({ + aggregator: primaryFeed, + backupAggregator: backupFeed, + heartbeat: HEARTBEAT, + backupHeartbeat: BACKUP_HEARTBEAT, + maxPrice: MAX_PRICE + }); + + vm.startPrank(OWNER); + oracleAggregator.submitPendingOracle(ASSET, oracle); + vm.warp(block.timestamp + TIMELOCK + 1); + vm.stopPrank(); + + oracleAggregator.acceptPendingOracle(ASSET); + + // Set both primary and backup prices above maxPrice + int256 highPrimaryPrice = MAX_PRICE + 1000e8; + MockPriceFeedV2.RoundData memory primaryRoundData = MockPriceFeedV2.RoundData({ + roundId: 2, + answer: highPrimaryPrice, + startedAt: block.timestamp, + updatedAt: block.timestamp, + answeredInRound: 2 + }); + + int256 highBackupPrice = MAX_PRICE + 500e8; + MockPriceFeedV2.RoundData memory backupRoundData = MockPriceFeedV2.RoundData({ + roundId: 2, + answer: highBackupPrice, + startedAt: block.timestamp, + updatedAt: block.timestamp, + answeredInRound: 2 + }); + + vm.startPrank(OWNER); + primaryFeed.updateRoundData(primaryRoundData); + backupFeed.updateRoundData(backupRoundData); + vm.stopPrank(); + + // Get price - should use backup capped at maxPrice + (uint256 price, uint8 decimals) = oracleAggregator.getPrice(ASSET); + assertEq(price, uint256(MAX_PRICE)); + assertEq(decimals, DECIMALS); + } + + function test_GetPrice_WithMaxPriceZero_PrimaryOracle() public { + // Create an oracle with maxPrice set to 0 (no price cap) + IOracleV2.Oracle memory oracle = IOracleV2.Oracle({ + aggregator: primaryFeed, + backupAggregator: backupFeed, + heartbeat: HEARTBEAT, + backupHeartbeat: BACKUP_HEARTBEAT, + maxPrice: 0 // No price cap + }); + + vm.startPrank(OWNER); + oracleAggregator.submitPendingOracle(ASSET, oracle); + vm.warp(block.timestamp + TIMELOCK + 1); + vm.stopPrank(); + + oracleAggregator.acceptPendingOracle(ASSET); + + // Set very high price that would normally exceed any reasonable cap + int256 extremelyHighPrice = 1000000e8; // 1 million units + MockPriceFeedV2.RoundData memory roundData = MockPriceFeedV2.RoundData({ + roundId: 2, + answer: extremelyHighPrice, + startedAt: block.timestamp, + updatedAt: block.timestamp, + answeredInRound: 2 + }); + vm.prank(OWNER); + primaryFeed.updateRoundData(roundData); + + // Get price - should return the full price without capping + (uint256 price, uint8 decimals) = oracleAggregator.getPrice(ASSET); + assertEq(price, uint256(extremelyHighPrice)); + assertEq(decimals, DECIMALS); + } + + function test_GetPrice_WithMaxPriceZero_FallbackToBackup() public { + // Create an oracle with maxPrice set to 0 (no price cap) + IOracleV2.Oracle memory oracle = IOracleV2.Oracle({ + aggregator: primaryFeed, + backupAggregator: backupFeed, + heartbeat: HEARTBEAT, + backupHeartbeat: BACKUP_HEARTBEAT, + maxPrice: 0 // No price cap + }); + + vm.startPrank(OWNER); + oracleAggregator.submitPendingOracle(ASSET, oracle); + vm.warp(block.timestamp + TIMELOCK + 1); + vm.stopPrank(); + + oracleAggregator.acceptPendingOracle(ASSET); + + // Make primary oracle stale + vm.warp(block.timestamp + HEARTBEAT + 1); + + // Set very high price on backup oracle + int256 extremelyHighBackupPrice = 2000000e8; // 2 million units + MockPriceFeedV2.RoundData memory roundData = MockPriceFeedV2.RoundData({ + roundId: 2, + answer: extremelyHighBackupPrice, + startedAt: block.timestamp, + updatedAt: block.timestamp, + answeredInRound: 2 + }); + vm.prank(OWNER); + backupFeed.updateRoundData(roundData); + + // Get price - should return the full backup price without capping + (uint256 price, uint8 decimals) = oracleAggregator.getPrice(ASSET); + assertEq(price, uint256(extremelyHighBackupPrice)); + assertEq(decimals, DECIMALS); + } + + function test_GetPrice_NoBackupAggregator() public { + // Create an oracle with no backup aggregator + IOracleV2.Oracle memory oracle = IOracleV2.Oracle({ + aggregator: primaryFeed, + backupAggregator: AggregatorV3Interface(address(0)), + heartbeat: HEARTBEAT, + backupHeartbeat: 0, + maxPrice: MAX_PRICE + }); + + vm.startPrank(OWNER); + oracleAggregator.submitPendingOracle(ASSET, oracle); + vm.warp(block.timestamp + TIMELOCK + 1); + vm.stopPrank(); + + oracleAggregator.acceptPendingOracle(ASSET); + + // Set normal price + int256 newPrice = 3200e8; + MockPriceFeedV2.RoundData memory roundData = MockPriceFeedV2.RoundData({ + roundId: 2, + answer: newPrice, + startedAt: block.timestamp, + updatedAt: block.timestamp, + answeredInRound: 2 + }); + vm.prank(OWNER); + primaryFeed.updateRoundData(roundData); + + // Get price - should return the primary price + (uint256 price, uint8 decimals) = oracleAggregator.getPrice(ASSET); + assertEq(price, uint256(newPrice)); + assertEq(decimals, DECIMALS); + } + + function test_RevertGetPrice_NoBackupAggregator_PrimaryStale() public { + // Create an oracle with no backup aggregator + IOracleV2.Oracle memory oracle = IOracleV2.Oracle({ + aggregator: primaryFeed, + backupAggregator: AggregatorV3Interface(address(0)), + heartbeat: HEARTBEAT, + backupHeartbeat: 0, + maxPrice: MAX_PRICE + }); + + vm.startPrank(OWNER); + oracleAggregator.submitPendingOracle(ASSET, oracle); + vm.warp(block.timestamp + TIMELOCK + 1); + vm.stopPrank(); + + oracleAggregator.acceptPendingOracle(ASSET); + + // Make primary oracle stale + vm.warp(block.timestamp + HEARTBEAT + 1); + + // Should revert since primary is stale and no backup exists + vm.expectRevert(abi.encodeWithSignature("OracleIsNotWorking(address)", ASSET)); + oracleAggregator.getPrice(ASSET); + } + + function test_RevertSubmitPendingOracle_DecimalMismatch() public { + // Create another mock feed with different decimals + MockPriceFeedV2 differentDecimalsFeed = new MockPriceFeedV2(OWNER); + vm.startPrank(OWNER); + differentDecimalsFeed.setDecimals(DECIMALS + 2); // Different decimal precision + + // Set initial price data on the different decimals feed + MockPriceFeedV2.RoundData memory roundData = MockPriceFeedV2.RoundData({ + roundId: 1, + answer: INITIAL_PRICE, + startedAt: block.timestamp, + updatedAt: block.timestamp, + answeredInRound: 1 + }); + differentDecimalsFeed.updateRoundData(roundData); + vm.stopPrank(); + + // Try to set an oracle with mismatched decimals + IOracleV2.Oracle memory oracle = IOracleV2.Oracle({ + aggregator: primaryFeed, + backupAggregator: differentDecimalsFeed, + heartbeat: HEARTBEAT, + backupHeartbeat: BACKUP_HEARTBEAT, + maxPrice: MAX_PRICE + }); + + vm.prank(OWNER); + vm.expectRevert(abi.encodeWithSignature("InvalidAssetOrOracle()")); + oracleAggregator.submitPendingOracle(ASSET, oracle); + } + + function test_RevokePendingOracle() public { + // First submit a pending oracle + IOracleV2.Oracle memory oracle = IOracleV2.Oracle({ + aggregator: primaryFeed, + backupAggregator: backupFeed, + heartbeat: HEARTBEAT, + backupHeartbeat: BACKUP_HEARTBEAT, + maxPrice: MAX_PRICE + }); + + vm.prank(OWNER); + oracleAggregator.submitPendingOracle(ASSET, oracle); + + // Verify the pending oracle was set + (IOracleV2.Oracle memory pendingOracle, uint64 validAt) = oracleAggregator.pendingOracles(ASSET); + assertEq(address(pendingOracle.aggregator), address(primaryFeed)); + assertEq(validAt, block.timestamp + TIMELOCK); + + // Now revoke it + vm.prank(OWNER); + oracleAggregator.revokePendingOracle(ASSET); + + // Verify it was revoked + (pendingOracle, validAt) = oracleAggregator.pendingOracles(ASSET); + assertEq(address(pendingOracle.aggregator), address(0)); + assertEq(validAt, 0); + } + + function test_RevertRevokePendingOracle_NoPending() public { + // Try to revoke when there's no pending oracle + vm.prank(OWNER); + vm.expectRevert(abi.encodeWithSignature("NoPendingValue()")); + oracleAggregator.revokePendingOracle(ASSET); + } + + function test_RevertRevokePendingOracle_NotOwner() public { + // First submit a pending oracle + IOracleV2.Oracle memory oracle = IOracleV2.Oracle({ + aggregator: primaryFeed, + backupAggregator: backupFeed, + heartbeat: HEARTBEAT, + backupHeartbeat: BACKUP_HEARTBEAT, + maxPrice: MAX_PRICE + }); + + vm.prank(OWNER); + oracleAggregator.submitPendingOracle(ASSET, oracle); + + // Try to revoke from non-owner account + address nonOwner = address(0x123); + vm.prank(nonOwner); + vm.expectRevert(abi.encodeWithSignature("OwnableUnauthorizedAccount(address)", nonOwner)); + oracleAggregator.revokePendingOracle(ASSET); + } +} diff --git a/test/v2/OrderV2.t.sol b/test/v2/OrderV2.t.sol new file mode 100644 index 0000000..0081b89 --- /dev/null +++ b/test/v2/OrderV2.t.sol @@ -0,0 +1,858 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "forge-std/Test.sol"; +import {console} from "forge-std/console.sol"; +import {DeployUtils} from "./utils/DeployUtils.sol"; +import {LoanUtils} from "./utils/LoanUtils.sol"; +import {JSONLoader} from "./utils/JSONLoader.sol"; +import {StateChecker} from "./utils/StateChecker.sol"; +import {SwapUtils} from "./utils/SwapUtils.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; +import {IFlashLoanReceiver} from "contracts/v1/IFlashLoanReceiver.sol"; +import { + ITermMaxMarketV2, TermMaxMarketV2, Constants, MarketErrors, MarketEvents +} from "contracts/v2/TermMaxMarketV2.sol"; +import {ITermMaxOrder, TermMaxOrderV2, ISwapCallback, OrderEvents, OrderErrors} from "contracts/v2/TermMaxOrderV2.sol"; +import {MockERC20, ERC20} from "contracts/v1/test/MockERC20.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {MockFlashLoanReceiver} from "contracts/v1/test/MockFlashLoanReceiver.sol"; +import {IGearingToken} from "contracts/v1/tokens/IGearingToken.sol"; +import { + VaultInitialParams, + MarketConfig, + MarketInitialParams, + LoanConfig, + OrderConfig, + CurveCut, + CurveCuts, + FeeConfig +} from "contracts/v1/storage/TermMaxStorage.sol"; + +contract OrderTestV2 is Test { + using JSONLoader for *; + using SafeCast for *; + + DeployUtils.Res res; + + OrderConfig orderConfig; + MarketConfig marketConfig; + + address deployer = vm.randomAddress(); + address maker = vm.randomAddress(); + address sender = vm.randomAddress(); + address treasurer = vm.randomAddress(); + string testdata; + + function setUp() public { + vm.startPrank(deployer); + testdata = vm.readFile(string.concat(vm.projectRoot(), "/test/testdata/testdata.json")); + + uint32 maxLtv = 0.89e8; + uint32 liquidationLtv = 0.9e8; + + marketConfig = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); + orderConfig = JSONLoader.getOrderConfigFromJson(testdata, ".orderConfig"); + + res = DeployUtils.deployMarket(deployer, marketConfig, maxLtv, liquidationLtv); + + res.order = + res.market.createOrder(maker, orderConfig.maxXtReserve, ISwapCallback(address(0)), orderConfig.curveCuts); + + vm.warp(vm.parseUint(vm.parseJsonString(testdata, ".currentTime"))); + + // update oracle + res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.eth")); + res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.dai")); + + uint256 amount = 150e8; + res.debt.mint(deployer, amount); + res.debt.approve(address(res.market), amount); + res.market.mint(deployer, amount); + res.ft.transfer(address(res.order), amount); + res.xt.transfer(address(res.order), amount); + + vm.stopPrank(); + } + + function testInvalidCurveCuts() public { + vm.startPrank(maker); + { + OrderConfig memory newOrderConfig = orderConfig; + newOrderConfig.curveCuts.lendCurveCuts[0].offset = 0; + vm.expectRevert(abi.encodeWithSelector(OrderErrors.InvalidCurveCuts.selector)); + res.order.updateOrder(newOrderConfig, 0, 0); + } + + { + OrderConfig memory newOrderConfig = orderConfig; + newOrderConfig.curveCuts.borrowCurveCuts[0].offset = 0; + vm.expectRevert(abi.encodeWithSelector(OrderErrors.InvalidCurveCuts.selector)); + res.order.updateOrder(newOrderConfig, 0, 0); + } + + { + OrderConfig memory newOrderConfig = orderConfig; + newOrderConfig.curveCuts.borrowCurveCuts[1].offset = 0; + vm.expectRevert(abi.encodeWithSelector(OrderErrors.InvalidCurveCuts.selector)); + res.order.updateOrder(newOrderConfig, 0, 0); + } + + vm.stopPrank(); + } + + function testBuyFt() public { + vm.startPrank(sender); + + uint128 underlyingAmtIn = 100e8; + uint128 minTokenOut = 0e8; + res.debt.mint(sender, underlyingAmtIn); + res.debt.approve(address(res.order), underlyingAmtIn); + + uint256 actualOut = vm.parseUint(vm.parseJsonString(testdata, ".expected.testBuyFt.output.netOut")); + uint256 fee = vm.parseUint(vm.parseJsonString(testdata, ".expected.testBuyFt.output.fee")); + StateChecker.OrderState memory expectedState = + JSONLoader.getOrderStateFromJson(testdata, ".expected.testBuyFt.contractState"); + vm.expectEmit(); + emit OrderEvents.SwapExactTokenToToken( + res.debt, res.ft, sender, sender, underlyingAmtIn, uint128(actualOut), uint128(fee) + ); + uint256 netOut = res.order.swapExactTokenToToken( + res.debt, res.ft, sender, underlyingAmtIn, minTokenOut, block.timestamp + 1 hours + ); + + StateChecker.checkOrderState(res, expectedState); + + assert(netOut == actualOut); + assert(res.ft.balanceOf(sender) == netOut); + + vm.stopPrank(); + } + + function testBuyFtMinTokenOut() public { + vm.startPrank(sender); + + uint128 expectedNetOut = + uint128(vm.parseUint(vm.parseJsonString(testdata, ".expected.testBuyFt.output.netOut"))); + uint128 underlyingAmtIn = 100e8; + uint128 minTokenOut = expectedNetOut + 1; + + res.debt.mint(sender, underlyingAmtIn); + res.debt.approve(address(res.order), underlyingAmtIn); + vm.expectRevert(abi.encodeWithSelector(OrderErrors.UnexpectedAmount.selector, minTokenOut, expectedNetOut)); + res.order.swapExactTokenToToken( + res.debt, res.ft, sender, underlyingAmtIn, minTokenOut, block.timestamp + 1 hours + ); + + vm.stopPrank(); + } + + function testSwapTokenWhenTermIsNotOpen() public { + vm.startPrank(sender); + + uint128 underlyingAmtIn = 100e8; + uint128 minTokenOut = 0e8; + + res.debt.mint(sender, underlyingAmtIn); + res.debt.approve(address(res.order), underlyingAmtIn); + + vm.warp(res.market.config().maturity); + vm.expectRevert(abi.encodeWithSelector(OrderErrors.TermIsNotOpen.selector)); + res.order.swapExactTokenToToken( + res.debt, res.ft, sender, underlyingAmtIn, minTokenOut, block.timestamp + 1 hours + ); + + vm.stopPrank(); + } + + function testBuyXt() public { + vm.startPrank(sender); + + uint128 underlyingAmtIn = 5e8; + uint128 minTokenOut = 0e8; + res.debt.mint(sender, underlyingAmtIn); + res.debt.approve(address(res.order), underlyingAmtIn); + + uint256 actualOut = vm.parseUint(vm.parseJsonString(testdata, ".expected.testBuyXt.output.netOut")); + uint256 fee = vm.parseUint(vm.parseJsonString(testdata, ".expected.testBuyXt.output.fee")); + StateChecker.OrderState memory expectedState = + JSONLoader.getOrderStateFromJson(testdata, ".expected.testBuyXt.contractState"); + vm.expectEmit(); + emit OrderEvents.SwapExactTokenToToken( + res.debt, res.xt, sender, sender, underlyingAmtIn, uint128(actualOut), uint128(fee) + ); + uint256 netOut = res.order.swapExactTokenToToken( + res.debt, res.xt, sender, underlyingAmtIn, minTokenOut, block.timestamp + 1 hours + ); + + StateChecker.checkOrderState(res, expectedState); + + assert(netOut == actualOut); + assert(res.xt.balanceOf(sender) == netOut); + + vm.stopPrank(); + } + + function testBuyXtMinTokenOut() public { + vm.startPrank(sender); + + uint128 expectedNetOut = + uint128(vm.parseUint(vm.parseJsonString(testdata, ".expected.testBuyXt.output.netOut"))); + uint128 underlyingAmtIn = 5e8; + uint128 minTokenOut = expectedNetOut + 1; + + res.debt.mint(sender, underlyingAmtIn); + res.debt.approve(address(res.order), underlyingAmtIn); + vm.expectRevert(abi.encodeWithSelector(OrderErrors.UnexpectedAmount.selector, minTokenOut, expectedNetOut)); + res.order.swapExactTokenToToken( + res.debt, res.xt, sender, underlyingAmtIn, minTokenOut, block.timestamp + 1 hours + ); + + vm.stopPrank(); + } + + function testSellFt() public { + vm.startPrank(sender); + + uint128 underlyingAmtInForBuyFt = 100e8; + uint128 minFtOut = 0e8; + res.debt.mint(sender, underlyingAmtInForBuyFt); + res.debt.approve(address(res.order), underlyingAmtInForBuyFt); + uint128 ftAmtIn = uint128( + res.order.swapExactTokenToToken( + res.debt, res.ft, sender, underlyingAmtInForBuyFt, minFtOut, block.timestamp + 1 hours + ) + ); + uint128 minTokenOut = 0e8; + res.ft.approve(address(res.order), ftAmtIn); + + uint256 actualOut = vm.parseUint(vm.parseJsonString(testdata, ".expected.testSellFt.output.netOut")); + uint256 fee = vm.parseUint(vm.parseJsonString(testdata, ".expected.testSellFt.output.fee")); + StateChecker.OrderState memory expectedState = + JSONLoader.getOrderStateFromJson(testdata, ".expected.testSellFt.contractState"); + vm.expectEmit(); + emit OrderEvents.SwapExactTokenToToken( + res.ft, res.debt, sender, sender, ftAmtIn, uint128(actualOut), uint128(fee) + ); + uint256 netOut = + res.order.swapExactTokenToToken(res.ft, res.debt, sender, ftAmtIn, minTokenOut, block.timestamp + 1 hours); + + StateChecker.checkOrderState(res, expectedState); + + assert(netOut == actualOut); + assert(res.ft.balanceOf(sender) == 0); + assert(res.debt.balanceOf(sender) == netOut); + + vm.stopPrank(); + } + + function testSellFtMinTokenOut() public { + vm.startPrank(sender); + + uint128 expectedNetOut = + uint128(vm.parseUint(vm.parseJsonString(testdata, ".expected.testSellFt.output.netOut"))); + uint128 underlyingAmtInForBuyFt = 100e8; + uint128 minFtOut = 0e8; + res.debt.mint(sender, underlyingAmtInForBuyFt); + res.debt.approve(address(res.order), underlyingAmtInForBuyFt); + uint128 ftAmtIn = uint128( + res.order.swapExactTokenToToken( + res.debt, res.ft, sender, underlyingAmtInForBuyFt, minFtOut, block.timestamp + 1 hours + ) + ); + uint128 minTokenOut = expectedNetOut + 1; + + res.ft.approve(address(res.order), ftAmtIn); + vm.expectRevert(abi.encodeWithSelector(OrderErrors.UnexpectedAmount.selector, minTokenOut, expectedNetOut)); + res.order.swapExactTokenToToken(res.ft, res.debt, sender, ftAmtIn, minTokenOut, block.timestamp + 1 hours); + + vm.stopPrank(); + } + + function testSellXt() public { + vm.startPrank(sender); + + uint128 underlyingAmtInForBuyXt = 5e8; + uint128 minXTOut = 0e8; + res.debt.mint(sender, underlyingAmtInForBuyXt); + res.debt.approve(address(res.order), underlyingAmtInForBuyXt); + uint128 xtAmtIn = uint128( + res.order.swapExactTokenToToken( + res.debt, res.xt, sender, underlyingAmtInForBuyXt, minXTOut, block.timestamp + 1 hours + ) + ); + uint128 minTokenOut = 0e8; + res.xt.approve(address(res.order), xtAmtIn); + + uint256 actualOut = vm.parseUint(vm.parseJsonString(testdata, ".expected.testSellXt.output.netOut")); + uint256 fee = vm.parseUint(vm.parseJsonString(testdata, ".expected.testSellXt.output.fee")); + StateChecker.OrderState memory expectedState = + JSONLoader.getOrderStateFromJson(testdata, ".expected.testSellXt.contractState"); + vm.expectEmit(); + emit OrderEvents.SwapExactTokenToToken( + res.xt, res.debt, sender, sender, xtAmtIn, uint128(actualOut), uint128(fee) + ); + uint256 netOut = + res.order.swapExactTokenToToken(res.xt, res.debt, sender, xtAmtIn, minTokenOut, block.timestamp + 1 hours); + + StateChecker.checkOrderState(res, expectedState); + + assert(netOut == actualOut); + assert(res.xt.balanceOf(sender) == 0); + assert(res.debt.balanceOf(sender) == netOut); + + vm.stopPrank(); + } + + function testSellXtMinTokenOut() public { + vm.startPrank(sender); + + uint128 expectedNetOut = + uint128(vm.parseUint(vm.parseJsonString(testdata, ".expected.testSellXt.output.netOut"))); + uint128 underlyingAmtInForBuyXt = 5e8; + uint128 minXtOut = 0e8; + res.debt.mint(sender, underlyingAmtInForBuyXt); + res.debt.approve(address(res.order), underlyingAmtInForBuyXt); + uint128 xtAmtIn = uint128( + res.order.swapExactTokenToToken( + res.debt, res.xt, sender, underlyingAmtInForBuyXt, minXtOut, block.timestamp + 1 hours + ) + ); + uint128 minTokenOut = expectedNetOut + 1; + + res.xt.approve(address(res.order), xtAmtIn); + vm.expectRevert(abi.encodeWithSelector(OrderErrors.UnexpectedAmount.selector, minTokenOut, expectedNetOut)); + res.order.swapExactTokenToToken(res.xt, res.debt, sender, xtAmtIn, minTokenOut, block.timestamp + 1 hours); + + vm.stopPrank(); + } + + function testBuyExactFt() public { + vm.startPrank(sender); + uint128 ftOutAmt = 100e8; + uint128 maxTokenIn = 100e8; + res.debt.mint(sender, maxTokenIn); + res.debt.approve(address(res.order), maxTokenIn); + + uint256 actualIn = vm.parseUint(vm.parseJsonString(testdata, ".expected.testBuyExactFt.output.netOut")); + uint256 fee = vm.parseUint(vm.parseJsonString(testdata, ".expected.testBuyExactFt.output.fee")); + StateChecker.OrderState memory expectedState = + JSONLoader.getOrderStateFromJson(testdata, ".expected.testBuyExactFt.contractState"); + vm.expectEmit(); + emit OrderEvents.SwapTokenToExactToken( + res.debt, res.ft, sender, sender, ftOutAmt, uint128(actualIn), uint128(fee) + ); + uint256 netIn = + res.order.swapTokenToExactToken(res.debt, res.ft, sender, ftOutAmt, maxTokenIn, block.timestamp + 1 hours); + + StateChecker.checkOrderState(res, expectedState); + + assert(netIn < maxTokenIn); + assert(res.ft.balanceOf(sender) == ftOutAmt); + assert(res.debt.balanceOf(sender) == maxTokenIn - netIn); + + vm.stopPrank(); + } + + function testBuyExactXt() public { + vm.startPrank(sender); + uint128 xtOutAmt = 100e8; + uint128 maxTokenIn = 100e8; + res.debt.mint(sender, maxTokenIn); + res.debt.approve(address(res.order), maxTokenIn); + + uint256 actualIn = vm.parseUint(vm.parseJsonString(testdata, ".expected.testBuyExactXt.output.netOut")); + uint256 fee = vm.parseUint(vm.parseJsonString(testdata, ".expected.testBuyExactXt.output.fee")); + StateChecker.OrderState memory expectedState = + JSONLoader.getOrderStateFromJson(testdata, ".expected.testBuyExactXt.contractState"); + vm.expectEmit(); + emit OrderEvents.SwapTokenToExactToken( + res.debt, res.xt, sender, sender, xtOutAmt, uint128(actualIn), uint128(fee) + ); + uint256 netIn = + res.order.swapTokenToExactToken(res.debt, res.xt, sender, xtOutAmt, maxTokenIn, block.timestamp + 1 hours); + + StateChecker.checkOrderState(res, expectedState); + + assert(netIn < maxTokenIn); + assert(res.xt.balanceOf(sender) == xtOutAmt); + assert(res.debt.balanceOf(sender) == maxTokenIn - netIn); + vm.stopPrank(); + } + + function testSellFtForExactToken() public { + vm.startPrank(sender); + + uint128 underlyingAmtInForBuyFt = 100e8; + uint128 minFtOut = 0e8; + res.debt.mint(sender, underlyingAmtInForBuyFt); + res.debt.approve(address(res.order), underlyingAmtInForBuyFt); + uint128 maxTokenIn = uint128( + res.order.swapExactTokenToToken( + res.debt, res.ft, sender, underlyingAmtInForBuyFt, minFtOut, block.timestamp + 1 hours + ) + ); + uint128 debtOutAmt = 80e8; + res.ft.approve(address(res.order), maxTokenIn); + + uint256 actualIn = vm.parseUint(vm.parseJsonString(testdata, ".expected.testSellFtForExactToken.output.netOut")); + uint256 fee = vm.parseUint(vm.parseJsonString(testdata, ".expected.testSellFtForExactToken.output.fee")); + StateChecker.OrderState memory expectedState = + JSONLoader.getOrderStateFromJson(testdata, ".expected.testSellFtForExactToken.contractState"); + vm.expectEmit(); + emit OrderEvents.SwapTokenToExactToken( + res.ft, res.debt, sender, sender, debtOutAmt, uint128(actualIn), uint128(fee) + ); + uint256 netIn = + res.order.swapTokenToExactToken(res.ft, res.debt, sender, debtOutAmt, maxTokenIn, block.timestamp + 1 hours); + + StateChecker.checkOrderState(res, expectedState); + + assert(netIn < maxTokenIn); + assert(res.debt.balanceOf(sender) == debtOutAmt); + assert(res.ft.balanceOf(sender) == maxTokenIn - netIn); + + vm.stopPrank(); + } + + function testSellXtForExactToken() public { + vm.startPrank(sender); + + uint128 underlyingAmtInForBuyXt = 5e8; + uint128 minFtOut = 0e8; + res.debt.mint(sender, underlyingAmtInForBuyXt); + res.debt.approve(address(res.order), underlyingAmtInForBuyXt); + uint128 maxTokenIn = uint128( + res.order.swapExactTokenToToken( + res.debt, res.xt, sender, underlyingAmtInForBuyXt, minFtOut, block.timestamp + 1 hours + ) + ); + uint128 debtOutAmt = 3e8; + res.xt.approve(address(res.order), maxTokenIn); + + uint256 actualIn = vm.parseUint(vm.parseJsonString(testdata, ".expected.testSellXtForExactToken.output.netOut")); + uint256 fee = vm.parseUint(vm.parseJsonString(testdata, ".expected.testSellXtForExactToken.output.fee")); + StateChecker.OrderState memory expectedState = + JSONLoader.getOrderStateFromJson(testdata, ".expected.testSellXtForExactToken.contractState"); + vm.expectEmit(); + emit OrderEvents.SwapTokenToExactToken( + res.xt, res.debt, sender, sender, debtOutAmt, uint128(actualIn), uint128(fee) + ); + uint256 netIn = + res.order.swapTokenToExactToken(res.xt, res.debt, sender, debtOutAmt, maxTokenIn, block.timestamp + 1 hours); + + StateChecker.checkOrderState(res, expectedState); + + assert(netIn < maxTokenIn); + assert(res.debt.balanceOf(sender) == debtOutAmt); + assert(res.xt.balanceOf(sender) == maxTokenIn - netIn); + + vm.stopPrank(); + } + + function testByExactFtWhenTermIsNotOpen() public { + uint128 ftInAmt = 100e8; + uint128 maxTokenOut = 100e8; + res.debt.mint(sender, ftInAmt); + res.debt.approve(address(res.market), ftInAmt); + + vm.warp(res.market.config().maturity); + vm.expectRevert(abi.encodeWithSignature("TermIsNotOpen()")); + res.order.swapTokenToExactToken(res.debt, res.ft, sender, maxTokenOut, ftInAmt, block.timestamp + 1 hours); + } + + function testIssueFtWhenSwap() public { + vm.startPrank(maker); + // Mint a GT + (uint256 gtId,) = LoanUtils.fastMintGt(res, maker, 100e8, 1e18); + res.gt.approve(address(res.order), gtId); + orderConfig.gtId = gtId; + res.order.updateOrder(orderConfig, -150e8, 0); + vm.stopPrank(); + + uint128 ftOutAmt = 151e8; + uint128 maxTokenIn = 150e8; + vm.startPrank(sender); + res.debt.mint(sender, maxTokenIn); + res.debt.approve(address(res.order), maxTokenIn); + res.order.swapTokenToExactToken(res.debt, res.ft, sender, ftOutAmt, maxTokenIn, block.timestamp + 1 hours); + assertEq(res.ft.balanceOf(sender), ftOutAmt); + (, uint128 debtAmt,) = res.gt.loanInfo(gtId); + assertGt(debtAmt, 100e8); + vm.stopPrank(); + } + + function testIssueFtWhenNoAssets() public { + vm.startPrank(maker); + // Mint a GT + (uint256 gtId,) = LoanUtils.fastMintGt(res, maker, 100e8, 1e18); + res.gt.approve(address(res.order), gtId); + orderConfig.gtId = gtId; + res.order.updateOrder(orderConfig, -150e8, -150e8); + assert(res.ft.balanceOf(address(res.order)) == 0); + assert(res.xt.balanceOf(address(res.order)) == 0); + vm.stopPrank(); + + uint128 ftOutAmt = 151e8; + uint128 maxTokenIn = 150e8; + vm.startPrank(sender); + res.debt.mint(sender, maxTokenIn); + res.debt.approve(address(res.order), maxTokenIn); + res.order.swapTokenToExactToken(res.debt, res.ft, sender, ftOutAmt, maxTokenIn, block.timestamp + 1 hours); + assertEq(res.ft.balanceOf(sender), ftOutAmt); + (, uint128 debtAmt,) = res.gt.loanInfo(gtId); + assertGt(debtAmt, 100e8); + vm.stopPrank(); + } + + function testRevertWhenIssueFt() public { + vm.prank(maker); + res.order.updateOrder(orderConfig, -150e8, 0); + + uint128 ftOutAmt = 151e8; + uint128 maxTokenIn = 150e8; + vm.startPrank(sender); + + res.debt.mint(sender, maxTokenIn); + res.debt.approve(address(res.order), maxTokenIn); + vm.expectRevert(abi.encodeWithSelector(OrderErrors.CantNotIssueFtWithoutGt.selector)); + res.order.swapTokenToExactToken(res.debt, res.ft, sender, ftOutAmt, maxTokenIn, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function testUpdateOrderConfig() public { + vm.startPrank(maker); + + // Prepare new curve cuts + OrderConfig memory newOrderConfig = JSONLoader.getOrderConfigFromJson(testdata, ".newOrderConfig"); + int256 ftChangeAmt = 1e8; + int256 xtChangeAmt = -1e8; + + deal(address(res.ft), maker, ftChangeAmt.toUint256()); + res.ft.approve(address(res.order), ftChangeAmt.toUint256()); + + // vm.expectEmit(); + // emit OrderEvents.UpdateOrder( + // newOrderConfig.curveCuts, + // ftChangeAmt, + // xtChangeAmt, + // orderConfig.gtId, + // orderConfig.maxXtReserve, + // ISwapCallback(address(0)) + // ); + res.order.updateOrder(newOrderConfig, ftChangeAmt, xtChangeAmt); + + // Verify curve was updated + OrderConfig memory updatedConfig = res.order.orderConfig(); + for (uint256 i = 0; i < updatedConfig.curveCuts.lendCurveCuts.length; i++) { + assertEq( + updatedConfig.curveCuts.lendCurveCuts[i].xtReserve, newOrderConfig.curveCuts.lendCurveCuts[i].xtReserve + ); + assertEq( + updatedConfig.curveCuts.lendCurveCuts[i].liqSquare, newOrderConfig.curveCuts.lendCurveCuts[i].liqSquare + ); + assertEq(updatedConfig.curveCuts.lendCurveCuts[i].offset, newOrderConfig.curveCuts.lendCurveCuts[i].offset); + } + for (uint256 i = 0; i < updatedConfig.curveCuts.borrowCurveCuts.length; i++) { + assertEq( + updatedConfig.curveCuts.borrowCurveCuts[i].xtReserve, + newOrderConfig.curveCuts.borrowCurveCuts[i].xtReserve + ); + assertEq( + updatedConfig.curveCuts.borrowCurveCuts[i].liqSquare, + newOrderConfig.curveCuts.borrowCurveCuts[i].liqSquare + ); + assertEq( + updatedConfig.curveCuts.borrowCurveCuts[i].offset, newOrderConfig.curveCuts.borrowCurveCuts[i].offset + ); + } + assertEq(res.xt.balanceOf(maker), (-xtChangeAmt).toUint256()); + assertEq(res.ft.balanceOf(maker), 0); + + vm.stopPrank(); + } + + function testOnlyMakerCanUpdateOrder() public { + vm.startPrank(sender); + + vm.expectRevert(abi.encodeWithSignature("OwnableUnauthorizedAccount(address)", sender)); + res.order.updateOrder(orderConfig, 0, 0); + + vm.stopPrank(); + } + + function testPauseAndUnpause() public { + vm.startPrank(maker); + + // Test pause + res.order.pause(); + assertTrue(TermMaxOrderV2(address(res.order)).paused()); + + // Verify swaps are blocked when paused + vm.expectRevert(abi.encodeWithSignature("EnforcedPause()")); + res.order.swapExactTokenToToken(res.ft, res.debt, sender, 1e8, 0, block.timestamp + 1 hours); + + // Test unpause + res.order.unpause(); + assertFalse(TermMaxOrderV2(address(res.order)).paused()); + + vm.stopPrank(); + } + + function testOnlyMakerCanPause() public { + vm.startPrank(sender); + + vm.expectRevert(abi.encodeWithSignature("OwnableUnauthorizedAccount(address)", sender)); + res.order.pause(); + + vm.stopPrank(); + } + + function testSwapReverts() public { + vm.startPrank(sender); + + // Test same token swap + vm.expectRevert(OrderErrors.CantSwapSameToken.selector); + res.order.swapExactTokenToToken(res.ft, res.ft, sender, 1e8, 0, block.timestamp + 1 hours); + + IERC20 token0 = IERC20(vm.randomAddress()); + IERC20 token1 = IERC20(vm.randomAddress()); + // Test invalid token combination + vm.expectRevert(abi.encodeWithSelector(OrderErrors.CantNotSwapToken.selector, token0, token1)); + res.order.swapExactTokenToToken(token0, token1, sender, 1e8, 0, block.timestamp + 1 hours); + + vm.stopPrank(); + } + + function testSwapWithCallback(uint128 swapAmt, bool isBuy, bool isFt) public { + vm.assume(swapAmt > 0 && swapAmt < 0.1e8); + + // Deploy mock callback contract + MockSwapCallback callback = new MockSwapCallback(); + + orderConfig.swapTrigger = callback; + vm.startPrank(maker); + res.order.updateOrder(orderConfig, 0, 0); + + res.debt.mint(maker, 150e8); + res.debt.approve(address(res.market), 150e8); + res.market.mint(address(res.order), 150e8); + vm.stopPrank(); + + vm.startPrank(sender); + + res.debt.mint(sender, swapAmt * 2); + + res.debt.approve(address(res.order), swapAmt); + res.debt.approve(address(res.market), swapAmt); + res.market.mint(sender, swapAmt); + + IERC20 tokenIn; + IERC20 tokenOut; + + if (isBuy && isFt) { + tokenIn = res.debt; + tokenOut = res.ft; + } + + if (isBuy && !isFt) { + tokenIn = res.debt; + tokenOut = res.xt; + } + + if (!isBuy && isFt) { + tokenIn = res.ft; + tokenOut = res.debt; + } + + if (!isBuy && !isFt) { + tokenIn = res.xt; + tokenOut = res.debt; + } + uint256 ftBalanceBefore = res.ft.balanceOf(address(res.order)); + uint256 xtBalanceBefore = res.xt.balanceOf(address(res.order)); + tokenIn.approve(address(res.order), swapAmt); + res.order.swapExactTokenToToken(tokenIn, tokenOut, sender, swapAmt, 0, block.timestamp + 1 hours); + + uint256 ftBalanceAfter = res.ft.balanceOf(address(res.order)); + uint256 xtBalanceAfter = res.xt.balanceOf(address(res.order)); + + assertEq(ftBalanceBefore.toInt256() + callback.deltaFt(), ftBalanceAfter.toInt256()); + assertEq(xtBalanceBefore.toInt256() + callback.deltaXt(), xtBalanceAfter.toInt256()); + + vm.stopPrank(); + } + + function testUpdateOrderFeeRate() public { + // Create new fee config + FeeConfig memory newFeeConfig = marketConfig.feeConfig; + newFeeConfig.lendTakerFeeRatio++; + newFeeConfig.borrowTakerFeeRatio++; + + // Test that non-owner cannot update fee rate + vm.expectRevert(abi.encodeWithSelector(OrderErrors.OnlyMarket.selector)); + vm.prank(sender); + res.order.updateFeeConfig(newFeeConfig); + + // Test that owner can update fee rate + vm.startPrank(deployer); + res.market.updateOrderFeeRate(res.order, newFeeConfig); + assertEq(res.order.orderConfig().feeConfig.lendTakerFeeRatio, newFeeConfig.lendTakerFeeRatio); + assertEq(res.order.orderConfig().feeConfig.borrowTakerFeeRatio, newFeeConfig.borrowTakerFeeRatio); + + // Test invalid fee rates (over 100%) + FeeConfig memory invalidFeeConfig = marketConfig.feeConfig; + invalidFeeConfig.lendTakerFeeRatio = Constants.MAX_FEE_RATIO; + vm.expectRevert(abi.encodeWithSelector(MarketErrors.FeeTooHigh.selector)); + res.market.updateOrderFeeRate(res.order, invalidFeeConfig); + vm.stopPrank(); + } + + function testRevertLendIsNotAllowed() public { + vm.startPrank(maker); + OrderConfig memory testOrderConfig = res.order.orderConfig(); + testOrderConfig.curveCuts.borrowCurveCuts = new CurveCut[](0); + + vm.expectEmit(); + emit OrderEvents.UpdateOrder( + testOrderConfig.curveCuts, + 0, + 0, + testOrderConfig.gtId, + testOrderConfig.maxXtReserve, + ISwapCallback(address(0)) + ); + res.order.updateOrder(testOrderConfig, 0, 0); + vm.stopPrank(); + + vm.startPrank(sender); + + uint128 underlyingAmtIn = 100e8; + uint128 minTokenOut = 0e8; + res.debt.mint(sender, underlyingAmtIn); + res.debt.approve(address(res.order), underlyingAmtIn); + + vm.expectRevert(abi.encodeWithSelector(OrderErrors.LendIsNotAllowed.selector)); + res.order.swapExactTokenToToken( + res.debt, res.ft, sender, underlyingAmtIn, minTokenOut, block.timestamp + 1 hours + ); + + vm.stopPrank(); + } + + function testRevertBorrowIsNotAllowed() public { + vm.startPrank(maker); + OrderConfig memory testOrderConfig = res.order.orderConfig(); + testOrderConfig.curveCuts.lendCurveCuts = new CurveCut[](0); + + vm.expectEmit(); + emit OrderEvents.UpdateOrder( + testOrderConfig.curveCuts, + 0, + 0, + testOrderConfig.gtId, + testOrderConfig.maxXtReserve, + ISwapCallback(address(0)) + ); + res.order.updateOrder(testOrderConfig, 0, 0); + vm.stopPrank(); + + vm.startPrank(sender); + + uint128 underlyingAmtIn = 100e8; + uint128 minTokenOut = 0e8; + res.debt.mint(sender, underlyingAmtIn); + res.debt.approve(address(res.order), underlyingAmtIn); + + vm.expectRevert(abi.encodeWithSelector(OrderErrors.BorrowIsNotAllowed.selector)); + res.order.swapExactTokenToToken( + res.debt, res.xt, sender, underlyingAmtIn, minTokenOut, block.timestamp + 1 hours + ); + + vm.stopPrank(); + } + + function testUtWhenDeadlineLessThanBlockTime() public { + vm.startPrank(sender); + + uint128 swapAmt = 5e8; + IERC20 tokenIn = IERC20(address(res.debt)); + IERC20 tokenOut = IERC20(address(res.xt)); + + // Set block timestamp + uint256 currentTime = 1000; + vm.warp(currentTime); + + // Try to swap with deadline less than block time + uint256 pastDeadline = currentTime - 1; + + tokenIn.approve(address(res.order), swapAmt); + + vm.expectRevert(OrderErrors.DeadlineExpired.selector); + res.order.swapExactTokenToToken(tokenIn, tokenOut, sender, swapAmt, 0, pastDeadline); + + vm.expectRevert(OrderErrors.DeadlineExpired.selector); + res.order.swapTokenToExactToken(tokenIn, tokenOut, sender, 1, swapAmt, pastDeadline); + + vm.stopPrank(); + } + + function testAprWithoutCurve() public { + vm.startPrank(maker); + OrderConfig memory testOrderConfig = res.order.orderConfig(); + testOrderConfig.curveCuts.lendCurveCuts = new CurveCut[](0); + testOrderConfig.curveCuts.borrowCurveCuts = new CurveCut[](0); + + vm.expectEmit(); + emit OrderEvents.UpdateOrder( + testOrderConfig.curveCuts, + 0, + 0, + testOrderConfig.gtId, + testOrderConfig.maxXtReserve, + ISwapCallback(address(0)) + ); + res.order.updateOrder(testOrderConfig, 0, 0); + vm.stopPrank(); + + (uint256 lendApr, uint256 borrowApr) = res.order.apr(); + + assert(lendApr == 0); + assert(borrowApr == type(uint256).max); + } + + function testAprWithCurve() public { + vm.startPrank(maker); + OrderConfig memory testOrderConfig = res.order.orderConfig(); + testOrderConfig.curveCuts.lendCurveCuts = new CurveCut[](0); + + res.order.updateOrder(testOrderConfig, 0, 0); + + (uint256 lendApr, uint256 borrowApr) = res.order.apr(); + + assert(lendApr == 0); + + testOrderConfig = res.order.orderConfig(); + testOrderConfig.curveCuts.borrowCurveCuts = new CurveCut[](0); + res.order.updateOrder(testOrderConfig, 0, 0); + + (lendApr, borrowApr) = res.order.apr(); + + assert(borrowApr == type(uint256).max); + + vm.stopPrank(); + } +} + +// Mock contracts for testing +contract MockSwapCallback is ISwapCallback { + int256 public deltaFt; + int256 public deltaXt; + + function afterSwap(uint256, uint256, int256 deltaFt_, int256 deltaXt_) external override { + deltaFt = deltaFt_; + deltaXt = deltaXt_; + } +} diff --git a/test/v2/TermMaxToken.t.sol b/test/v2/TermMaxToken.t.sol new file mode 100644 index 0000000..d5c3de9 --- /dev/null +++ b/test/v2/TermMaxToken.t.sol @@ -0,0 +1,440 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {TermMaxToken, StakingBuffer} from "contracts/tokens/TermMaxToken.sol"; +import {Test} from "forge-std/Test.sol"; +import {MockAave} from "contracts/v2/test/MockAave.sol"; +import {MockERC20} from "contracts/v1/test/MockERC20.sol"; +import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import {IERC20Errors} from "@openzeppelin/contracts/interfaces/draft-IERC6093.sol"; + +contract TermMaxTokenTest is Test { + TermMaxToken public termMaxToken; + MockAave public aavePool; + MockERC20 public underlying; + address public admin = vm.randomAddress(); + + function setUp() public { + underlying = new MockERC20("USDC", "USDC", 6); + aavePool = new MockAave(address(underlying)); + + vm.label(address(underlying), "USDC"); + vm.label(address(aavePool), "AavePool"); + vm.label(admin, "Admin"); + + address implementation = address(new TermMaxToken(address(aavePool), 0)); + termMaxToken = TermMaxToken( + address( + new ERC1967Proxy( + implementation, + abi.encodeWithSelector( + TermMaxToken.initialize.selector, + admin, + address(underlying), + StakingBuffer.BufferConfig({minimumBuffer: 1000e6, maximumBuffer: 10000e6, buffer: 5000e6}) + ) + ) + ) + ); + + vm.label(address(termMaxToken), "tmxUSDC"); + } + + function testMint() public { + uint256 amount = 1000e6; + underlying.mint(address(this), amount); + underlying.approve(address(termMaxToken), amount); + + termMaxToken.mint(address(this), amount); + + assertEq(termMaxToken.balanceOf(address(this)), amount); + assertEq(underlying.balanceOf(address(this)), 0); + // Check that aTokens were minted to the TermMaxToken contract + assertEq(aavePool.balanceOf(address(termMaxToken)), 0); + assertEq(underlying.balanceOf(address(termMaxToken)), amount); + } + + function testBurn() public { + uint256 amount = 1000e6; + underlying.mint(address(this), amount); + underlying.approve(address(termMaxToken), amount); + termMaxToken.mint(address(this), amount); + + termMaxToken.burn(address(this), amount); + + assertEq(termMaxToken.balanceOf(address(this)), 0); + assertEq(underlying.balanceOf(address(this)), amount); + assertEq(aavePool.balanceOf(address(termMaxToken)), 0); + } + + function testBurnToAToken() public { + uint256 amount = 1000e6; + underlying.mint(address(this), amount); + underlying.approve(address(termMaxToken), amount); + termMaxToken.mint(address(this), amount); + + vm.expectRevert(); + termMaxToken.burnToAToken(address(this), amount); + + underlying.mint(address(this), amount * 10); + underlying.approve(address(termMaxToken), amount * 10); + termMaxToken.mint(address(this), amount * 10); + + termMaxToken.burnToAToken(address(this), amount); + + assertEq(termMaxToken.balanceOf(address(this)), amount * 10); + assertEq(aavePool.balanceOf(address(this)), amount); + } + + function testWithdrawIncomeAssets() public { + // Setup - mint some tokens + uint256 amount = 1000e6; + underlying.mint(address(this), amount); + underlying.approve(address(termMaxToken), amount); + termMaxToken.mint(address(this), amount); + + // Simulate yield by directly minting aTokens to the TermMaxToken contract + uint256 yieldAmount = 100e6; + aavePool.simulateInterestAccrual(address(termMaxToken), yieldAmount); + + // Withdraw income as the admin + vm.startPrank(admin); + termMaxToken.withdrawIncomeAssets(address(underlying), admin, yieldAmount); + vm.stopPrank(); + + // Assert balances are correct + assertEq(underlying.balanceOf(admin), yieldAmount); + assertEq(termMaxToken.totalIncomeAssets(), yieldAmount); + } + + function testUpdateBufferConfigAndAddReserves() public { + uint256 additionalReserves = 500e6; + underlying.mint(admin, additionalReserves); + + vm.startPrank(admin); + underlying.approve(address(termMaxToken), additionalReserves); + + StakingBuffer.BufferConfig memory newConfig = + StakingBuffer.BufferConfig({minimumBuffer: 2000e6, maximumBuffer: 20000e6, buffer: 10000e6}); + + termMaxToken.updateBufferConfigAndAddReserves(additionalReserves, newConfig); + vm.stopPrank(); + + // Get current buffer config + (uint256 minimumBuffer, uint256 maximumBuffer, uint256 buffer) = termMaxToken.bufferConfig(); + + // Assert the new config was set correctly + assertEq(minimumBuffer, newConfig.minimumBuffer); + assertEq(maximumBuffer, newConfig.maximumBuffer); + assertEq(buffer, newConfig.buffer); + + // Assert the additional reserves were added + assertEq(underlying.balanceOf(address(termMaxToken)), additionalReserves); + } + + function testTotalIncomeAssets() public { + uint256 amount = 1000e6; + underlying.mint(address(this), amount); + underlying.approve(address(termMaxToken), amount); + termMaxToken.mint(address(this), amount); + + // Simulate yield by directly minting aTokens to the TermMaxToken contract + uint256 yieldAmount = 100e6; + aavePool.simulateInterestAccrual(address(termMaxToken), yieldAmount); + + assertEq(termMaxToken.totalIncomeAssets(), yieldAmount); + } + + function testMintZeroAmount() public { + // The mint function doesn't explicitly check for zero amounts at the ERC20 level, + // but it should revert due to transferFrom of zero amount or other validations + underlying.mint(address(this), 0); + underlying.approve(address(termMaxToken), 0); + + // This should succeed as minting 0 tokens is typically allowed + termMaxToken.mint(address(this), 0); + assertEq(termMaxToken.balanceOf(address(this)), 0); + } + + function testBurnMoreThanBalance() public { + uint256 amount = 1000e6; + underlying.mint(address(this), amount); + underlying.approve(address(termMaxToken), amount); + termMaxToken.mint(address(this), amount); + + vm.expectRevert(); + termMaxToken.burn(address(this), amount + 1); + } + + function testWithdrawTooMuchIncome() public { + // Setup - mint some tokens + uint256 amount = 1000e6; + underlying.mint(address(this), amount); + underlying.approve(address(termMaxToken), amount); + termMaxToken.mint(address(this), amount); + + // Simulate yield by directly minting aTokens to the TermMaxToken contract + uint256 yieldAmount = 100e6; + aavePool.simulateInterestAccrual(address(termMaxToken), yieldAmount); + + // Try to withdraw more than available income + vm.startPrank(admin); + vm.expectRevert(); + termMaxToken.withdrawIncomeAssets(address(underlying), admin, yieldAmount + 1); + vm.stopPrank(); + } + + function testNonAdminCannotWithdrawIncome() public { + // Setup - mint some tokens + uint256 amount = 1000e6; + underlying.mint(address(this), amount); + underlying.approve(address(termMaxToken), amount); + termMaxToken.mint(address(this), amount); + + // Simulate yield by directly minting aTokens to the TermMaxToken contract + uint256 yieldAmount = 100e6; + aavePool.simulateInterestAccrual(address(termMaxToken), yieldAmount); + + // Try to withdraw as non-admin + vm.expectRevert(); + termMaxToken.withdrawIncomeAssets(address(underlying), address(this), yieldAmount); + } + + function testNonAdminCannotUpdateBufferConfig() public { + StakingBuffer.BufferConfig memory newConfig = + StakingBuffer.BufferConfig({minimumBuffer: 2000e6, maximumBuffer: 20000e6, buffer: 10000e6}); + + vm.expectRevert(); + termMaxToken.updateBufferConfigAndAddReserves(0, newConfig); + } + + function testWithdrawIncomeAsAToken() public { + // Setup - mint some tokens + uint256 amount = 1000e6; + underlying.mint(address(this), amount); + underlying.approve(address(termMaxToken), amount); + termMaxToken.mint(address(this), amount); + + // Simulate yield by directly minting aTokens to the TermMaxToken contract + uint256 yieldAmount = 100e6; + aavePool.simulateInterestAccrual(address(termMaxToken), yieldAmount); + + // Withdraw income as aToken + vm.startPrank(admin); + termMaxToken.withdrawIncomeAssets(address(aavePool), admin, yieldAmount); + vm.stopPrank(); + + // Assert balances are correct + assertEq(aavePool.balanceOf(admin), yieldAmount); + } + + function testWithdrawIncomeAsInvalidToken() public { + // Setup + MockERC20 invalidToken = new MockERC20("Invalid", "INV", 18); + + // Attempt to withdraw income with invalid token + vm.startPrank(admin); + vm.expectRevert(); + termMaxToken.withdrawIncomeAssets(address(invalidToken), admin, 100e6); + vm.stopPrank(); + } + + function testInvalidBufferConfiguration() public { + vm.startPrank(admin); + + // Test minimum buffer greater than maximum buffer + vm.expectRevert(abi.encodeWithSelector(StakingBuffer.InvalidBuffer.selector, 10000e6, 5000e6, 7500e6)); + termMaxToken.updateBufferConfigAndAddReserves( + 0, StakingBuffer.BufferConfig({minimumBuffer: 10000e6, maximumBuffer: 5000e6, buffer: 7500e6}) + ); + + // Test buffer outside min/max range (below minimum) + vm.expectRevert(abi.encodeWithSelector(StakingBuffer.InvalidBuffer.selector, 5000e6, 10000e6, 4000e6)); + termMaxToken.updateBufferConfigAndAddReserves( + 0, StakingBuffer.BufferConfig({minimumBuffer: 5000e6, maximumBuffer: 10000e6, buffer: 4000e6}) + ); + + // Test buffer outside min/max range (above maximum) + vm.expectRevert(abi.encodeWithSelector(StakingBuffer.InvalidBuffer.selector, 5000e6, 10000e6, 11000e6)); + termMaxToken.updateBufferConfigAndAddReserves( + 0, StakingBuffer.BufferConfig({minimumBuffer: 5000e6, maximumBuffer: 10000e6, buffer: 11000e6}) + ); + + vm.stopPrank(); + } + + function testUnauthorizedAccess() public { + address unauthorizedUser = vm.randomAddress(); + + // Test unauthorized buffer config update + vm.startPrank(unauthorizedUser); + vm.expectRevert(); + termMaxToken.updateBufferConfigAndAddReserves( + 0, StakingBuffer.BufferConfig({minimumBuffer: 2000e6, maximumBuffer: 20000e6, buffer: 10000e6}) + ); + vm.stopPrank(); + + // Test unauthorized income withdrawal + vm.startPrank(unauthorizedUser); + vm.expectRevert(); + termMaxToken.withdrawIncomeAssets(address(termMaxToken), unauthorizedUser, 100e6); + vm.stopPrank(); + } + + function testBurnToATokenInsufficientStaking() public { + uint256 amount = 1000e6; + underlying.mint(address(this), amount); + underlying.approve(address(termMaxToken), amount); + termMaxToken.mint(address(this), amount); + + // Should revert when trying to burn to aToken without sufficient staking buffer + vm.expectRevert( + abi.encodeWithSelector(IERC20Errors.ERC20InsufficientBalance.selector, address(termMaxToken), 0, amount) + ); + termMaxToken.burnToAToken(address(this), amount); + } + + function testBurnToATokenExceedsBalance() public { + uint256 amount = 1000e6; + underlying.mint(address(this), amount * 20); + underlying.approve(address(termMaxToken), amount * 20); + termMaxToken.mint(address(this), amount * 20); + + // Should revert when trying to burn more than balance + vm.expectRevert( + abi.encodeWithSelector( + IERC20Errors.ERC20InsufficientBalance.selector, address(this), amount * 20, amount * 21 + ) + ); + termMaxToken.burnToAToken(address(this), amount * 21); + } + + function testMintWithInsufficientApproval() public { + uint256 amount = 1000e6; + underlying.mint(address(this), amount); + underlying.approve(address(termMaxToken), amount - 1); // Insufficient approval + + vm.expectRevert( + abi.encodeWithSelector( + IERC20Errors.ERC20InsufficientAllowance.selector, address(termMaxToken), amount - 1, amount + ) + ); + termMaxToken.mint(address(this), amount); + } + + function testBurnWithInsufficientBalance() public { + uint256 amount = 1000e6; + underlying.mint(address(this), amount); + underlying.approve(address(termMaxToken), amount); + termMaxToken.mint(address(this), amount); + + // Try to burn more than balance + vm.expectRevert( + abi.encodeWithSelector(IERC20Errors.ERC20InsufficientBalance.selector, address(this), amount, amount + 1) + ); + termMaxToken.burn(address(this), amount + 1); + } + + function testWithdrawIncomeToZeroAddress() public { + uint256 amount = 1000e6; + underlying.mint(address(this), amount); + underlying.approve(address(termMaxToken), amount); + termMaxToken.mint(address(this), amount); + + uint256 yieldAmount = 100e6; + aavePool.simulateInterestAccrual(address(termMaxToken), yieldAmount); + + vm.startPrank(admin); + vm.expectRevert(abi.encodeWithSelector(IERC20Errors.ERC20InvalidReceiver.selector, address(0))); + termMaxToken.withdrawIncomeAssets(address(underlying), address(0), yieldAmount); + vm.stopPrank(); + } + + function testMintToZeroAddress() public { + uint256 amount = 1000e6; + underlying.mint(address(this), amount); + underlying.approve(address(termMaxToken), amount); + + vm.expectRevert(abi.encodeWithSelector(IERC20Errors.ERC20InvalidReceiver.selector, address(0))); + termMaxToken.mint(address(0), amount); + } + + function testBurnToZeroAddress() public { + uint256 amount = 1000e6; + underlying.mint(address(this), amount); + underlying.approve(address(termMaxToken), amount); + termMaxToken.mint(address(this), amount); + vm.expectRevert(abi.encodeWithSelector(IERC20Errors.ERC20InvalidReceiver.selector, address(0))); + termMaxToken.burn(address(0), amount); + } + + function testUpdateBufferWithInsufficientBalance() public { + uint256 additionalReserves = 500e6; + // Don't mint tokens to admin + + vm.startPrank(admin); + underlying.approve(address(termMaxToken), additionalReserves); + + StakingBuffer.BufferConfig memory newConfig = + StakingBuffer.BufferConfig({minimumBuffer: 2000e6, maximumBuffer: 20000e6, buffer: 10000e6}); + + vm.expectRevert( + abi.encodeWithSelector(IERC20Errors.ERC20InsufficientBalance.selector, admin, 0, additionalReserves) + ); + termMaxToken.updateBufferConfigAndAddReserves(additionalReserves, newConfig); + vm.stopPrank(); + } + + function testTermMaxTokenFuzzActions() public { + vm.prank(admin); + termMaxToken.updateBufferConfigAndAddReserves( + 0, StakingBuffer.BufferConfig({minimumBuffer: 500e6, maximumBuffer: 1000e6, buffer: 700e6}) + ); + + address[] memory accounts = new address[](10); + for (uint256 i = 0; i < accounts.length; i++) { + accounts[i] = vm.addr(i + 1); // Create unique addresses for each account + } + uint256 totalInterest = 0; + for (uint256 i = 0; i < 1000; i++) { + uint256 amount = vm.randomUint(1e6, 1000000e6); + address account = accounts[vm.randomUint(0, accounts.length - 1)]; + vm.startPrank(account); + uint256 action = vm.randomUint(0, 2); // 0 for mint, 1 for burn + + uint256 underlyingBalanceBefore = underlying.balanceOf(account); + uint256 tmxTokenBalanceBefore = termMaxToken.balanceOf(account); + if (action == 0 || tmxTokenBalanceBefore < amount) { + if (underlyingBalanceBefore < amount) { + underlying.mint(account, amount - underlyingBalanceBefore); + } + // Mint action + underlying.mint(account, amount); + underlying.approve(address(termMaxToken), amount); + termMaxToken.mint(account, amount); + assertEq(termMaxToken.balanceOf(account), amount + tmxTokenBalanceBefore); + } else { + // Burn action + if (termMaxToken.balanceOf(account) >= amount) { + termMaxToken.burn(account, amount); + assertEq(termMaxToken.balanceOf(account), tmxTokenBalanceBefore - amount); + assertEq(underlying.balanceOf(account), underlyingBalanceBefore + amount); + } + } + + // Simulate interest accrual + uint256 rate = vm.randomUint(0.01e8, 0.1e8); + uint256 aTokenBalanceBefore = aavePool.balanceOf(address(termMaxToken)); + uint256 interest = (aTokenBalanceBefore * rate) / 1e8; // Interest accrued + aavePool.simulateInterestAccrual(address(termMaxToken), interest); + totalInterest += interest; + vm.stopPrank(); + } + + assertEq(termMaxToken.totalIncomeAssets(), totalInterest); + assertEq( + underlying.balanceOf(address(termMaxToken)) + aavePool.balanceOf(address(termMaxToken)), + totalInterest + termMaxToken.totalSupply() + ); + } +} diff --git a/test/v2/VaultDustV2.t.sol b/test/v2/VaultDustV2.t.sol new file mode 100644 index 0000000..b7bf551 --- /dev/null +++ b/test/v2/VaultDustV2.t.sol @@ -0,0 +1,273 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "forge-std/Test.sol"; +import {console} from "forge-std/console.sol"; +import {DeployUtils} from "./utils/DeployUtils.sol"; +import {JSONLoader} from "./utils/JSONLoader.sol"; +import {StateChecker} from "./utils/StateChecker.sol"; +import {SwapUtils} from "./utils/SwapUtils.sol"; +import {LoanUtils} from "./utils/LoanUtils.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; +import {IFlashLoanReceiver} from "contracts/v1/IFlashLoanReceiver.sol"; +import { + ITermMaxMarketV2, + ITermMaxMarket, + TermMaxMarketV2, + Constants, + MarketErrors, + MarketEvents, + IMintableERC20 +} from "contracts/v2/TermMaxMarketV2.sol"; +import {ITermMaxOrder, TermMaxOrderV2, ISwapCallback, OrderEvents} from "contracts/v2/TermMaxOrderV2.sol"; +import {MockERC20, ERC20} from "contracts/v1/test/MockERC20.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {MockFlashLoanReceiver} from "contracts/v1/test/MockFlashLoanReceiver.sol"; +import {IGearingToken} from "contracts/v1/tokens/IGearingToken.sol"; +import { + VaultInitialParams, + MarketConfig, + MarketInitialParams, + LoanConfig, + OrderConfig, + CurveCuts, + IOracle +} from "contracts/v1/storage/TermMaxStorage.sol"; +import { + ITermMaxVault, + ITermMaxVaultV2, + TermMaxVaultV2, + VaultErrors, + VaultEvents, + VaultConstants, + OrderInfo +} from "contracts/v2/vault/TermMaxVaultV2.sol"; +import {PendingUint192, PendingLib} from "contracts/v1/lib/PendingLib.sol"; + +contract VaultDustTestV2 is Test { + using JSONLoader for *; + using SafeCast for *; + + OrderConfig orderConfig; + MarketConfig marketConfig; + + address deployer = vm.randomAddress(); + address curator = vm.randomAddress(); + address allocator = vm.randomAddress(); + address guardian = vm.randomAddress(); + address lper = vm.randomAddress(); + address treasurer = vm.randomAddress(); + string testdata; + + ITermMaxVault vault; + + uint256 timelock = 86400; + uint256 maxCapacity = 1000000e18; + uint64 performanceFeeRate = 0.1e8; + + ITermMaxMarket market2; + + uint256 currentTime; + uint32 maxLtv = 0.89e8; + uint32 liquidationLtv = 0.9e8; + VaultInitialParams initialParams; + + DeployUtils.Res[] resources; + + address bob = vm.addr(0x123); + address alice = vm.addr(0x456); + address charlie = vm.addr(0x789); + + address[] users = [bob, alice, charlie]; + + uint256[] durations = [3, 4, 10, 20, 5, 5, 3, 15, 20, 12]; + + function setUp() public { + vm.startPrank(deployer); + testdata = vm.readFile(string.concat(vm.projectRoot(), "/test/testdata/testdata.json")); + + currentTime = vm.parseUint(vm.parseJsonString(testdata, ".currentTime")); + vm.warp(currentTime); + + marketConfig = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); + orderConfig = JSONLoader.getOrderConfigFromJson(testdata, ".orderConfig"); + + MockERC20 debt = new MockERC20("DAI", "DAI", 6); + for (uint256 i = 0; i < 10; i++) { + resources.push( + DeployUtils.deployMockMarket2(deployer, debt, durations[i], marketConfig, maxLtv, liquidationLtv) + ); + } + + initialParams = VaultInitialParams( + deployer, curator, timelock, debt, maxCapacity, "Vault-DAI", "Vault-DAI", performanceFeeRate + ); + + vault = DeployUtils.deployVault(initialParams); + + vault.submitGuardian(guardian); + vault.setIsAllocator(allocator, true); + + for (uint256 i = 0; i < resources.length; i++) { + address market = address(resources[i].market); + vault.submitMarket(market, true); + vm.warp(currentTime + timelock + 1); + vault.acceptMarket(market); + vm.warp(currentTime); + } + + vm.stopPrank(); + + debt.mint(bob, 10000e16); + vm.startPrank(bob); + debt.approve(address(vault), maxCapacity); + vault.deposit(10000e16 / 2, bob); + vm.stopPrank(); + + vm.startPrank(alice); + debt.mint(alice, 5000e18); + debt.approve(address(vault), maxCapacity); + vault.deposit(5000e18 / 2, alice); + vm.stopPrank(); + + vm.startPrank(charlie); + debt.mint(charlie, 20e15); + debt.approve(address(vault), maxCapacity); + vault.deposit(20e15 / 2, charlie); + vm.stopPrank(); + + for (uint256 i = 0; i < resources.length; i++) { + vm.startPrank(deployer); + ITermMaxMarket market = resources[i].market; + resources[i].order = vault.createOrder(market, maxCapacity, i * 1e15, orderConfig.curveCuts); + vm.stopPrank(); + } + } + + function testDust() public { + uint256 count = 0; + while (block.timestamp < currentTime + 30 days) { + uint256 k = vm.randomUint(2 ** 128 - 1, 2 ** 256 - 1); + uint256 period = vm.randomUint(2000, 3600); + count++; + vm.warp(block.timestamp); + uint256 i = k % 10; + // ITermMaxMarket market = resources[i].market; + ITermMaxOrder order = resources[i].order; + uint256 amount = k % 1e4; + // (, uint256 borrowApr) = order.apr(); + // uint256 virturalApr = borrowApr * (block.timestamp - currentTime) / 365 days; + uint256 ftBalance = resources[i].ft.balanceOf(address(order)); + uint256 xtBalance = resources[i].xt.balanceOf(address(order)); + + if (xtBalance < ftBalance * 8 / 10 && amount * 2 < ftBalance) { + console.log("buy ft:", amount); + buyFt(order, uint128(amount), uint128(amount * 2)); + } else if (amount * 2 < xtBalance) { + console.log("buy xt:", amount); + buyXt(order, uint128(amount), uint128(amount * 2)); + } + + if (i < 3) { + vm.prank(users[i]); + if (block.timestamp % 2 == 0) { + console.log("redeem:", i); + vault.redeem(1e5, users[i], users[i]); + } else { + console.log("deposit:", i); + vault.deposit(1e5, users[i]); + } + } + + vm.warp(block.timestamp + period); + } + vm.warp(block.timestamp + 60 days); + console.log("---- do redeem ---"); + for (uint256 i = 0; i < resources.length; i++) { + vm.prank(curator); + vault.redeemOrder(resources[i].order); + } + uint256 performanceFee = vault.performanceFee(); + console.log("performanceFee:", performanceFee); + vm.prank(curator); + vault.withdrawPerformanceFee(curator, performanceFee); + + vm.warp(block.timestamp + 10); + console.log("---- status ---"); + console.log("run count:", count); + console.log("total assets:", vault.totalAssets()); + console.log("total supply:", vault.totalSupply()); + console.log("annualizedInterest:", vault.annualizedInterest()); + console.log("apy:", ITermMaxVaultV2(address(vault)).apy()); + console.log("total ft:", vault.totalFt()); + console.log("actual balance:", resources[0].debt.balanceOf(address(vault))); + console.log("accretingPrincipal:", vault.accretingPrincipal()); + + console.log("---- do redeem ---"); + console.log("asset:", address(resources[0].debt)); + console.log("vault:", address(vault)); + for (uint256 i = 0; i < resources.length; i++) { + address collateral = address(resources[i].collateral); + if (vault.badDebtMapping(collateral) > 0) { + console.log("badDebt:", vault.badDebtMapping(collateral)); + console.log("collateral:", collateral); + } + } + for (uint256 i = 0; i < users.length; i++) { + console.log("user i:", i); + console.log("balance:", vault.balanceOf(users[i])); + vm.startPrank(users[i]); + uint256 redeemed = vault.redeem(vault.balanceOf(users[i]), users[i], users[i]); + console.log("redeemed:", redeemed); + console.log("remainning total assets:", vault.totalAssets()); + vm.stopPrank(); + } + uint256 dustAmt = resources[0].debt.balanceOf(address(vault)); + console.log("remaining balance:", dustAmt); + assertLe(dustAmt, 3); + } + + function buyFt(ITermMaxOrder order, uint128 tokenAmtIn, uint128 ftAmtOut) internal { + address taker = vm.randomAddress(); + (IMintableERC20 ft, IMintableERC20 xt,,, IERC20 debt) = order.market().tokens(); + IMintableERC20(address(debt)).mint(taker, tokenAmtIn); + vm.startPrank(taker); + debt.approve(address(order), tokenAmtIn); + order.swapExactTokenToToken(debt, ft, taker, tokenAmtIn, ftAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function buyXt(ITermMaxOrder order, uint128 tokenAmtIn, uint128 xtAmtOut) internal { + address taker = vm.randomAddress(); + (IMintableERC20 ft, IMintableERC20 xt,,, IERC20 debt) = order.market().tokens(); + IMintableERC20(address(debt)).mint(taker, tokenAmtIn); + vm.startPrank(taker); + debt.approve(address(order), tokenAmtIn); + order.swapExactTokenToToken(debt, xt, taker, tokenAmtIn, xtAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function sellFt(ITermMaxOrder order, uint128 ftAmtIn, uint128 tokenAmtOut) internal { + address taker = vm.randomAddress(); + (IMintableERC20 ft, IMintableERC20 xt,,, IERC20 debt) = order.market().tokens(); + vm.prank(deployer); + ft.transfer(taker, ftAmtIn); + vm.startPrank(taker); + ft.approve(address(order), ftAmtIn); + order.swapExactTokenToToken(ft, debt, taker, ftAmtIn, tokenAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function sellXt(ITermMaxOrder order, uint128 xtAmtIn, uint128 tokenAmtOut) internal { + address taker = vm.randomAddress(); + (IMintableERC20 ft, IMintableERC20 xt,,, IERC20 debt) = order.market().tokens(); + vm.prank(deployer); + xt.transfer(taker, xtAmtIn); + vm.startPrank(taker); + xt.approve(address(order), xtAmtIn); + order.swapExactTokenToToken(xt, debt, taker, xtAmtIn, tokenAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } +} diff --git a/test/v2/VaultV2.t.sol b/test/v2/VaultV2.t.sol new file mode 100644 index 0000000..cf33383 --- /dev/null +++ b/test/v2/VaultV2.t.sol @@ -0,0 +1,1107 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "forge-std/Test.sol"; +import {console} from "forge-std/console.sol"; +import {DeployUtils} from "./utils/DeployUtils.sol"; +import {JSONLoader} from "./utils/JSONLoader.sol"; +import {StateChecker} from "./utils/StateChecker.sol"; +import {SwapUtils} from "./utils/SwapUtils.sol"; +import {LoanUtils} from "./utils/LoanUtils.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; +import {IFlashLoanReceiver} from "contracts/v1/IFlashLoanReceiver.sol"; +import { + ITermMaxMarketV2, + ITermMaxMarket, + TermMaxMarketV2, + Constants, + MarketErrors, + MarketEvents +} from "contracts/v2/TermMaxMarketV2.sol"; +import {ITermMaxOrder, TermMaxOrderV2, ISwapCallback, OrderEvents} from "contracts/v2/TermMaxOrderV2.sol"; +import {MockERC20, ERC20} from "contracts/v1/test/MockERC20.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {MockFlashLoanReceiver} from "contracts/v1/test/MockFlashLoanReceiver.sol"; +import {IGearingToken} from "contracts/v1/tokens/IGearingToken.sol"; +import { + VaultInitialParams, + MarketConfig, + MarketInitialParams, + LoanConfig, + OrderConfig, + CurveCuts, + IOracle +} from "contracts/v1/storage/TermMaxStorage.sol"; +import { + ITermMaxVault, + ITermMaxVaultV2, + TermMaxVaultV2, + VaultErrors, + VaultEvents, + VaultConstants, + OrderInfo +} from "contracts/v2/vault/TermMaxVaultV2.sol"; +import {PendingUint192, PendingLib} from "contracts/v1/lib/PendingLib.sol"; + +contract VaultTestV2 is Test { + using JSONLoader for *; + using SafeCast for *; + + DeployUtils.Res res; + + OrderConfig orderConfig; + MarketConfig marketConfig; + + address deployer = vm.randomAddress(); + address curator = vm.randomAddress(); + address allocator = vm.randomAddress(); + address guardian = vm.randomAddress(); + address lper = vm.randomAddress(); + address treasurer = vm.randomAddress(); + string testdata; + + ITermMaxVault vault; + + uint256 timelock = 86400; + uint256 maxCapacity = 1000000e18; + uint64 performanceFeeRate = 0.5e8; + + ITermMaxMarket market2; + + uint256 currentTime; + uint32 maxLtv = 0.89e8; + uint32 liquidationLtv = 0.9e8; + VaultInitialParams initialParams; + + function setUp() public { + vm.startPrank(deployer); + testdata = vm.readFile(string.concat(vm.projectRoot(), "/test/testdata/testdata.json")); + + currentTime = vm.parseUint(vm.parseJsonString(testdata, ".currentTime")); + vm.warp(currentTime); + + marketConfig = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); + orderConfig = JSONLoader.getOrderConfigFromJson(testdata, ".orderConfig"); + marketConfig.maturity = uint64(currentTime + 90 days); + res = DeployUtils.deployMockMarket(deployer, marketConfig, maxLtv, liquidationLtv); + MarketConfig memory marketConfig2 = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); + marketConfig2.maturity = uint64(currentTime + 180 days); + + market2 = ITermMaxMarket( + res.factory.createMarket( + DeployUtils.GT_ERC20, + MarketInitialParams({ + collateral: address(res.collateral), + debtToken: res.debt, + admin: deployer, + gtImplementation: address(0), + marketConfig: marketConfig2, + loanConfig: LoanConfig({ + maxLtv: maxLtv, + liquidationLtv: liquidationLtv, + liquidatable: true, + oracle: IOracle(address(res.oracle)) + }), + gtInitalParams: abi.encode(type(uint256).max), + tokenName: "test", + tokenSymbol: "test" + }), + 0 + ) + ); + + // update oracle + res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.eth")); + res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.dai")); + + uint256 amount = 10000e8; + + initialParams = VaultInitialParams( + deployer, curator, timelock, res.debt, maxCapacity, "Vault-DAI", "Vault-DAI", performanceFeeRate + ); + + vault = DeployUtils.deployVault(initialParams); + + vault.submitGuardian(guardian); + vault.setIsAllocator(allocator, true); + + vault.submitMarket(address(res.market), true); + vault.submitMarket(address(market2), true); + vm.warp(currentTime + timelock + 1); + vault.acceptMarket(address(res.market)); + vault.acceptMarket(address(market2)); + vm.warp(currentTime); + + res.debt.mint(deployer, amount); + res.debt.approve(address(vault), amount); + vault.deposit(amount, deployer); + + res.order = vault.createOrder(res.market, maxCapacity, amount, orderConfig.curveCuts); + + res.debt.mint(deployer, 10000e18); + res.debt.approve(address(res.market), 10000e18); + res.market.mint(deployer, 10000e18); + vm.stopPrank(); + } + + function testRoleManagement() public { + // Test initial roles + assertEq(vault.guardian(), guardian); + assertEq(vault.curator(), curator); + assertTrue(vault.isAllocator(allocator)); + + // Test guardian role checks + vm.startPrank(deployer); + address newGuardian = address(0x123); + vault.submitGuardian(newGuardian); + + // Should not be set immediately due to timelock + assertEq(vault.guardian(), guardian); + + // Move forward past timelock + vm.warp(block.timestamp + timelock + 1); + vault.acceptGuardian(); + assertEq(vault.guardian(), newGuardian); + vm.stopPrank(); + + // Test revoke guardian + address nextGuardian = address(0x456); + vm.prank(deployer); + vault.submitGuardian(nextGuardian); + + vm.prank(newGuardian); + vault.revokePendingGuardian(); + assertEq(vault.pendingGuardian().value, address(0)); + + // Test curator role + vm.prank(deployer); + address newCurator = address(0x456); + vault.setCurator(newCurator); + assertEq(vault.curator(), newCurator); + + // Test allocator management + vm.prank(deployer); + address newAllocator = address(0x789); + vault.setIsAllocator(newAllocator, true); + assertTrue(vault.isAllocator(newAllocator)); + } + + function test_RevertSetGuardian() public { + address newGuardian = address(0x123); + vm.prank(allocator); + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, allocator)); + vault.submitGuardian(newGuardian); + + vm.startPrank(deployer); + vault.submitGuardian(newGuardian); + + vm.expectRevert(VaultErrors.AlreadyPending.selector); + vault.submitGuardian(newGuardian); + + vm.expectRevert(VaultErrors.TimelockNotElapsed.selector); + vault.acceptGuardian(); + + vm.warp(block.timestamp + 1 days + 1); + vault.acceptGuardian(); + + vm.expectRevert(VaultErrors.AlreadySet.selector); + vault.submitGuardian(address(0x123)); + + vm.stopPrank(); + } + + function testMarketWhitelist() public { + // check current timelock value + assertEq(vault.timelock(), 86400); + + // submit market + vm.startPrank(curator); + address market = address(0x123); + vault.submitMarket(market, false); + + assertEq(vault.marketWhitelist(market), false); + vault.submitMarket(market, true); + + assertEq(vault.marketWhitelist(market), false); + + // The validAt of the newly submitted market is the current time, without timelock + PendingUint192 memory pendingMarket = vault.pendingMarkets(market); + assertEq(pendingMarket.validAt, block.timestamp + 86400); + + vm.warp(block.timestamp + 86400 + 1); + vault.acceptMarket(market); + assertEq(vault.marketWhitelist(market), true); + + vault.submitMarket(market, false); + assertEq(vault.marketWhitelist(market), false); + vm.stopPrank(); + + // Test revoke market + address newMarket = address(0x456); + vm.prank(curator); + vault.submitMarket(newMarket, true); + + vm.prank(guardian); + vault.revokePendingMarket(newMarket); + assertEq(vault.pendingMarkets(newMarket).validAt, 0); + } + + function test_RevertSetMarketWhitelist() public { + address market = address(0x123); + + vm.prank(vm.randomAddress()); + vm.expectRevert(VaultErrors.NotCuratorRole.selector); + vault.submitMarket(market, true); + + vm.startPrank(curator); + vault.submitMarket(market, true); + + vm.expectRevert(VaultErrors.AlreadyPending.selector); + vault.submitMarket(market, true); + + vm.expectRevert(VaultErrors.TimelockNotElapsed.selector); + vault.acceptMarket(market); + + vm.warp(block.timestamp + 86400 + 1); + vault.acceptMarket(market); + + vm.expectRevert(VaultErrors.AlreadySet.selector); + vault.submitMarket(market, true); + + vm.stopPrank(); + } + + function test_RevertCreateOrder() public { + ITermMaxMarket market = ITermMaxMarket(address(0x123)); + address bob = lper; + vm.startPrank(bob); + + vm.expectRevert(VaultErrors.NotCuratorRole.selector); + vault.createOrder(market, maxCapacity, 0, orderConfig.curveCuts); + + vm.stopPrank(); + + vm.startPrank(curator); + vm.expectRevert(VaultErrors.MarketNotWhitelisted.selector); + vault.createOrder(market, maxCapacity, 0, orderConfig.curveCuts); + vm.stopPrank(); + } + + function testTimelockManagement() public { + uint256 newTimelock = 2 days; + + vm.prank(curator); + vault.submitTimelock(newTimelock); + assertEq(vault.timelock(), newTimelock); + + newTimelock = 1.5 days; + vm.prank(curator); + vault.submitTimelock(newTimelock); + assertEq(vault.timelock(), 2 days); + + PendingUint192 memory pendingTimelock = vault.pendingTimelock(); + assertEq(uint256(pendingTimelock.value), newTimelock); + assertEq(vault.timelock(), 2 days); + + // Can accept after timelock period + vm.warp(currentTime + 2 days); + vm.prank(vm.randomAddress()); + vault.acceptTimelock(); + assertEq(vault.timelock(), newTimelock); + + // revoke + vm.warp(currentTime + 3 days); + vm.prank(curator); + vault.submitTimelock(1 days); + vm.prank(guardian); + vault.revokePendingTimelock(); + pendingTimelock = vault.pendingTimelock(); + assertEq(uint256(pendingTimelock.value), 0); + } + + function test_RevertSetTimelock() public { + uint256 newTimelock = 2 days; + vm.startPrank(curator); + + vault.submitTimelock(newTimelock); + + vm.expectRevert(VaultErrors.AlreadySet.selector); + vault.submitTimelock(newTimelock); + + newTimelock = 1.5 days; + vault.submitTimelock(newTimelock); + + vm.expectRevert(VaultErrors.AlreadyPending.selector); + vault.submitTimelock(newTimelock); + + vm.warp(currentTime + 2 days); + vault.acceptTimelock(); + + vm.expectRevert(VaultErrors.BelowMinTimelock.selector); + vault.submitTimelock(1 days - 1); + + vm.expectRevert(VaultErrors.AboveMaxTimelock.selector); + vault.submitTimelock(VaultConstants.MAX_TIMELOCK + 1); + + vm.expectRevert(VaultErrors.NoPendingValue.selector); + vault.acceptTimelock(); + + vault.submitTimelock(1 days); + vm.warp(currentTime + 0.9 days); + vm.expectRevert(VaultErrors.TimelockNotElapsed.selector); + vault.acceptTimelock(); + + vm.stopPrank(); + + vm.expectRevert(VaultErrors.NotCuratorRole.selector); + vault.submitTimelock(1 days); + } + + function testPerformanceFeeRate() public { + uint184 newPercentage = 0.4e8; + + vm.prank(curator); + vault.submitPerformanceFeeRate(newPercentage); + + uint256 percentage = vault.performanceFeeRate(); + assertEq(percentage, newPercentage); + + newPercentage = 0.5e8; + vm.prank(curator); + vault.submitPerformanceFeeRate(newPercentage); + + vm.prank(guardian); + vault.revokePendingPerformanceFeeRate(); + + vm.prank(curator); + vault.submitPerformanceFeeRate(newPercentage); + + PendingUint192 memory pendingFeeRate = vault.pendingPerformanceFeeRate(); + assertEq(uint256(pendingFeeRate.value), newPercentage); + + vm.warp(pendingFeeRate.validAt); + vm.prank(vm.randomAddress()); + vault.acceptPerformanceFeeRate(); + percentage = vault.performanceFeeRate(); + assertEq(percentage, newPercentage); + } + + function test_RevertSetPerformanceFeeRate() public { + uint184 newPercentage = 0.5e8; + + vm.prank(curator); + vm.expectRevert(VaultErrors.AlreadySet.selector); + vault.submitPerformanceFeeRate(newPercentage); + + newPercentage = 0.6e8; + vm.prank(curator); + vm.expectRevert(VaultErrors.PerformanceFeeRateExceeded.selector); + vault.submitPerformanceFeeRate(newPercentage); + + vm.prank(vm.randomAddress()); + vm.expectRevert(VaultErrors.NotCuratorRole.selector); + vault.submitPerformanceFeeRate(newPercentage); + + newPercentage = 0.4e8; + vm.startPrank(curator); + vault.submitPerformanceFeeRate(newPercentage); + + newPercentage = 0.41e8; + vault.submitPerformanceFeeRate(newPercentage); + + newPercentage = 0.42e8; + vm.expectRevert(VaultErrors.AlreadyPending.selector); + vault.submitPerformanceFeeRate(newPercentage); + + vm.stopPrank(); + } + + function testSupplyQueue(uint256 orderCount, uint256 seed) public { + vm.assume(orderCount < VaultConstants.MAX_QUEUE_LENGTH && orderCount > 0); + address[] memory supplyQueue = new address[](orderCount); + supplyQueue[0] = vault.supplyQueue(0); + vm.startPrank(curator); + for (uint256 i = 1; i < orderCount; i++) { + address order = address(vault.createOrder(res.market, maxCapacity, 0, orderConfig.curveCuts)); + OrderInfo memory orderInfo = vault.orderMapping(order); + assertEq(address(orderInfo.market), address(res.market)); + assertEq(orderInfo.maturity, res.market.config().maturity); + assertEq(address(orderInfo.ft), address(res.ft)); + assertEq(address(orderInfo.xt), address(res.xt)); + supplyQueue[i] = order; + assertEq(vault.supplyQueue(i), order); + } + + uint256[] memory indexes = new uint256[](orderCount); + for (uint256 i = 0; i < orderCount; i++) { + indexes[i] = i; + } + indexes = shuffle(indexes, seed); + vault.updateSupplyQueue(indexes); + + for (uint256 i = 0; i < orderCount; i++) { + assertEq(vault.supplyQueue(i), supplyQueue[indexes[i]]); + } + + vm.stopPrank(); + } + + function testWithdrawQueue(uint256 orderCount, uint256 seed) public { + vm.assume(orderCount < VaultConstants.MAX_QUEUE_LENGTH && orderCount > 0); + address[] memory withdrawQueue = new address[](orderCount); + withdrawQueue[0] = vault.withdrawQueue(0); + vm.startPrank(curator); + for (uint256 i = 1; i < orderCount; i++) { + address order = address(vault.createOrder(res.market, maxCapacity, 0, orderConfig.curveCuts)); + withdrawQueue[i] = order; + assertEq(vault.withdrawQueue(i), order); + } + + uint256[] memory indexes = new uint256[](orderCount); + for (uint256 i = 0; i < orderCount; i++) { + indexes[i] = i; + } + indexes = shuffle(indexes, seed); + vault.updateWithdrawQueue(indexes); + + for (uint256 i = 0; i < orderCount; i++) { + assertEq(vault.withdrawQueue(i), withdrawQueue[indexes[i]]); + } + + vm.stopPrank(); + } + + function shuffle(uint256[] memory arr, uint256 seed) public pure returns (uint256[] memory) { + uint256 length = arr.length; + + for (uint256 i = length - 1; i > 0; i--) { + uint256 j = seed % (i + 1); + + uint256 temp = arr[i]; + arr[i] = arr[j]; + arr[j] = temp; + } + + return arr; + } + + function test_RevertSupplyQueue() public { + vm.prank(lper); + vm.expectRevert(VaultErrors.NotAllocatorRole.selector); + vault.updateSupplyQueue(new uint256[](0)); + + vm.startPrank(curator); + vm.expectRevert(VaultErrors.SupplyQueueLengthMismatch.selector); + vault.updateSupplyQueue(new uint256[](0)); + + address order2 = address(vault.createOrder(res.market, maxCapacity, 0, orderConfig.curveCuts)); + uint256[] memory indexes = new uint256[](2); + indexes[0] = 1; + indexes[1] = 1; + vm.expectRevert(abi.encodeWithSelector(VaultErrors.DuplicateOrder.selector, order2)); + vault.updateSupplyQueue(indexes); + + vm.stopPrank(); + } + + function test_RevertWithdrawQueue() public { + vm.prank(lper); + vm.expectRevert(VaultErrors.NotAllocatorRole.selector); + vault.updateWithdrawQueue(new uint256[](0)); + + vm.startPrank(curator); + vm.expectRevert(VaultErrors.WithdrawQueueLengthMismatch.selector); + vault.updateWithdrawQueue(new uint256[](0)); + + address order2 = address(vault.createOrder(res.market, maxCapacity, 0, orderConfig.curveCuts)); + uint256[] memory indexes = new uint256[](2); + indexes[0] = 1; + indexes[1] = 1; + vm.expectRevert(abi.encodeWithSelector(VaultErrors.DuplicateOrder.selector, order2)); + vault.updateWithdrawQueue(indexes); + + vm.stopPrank(); + } + + function testUpdateOrder() public { + vm.startPrank(curator); + ITermMaxOrder[] memory orders = new ITermMaxOrder[](3); + orders[0] = res.order; + orders[1] = vault.createOrder(res.market, maxCapacity, 0, orderConfig.curveCuts); + orders[2] = vault.createOrder(res.market, maxCapacity, 0, orderConfig.curveCuts); + + int256[] memory changes = new int256[](3); + changes[0] = -3000; + changes[1] = 2000; + changes[2] = 1000; + + uint256[] memory maxSupplies = new uint256[](3); + maxSupplies[0] = maxCapacity - 1; + maxSupplies[1] = maxCapacity + 1; + maxSupplies[2] = maxCapacity; + + CurveCuts[] memory curveCuts = new CurveCuts[](3); + CurveCuts memory newCurveCuts = orderConfig.curveCuts; + newCurveCuts.lendCurveCuts[0].liqSquare++; + curveCuts[0] = newCurveCuts; + newCurveCuts.lendCurveCuts[0].liqSquare++; + curveCuts[1] = newCurveCuts; + newCurveCuts.lendCurveCuts[0].liqSquare++; + curveCuts[2] = newCurveCuts; + + uint256[] memory balancesBefore = new uint256[](3); + balancesBefore[0] = res.ft.balanceOf(address(orders[0])); + balancesBefore[1] = res.ft.balanceOf(address(orders[1])); + balancesBefore[2] = res.ft.balanceOf(address(orders[2])); + vault.updateOrders(orders, changes, maxSupplies, curveCuts); + + for (uint256 i = 0; i < orders.length; i++) { + assertEq(orders[i].orderConfig().maxXtReserve, maxSupplies[i]); + if (changes[i] < 0) { + assertEq(res.ft.balanceOf(address(orders[i])), balancesBefore[i] - (-changes[i]).toUint256()); + } else { + assertEq(res.ft.balanceOf(address(orders[i])), balancesBefore[i] + changes[i].toUint256()); + } + assertEq( + orders[i].orderConfig().curveCuts.lendCurveCuts[0].liqSquare, curveCuts[i].lendCurveCuts[0].liqSquare + ); + } + + vm.stopPrank(); + } + + function testDeposit() public { + vm.warp(currentTime + 2 days); + buyXt(48.219178e8, 1000e8); + + vm.warp(currentTime + 2 days); + address lper2 = vm.randomAddress(); + uint256 amount2 = 20000e8; + res.debt.mint(lper2, amount2); + vm.startPrank(lper2); + res.debt.approve(address(vault), amount2); + uint256 share = vault.previewDeposit(amount2); + vault.deposit(amount2, lper2); + assertEq(vault.balanceOf(lper2), share); + + vm.stopPrank(); + } + + function testDepositWhenNoOrders() public { + initialParams.name = "Vault-DAI2"; + initialParams.symbol = "Vault-DAI2"; + ITermMaxVault vault2 = DeployUtils.deployVault(initialParams); + vm.startPrank(deployer); + uint256 amount = 10000e8; + res.debt.mint(deployer, amount); + res.debt.approve(address(vault2), amount); + uint256 share = vault2.previewDeposit(amount); + vault2.deposit(amount, deployer); + assertEq(vault2.balanceOf(deployer), share); + assertEq(vault2.totalFt(), amount); + assertEq(vault2.totalAssets(), amount); + assertEq(vault2.totalSupply(), share); + vm.stopPrank(); + + vm.startPrank(lper); + res.debt.mint(lper, amount); + res.debt.approve(address(vault2), amount); + uint256 share2 = vault2.previewDeposit(amount); + vault2.deposit(amount, lper); + assertEq(vault2.balanceOf(lper), share2); + assertEq(vault2.totalFt(), amount + amount); + assertEq(vault2.totalAssets(), amount + amount); + assertEq(vault2.totalSupply(), share + share2); + vm.stopPrank(); + } + + function testRedeem() public { + vm.warp(currentTime + 2 days); + buyXt(48.219178e8, 1000e8); + vm.warp(currentTime + 4 days); + address lper2 = vm.randomAddress(); + uint256 amount2 = 10000e8; + res.debt.mint(lper2, amount2); + vm.startPrank(lper2); + res.debt.approve(address(vault), amount2); + vault.deposit(amount2, lper2); + vm.stopPrank(); + + vm.startPrank(deployer); + uint256 totalFt = vault.totalFt(); + uint256 lockedFr = vault.totalAssets(); + + uint256 share = vault.balanceOf(deployer); + uint256 redeemmedAmt = vault.previewRedeem(share); + assertEq(redeemmedAmt, vault.redeem(share, deployer, deployer)); + assert(redeemmedAmt > 10000e8); + assertEq(vault.totalFt(), totalFt - redeemmedAmt); + assertEq(vault.totalAssets(), lockedFr - redeemmedAmt); + + vm.stopPrank(); + } + + // redeem when balance bigger tha redeemed + function testRedeemCase2() public { + vm.warp(currentTime + 2 days); + buyXt(48.219178e8, 1000e8); + + vm.warp(currentTime + 4 days); + address lper2 = vm.randomAddress(); + uint256 amount2 = 10000e8; + res.debt.mint(lper2, amount2); + vm.startPrank(lper2); + res.debt.approve(address(vault), amount2); + vault.deposit(amount2, lper2); + vm.stopPrank(); + + vm.startPrank(curator); + ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); + orders[0] = res.order; + + int256[] memory changes = new int256[](1); + changes[0] = -1000e8; + + uint256[] memory maxSupplies = new uint256[](1); + maxSupplies[0] = maxCapacity; + + CurveCuts[] memory curveCuts = new CurveCuts[](1); + curveCuts[0] = orderConfig.curveCuts; + + vault.updateOrders(orders, changes, maxSupplies, curveCuts); + vm.stopPrank(); + + vm.startPrank(deployer); + uint256 totalFt = vault.totalFt(); + uint256 lockedFr = vault.totalAssets(); + + uint256 share = 100e8; + uint256 redeemmedAmt = vault.previewRedeem(share); + assertEq(redeemmedAmt, vault.redeem(share, deployer, deployer)); + assert(redeemmedAmt > share); + assertEq(vault.totalFt(), totalFt - redeemmedAmt); + assertEq(vault.totalAssets(), lockedFr - redeemmedAmt); + + vm.stopPrank(); + } + + function testActions() public { + console.log("----day 2----"); + vm.warp(currentTime + 2 days); + buyXt(48.219178e8, 1000e8); + console.log("anulizedInterest:", vault.annualizedInterest()); + console.log("apy:", ITermMaxVaultV2(address(vault)).apy()); + + console.log("----day 3----"); + vm.warp(currentTime + 3 days); + console.log("new principal:", vault.totalAssets()); + address lper2 = vm.randomAddress(); + uint256 amount2 = 10000e8; + res.debt.mint(lper2, amount2); + vm.startPrank(lper2); + res.debt.approve(address(vault), amount2); + vault.deposit(amount2, lper2); + vm.stopPrank(); + console.log("principal after deposit:", vault.totalAssets()); + console.log("total supply:", vault.totalSupply()); + console.log("anulizedInterest:", vault.annualizedInterest()); + console.log("apy:", ITermMaxVaultV2(address(vault)).apy()); + + console.log("----day 4----"); + vm.warp(currentTime + 4 days); + swapFtToXt(94.247e8, 2000e8); + console.log("1-principal after swap:", vault.totalAssets()); + console.log("1-anulizedInterest:", vault.annualizedInterest()); + console.log("1-apy:", ITermMaxVaultV2(address(vault)).apy()); + swapFtToXt(94.247e8, 2000e8); + console.log("2-principal after swap:", vault.totalAssets()); + console.log("2-anulizedInterest:", vault.annualizedInterest()); + console.log("2-apy:", ITermMaxVaultV2(address(vault)).apy()); + + console.log("----day 6----"); + vm.warp(currentTime + 6 days); + console.log("new principal:", vault.totalAssets()); + vm.startPrank(lper2); + console.log("previewRedeem: ", vault.previewRedeem(1000e8)); + assertEq(vault.previewRedeem(1000e8), vault.redeem(1000e8, lper2, lper2)); + console.log("principal after redeem:", vault.totalAssets()); + console.log("total supply:", vault.totalSupply()); + console.log("anulizedInterest:", vault.annualizedInterest()); + console.log("apy:", ITermMaxVaultV2(address(vault)).apy()); + vm.stopPrank(); + + console.log("----day 91----"); + vm.warp(currentTime + 91 days); + console.log("new principal:", vault.totalAssets()); + console.log("previewRedeem: ", vault.previewRedeem(1000e8)); + + console.log("----day 92----"); + vm.warp(currentTime + 92 days); + console.log("new principal:", vault.totalAssets()); + vm.startPrank(lper2); + console.log("previewRedeem: ", vault.previewRedeem(1000e8)); + assertEq(vault.previewRedeem(1000e8), vault.redeem(1000e8, lper2, lper2)); + console.log("principal after redeem:", vault.totalAssets()); + console.log("total supply:", vault.totalSupply()); + console.log("anulizedInterest:", vault.annualizedInterest()); + console.log("apy:", ITermMaxVaultV2(address(vault)).apy()); + vm.stopPrank(); + } + + function testAnulizedInterestLessThanZero() public { + uint128 tokenAmtIn = 100e8; + uint128 ftAmtOut = 100e8; + address taker = vm.randomAddress(); + res.debt.mint(taker, tokenAmtIn); + vm.startPrank(taker); + res.debt.approve(address(res.order), tokenAmtIn); + vm.expectRevert(VaultErrors.OrderHasNegativeInterest.selector); + res.order.swapExactTokenToToken(res.debt, res.ft, taker, tokenAmtIn, ftAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function testLockedFtGreaterThanTotalFt() public { + vm.warp(currentTime + 2 days); + buyXt(50e8, 1000e8); + + vm.warp(currentTime + 4 days); + uint128 tokenAmtIn = 80e8; + uint128 ftAmtOut = 130e8; + + address taker = vm.randomAddress(); + res.debt.mint(taker, tokenAmtIn); + vm.startPrank(taker); + res.debt.approve(address(res.order), tokenAmtIn); + + vm.expectRevert(VaultErrors.LockedFtGreaterThanTotalFt.selector); + res.order.swapExactTokenToToken(res.debt, res.ft, taker, tokenAmtIn, ftAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function testOrderHasNegativeInterest() public { + vm.warp(currentTime + 2 days); + uint128 tokenAmtIn = 90e8; + uint128 ftAmtOut = 100e8; + address taker = vm.randomAddress(); + res.debt.mint(taker, tokenAmtIn); + vm.startPrank(taker); + res.debt.approve(address(res.order), tokenAmtIn); + vm.expectRevert(VaultErrors.OrderHasNegativeInterest.selector); + res.order.swapExactTokenToToken(res.debt, res.ft, taker, tokenAmtIn, ftAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function testRedeemFromMarket() public { + vm.warp(currentTime + 2 days); + buyXt(48.219178e8, 1000e8); + + vm.warp(currentTime + 3 days); + address lper2 = vm.randomAddress(); + uint256 amount2 = 10000e8; + res.debt.mint(lper2, amount2); + vm.startPrank(lper2); + res.debt.approve(address(vault), amount2); + vault.deposit(amount2, lper2); + vm.stopPrank(); + + vm.startPrank(curator); + address order2 = address(vault.createOrder(market2, maxCapacity, 0, orderConfig.curveCuts)); + uint256[] memory indexes = new uint256[](2); + indexes[0] = 1; + indexes[1] = 0; + vault.updateSupplyQueue(indexes); + + res.debt.mint(curator, 10000e8); + res.debt.approve(address(vault), 10000e8); + vault.deposit(10000e8, curator); + + vm.stopPrank(); + + vm.warp(currentTime + 92 days); + + vm.startPrank(lper2); + + vault.redeem(1000e8, lper2, lper2); + vm.stopPrank(); + + uint256 performanceFee = vault.performanceFee(); + vm.prank(curator); + vault.withdrawPerformanceFee(curator, performanceFee); + + assertEq(vault.performanceFee(), 0); + assertEq(vault.annualizedInterest(), 0); + assertEq(vault.supplyQueueLength(), 1); + assertEq(vault.supplyQueue(0), order2); + assertEq(vault.withdrawQueueLength(), 1); + assertEq(vault.withdrawQueue(0), order2); + + vm.warp(currentTime + 182 days); + vm.prank(lper2); + vault.redeem(1000e8, lper2, lper2); + + vm.prank(curator); + vault.redeemOrder(ITermMaxOrder(order2)); + + assertEq(vault.performanceFee(), 0); + assertEq(vault.annualizedInterest(), 0); + assertEq(vault.supplyQueueLength(), 0); + assertEq(vault.withdrawQueueLength(), 0); + } + + function testRedeemFromMarket2() public { + vm.warp(currentTime + 2 days); + buyXt(48.219178e8, 1000e8); + + vm.warp(currentTime + 3 days); + address lper2 = vm.randomAddress(); + uint256 amount2 = 10000e8; + res.debt.mint(lper2, amount2); + vm.startPrank(lper2); + res.debt.approve(address(vault), amount2); + vault.deposit(amount2, lper2); + vm.stopPrank(); + + vm.startPrank(curator); + address order2 = address(vault.createOrder(market2, maxCapacity, 0, orderConfig.curveCuts)); + uint256[] memory indexes = new uint256[](2); + indexes[0] = 1; + indexes[1] = 0; + vault.updateSupplyQueue(indexes); + + res.debt.mint(curator, 10000e8); + res.debt.approve(address(vault), 10000e8); + vault.deposit(10000e8, curator); + + vm.stopPrank(); + + (, IERC20 xt,,,) = market2.tokens(); + + vm.warp(currentTime + 4 days); + { + address taker = vm.randomAddress(); + uint128 tokenAmtIn = 50e8; + res.debt.mint(taker, tokenAmtIn); + vm.startPrank(taker); + res.debt.approve(address(order2), tokenAmtIn); + ITermMaxOrder(order2).swapExactTokenToToken( + res.debt, xt, taker, tokenAmtIn, 1000e8, block.timestamp + 1 hours + ); + vm.stopPrank(); + } + + vm.warp(currentTime + 92 days); + + { + address taker = vm.randomAddress(); + uint128 tokenAmtIn = 50e8; + res.debt.mint(taker, tokenAmtIn); + vm.startPrank(taker); + res.debt.approve(address(order2), tokenAmtIn); + ITermMaxOrder(order2).swapExactTokenToToken( + res.debt, xt, taker, tokenAmtIn, 1000e8, block.timestamp + 1 hours + ); + vm.stopPrank(); + } + + vm.prank(lper2); + vault.redeem(100e8, lper2, lper2); + + uint256 performanceFee = vault.performanceFee(); + vm.prank(curator); + vault.withdrawPerformanceFee(curator, performanceFee); + + assertEq(vault.performanceFee(), 0); + assertGt(vault.annualizedInterest(), 0); + assertEq(vault.supplyQueueLength(), 1); + assertEq(vault.supplyQueue(0), order2); + assertEq(vault.withdrawQueueLength(), 1); + assertEq(vault.withdrawQueue(0), order2); + + vm.warp(currentTime + 182 days); + vm.prank(lper2); + vault.redeem(100e8, lper2, lper2); + + vm.prank(curator); + vault.redeemOrder(ITermMaxOrder(order2)); + + assertGt(vault.performanceFee(), 0); + assertEq(vault.annualizedInterest(), 0); + assertEq(vault.supplyQueueLength(), 0); + assertEq(vault.withdrawQueueLength(), 0); + } + + function testBadDebt() public { + vm.warp(currentTime + 2 days); + buyXt(48.219178e8, 1000e8); + + vm.warp(currentTime + 3 days); + address lper2 = vm.randomAddress(); + uint256 amount2 = 10000e8; + res.debt.mint(lper2, amount2); + vm.startPrank(lper2); + res.debt.approve(address(vault), amount2); + vault.deposit(amount2, lper2); + vm.stopPrank(); + + address borrower = vm.randomAddress(); + vm.startPrank(borrower); + LoanUtils.fastMintGt(res, borrower, 1000e8, 1e18); + vm.stopPrank(); + + vm.warp(marketConfig.maturity + 1 days); + + uint256 propotion = (res.ft.balanceOf(address(res.order)) * Constants.DECIMAL_BASE_SQ) + / (res.ft.totalSupply() - res.ft.balanceOf(address(res.market))); + + uint256 tokenOut = (res.debt.balanceOf(address(res.market)) * propotion) / Constants.DECIMAL_BASE_SQ; + uint256 badDebt = res.ft.balanceOf(address(res.order)) - tokenOut; + uint256 delivered = (propotion * 1e18) / Constants.DECIMAL_BASE_SQ; + + vm.startPrank(lper2); + vault.redeem(1000e8, lper2, lper2); + vm.stopPrank(); + + assertEq(vault.badDebtMapping(address(res.collateral)), badDebt); + assertEq(res.collateral.balanceOf(address(vault)), delivered); + + uint256 shareToDealBadDebt = vault.previewWithdraw(badDebt / 2); + vm.startPrank(lper2); + (uint256 shares, uint256 collateralOut) = vault.dealBadDebt(address(res.collateral), badDebt / 2, lper2, lper2); + assertEq(shares, shareToDealBadDebt); + assertEq(collateralOut, ((badDebt / 2) * delivered) / badDebt); + assertEq(vault.badDebtMapping(address(res.collateral)), badDebt - badDebt / 2); + assertEq(res.collateral.balanceOf(address(vault)), delivered - collateralOut); + vm.stopPrank(); + + vm.startPrank(lper2); + shareToDealBadDebt = vault.previewWithdraw(badDebt - badDebt / 2); + uint256 remainningCollateral = res.collateral.balanceOf(address(vault)); + vm.expectEmit(); + emit VaultEvents.DealBadDebt( + lper2, lper2, address(res.collateral), badDebt - badDebt / 2, shareToDealBadDebt, remainningCollateral + ); + (shares, collateralOut) = vault.dealBadDebt(address(res.collateral), badDebt - badDebt / 2, lper2, lper2); + assertEq(shares, shareToDealBadDebt); + assertEq(collateralOut, remainningCollateral); + assertEq(vault.badDebtMapping(address(res.collateral)), 0); + assertEq(res.collateral.balanceOf(address(vault)), 0); + vm.stopPrank(); + } + + function testDealBadDebtRevert() public { + vm.warp(currentTime + 2 days); + buyXt(48.219178e8, 1000e8); + + vm.warp(currentTime + 3 days); + address lper2 = vm.randomAddress(); + uint256 amount2 = 10000e8; + res.debt.mint(lper2, amount2); + vm.startPrank(lper2); + res.debt.approve(address(vault), amount2); + vault.deposit(amount2, lper2); + vm.stopPrank(); + + address borrower = vm.randomAddress(); + vm.startPrank(borrower); + LoanUtils.fastMintGt(res, borrower, 1000e8, 1e18); + vm.stopPrank(); + + vm.warp(currentTime + 92 days); + vm.startPrank(lper2); + vault.redeem(1000e8, lper2, lper2); + + uint256 badDebt = vault.badDebtMapping(address(res.collateral)); + vm.expectRevert(abi.encodeWithSelector(VaultErrors.InsufficientFunds.selector, badDebt, 2000e8)); + vault.dealBadDebt(address(res.collateral), 2000e8, lper2, lper2); + + vault.dealBadDebt(address(res.collateral), badDebt, lper2, lper2); + + vm.expectRevert(abi.encodeWithSelector(VaultErrors.NoBadDebt.selector, address(res.collateral))); + vault.dealBadDebt(address(res.collateral), 10e8, lper2, lper2); + + vm.stopPrank(); + } + + function buyFt(uint128 tokenAmtIn, uint128 ftAmtOut) internal { + address taker = vm.randomAddress(); + res.debt.mint(taker, tokenAmtIn); + vm.startPrank(taker); + res.debt.approve(address(res.order), tokenAmtIn); + res.order.swapExactTokenToToken(res.debt, res.ft, taker, tokenAmtIn, ftAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function buyXt(uint128 tokenAmtIn, uint128 xtAmtOut) internal { + address taker = vm.randomAddress(); + res.debt.mint(taker, tokenAmtIn); + vm.startPrank(taker); + res.debt.approve(address(res.order), tokenAmtIn); + res.order.swapExactTokenToToken(res.debt, res.xt, taker, tokenAmtIn, xtAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function sellFt(uint128 ftAmtIn, uint128 tokenAmtOut) internal { + address taker = vm.randomAddress(); + vm.prank(deployer); + res.ft.transfer(taker, ftAmtIn); + vm.startPrank(taker); + res.ft.approve(address(res.order), ftAmtIn); + res.order.swapExactTokenToToken(res.ft, res.debt, taker, ftAmtIn, tokenAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function sellXt(uint128 xtAmtIn, uint128 tokenAmtOut) internal { + address taker = vm.randomAddress(); + vm.prank(deployer); + res.xt.transfer(taker, xtAmtIn); + vm.startPrank(taker); + res.xt.approve(address(res.order), xtAmtIn); + res.order.swapExactTokenToToken(res.xt, res.debt, taker, xtAmtIn, tokenAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function swapFtToXt(uint128 ftAmtIn, uint128 xtAmtOut) internal { + address taker = vm.randomAddress(); + vm.prank(deployer); + res.ft.transfer(taker, ftAmtIn); + vm.startPrank(taker); + res.ft.approve(address(res.order), ftAmtIn); + res.order.swapExactTokenToToken(res.ft, res.xt, taker, ftAmtIn, xtAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function swapXtToFt(uint128 xtAmtIn, uint128 ftAmtOut) internal { + address taker = vm.randomAddress(); + vm.prank(deployer); + res.xt.transfer(taker, xtAmtIn); + vm.startPrank(taker); + res.xt.approve(address(res.order), xtAmtIn); + res.order.swapExactTokenToToken(res.xt, res.ft, taker, xtAmtIn, ftAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function testFixFindings101() public { + vm.prank(curator); + vault.createOrder(res.market, maxCapacity, 0, orderConfig.curveCuts); + address lper = vm.randomAddress(); + + res.debt.mint(lper, 100 ether); + + // depositing funds for lp1 + vm.startPrank(lper); + res.debt.approve(address(vault), 100 ether); + vault.deposit(100 ether, lper); + vm.stopPrank(); + + vm.warp(currentTime + 110 days); + + vm.startPrank(lper); + vault.withdraw(100 ether, lper, lper); + } + + function _daysToMaturity(uint256 _now) internal view returns (uint256 daysToMaturity) { + daysToMaturity = (res.market.config().maturity - _now + Constants.SECONDS_IN_DAY - 1) / Constants.SECONDS_IN_DAY; + } +} diff --git a/test/v2/utils/DeployUtils.sol b/test/v2/utils/DeployUtils.sol index c2f8ee5..64ff871 100644 --- a/test/v2/utils/DeployUtils.sol +++ b/test/v2/utils/DeployUtils.sol @@ -16,7 +16,7 @@ import {ITermMaxFactory, TermMaxFactoryV2} from "contracts/v2/factory/TermMaxFac import {TermMaxRouterV2} from "contracts/v2/router/TermMaxRouterV2.sol"; import {IOracleV2, OracleAggregatorV2, AggregatorV3Interface} from "contracts/v2/oracle/OracleAggregatorV2.sol"; import {IOracle} from "contracts/v1/oracle/IOracle.sol"; -import {MockOrder} from "contracts/v2/test/MockOrder.sol"; +import {MockOrderV2} from "contracts/v2/test/MockOrderV2.sol"; import {VaultFactory, IVaultFactory} from "contracts/v1/factory/VaultFactory.sol"; import {OrderManager} from "contracts/v1/vault/OrderManager.sol"; import {TermMaxVaultV2, ITermMaxVault} from "contracts/v2/vault/TermMaxVaultV2.sol"; @@ -27,6 +27,7 @@ import { MarketInitialParams, LoanConfig, OrderConfig, + CurveCut, CurveCuts } from "contracts/v1/storage/TermMaxStorage.sol"; @@ -310,7 +311,7 @@ library DeployUtils { function deployFactoryWithMockOrder(address admin) public returns (TermMaxFactoryV2 factory) { address tokenImplementation = address(new MintableERC20V2()); - address orderImplementation = address(new MockOrder()); + address orderImplementation = address(new MockOrderV2()); TermMaxMarketV2 m = new TermMaxMarketV2(tokenImplementation, orderImplementation); factory = new TermMaxFactoryV2(admin, address(m)); } From 0751e705dc7acdd14db08058f84b68750bbeb3c2 Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 2 Jun 2025 17:03:37 +0800 Subject: [PATCH 053/194] router v2 ut --- test/v2/RouterV2.t.sol | 734 ++++++++++++++++++++++++++ test/v2/mainnet-fork/ForkBaseTest.sol | 172 ++++++ 2 files changed, 906 insertions(+) create mode 100644 test/v2/RouterV2.t.sol create mode 100644 test/v2/mainnet-fork/ForkBaseTest.sol diff --git a/test/v2/RouterV2.t.sol b/test/v2/RouterV2.t.sol new file mode 100644 index 0000000..1261081 --- /dev/null +++ b/test/v2/RouterV2.t.sol @@ -0,0 +1,734 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "forge-std/Test.sol"; +import {console} from "forge-std/console.sol"; +import {DeployUtils} from "./utils/DeployUtils.sol"; +import {JSONLoader} from "./utils/JSONLoader.sol"; +import {StateChecker} from "./utils/StateChecker.sol"; +import {SwapUtils} from "./utils/SwapUtils.sol"; +import {LoanUtils} from "./utils/LoanUtils.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; +import {Constants} from "contracts/v1/lib/Constants.sol"; +import { + ITermMaxMarketV2, TermMaxMarketV2, Constants, MarketErrors, MarketEvents +} from "contracts/v2/TermMaxMarketV2.sol"; +import {MockERC20, ERC20} from "contracts/v1/test/MockERC20.sol"; + +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {IMintableERC20} from "contracts/v1/tokens/MintableERC20.sol"; +import {IGearingToken} from "contracts/v1/tokens/IGearingToken.sol"; +import { + GearingTokenWithERC20V2, + GearingTokenEvents, + GearingTokenErrors, + GearingTokenEventsV2, + GtConfig +} from "contracts/v2/tokens/GearingTokenWithERC20V2.sol"; +import { + ITermMaxFactory, + TermMaxFactoryV2, + FactoryErrors, + FactoryEvents, + FactoryEventsV2 +} from "contracts/v2/factory/TermMaxFactoryV2.sol"; +import {IOracleV2, OracleAggregatorV2, AggregatorV3Interface} from "contracts/v2/oracle/OracleAggregatorV2.sol"; +import {IOracle} from "contracts/v1/oracle/IOracle.sol"; +import { + VaultInitialParams, + MarketConfig, + MarketInitialParams, + LoanConfig, + OrderConfig, + CurveCuts +} from "contracts/v1/storage/TermMaxStorage.sol"; +import {MockFlashLoanReceiver} from "contracts/v1/test/MockFlashLoanReceiver.sol"; +import {MockFlashRepayerV2} from "contracts/v2/test/MockFlashRepayerV2.sol"; +import {ISwapCallback} from "contracts/v1/ISwapCallback.sol"; +import { + TermMaxRouterV2, + ITermMaxRouterV2, + SwapUnit, + RouterErrors, + RouterEvents +} from "contracts/v2/router/TermMaxRouterV2.sol"; +import {ITermMaxRouter} from "contracts/v1/router/ITermMaxRouter.sol"; +import {MockSwapAdapter} from "contracts/v1/test/MockSwapAdapter.sol"; +import {ITermMaxOrder} from "contracts/v1/ITermMaxOrder.sol"; + +contract RouterTestV2 is Test { + using JSONLoader for *; + using SafeCast for *; + + DeployUtils.Res res; + + OrderConfig orderConfig; + MarketConfig marketConfig; + + address deployer = vm.randomAddress(); + address maker = vm.randomAddress(); + address sender = vm.randomAddress(); + address treasurer = vm.randomAddress(); + string testdata; + + address pool = vm.randomAddress(); + + MockSwapAdapter adapter; + + function setUp() public { + vm.startPrank(deployer); + testdata = vm.readFile(string.concat(vm.projectRoot(), "/test/testdata/testdata.json")); + + uint32 maxLtv = 0.89e8; + uint32 liquidationLtv = 0.9e8; + + marketConfig = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); + orderConfig = JSONLoader.getOrderConfigFromJson(testdata, ".orderConfig"); + + res = DeployUtils.deployMarket(deployer, marketConfig, maxLtv, liquidationLtv); + + res.order = + res.market.createOrder(maker, orderConfig.maxXtReserve, ISwapCallback(address(0)), orderConfig.curveCuts); + + vm.warp(vm.parseUint(vm.parseJsonString(testdata, ".currentTime"))); + + // update oracle + res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.eth")); + res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.dai")); + + uint256 amount = 150e8; + res.debt.mint(deployer, amount); + res.debt.approve(address(res.market), amount); + res.market.mint(deployer, amount); + res.ft.transfer(address(res.order), amount); + res.xt.transfer(address(res.order), amount); + + res.router = DeployUtils.deployRouter(deployer); + adapter = new MockSwapAdapter(pool); + res.router.setAdapterWhitelist(address(adapter), true); + + vm.stopPrank(); + } + + function testSetAdapterWhitelist() public { + vm.startPrank(deployer); + + address randomAdapter = vm.randomAddress(); + res.router.setAdapterWhitelist(randomAdapter, true); + assertTrue(res.router.adapterWhitelist(randomAdapter)); + + res.router.setAdapterWhitelist(randomAdapter, false); + assertFalse(res.router.adapterWhitelist(randomAdapter)); + + vm.stopPrank(); + } + + function testSetAdapterWhitelistUnauthorized() public { + vm.startPrank(sender); + + address randomAdapter = vm.randomAddress(); + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, address(sender))); + res.router.setAdapterWhitelist(randomAdapter, true); + + vm.stopPrank(); + } + + function testPause() public { + vm.startPrank(deployer); + + res.router.pause(); + assertTrue(res.router.paused()); + + res.router.unpause(); + assertFalse(res.router.paused()); + + vm.stopPrank(); + } + + function testPauseUnauthorized() public { + vm.startPrank(sender); + + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, address(sender))); + res.router.pause(); + + vm.stopPrank(); + } + + function testSwapExactTokenToToken() public { + vm.startPrank(sender); + + uint128 amountIn = 100e8; + uint128[] memory tradingAmts = new uint128[](2); + tradingAmts[0] = 50e8; + tradingAmts[1] = 50e8; + uint128 mintTokenOut = 80e8; + + ITermMaxOrder[] memory orders = new ITermMaxOrder[](2); + orders[0] = res.order; + orders[1] = res.order; + + res.debt.mint(sender, amountIn); + res.debt.approve(address(res.router), amountIn); + uint256 netOut = res.router.swapExactTokenToToken( + res.debt, res.ft, sender, orders, tradingAmts, mintTokenOut, block.timestamp + 1 hours + ); + assertEq(netOut, res.ft.balanceOf(sender)); + + assertEq(res.debt.balanceOf(sender), 0); + + vm.stopPrank(); + } + + function testSwapTokenToExactToken() public { + vm.startPrank(sender); + + uint128 amountOut = 90e8; + uint128[] memory tradingAmts = new uint128[](2); + tradingAmts[0] = 45e8; + tradingAmts[1] = 45e8; + uint128 maxAmountIn = 100e8; + + ITermMaxOrder[] memory orders = new ITermMaxOrder[](2); + orders[0] = res.order; + orders[1] = res.order; + + res.debt.mint(sender, maxAmountIn); + res.debt.approve(address(res.router), maxAmountIn); + + uint256 balanceBefore = res.ft.balanceOf(sender); + uint256 amountIn = res.router.swapTokenToExactToken( + res.debt, res.ft, sender, orders, tradingAmts, maxAmountIn, block.timestamp + 1 hours + ); + uint256 balanceAfter = res.ft.balanceOf(sender); + + assertEq(maxAmountIn - amountIn, res.debt.balanceOf(sender)); + assertEq(balanceAfter - balanceBefore, amountOut); + + vm.stopPrank(); + } + + function testSellTokens(uint128 ftAmount, uint128 xtAmount) public { + //TODO check output + vm.assume(ftAmount <= 150e8 && xtAmount <= 150e8); + vm.startPrank(sender); + deal(address(res.ft), sender, ftAmount); + deal(address(res.xt), sender, xtAmount); + + ITermMaxOrder[] memory orders = new ITermMaxOrder[](2); + orders[0] = res.order; + orders[1] = res.order; + + (uint128 maxBurn, uint128 sellAmt) = + ftAmount > xtAmount ? (xtAmount, ftAmount - xtAmount) : (ftAmount, xtAmount - ftAmount); + uint128[] memory tradingAmts = new uint128[](2); + tradingAmts[0] = sellAmt / 2; + tradingAmts[1] = sellAmt / 2; + uint128 mintTokenOut = 0; + + res.ft.approve(address(res.router), ftAmount); + res.xt.approve(address(res.router), xtAmount); + + // vm.expectEmit(); + // emit ITermMaxRouter.SellTokens(res.market, tokenToSell, sender, orders, tradingAmts, mintTokenOut); + uint256 netOut = res.router.sellTokens( + sender, res.market, ftAmount, xtAmount, orders, tradingAmts, mintTokenOut, block.timestamp + ); + assertEq(netOut, res.debt.balanceOf(sender)); + assertEq(res.ft.balanceOf(sender), 0); + assertEq(res.xt.balanceOf(sender), 0); + assert(maxBurn <= netOut); + + vm.stopPrank(); + } + + function testLeaveFromToken() public { + vm.startPrank(sender); + + uint128 minXtOut = 0; + uint128 tokenToSwap = 100e8; + uint128 maxLtv = 0.8e8; + uint256 minCollAmt = 1e18; + res.debt.mint(sender, tokenToSwap + 2e8 * 2); + + ITermMaxOrder[] memory orders = new ITermMaxOrder[](2); + orders[0] = res.order; + orders[1] = res.order; + + uint128[] memory amtsToBuyXt = new uint128[](2); + amtsToBuyXt[0] = 2e8; + amtsToBuyXt[1] = 2e8; + + SwapUnit[] memory units = new SwapUnit[](1); + units[0] = SwapUnit(address(adapter), address(res.debt), address(res.collateral), abi.encode(minCollAmt)); + + res.debt.approve(address(res.router), tokenToSwap + 2e8 * 2); + (uint256 gtId, uint256 netXtOut) = res.router.leverageFromToken( + sender, res.market, orders, amtsToBuyXt, minXtOut, tokenToSwap, maxLtv, units, block.timestamp + ); + (address owner, uint128 debtAmt, bytes memory collateralData) = res.gt.loanInfo(gtId); + assertEq(owner, sender); + assertEq(minCollAmt, abi.decode(collateralData, (uint256))); + assertEq(netXtOut * Constants.DECIMAL_BASE / (Constants.DECIMAL_BASE - res.market.mintGtFeeRatio()), debtAmt); + vm.stopPrank(); + } + + function testLeverageFromXt() public { + vm.startPrank(sender); + + uint128 xtAmt = 10e8; + uint128 tokenToSwap = 100e8; + uint128 maxLtv = 0.8e8; + uint256 minCollAmt = 1e18; + + deal(address(res.xt), sender, xtAmt); + + SwapUnit[] memory units = new SwapUnit[](1); + units[0] = SwapUnit(address(adapter), address(res.debt), address(res.collateral), abi.encode(minCollAmt)); + + res.xt.approve(address(res.router), xtAmt); + res.debt.mint(sender, tokenToSwap); + res.debt.approve(address(res.router), tokenToSwap); + + uint256 gtId = res.router.leverageFromXt(sender, res.market, xtAmt, tokenToSwap, maxLtv, units); + (address owner, uint128 debtAmt, bytes memory collateralData) = res.gt.loanInfo(gtId); + assertEq(owner, sender); + assertEq(minCollAmt, abi.decode(collateralData, (uint256))); + assertEq( + uint128(xtAmt * Constants.DECIMAL_BASE / (Constants.DECIMAL_BASE - res.market.mintGtFeeRatio())), debtAmt + ); + vm.stopPrank(); + } + + function testLeverageFromCollateral() public { + vm.startPrank(sender); + + uint128 xtAmt = 10e8; + uint128 collateralAmt = 0.5e18; + uint128 maxLtv = 0.8e8; + uint256 minCollAmt = 0.5e18; + + deal(address(res.xt), sender, xtAmt); + + SwapUnit[] memory units = new SwapUnit[](1); + units[0] = SwapUnit(address(adapter), address(res.debt), address(res.collateral), abi.encode(minCollAmt)); + + res.xt.approve(address(res.router), xtAmt); + res.collateral.mint(sender, collateralAmt); + res.collateral.approve(address(res.router), collateralAmt); + + uint256 gtId = res.router.leverageFromXtAndCollateral(sender, res.market, xtAmt, collateralAmt, maxLtv, units); + (address owner, uint128 debtAmt, bytes memory collateralData) = res.gt.loanInfo(gtId); + assertEq(owner, sender); + assertEq(minCollAmt + collateralAmt, abi.decode(collateralData, (uint256))); + assertEq( + uint128(xtAmt * Constants.DECIMAL_BASE / (Constants.DECIMAL_BASE - res.market.mintGtFeeRatio())), debtAmt + ); + vm.stopPrank(); + } + + function testLeverage_LtvTooBigger() public { + vm.startPrank(sender); + + uint128 xtAmt = 100e8; + uint128 tokenToSwap = 100e8; + uint128 maxLtv = 0.1e2; + uint256 minCollAmt = 1e18; + + uint256 ltv = (xtAmt * Constants.DECIMAL_BASE / (Constants.DECIMAL_BASE - res.market.mintGtFeeRatio())) / 2000; + + deal(address(res.xt), sender, xtAmt); + + SwapUnit[] memory units = new SwapUnit[](1); + units[0] = SwapUnit(address(adapter), address(res.debt), address(res.collateral), abi.encode(minCollAmt)); + + res.xt.approve(address(res.router), xtAmt); + res.debt.mint(sender, tokenToSwap); + res.debt.approve(address(res.router), tokenToSwap); + + vm.expectRevert( + abi.encodeWithSelector(RouterErrors.LtvBiggerThanExpected.selector, uint128(maxLtv), uint128(ltv)) + ); + res.router.leverageFromXt(sender, res.market, xtAmt, tokenToSwap, maxLtv, units); + + vm.stopPrank(); + } + + function testBorrowTokenFromCollateral() public { + vm.startPrank(sender); + + uint256 collInAmt = 1e18; + uint128 borrowAmt = 80e8; + uint128 maxDebtAmt = 100e8; + + // uint fee = (res.market.mintGtFeeRatio() * maxDebtAmt) / Constants.DECIMAL_BASE; + // uint ftAmt = maxDebtAmt - fee; + + ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); + orders[0] = res.order; + uint128[] memory tokenAmtsWantBuy = new uint128[](1); + tokenAmtsWantBuy[0] = borrowAmt; + + res.collateral.mint(sender, collInAmt); + res.collateral.approve(address(res.router), collInAmt); + + // vm.expectEmit(); + // emit RouterEvents.Borrow(res.market, gtId, sender, sender, collInAmt, maxDebtAmt.toUint128(), borrowAmt); + uint256 gtId = res.router.borrowTokenFromCollateral( + sender, res.market, collInAmt, orders, tokenAmtsWantBuy, maxDebtAmt, block.timestamp + 1 hours + ); + + (address owner, uint128 debtAmt, bytes memory collateralData) = res.gt.loanInfo(gtId); + assertEq(owner, sender); + assertEq(collInAmt, abi.decode(collateralData, (uint256))); + assert(debtAmt <= maxDebtAmt); + assertEq(res.debt.balanceOf(sender), borrowAmt); + + vm.stopPrank(); + } + + function testBorrowTokenFromCollateralCase2() public { + vm.startPrank(sender); + + uint256 collInAmt = 1e18; + uint128 borrowAmt = 80e8; + + res.collateral.mint(sender, collInAmt); + res.collateral.approve(address(res.router), collInAmt); + + res.debt.mint(sender, borrowAmt); + res.debt.approve(address(res.market), borrowAmt); + res.market.mint(sender, borrowAmt); + + res.xt.approve(address(res.router), borrowAmt); + + uint256 mintGtFeeRatio = res.market.mintGtFeeRatio(); + uint128 previewDebtAmt = + ((borrowAmt * Constants.DECIMAL_BASE) / (Constants.DECIMAL_BASE - mintGtFeeRatio)).toUint128(); + + vm.expectEmit(); + emit RouterEvents.Borrow(res.market, 1, sender, sender, collInAmt, previewDebtAmt, borrowAmt); + + uint256 gtId = res.router.borrowTokenFromCollateral(sender, res.market, collInAmt, borrowAmt); + (address owner, uint128 debtAmt, bytes memory collateralData) = res.gt.loanInfo(gtId); + assertEq(owner, sender); + assertEq(collInAmt, abi.decode(collateralData, (uint256))); + assert(previewDebtAmt == debtAmt); + assertEq(res.debt.balanceOf(sender), borrowAmt); + + vm.stopPrank(); + } + + function testBorrowTokenFromGt() public { + vm.startPrank(sender); + uint256 collInAmt = 1e18; + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, 100e8, collInAmt); + + uint128 borrowAmt = 80e8; + + res.debt.mint(sender, borrowAmt); + res.debt.approve(address(res.market), borrowAmt); + res.market.mint(sender, borrowAmt); + + res.xt.approve(address(res.router), borrowAmt); + res.gt.approve(address(res.router), gtId); + + uint256 mintGtFeeRatio = res.market.mintGtFeeRatio(); + uint128 previewDebtAmt = + ((borrowAmt * Constants.DECIMAL_BASE) / (Constants.DECIMAL_BASE - mintGtFeeRatio)).toUint128(); + + vm.expectEmit(); + emit RouterEvents.Borrow(res.market, 1, sender, sender, 0, previewDebtAmt, borrowAmt); + + res.router.borrowTokenFromGt(sender, res.market, gtId, borrowAmt); + + (, uint128 dAmt,) = res.gt.loanInfo(gtId); + assert(dAmt == 100e8 + previewDebtAmt); + assertEq(res.debt.balanceOf(sender), borrowAmt); + + vm.stopPrank(); + } + + function testBorrowTokenFromGtInvalidSender() public { + vm.startPrank(sender); + uint256 collInAmt = 1e18; + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, 100e8, collInAmt); + + uint128 borrowAmt = 80e8; + + res.debt.mint(sender, borrowAmt); + res.debt.approve(address(res.market), borrowAmt); + res.market.mint(sender, borrowAmt); + + res.xt.approve(address(res.router), borrowAmt); + res.gt.approve(address(res.router), gtId); + + uint256 mintGtFeeRatio = res.market.mintGtFeeRatio(); + ((borrowAmt * Constants.DECIMAL_BASE) / (Constants.DECIMAL_BASE - mintGtFeeRatio)).toUint128(); + vm.stopPrank(); + + vm.expectRevert(abi.encodeWithSelector(RouterErrors.GtNotOwnedBySender.selector)); + vm.prank(deployer); + res.router.borrowTokenFromGt(sender, res.market, gtId, borrowAmt); + + vm.stopPrank(); + } + + function testFlashRepayFromCollateral() public { + vm.startPrank(sender); + uint128 debtAmt = 100e8; + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, 1e18); + + ITermMaxOrder[] memory orders = new ITermMaxOrder[](0); + uint128[] memory amtsToBuyFt = new uint128[](0); + bool byDebtToken = true; + + uint256 mintTokenOut = 2000e8; + SwapUnit[] memory units = new SwapUnit[](1); + units[0] = SwapUnit(address(adapter), address(res.collateral), address(res.debt), abi.encode(mintTokenOut)); + + res.gt.approve(address(res.router), gtId); + ITermMaxRouterV2.TermMaxSwapData memory swapData; + res.router.flashRepayFromColl(sender, res.market, gtId, byDebtToken, units, swapData); + + assertEq(res.collateral.balanceOf(sender), 0); + assertEq(res.debt.balanceOf(sender), mintTokenOut - debtAmt); + + vm.expectRevert(abi.encodePacked(bytes4(keccak256("ERC721NonexistentToken(uint256)")), gtId)); + res.gt.loanInfo(gtId); + + vm.stopPrank(); + } + + function testFlashRepayFromCollateral_ByFt() public { + vm.startPrank(sender); + uint128 debtAmt = 100e8; + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, 1e18); + + ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); + orders[0] = res.order; + uint128[] memory amtsToBuyFt = new uint128[](1); + amtsToBuyFt[0] = debtAmt; + + bool byDebtToken = false; + + uint256 mintTokenOut = 2000e8; + SwapUnit[] memory units = new SwapUnit[](1); + units[0] = SwapUnit(address(adapter), address(res.collateral), address(res.debt), abi.encode(mintTokenOut)); + + ITermMaxRouterV2.TermMaxSwapData memory swapData; + swapData.orders = orders; + swapData.tradingAmts = amtsToBuyFt; + swapData.tokenIn = address(res.debt); + swapData.tokenOut = address(res.ft); + swapData.netTokenAmt = 0; + swapData.deadline = block.timestamp + 1 hours; + + res.gt.approve(address(res.router), gtId); + res.router.flashRepayFromColl(sender, res.market, gtId, byDebtToken, units, swapData); + + assertEq(res.collateral.balanceOf(sender), 0); + assert(res.debt.balanceOf(sender) > mintTokenOut - debtAmt); + + vm.expectRevert(abi.encodePacked(bytes4(keccak256("ERC721NonexistentToken(uint256)")), gtId)); + res.gt.loanInfo(gtId); + + vm.stopPrank(); + } + + function testRepayByTokenThroughFt() public { + vm.startPrank(sender); + uint128 debtAmt = 100e8; + uint256 collateralAmt = 1e18; + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + + ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); + orders[0] = res.order; + uint128[] memory amtsToBuyFt = new uint128[](1); + amtsToBuyFt[0] = debtAmt; + uint128 maxTokenIn = debtAmt; + + res.debt.mint(sender, maxTokenIn); + res.debt.approve(address(res.router), maxTokenIn); + + uint256 returnAmt = + res.router.repayByTokenThroughFt(sender, res.market, gtId, orders, amtsToBuyFt, maxTokenIn, block.timestamp); + assertEq(res.debt.balanceOf(sender), returnAmt); + assertEq(res.collateral.balanceOf(sender), collateralAmt); + + vm.expectRevert(abi.encodePacked(bytes4(keccak256("ERC721NonexistentToken(uint256)")), gtId)); + res.gt.loanInfo(gtId); + + vm.stopPrank(); + } + + function testPartialRepayByTokenThroughFt() public { + vm.startPrank(sender); + uint128 debtAmt = 100e8; + uint256 collateralAmt = 1e18; + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + + ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); + orders[0] = res.order; + uint128[] memory amtsToBuyFt = new uint128[](1); + amtsToBuyFt[0] = debtAmt / 2; + uint128 maxTokenIn = debtAmt; + + res.debt.mint(sender, maxTokenIn); + res.debt.approve(address(res.router), maxTokenIn); + + uint256 returnAmt = + res.router.repayByTokenThroughFt(sender, res.market, gtId, orders, amtsToBuyFt, maxTokenIn, block.timestamp); + assertEq(res.debt.balanceOf(sender), returnAmt); + assertEq(res.collateral.balanceOf(sender), 0); + + (address owner, uint128 dAmt, bytes memory collateralData) = res.gt.loanInfo(gtId); + assertEq(owner, sender); + assertEq(collateralAmt, abi.decode(collateralData, (uint256))); + assertEq(dAmt, debtAmt / 2); + + vm.stopPrank(); + } + + function testRedeemAndSwap() public { + address bob = vm.randomAddress(); + address alice = vm.randomAddress(); + + uint128 depositAmt = 1000e8; + uint128 debtAmt = 100e8; + uint256 collateralAmt = 1e18; + + vm.startPrank(bob); + res.debt.mint(bob, depositAmt); + res.debt.approve(address(res.market), depositAmt); + res.market.mint(bob, depositAmt); + + res.xt.transfer(alice, debtAmt); + vm.stopPrank(); + + vm.startPrank(alice); + + MockFlashLoanReceiver receiver = new MockFlashLoanReceiver(res.market); + res.collateral.mint(address(receiver), collateralAmt); + + res.xt.approve(address(receiver), debtAmt); + receiver.leverageByXt(debtAmt, abi.encode(alice, collateralAmt)); + vm.stopPrank(); + + vm.warp(marketConfig.maturity + Constants.LIQUIDATION_WINDOW); + + vm.startPrank(bob); + + uint256 minDebtOutAmt = 1000e8; + SwapUnit[] memory units = new SwapUnit[](1); + units[0] = SwapUnit(address(adapter), address(res.collateral), address(res.debt), abi.encode(minDebtOutAmt)); + + res.ft.approve(address(res.router), depositAmt); + uint256 ftTotalSupply = res.ft.totalSupply(); + uint256 redeemedDebtToken = (res.debt.balanceOf(address(res.market)) * depositAmt) / ftTotalSupply; + + uint256 expectedOutput = redeemedDebtToken + minDebtOutAmt; + + vm.expectEmit(); + emit RouterEvents.RedeemAndSwap(res.market, depositAmt, bob, bob, expectedOutput); + uint256 netOutput = res.router.redeemAndSwap(bob, res.market, depositAmt, units, expectedOutput); + + assertEq(netOutput, expectedOutput); + assertEq(res.debt.balanceOf(bob), netOutput); + + vm.stopPrank(); + } + + function testSwapUnitsIsEmpty() public { + address bob = vm.randomAddress(); + address alice = vm.randomAddress(); + + uint128 depositAmt = 1000e8; + uint128 debtAmt = 100e8; + uint256 collateralAmt = 1e18; + + vm.startPrank(bob); + res.debt.mint(bob, depositAmt); + res.debt.approve(address(res.market), depositAmt); + res.market.mint(bob, depositAmt); + + res.xt.transfer(alice, debtAmt); + vm.stopPrank(); + + vm.startPrank(alice); + + MockFlashLoanReceiver receiver = new MockFlashLoanReceiver(res.market); + res.collateral.mint(address(receiver), collateralAmt); + + res.xt.approve(address(receiver), debtAmt); + receiver.leverageByXt(debtAmt, abi.encode(alice, collateralAmt)); + vm.stopPrank(); + + vm.warp(marketConfig.maturity + Constants.LIQUIDATION_WINDOW); + + vm.startPrank(bob); + + uint256 minDebtOutAmt = 1000e8; + SwapUnit[] memory units = new SwapUnit[](0); + res.ft.approve(address(res.router), depositAmt); + + vm.expectRevert(abi.encodeWithSelector(RouterErrors.SwapUnitsIsEmpty.selector)); + res.router.redeemAndSwap(bob, res.market, depositAmt, units, minDebtOutAmt); + + vm.stopPrank(); + } + + function testCreateOrderAndDeposit() public { + vm.startPrank(sender); + + uint256 maxXtReserve = 1000e8; + + ISwapCallback swapTrigger = ISwapCallback(address(0)); + uint256 debtTokenToDeposit = 1e8; + uint128 ftToDeposit = 2e8; + uint128 xtToDeposit = 10e8; + CurveCuts memory curveCuts = orderConfig.curveCuts; + deal(address(res.ft), sender, ftToDeposit); + deal(address(res.xt), sender, xtToDeposit); + res.debt.mint(sender, debtTokenToDeposit); + res.debt.approve(address(res.router), debtTokenToDeposit); + res.ft.approve(address(res.router), ftToDeposit); + res.xt.approve(address(res.router), xtToDeposit); + ITermMaxOrder order = res.router.createOrderAndDeposit( + res.market, maker, maxXtReserve, swapTrigger, debtTokenToDeposit, ftToDeposit, xtToDeposit, curveCuts + ); + + assertEq(order.maker(), maker); + assertEq(res.ft.balanceOf(address(order)), ftToDeposit + debtTokenToDeposit); + assertEq(res.xt.balanceOf(address(order)), xtToDeposit + debtTokenToDeposit); + } + + function testOrdersAndAmtsLengthNotMatch() public { + vm.startPrank(sender); + + uint128[] memory tradingAmts = new uint128[](2); + tradingAmts[0] = 45e8; + tradingAmts[1] = 45e8; + uint128 maxAmountIn = 100e8; + + ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); + orders[0] = res.order; + + res.debt.mint(sender, maxAmountIn); + res.debt.approve(address(res.router), maxAmountIn); + + vm.expectRevert(RouterErrors.OrdersAndAmtsLengthNotMatch.selector); + res.router.swapTokenToExactToken( + res.debt, res.ft, sender, orders, tradingAmts, maxAmountIn, block.timestamp + 1 hours + ); + + vm.expectRevert(RouterErrors.OrdersAndAmtsLengthNotMatch.selector); + res.router.swapExactTokenToToken( + res.debt, res.ft, sender, orders, tradingAmts, maxAmountIn, block.timestamp + 1 hours + ); + vm.stopPrank(); + } +} diff --git a/test/v2/mainnet-fork/ForkBaseTest.sol b/test/v2/mainnet-fork/ForkBaseTest.sol new file mode 100644 index 0000000..2afa349 --- /dev/null +++ b/test/v2/mainnet-fork/ForkBaseTest.sol @@ -0,0 +1,172 @@ +pragma solidity ^0.8.27; + +import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import {TermMaxFactoryV2, ITermMaxFactory} from "contracts/v2/factory/TermMaxFactoryV2.sol"; +import {ITermMaxRouterV2, TermMaxRouterV2} from "contracts/v2/router/TermMaxRouterV2.sol"; +import {TermMaxMarketV2, Constants, SafeCast} from "contracts/v2/TermMaxMarketV2.sol"; +import {TermMaxOrderV2, OrderConfig} from "contracts/v2/TermMaxOrderV2.sol"; +import {MockERC20} from "contracts/v1/test/MockERC20.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {MockOrderV2} from "contracts/v2/test/MockOrderV2.sol"; +import {MintableERC20V2} from "contracts/v2/tokens/MintableERC20V2.sol"; +import {IMintableERC20} from "contracts/v1/tokens/IMintableERC20.sol"; +import {SwapAdapter} from "contracts/v1/test/testnet/SwapAdapter.sol"; +import {IOracleV2, OracleAggregatorV2} from "contracts/v2/oracle/OracleAggregatorV2.sol"; +import {IOrderManager, OrderManager} from "contracts/v1/vault/OrderManager.sol"; +import {ITermMaxVault, ITermMaxVaultV2, TermMaxVaultV2} from "contracts/v2/vault/TermMaxVaultV2.sol"; +import {VaultFactory, IVaultFactory} from "contracts/v1/factory/VaultFactory.sol"; +import { + MarketConfig, + FeeConfig, + MarketInitialParams, + LoanConfig, + VaultInitialParams +} from "contracts/v1/storage/TermMaxStorage.sol"; +import {JSONLoader} from "../utils/JSONLoader.sol"; +import "forge-std/Test.sol"; + +abstract contract ForkBaseTest is Test { + using SafeCast for *; + + string jsonData; + + string[] tokenPairs; + + function _finishSetup() internal virtual; + + function setUp() public { + jsonData = vm.readFile(_getDataPath()); + _readTokenPairs(); + + uint256 mainnetFork = vm.createFork(_getForkRpcUrl()); + vm.selectFork(mainnetFork); + + _finishSetup(); + } + + function _getForkRpcUrl() internal view virtual returns (string memory); + + function _getDataPath() internal view virtual returns (string memory); + + function _readTokenPairs() internal { + // uint256 len = vm.parseJsonUint(jsonData, ".tokenPairs.length"); + string[] memory _tokenPairs = vm.parseJsonStringArray(jsonData, ".tokenPairs"); + for (uint256 i = 0; i < _tokenPairs.length; i++) { + tokenPairs.push(string.concat(".", _tokenPairs[i])); + } + } + + function _readBlockNumber(string memory key) internal view returns (uint256) { + return uint256(vm.parseJsonUint(jsonData, string.concat(key, ".blockNumber"))); + } + + function _readMarketInitialParams(string memory key) + internal + returns (MarketInitialParams memory marketInitialParams) + { + marketInitialParams.admin = vm.randomAddress(); + marketInitialParams.collateral = vm.parseJsonAddress(jsonData, string.concat(key, ".collateral")); + marketInitialParams.debtToken = IERC20Metadata(vm.parseJsonAddress(jsonData, string.concat(key, ".debtToken"))); + + marketInitialParams.tokenName = key; + marketInitialParams.tokenSymbol = key; + + MarketConfig memory marketConfig; + + marketConfig.feeConfig.mintGtFeeRatio = + uint32(vm.parseUint(vm.parseJsonString(jsonData, string.concat(key, ".feeConfig.mintGtFeeRatio")))); + marketConfig.feeConfig.mintGtFeeRef = + uint32(vm.parseUint(vm.parseJsonString(jsonData, string.concat(key, ".feeConfig.mintGtFeeRef")))); + marketConfig.feeConfig.lendTakerFeeRatio = + uint32(vm.parseUint(vm.parseJsonString(jsonData, string.concat(key, ".feeConfig.lendTakerFeeRatio")))); + marketConfig.feeConfig.borrowTakerFeeRatio = + uint32(vm.parseUint(vm.parseJsonString(jsonData, string.concat(key, ".feeConfig.borrowTakerFeeRatio")))); + marketConfig.feeConfig.lendMakerFeeRatio = + uint32(vm.parseUint(vm.parseJsonString(jsonData, string.concat(key, ".feeConfig.lendMakerFeeRatio")))); + marketConfig.feeConfig.borrowMakerFeeRatio = + uint32(vm.parseUint(vm.parseJsonString(jsonData, string.concat(key, ".feeConfig.borrowMakerFeeRatio")))); + marketInitialParams.marketConfig = marketConfig; + + marketConfig.treasurer = vm.randomAddress(); + marketConfig.maturity = + uint64(86400 * vm.parseUint(vm.parseJsonString(jsonData, string.concat(key, ".duration")))); + + marketInitialParams.loanConfig.maxLtv = + uint32(vm.parseUint(vm.parseJsonString(jsonData, string.concat(key, ".loanConfig.maxLtv")))); + marketInitialParams.loanConfig.liquidationLtv = + uint32(vm.parseUint(vm.parseJsonString(jsonData, string.concat(key, ".loanConfig.liquidationLtv")))); + marketInitialParams.loanConfig.liquidatable = + vm.parseBool(vm.parseJsonString(jsonData, string.concat(key, ".loanConfig.liquidatable"))); + + marketInitialParams.gtInitalParams = abi.encode(type(uint256).max); + + return marketInitialParams; + } + + function _readOrderConfig(string memory key) internal view returns (OrderConfig memory orderConfig) { + orderConfig = JSONLoader.getOrderConfigFromJson(jsonData, string.concat(key, ".orderConfig")); + return orderConfig; + } + + function _readVaultInitialParams(address admin, IERC20 debtToken, string memory key) + internal + returns (VaultInitialParams memory vaultInitialParams) + { + vaultInitialParams.admin = admin; + vaultInitialParams.curator = vm.randomAddress(); + vaultInitialParams.timelock = 1 days; + vaultInitialParams.asset = debtToken; + vaultInitialParams.maxCapacity = type(uint128).max; + vaultInitialParams.name = string.concat("Vault-", key); + vaultInitialParams.symbol = string.concat("Vault-", key); + vaultInitialParams.performanceFeeRate = 0.1e8; + return vaultInitialParams; + } + + function _setPriceFeedInTokenDecimal8( + MockPriceFeed priceFeed, + uint8 tokenDecimals, + MockPriceFeed.RoundData memory roundData + ) internal { + roundData.answer = + (roundData.answer.toUint256() * (10 ** uint256(tokenDecimals)) / Constants.DECIMAL_BASE).toInt256(); + priceFeed.updateRoundData(roundData); + } + + function deployFactory(address admin) public returns (TermMaxFactoryV2 factory) { + address tokenImplementation = address(new MintableERC20V2()); + address orderImplementation = address(new TermMaxOrderV2()); + TermMaxMarketV2 m = new TermMaxMarketV2(tokenImplementation, orderImplementation); + factory = new TermMaxFactoryV2(admin, address(m)); + } + + function deployFactoryWithMockOrder(address admin) public returns (TermMaxFactoryV2 factory) { + address tokenImplementation = address(new MintableERC20V2()); + address orderImplementation = address(new MockOrderV2()); + TermMaxMarketV2 m = new TermMaxMarketV2(tokenImplementation, orderImplementation); + factory = new TermMaxFactoryV2(admin, address(m)); + } + + function deployVaultFactory() public returns (VaultFactory vaultFactory) { + OrderManager orderManager = new OrderManager(); + TermMaxVaultV2 implementation = new TermMaxVaultV2(address(orderManager)); + vaultFactory = new VaultFactory(address(implementation)); + } + + function deployOracleAggregator(address admin) public returns (OracleAggregatorV2 oracle) { + oracle = new OracleAggregatorV2(admin, 0); + } + + function deployMockPriceFeed(address admin) public returns (MockPriceFeed priceFeed) { + priceFeed = new MockPriceFeed(admin); + } + + function deployRouter(address admin) public returns (TermMaxRouterV2 router) { + TermMaxRouterV2 implementation = new TermMaxRouterV2(); + bytes memory data = abi.encodeCall(TermMaxRouterV2.initialize, admin); + ERC1967Proxy proxy = new ERC1967Proxy(address(implementation), data); + router = TermMaxRouterV2(address(proxy)); + } +} From d1bc2280020177216eb1545a89ebc6c7a803ea17 Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 3 Jun 2025 11:28:47 +0800 Subject: [PATCH 054/194] fork tests --- ...tory.sol => TermMaxPriceFeedFactoryV2.sol} | 2 +- ...3Adapter.sol => PendleSwapV3AdapterV2.sol} | 0 ...apV3Adapter.sol => UniswapV3AdapterV2.sol} | 0 test/mainnet-fork/GtBaseTest.t.sol | 2 +- .../{ForkBaseTest.sol => ForkBaseTestV2.sol} | 2 +- test/v2/mainnet-fork/GtBaseTestV2.t.sol | 410 ++++++++++++++++++ test/v2/mainnet-fork/MarketBaseTestV2.t.sol | 250 +++++++++++ test/v2/mainnet-fork/VaultBaseTestV2.t.sol | 268 ++++++++++++ test/v2/mainnet-fork/mainnet/ForkGtV2.t.sol | 154 +++++++ .../mainnet-fork/mainnet/ForkMarketV2.t.sol | 45 ++ .../mainnet/ForkPriceFeedV2.t.sol | 134 ++++++ .../v2/mainnet-fork/mainnet/ForkVaultV2.t.sol | 43 ++ 12 files changed, 1307 insertions(+), 3 deletions(-) rename contracts/v2/factory/{TermMaxPriceFeedFactory.sol => TermMaxPriceFeedFactoryV2.sol} (97%) rename contracts/v2/router/swapAdapters/{PendleSwapV3Adapter.sol => PendleSwapV3AdapterV2.sol} (100%) rename contracts/v2/router/swapAdapters/{UniswapV3Adapter.sol => UniswapV3AdapterV2.sol} (100%) rename test/v2/mainnet-fork/{ForkBaseTest.sol => ForkBaseTestV2.sol} (99%) create mode 100644 test/v2/mainnet-fork/GtBaseTestV2.t.sol create mode 100644 test/v2/mainnet-fork/MarketBaseTestV2.t.sol create mode 100644 test/v2/mainnet-fork/VaultBaseTestV2.t.sol create mode 100644 test/v2/mainnet-fork/mainnet/ForkGtV2.t.sol create mode 100644 test/v2/mainnet-fork/mainnet/ForkMarketV2.t.sol create mode 100644 test/v2/mainnet-fork/mainnet/ForkPriceFeedV2.t.sol create mode 100644 test/v2/mainnet-fork/mainnet/ForkVaultV2.t.sol diff --git a/contracts/v2/factory/TermMaxPriceFeedFactory.sol b/contracts/v2/factory/TermMaxPriceFeedFactoryV2.sol similarity index 97% rename from contracts/v2/factory/TermMaxPriceFeedFactory.sol rename to contracts/v2/factory/TermMaxPriceFeedFactoryV2.sol index 6d1ad58..0c1c1a5 100644 --- a/contracts/v2/factory/TermMaxPriceFeedFactory.sol +++ b/contracts/v2/factory/TermMaxPriceFeedFactoryV2.sol @@ -5,7 +5,7 @@ import {TermMaxERC4626PriceFeed} from "../oracle/priceFeeds/TermMaxERC4626PriceF import {TermMaxPriceFeedConverter} from "../oracle/priceFeeds/TermMaxPriceFeedConverter.sol"; import {TermMaxPTPriceFeed} from "../oracle/priceFeeds/TermMaxPTPriceFeed.sol"; -contract TermMaxPriceFeedFactory { +contract TermMaxPriceFeedFactoryV2 { event PriceFeedCreated(address indexed priceFeed); function createPriceFeedWithERC4626(address _assetPriceFeed, address _vault) external returns (address) { diff --git a/contracts/v2/router/swapAdapters/PendleSwapV3Adapter.sol b/contracts/v2/router/swapAdapters/PendleSwapV3AdapterV2.sol similarity index 100% rename from contracts/v2/router/swapAdapters/PendleSwapV3Adapter.sol rename to contracts/v2/router/swapAdapters/PendleSwapV3AdapterV2.sol diff --git a/contracts/v2/router/swapAdapters/UniswapV3Adapter.sol b/contracts/v2/router/swapAdapters/UniswapV3AdapterV2.sol similarity index 100% rename from contracts/v2/router/swapAdapters/UniswapV3Adapter.sol rename to contracts/v2/router/swapAdapters/UniswapV3AdapterV2.sol diff --git a/test/mainnet-fork/GtBaseTest.t.sol b/test/mainnet-fork/GtBaseTest.t.sol index d279ff1..04b383a 100644 --- a/test/mainnet-fork/GtBaseTest.t.sol +++ b/test/mainnet-fork/GtBaseTest.t.sol @@ -149,7 +149,7 @@ abstract contract GtBaseTest is ForkBaseTest { return res; } - function _readSwapData(string memory key) internal returns (SwapData memory data) { + function _readSwapData(string memory key) internal view returns (SwapData memory data) { data.tokenType = TokenType(vm.parseJsonUint(jsonData, string.concat(key, ".swapData.tokenType"))); data.debtAmt = uint128(vm.parseJsonUint(jsonData, string.concat(key, ".swapData.debtAmt"))); data.swapAmtIn = uint128(vm.parseJsonUint(jsonData, string.concat(key, ".swapData.swapAmtIn"))); diff --git a/test/v2/mainnet-fork/ForkBaseTest.sol b/test/v2/mainnet-fork/ForkBaseTestV2.sol similarity index 99% rename from test/v2/mainnet-fork/ForkBaseTest.sol rename to test/v2/mainnet-fork/ForkBaseTestV2.sol index 2afa349..8149397 100644 --- a/test/v2/mainnet-fork/ForkBaseTest.sol +++ b/test/v2/mainnet-fork/ForkBaseTestV2.sol @@ -27,7 +27,7 @@ import { import {JSONLoader} from "../utils/JSONLoader.sol"; import "forge-std/Test.sol"; -abstract contract ForkBaseTest is Test { +abstract contract ForkBaseTestV2 is Test { using SafeCast for *; string jsonData; diff --git a/test/v2/mainnet-fork/GtBaseTestV2.t.sol b/test/v2/mainnet-fork/GtBaseTestV2.t.sol new file mode 100644 index 0000000..433406e --- /dev/null +++ b/test/v2/mainnet-fork/GtBaseTestV2.t.sol @@ -0,0 +1,410 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "forge-std/Test.sol"; +import {DeployUtils} from "../utils/DeployUtils.sol"; +import {JSONLoader} from "../utils/JSONLoader.sol"; +import {StateChecker} from "../utils/StateChecker.sol"; +import {SwapUtils} from "../utils/SwapUtils.sol"; +import {ForkBaseTestV2} from "./ForkBaseTestV2.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import {TermMaxFactoryV2, ITermMaxFactory} from "contracts/v2/factory/TermMaxFactoryV2.sol"; +import {ITermMaxRouterV2, TermMaxRouterV2} from "contracts/v2/router/TermMaxRouterV2.sol"; +import {TermMaxMarketV2, Constants, SafeCast} from "contracts/v2/TermMaxMarketV2.sol"; +import {TermMaxOrderV2, OrderConfig} from "contracts/v2/TermMaxOrderV2.sol"; +import {MockERC20} from "contracts/v1/test/MockERC20.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {MockOrderV2} from "contracts/v2/test/MockOrderV2.sol"; +import {MintableERC20V2} from "contracts/v2/tokens/MintableERC20V2.sol"; +import {IMintableERC20} from "contracts/v1/tokens/IMintableERC20.sol"; +import {SwapAdapter} from "contracts/v1/test/testnet/SwapAdapter.sol"; +import {IOracleV2, OracleAggregatorV2} from "contracts/v2/oracle/OracleAggregatorV2.sol"; +import {IOracle} from "contracts/v1/oracle/IOracle.sol"; +import {IOrderManager, OrderManager} from "contracts/v1/vault/OrderManager.sol"; +import {ITermMaxVault, ITermMaxVaultV2, TermMaxVaultV2} from "contracts/v2/vault/TermMaxVaultV2.sol"; +import {VaultFactory, IVaultFactory} from "contracts/v1/factory/VaultFactory.sol"; +import { + MarketConfig, + FeeConfig, + MarketInitialParams, + LoanConfig, + VaultInitialParams +} from "contracts/v1/storage/TermMaxStorage.sol"; +import {ITermMaxRouter, RouterEvents, RouterErrors} from "contracts/v1/router/TermMaxRouter.sol"; +import {MockFlashLoanReceiver} from "contracts/v1/test/MockFlashLoanReceiver.sol"; +import {SwapUnit, ISwapAdapter} from "contracts/v1/router/ISwapAdapter.sol"; +import { + IGearingToken, IGearingTokenV2, GearingTokenWithERC20V2 +} from "contracts/v2/tokens/GearingTokenWithERC20V2.sol"; +import {MintableERC20V2} from "contracts/v2/tokens/MintableERC20V2.sol"; +import {ITermMaxOrder} from "contracts/v1/ITermMaxOrder.sol"; +import {ISwapCallback} from "contracts/v1/ISwapCallback.sol"; +import {UniswapV3AdapterV2} from "contracts/v2/router/swapAdapters/UniswapV3AdapterV2.sol"; +import {PendleSwapV3AdapterV2} from "contracts/v2/router/swapAdapters/PendleSwapV3AdapterV2.sol"; +import {OdosV2AdapterV2} from "contracts/v2/router/swapAdapters/OdosV2AdapterV2.sol"; +import {ERC4626VaultAdapterV2} from "contracts/v2/router/swapAdapters/ERC4626VaultAdapterV2.sol"; +import {KyberswapV2AdapterV2} from "contracts/v2/router/swapAdapters/KyberswapV2AdapterV2.sol"; + +abstract contract GtBaseTestV2 is ForkBaseTestV2 { + enum TokenType { + General, + Pendle, + Morpho + } + + struct SwapData { + uint128 debtAmt; + uint128 swapAmtIn; + TokenType tokenType; + SwapUnit[] leverageUnits; + SwapUnit[] flashRepayUnits; + } + + struct SwapAdapters { + address uniswapAdapter; + address pendleAdapter; + address odosAdapter; + address vaultAdapter; + } + + struct GtTestRes { + uint256 blockNumber; + uint256 orderInitialAmount; + MarketInitialParams marketInitialParams; + OrderConfig orderConfig; + TermMaxMarketV2 market; + IMintableERC20 ft; + IMintableERC20 xt; + IGearingToken gt; + IERC20Metadata collateral; + IERC20Metadata debtToken; + IOracleV2 oracle; + MockPriceFeed collateralPriceFeed; + MockPriceFeed debtPriceFeed; + ITermMaxOrder order; + ITermMaxRouterV2 router; + uint256 maxXtReserve; + address maker; + SwapData swapData; + SwapAdapters swapAdapters; + } + + function _initializeGtTestRes(string memory key) internal returns (GtTestRes memory) { + GtTestRes memory res; + res.blockNumber = _readBlockNumber(key); + res.marketInitialParams = _readMarketInitialParams(key); + res.orderConfig = _readOrderConfig(key); + res.maker = vm.randomAddress(); + res.maxXtReserve = type(uint128).max; + + vm.rollFork(res.blockNumber); + + vm.startPrank(res.marketInitialParams.admin); + + res.oracle = deployOracleAggregator(res.marketInitialParams.admin); + res.collateralPriceFeed = deployMockPriceFeed(res.marketInitialParams.admin); + res.debtPriceFeed = deployMockPriceFeed(res.marketInitialParams.admin); + res.oracle.submitPendingOracle( + address(res.marketInitialParams.collateral), + IOracleV2.Oracle(res.collateralPriceFeed, res.collateralPriceFeed, 0, 0, 0) + ); + res.oracle.submitPendingOracle( + address(res.marketInitialParams.debtToken), IOracleV2.Oracle(res.debtPriceFeed, res.debtPriceFeed, 0, 0, 0) + ); + + res.oracle.acceptPendingOracle(address(res.marketInitialParams.collateral)); + res.oracle.acceptPendingOracle(address(res.marketInitialParams.debtToken)); + + res.marketInitialParams.marketConfig.maturity += uint64(block.timestamp); + res.marketInitialParams.loanConfig.oracle = IOracle(address(res.oracle)); + + res.market = TermMaxMarketV2( + deployFactory(res.marketInitialParams.admin).createMarket( + keccak256("GearingTokenWithERC20"), res.marketInitialParams, 0 + ) + ); + + (res.ft, res.xt, res.gt,,) = res.market.tokens(); + res.debtToken = res.marketInitialParams.debtToken; + res.collateral = IERC20Metadata(res.marketInitialParams.collateral); + + // set all price as 1 USD = 1e8 tokens + uint8 debtDecimals = res.debtToken.decimals(); + _setPriceFeedInTokenDecimal8( + res.debtPriceFeed, debtDecimals, MockPriceFeed.RoundData(1, 1e8, block.timestamp, block.timestamp, 0) + ); + uint8 collateralDecimals = res.collateral.decimals(); + _setPriceFeedInTokenDecimal8( + res.collateralPriceFeed, + collateralDecimals, + MockPriceFeed.RoundData(1, 1e8, block.timestamp, block.timestamp, 0) + ); + + res.order = + res.market.createOrder(res.maker, res.maxXtReserve, ISwapCallback(address(0)), res.orderConfig.curveCuts); + + res.swapAdapters.uniswapAdapter = + address(new UniswapV3AdapterV2(vm.parseJsonAddress(jsonData, ".routers.uniswapRouter"))); + res.swapAdapters.pendleAdapter = + address(new PendleSwapV3AdapterV2(vm.parseJsonAddress(jsonData, ".routers.pendleRouter"))); + res.swapAdapters.odosAdapter = + address(new OdosV2AdapterV2(vm.parseJsonAddress(jsonData, ".routers.odosRouter"))); + res.swapAdapters.vaultAdapter = address(new ERC4626VaultAdapterV2()); + res.router = deployRouter(res.marketInitialParams.admin); + res.router.setAdapterWhitelist(res.swapAdapters.uniswapAdapter, true); + res.router.setAdapterWhitelist(res.swapAdapters.pendleAdapter, true); + res.router.setAdapterWhitelist(res.swapAdapters.odosAdapter, true); + res.router.setAdapterWhitelist(res.swapAdapters.vaultAdapter, true); + res.swapData = _readSwapData(key); + + res.orderInitialAmount = vm.parseJsonUint(jsonData, string.concat(key, ".orderInitialAmount")); + deal(address(res.debtToken), res.marketInitialParams.admin, res.orderInitialAmount); + + res.debtToken.approve(address(res.market), res.orderInitialAmount); + res.market.mint(address(res.order), res.orderInitialAmount); + + vm.stopPrank(); + + return res; + } + + function _readSwapData(string memory key) internal view returns (SwapData memory data) { + data.tokenType = TokenType(vm.parseJsonUint(jsonData, string.concat(key, ".swapData.tokenType"))); + data.debtAmt = uint128(vm.parseJsonUint(jsonData, string.concat(key, ".swapData.debtAmt"))); + data.swapAmtIn = uint128(vm.parseJsonUint(jsonData, string.concat(key, ".swapData.swapAmtIn"))); + + uint256 length = vm.parseJsonUint(jsonData, string.concat(key, ".swapData.length")); + data.leverageUnits = new SwapUnit[](length); + data.flashRepayUnits = new SwapUnit[](length); + for (uint256 i = 0; i < length; i++) { + data.leverageUnits[i] = _readSwapUnit(string.concat(key, ".swapData.leverageUnits.", vm.toString(i))); + data.flashRepayUnits[i] = _readSwapUnit(string.concat(key, ".swapData.flashRepayUnits.", vm.toString(i))); + } + } + + function _readSwapUnit(string memory key) internal view returns (SwapUnit memory data) { + data.adapter = vm.parseJsonAddress(jsonData, string.concat(key, ".adapter")); + data.tokenIn = vm.parseJsonAddress(jsonData, string.concat(key, ".tokenIn")); + data.tokenOut = vm.parseJsonAddress(jsonData, string.concat(key, ".tokenOut")); + data.swapData = vm.parseJsonBytes(jsonData, string.concat(key, ".swapData")); + } + + function _updateCollateralPrice(GtTestRes memory res, int256 price) internal { + vm.startPrank(res.marketInitialParams.admin); + // set all price as 1 USD = 1e8 tokens + uint8 decimals = res.collateral.decimals(); + (uint80 roundId,,,,) = res.collateralPriceFeed.latestRoundData(); + roundId++; + uint256 time = block.timestamp; + _setPriceFeedInTokenDecimal8( + res.collateralPriceFeed, decimals, MockPriceFeed.RoundData(roundId, price, time, time, 0) + ); + vm.stopPrank(); + } + + function _testBorrow(GtTestRes memory res, uint256 collInAmt, uint128 borrowAmt, uint128 maxDebtAmt) internal { + address taker = vm.randomAddress(); + + vm.startPrank(taker); + + ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); + orders[0] = res.order; + uint128[] memory tokenAmtsWantBuy = new uint128[](1); + tokenAmtsWantBuy[0] = borrowAmt; + + deal(address(res.collateral), taker, collInAmt); + res.collateral.approve(address(res.router), collInAmt); + + uint256 gtId = res.router.borrowTokenFromCollateral( + taker, res.market, collInAmt, orders, tokenAmtsWantBuy, maxDebtAmt, block.timestamp + 1 hours + ); + (address owner, uint128 debtAmt, bytes memory collateralData) = res.gt.loanInfo(gtId); + assertEq(owner, taker); + assertEq(collInAmt, abi.decode(collateralData, (uint256))); + assertLe(debtAmt, maxDebtAmt); + assertEq(res.debtToken.balanceOf(taker), borrowAmt); + + vm.stopPrank(); + } + + function _testLeverageFromXt( + GtTestRes memory res, + address taker, + uint128 xtAmtIn, + uint128 tokenAmtIn, + SwapUnit[] memory units + ) internal returns (uint256 gtId) { + vm.startPrank(taker); + deal(taker, 1e8); + deal(address(res.debtToken), taker, xtAmtIn); + res.debtToken.approve(address(res.market), xtAmtIn); + res.market.mint(taker, xtAmtIn); + + uint256 maxLtv = res.marketInitialParams.loanConfig.maxLtv; + + deal(address(res.debtToken), taker, tokenAmtIn); + res.debtToken.approve(address(res.router), tokenAmtIn); + + uint256 debtTokenBalanceBeforeSwap = res.debtToken.balanceOf(taker); + uint256 xtAmtBeforeSwap = res.xt.balanceOf(taker); + + res.xt.approve(address(res.router), xtAmtIn); + gtId = res.router.leverageFromXt(taker, res.market, xtAmtIn, tokenAmtIn, uint128(maxLtv), units); + + uint256 debtTokenBalanceAfterSwap = res.debtToken.balanceOf(taker); + uint256 xtAmtAfterSwap = res.xt.balanceOf(taker); + + assertEq(debtTokenBalanceBeforeSwap - debtTokenBalanceAfterSwap, tokenAmtIn); + assertEq(xtAmtBeforeSwap - xtAmtAfterSwap, xtAmtIn); + + assertEq(res.collateral.balanceOf(taker), 0); + + assertEq(res.debtToken.balanceOf(address(res.router)), 0); + assertEq(res.xt.balanceOf(address(res.router)), 0); + assertEq(res.debtToken.balanceOf(address(res.router)), 0); + assertEq(res.collateral.balanceOf(address(res.router)), 0); + + vm.stopPrank(); + } + + function _testLeverageFromToken( + GtTestRes memory res, + address taker, + uint128 tokenAmtToBuyXt, + uint128 tokenAmtIn, + SwapUnit[] memory units + ) internal returns (uint256 gtId) { + vm.startPrank(taker); + deal(taker, 1e8); + + uint256 maxLtv = res.marketInitialParams.loanConfig.maxLtv; + uint128 minXTOut = 0e8; + deal(address(res.debtToken), taker, tokenAmtToBuyXt + tokenAmtIn); + res.debtToken.approve(address(res.router), tokenAmtToBuyXt + tokenAmtIn); + + uint256 debtTokenBalanceBeforeSwap = res.debtToken.balanceOf(taker); + + ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); + orders[0] = res.order; + uint128[] memory amtsToBuyXt = new uint128[](1); + amtsToBuyXt[0] = tokenAmtToBuyXt; + + (gtId,) = res.router.leverageFromToken( + taker, + res.market, + orders, + amtsToBuyXt, + minXTOut, + tokenAmtIn, + uint128(maxLtv), + units, + block.timestamp + 1 hours + ); + + uint256 debtTokenBalanceAfterSwap = res.debtToken.balanceOf(taker); + + assertEq(debtTokenBalanceBeforeSwap - debtTokenBalanceAfterSwap, tokenAmtToBuyXt + tokenAmtIn); + + assertEq(res.collateral.balanceOf(taker), 0); + + assertEq(res.debtToken.balanceOf(address(res.router)), 0); + assertEq(res.xt.balanceOf(address(res.router)), 0); + assertEq(res.debtToken.balanceOf(address(res.router)), 0); + assertEq(res.collateral.balanceOf(address(res.router)), 0); + + vm.stopPrank(); + } + + function _testFlashRepay(GtTestRes memory res, uint256 gtId, address taker, SwapUnit[] memory units) internal { + deal(taker, 1e18); + + vm.startPrank(taker); + + res.gt.approve(address(res.router), gtId); + + uint256 debtTokenBalanceBeforeRepay = res.debtToken.balanceOf(taker); + bool byDebtToken = true; + + ITermMaxRouterV2.TermMaxSwapData memory swapData; + + (, uint128 debtAmt, bytes memory collateralData) = res.gt.loanInfo(gtId); + uint256 netTokenOut = res.router.flashRepayFromCollV2( + taker, res.market, gtId, debtAmt, byDebtToken, collateralData, units, swapData + ); + + uint256 debtTokenBalanceAfterRepay = res.debtToken.balanceOf(taker); + + assertEq(debtTokenBalanceAfterRepay - debtTokenBalanceBeforeRepay, netTokenOut); + + vm.stopPrank(); + } + + function _testFlashRepayByFt(GtTestRes memory res, uint256 gtId, address taker, SwapUnit[] memory units) internal { + deal(taker, 1e18); + + vm.startPrank(taker); + res.gt.approve(address(res.router), gtId); + + uint256 debtTokenBalanceBeforeRepay = res.debtToken.balanceOf(taker); + ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); + orders[0] = res.order; + uint128[] memory amtsToBuyFt = new uint128[](1); + + (, uint128 debtAmt, bytes memory collateralData) = res.gt.loanInfo(gtId); + amtsToBuyFt[0] = debtAmt; + bool byDebtToken = false; + + ITermMaxRouterV2.TermMaxSwapData memory swapData; + swapData.tokenIn = address(res.debtToken); + swapData.tokenOut = address(res.ft); + swapData.orders = orders; + swapData.tradingAmts = amtsToBuyFt; + swapData.deadline = block.timestamp + 1 hours; + + uint256 netTokenOut = res.router.flashRepayFromCollV2( + taker, res.market, gtId, debtAmt, byDebtToken, collateralData, units, swapData + ); + + uint256 debtTokenBalanceAfterRepay = res.debtToken.balanceOf(taker); + + assertEq(debtTokenBalanceAfterRepay - debtTokenBalanceBeforeRepay, netTokenOut); + + vm.stopPrank(); + } + + function _testLiquidate(GtTestRes memory res, address liquidator, uint256 gtId) + internal + returns (uint256 collateralAmt) + { + deal(liquidator, 1e18); + vm.startPrank(liquidator); + + (, uint128 debtAmt,) = res.gt.loanInfo(gtId); + + deal(address(res.debtToken), liquidator, debtAmt); + res.debtToken.approve(address(res.gt), debtAmt); + + collateralAmt = res.collateral.balanceOf(liquidator); + + bool byDebtToken = true; + res.gt.liquidate(gtId, debtAmt, byDebtToken); + + collateralAmt = res.collateral.balanceOf(liquidator) - collateralAmt; + + vm.stopPrank(); + } + + function _fastLoan(GtTestRes memory res, address taker, uint256 debtAmt, uint256 collateralAmt) + internal + returns (uint256 gtId) + { + vm.startPrank(taker); + deal(taker, 1e18); + deal(address(res.collateral), taker, collateralAmt); + res.collateral.approve(address(res.gt), collateralAmt); + (gtId,) = res.market.issueFt(taker, uint128(debtAmt), abi.encode(collateralAmt)); + vm.stopPrank(); + } +} diff --git a/test/v2/mainnet-fork/MarketBaseTestV2.t.sol b/test/v2/mainnet-fork/MarketBaseTestV2.t.sol new file mode 100644 index 0000000..e4d21ee --- /dev/null +++ b/test/v2/mainnet-fork/MarketBaseTestV2.t.sol @@ -0,0 +1,250 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "forge-std/Test.sol"; +import {DeployUtils} from "../utils/DeployUtils.sol"; +import {JSONLoader} from "../utils/JSONLoader.sol"; +import {StateChecker} from "../utils/StateChecker.sol"; +import {SwapUtils} from "../utils/SwapUtils.sol"; +import {ForkBaseTestV2} from "./ForkBaseTestV2.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import {TermMaxFactoryV2, ITermMaxFactory} from "contracts/v2/factory/TermMaxFactoryV2.sol"; +import {ITermMaxRouterV2, TermMaxRouterV2} from "contracts/v2/router/TermMaxRouterV2.sol"; +import {TermMaxMarketV2, Constants, SafeCast, MarketEvents} from "contracts/v2/TermMaxMarketV2.sol"; +import {TermMaxOrderV2, OrderConfig} from "contracts/v2/TermMaxOrderV2.sol"; +import {MockERC20} from "contracts/v1/test/MockERC20.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {MockOrderV2} from "contracts/v2/test/MockOrderV2.sol"; +import {MintableERC20V2} from "contracts/v2/tokens/MintableERC20V2.sol"; +import {IMintableERC20} from "contracts/v1/tokens/IMintableERC20.sol"; +import {SwapAdapter} from "contracts/v1/test/testnet/SwapAdapter.sol"; +import {IOracleV2, OracleAggregatorV2} from "contracts/v2/oracle/OracleAggregatorV2.sol"; +import {IOracle} from "contracts/v1/oracle/IOracle.sol"; +import {IOrderManager, OrderManager} from "contracts/v1/vault/OrderManager.sol"; +import {ITermMaxVault, ITermMaxVaultV2, TermMaxVaultV2} from "contracts/v2/vault/TermMaxVaultV2.sol"; +import {VaultFactory, IVaultFactory} from "contracts/v1/factory/VaultFactory.sol"; +import { + MarketConfig, + FeeConfig, + MarketInitialParams, + LoanConfig, + VaultInitialParams +} from "contracts/v1/storage/TermMaxStorage.sol"; +import {ITermMaxRouter, RouterEvents, RouterErrors} from "contracts/v1/router/TermMaxRouter.sol"; +import {MockFlashLoanReceiver} from "contracts/v1/test/MockFlashLoanReceiver.sol"; +import {SwapUnit, ISwapAdapter} from "contracts/v1/router/ISwapAdapter.sol"; +import { + IGearingToken, IGearingTokenV2, GearingTokenWithERC20V2 +} from "contracts/v2/tokens/GearingTokenWithERC20V2.sol"; +import {MintableERC20V2} from "contracts/v2/tokens/MintableERC20V2.sol"; +import {ITermMaxOrder} from "contracts/v1/ITermMaxOrder.sol"; +import {ISwapCallback} from "contracts/v1/ISwapCallback.sol"; +import {UniswapV3AdapterV2} from "contracts/v2/router/swapAdapters/UniswapV3AdapterV2.sol"; +import {PendleSwapV3AdapterV2} from "contracts/v2/router/swapAdapters/PendleSwapV3AdapterV2.sol"; +import {OdosV2AdapterV2} from "contracts/v2/router/swapAdapters/OdosV2AdapterV2.sol"; +import {ERC4626VaultAdapterV2} from "contracts/v2/router/swapAdapters/ERC4626VaultAdapterV2.sol"; +import {KyberswapV2AdapterV2} from "contracts/v2/router/swapAdapters/KyberswapV2AdapterV2.sol"; + +abstract contract MarketBaseTestV2 is ForkBaseTestV2 { + using SafeCast for *; + + struct MarketTestRes { + uint256 blockNumber; + uint256 orderInitialAmount; + MarketInitialParams marketInitialParams; + OrderConfig orderConfig; + TermMaxMarketV2 market; + IMintableERC20 ft; + IMintableERC20 xt; + IGearingToken gt; + IERC20Metadata collateral; + IERC20Metadata debtToken; + IOracleV2 oracle; + MockPriceFeed collateralPriceFeed; + MockPriceFeed debtPriceFeed; + ITermMaxOrder order; + ITermMaxRouterV2 router; + uint256 maxXtReserve; + address maker; + } + + function _initializeMarketTestRes(string memory key) internal returns (MarketTestRes memory) { + MarketTestRes memory res; + res.blockNumber = _readBlockNumber(key); + res.marketInitialParams = _readMarketInitialParams(key); + res.orderConfig = _readOrderConfig(key); + res.maker = vm.randomAddress(); + res.maxXtReserve = type(uint128).max; + + vm.rollFork(res.blockNumber); + + vm.startPrank(res.marketInitialParams.admin); + + res.oracle = deployOracleAggregator(res.marketInitialParams.admin); + res.collateralPriceFeed = deployMockPriceFeed(res.marketInitialParams.admin); + res.debtPriceFeed = deployMockPriceFeed(res.marketInitialParams.admin); + res.oracle.submitPendingOracle( + address(res.marketInitialParams.collateral), + IOracleV2.Oracle(res.collateralPriceFeed, res.collateralPriceFeed, 0, 0, 0) + ); + res.oracle.submitPendingOracle( + address(res.marketInitialParams.debtToken), IOracleV2.Oracle(res.debtPriceFeed, res.debtPriceFeed, 0, 0, 0) + ); + res.oracle.acceptPendingOracle(address(res.marketInitialParams.collateral)); + res.oracle.acceptPendingOracle(address(res.marketInitialParams.debtToken)); + + res.marketInitialParams.marketConfig.maturity += uint64(block.timestamp); + res.marketInitialParams.loanConfig.oracle = IOracle(address(res.oracle)); + + res.market = TermMaxMarketV2( + deployFactory(res.marketInitialParams.admin).createMarket( + keccak256("GearingTokenWithERC20"), res.marketInitialParams, 0 + ) + ); + + (res.ft, res.xt, res.gt,,) = res.market.tokens(); + res.debtToken = res.marketInitialParams.debtToken; + res.collateral = IERC20Metadata(res.marketInitialParams.collateral); + + // set all price as 1 USD = 1e8 tokens + uint8 debtDecimals = res.debtToken.decimals(); + _setPriceFeedInTokenDecimal8( + res.debtPriceFeed, debtDecimals, MockPriceFeed.RoundData(1, 1e8, block.timestamp, block.timestamp, 0) + ); + uint8 collateralDecimals = res.collateral.decimals(); + _setPriceFeedInTokenDecimal8( + res.collateralPriceFeed, + collateralDecimals, + MockPriceFeed.RoundData(1, 1e8, block.timestamp, block.timestamp, 0) + ); + + res.order = + res.market.createOrder(res.maker, res.maxXtReserve, ISwapCallback(address(0)), res.orderConfig.curveCuts); + + res.router = deployRouter(res.marketInitialParams.admin); + + res.orderInitialAmount = vm.parseJsonUint(jsonData, string.concat(key, ".orderInitialAmount")); + deal(address(res.debtToken), res.marketInitialParams.admin, res.orderInitialAmount); + + res.debtToken.approve(address(res.market), res.orderInitialAmount); + res.market.mint(address(res.order), res.orderInitialAmount); + + vm.stopPrank(); + + return res; + } + + function _testMint(MarketTestRes memory res) internal { + address to = vm.randomAddress(); + uint256 amount = 100e8; + deal(address(res.debtToken), to, amount); + deal(to, 1e18); + vm.startPrank(to); + res.debtToken.approve(address(res.market), amount); + res.market.mint(to, amount); + vm.assertEq(res.ft.balanceOf(to), amount); + vm.assertEq(res.xt.balanceOf(to), amount); + vm.stopPrank(); + } + + function _testBurn(MarketTestRes memory res) internal { + address taker = vm.randomAddress(); + uint256 amount = 100e8; + deal(taker, 1e18); + deal(address(res.debtToken), taker, amount); + vm.startPrank(taker); + res.debtToken.approve(address(res.market), amount); + res.market.mint(taker, amount); + + res.market.burn(taker, taker, amount); + vm.assertEq(res.debtToken.balanceOf(taker), amount); + vm.stopPrank(); + } + + function _testRedeem(MarketTestRes memory res) internal { + MarketConfig memory marketConfig = res.market.config(); + vm.prank(res.marketInitialParams.admin); + res.market.updateMarketConfig(marketConfig); + + address bob = vm.randomAddress(); + address alice = vm.randomAddress(); + deal(bob, 1e18); + deal(alice, 1e18); + + uint128 depositAmt = uint128(res.orderInitialAmount); + uint128 debtAmt = uint128(res.orderInitialAmount / 20); + uint256 collateralAmt = uint256(res.orderInitialAmount / 10); + + vm.startPrank(bob); + deal(address(res.debtToken), bob, depositAmt); + res.debtToken.approve(address(res.market), depositAmt); + res.market.mint(bob, depositAmt); + + res.xt.transfer(alice, debtAmt); + vm.stopPrank(); + + vm.startPrank(alice); + + MockFlashLoanReceiver receiver = new MockFlashLoanReceiver(res.market); + deal(address(res.collateral), address(receiver), collateralAmt); + + res.xt.approve(address(receiver), debtAmt); + receiver.leverageByXt(debtAmt, abi.encode(alice, collateralAmt)); + vm.stopPrank(); + + vm.warp(marketConfig.maturity + Constants.LIQUIDATION_WINDOW); + + vm.startPrank(bob); + res.ft.approve(address(res.market), depositAmt); + + uint256 propotion = + depositAmt * Constants.DECIMAL_BASE_SQ / (res.ft.totalSupply() - res.ft.balanceOf(address(res.market))); + uint256 redeemAmt = propotion * res.debtToken.balanceOf(address(res.market)) / Constants.DECIMAL_BASE_SQ; + uint256 redeemedCollateral = propotion * res.collateral.balanceOf(address(res.gt)) / Constants.DECIMAL_BASE_SQ; + + vm.expectEmit(); + emit MarketEvents.Redeem(bob, bob, uint128(propotion), uint128(redeemAmt), abi.encode(redeemedCollateral)); + res.market.redeem(bob, bob, depositAmt); + + assertEq(res.debtToken.balanceOf(bob), redeemAmt); + assertEq(res.collateral.balanceOf(bob), redeemedCollateral); + assertEq(res.ft.balanceOf(bob), 0); + vm.stopPrank(); + } + + function _testIssueFtByGtWhenSwap(MarketTestRes memory res, uint256 collateralAmt, uint128 debtAmt) internal { + address taker = vm.randomAddress(); + deal(taker, 1e18); + + uint128 ftOutAmt = 151e8; + uint128 maxTokenIn = 150e8; + + vm.startPrank(res.maker); + deal(res.maker, 1e18); + deal(address(res.collateral), res.maker, collateralAmt); + res.collateral.approve(address(res.gt), collateralAmt); + (uint256 gtId,) = res.market.issueFt(res.maker, debtAmt, abi.encode(collateralAmt)); + + res.gt.approve(address(res.order), gtId); + OrderConfig memory orderConfig = res.order.orderConfig(); + orderConfig.gtId = gtId; + // make sure ft reserve in order is zero and xt is 150e8 + res.order.updateOrder( + orderConfig, + -(res.ft.balanceOf(address(res.order)).toInt256()), + -(res.xt.balanceOf(address(res.order)) - maxTokenIn).toInt256() + ); + vm.stopPrank(); + + vm.startPrank(taker); + deal(address(res.debtToken), taker, maxTokenIn); + res.debtToken.approve(address(res.order), maxTokenIn); + res.order.swapTokenToExactToken(res.debtToken, res.ft, taker, ftOutAmt, maxTokenIn, block.timestamp + 1 hours); + assertEq(res.ft.balanceOf(taker), ftOutAmt); + (, uint128 debtAmtNow,) = res.gt.loanInfo(gtId); + assertGt(debtAmtNow, debtAmt); + vm.stopPrank(); + } +} diff --git a/test/v2/mainnet-fork/VaultBaseTestV2.t.sol b/test/v2/mainnet-fork/VaultBaseTestV2.t.sol new file mode 100644 index 0000000..c694798 --- /dev/null +++ b/test/v2/mainnet-fork/VaultBaseTestV2.t.sol @@ -0,0 +1,268 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "forge-std/Test.sol"; +import {DeployUtils} from "../utils/DeployUtils.sol"; +import {JSONLoader} from "../utils/JSONLoader.sol"; +import {StateChecker} from "../utils/StateChecker.sol"; +import {SwapUtils} from "../utils/SwapUtils.sol"; +import {ForkBaseTestV2} from "./ForkBaseTestV2.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import {TermMaxFactoryV2, ITermMaxFactory} from "contracts/v2/factory/TermMaxFactoryV2.sol"; +import {ITermMaxRouterV2, TermMaxRouterV2} from "contracts/v2/router/TermMaxRouterV2.sol"; +import {TermMaxMarketV2, Constants, SafeCast, MarketEvents} from "contracts/v2/TermMaxMarketV2.sol"; +import {TermMaxOrderV2, OrderConfig} from "contracts/v2/TermMaxOrderV2.sol"; +import {MockERC20} from "contracts/v1/test/MockERC20.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {MockOrderV2} from "contracts/v2/test/MockOrderV2.sol"; +import {MintableERC20V2} from "contracts/v2/tokens/MintableERC20V2.sol"; +import {IMintableERC20} from "contracts/v1/tokens/IMintableERC20.sol"; +import {SwapAdapter} from "contracts/v1/test/testnet/SwapAdapter.sol"; +import {IOracleV2, OracleAggregatorV2} from "contracts/v2/oracle/OracleAggregatorV2.sol"; +import {IOracle} from "contracts/v1/oracle/IOracle.sol"; +import {IOrderManager, OrderManager} from "contracts/v1/vault/OrderManager.sol"; +import {ITermMaxVault, ITermMaxVaultV2, TermMaxVaultV2} from "contracts/v2/vault/TermMaxVaultV2.sol"; +import {VaultFactory, IVaultFactory} from "contracts/v1/factory/VaultFactory.sol"; +import { + MarketConfig, + FeeConfig, + MarketInitialParams, + LoanConfig, + VaultInitialParams +} from "contracts/v1/storage/TermMaxStorage.sol"; +import {ITermMaxRouter, RouterEvents, RouterErrors} from "contracts/v1/router/TermMaxRouter.sol"; +import {MockFlashLoanReceiver} from "contracts/v1/test/MockFlashLoanReceiver.sol"; +import {SwapUnit, ISwapAdapter} from "contracts/v1/router/ISwapAdapter.sol"; +import { + IGearingToken, IGearingTokenV2, GearingTokenWithERC20V2 +} from "contracts/v2/tokens/GearingTokenWithERC20V2.sol"; +import {MintableERC20V2} from "contracts/v2/tokens/MintableERC20V2.sol"; +import {ITermMaxOrder} from "contracts/v1/ITermMaxOrder.sol"; +import {ISwapCallback} from "contracts/v1/ISwapCallback.sol"; +import {UniswapV3AdapterV2} from "contracts/v2/router/swapAdapters/UniswapV3AdapterV2.sol"; +import {PendleSwapV3AdapterV2} from "contracts/v2/router/swapAdapters/PendleSwapV3AdapterV2.sol"; +import {OdosV2AdapterV2} from "contracts/v2/router/swapAdapters/OdosV2AdapterV2.sol"; +import {ERC4626VaultAdapterV2} from "contracts/v2/router/swapAdapters/ERC4626VaultAdapterV2.sol"; +import {KyberswapV2AdapterV2} from "contracts/v2/router/swapAdapters/KyberswapV2AdapterV2.sol"; +import {OrderManager} from "contracts/v1/vault/OrderManager.sol"; +import {VaultConstants} from "contracts/v1/lib/VaultConstants.sol"; +import {PendingAddress, PendingUint192} from "contracts/v1/lib/PendingLib.sol"; +import {ITermMaxVault} from "contracts/v1/vault/ITermMaxVault.sol"; +import {ITermMaxVaultV2, VaultErrors, VaultEvents, TermMaxVaultV2} from "contracts/v2/vault/TermMaxVaultV2.sol"; + +abstract contract VaultBaseTestV2 is ForkBaseTestV2 { + struct VaultTestRes { + uint256 blockNumber; + uint256 orderInitialAmount; + MarketInitialParams marketInitialParams; + OrderConfig orderConfig; + TermMaxMarketV2 market; + IMintableERC20 ft; + IMintableERC20 xt; + IGearingToken gt; + IERC20Metadata collateral; + IERC20Metadata debtToken; + IOracleV2 oracle; + MockPriceFeed collateralPriceFeed; + MockPriceFeed debtPriceFeed; + ITermMaxOrder order; + ITermMaxVault vault; + VaultInitialParams vaultInitialParams; + uint256 currentTime; + uint256 maxCapacity; + address maker; + } + + function _initializeVaultTestRes(string memory key) internal returns (VaultTestRes memory) { + VaultTestRes memory res; + res.blockNumber = _readBlockNumber(key); + res.orderInitialAmount = vm.parseJsonUint(jsonData, string.concat(key, ".orderInitialAmount")); + res.marketInitialParams = _readMarketInitialParams(key); + res.orderConfig = _readOrderConfig(key); + res.maker = vm.randomAddress(); + + vm.rollFork(res.blockNumber); + res.currentTime = block.timestamp; + + _generateVaultInitialParams(res); + + vm.startPrank(res.marketInitialParams.admin); + + res.oracle = deployOracleAggregator(res.marketInitialParams.admin); + res.collateralPriceFeed = deployMockPriceFeed(res.marketInitialParams.admin); + res.debtPriceFeed = deployMockPriceFeed(res.marketInitialParams.admin); + res.oracle.submitPendingOracle( + address(res.marketInitialParams.collateral), + IOracleV2.Oracle(res.collateralPriceFeed, res.collateralPriceFeed, 365 days, 365 days, 0) + ); + res.oracle.submitPendingOracle( + address(res.marketInitialParams.debtToken), + IOracleV2.Oracle(res.debtPriceFeed, res.debtPriceFeed, 365 days, 365 days, 0) + ); + res.oracle.acceptPendingOracle(address(res.marketInitialParams.collateral)); + res.oracle.acceptPendingOracle(address(res.marketInitialParams.debtToken)); + + res.marketInitialParams.marketConfig.maturity += uint64(block.timestamp); + res.marketInitialParams.loanConfig.oracle = IOracle(address(res.oracle)); + + res.market = TermMaxMarketV2( + deployFactoryWithMockOrder(res.marketInitialParams.admin).createMarket( + keccak256("GearingTokenWithERC20"), res.marketInitialParams, 0 + ) + ); + + (res.ft, res.xt, res.gt,,) = res.market.tokens(); + res.debtToken = res.marketInitialParams.debtToken; + res.collateral = IERC20Metadata(res.marketInitialParams.collateral); + + // set all price as 1 USD = 1e8 tokens + uint8 debtDecimals = res.debtToken.decimals(); + _setPriceFeedInTokenDecimal8( + res.debtPriceFeed, debtDecimals, MockPriceFeed.RoundData(1, 1e8, block.timestamp, block.timestamp, 0) + ); + uint8 collateralDecimals = res.collateral.decimals(); + _setPriceFeedInTokenDecimal8( + res.collateralPriceFeed, + collateralDecimals, + MockPriceFeed.RoundData(1, 1e8, block.timestamp, block.timestamp, 0) + ); + + res.vault = ITermMaxVault(deployVaultFactory().createVault(res.vaultInitialParams, 0)); + + res.vault.submitMarket(address(res.market), true); + vm.warp(res.currentTime + res.vaultInitialParams.timelock + 1); + res.vault.acceptMarket(address(res.market)); + + vm.warp(res.currentTime); + + res.orderInitialAmount = vm.parseJsonUint(jsonData, string.concat(key, ".orderInitialAmount")); + deal(address(res.debtToken), res.marketInitialParams.admin, res.orderInitialAmount); + + res.debtToken.approve(address(res.vault), res.orderInitialAmount); + res.vault.deposit(res.orderInitialAmount, res.marketInitialParams.admin); + + res.order = res.vault.createOrder( + res.market, res.vaultInitialParams.maxCapacity, res.orderInitialAmount, res.orderConfig.curveCuts + ); + + vm.stopPrank(); + + return res; + } + + function _generateVaultInitialParams(VaultTestRes memory res) internal { + res.vaultInitialParams.admin = res.marketInitialParams.admin; + res.vaultInitialParams.curator = vm.randomAddress(); + res.vaultInitialParams.timelock = 1 days; + res.vaultInitialParams.asset = res.marketInitialParams.debtToken; + res.vaultInitialParams.maxCapacity = type(uint128).max; + res.vaultInitialParams.name = string.concat("Vault-", res.marketInitialParams.tokenName); + res.vaultInitialParams.symbol = res.vaultInitialParams.name; + res.vaultInitialParams.performanceFeeRate = 0.1e8; + } + + function _testDeposit(VaultTestRes memory res) internal { + _buyXt(res, 48.219178e8, uint128(res.orderInitialAmount / 100)); + vm.warp(res.currentTime + 2 days); + address lper2 = vm.randomAddress(); + uint256 amount2 = 20000e8; + deal(lper2, 1e18); + deal(address(res.debtToken), lper2, amount2); + vm.startPrank(lper2); + res.debtToken.approve(address(res.vault), amount2); + uint256 share = res.vault.previewDeposit(amount2); + res.vault.deposit(amount2, lper2); + assertEq(res.vault.balanceOf(lper2), share); + + vm.stopPrank(); + } + + function _testRedeem(VaultTestRes memory res) internal { + vm.warp(res.currentTime + 2 days); + _buyXt(res, 48.219178e8, uint128(res.orderInitialAmount / 100)); + vm.warp(res.currentTime + 4 days); + address lper2 = vm.randomAddress(); + uint256 amount2 = 10000e8; + deal(lper2, 1e18); + deal(address(res.debtToken), lper2, amount2); + vm.startPrank(lper2); + res.debtToken.approve(address(res.vault), amount2); + res.vault.deposit(amount2, lper2); + vm.stopPrank(); + + address admin = res.marketInitialParams.admin; + vm.startPrank(admin); + uint256 share = res.vault.balanceOf(admin); + uint256 redeem = res.vault.previewRedeem(share); + assertEq(redeem, res.vault.redeem(share, admin, admin)); + assertGt(redeem, amount2); + vm.stopPrank(); + } + + function _testBadDebt(VaultTestRes memory res) internal { + vm.warp(res.currentTime + 2 days); + _buyXt(res, 48.219178e8, uint128(res.orderInitialAmount / 100)); + + vm.warp(res.currentTime + 3 days); + address lper2 = vm.randomAddress(); + deal(lper2, 1e18); + uint256 amount2 = 100e8; + deal(address(res.debtToken), lper2, amount2); + vm.startPrank(lper2); + res.debtToken.approve(address(res.vault), amount2); + res.vault.deposit(amount2, lper2); + vm.stopPrank(); + + address borrower = vm.randomAddress(); + vm.startPrank(borrower); + deal(borrower, 1e18); + uint256 collateralAmt = 100000e18; + deal(address(res.collateral), borrower, collateralAmt); + res.collateral.approve(address(res.gt), collateralAmt); + res.market.issueFt(borrower, uint128(res.orderInitialAmount / 10), abi.encode(collateralAmt)); + vm.stopPrank(); + + vm.warp(res.currentTime + 92 days); + + uint256 propotion = (res.ft.balanceOf(address(res.order)) * Constants.DECIMAL_BASE_SQ) + / (res.ft.totalSupply() - res.ft.balanceOf(address(res.market))); + + uint256 tokenOut = (res.debtToken.balanceOf(address(res.market)) * propotion) / Constants.DECIMAL_BASE_SQ; + uint256 badDebt = res.ft.balanceOf(address(res.order)) - tokenOut; + uint256 delivered = (propotion * collateralAmt) / Constants.DECIMAL_BASE_SQ; + + vm.startPrank(lper2); + res.vault.redeem(10e8, lper2, lper2); + vm.stopPrank(); + + assertEq(res.vault.badDebtMapping(address(res.collateral)), badDebt); + assertEq(res.collateral.balanceOf(address(res.vault)), delivered); + + uint256 shareToDealBadDebt = res.vault.balanceOf(lper2); + uint256 withdrawAmt = res.vault.previewRedeem(shareToDealBadDebt); + if (withdrawAmt > badDebt) { + withdrawAmt = badDebt; + } + + vm.startPrank(lper2); + (uint256 shares, uint256 collateralOut) = + res.vault.dealBadDebt(address(res.collateral), withdrawAmt, lper2, lper2); + assertEq(shares, shareToDealBadDebt); + assertEq(collateralOut, (withdrawAmt * delivered) / badDebt); + assertEq(res.vault.badDebtMapping(address(res.collateral)), badDebt - withdrawAmt); + assertEq(res.collateral.balanceOf(address(res.vault)), delivered - collateralOut); + vm.stopPrank(); + } + + function _buyXt(VaultTestRes memory res, uint128 tokenAmtIn, uint128 xtAmtOut) internal { + address taker = vm.randomAddress(); + deal(taker, 1e18); + deal(address(res.debtToken), taker, tokenAmtIn); + vm.startPrank(taker); + res.debtToken.approve(address(res.order), tokenAmtIn); + res.order.swapExactTokenToToken(res.debtToken, res.xt, taker, tokenAmtIn, xtAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } +} diff --git a/test/v2/mainnet-fork/mainnet/ForkGtV2.t.sol b/test/v2/mainnet-fork/mainnet/ForkGtV2.t.sol new file mode 100644 index 0000000..5cb8564 --- /dev/null +++ b/test/v2/mainnet-fork/mainnet/ForkGtV2.t.sol @@ -0,0 +1,154 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "../GtBaseTestV2.t.sol"; + +contract ForkGtV2 is GtBaseTestV2 { + string MAINNET_RPC_URL = vm.envString("MAINNET_RPC_URL"); + string DATA_PATH = string.concat(vm.projectRoot(), "/test/testdata/fork/mainnet.json"); + + function _getForkRpcUrl() internal view override returns (string memory) { + return MAINNET_RPC_URL; + } + + function _getDataPath() internal view override returns (string memory) { + return DATA_PATH; + } + + function _finishSetup() internal override {} + + function testBorrow() public { + for (uint256 i = 0; i < tokenPairs.length; i++) { + string memory tokenPair = tokenPairs[i]; + GtTestRes memory res = _initializeGtTestRes(tokenPair); + uint256 collateralAmt = res.orderInitialAmount / 10; + uint128 borrowAmt = uint128(res.orderInitialAmount / 30); + uint128 maxDebtAmt = uint128(res.orderInitialAmount / 20); + _testBorrow(res, collateralAmt, borrowAmt, maxDebtAmt); + } + } + + function testLeverageFromXt() public { + for (uint256 i = 0; i < tokenPairs.length; i++) { + string memory tokenPair = tokenPairs[i]; + GtTestRes memory res = _initializeGtTestRes(tokenPair); + if (res.swapData.tokenType == TokenType.General) { + res.swapData.leverageUnits[0].adapter = res.swapAdapters.odosAdapter; + } else if (res.swapData.tokenType == TokenType.Pendle) { + if (res.swapData.leverageUnits.length == 1) { + res.swapData.leverageUnits[0].adapter = res.swapAdapters.pendleAdapter; + } else { + res.swapData.leverageUnits[1].adapter = res.swapAdapters.pendleAdapter; + res.swapData.leverageUnits[0].adapter = res.swapAdapters.odosAdapter; + } + } else if (res.swapData.tokenType == TokenType.Morpho) { + if (res.swapData.leverageUnits.length == 1) { + res.swapData.leverageUnits[0].adapter = res.swapAdapters.vaultAdapter; + } else { + res.swapData.leverageUnits[1].adapter = res.swapAdapters.vaultAdapter; + res.swapData.leverageUnits[0].adapter = res.swapAdapters.odosAdapter; + } + } + + address taker = vm.randomAddress(); + + _testLeverageFromXt(res, taker, res.swapData.debtAmt, res.swapData.swapAmtIn, res.swapData.leverageUnits); + } + } + + function testFlashRepay() public { + for (uint256 i = 0; i < tokenPairs.length; i++) { + string memory tokenPair = tokenPairs[i]; + GtTestRes memory res = _initializeGtTestRes(tokenPair); + if (res.swapData.tokenType == TokenType.General) { + res.swapData.leverageUnits[0].adapter = res.swapAdapters.odosAdapter; + res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.odosAdapter; + } else if (res.swapData.tokenType == TokenType.Pendle) { + if (res.swapData.leverageUnits.length == 1) { + res.swapData.leverageUnits[0].adapter = res.swapAdapters.pendleAdapter; + res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.pendleAdapter; + } else { + res.swapData.leverageUnits[1].adapter = res.swapAdapters.pendleAdapter; + res.swapData.leverageUnits[0].adapter = res.swapAdapters.odosAdapter; + + res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.pendleAdapter; + res.swapData.flashRepayUnits[1].adapter = res.swapAdapters.odosAdapter; + } + } else if (res.swapData.tokenType == TokenType.Morpho) { + if (res.swapData.leverageUnits.length == 1) { + res.swapData.leverageUnits[0].adapter = res.swapAdapters.vaultAdapter; + res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.vaultAdapter; + } else { + res.swapData.leverageUnits[1].adapter = res.swapAdapters.vaultAdapter; + res.swapData.leverageUnits[0].adapter = res.swapAdapters.odosAdapter; + + res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.vaultAdapter; + res.swapData.flashRepayUnits[1].adapter = res.swapAdapters.odosAdapter; + } + } + + address taker = vm.randomAddress(); + uint256 gtId = _testLeverageFromXt( + res, taker, res.swapData.debtAmt, res.swapData.swapAmtIn, res.swapData.leverageUnits + ); + _testFlashRepay(res, gtId, taker, res.swapData.flashRepayUnits); + } + } + + function testFlashRepayByFt() public { + for (uint256 i = 0; i < tokenPairs.length; i++) { + string memory tokenPair = tokenPairs[i]; + GtTestRes memory res = _initializeGtTestRes(tokenPair); + if (res.swapData.tokenType == TokenType.General) { + res.swapData.leverageUnits[0].adapter = res.swapAdapters.odosAdapter; + res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.odosAdapter; + } else if (res.swapData.tokenType == TokenType.Pendle) { + if (res.swapData.leverageUnits.length == 1) { + res.swapData.leverageUnits[0].adapter = res.swapAdapters.pendleAdapter; + res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.pendleAdapter; + } else { + res.swapData.leverageUnits[1].adapter = res.swapAdapters.pendleAdapter; + res.swapData.leverageUnits[0].adapter = res.swapAdapters.odosAdapter; + + res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.pendleAdapter; + res.swapData.flashRepayUnits[1].adapter = res.swapAdapters.odosAdapter; + } + } else if (res.swapData.tokenType == TokenType.Morpho) { + if (res.swapData.leverageUnits.length == 1) { + res.swapData.leverageUnits[0].adapter = res.swapAdapters.vaultAdapter; + res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.vaultAdapter; + } else { + res.swapData.leverageUnits[1].adapter = res.swapAdapters.vaultAdapter; + res.swapData.leverageUnits[0].adapter = res.swapAdapters.odosAdapter; + + res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.vaultAdapter; + res.swapData.flashRepayUnits[1].adapter = res.swapAdapters.odosAdapter; + } + } + + address taker = vm.randomAddress(); + uint256 gtId = _testLeverageFromXt( + res, taker, res.swapData.debtAmt, res.swapData.swapAmtIn, res.swapData.leverageUnits + ); + _testFlashRepayByFt(res, gtId, taker, res.swapData.flashRepayUnits); + } + } + + function testLiquidate() public { + for (uint256 i = 0; i < tokenPairs.length; i++) { + string memory tokenPair = tokenPairs[i]; + GtTestRes memory res = _initializeGtTestRes(tokenPair); + + address liquidator = vm.randomAddress(); + address borrower = vm.randomAddress(); + + uint256 collateralAmt = res.orderInitialAmount / 10; + uint128 borrowAmt = uint128(res.orderInitialAmount / 20); + + uint256 gtId = _fastLoan(res, borrower, borrowAmt, collateralAmt); + _updateCollateralPrice(res, 0.5e8); + + _testLiquidate(res, liquidator, gtId); + } + } +} diff --git a/test/v2/mainnet-fork/mainnet/ForkMarketV2.t.sol b/test/v2/mainnet-fork/mainnet/ForkMarketV2.t.sol new file mode 100644 index 0000000..1240ad3 --- /dev/null +++ b/test/v2/mainnet-fork/mainnet/ForkMarketV2.t.sol @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "../MarketBaseTestV2.t.sol"; + +contract ForkMarketV2 is MarketBaseTestV2 { + string MAINNET_RPC_URL = vm.envString("MAINNET_RPC_URL"); + string DATA_PATH = string.concat(vm.projectRoot(), "/test/testdata/fork/mainnet.json"); + + function _getForkRpcUrl() internal view override returns (string memory) { + return MAINNET_RPC_URL; + } + + function _getDataPath() internal view override returns (string memory) { + return DATA_PATH; + } + + function _finishSetup() internal override {} + + function testMint() public { + for (uint256 i = 0; i < tokenPairs.length; i++) { + string memory tokenPair = tokenPairs[i]; + MarketTestRes memory res = _initializeMarketTestRes(tokenPair); + _testMint(res); + } + } + + function testRedeem() public { + for (uint256 i = 0; i < tokenPairs.length; i++) { + string memory tokenPair = tokenPairs[i]; + MarketTestRes memory res = _initializeMarketTestRes(tokenPair); + _testRedeem(res); + } + } + + function testIssueFtByGtWhenSwap() public { + for (uint256 i = 0; i < tokenPairs.length; i++) { + string memory tokenPair = tokenPairs[i]; + MarketTestRes memory res = _initializeMarketTestRes(tokenPair); + uint256 collateralAmt = res.orderInitialAmount / 10; + uint128 debtAmt = uint128(res.orderInitialAmount / 100); + _testIssueFtByGtWhenSwap(res, collateralAmt, debtAmt); + } + } +} diff --git a/test/v2/mainnet-fork/mainnet/ForkPriceFeedV2.t.sol b/test/v2/mainnet-fork/mainnet/ForkPriceFeedV2.t.sol new file mode 100644 index 0000000..0a9596b --- /dev/null +++ b/test/v2/mainnet-fork/mainnet/ForkPriceFeedV2.t.sol @@ -0,0 +1,134 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; +import {TermMaxPriceFeedFactoryV2} from "contracts/v2/factory/TermMaxPriceFeedFactoryV2.sol"; +import "../ForkBaseTestV2.sol"; + +contract ForkPriceFeedV2 is ForkBaseTestV2 { + string MAINNET_RPC_URL = vm.envString("MAINNET_RPC_URL"); + string DATA_PATH = string.concat(vm.projectRoot(), "/test/testdata/fork/mainnet.json"); + + function _getForkRpcUrl() internal view override returns (string memory) { + return MAINNET_RPC_URL; + } + + function _getDataPath() internal view override returns (string memory) { + return DATA_PATH; + } + + function _finishSetup() internal override {} + + function testPriceFeed() public { + TermMaxPriceFeedFactoryV2 priceFeedFactory = new TermMaxPriceFeedFactoryV2(); + address pendlePYLpOracle = 0x9a9Fa8338dd5E5B2188006f1Cd2Ef26d921650C2; + address pufferEthOracle; + { + address pufferEthToEth = 0x76A495b0bFfb53ef3F0E94ef0763e03cE410835C; + address ethToUsd = 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419; + address pufEth = 0xD9A442856C234a39a81a089C06451EBAa4306a72; + AggregatorV3Interface pufferEthFeed = + AggregatorV3Interface(priceFeedFactory.createPriceFeedConverter(pufferEthToEth, ethToUsd, pufEth)); + (, int256 answer,,,) = pufferEthFeed.latestRoundData(); + console.log("pufferEth price feed description", pufferEthFeed.description()); + console.log("pufferEth price feed address", address(pufferEthFeed)); + console.log("pufferEth last answer", answer); + pufferEthOracle = address(pufferEthFeed); + } + + { + address pt_market = 0xB162B764044697cf03617C2EFbcB1f42e31E4766; + address susdeToUsd = 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099; + + AggregatorV3Interface ptFeed = AggregatorV3Interface( + priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, pt_market, 900, susdeToUsd) + ); + (, int256 answer,,,) = ptFeed.latestRoundData(); + console.log("pt_sUsde_29MAY2025 price feed description", ptFeed.description()); + console.log("pt_sUsde_29MAY2025 price feed address", address(ptFeed)); + console.log("pt_sUsde_29MAY2025 last answer", answer); + } + + { + address USUALUSDCPlusVault = 0xd63070114470f685b75B74D60EEc7c1113d33a3D; + address usdcToUsd = 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6; + AggregatorV3Interface usdcPlusFeed = + AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usdcToUsd, USUALUSDCPlusVault)); + (, int256 answer,,,) = usdcPlusFeed.latestRoundData(); + console.log("USUALUSDC+ price feed description", usdcPlusFeed.description()); + console.log("USUALUSDC+ price feed address", address(usdcPlusFeed)); + console.log("USUALUSDC+ last answer", answer); + } + + { + address MCwETHVault = 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8; + address wethToUsd = 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419; + AggregatorV3Interface wethFeed = + AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(wethToUsd, MCwETHVault)); + (, int256 answer,,,) = wethFeed.latestRoundData(); + console.log("MCwETH price feed description", wethFeed.description()); + console.log("MCwETH price feed address", address(wethFeed)); + console.log("MCwETH last answer", answer); + } + + { + address PT_pufETH_26JUN2025_market = 0x58612beB0e8a126735b19BB222cbC7fC2C162D2a; + AggregatorV3Interface ptFeed = AggregatorV3Interface( + priceFeedFactory.createPTWithPriceFeed( + pendlePYLpOracle, PT_pufETH_26JUN2025_market, 900, pufferEthOracle + ) + ); + (, int256 answer,,,) = ptFeed.latestRoundData(); + console.log("pt_pufETH_26JUN2025 price feed description", ptFeed.description()); + console.log("pt_pufETH_26JUN2025 price feed address", address(ptFeed)); + console.log("pt_pufETH_26JUN2025 last answer", answer); + } + + { + address eUSDeVault = 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F; + address usdeToUsd = 0xa569d910839Ae8865Da8F8e70FfFb0cBA869F961; + AggregatorV3Interface usdeFeed = + AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usdeToUsd, eUSDeVault)); + (, int256 answer,,,) = usdeFeed.latestRoundData(); + console.log("eUSDe price feed description", usdeFeed.description()); + console.log("eUSDe price feed address", address(usdeFeed)); + console.log("eUSDe last answer", answer); + } + + { + address PT_USD0PlusPlus_26JUN2025_market = 0x048680F64d6DFf1748ba6D9a01F578433787e24B; + address usd0PlusPlusToUsd = 0xFC9e30Cf89f8A00dba3D34edf8b65BCDAdeCC1cB; + AggregatorV3Interface usd0PlusPlusFeed = AggregatorV3Interface( + priceFeedFactory.createPTWithPriceFeed( + pendlePYLpOracle, PT_USD0PlusPlus_26JUN2025_market, 900, usd0PlusPlusToUsd + ) + ); + (, int256 answer,,,) = usd0PlusPlusFeed.latestRoundData(); + console.log("PT_USD0PlusPlus_26JUN2025_market price feed description", usd0PlusPlusFeed.description()); + console.log("PT_USD0PlusPlus_26JUN2025_market price feed address", address(usd0PlusPlusFeed)); + console.log("PT_USD0PlusPlus_26JUN2025_market last answer", answer); + } + + { + address upUSDCVault = 0x80E1048eDE66ec4c364b4F22C8768fc657FF6A42; + address usdcToUsd = 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6; + AggregatorV3Interface usdcFeed = + AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usdcToUsd, upUSDCVault)); + (, int256 answer,,,) = usdcFeed.latestRoundData(); + console.log("upUSDC price feed description", usdcFeed.description()); + console.log("upUSDC price feed address", address(usdcFeed)); + console.log("upUSDC last answer", answer); + } + + { + address usualxVault = 0x06B964d96f5dCF7Eae9d7C559B09EDCe244d4B8E; + address usualToUsd = 0x2240AE461B34CC56D654ba5FA5830A243Ca54840; + AggregatorV3Interface usualFeed = + AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usualToUsd, usualxVault)); + (, int256 answer,,,) = usualFeed.latestRoundData(); + console.log("usualx price feed description", usualFeed.description()); + console.log("usualx price feed address", address(usualFeed)); + console.log("usualx last answer", answer); + } + } +} diff --git a/test/v2/mainnet-fork/mainnet/ForkVaultV2.t.sol b/test/v2/mainnet-fork/mainnet/ForkVaultV2.t.sol new file mode 100644 index 0000000..6aa6f1f --- /dev/null +++ b/test/v2/mainnet-fork/mainnet/ForkVaultV2.t.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "../VaultBaseTestV2.t.sol"; + +contract ForkVaultV2 is VaultBaseTestV2 { + string MAINNET_RPC_URL = vm.envString("MAINNET_RPC_URL"); + string DATA_PATH = string.concat(vm.projectRoot(), "/test/testdata/fork/mainnet.json"); + + function _getForkRpcUrl() internal view override returns (string memory) { + return MAINNET_RPC_URL; + } + + function _getDataPath() internal view override returns (string memory) { + return DATA_PATH; + } + + function _finishSetup() internal override {} + + function testDeposit() public { + for (uint256 i = 0; i < tokenPairs.length; i++) { + string memory tokenPair = tokenPairs[i]; + VaultTestRes memory res = _initializeVaultTestRes(tokenPair); + _testDeposit(res); + } + } + + function testRedeem() public { + for (uint256 i = 0; i < tokenPairs.length; i++) { + string memory tokenPair = tokenPairs[i]; + VaultTestRes memory res = _initializeVaultTestRes(tokenPair); + _testRedeem(res); + } + } + + function testBadDebt() public { + for (uint256 i = 0; i < tokenPairs.length; i++) { + string memory tokenPair = tokenPairs[i]; + VaultTestRes memory res = _initializeVaultTestRes(tokenPair); + _testBadDebt(res); + } + } +} From 0f3977a8d53ed6e57a90f7e9325ef8c4f080c243 Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 3 Jun 2025 12:00:25 +0800 Subject: [PATCH 055/194] Integration test --- test/v2/integration/ForkPrdFlashRepay.t.sol | 256 ++++++++++ test/v2/integration/ForkPrdRollOver.t.sol | 497 ++++++++++++++++++++ 2 files changed, 753 insertions(+) create mode 100644 test/v2/integration/ForkPrdFlashRepay.t.sol create mode 100644 test/v2/integration/ForkPrdRollOver.t.sol diff --git a/test/v2/integration/ForkPrdFlashRepay.t.sol b/test/v2/integration/ForkPrdFlashRepay.t.sol new file mode 100644 index 0000000..7d6d1d8 --- /dev/null +++ b/test/v2/integration/ForkPrdFlashRepay.t.sol @@ -0,0 +1,256 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; +import {ITermMaxMarket} from "contracts/ITermMaxMarket.sol"; +import {ITermMaxOrder} from "contracts/ITermMaxOrder.sol"; +import {SwapUnit, ITermMaxRouter, TermMaxRouter} from "contracts/router/TermMaxRouter.sol"; +import { + IGearingToken, + GearingTokenEvents, + AbstractGearingToken, + GtConfig +} from "contracts/tokens/AbstractGearingToken.sol"; +import {PendleSwapV3Adapter} from "contracts/router/swapAdapters/PendleSwapV3Adapter.sol"; +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; +import {IOracle} from "contracts/oracle/IOracleV1.sol"; +import { + ForkBaseTest, + TermMaxFactory, + MarketConfig, + IERC20, + MarketInitialParams, + IERC20Metadata +} from "test/mainnet-fork/ForkBaseTest.sol"; +import {console} from "forge-std/console.sol"; + +interface TestOracle is IOracle { + function acceptPendingOracle(address asset) external; + function oracles(address asset) external returns (address aggregator, address backupAggregator, uint32 heartbeat); +} + +contract ForkPrdFlashRepay is ForkBaseTest { + string MAINNET_RPC_URL = vm.envString("MAINNET_RPC_URL"); + string DATA_PATH = string.concat(vm.projectRoot(), "/test/testdata/fork/mainnet.json"); + + uint64 may_30 = 1748534400; // 2025-05-30 00:00:00 + uint64 aug_1 = 1753977600; // 2025-08-01 00:00:00 + address pt_susde_may_29 = 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308; + address pt_susde_jun_31 = 0x3b3fB9C57858EF816833dC91565EFcd85D96f634; + address usdc = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; + address usde = 0x4c9EDD5852cd905f086C759E8383e09bff1E68B3; + address susde = 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497; + TestOracle oracle = TestOracle(0xE3a31690392E8E18DC3d862651C079339E2c1ADE); + + ITermMaxMarket mmay_30 = ITermMaxMarket(0xe867255dC0c3a27c90f756ECC566a5292ce19492); + ITermMaxMarket maug_1 = ITermMaxMarket(0xdBB2D44c238c459cCB820De886ABF721EF6E6941); + ITermMaxOrder o_may_30 = ITermMaxOrder(0xe99ee5b18cB57276EbEADf0E773E4f8Ab49Db9B7); + ITermMaxOrder o_aug_1 = ITermMaxOrder(0x71Df74d65c3895C8FA5a1c8E8d93A7eE30A1aFc7); + address pendleAdapter; + address odosAdapter = 0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779; + TermMaxRouter router; + + function _getForkRpcUrl() internal view override returns (string memory) { + return MAINNET_RPC_URL; + } + + function _getDataPath() internal view override returns (string memory) { + return DATA_PATH; + } + + function _finishSetup() internal override { + vm.rollFork(22486319); // 2025-05-15 + + address accessManager = Ownable(address(oracle)).owner(); + vm.startPrank(accessManager); + address[] memory tokens = new address[](4); + tokens[0] = usdc; + tokens[1] = susde; + tokens[2] = pt_susde_may_29; + tokens[3] = pt_susde_jun_31; + + for (uint256 i = 0; i < tokens.length; i++) { + address token = tokens[i]; + (address aggregator, address backupAggregator,) = oracle.oracles(token); + IOracle.Oracle memory oracleData = IOracle.Oracle({ + aggregator: AggregatorV3Interface(aggregator), + backupAggregator: AggregatorV3Interface(backupAggregator), + heartbeat: 365 days + }); + oracle.submitPendingOracle(token, oracleData); + } + vm.warp(block.timestamp + 1 days); + for (uint256 i = 0; i < tokens.length; i++) { + address token = tokens[i]; + oracle.acceptPendingOracle(token); + } + + vm.stopPrank(); + + PendleSwapV3Adapter adapter = new PendleSwapV3Adapter(0x888888888889758F76e7103c6CbF23ABbF58F946); + pendleAdapter = address(adapter); + + vm.label(pt_susde_may_29, "pt_susde_may_29"); + vm.label(pt_susde_jun_31, "pt_susde_jun_31"); + vm.label(susde, "susde"); + vm.label(address(oracle), "oracle"); + vm.label(address(mmay_30), "mmay_30"); + vm.label(address(maug_1), "maug_1"); + vm.label(address(o_may_30), "o_may_30"); + vm.label(address(o_aug_1), "o_aug_1"); + vm.label(address(pendleAdapter), "pendleAdapter"); + + address admin = vm.randomAddress(); + + vm.startPrank(admin); + router = deployRouter(admin); + router.setAdapterWhitelist(pendleAdapter, true); + router.setAdapterWhitelist(odosAdapter, true); + vm.stopPrank(); + } + + function testFlashRepayPtV2() public { + vm.roll(22494579); // 2025-05-15 + address borrower = vm.randomAddress(); + vm.label(borrower, "borrower"); + address admin = vm.randomAddress(); + vm.label(admin, "admin"); + + vm.startPrank(admin); + ITermMaxMarket market; + uint256 gtId1; + uint128 oldDebt = 1000e6; + uint256 oldCollateral = 35012712455278300958037; + + deal(pt_susde_may_29, admin, oldCollateral); + + // create new market support v2 flash repay + { + TermMaxFactory f2 = deployFactory(admin); + MarketConfig memory marketConfig = mmay_30.config(); + (,, IGearingToken gt, address collateral, IERC20 debtToken) = mmay_30.tokens(); + GtConfig memory gtConfig = gt.getGtConfig(); + MarketInitialParams memory params = MarketInitialParams({ + collateral: collateral, + debtToken: IERC20Metadata(address(debtToken)), + admin: admin, + gtImplementation: address(0), + marketConfig: marketConfig, + loanConfig: gtConfig.loanConfig, + gtInitalParams: abi.encode(type(uint128).max), + tokenName: "Test", + tokenSymbol: "TEST" + }); + market = ITermMaxMarket(f2.createMarket(keccak256("GearingTokenWithERC20"), params, 1)); + vm.label(address(market), "newMarket"); + + (,, IGearingToken gt2,,) = market.tokens(); + + IERC20(pt_susde_may_29).approve(address(gt2), oldCollateral); + (gtId1,) = market.issueFt(borrower, oldDebt, abi.encode(oldCollateral)); + + vm.label(address(market), "market_may_30"); + vm.label(address(gt2), "gt_may_30"); + } + + vm.stopPrank(); + vm.startPrank(borrower); + vm.warp(may_30 - 0.5 days); + uint128 repayAmount = 300e6; + uint256 removedCollateral = 25012712455278300958037; + // roll gt + { + ITermMaxOrder[] memory orders = new ITermMaxOrder[](0); + uint128[] memory amounts = new uint128[](0); + SwapUnit[] memory swapUnits = new SwapUnit[](2); + address pm1 = 0xB162B764044697cf03617C2EFbcB1f42e31E4766; + swapUnits[0] = SwapUnit({ + adapter: pendleAdapter, + tokenIn: pt_susde_may_29, + tokenOut: susde, + swapData: abi.encode(pm1, removedCollateral, 0) + }); + swapUnits[1] = SwapUnit({ + adapter: 0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779, + tokenIn: susde, + tokenOut: usdc, + swapData: hex"0000000000000000000000009d39a5de30e57443bff2a8307a4256c8797a349700000000000000000000000000000000000000000000048103daed12389fbcc800000000000000000000000076edf8c155a1e0d9b2ad11b04d9671cbc25fee99000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000005d443b21d00000000000000000000000000000000000000000000000000000005b66b4d45000000000000000000000000c47591f5c023e44931c78d5a993834875b79fb11000000000000000000000000000000000000000000000000000000000000014000000000000000000000000076edf8c155a1e0d9b2ad11b04d9671cbc25fee9900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084010206000d0100010201022700000304000d0101050400ff00000000000000007eb59373d63627be64b42406b108b602174b4ccc9d39a5de30e57443bff2a8307a4256c8797a3497dac17f958d2ee523a2206206994597c13d831ec7c02aaa39b223fe8d0a0e5c4f27ead9083c756cc288e6a0c2ddd26feeb64f039a2c41296fcb3f564000000000000000000000000000000000000000000000000000000000" + }); + (IERC20 ft,, IGearingToken gt, address collateral,) = market.tokens(); + console.log("usdc balance before:", IERC20(usdc).balanceOf(borrower)); + gt.approve(address(router), gtId1); + ITermMaxRouter.TermMaxSwapData memory swapData; + router.flashRepayFromCollV2( + borrower, market, gtId1, repayAmount, true, abi.encode(removedCollateral), swapUnits, swapData + ); + console.log("usdc balance after:", IERC20(usdc).balanceOf(borrower)); + + (address owner, uint128 currentDebt, bytes memory currentCollateral) = gt.loanInfo(gtId1); + assertEq(owner, borrower, "borrower should be the same"); + assertEq(currentDebt, oldDebt - repayAmount, "debt should be the same"); + assertEq( + abi.decode(currentCollateral, (uint256)), + oldCollateral - removedCollateral, + "collateral should be the same" + ); + vm.stopPrank(); + } + + vm.stopPrank(); + } + + function testFlashRepayPt() public { + vm.roll(22494579); // 2025-05-15 + + address borrower; + address admin = vm.randomAddress(); + + vm.startPrank(admin); + TermMaxRouter router = deployRouter(admin); + router.setAdapterWhitelist(pendleAdapter, true); + router.setAdapterWhitelist(0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779, true); + vm.stopPrank(); + + uint128 debt; + uint256 collateralAmount; + // deal(pt_susde_may_29, borrower, collateralAmount); + uint256 gt1 = 5; + + { + (IERC20 ft,, IGearingToken gt, address collateral,) = mmay_30.tokens(); + (address owner, uint128 debtAmt, bytes memory collateralData) = gt.loanInfo(gt1); + borrower = owner; + debt = debtAmt; + collateralAmount = abi.decode(collateralData, (uint256)); + console.log("collateralAmount:", collateralAmount); + console.log("debt:", debt); + + vm.startPrank(borrower); + vm.warp(may_30 - 0.5 days); + + ITermMaxOrder[] memory orders = new ITermMaxOrder[](0); + uint128[] memory amounts = new uint128[](0); + SwapUnit[] memory swapUnits = new SwapUnit[](2); + address pm1 = 0xB162B764044697cf03617C2EFbcB1f42e31E4766; + swapUnits[0] = SwapUnit({ + adapter: pendleAdapter, + tokenIn: pt_susde_may_29, + tokenOut: susde, + swapData: abi.encode(pm1, collateralAmount, 0) + }); + swapUnits[1] = SwapUnit({ + adapter: odosAdapter, + tokenIn: susde, + tokenOut: usdc, + swapData: hex"0000000000000000000000009d39a5de30e57443bff2a8307a4256c8797a349700000000000000000000000000000000000000000000048103daed12389fbcc800000000000000000000000076edf8c155a1e0d9b2ad11b04d9671cbc25fee99000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000005d443b21d00000000000000000000000000000000000000000000000000000005b66b4d45000000000000000000000000c47591f5c023e44931c78d5a993834875b79fb11000000000000000000000000000000000000000000000000000000000000014000000000000000000000000076edf8c155a1e0d9b2ad11b04d9671cbc25fee9900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084010206000d0100010201022700000304000d0101050400ff00000000000000007eb59373d63627be64b42406b108b602174b4ccc9d39a5de30e57443bff2a8307a4256c8797a3497dac17f958d2ee523a2206206994597c13d831ec7c02aaa39b223fe8d0a0e5c4f27ead9083c756cc288e6a0c2ddd26feeb64f039a2c41296fcb3f564000000000000000000000000000000000000000000000000000000000" + }); + + console.log("usdc balance before:", IERC20(usdc).balanceOf(borrower)); + gt.approve(address(router), gt1); + ITermMaxRouter.TermMaxSwapData memory swapData; + router.flashRepayFromColl(borrower, mmay_30, gt1, true, swapUnits, swapData); + console.log("usdc balance after:", IERC20(usdc).balanceOf(borrower)); + vm.stopPrank(); + } + } +} diff --git a/test/v2/integration/ForkPrdRollOver.t.sol b/test/v2/integration/ForkPrdRollOver.t.sol new file mode 100644 index 0000000..49933d7 --- /dev/null +++ b/test/v2/integration/ForkPrdRollOver.t.sol @@ -0,0 +1,497 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; +import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; +import {ITermMaxMarket} from "contracts/v1/ITermMaxMarket.sol"; +import {ITermMaxOrder} from "contracts/v1/ITermMaxOrder.sol"; +import {SwapUnit, ITermMaxRouterV2, TermMaxRouterV2} from "contracts/v2/router/TermMaxRouterV2.sol"; +import { + IGearingToken, + GearingTokenEvents, + AbstractGearingToken, + GtConfig +} from "contracts/v1/tokens/AbstractGearingToken.sol"; +import {PendleSwapV3AdapterV2} from "contracts/v2/router/swapAdapters/PendleSwapV3AdapterV2.sol"; +import {IOracle} from "contracts/oracle/IOracleV1.sol"; +import { + ForkBaseTestV2, + TermMaxFactoryV2, + MarketConfig, + IERC20, + MarketInitialParams, + IERC20Metadata +} from "test/v2/mainnet-fork/ForkBaseTestV2.sol"; +import {console} from "forge-std/console.sol"; + +interface TestOracle is IOracle { + function acceptPendingOracle(address asset) external; + function oracles(address asset) external returns (address aggregator, address backupAggregator, uint32 heartbeat); +} + +contract ForkPrdRollover is ForkBaseTestV2 { + string MAINNET_RPC_URL = vm.envString("MAINNET_RPC_URL"); + string DATA_PATH = string.concat(vm.projectRoot(), "/test/testdata/fork/mainnet.json"); + + uint64 may_30 = 1748534400; // 2025-05-30 00:00:00 + uint64 aug_1 = 1753977600; // 2025-08-01 00:00:00 + address pt_susde_may_29 = 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308; + address pt_susde_jun_31 = 0x3b3fB9C57858EF816833dC91565EFcd85D96f634; + address usdc = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; + address usde = 0x4c9EDD5852cd905f086C759E8383e09bff1E68B3; + address susde = 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497; + TestOracle oracle = TestOracle(0xE3a31690392E8E18DC3d862651C079339E2c1ADE); + + ITermMaxMarket mmay_30 = ITermMaxMarket(0xe867255dC0c3a27c90f756ECC566a5292ce19492); + ITermMaxMarket maug_1 = ITermMaxMarket(0xdBB2D44c238c459cCB820De886ABF721EF6E6941); + ITermMaxOrder o_may_30 = ITermMaxOrder(0xe99ee5b18cB57276EbEADf0E773E4f8Ab49Db9B7); + ITermMaxOrder o_aug_1 = ITermMaxOrder(0x71Df74d65c3895C8FA5a1c8E8d93A7eE30A1aFc7); + address pendleAdapter; + address odosAdapter = 0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779; + TermMaxRouterV2 router; + + function _getForkRpcUrl() internal view override returns (string memory) { + return MAINNET_RPC_URL; + } + + function _getDataPath() internal view override returns (string memory) { + return DATA_PATH; + } + + function _finishSetup() internal override { + vm.rollFork(22486319); // 2025-05-15 + // vm.warp(1747256663); + + address accessManager = Ownable(address(oracle)).owner(); + vm.startPrank(accessManager); + address[] memory tokens = new address[](4); + tokens[0] = usdc; + tokens[1] = susde; + tokens[2] = pt_susde_may_29; + tokens[3] = pt_susde_jun_31; + + for (uint256 i = 0; i < tokens.length; i++) { + address token = tokens[i]; + (address aggregator, address backupAggregator,) = oracle.oracles(token); + IOracle.Oracle memory oracleData = IOracle.Oracle({ + aggregator: AggregatorV3Interface(aggregator), + backupAggregator: AggregatorV3Interface(backupAggregator), + heartbeat: 365 days + }); + oracle.submitPendingOracle(token, oracleData); + } + vm.warp(block.timestamp + 1 days); + for (uint256 i = 0; i < tokens.length; i++) { + address token = tokens[i]; + oracle.acceptPendingOracle(token); + } + + vm.stopPrank(); + + PendleSwapV3AdapterV2 adapter = new PendleSwapV3AdapterV2(0x888888888889758F76e7103c6CbF23ABbF58F946); + pendleAdapter = address(adapter); + + vm.label(pt_susde_may_29, "pt_susde_may_29"); + vm.label(pt_susde_jun_31, "pt_susde_jun_31"); + vm.label(susde, "susde"); + vm.label(address(oracle), "oracle"); + vm.label(address(mmay_30), "mmay_30"); + vm.label(address(maug_1), "maug_1"); + vm.label(address(o_may_30), "o_may_30"); + vm.label(address(o_aug_1), "o_aug_1"); + vm.label(address(pendleAdapter), "pendleAdapter"); + + address admin = vm.randomAddress(); + + vm.startPrank(admin); + router = deployRouter(admin); + router.setAdapterWhitelist(pendleAdapter, true); + router.setAdapterWhitelist(odosAdapter, true); + vm.stopPrank(); + } + + function testRolloverPt() public { + uint128 debt; + uint256 collateralAmount; + // deal(pt_susde_may_29, borrower, collateralAmount); + uint256 gt1 = 5; + address borrower; + { + (,, IGearingToken gt,,) = mmay_30.tokens(); + (address owner, uint128 debtAmt, bytes memory collateralData) = gt.loanInfo(gt1); + borrower = owner; + debt = debtAmt; + collateralAmount = abi.decode(collateralData, (uint256)); + console.log("collateralAmount:", collateralAmount); + console.log("debt:", debt); + } + { + (,, IGearingToken gt,,) = mmay_30.tokens(); + (address owner, uint128 debtAmt, bytes memory collateralData) = gt.loanInfo(gt1); + borrower = owner; + debt = debtAmt; + collateralAmount = abi.decode(collateralData, (uint256)); + console.log("collateralAmount:", collateralAmount); + console.log("debt:", debt); + } + vm.startPrank(borrower); + vm.warp(may_30 - 0.5 days); + // roll gt + { + address pm1 = 0xB162B764044697cf03617C2EFbcB1f42e31E4766; + address pm2 = 0x4339Ffe2B7592Dc783ed13cCE310531aB366dEac; + + SwapUnit[] memory swapUnits = new SwapUnit[](2); + swapUnits[0] = SwapUnit({ + adapter: pendleAdapter, + tokenIn: pt_susde_may_29, + tokenOut: susde, + swapData: abi.encode(pm1, collateralAmount, 0) + }); + swapUnits[1] = SwapUnit({ + adapter: pendleAdapter, + tokenIn: susde, + tokenOut: pt_susde_jun_31, + swapData: abi.encode(pm2, 1e18, 0) + }); + + uint128 additionalAssets = debt / 10; + + ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); + orders[0] = ITermMaxOrder(address(o_aug_1)); + uint128[] memory amounts = new uint128[](1); + amounts[0] = debt - additionalAssets; + (IERC20 ft,, IGearingToken gt, address collateral,) = mmay_30.tokens(); + + deal(usdc, borrower, additionalAssets); + IERC20(usdc).approve(address(router), additionalAssets); + gt.approve(address(router), gt1); + + (IERC20 ft_aug_1,,,,) = maug_1.tokens(); + ITermMaxRouterV2.TermMaxSwapData memory swapData = ITermMaxRouterV2.TermMaxSwapData({ + tokenIn: address(ft_aug_1), + tokenOut: usdc, + orders: orders, + tradingAmts: amounts, + netTokenAmt: debt, + deadline: aug_1 + }); + uint128 maxLtv = 0.9e8; + uint256 gtId2 = + router.rolloverGt(borrower, gt, gt1, additionalAssets, swapUnits, maug_1, 0, swapData, maxLtv); + console.log("new gtId:", gtId2); + } + + vm.stopPrank(); + } + + function testRolloverPtWithCollateral() public { + uint128 debt; + uint256 collateralAmount; + // deal(pt_susde_may_29, borrower, collateralAmount); + uint256 gt1 = 5; + address borrower; + { + (,, IGearingToken gt,,) = mmay_30.tokens(); + (address owner, uint128 debtAmt, bytes memory collateralData) = gt.loanInfo(gt1); + borrower = owner; + debt = debtAmt; + collateralAmount = abi.decode(collateralData, (uint256)); + console.log("collateralAmount:", collateralAmount); + console.log("debt:", debt); + } + { + (,, IGearingToken gt,,) = mmay_30.tokens(); + (address owner, uint128 debtAmt, bytes memory collateralData) = gt.loanInfo(gt1); + borrower = owner; + debt = debtAmt; + collateralAmount = abi.decode(collateralData, (uint256)); + console.log("collateralAmount:", collateralAmount); + console.log("debt:", debt); + } + vm.startPrank(borrower); + vm.warp(may_30 - 0.5 days); + // roll gt + { + address pm1 = 0xB162B764044697cf03617C2EFbcB1f42e31E4766; + address pm2 = 0x4339Ffe2B7592Dc783ed13cCE310531aB366dEac; + + SwapUnit[] memory swapUnits = new SwapUnit[](2); + swapUnits[0] = SwapUnit({ + adapter: pendleAdapter, + tokenIn: pt_susde_may_29, + tokenOut: susde, + swapData: abi.encode(pm1, collateralAmount, 0) + }); + swapUnits[1] = SwapUnit({ + adapter: pendleAdapter, + tokenIn: susde, + tokenOut: pt_susde_jun_31, + swapData: abi.encode(pm2, 1e18, 0) + }); + + uint128 additionalAssets = 0; + uint256 additionalCollateral = 0.2 ether; + + ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); + orders[0] = ITermMaxOrder(address(o_aug_1)); + uint128[] memory amounts = new uint128[](1); + amounts[0] = debt - additionalAssets; + (IERC20 ft,, IGearingToken gt, address collateral,) = mmay_30.tokens(); + + deal(pt_susde_jun_31, borrower, additionalCollateral); + IERC20(pt_susde_jun_31).approve(address(router), additionalCollateral); + gt.approve(address(router), gt1); + + (IERC20 ft_aug_1,,,,) = maug_1.tokens(); + ITermMaxRouterV2.TermMaxSwapData memory swapData = ITermMaxRouterV2.TermMaxSwapData({ + tokenIn: address(ft_aug_1), + tokenOut: usdc, + orders: orders, + tradingAmts: amounts, + netTokenAmt: debt + debt / 15, + deadline: aug_1 + }); + uint128 maxLtv = 0.9e8; + uint256 gtId2 = router.rolloverGt( + borrower, gt, gt1, additionalAssets, swapUnits, maug_1, additionalCollateral, swapData, maxLtv + ); + console.log("new gtId:", gtId2); + } + + vm.stopPrank(); + } + + function testRolloverPtV2() public { + address borrower = vm.randomAddress(); + vm.label(borrower, "borrower"); + address admin = vm.randomAddress(); + vm.label(admin, "admin"); + + vm.startPrank(admin); + ITermMaxMarket market; + uint256 gtId1; + uint128 oldDebt = 100e6; + uint256 oldCollateral = 1000e18; + + deal(pt_susde_may_29, admin, oldCollateral); + + // create new market support v2 flash repay + { + TermMaxFactoryV2 f2 = deployFactory(admin); + MarketConfig memory marketConfig = mmay_30.config(); + (,, IGearingToken gt, address collateral, IERC20 debtToken) = mmay_30.tokens(); + GtConfig memory gtConfig = gt.getGtConfig(); + MarketInitialParams memory params = MarketInitialParams({ + collateral: collateral, + debtToken: IERC20Metadata(address(debtToken)), + admin: admin, + gtImplementation: address(0), + marketConfig: marketConfig, + loanConfig: gtConfig.loanConfig, + gtInitalParams: abi.encode(type(uint128).max), + tokenName: "Test", + tokenSymbol: "TEST" + }); + market = ITermMaxMarket(f2.createMarket(keccak256("GearingTokenWithERC20"), params, 1)); + vm.label(address(market), "newMarket"); + + (,, IGearingToken gt2,,) = market.tokens(); + + IERC20(pt_susde_may_29).approve(address(gt2), oldCollateral); + (gtId1,) = market.issueFt(borrower, 100e6, abi.encode(oldCollateral)); + + vm.label(address(market), "market_may_30"); + vm.label(address(gt2), "gt_may_30"); + } + + vm.stopPrank(); + + uint128 debt = 20e6; + uint256 collateralAmount = 500e18; + + vm.startPrank(borrower); + vm.warp(may_30 - 0.5 days); + // roll gt + { + address pm1 = 0xB162B764044697cf03617C2EFbcB1f42e31E4766; + address pm2 = 0x4339Ffe2B7592Dc783ed13cCE310531aB366dEac; + + SwapUnit[] memory swapUnits = new SwapUnit[](2); + swapUnits[0] = SwapUnit({ + adapter: pendleAdapter, + tokenIn: pt_susde_may_29, + tokenOut: susde, + swapData: abi.encode(pm1, collateralAmount, 0) + }); + swapUnits[1] = SwapUnit({ + adapter: pendleAdapter, + tokenIn: susde, + tokenOut: pt_susde_jun_31, + swapData: abi.encode(pm2, 1e18, 0) + }); + + uint128 additionalAssets = debt / 10; + + ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); + orders[0] = ITermMaxOrder(address(o_aug_1)); + uint128[] memory amounts = new uint128[](1); + amounts[0] = debt - additionalAssets; + (IERC20 ft,, IGearingToken gt, address collateral,) = market.tokens(); + + deal(usdc, borrower, additionalAssets); + IERC20(usdc).approve(address(router), additionalAssets); + gt.approve(address(router), gtId1); + + (IERC20 ft_aug_1,,,,) = maug_1.tokens(); + ITermMaxRouterV2.TermMaxSwapData memory swapData = ITermMaxRouterV2.TermMaxSwapData({ + tokenIn: address(ft_aug_1), + tokenOut: usdc, + orders: orders, + tradingAmts: amounts, + netTokenAmt: debt, + deadline: aug_1 + }); + + uint128 maxLtv = 0.9e8; + uint256 gtId2 = router.rolloverGtV2( + borrower, gt, gtId1, debt, additionalAssets, collateralAmount, swapUnits, maug_1, 0, swapData, maxLtv + ); + + (address owner, uint128 currentDebt, bytes memory currentCollateral) = gt.loanInfo(gtId1); + assertEq(owner, borrower, "borrower should be the same"); + assertEq(currentDebt + debt, oldDebt, "debt should be the same"); + assertEq( + abi.decode(currentCollateral, (uint256)), + oldCollateral - collateralAmount, + "collateral should be the same" + ); + + (,, IGearingToken gt2,,) = maug_1.tokens(); + console.log("new gtId:", gtId2); + (address owner2, uint128 currentDebt2, bytes memory currentCollateral2) = gt2.loanInfo(gtId2); + assertEq(owner2, borrower, "borrower should be the same"); + console.log("new gt debt:", currentDebt2 / 1e6); + console.log("new gt collateral:", abi.decode(currentCollateral2, (uint256)) / 1e18); + } + + vm.stopPrank(); + } + + function testRolloverPtV2WithCollateral() public { + address borrower = vm.randomAddress(); + vm.label(borrower, "borrower"); + address admin = vm.randomAddress(); + vm.label(admin, "admin"); + + vm.startPrank(admin); + ITermMaxMarket market; + uint256 gtId1; + uint128 oldDebt = 100e6; + uint256 oldCollateral = 1000e18; + + deal(pt_susde_may_29, admin, oldCollateral); + + // create new market support v2 flash repay + { + TermMaxFactoryV2 f2 = deployFactory(admin); + MarketConfig memory marketConfig = mmay_30.config(); + (,, IGearingToken gt, address collateral, IERC20 debtToken) = mmay_30.tokens(); + GtConfig memory gtConfig = gt.getGtConfig(); + MarketInitialParams memory params = MarketInitialParams({ + collateral: collateral, + debtToken: IERC20Metadata(address(debtToken)), + admin: admin, + gtImplementation: address(0), + marketConfig: marketConfig, + loanConfig: gtConfig.loanConfig, + gtInitalParams: abi.encode(type(uint128).max), + tokenName: "Test", + tokenSymbol: "TEST" + }); + market = ITermMaxMarket(f2.createMarket(keccak256("GearingTokenWithERC20"), params, 1)); + vm.label(address(market), "newMarket"); + + (,, IGearingToken gt2,,) = market.tokens(); + + IERC20(pt_susde_may_29).approve(address(gt2), oldCollateral); + (gtId1,) = market.issueFt(borrower, 100e6, abi.encode(oldCollateral)); + + vm.label(address(market), "market_may_30"); + vm.label(address(gt2), "gt_may_30"); + } + + vm.stopPrank(); + + uint128 debt = 20e6; + uint256 collateralAmount = 500e18; + + vm.startPrank(borrower); + vm.warp(may_30 - 0.5 days); + // roll gt + { + address pm1 = 0xB162B764044697cf03617C2EFbcB1f42e31E4766; + address pm2 = 0x4339Ffe2B7592Dc783ed13cCE310531aB366dEac; + + SwapUnit[] memory swapUnits = new SwapUnit[](2); + swapUnits[0] = SwapUnit({ + adapter: pendleAdapter, + tokenIn: pt_susde_may_29, + tokenOut: susde, + swapData: abi.encode(pm1, collateralAmount, 0) + }); + swapUnits[1] = SwapUnit({ + adapter: pendleAdapter, + tokenIn: susde, + tokenOut: pt_susde_jun_31, + swapData: abi.encode(pm2, 1e18, 0) + }); + + uint128 additionalAssets = 0; + uint256 additionalCollateral = 2 ether; + + ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); + orders[0] = ITermMaxOrder(address(o_aug_1)); + uint128[] memory amounts = new uint128[](1); + amounts[0] = debt - additionalAssets; + (IERC20 ft,, IGearingToken gt, address collateral,) = market.tokens(); + + deal(pt_susde_jun_31, borrower, additionalCollateral); + IERC20(pt_susde_jun_31).approve(address(router), additionalCollateral); + gt.approve(address(router), gtId1); + + (IERC20 ft_aug_1,,,,) = maug_1.tokens(); + ITermMaxRouterV2.TermMaxSwapData memory swapData = ITermMaxRouterV2.TermMaxSwapData({ + tokenIn: address(ft_aug_1), + tokenOut: usdc, + orders: orders, + tradingAmts: amounts, + netTokenAmt: debt + 10e6, + deadline: aug_1 + }); + + uint128 maxLtv = 0.9e8; + uint256 gtId2 = router.rolloverGtV2( + borrower, gt, gtId1, debt, additionalAssets, collateralAmount, swapUnits, maug_1, 0, swapData, maxLtv + ); + + (address owner, uint128 currentDebt, bytes memory currentCollateral) = gt.loanInfo(gtId1); + assertEq(owner, borrower, "borrower should be the same"); + assertEq(currentDebt + debt, oldDebt, "debt should be the same"); + assertEq( + abi.decode(currentCollateral, (uint256)), + oldCollateral - collateralAmount, + "collateral should be the same" + ); + + (,, IGearingToken gt2,,) = maug_1.tokens(); + console.log("new gtId:", gtId2); + (address owner2, uint128 currentDebt2, bytes memory currentCollateral2) = gt2.loanInfo(gtId2); + assertEq(owner2, borrower, "borrower should be the same"); + console.log("new gt debt:", currentDebt2 / 1e6); + console.log("new gt collateral:", abi.decode(currentCollateral2, (uint256)) / 1e18); + } + + vm.stopPrank(); + } +} From 10dba368958dc238c1fbefbf674dc37eaf46a498 Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 3 Jun 2025 12:17:13 +0800 Subject: [PATCH 056/194] remove old ut --- test/AccessManager.t.sol | 659 -------- test/Factory.t.sol | 227 --- test/Faucet.t.sol | 172 -- test/FuzzActions.t.sol | 224 --- test/FuzzSwap.t.sol | 256 --- test/Gt.t.sol | 1444 ----------------- test/LinkedList.t.sol | 69 - test/Market.t.sol | 413 ----- test/OracleAggregator.t.sol | 647 -------- test/Order.t.sol | 847 ---------- test/Router.t.sol | 699 -------- test/TermMaxTestBase.t.sol | 124 -- test/TermMaxToken.t.sol | 440 ----- test/Vault.t.sol | 1085 ------------- test/Vault2.t.sol | 251 --- test/integration/ArbSepolia.t.sol.bak | 191 --- test/integration/ForkDebugger.t.sol | 148 -- test/integration/ForkFlashRepay.t.sol | 256 --- test/integration/ForkPriceFeed.t.sol | 58 - test/integration/ForkRollOver.t.sol | 496 ------ test/mainnet-fork/ForkBaseTest.sol | 173 -- test/mainnet-fork/GtBaseTest.t.sol | 389 ----- test/mainnet-fork/MarketBaseTest.t.sol | 229 --- test/mainnet-fork/VaultBaseTest.t.sol | 247 --- test/mainnet-fork/mainnet/ForkGt.t.sol | 154 -- test/mainnet-fork/mainnet/ForkMarket.t.sol | 45 - test/mainnet-fork/mainnet/ForkPriceFeed.t.sol | 134 -- test/mainnet-fork/mainnet/ForkVault.t.sol | 43 - test/utils/DeployUtils.sol | 314 ---- test/utils/JSONLoader.sol | 113 -- test/utils/LoanUtils.sol | 81 - test/utils/StateChecker.sol | 51 - test/utils/SwapUtils.sol | 26 - test/v2/integration/ForkPrdFlashRepay.t.sol | 47 +- test/v2/integration/ForkPrdRollOver.t.sol | 2 +- test/{ => v2}/tokenomics/PreTMX.t.sol | 2 +- 36 files changed, 25 insertions(+), 10731 deletions(-) delete mode 100644 test/AccessManager.t.sol delete mode 100644 test/Factory.t.sol delete mode 100644 test/Faucet.t.sol delete mode 100644 test/FuzzActions.t.sol delete mode 100644 test/FuzzSwap.t.sol delete mode 100644 test/Gt.t.sol delete mode 100644 test/LinkedList.t.sol delete mode 100644 test/Market.t.sol delete mode 100644 test/OracleAggregator.t.sol delete mode 100644 test/Order.t.sol delete mode 100644 test/Router.t.sol delete mode 100644 test/TermMaxTestBase.t.sol delete mode 100644 test/TermMaxToken.t.sol delete mode 100644 test/Vault.t.sol delete mode 100644 test/Vault2.t.sol delete mode 100644 test/integration/ArbSepolia.t.sol.bak delete mode 100644 test/integration/ForkDebugger.t.sol delete mode 100644 test/integration/ForkFlashRepay.t.sol delete mode 100644 test/integration/ForkPriceFeed.t.sol delete mode 100644 test/integration/ForkRollOver.t.sol delete mode 100644 test/mainnet-fork/ForkBaseTest.sol delete mode 100644 test/mainnet-fork/GtBaseTest.t.sol delete mode 100644 test/mainnet-fork/MarketBaseTest.t.sol delete mode 100644 test/mainnet-fork/VaultBaseTest.t.sol delete mode 100644 test/mainnet-fork/mainnet/ForkGt.t.sol delete mode 100644 test/mainnet-fork/mainnet/ForkMarket.t.sol delete mode 100644 test/mainnet-fork/mainnet/ForkPriceFeed.t.sol delete mode 100644 test/mainnet-fork/mainnet/ForkVault.t.sol delete mode 100644 test/utils/DeployUtils.sol delete mode 100644 test/utils/JSONLoader.sol delete mode 100644 test/utils/LoanUtils.sol delete mode 100644 test/utils/StateChecker.sol delete mode 100644 test/utils/SwapUtils.sol rename test/{ => v2}/tokenomics/PreTMX.t.sol (99%) diff --git a/test/AccessManager.t.sol b/test/AccessManager.t.sol deleted file mode 100644 index 2ce38aa..0000000 --- a/test/AccessManager.t.sol +++ /dev/null @@ -1,659 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import "forge-std/Test.sol"; -import {console} from "forge-std/console.sol"; -import {DeployUtils} from "./utils/DeployUtils.sol"; -import {JSONLoader} from "./utils/JSONLoader.sol"; -import {IAccessControl} from "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; -import {IERC1967} from "@openzeppelin/contracts/interfaces/IERC1967.sol"; -import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; -import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; -import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; -import {Ownable2StepUpgradeable} from "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; -import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; -import {GearingTokenWithERC20} from "contracts/tokens/GearingTokenWithERC20.sol"; -import {ITermMaxMarket} from "contracts/ITermMaxMarket.sol"; -import {MockERC20} from "contracts/test/MockERC20.sol"; -import {MockPriceFeed} from "contracts/test/MockPriceFeed.sol"; -import {ITermMaxFactory} from "contracts/factory/ITermMaxFactory.sol"; -import {MarketConfig, FeeConfig, MarketInitialParams} from "contracts/storage/TermMaxStorage.sol"; -import {IOwnable, IPausable, AccessManager} from "contracts/access/AccessManager.sol"; -import {ITermMaxRouter, TermMaxRouter} from "contracts/router/TermMaxRouter.sol"; -import {IOracle} from "contracts/oracle/IOracle.sol"; -import {ITermMaxVault, TermMaxVault} from "contracts/vault/TermMaxVault.sol"; -import {Constants} from "contracts/lib/Constants.sol"; -import "contracts/storage/TermMaxStorage.sol"; - -contract AccessManagerTestV2 is Test { - using JSONLoader for *; - - DeployUtils.Res res; - - OrderConfig orderConfig; - MarketConfig marketConfig; - - address deployer = vm.randomAddress(); - address maker = vm.randomAddress(); - address sender = vm.randomAddress(); - address treasurer = vm.randomAddress(); - string testdata; - AccessManager manager; - - function setUp() public { - vm.startPrank(deployer); - testdata = vm.readFile(string.concat(vm.projectRoot(), "/test/testdata/testdata.json")); - - uint32 maxLtv = 0.89e8; - uint32 liquidationLtv = 0.9e8; - - marketConfig = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); - orderConfig = JSONLoader.getOrderConfigFromJson(testdata, ".orderConfig"); - - res = DeployUtils.deployMarket(deployer, marketConfig, maxLtv, liquidationLtv); - - res.order = - res.market.createOrder(maker, orderConfig.maxXtReserve, ISwapCallback(address(0)), orderConfig.curveCuts); - - vm.warp(vm.parseUint(vm.parseJsonString(testdata, ".currentTime"))); - - // update oracle - res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.eth")); - res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.dai")); - - uint256 amount = 150e8; - res.debt.mint(deployer, amount); - res.debt.approve(address(res.market), amount); - res.market.mint(deployer, amount); - res.ft.transfer(address(res.order), amount); - res.xt.transfer(address(res.order), amount); - - res.router = DeployUtils.deployRouter(deployer); - - AccessManager implementation = new AccessManager(); - bytes memory data = abi.encodeCall(AccessManager.initialize, deployer); - address proxy = address(new ERC1967Proxy(address(implementation), data)); - - manager = AccessManager(proxy); - - IOwnable(address(res.factory)).transferOwnership(address(manager)); - IOwnable(address(res.market)).transferOwnership(address(manager)); - IOwnable(address(res.router)).transferOwnership(address(manager)); - IOwnable(address(res.oracle)).transferOwnership(address(manager)); - - manager.acceptOwnership(IOwnable(address(res.factory))); - - manager.acceptOwnership(IOwnable(address(res.market))); - - manager.acceptOwnership(IOwnable(address(res.router))); - - manager.acceptOwnership(IOwnable(address(res.oracle))); - - manager.grantRole(manager.CONFIGURATOR_ROLE(), deployer); - manager.grantRole(manager.PAUSER_ROLE(), deployer); - manager.grantRole(manager.VAULT_ROLE(), deployer); - manager.grantRole(manager.MARKET_ROLE(), deployer); - manager.grantRole(manager.ORACLE_ROLE(), deployer); - - vm.stopPrank(); - } - - function testTransferOwnership() public { - vm.prank(deployer); - manager.transferOwnership(IOwnable(address(res.router)), sender); - vm.prank(sender); - IOwnable(address(res.router)).acceptOwnership(); - assert(res.router.owner() == sender); - } - - function testTransferOwnershipWithoutAuth() public { - vm.prank(sender); - - vm.expectRevert( - abi.encodeWithSelector(IAccessControl.AccessControlUnauthorizedAccount.selector, sender, uint256(0)) - ); - manager.transferOwnership(IOwnable(address(res.router)), sender); - } - - function testRoleManagement() public { - address newUser = vm.randomAddress(); - - // Test granting roles - vm.startPrank(deployer); - manager.grantRole(manager.PAUSER_ROLE(), newUser); - manager.grantRole(manager.CONFIGURATOR_ROLE(), newUser); - manager.grantRole(manager.VAULT_ROLE(), newUser); - - assertTrue(manager.hasRole(manager.PAUSER_ROLE(), newUser)); - assertTrue(manager.hasRole(manager.CONFIGURATOR_ROLE(), newUser)); - assertTrue(manager.hasRole(manager.VAULT_ROLE(), newUser)); - - // Test revoking roles - manager.revokeRole(manager.PAUSER_ROLE(), newUser); - manager.revokeRole(manager.CONFIGURATOR_ROLE(), newUser); - manager.revokeRole(manager.VAULT_ROLE(), newUser); - - assertFalse(manager.hasRole(manager.PAUSER_ROLE(), newUser)); - assertFalse(manager.hasRole(manager.CONFIGURATOR_ROLE(), newUser)); - assertFalse(manager.hasRole(manager.VAULT_ROLE(), newUser)); - - vm.stopPrank(); - } - - function testRevokeRole() public { - bytes32 pauserRole = manager.PAUSER_ROLE(); - address user = vm.randomAddress(); - - // Grant role first - vm.prank(deployer); - manager.grantRole(pauserRole, user); - - // Revoke role - vm.prank(deployer); - manager.revokeRole(pauserRole, user); - - assertFalse(manager.hasRole(pauserRole, user)); - } - - function testCannotRevokeSelfRole() public { - bytes32 pauserRole = manager.PAUSER_ROLE(); - - // Try to revoke own role - vm.prank(deployer); - vm.expectRevert(abi.encodeWithSignature("AccessControlBadConfirmation()")); - manager.revokeRole(pauserRole, deployer); - } - - function testRenounceRole() public { - bytes32 pauserRole = manager.PAUSER_ROLE(); - address user = vm.randomAddress(); - - // Grant role first - vm.prank(deployer); - manager.grantRole(pauserRole, user); - - // Renounce role - vm.prank(user); - manager.renounceRole(pauserRole, user); - - assertFalse(manager.hasRole(pauserRole, user)); - } - - function testCannotRenounceDefaultAdminRole() public { - bytes32 defaultAdminRole = 0x00; - - vm.prank(deployer); - vm.expectRevert(AccessManager.CannotRevokeDefaultAdminRole.selector); - manager.renounceRole(defaultAdminRole, deployer); - } - - function testPausingFunctionality() public { - address pauser = vm.randomAddress(); - bytes32 pauserRole = manager.PAUSER_ROLE(); - // Grant PAUSER_ROLE to the pauser - vm.prank(deployer); - manager.grantRole(pauserRole, pauser); - - // Test pausing with PAUSER_ROLE - vm.startPrank(pauser); - manager.setSwitch(IPausable(address(res.router)), false); - assertTrue(PausableUpgradeable(address(res.router)).paused()); - - // Test unpausing with PAUSER_ROLE - manager.setSwitch(IPausable(address(res.router)), true); - assertFalse(PausableUpgradeable(address(res.router)).paused()); - vm.stopPrank(); - - // Test pausing without PAUSER_ROLE - address nonPauser = vm.randomAddress(); - vm.startPrank(nonPauser); - vm.expectRevert( - abi.encodeWithSelector( - IAccessControl.AccessControlUnauthorizedAccount.selector, nonPauser, manager.PAUSER_ROLE() - ) - ); - manager.setSwitch(IPausable(address(res.router)), false); - vm.stopPrank(); - } - - function testBatchSetSwitch() public { - // Create vault initialization parameters - VaultInitialParams memory params = VaultInitialParams({ - admin: address(manager), - curator: address(0), // Will be set through AccessManager - timelock: 1 days, - asset: IERC20(address(res.debt)), - maxCapacity: 1000000e18, - name: "Test Vault", - symbol: "tVAULT", - performanceFeeRate: 0.2e8 // 20% - }); - - // Deploy vault - res.vault = DeployUtils.deployVault(params); - - address pauser = vm.randomAddress(); - bytes32 pauserRole = manager.PAUSER_ROLE(); - - // Create multiple pausable test entities - IPausable[] memory entities = new IPausable[](2); - entities[0] = IPausable(address(res.router)); - entities[1] = IPausable(address(res.vault)); - - // Grant PAUSER_ROLE to the pauser - vm.prank(deployer); - manager.grantRole(pauserRole, pauser); - - // Test batch pausing with PAUSER_ROLE - vm.startPrank(pauser); - manager.batchSetSwitch(entities, false); - - // Verify all entities are paused - assertTrue(PausableUpgradeable(address(res.router)).paused()); - assertTrue(PausableUpgradeable(address(res.vault)).paused()); - - // Test batch unpausing with PAUSER_ROLE - manager.batchSetSwitch(entities, true); - - // Verify all entities are unpaused - assertFalse(PausableUpgradeable(address(res.router)).paused()); - assertFalse(PausableUpgradeable(address(res.vault)).paused()); - vm.stopPrank(); - - // Test batch pausing without PAUSER_ROLE - address nonPauser = vm.randomAddress(); - vm.startPrank(nonPauser); - vm.expectRevert( - abi.encodeWithSelector( - IAccessControl.AccessControlUnauthorizedAccount.selector, nonPauser, manager.PAUSER_ROLE() - ) - ); - manager.batchSetSwitch(entities, false); - vm.stopPrank(); - } - - function testVaultManagement() public { - address vaultManager = vm.randomAddress(); - address newCurator = vm.randomAddress(); - - // Create vault initialization parameters - VaultInitialParams memory params = VaultInitialParams({ - admin: address(manager), - curator: address(0), // Will be set through AccessManager - timelock: 1 days, - asset: IERC20(address(res.debt)), - maxCapacity: 1000000e18, - name: "Test Vault", - symbol: "tVAULT", - performanceFeeRate: 0.2e8 // 20% - }); - - // Deploy vault - ITermMaxVault vault = DeployUtils.deployVault(params); - - // Grant VAULT_ROLE to the vault manager - vm.startPrank(deployer); - manager.grantRole(manager.VAULT_ROLE(), vaultManager); - vm.stopPrank(); - - vm.startPrank(vaultManager); - - // Test setting curator - manager.setCuratorForVault(ITermMaxVault(address(vault)), newCurator); - assertEq(ITermMaxVault(address(vault)).curator(), newCurator); - - vm.stopPrank(); - - // Test without VAULT_ROLE - address nonVaultManager = vm.randomAddress(); - vm.startPrank(nonVaultManager); - vm.expectRevert( - abi.encodeWithSelector( - IAccessControl.AccessControlUnauthorizedAccount.selector, nonVaultManager, manager.VAULT_ROLE() - ) - ); - manager.setCuratorForVault(ITermMaxVault(address(vault)), newCurator); - vm.stopPrank(); - - // Test that non-vault role cannot set allocator - address allocator = vm.randomAddress(); - vm.startPrank(allocator); - vm.expectRevert( - abi.encodeWithSelector( - IAccessControl.AccessControlUnauthorizedAccount.selector, allocator, manager.VAULT_ROLE() - ) - ); - manager.setIsAllocatorForVault(ITermMaxVault(address(vault)), allocator, true); - vm.stopPrank(); - - // Test that vault role can set allocator - vm.prank(deployer); - manager.setIsAllocatorForVault(ITermMaxVault(address(vault)), allocator, true); - assertTrue(vault.isAllocator(allocator)); - } - - function testRevokeVaultPendingValues() public { - address vaultManager = vm.randomAddress(); - address newMarket = vm.randomAddress(); - address newGuardian = vm.randomAddress(); - address curator = vm.randomAddress(); - - // Create vault initialization parameters - VaultInitialParams memory params = VaultInitialParams({ - admin: address(manager), - curator: curator, - timelock: 1 days, - asset: IERC20(address(res.debt)), - maxCapacity: 1000000e18, - name: "Test Vault", - symbol: "tVAULT", - performanceFeeRate: 0.2e8 - }); - - // Deploy vault - ITermMaxVault vault = DeployUtils.deployVault(params); - - // Grant VAULT_ROLE to the vault manager and set curator - vm.startPrank(deployer); - manager.grantRole(manager.VAULT_ROLE(), vaultManager); - vm.stopPrank(); - - vm.startPrank(curator); - vault.submitTimelock(2 days); - vault.submitTimelock(1 days); - vault.submitMarket(newMarket, true); - vm.stopPrank(); - - vm.startPrank(vaultManager); - manager.setCuratorForVault(ITermMaxVault(address(vault)), vaultManager); - - // Test revoking pending timelock - manager.revokeVaultPendingTimelock(ITermMaxVault(address(vault))); - assertEq(vault.timelock(), 2 days); // Original timelock - - // Test revoking pending market - manager.revokeVaultPendingMarket(ITermMaxVault(address(vault)), newMarket); - assertTrue(!vault.marketWhitelist(newMarket)); // Market not whitelisted - - // Test revoking pending guardian - manager.submitVaultGuardian(vault, curator); - manager.submitVaultGuardian(vault, newGuardian); - manager.revokeVaultPendingGuardian(ITermMaxVault(address(vault))); - assertEq(vault.guardian(), curator); // Original guardian - - vm.stopPrank(); - - // Test without VAULT_ROLE - address nonVaultManager = vm.randomAddress(); - vm.startPrank(nonVaultManager); - - vm.expectRevert( - abi.encodeWithSelector( - IAccessControl.AccessControlUnauthorizedAccount.selector, nonVaultManager, manager.VAULT_ROLE() - ) - ); - manager.revokeVaultPendingTimelock(ITermMaxVault(address(vault))); - - vm.expectRevert( - abi.encodeWithSelector( - IAccessControl.AccessControlUnauthorizedAccount.selector, nonVaultManager, manager.VAULT_ROLE() - ) - ); - manager.revokeVaultPendingMarket(ITermMaxVault(address(vault)), newMarket); - - vm.expectRevert( - abi.encodeWithSelector( - IAccessControl.AccessControlUnauthorizedAccount.selector, nonVaultManager, manager.VAULT_ROLE() - ) - ); - manager.revokeVaultPendingGuardian(ITermMaxVault(address(vault))); - - vm.stopPrank(); - } - - function testUpgradeSubContract() public { - vm.startPrank(deployer); - - // Deploy a new router implementation - TermMaxRouter routerV2 = new TermMaxRouter(); - - // Test upgrade with DEFAULT_ADMIN_ROLE - manager.upgradeSubContract(UUPSUpgradeable(address(res.router)), address(routerV2), ""); - - // Test upgrade without DEFAULT_ADMIN_ROLE - address nonAdmin = vm.randomAddress(); - vm.stopPrank(); - - vm.startPrank(nonAdmin); - vm.expectRevert( - abi.encodeWithSelector( - IAccessControl.AccessControlUnauthorizedAccount.selector, nonAdmin, manager.DEFAULT_ADMIN_ROLE() - ) - ); - manager.upgradeSubContract(UUPSUpgradeable(address(res.router)), address(routerV2), ""); - vm.stopPrank(); - } - - function testSetGtImplement() public { - address newImplement = vm.randomAddress(); - string memory gtImplementName = "TestGT"; - - // Test that non-market role cannot set GT implement - vm.startPrank(sender); - vm.expectRevert( - abi.encodeWithSelector( - IAccessControl.AccessControlUnauthorizedAccount.selector, sender, manager.MARKET_ROLE() - ) - ); - manager.setGtImplement(ITermMaxFactory(address(res.factory)), gtImplementName, newImplement); - vm.stopPrank(); - - // Test that market role can set GT implement - vm.startPrank(deployer); - manager.setGtImplement(ITermMaxFactory(address(res.factory)), gtImplementName, newImplement); - assertEq(res.factory.gtImplements(keccak256(abi.encodePacked(gtImplementName))), newImplement); - vm.stopPrank(); - } - - function testCreateMarket() public { - bytes32 gtKey = keccak256("TestGT"); - MarketInitialParams memory params = MarketInitialParams({ - collateral: address(res.collateral), - debtToken: IERC20Metadata(address(res.debt)), - admin: address(manager), - gtImplementation: address(0), - marketConfig: marketConfig, - loanConfig: LoanConfig({oracle: IOracle(address(0)), liquidatable: true, liquidationLtv: 0.9e8, maxLtv: 0.85e8}), - gtInitalParams: abi.encode(1e18), - tokenName: "Test Market", - tokenSymbol: "Test" - }); - uint256 salt = 123; - - // Test that non-market role cannot create market - address caller = 0x1234567890123456789012345678901234567890; - vm.startPrank(caller); - vm.expectRevert( - abi.encodeWithSelector( - IAccessControl.AccessControlUnauthorizedAccount.selector, caller, manager.MARKET_ROLE() - ) - ); - manager.createMarket(ITermMaxFactory(address(res.factory)), gtKey, params, salt); - vm.stopPrank(); - - // Test that market role can create market - vm.startPrank(deployer); - address newMarket = manager.createMarket( - ITermMaxFactory(address(res.factory)), keccak256("GearingTokenWithERC20"), params, salt - ); - assertTrue(newMarket != address(0)); - vm.stopPrank(); - } - - function testSetAdapterWhitelist() public { - address adapter = vm.randomAddress(); - - // Test that non-market role cannot set adapter whitelist - vm.startPrank(sender); - vm.expectRevert( - abi.encodeWithSelector( - IAccessControl.AccessControlUnauthorizedAccount.selector, sender, manager.MARKET_ROLE() - ) - ); - manager.setAdapterWhitelist(ITermMaxRouter(address(res.router)), adapter, true); - vm.stopPrank(); - - // Test that market role can set adapter whitelist - vm.startPrank(deployer); - manager.setAdapterWhitelist(ITermMaxRouter(address(res.router)), adapter, true); - assertTrue(res.router.adapterWhitelist(adapter)); - - // Test setting adapter whitelist to false - manager.setAdapterWhitelist(ITermMaxRouter(address(res.router)), adapter, false); - assertFalse(res.router.adapterWhitelist(adapter)); - vm.stopPrank(); - } - - function testSubmitAndAcceptPendingOracle() public { - address asset = address(res.collateral); - IOracle.Oracle memory oracle = IOracle.Oracle({ - aggregator: AggregatorV3Interface(address(new MockPriceFeed(sender))), - backupAggregator: AggregatorV3Interface(address(new MockPriceFeed(sender))), - heartbeat: 3600, - backupHeartbeat: 7200, - maxPrice: 1e8 - }); - - // Test that non-oracle role cannot submit pending oracle - vm.startPrank(sender); - vm.expectRevert( - abi.encodeWithSelector( - IAccessControl.AccessControlUnauthorizedAccount.selector, sender, manager.ORACLE_ROLE() - ) - ); - manager.submitPendingOracle(IOracle(address(res.oracle)), asset, oracle); - vm.stopPrank(); - - // Test that oracle role can submit pending oracle - vm.startPrank(deployer); - manager.submitPendingOracle(IOracle(address(res.oracle)), asset, oracle); - - // Test that non-oracle role cannot accept pending oracle - vm.stopPrank(); - vm.startPrank(sender); - vm.expectRevert( - abi.encodeWithSelector( - IAccessControl.AccessControlUnauthorizedAccount.selector, sender, manager.ORACLE_ROLE() - ) - ); - manager.acceptPendingOracle(IOracle(address(res.oracle)), asset); - vm.stopPrank(); - - // Test that oracle role can accept pending oracle - vm.startPrank(deployer); - manager.acceptPendingOracle(IOracle(address(res.oracle)), asset); - vm.stopPrank(); - } - - function testRevokePendingOracle() public { - address asset = address(res.collateral); - IOracle.Oracle memory oracle = IOracle.Oracle({ - aggregator: AggregatorV3Interface(address(new MockPriceFeed(sender))), - backupAggregator: AggregatorV3Interface(address(new MockPriceFeed(sender))), - heartbeat: 3600, - backupHeartbeat: 7200, - maxPrice: 1e8 - }); - - // Submit a pending oracle - vm.startPrank(deployer); - manager.submitPendingOracle(IOracle(address(res.oracle)), asset, oracle); - vm.stopPrank(); - - // Test that non-oracle role cannot revoke pending oracle - vm.startPrank(sender); - vm.expectRevert( - abi.encodeWithSelector( - IAccessControl.AccessControlUnauthorizedAccount.selector, sender, manager.ORACLE_ROLE() - ) - ); - manager.revokePendingOracle(IOracle(address(res.oracle)), asset); - vm.stopPrank(); - - // Test that oracle role can revoke pending oracle - vm.startPrank(deployer); - - // We'll capture the event to verify that revocation happened - vm.expectEmit(true, true, true, true); - // Define the expected event - emit RevokePendingOracle(asset); - - // Call the revoke function - manager.revokePendingOracle(IOracle(address(res.oracle)), asset); - - // Try to accept the oracle after revocation, which should fail - // since there's no longer a pending oracle - vm.expectRevert(); // Should revert with NoPendingValue error - IOracle(address(res.oracle)).acceptPendingOracle(asset); - - vm.stopPrank(); - } - - // Define the event to match OracleAggregator's event - event RevokePendingOracle(address indexed asset); - - function testUpdateGtConfig() public { - bytes memory configData = abi.encode(1234); - - // Test that non-configurator role cannot update GT config - vm.startPrank(sender); - vm.expectRevert( - abi.encodeWithSelector( - IAccessControl.AccessControlUnauthorizedAccount.selector, sender, manager.CONFIGURATOR_ROLE() - ) - ); - manager.updateGtConfig(ITermMaxMarket(address(res.market)), configData); - vm.stopPrank(); - - // Test that configurator role can update GT config - vm.startPrank(deployer); - manager.updateGtConfig(ITermMaxMarket(address(res.market)), configData); - vm.stopPrank(); - } - - function testUpdateOrderFeeRate() public { - // Get new fee config from testdata - FeeConfig memory newFeeConfig = res.order.orderConfig().feeConfig; - - // Test that non-admin cannot update fee rate - vm.startPrank(sender); - vm.expectRevert( - abi.encodeWithSelector( - IAccessControl.AccessControlUnauthorizedAccount.selector, sender, manager.CONFIGURATOR_ROLE() - ) - ); - manager.updateOrderFeeRate(res.market, res.order, newFeeConfig); - vm.stopPrank(); - // Test that admin can update fee rate - vm.prank(deployer); - manager.updateOrderFeeRate(res.market, res.order, newFeeConfig); - - // Verify fee config was updated - OrderConfig memory updatedConfig = res.order.orderConfig(); - assertEq(updatedConfig.feeConfig.lendTakerFeeRatio, newFeeConfig.lendTakerFeeRatio); - assertEq(updatedConfig.feeConfig.borrowTakerFeeRatio, newFeeConfig.borrowTakerFeeRatio); - } - - function testUpdateMarketConfig() public { - // Get new market config from testdata - MarketConfig memory newMarketConfig = marketConfig; - newMarketConfig.treasurer = address(0x123); - // Test that configurator role can update market config - vm.prank(deployer); - manager.updateMarketConfig(res.market, newMarketConfig); - - // Verify market config was updated - MarketConfig memory updatedConfig = res.market.config(); - assertEq(updatedConfig.treasurer, newMarketConfig.treasurer); - } -} diff --git a/test/Factory.t.sol b/test/Factory.t.sol deleted file mode 100644 index bea861c..0000000 --- a/test/Factory.t.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import "forge-std/Test.sol"; -import {console} from "forge-std/console.sol"; -import {DeployUtils} from "./utils/DeployUtils.sol"; -import {JSONLoader} from "./utils/JSONLoader.sol"; - -import {ITermMaxMarket, TermMaxMarket, Constants, MarketErrors} from "contracts/TermMaxMarket.sol"; -import {MockERC20, ERC20} from "contracts/test/MockERC20.sol"; - -import {MockPriceFeed} from "contracts/test/MockPriceFeed.sol"; -import {IMintableERC20} from "contracts/tokens/MintableERC20.sol"; -import {IGearingToken} from "contracts/tokens/IGearingToken.sol"; -import {GearingTokenWithERC20, GearingTokenEvents} from "contracts/tokens/GearingTokenWithERC20.sol"; -import {ITermMaxFactory, TermMaxFactory, FactoryErrors, FactoryEvents} from "contracts/factory/TermMaxFactory.sol"; -import {IOracle, OracleAggregator, AggregatorV3Interface} from "contracts/oracle/OracleAggregator.sol"; -import "contracts/storage/TermMaxStorage.sol"; - -contract FactoryTest is Test { - address deployer = vm.randomAddress(); - - address treasurer = vm.randomAddress(); - uint32 maxLtv = 0.89e8; - uint32 liquidationLtv = 0.9e8; - MarketConfig marketConfig; - - function setUp() public { - string memory testdata = vm.readFile(string.concat(vm.projectRoot(), "/test/testdata/testdata.json")); - - marketConfig = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); - } - - function testDeploy() public { - vm.startPrank(deployer); - DeployUtils.Res memory res = DeployUtils.deployMarket(deployer, marketConfig, maxLtv, liquidationLtv); - - address predictedMarketAddress = res.factory.predictMarketAddress( - deployer, address(res.collateral), address(res.debt), marketConfig.maturity, 0 - ); - assert(address(res.market) == predictedMarketAddress); - - assert(keccak256(abi.encode(res.market.name())) == keccak256(abi.encode("Termmax Market:DAI-ETH"))); - - assert(keccak256(abi.encode(res.market.config())) == keccak256(abi.encode(marketConfig))); - GtConfig memory gtConfig = res.gt.getGtConfig(); - assert(gtConfig.maturity == marketConfig.maturity); - assert(gtConfig.loanConfig.maxLtv == maxLtv); - assert(gtConfig.loanConfig.liquidationLtv == liquidationLtv); - assert(gtConfig.loanConfig.liquidatable == true); - assert(gtConfig.collateral == address(res.collateral)); - assert(gtConfig.debtToken == res.debt); - assert(gtConfig.ft == res.ft); - assert(GearingTokenWithERC20(address(res.gt)).collateralCapacity() == type(uint256).max); - vm.stopPrank(); - } - - function testDeployRepeatedly() public { - vm.startPrank(deployer); - DeployUtils.Res memory res = DeployUtils.deployMarket(deployer, marketConfig, maxLtv, liquidationLtv); - - LoanConfig memory loanConfig = res.gt.getGtConfig().loanConfig; - vm.expectRevert(abi.encodeWithSignature("FailedDeployment()")); - res.factory.createMarket( - DeployUtils.GT_ERC20, - MarketInitialParams({ - collateral: address(res.collateral), - debtToken: res.debt, - admin: deployer, - gtImplementation: address(0), - marketConfig: marketConfig, - loanConfig: loanConfig, - gtInitalParams: abi.encode(type(uint256).max), - tokenName: "test", - tokenSymbol: "test" - }), - 0 - ); - vm.stopPrank(); - } - - function testDeployMarketWithInvalidParams() public { - vm.startPrank(deployer); - TermMaxFactory factory = DeployUtils.deployFactory(deployer); - - MockERC20 collateral = new MockERC20("ETH", "ETH", 18); - MockERC20 debt = new MockERC20("DAI", "DAI", 8); - - MarketInitialParams memory params = MarketInitialParams({ - collateral: address(collateral), - debtToken: debt, - admin: deployer, - gtImplementation: address(0), - marketConfig: marketConfig, - loanConfig: LoanConfig({ - maxLtv: maxLtv, - liquidationLtv: liquidationLtv, - liquidatable: true, - oracle: IOracle(vm.randomAddress()) - }), - gtInitalParams: abi.encode(type(uint256).max), - tokenName: "test", - tokenSymbol: "test" - }); - uint64 maturity = marketConfig.maturity; - vm.warp(maturity + 1 days); - vm.expectRevert(abi.encodeWithSelector(MarketErrors.InvalidMaturity.selector)); - factory.createMarket(DeployUtils.GT_ERC20, params, 0); - - vm.warp(maturity - 1 days); - params.marketConfig.feeConfig.borrowTakerFeeRatio = Constants.MAX_FEE_RATIO; - vm.expectRevert(abi.encodeWithSelector(MarketErrors.FeeTooHigh.selector)); - factory.createMarket(DeployUtils.GT_ERC20, params, 0); - - params.marketConfig.feeConfig.borrowTakerFeeRatio = 0; - params.marketConfig.feeConfig.mintGtFeeRef = uint32(Constants.DECIMAL_BASE * 5 + 1); - vm.expectRevert(abi.encodeWithSelector(MarketErrors.FeeTooHigh.selector)); - factory.createMarket(DeployUtils.GT_ERC20, params, 0); - - params.marketConfig.feeConfig.mintGtFeeRef = 0; - address predictMarketAddress = - factory.predictMarketAddress(deployer, address(collateral), address(debt), maturity, 0); - vm.expectEmit(); - emit GearingTokenEvents.GearingTokenInitialized( - predictMarketAddress, "GT:test", "GT:test", abi.encode(type(uint256).max) - ); - emit GearingTokenWithERC20.CollateralCapacityUpdated(type(uint256).max); - emit FactoryEvents.CreateMarket(predictMarketAddress, address(collateral), debt); - factory.createMarket(DeployUtils.GT_ERC20, params, 0); - vm.stopPrank(); - } - - function testLiquidationLtvMustBeGreaterThanMaxLtv() public { - vm.startPrank(deployer); - TermMaxFactory factory = DeployUtils.deployFactory(deployer); - - MockERC20 collateral = new MockERC20("ETH", "ETH", 18); - MockERC20 debt = new MockERC20("DAI", "DAI", 8); - - maxLtv = 3; - liquidationLtv = 2; - - MarketInitialParams memory params = MarketInitialParams({ - collateral: address(collateral), - debtToken: debt, - admin: deployer, - gtImplementation: address(0), - marketConfig: marketConfig, - loanConfig: LoanConfig({ - maxLtv: maxLtv, - liquidationLtv: liquidationLtv, - liquidatable: true, - oracle: IOracle(vm.randomAddress()) - }), - gtInitalParams: abi.encode(type(uint256).max), - tokenName: "test", - tokenSymbol: "test" - }); - - vm.expectRevert(abi.encodeWithSignature("LiquidationLtvMustBeGreaterThanMaxLtv()")); - factory.createMarket(DeployUtils.GT_ERC20, params, 0); - - vm.stopPrank(); - } - - function testRevertByCantNotFindGtImplementation() public { - vm.startPrank(deployer); - TermMaxFactory factory = DeployUtils.deployFactory(deployer); - - MockERC20 collateral = new MockERC20("ETH", "ETH", 18); - MockERC20 debt = new MockERC20("DAI", "DAI", 8); - - vm.expectRevert(abi.encodeWithSelector(FactoryErrors.CantNotFindGtImplementation.selector)); - factory.createMarket( - bytes32(0), - MarketInitialParams({ - collateral: address(collateral), - debtToken: debt, - admin: deployer, - gtImplementation: address(0), - marketConfig: marketConfig, - loanConfig: LoanConfig({ - maxLtv: maxLtv, - liquidationLtv: liquidationLtv, - liquidatable: true, - oracle: IOracle(vm.randomAddress()) - }), - gtInitalParams: abi.encode(type(uint256).max), - tokenName: "test", - tokenSymbol: "test" - }), - 0 - ); - vm.stopPrank(); - } - - function testSetGtImplement() public { - vm.startPrank(deployer); - TermMaxFactory factory = DeployUtils.deployFactory(deployer); - GearingTokenWithERC20 gt = new GearingTokenWithERC20(); - string memory gtImplemtName = "gt-test"; - bytes32 key = keccak256(abi.encodePacked(gtImplemtName)); - vm.expectEmit(); - emit FactoryEvents.SetGtImplement(key, address(gt)); - factory.setGtImplement(gtImplemtName, address(gt)); - assert(factory.gtImplements(key) == address(gt)); - vm.stopPrank(); - } - - function testSetGtImplementWithoutAuth() public { - address sender = vm.randomAddress(); - vm.startPrank(sender); - TermMaxFactory factory = DeployUtils.deployFactory(deployer); - GearingTokenWithERC20 gt = new GearingTokenWithERC20(); - string memory key = "gt-test"; - - vm.expectRevert(abi.encodePacked(bytes4(keccak256("OwnableUnauthorizedAccount(address)")), abi.encode(sender))); - factory.setGtImplement(key, address(gt)); - - vm.stopPrank(); - } - - function testInvalidMarketImplementation() public { - vm.expectRevert(abi.encodeWithSelector(FactoryErrors.InvalidImplementation.selector)); - new TermMaxFactory(deployer, address(0)); - } -} diff --git a/test/Faucet.t.sol b/test/Faucet.t.sol deleted file mode 100644 index 9e9f9e7..0000000 --- a/test/Faucet.t.sol +++ /dev/null @@ -1,172 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import "forge-std/Test.sol"; -import {Faucet} from "../contracts/test/testnet/Faucet.sol"; -import {FaucetERC20} from "../contracts/test/testnet/FaucetERC20.sol"; -import {MockPriceFeed} from "../contracts/test/MockPriceFeed.sol"; -import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; - -contract FaucetTest is Test { - address deployer = vm.randomAddress(); - address user = vm.randomAddress(); - Faucet faucet; - FaucetERC20 token; - MockPriceFeed priceFeed; - - function setUp() public { - vm.startPrank(deployer); - faucet = new Faucet(deployer); - // faucet.setMintUsdValue(10000); - string memory name = "TestToken"; - string memory symbol = "TT"; - uint8 decimals = 18; - (token, priceFeed) = faucet.addToken(name, symbol, decimals); - priceFeed.updateRoundData( - MockPriceFeed.RoundData({ - roundId: 1, - answer: 200000000, - startedAt: block.timestamp, - updatedAt: block.timestamp, - answeredInRound: 1 - }) - ); - assertEq(token.owner(), address(faucet)); - assertEq(token.name(), name); - assertEq(token.symbol(), symbol); - assertEq(token.decimals(), decimals); - assertEq(faucet.getTokenId(address(token)), 1); - assertEq(faucet.getTokenConfig(1).tokenAddr, address(token)); - assertEq(faucet.getTokenConfig(1).priceFeedAddr, address(priceFeed)); - assertEq(faucet.owner(), deployer); - vm.stopPrank(); - } - - function testSetPriceFeed() public { - vm.startPrank(deployer); - uint256 tokenId = faucet.getTokenId(address(token)); - MockPriceFeed newPriceFeed = new MockPriceFeed(deployer); - faucet.setPriceFeed(tokenId, address(newPriceFeed)); - assertEq(faucet.getTokenConfig(tokenId).priceFeedAddr, address(newPriceFeed)); - vm.stopPrank(); - } - - function testAddToken() public { - vm.startPrank(deployer); - string memory name = "Test Token"; - string memory symbol = "TEST"; - uint8 decimals = 18; - - (token, priceFeed) = faucet.addToken(name, symbol, decimals); - - assertEq(token.name(), name); - assertEq(token.symbol(), symbol); - assertEq(token.decimals(), decimals); - assertEq(token.owner(), address(faucet)); - assertEq(priceFeed.owner(), deployer); - assertEq(faucet.tokenNum(), 2); - assertEq(faucet.getTokenId(address(token)), 2); - vm.stopPrank(); - } - - function testSetCanOnlyMintOnce() public { - vm.startPrank(deployer); - assertEq(faucet.canOnlyMintOnce(), false); - faucet.setCanOnlyMintOnce(true); - assertEq(faucet.canOnlyMintOnce(), true); - vm.stopPrank(); - } - - function testBatchMint() public { - Faucet.TokenConfig memory tokenConfig = faucet.getTokenConfig(1); - uint256 oriBalance = FaucetERC20(tokenConfig.tokenAddr).balanceOf(user); - - priceFeed = MockPriceFeed(tokenConfig.priceFeedAddr); - (, int256 answer,,,) = priceFeed.latestRoundData(); - uint8 tokenDecimals = FaucetERC20(tokenConfig.tokenAddr).decimals(); - uint8 priceFeedDecimals = priceFeed.decimals(); - uint256 mintAmt = (faucet.mintUsdValue() * 10 ** (priceFeedDecimals + tokenDecimals)) / uint256(answer); - - vm.startPrank(user); - faucet.batchMint(); - vm.stopPrank(); - - uint256 newBalance = FaucetERC20(tokenConfig.tokenAddr).balanceOf(user); - assertEq(newBalance, oriBalance + mintAmt); - } - - function testDevBatchMint() public { - address to = vm.randomAddress(); - Faucet.TokenConfig memory tokenConfig = faucet.getTokenConfig(1); - uint256 oriBalance = FaucetERC20(tokenConfig.tokenAddr).balanceOf(to); - - priceFeed = MockPriceFeed(tokenConfig.priceFeedAddr); - (, int256 answer,,,) = priceFeed.latestRoundData(); - uint8 tokenDecimals = FaucetERC20(tokenConfig.tokenAddr).decimals(); - uint8 priceFeedDecimals = priceFeed.decimals(); - uint256 mintAmt = (faucet.mintUsdValue() * 10 ** (priceFeedDecimals + tokenDecimals)) / uint256(answer); - - vm.startPrank(deployer); - faucet.devBatchMint(to); - vm.stopPrank(); - - uint256 newBalance = FaucetERC20(tokenConfig.tokenAddr).balanceOf(to); - assertEq(newBalance, oriBalance + mintAmt); - } - - // function testDevMint() public { - // vm.startPrank(deployer); - // address to = vm.randomAddress(); - // vm.stopPrank(); - // } - - // function testRevertAddTokenExisted() public { - // vm.startPrank(deployer); - // string memory name = "TestToken"; - // string memory symbol = "TT"; - // uint8 decimals = 18; - // uint256 mintAmt = 1000; - // vm.expectRevert(abi.encodeWithSelector(Faucet.TokenExisted.selector, name, symbol, decimals)); - // faucet.addToken(name, symbol, decimals, mintAmt); - // vm.stopPrank(); - // } - - // function testBatchMintTwice() public { - // vm.startPrank(user); - // uint256 mintAmt = faucet.getTokenConfig(faucet.getTokenId(address(token))).mintAmt; - // faucet.batchMint(); - // assertEq(faucet.isMinted(user), true); - // assertEq(token.balanceOf(user), mintAmt); - // faucet.batchMint(); - // assertEq(token.balanceOf(user), mintAmt * 2); - // vm.stopPrank(); - // } - - function testRevertBatchMintOnlyOnce() public { - vm.startPrank(deployer); - faucet.setCanOnlyMintOnce(true); - vm.stopPrank(); - - vm.startPrank(user); - faucet.batchMint(); - assertEq(faucet.isMinted(user), true); - vm.expectRevert(abi.encodeWithSelector(Faucet.OnlyMintOnce.selector)); - faucet.batchMint(); - vm.stopPrank(); - } - - function testRevertDevBatchMintNotByOwner() public { - vm.startPrank(user); - vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, user)); - faucet.devBatchMint(user); - vm.stopPrank(); - } - - // function testRevertDevMintNotByOwner() public { - // vm.startPrank(user); - // uint256 mintAmt = faucet.getTokenConfig(faucet.getTokenId(address(token))).mintAmt; - // vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, user)); - // faucet.devMint(user, address(token), mintAmt); - // vm.stopPrank(); - // } -} diff --git a/test/FuzzActions.t.sol b/test/FuzzActions.t.sol deleted file mode 100644 index be91756..0000000 --- a/test/FuzzActions.t.sol +++ /dev/null @@ -1,224 +0,0 @@ -pragma solidity ^0.8.27; - -import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; -import {TermMaxFactory} from "contracts/factory/TermMaxFactory.sol"; -import {ITermMaxFactory} from "contracts/factory/ITermMaxFactory.sol"; -import {TermMaxRouter} from "contracts/router/TermMaxRouter.sol"; -import {ITermMaxRouter} from "contracts/router/ITermMaxRouter.sol"; -import {TermMaxMarket, Constants, SafeCast} from "contracts/TermMaxMarket.sol"; -import {TermMaxOrder, OrderConfig, ISwapCallback} from "contracts/TermMaxOrder.sol"; -import {MockERC20} from "contracts/test/MockERC20.sol"; -import {MockPriceFeed} from "contracts/test/MockPriceFeed.sol"; -import {MockOrder} from "contracts/test/MockOrder.sol"; -import {IMintableERC20, MintableERC20} from "contracts/tokens/MintableERC20.sol"; -import {SwapAdapter} from "contracts/test/testnet/SwapAdapter.sol"; -import {IOracle, OracleAggregator} from "contracts/oracle/OracleAggregator.sol"; -import {IOrderManager, OrderManager} from "contracts/vault/OrderManager.sol"; -import {ITermMaxVault, TermMaxVault} from "contracts/vault/TermMaxVault.sol"; -import {VaultFactory, IVaultFactory} from "contracts/factory/VaultFactory.sol"; -import { - MarketConfig, - FeeConfig, - MarketInitialParams, - LoanConfig, - VaultInitialParams -} from "contracts/storage/TermMaxStorage.sol"; -import {DeployUtils} from "./utils/DeployUtils.sol"; -import {JSONLoader} from "./utils/JSONLoader.sol"; -import "forge-std/Test.sol"; - -contract FuzzActionsTest is Test { - using JSONLoader for *; - using SafeCast for *; - using DeployUtils for *; - - enum OpType { - BUY_FT, - BUY_XT, - SELL_FT, - SELL_XT, - BUY_EXACT_FT, - BUY_EXACT_XT, - SELL_FT_FOR_EXACT_TOKEN, - SELL_XT_FOR_EXACT_TOKEN - } - - struct Action { - uint256 opType; - uint256 firstAmt; - uint256 ftReserve; - uint256 xtReserve; - uint256 secondAmt; - uint256 fee; - } - - address admin = vm.randomAddress(); - address maker = vm.randomAddress(); - address taker = vm.randomAddress(); - address treasurer = vm.randomAddress(); - - string path = string.concat(vm.projectRoot(), "/test/testdata/fuzzSwap/v2.json"); - - function setUp() public {} - - function _initResources() internal returns (DeployUtils.Res memory res) { - uint32 maxLtv = 0.89e8; - uint32 liquidationLtv = 0.9e8; - string memory entityPath = path; - string memory testdata = vm.readFile(entityPath); - uint256 currentTime = vm.parseJsonUint(testdata, ".currentTime"); - vm.warp(currentTime); - - MarketConfig memory marketConfig = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); - - vm.startPrank(admin); - - res = DeployUtils.deployMarket(admin, marketConfig, maxLtv, liquidationLtv); - - res.orderConfig = JSONLoader.getOrderConfigFromJson(testdata, ".orderConfig"); - - MockSwapCallback afterSwap = new MockSwapCallback(res.ft, res.xt); - res.order = res.market.createOrder(maker, res.orderConfig.maxXtReserve, afterSwap, res.orderConfig.curveCuts); - - uint256 ftReserve = vm.parseJsonUint(testdata, ".orderConfig.ftReserve"); - uint256 xtReserve = vm.parseJsonUint(testdata, ".orderConfig.xtReserve"); - res.debt.mint(admin, ftReserve + xtReserve); - res.debt.approve(address(res.market), ftReserve + xtReserve); - res.market.mint(admin, ftReserve + xtReserve); - res.ft.transfer(address(res.order), ftReserve); - res.xt.transfer(address(res.order), xtReserve); - - vm.stopPrank(); - } - - function _parseActions() internal returns (Action[] memory actions) { - string memory json = vm.readFile(path); - uint256 length = vm.parseJsonUint(json, ".actions.length"); - actions = new Action[](length); - for (uint256 i = 0; i < length; i++) { - string memory key = string.concat(".actions.", vm.toString(i)); - actions[i].opType = vm.parseJsonUint(json, string.concat(key, ".opType")); - actions[i].firstAmt = vm.parseJsonUint(json, string.concat(key, ".firstAmt")); - actions[i].secondAmt = vm.parseJsonUint(json, string.concat(key, ".secondAmt")); - actions[i].ftReserve = vm.parseJsonUint(json, string.concat(key, ".contractState.ftReserve")); - actions[i].xtReserve = vm.parseJsonUint(json, string.concat(key, ".contractState.xtReserve")); - actions[i].fee = vm.parseJsonUint(json, string.concat(key, ".fee")); - } - } - - function testActions() public { - DeployUtils.Res memory res = _initResources(); - Action[] memory actions = _parseActions(); - vm.startPrank(taker); - uint256 max128 = type(uint128).max; - res.debt.mint(taker, max128); - res.debt.approve(address(res.market), max128); - res.market.mint(taker, max128 / 2); - res.debt.approve(address(res.order), max128); - res.ft.approve(address(res.order), max128); - res.xt.approve(address(res.order), max128); - vm.stopPrank(); - - for (uint256 i = 0; i < actions.length; i++) { - _swapToken(res, actions[i]); - } - } - - function _swapToken(DeployUtils.Res memory res, Action memory action) internal { - IERC20 tokenIn; - IERC20 tokenOut; - bool isExact; - if (action.opType == uint256(OpType.BUY_FT)) { - tokenIn = res.debt; - tokenOut = res.ft; - isExact = false; - console.log("buy ft"); - } else if (action.opType == uint256(OpType.BUY_XT)) { - tokenIn = res.debt; - tokenOut = res.xt; - isExact = false; - console.log("buy xt"); - } else if (action.opType == uint256(OpType.SELL_FT)) { - tokenIn = res.ft; - tokenOut = res.debt; - isExact = false; - console.log("sell ft"); - } else if (action.opType == uint256(OpType.SELL_XT)) { - tokenIn = res.xt; - tokenOut = res.debt; - isExact = false; - console.log("sell xt"); - } else if (action.opType == uint256(OpType.BUY_EXACT_FT)) { - tokenIn = res.debt; - tokenOut = res.ft; - isExact = true; - console.log("buy exact ft"); - } else if (action.opType == uint256(OpType.BUY_EXACT_XT)) { - tokenIn = res.debt; - tokenOut = res.xt; - isExact = true; - console.log("buy exact xt"); - } else if (action.opType == uint256(OpType.SELL_FT_FOR_EXACT_TOKEN)) { - tokenIn = res.ft; - tokenOut = res.debt; - isExact = true; - console.log("sell ft for exact token"); - } else if (action.opType == uint256(OpType.SELL_XT_FOR_EXACT_TOKEN)) { - tokenIn = res.xt; - tokenOut = res.debt; - isExact = true; - console.log("sell xt for exact token"); - } - - vm.startPrank(taker); - - uint256 netAmt; - if (isExact) { - netAmt = res.order.swapTokenToExactToken( - tokenIn, tokenOut, taker, uint128(action.firstAmt), type(uint128).max, block.timestamp + 1 hours - ); - } else { - netAmt = res.order.swapExactTokenToToken( - tokenIn, tokenOut, taker, uint128(action.firstAmt), 0, block.timestamp + 1 hours - ); - } - assertEq(netAmt, action.secondAmt, "net amt not as expected"); - assertEq(res.ft.balanceOf(address(res.order)), action.ftReserve); - assertEq(res.xt.balanceOf(address(res.order)), action.xtReserve); - vm.stopPrank(); - } -} - -// Mock contracts for testing -contract MockSwapCallback is ISwapCallback { - using SafeCast for *; - - int256 public deltaFt; - int256 public deltaXt; - int256 ftReserve; - int256 xtReserve; - IERC20 public ft; - IERC20 public xt; - - constructor(IERC20 ft_, IERC20 xt_) { - ft = ft_; - xt = xt_; - } - - function afterSwap(uint256 ftReserve_, uint256 xtReserve_, int256 deltaFt_, int256 deltaXt_) external override { - deltaFt = deltaFt_; - deltaXt = deltaXt_; - if (ftReserve == 0 || xtReserve == 0) { - ftReserve = int256(ftReserve_); - xtReserve = int256(xtReserve_); - return; - } else { - ftReserve += deltaFt; - xtReserve += deltaXt; - require(uint256(ftReserve) == ftReserve_, "ft reserve not as expected"); - require(uint256(xtReserve) == xtReserve_, "xt reserve not as expected"); - } - } -} diff --git a/test/FuzzSwap.t.sol b/test/FuzzSwap.t.sol deleted file mode 100644 index 07309c5..0000000 --- a/test/FuzzSwap.t.sol +++ /dev/null @@ -1,256 +0,0 @@ -pragma solidity ^0.8.27; - -import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; -import {TermMaxFactory} from "contracts/factory/TermMaxFactory.sol"; -import {ITermMaxFactory} from "contracts/factory/ITermMaxFactory.sol"; -import {TermMaxRouter} from "contracts/router/TermMaxRouter.sol"; -import {ITermMaxRouter} from "contracts/router/ITermMaxRouter.sol"; -import {TermMaxMarket, Constants, SafeCast} from "contracts/TermMaxMarket.sol"; -import {TermMaxOrder, OrderConfig, ISwapCallback} from "contracts/TermMaxOrder.sol"; -import {MockERC20} from "contracts/test/MockERC20.sol"; -import {MockPriceFeed} from "contracts/test/MockPriceFeed.sol"; -import {MockOrder} from "contracts/test/MockOrder.sol"; -import {IMintableERC20, MintableERC20} from "contracts/tokens/MintableERC20.sol"; -import {SwapAdapter} from "contracts/test/testnet/SwapAdapter.sol"; -import {IOracle, OracleAggregator} from "contracts/oracle/OracleAggregator.sol"; -import {IOrderManager, OrderManager} from "contracts/vault/OrderManager.sol"; -import {ITermMaxVault, TermMaxVault} from "contracts/vault/TermMaxVault.sol"; -import {VaultFactory, IVaultFactory} from "contracts/factory/VaultFactory.sol"; -import { - MarketConfig, - FeeConfig, - MarketInitialParams, - LoanConfig, - VaultInitialParams -} from "contracts/storage/TermMaxStorage.sol"; -import {DeployUtils} from "./utils/DeployUtils.sol"; -import {JSONLoader} from "./utils/JSONLoader.sol"; -import "forge-std/Test.sol"; - -contract FuzzSwapTest is Test { - using JSONLoader for *; - using SafeCast for *; - using DeployUtils for *; - - uint256 entities; - - address admin = vm.randomAddress(); - address maker = vm.randomAddress(); - address taker = vm.randomAddress(); - address treasurer = vm.randomAddress(); - - string[] indexs = ["0", "1", "2", "3", "4", "5"]; - - function setUp() public { - string memory entitiesData = string.concat(vm.projectRoot(), "/test/testdata/fuzzSwap/entities.json"); - entities = vm.parseJsonUint(vm.readFile(entitiesData), ".entities"); - } - - function _initResources(string memory index) internal returns (DeployUtils.Res memory res) { - uint32 maxLtv = 0.89e8; - uint32 liquidationLtv = 0.9e8; - string memory entityPath = string.concat(vm.projectRoot(), "/test/testdata/fuzzSwap/", index, ".json"); - string memory testdata = vm.readFile(entityPath); - uint256 currentTime = vm.parseJsonUint(testdata, ".currentTime"); - vm.warp(currentTime); - - MarketConfig memory marketConfig = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); - - vm.startPrank(admin); - - res = DeployUtils.deployMarket(admin, marketConfig, maxLtv, liquidationLtv); - - res.orderConfig = JSONLoader.getOrderConfigFromJson(testdata, ".orderConfig"); - - MockSwapCallback afterSwap = new MockSwapCallback(res.ft, res.xt); - - res.order = res.market.createOrder(maker, res.orderConfig.maxXtReserve, afterSwap, res.orderConfig.curveCuts); - - uint256 orderInitialAmount = vm.parseJsonUint(testdata, ".orderInitialAmount"); - res.debt.mint(admin, orderInitialAmount); - res.debt.approve(address(res.market), orderInitialAmount); - res.market.mint(address(res.order), orderInitialAmount); - - res.swapRange = JSONLoader.getSwapRangeFromJson(testdata, ".maxInput"); - - vm.stopPrank(); - } - - function testBuyFt(uint256 index, uint128 tokenAmtIn) public { - console.log("buy ft", index, tokenAmtIn); - vm.assume(index < entities); - DeployUtils.Res memory res = _initResources(indexs[index]); - vm.assume(tokenAmtIn > 0 && tokenAmtIn <= res.swapRange.buyFtMax); - _buyFt(res, tokenAmtIn, 0); - } - - function testBuyXt(uint256 index, uint128 tokenAmtIn) public { - console.log("buy xt", index, tokenAmtIn); - vm.assume(index < entities); - DeployUtils.Res memory res = _initResources(indexs[index]); - vm.assume(tokenAmtIn > 0 && tokenAmtIn <= res.swapRange.buyXtMax); - _buyXt(res, tokenAmtIn, 0); - } - - function testSellFt(uint256 index, uint128 ftAmtIn) public { - console.log("sell ft", index, ftAmtIn); - vm.assume(index < entities); - DeployUtils.Res memory res = _initResources(indexs[index]); - vm.assume(ftAmtIn > 0 && ftAmtIn <= res.swapRange.sellFtMax); - _sellFt(res, ftAmtIn, 0); - } - - function testSellXt(uint256 index, uint128 xtAmtIn) public { - console.log("sell xt", index, xtAmtIn); - vm.assume(index < entities); - DeployUtils.Res memory res = _initResources(indexs[index]); - vm.assume(xtAmtIn > 0 && xtAmtIn <= res.swapRange.sellXtMax); - _sellXt(res, xtAmtIn, 0); - } - - function testBuyExactFt(uint256 index, uint128 ftAmtOut) public { - console.log("buy exact ft", index, ftAmtOut); - vm.assume(index < entities); - DeployUtils.Res memory res = _initResources(indexs[index]); - vm.assume(ftAmtOut > 0 && ftAmtOut <= res.swapRange.buyExactFtMax); - _buyExactFt(res, ftAmtOut, ftAmtOut); - } - - function testBuyExactXt(uint256 index, uint128 xtAmtOut) public { - console.log("buy exact xt", index, xtAmtOut); - vm.assume(index < entities); - DeployUtils.Res memory res = _initResources(indexs[index]); - vm.assume(xtAmtOut > 0 && xtAmtOut <= res.swapRange.buyExactXtMax); - _buyExactXt(res, xtAmtOut, xtAmtOut); - } - - function testSellFtForExactToken(uint256 index, uint128 tokenAmtOut) public { - console.log("sell ft for exact token", index, tokenAmtOut); - vm.assume(index < entities); - DeployUtils.Res memory res = _initResources(indexs[index]); - vm.assume(tokenAmtOut > 0 && tokenAmtOut <= res.swapRange.sellFtForExactTokenMax); - _sellFtForExactToken(res, tokenAmtOut, tokenAmtOut * 10); - } - - function testSellXtForExactToken(uint256 index, uint128 tokenAmtOut) public { - console.log("sell xt for exact token", index, tokenAmtOut); - vm.assume(index < entities); - DeployUtils.Res memory res = _initResources(indexs[index]); - vm.assume(tokenAmtOut > 0 && tokenAmtOut <= res.swapRange.sellXtForExactTokenMax); - _sellXtForExactToken(res, tokenAmtOut, tokenAmtOut * 10000); - } - - function _buyFt(DeployUtils.Res memory res, uint128 tokenAmtIn, uint128 minFtAmtOut) internal { - vm.startPrank(taker); - - res.debt.mint(taker, tokenAmtIn); - res.debt.approve(address(res.order), tokenAmtIn); - - res.order.swapExactTokenToToken(res.debt, res.ft, taker, tokenAmtIn, minFtAmtOut, block.timestamp + 1 hours); - vm.stopPrank(); - } - - function _buyXt(DeployUtils.Res memory res, uint128 tokenAmtIn, uint128 minXtAmtOut) internal { - vm.startPrank(taker); - - res.debt.mint(taker, tokenAmtIn); - res.debt.approve(address(res.order), tokenAmtIn); - - res.order.swapExactTokenToToken(res.debt, res.xt, taker, tokenAmtIn, minXtAmtOut, block.timestamp + 1 hours); - vm.stopPrank(); - } - - function _sellFt(DeployUtils.Res memory res, uint128 ftAmtIn, uint128 minTokenAmtOut) internal { - vm.startPrank(taker); - res.debt.mint(taker, ftAmtIn); - res.debt.approve(address(res.market), ftAmtIn); - res.market.mint(taker, ftAmtIn); - - res.ft.approve(address(res.order), ftAmtIn); - res.order.swapExactTokenToToken(res.ft, res.debt, taker, ftAmtIn, minTokenAmtOut, block.timestamp + 1 hours); - vm.stopPrank(); - } - - function _sellXt(DeployUtils.Res memory res, uint128 xtAmtIn, uint128 minTokenAmtOut) internal { - vm.startPrank(taker); - res.debt.mint(taker, xtAmtIn); - res.debt.approve(address(res.market), xtAmtIn); - res.market.mint(taker, xtAmtIn); - - res.xt.approve(address(res.order), xtAmtIn); - res.order.swapExactTokenToToken(res.xt, res.debt, taker, xtAmtIn, minTokenAmtOut, block.timestamp + 1 hours); - vm.stopPrank(); - } - - function _buyExactFt(DeployUtils.Res memory res, uint128 ftAmtOut, uint128 maxTokenAmtIn) internal { - vm.startPrank(taker); - res.debt.mint(taker, maxTokenAmtIn); - res.debt.approve(address(res.order), maxTokenAmtIn); - res.order.swapTokenToExactToken(res.debt, res.ft, taker, ftAmtOut, maxTokenAmtIn, block.timestamp + 1 hours); - vm.stopPrank(); - } - - function _buyExactXt(DeployUtils.Res memory res, uint128 xtAmtOut, uint128 maxTokenAmtIn) internal { - vm.startPrank(taker); - res.debt.mint(taker, maxTokenAmtIn); - res.debt.approve(address(res.order), maxTokenAmtIn); - res.order.swapTokenToExactToken(res.debt, res.xt, taker, xtAmtOut, maxTokenAmtIn, block.timestamp + 1 hours); - vm.stopPrank(); - } - - function _sellFtForExactToken(DeployUtils.Res memory res, uint128 tokenAmtOut, uint128 maxFtAmtIn) internal { - vm.startPrank(taker); - res.debt.mint(taker, maxFtAmtIn); - res.debt.approve(address(res.market), maxFtAmtIn); - res.market.mint(taker, maxFtAmtIn); - - res.ft.approve(address(res.order), maxFtAmtIn); - res.order.swapTokenToExactToken(res.ft, res.debt, taker, tokenAmtOut, maxFtAmtIn, block.timestamp + 1 hours); - vm.stopPrank(); - } - - function _sellXtForExactToken(DeployUtils.Res memory res, uint128 tokenAmtOut, uint128 maxXtAmtIn) internal { - vm.startPrank(taker); - res.debt.mint(taker, maxXtAmtIn); - res.debt.approve(address(res.market), maxXtAmtIn); - res.market.mint(taker, maxXtAmtIn); - - res.xt.approve(address(res.order), maxXtAmtIn); - res.order.swapTokenToExactToken(res.xt, res.debt, taker, tokenAmtOut, maxXtAmtIn, block.timestamp + 1 hours); - vm.stopPrank(); - } -} - -// Mock contracts for testing -contract MockSwapCallback is ISwapCallback { - using SafeCast for *; - - int256 public deltaFt; - int256 public deltaXt; - int256 ftReserve; - int256 xtReserve; - IERC20 public ft; - IERC20 public xt; - - constructor(IERC20 ft_, IERC20 xt_) { - ft = ft_; - xt = xt_; - } - - function afterSwap(uint256 ftReserve_, uint256 xtReserve_, int256 deltaFt_, int256 deltaXt_) external override { - deltaFt = deltaFt_; - deltaXt = deltaXt_; - if (ftReserve == 0 || xtReserve == 0) { - ftReserve = int256(ftReserve_); - xtReserve = int256(xtReserve_); - return; - } else { - ftReserve += deltaFt; - xtReserve += deltaXt; - require(uint256(ftReserve) == ftReserve_, "ft reserve not as expected"); - require(uint256(xtReserve) == xtReserve_, "xt reserve not as expected"); - } - } -} diff --git a/test/Gt.t.sol b/test/Gt.t.sol deleted file mode 100644 index 1e93bd5..0000000 --- a/test/Gt.t.sol +++ /dev/null @@ -1,1444 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import "forge-std/Test.sol"; -import {console} from "forge-std/console.sol"; -import {DeployUtils} from "./utils/DeployUtils.sol"; -import {JSONLoader} from "./utils/JSONLoader.sol"; -import {StateChecker} from "./utils/StateChecker.sol"; -import {SwapUtils} from "./utils/SwapUtils.sol"; -import {LoanUtils} from "./utils/LoanUtils.sol"; - -import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {Constants} from "contracts/lib/Constants.sol"; -import {ITermMaxMarket, TermMaxMarket, MarketEvents, MarketErrors} from "contracts/TermMaxMarket.sol"; -import {MockFlashLoanReceiver} from "contracts/test/MockFlashLoanReceiver.sol"; -import {MockFlashRepayer} from "contracts/test/MockFlashRepayer.sol"; -import {MockPriceFeed} from "contracts/test/MockPriceFeed.sol"; -import { - IGearingToken, - AbstractGearingToken, - GearingTokenErrors, - GearingTokenEvents -} from "contracts/tokens/AbstractGearingToken.sol"; -import {IMintableERC20} from "contracts/tokens/MintableERC20.sol"; -import {ITermMaxFactory, TermMaxFactory} from "contracts/factory/TermMaxFactory.sol"; -import {IOracle, OracleAggregator, AggregatorV3Interface} from "contracts/oracle/OracleAggregator.sol"; -import "contracts/storage/TermMaxStorage.sol"; - -contract GtTest is Test { - using JSONLoader for *; - using SafeCast for uint256; - using SafeCast for int256; - - DeployUtils.Res res; - - OrderConfig orderConfig; - MarketConfig marketConfig; - - address deployer = vm.randomAddress(); - address sender = vm.randomAddress(); - address treasurer = vm.randomAddress(); - address maker = vm.randomAddress(); - string testdata; - - MockFlashLoanReceiver flashLoanReceiver; - - MockFlashRepayer flashRepayer; - - uint32 maxLtv = 0.89e8; - uint32 liquidationLtv = 0.9e8; - - function setUp() public { - vm.startPrank(deployer); - testdata = vm.readFile(string.concat(vm.projectRoot(), "/test/testdata/testdata.json")); - - marketConfig = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); - orderConfig = JSONLoader.getOrderConfigFromJson(testdata, ".orderConfig"); - orderConfig.maxXtReserve = type(uint128).max; - res = DeployUtils.deployMarket(deployer, marketConfig, maxLtv, liquidationLtv); - - res.order = - res.market.createOrder(maker, orderConfig.maxXtReserve, ISwapCallback(address(0)), orderConfig.curveCuts); - - vm.warp(vm.parseUint(vm.parseJsonString(testdata, ".currentTime"))); - - // update oracle - res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.eth")); - res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.dai")); - - uint256 amount = 15000e8; - res.debt.mint(deployer, amount); - res.debt.approve(address(res.market), amount); - res.market.mint(deployer, amount); - res.ft.transfer(address(res.order), amount); - res.xt.transfer(address(res.order), amount); - - flashLoanReceiver = new MockFlashLoanReceiver(res.market); - flashRepayer = new MockFlashRepayer(res.gt); - - vm.stopPrank(); - } - - function testMintGtByIssueFt() public { - uint128 debtAmt = 100e8; - uint256 collateralAmt = 1e18; - res.collateral.mint(sender, collateralAmt); - - vm.startPrank(sender); - - res.collateral.approve(address(res.gt), collateralAmt); - bytes memory collateralData = abi.encode(collateralAmt); - - StateChecker.MarketState memory state = StateChecker.getMarketState(res); - - uint256 issueFee = (debtAmt * res.market.mintGtFeeRatio()) / Constants.DECIMAL_BASE; - vm.expectEmit(); - emit MarketEvents.IssueFt( - sender, sender, 1, debtAmt, uint128(debtAmt - issueFee), uint128(issueFee), collateralData - ); - - (uint256 gtId, uint128 ftOutAmt) = res.market.issueFt(sender, debtAmt, collateralData); - - assert(ftOutAmt == (debtAmt - issueFee)); - assert(gtId == 1); - - state.collateralReserve += collateralAmt; - StateChecker.checkMarketState(res, state); - - assert(res.ft.balanceOf(marketConfig.treasurer) == issueFee); - assert(res.ft.balanceOf(sender) == ftOutAmt); - - (address owner, uint128 d, bytes memory cd) = res.gt.loanInfo(gtId); - assert(owner == sender); - assert(d == debtAmt); - assert(collateralAmt == abi.decode(cd, (uint256))); - (, uint128 ltv,) = res.gt.getLiquidationInfo(gtId); - assert(LoanUtils.calcLtv(res, debtAmt, collateralAmt) == ltv); - - vm.stopPrank(); - } - - function testMintGtByLeverage() public { - vm.startPrank(sender); - uint256 collateralAmt = 1e18; - bytes memory callbackData = abi.encode(sender, collateralAmt); - res.collateral.mint(address(flashLoanReceiver), collateralAmt); - - uint128 xtAmt = 90e8; - uint256 debtAmt = xtAmt * Constants.DECIMAL_BASE / (Constants.DECIMAL_BASE - res.market.mintGtFeeRatio()); - - uint128 debtAmtInForBuyXt = 5e8; - uint128 minXTOut = 0e8; - res.debt.mint(sender, debtAmtInForBuyXt); - res.debt.approve(address(res.order), debtAmtInForBuyXt); - res.order.swapExactTokenToToken( - res.debt, res.xt, sender, debtAmtInForBuyXt, minXTOut, block.timestamp + 1 hours - ); - StateChecker.MarketState memory state = StateChecker.getMarketState(res); - uint256 xtBefore = res.xt.balanceOf(address(sender)); - - res.xt.approve(address(flashLoanReceiver), xtAmt); - - vm.expectEmit(); - emit MarketEvents.LeverageByXt( - address(flashLoanReceiver), - sender, - 1, - uint128(debtAmt), - xtAmt, - uint128(debtAmt - xtAmt), - abi.encode(collateralAmt) - ); - uint256 gtId = flashLoanReceiver.leverageByXt(xtAmt, callbackData); - - assert(gtId == 1); - state.collateralReserve += collateralAmt; - state.debtReserve -= xtAmt; - StateChecker.checkMarketState(res, state); - - uint256 xtAfter = res.xt.balanceOf(address(sender)); - assert(xtBefore - xtAfter == xtAmt); - - (address owner, uint128 d, bytes memory cd) = res.gt.loanInfo(gtId); - assert(owner == sender); - assert(d == debtAmt); - assert(collateralAmt == abi.decode(cd, (uint256))); - - vm.stopPrank(); - } - - function testMintGtWhenOracleOutdated() public { - uint128 debtAmt = 1000e8; - uint256 collateralAmt = 1e18; - res.collateral.mint(sender, collateralAmt); - - vm.prank(deployer); - res.oracle.submitPendingOracle( - address(res.collateral), IOracle.Oracle(res.collateralOracle, res.collateralOracle, 0, 3600, 3600) - ); - res.oracle.acceptPendingOracle(address(res.collateral)); - vm.warp(block.timestamp + 3600); - - vm.startPrank(sender); - res.collateral.approve(address(res.gt), collateralAmt); - bytes memory collateralData = abi.encode(collateralAmt); - - vm.expectRevert(abi.encodeWithSelector(IOracle.OracleIsNotWorking.selector, address(res.collateral))); - res.market.issueFt(sender, debtAmt, collateralData); - - vm.stopPrank(); - - vm.startPrank(deployer); - res.oracle.submitPendingOracle( - address(res.collateral), IOracle.Oracle(res.collateralOracle, res.collateralOracle, 0, 365 days, 0) - ); - res.oracle.acceptPendingOracle(address(res.collateral)); - vm.stopPrank(); - - vm.startPrank(sender); - res.collateral.approve(address(res.gt), collateralAmt); - res.market.issueFt(sender, debtAmt, collateralData); - - vm.stopPrank(); - } - - function testRevertByGtIsNotHealthyWhenIssueFt() public { - // debt 1790 USD collaretal 2000USD ltv 0.891 - uint128 debtAmt = 1790e8; - uint256 collateralAmt = 1e18; - res.collateral.mint(sender, collateralAmt); - - vm.startPrank(sender); - - res.collateral.approve(address(res.gt), collateralAmt); - bytes memory collateralData = abi.encode(collateralAmt); - - vm.expectRevert( - abi.encodeWithSelector( - GearingTokenErrors.GtIsNotHealthy.selector, 0, sender, LoanUtils.calcLtv(res, debtAmt, collateralAmt) - ) - ); - res.market.issueFt(sender, debtAmt, collateralData); - - vm.stopPrank(); - } - - function testRevertByGtIsNotHealthyWhenCollateralCloseZero() public { - // debt 5 USD collaretal 2e-7 USD - uint128 debtAmt = 5e8; - uint256 collateralAmt = 1; - res.collateral.mint(sender, collateralAmt); - - vm.startPrank(sender); - - res.collateral.approve(address(res.gt), collateralAmt); - bytes memory collateralData = abi.encode(collateralAmt); - - vm.expectRevert( - abi.encodeWithSelector( - GearingTokenErrors.GtIsNotHealthy.selector, 0, sender, LoanUtils.calcLtv(res, debtAmt, collateralAmt) - ) - ); - res.market.issueFt(sender, debtAmt, collateralData); - - vm.stopPrank(); - } - - function testRevertByGtIsNotHealthyWhenLeverage() public { - vm.startPrank(sender); - uint256 collateralAmt = 0.001e18; - bytes memory callbackData = abi.encode(sender, collateralAmt); - res.collateral.mint(address(flashLoanReceiver), collateralAmt); - - uint128 xtAmt = 90e8; - uint256 debtAmt = xtAmt * Constants.DECIMAL_BASE / (Constants.DECIMAL_BASE - res.market.mintGtFeeRatio()); - - uint128 debtAmtInForBuyXt = 5e8; - uint128 minXTOut = 0e8; - res.debt.mint(sender, debtAmtInForBuyXt); - res.debt.approve(address(res.order), debtAmtInForBuyXt); - res.order.swapExactTokenToToken( - res.debt, res.xt, sender, debtAmtInForBuyXt, minXTOut, block.timestamp + 1 hours - ); - - res.xt.approve(address(flashLoanReceiver), xtAmt); - - vm.expectRevert( - abi.encodeWithSelector( - GearingTokenErrors.GtIsNotHealthy.selector, 0, sender, LoanUtils.calcLtv(res, debtAmt, collateralAmt) - ) - ); - flashLoanReceiver.leverageByXt(xtAmt, callbackData); - - vm.stopPrank(); - } - - function testReapyByDebtToken() public { - uint128 debtAmt = 100e8; - uint256 collateralAmt = 1e18; - - vm.startPrank(sender); - - (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); - - res.debt.mint(sender, debtAmt); - - res.debt.approve(address(res.gt), debtAmt); - uint256 collateralBalanceBefore = res.collateral.balanceOf(sender); - uint256 debtBalanceBefore = res.debt.balanceOf(sender); - StateChecker.MarketState memory state = StateChecker.getMarketState(res); - bool byDebtToken = true; - vm.expectEmit(); - emit GearingTokenEvents.Repay(gtId, debtAmt, byDebtToken, true); - res.gt.repay(gtId, debtAmt, byDebtToken); - - uint256 collateralBalanceAfter = res.collateral.balanceOf(sender); - uint256 debtBalanceAfter = res.debt.balanceOf(sender); - state.debtReserve += debtAmt; - state.collateralReserve -= collateralAmt; - StateChecker.checkMarketState(res, state); - - assert(collateralBalanceAfter - collateralBalanceBefore == collateralAmt); - assert(debtBalanceAfter + debtAmt == debtBalanceBefore); - vm.expectRevert(abi.encodePacked(bytes4(keccak256("ERC721NonexistentToken(uint256)")), gtId)); - res.gt.loanInfo(gtId); - - vm.stopPrank(); - } - - function testReapyByFt() public { - uint128 debtAmt = 100e8; - uint256 collateralAmt = 1e18; - - vm.startPrank(sender); - - (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); - - // get FT token - uint128 debtAmtInForBuyFt = 100e8; - uint128 minFTOut = 0e8; - res.debt.mint(sender, debtAmtInForBuyFt); - res.debt.approve(address(res.order), debtAmtInForBuyFt); - res.order.swapExactTokenToToken( - res.debt, res.ft, sender, debtAmtInForBuyFt, minFTOut, block.timestamp + 1 hours - ); - - uint256 collateralBalanceBefore = res.collateral.balanceOf(sender); - uint256 ftBalanceBefore = res.ft.balanceOf(sender); - uint256 ftInMarketBefore = res.ft.balanceOf(address(res.market)); - StateChecker.MarketState memory state = StateChecker.getMarketState(res); - - res.ft.approve(address(res.gt), debtAmt); - - bool byDebtToken = false; - vm.expectEmit(); - emit GearingTokenEvents.Repay(gtId, debtAmt, byDebtToken, true); - res.gt.repay(gtId, debtAmt, byDebtToken); - - uint256 collateralBalanceAfter = res.collateral.balanceOf(sender); - uint256 ftBalanceAfter = res.ft.balanceOf(sender); - uint256 ftInMarketAfter = res.ft.balanceOf(address(res.market)); - state.collateralReserve -= collateralAmt; - StateChecker.checkMarketState(res, state); - assert(ftInMarketAfter - debtAmt == ftInMarketBefore); - assert(collateralBalanceAfter - collateralBalanceBefore == collateralAmt); - assert(ftBalanceAfter + debtAmt == ftBalanceBefore); - vm.expectRevert(abi.encodePacked(bytes4(keccak256("ERC721NonexistentToken(uint256)")), gtId)); - res.gt.loanInfo(gtId); - - vm.stopPrank(); - } - - function testPatriallyReapy() public { - uint128 debtAmt = 100e8; - uint128 repayAmt = 10e8; - uint256 collateralAmt = 1e18; - - vm.startPrank(sender); - - (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); - vm.stopPrank(); - // Repay repayAmt - address thirdPeople = vm.randomAddress(); - res.debt.mint(thirdPeople, debtAmt); - // Repay repayAmt - vm.startPrank(thirdPeople); - res.debt.approve(address(res.gt), debtAmt); - StateChecker.MarketState memory state = StateChecker.getMarketState(res); - - bool byDebtToken = true; - vm.expectEmit(); - emit GearingTokenEvents.Repay(gtId, repayAmt, byDebtToken, false); - res.gt.repay(gtId, repayAmt, byDebtToken); - state.debtReserve += repayAmt; - StateChecker.checkMarketState(res, state); - assert(res.debt.balanceOf(thirdPeople) == debtAmt - repayAmt); - assert(res.collateral.balanceOf(thirdPeople) == 0); - - (address owner, uint128 d, bytes memory cd) = res.gt.loanInfo(gtId); - assert(owner == sender); - assert(d == debtAmt - repayAmt); - assert(collateralAmt == abi.decode(cd, (uint256))); - - // Repay all - uint256 debtBalanceBefore = res.debt.balanceOf(sender); - uint256 collateralBalanceBefore = res.collateral.balanceOf(sender); - - vm.expectEmit(); - emit GearingTokenEvents.Repay(gtId, debtAmt - repayAmt, byDebtToken, true); - res.gt.repay(gtId, debtAmt - repayAmt, byDebtToken); - - state.debtReserve += (debtAmt - repayAmt); - state.collateralReserve -= collateralAmt; - uint256 collateralBalanceAfter = res.collateral.balanceOf(sender); - uint256 debtBalanceAfter = res.debt.balanceOf(sender); - StateChecker.checkMarketState(res, state); - - assert(collateralBalanceAfter - collateralBalanceBefore == collateralAmt); - assert(debtBalanceAfter == debtBalanceBefore); - assert(res.debt.balanceOf(thirdPeople) == 0); - assert(res.collateral.balanceOf(thirdPeople) == 0); - - vm.expectRevert(abi.encodePacked(bytes4(keccak256("ERC721NonexistentToken(uint256)")), gtId)); - res.gt.loanInfo(gtId); - - vm.stopPrank(); - } - - function testFlashRepay() public { - uint128 debtAmt = 100e8; - uint256 collateralAmt = 1e18; - - vm.startPrank(sender); - - (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); - - res.debt.mint(address(flashRepayer), debtAmt); - res.gt.approve(address(flashRepayer), gtId); - - uint256 removedCollateral = 0.5e18; - uint128 repayAmt = 50e8; - uint256 collateralBalanceBefore = res.collateral.balanceOf(sender); - uint256 debtBalanceBefore = res.debt.balanceOf(sender); - StateChecker.MarketState memory state = StateChecker.getMarketState(res); - bool byDebtToken = true; - vm.expectEmit(); - emit GearingTokenEvents.FlashRepay( - gtId, address(flashRepayer), repayAmt, byDebtToken, false, abi.encode(removedCollateral) - ); - flashRepayer.flashRepay(gtId, repayAmt, byDebtToken, abi.encode(removedCollateral)); - - uint256 collateralBalanceAfter = res.collateral.balanceOf(sender); - uint256 debtBalanceAfter = res.debt.balanceOf(sender); - state.debtReserve += repayAmt; - state.collateralReserve -= removedCollateral; - StateChecker.checkMarketState(res, state); - - assertEq(res.collateral.balanceOf(address(flashRepayer)), removedCollateral, "flashRepayer collateral balance"); - assertEq(res.debt.balanceOf(address(flashRepayer)), repayAmt, "flashRepayer debt balance"); - assertEq(collateralBalanceAfter, collateralBalanceBefore, "sender collateral balance"); - assertEq(debtBalanceAfter, debtBalanceBefore, "sender debt balance"); - (address owner, uint128 currentDebt, bytes memory currentCollateral) = res.gt.loanInfo(gtId); - assertEq(owner, sender, "gt owner"); - assertEq(currentDebt, debtAmt - repayAmt, "current debt after repayment"); - assertEq( - collateralAmt - removedCollateral, - abi.decode(currentCollateral, (uint256)), - "current collateral after repayment" - ); - - res.gt.approve(address(flashRepayer), gtId); - flashRepayer.flashRepay(gtId, currentDebt, byDebtToken, currentCollateral); - vm.expectRevert(abi.encodePacked(bytes4(keccak256("ERC721NonexistentToken(uint256)")), gtId)); - res.gt.loanInfo(gtId); - vm.stopPrank(); - } - - function testRevertByGtIsNotHealthyWhenFlashRepay() public { - uint128 debtAmt = 100e8; - uint256 collateralAmt = 1e18; - uint128 repayAmt = 50e8; - - vm.startPrank(sender); - - (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); - res.debt.mint(address(flashRepayer), debtAmt); - res.gt.approve(address(flashRepayer), gtId); - - vm.expectRevert( - abi.encodeWithSelector( - GearingTokenErrors.GtIsNotHealthy.selector, gtId, address(flashRepayer), type(uint128).max - ) - ); - flashRepayer.flashRepay(gtId, repayAmt, true, abi.encode(collateralAmt)); - } - - // function testFlashRepayThroughFt() public { - // uint128 debtAmt = 100e8; - // uint256 collateralAmt = 1e18; - - // vm.startPrank(sender); - - // (uint256 gtId, ) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); - // deal(address(res.ft), address(flashRepayer), debtAmt); - - // res.gt.approve(address(flashRepayer), gtId); - - // uint collateralBalanceBefore = res.collateral.balanceOf(sender); - // uint ftBalanceBefore = res.ft.balanceOf(sender); - // StateChecker.MarketState memory state = StateChecker.getMarketState(res); - // bool byDebtToken = false; - // vm.expectEmit(); - // emit GearingTokenEvents.Repay(gtId, debtAmt, byDebtToken); - // flashRepayer.flashRepay(gtId, byDebtToken); - - // uint collateralBalanceAfter = res.collateral.balanceOf(sender); - // uint ftBalanceAfter = res.ft.balanceOf(sender); - // state.ftReserve += debtAmt; - // state.collateralReserve -= collateralAmt; - // StateChecker.checkMarketState(res, state); - - // assert(res.collateral.balanceOf(address(flashRepayer)) == collateralAmt); - // assert(res.debt.balanceOf(address(flashRepayer)) == 0); - // assert(collateralBalanceAfter == collateralBalanceBefore); - // assert(ftBalanceAfter == ftBalanceBefore); - // vm.expectRevert(abi.encodePacked(bytes4(keccak256("ERC721NonexistentToken(uint256)")), gtId)); - // res.gt.loanInfo(gtId); - - // vm.stopPrank(); - // } - - function testRevertByGtIsExpiredWhenRepay() public { - uint128 debtAmt = 100e8; - uint256 collateralAmt = 1e18; - - vm.startPrank(sender); - - (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); - vm.warp(marketConfig.maturity); - res.debt.mint(sender, debtAmt); - - res.debt.approve(address(res.gt), debtAmt); - - vm.expectRevert(abi.encodeWithSelector(GearingTokenErrors.GtIsExpired.selector, gtId)); - res.gt.repay(gtId, debtAmt, true); - - vm.stopPrank(); - } - - function testRevertByGtIsExpiredWhenFlashRepay() public { - uint128 debtAmt = 100e8; - uint256 collateralAmt = 1e18; - - vm.startPrank(sender); - - (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); - vm.warp(marketConfig.maturity); - res.debt.mint(address(flashRepayer), debtAmt); - res.gt.approve(address(flashRepayer), gtId); - - vm.expectRevert(abi.encodeWithSelector(GearingTokenErrors.GtIsExpired.selector, gtId)); - flashRepayer.flashRepay(gtId, debtAmt, true, abi.encode(collateralAmt)); - } - - function testMerge() public { - uint40[3] memory debts = [100e8, 30e8, 5e8]; - uint64[3] memory collaterals = [1e18, 0.5e18, 0.05e18]; - - vm.startPrank(sender); - - uint256[] memory ids = new uint256[](3); - for (uint256 i = 0; i < ids.length; ++i) { - (ids[i],) = LoanUtils.fastMintGt(res, sender, debts[i], collaterals[i]); - } - StateChecker.MarketState memory state = StateChecker.getMarketState(res); - - vm.expectEmit(); - uint256 newId = 4; - emit GearingTokenEvents.MergeGts(sender, newId, ids); - newId = res.gt.merge(ids); - StateChecker.checkMarketState(res, state); - - (address owner, uint128 d, bytes memory cd) = res.gt.loanInfo(newId); - assert(owner == sender); - assert(d == debts[0] + debts[1] + debts[2]); - assert(collaterals[0] + collaterals[1] + collaterals[2] == abi.decode(cd, (uint256))); - for (uint256 i = 0; i < ids.length; i++) { - vm.expectRevert(abi.encodePacked(bytes4(keccak256("ERC721NonexistentToken(uint256)")), ids[i])); - res.gt.loanInfo(ids[i]); - } - - vm.stopPrank(); - } - - function testRevertByCanNotMergeLoanWithDiffOwnerWhenMerge() public { - uint40[3] memory debts = [100e8, 30e8, 5e8]; - uint64[3] memory collaterals = [1e18, 0.5e18, 0.005e18]; - - vm.startPrank(sender); - - uint256[] memory ids = new uint256[](3); - for (uint256 i = 0; i < ids.length; ++i) { - (ids[i],) = LoanUtils.fastMintGt(res, sender, debts[i], collaterals[i]); - } - vm.stopPrank(); - vm.prank(vm.randomAddress()); - vm.expectRevert( - abi.encodeWithSelector(GearingTokenErrors.CanNotMergeLoanWithDiffOwner.selector, ids[0], sender) - ); - res.gt.merge(ids); - } - - function testAddCollateral() public { - uint128 debtAmt = 1700e8; - uint256 collateralAmt = 1e18; - uint256 addedCollateral = 0.1e18; - - vm.startPrank(sender); - - (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); - vm.stopPrank(); - // Add collateral by third address - address thirdPeople = vm.randomAddress(); - res.collateral.mint(thirdPeople, addedCollateral); - vm.startPrank(thirdPeople); - - res.collateral.approve(address(res.gt), addedCollateral); - - StateChecker.MarketState memory state = StateChecker.getMarketState(res); - - vm.expectEmit(); - emit GearingTokenEvents.AddCollateral(gtId, abi.encode(collateralAmt + addedCollateral)); - res.gt.addCollateral(gtId, abi.encode(addedCollateral)); - - state.collateralReserve += addedCollateral; - StateChecker.checkMarketState(res, state); - assert(res.debt.balanceOf(thirdPeople) == 0); - assert(res.collateral.balanceOf(thirdPeople) == 0); - - (address owner, uint128 d, bytes memory cd) = res.gt.loanInfo(gtId); - assert(owner == sender); - assert(d == debtAmt); - assert(collateralAmt + addedCollateral == abi.decode(cd, (uint256))); - - // Add collateral by self - vm.startPrank(sender); - - res.collateral.mint(sender, addedCollateral); - res.collateral.approve(address(res.gt), addedCollateral); - - res.gt.addCollateral(gtId, abi.encode(addedCollateral)); - vm.stopPrank(); - } - - function testRevertByGtIsExpiredWhenAddCollateral() public { - uint128 debtAmt = 100e8; - uint256 collateralAmt = 1e18; - uint256 addedCollateral = 0.1e18; - - vm.startPrank(sender); - - (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); - - vm.stopPrank(); - - address thirdPeople = vm.randomAddress(); - vm.warp(marketConfig.maturity); - res.collateral.mint(thirdPeople, addedCollateral); - - vm.startPrank(thirdPeople); - res.collateral.approve(address(res.gt), addedCollateral); - - vm.expectRevert(abi.encodeWithSelector(GearingTokenErrors.GtIsExpired.selector, gtId)); - - res.gt.addCollateral(gtId, abi.encode(addedCollateral)); - vm.stopPrank(); - } - - function testRemoveCollateral() public { - uint128 debtAmt = 100e8; - uint256 collateralAmt = 1e18; - uint256 removedCollateral = 0.1e18; - - vm.startPrank(sender); - - (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); - - StateChecker.MarketState memory state = StateChecker.getMarketState(res); - uint256 collateralBlanceBefore = res.collateral.balanceOf(sender); - - vm.expectEmit(); - emit GearingTokenEvents.RemoveCollateral(gtId, abi.encode(collateralAmt - removedCollateral)); - res.gt.removeCollateral(gtId, abi.encode(removedCollateral)); - - state.collateralReserve -= removedCollateral; - StateChecker.checkMarketState(res, state); - - uint256 collateralBlanceAfter = res.collateral.balanceOf(sender); - - assert(collateralBlanceAfter - collateralBlanceBefore == removedCollateral); - - (address owner, uint128 d, bytes memory cd) = res.gt.loanInfo(gtId); - assert(owner == sender); - assert(d == debtAmt); - assert(collateralAmt - removedCollateral == abi.decode(cd, (uint256))); - - vm.stopPrank(); - } - - function testRemoveCollateralWhenOracleOutdated() public { - // debt 100 USD collaretal 2200USD - uint128 debtAmt = 100e8; - uint256 collateralAmt = 1.1e18; - uint256 removedCollateral = 0.1e18; - vm.startPrank(sender); - - (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); - vm.stopPrank(); - - vm.prank(deployer); - res.oracle.submitPendingOracle( - address(res.collateral), IOracle.Oracle(res.collateralOracle, res.collateralOracle, 0, 3500, 3500) - ); - vm.prank(deployer); - res.oracle.acceptPendingOracle(address(res.collateral)); - vm.warp(block.timestamp + 3600); - - vm.expectRevert(abi.encodeWithSelector(IOracle.OracleIsNotWorking.selector, address(res.collateral))); - vm.prank(sender); - res.gt.removeCollateral(gtId, abi.encode(removedCollateral)); - - vm.prank(deployer); - res.oracle.submitPendingOracle( - address(res.collateral), IOracle.Oracle(res.collateralOracle, res.collateralOracle, 0, 0, 0) - ); - vm.prank(deployer); - res.oracle.acceptPendingOracle(address(res.collateral)); - - vm.prank(sender); - res.gt.removeCollateral(gtId, abi.encode(removedCollateral)); - } - - function testRevertByGtIsNotHealthyWhenRemoveCollateral() public { - // debt 1780 USD collaretal 2200USD - uint128 debtAmt = 1790e8; - uint256 collateralAmt = 1.1e18; - uint256 removedCollateral = 0.1e18; - vm.startPrank(sender); - - (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); - - vm.expectRevert( - abi.encodeWithSelector( - GearingTokenErrors.GtIsNotHealthy.selector, - gtId, - sender, - LoanUtils.calcLtv(res, debtAmt, collateralAmt - removedCollateral) - ) - ); - res.gt.removeCollateral(gtId, abi.encode(removedCollateral)); - - vm.stopPrank(); - } - - function testRevertByCallerIsNotTheOwnerWhenRemoveCollateral() public { - // debt 1780 USD collaretal 2200USD - uint128 debtAmt = 1780e8; - uint256 collateralAmt = 1.1e18; - uint256 removedCollateral = 0.1e18; - vm.startPrank(sender); - - (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); - vm.stopPrank(); - - address thirdPeople = vm.randomAddress(); - vm.expectRevert(abi.encodeWithSelector(GearingTokenErrors.CallerIsNotTheOwner.selector, gtId)); - vm.prank(thirdPeople); - res.gt.removeCollateral(gtId, abi.encode(removedCollateral)); - } - - function testRevertByGtIsExpiredWhenRemoveCollateral() public { - // debt 200 USD collaretal 2200USD - uint128 debtAmt = 200e8; - uint256 collateralAmt = 1.1e18; - uint256 removedCollateral = 0.1e18; - vm.startPrank(sender); - - (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); - - vm.stopPrank(); - - vm.warp(marketConfig.maturity); - - vm.expectRevert(abi.encodeWithSelector(GearingTokenErrors.GtIsExpired.selector, gtId)); - vm.prank(sender); - res.gt.removeCollateral(gtId, abi.encode(removedCollateral)); - } - - // Case 1: removed collateral can not cover repayAmt + rewardToLiquidator - function testLiquidateCase1() public { - uint128 debtAmt = 1000e8; - uint256 collateralAmt = 1e18; - - vm.startPrank(sender); - - (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); - vm.stopPrank(); - vm.startPrank(deployer); - // update oracle - res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth")); - res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.dai")); - vm.stopPrank(); - address liquidator = vm.randomAddress(); - vm.startPrank(liquidator); - - res.debt.mint(liquidator, debtAmt); - res.debt.approve(address(res.gt), debtAmt); - - uint256 senderCBalanceBefore = res.collateral.balanceOf(sender); - StateChecker.MarketState memory state = StateChecker.getMarketState(res); - - vm.expectEmit(); - uint256 cToLiquidator = collateralAmt; - uint256 cToTreasurer = 0; - uint256 remainningC = 0; - emit GearingTokenEvents.Liquidate( - gtId, - liquidator, - debtAmt, - true, - abi.encode(cToLiquidator), - abi.encode(cToTreasurer), - abi.encode(remainningC) - ); - - res.gt.liquidate(gtId, debtAmt, true); - state.collateralReserve -= collateralAmt; - state.debtReserve += debtAmt; - StateChecker.checkMarketState(res, state); - - assert(res.collateral.balanceOf(marketConfig.treasurer) == cToTreasurer); - assert(res.collateral.balanceOf(liquidator) == cToLiquidator); - assert(res.collateral.balanceOf(sender) == remainningC + senderCBalanceBefore); - vm.stopPrank(); - } - - // Case 2: removed collateral can cover repayAmt + rewardToLiquidator but not rewardToProtocol - function testLiquidateCase2() public { - uint128 debtAmt = 950e8; - uint256 collateralAmt = 1e18; - - vm.startPrank(sender); - - (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); - vm.stopPrank(); - vm.startPrank(deployer); - // update oracle - res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth")); - res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.dai")); - vm.stopPrank(); - address liquidator = vm.randomAddress(); - vm.startPrank(liquidator); - - res.debt.mint(liquidator, debtAmt); - res.debt.approve(address(res.gt), debtAmt); - - uint256 senderCBalanceBefore = res.collateral.balanceOf(sender); - StateChecker.MarketState memory state = StateChecker.getMarketState(res); - - vm.expectEmit(); - // uint cToLiquidator = 0.9975e18; - // uint cToTreasurer = 0.0025e18; - // uint remainningC = 0; - (uint256 cToLiquidator, uint256 cToTreasurer, uint256 remainningC) = - LoanUtils.calcLiquidationResult(res, debtAmt, collateralAmt, debtAmt); - emit GearingTokenEvents.Liquidate( - gtId, - liquidator, - debtAmt, - true, - abi.encode(cToLiquidator), - abi.encode(cToTreasurer), - abi.encode(remainningC) - ); - - res.gt.liquidate(gtId, debtAmt, true); - state.collateralReserve -= collateralAmt; - state.debtReserve += debtAmt; - StateChecker.checkMarketState(res, state); - - assert(res.collateral.balanceOf(marketConfig.treasurer) == cToTreasurer); - assert(res.collateral.balanceOf(liquidator) == cToLiquidator); - assert(res.collateral.balanceOf(sender) == remainningC + senderCBalanceBefore); - vm.stopPrank(); - } - - // Case 3: removed collateral equal repayAmt + rewardToLiquidator + rewardToProtocol - function testLiquidateCase3() public { - uint128 debtAmt = 900e8; - uint256 collateralAmt = 1e18; - - vm.startPrank(sender); - - (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); - vm.stopPrank(); - vm.startPrank(deployer); - // update oracle - res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth")); - res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.dai")); - vm.stopPrank(); - address liquidator = vm.randomAddress(); - vm.startPrank(liquidator); - - res.debt.mint(liquidator, debtAmt); - res.debt.approve(address(res.gt), debtAmt); - - uint256 senderCBalanceBefore = res.collateral.balanceOf(sender); - StateChecker.MarketState memory state = StateChecker.getMarketState(res); - - vm.expectEmit(); - // uint cToLiquidator = 0.945e18; - // uint cToTreasurer = 0.045e18; - // uint remainningC = 0.01e18; - (uint256 cToLiquidator, uint256 cToTreasurer, uint256 remainningC) = - LoanUtils.calcLiquidationResult(res, debtAmt, collateralAmt, debtAmt); - emit GearingTokenEvents.Liquidate( - gtId, - liquidator, - debtAmt, - true, - abi.encode(cToLiquidator), - abi.encode(cToTreasurer), - abi.encode(remainningC) - ); - - res.gt.liquidate(gtId, debtAmt, true); - state.collateralReserve -= collateralAmt; - state.debtReserve += debtAmt; - StateChecker.checkMarketState(res, state); - - assert(res.collateral.balanceOf(marketConfig.treasurer) == cToTreasurer); - assert(res.collateral.balanceOf(liquidator) == cToLiquidator); - assert(res.collateral.balanceOf(sender) == remainningC + senderCBalanceBefore); - vm.stopPrank(); - } - - function testLiquidateByFt() public { - uint128 debtAmt = 1000e8; - uint256 collateralAmt = 1e18; - - vm.startPrank(sender); - - (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); - vm.stopPrank(); - vm.startPrank(deployer); - // update oracle - res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth")); - res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.dai")); - vm.stopPrank(); - address liquidator = vm.randomAddress(); - vm.startPrank(liquidator); - - res.debt.mint(liquidator, debtAmt); - res.debt.approve(address(res.market), debtAmt); - res.market.mint(liquidator, debtAmt); - res.ft.approve(address(res.gt), debtAmt); - - uint256 senderCBalanceBefore = res.collateral.balanceOf(sender); - StateChecker.MarketState memory state = StateChecker.getMarketState(res); - - vm.expectEmit(); - uint256 cToLiquidator = collateralAmt; - uint256 cToTreasurer = 0; - uint256 remainningC = 0; - emit GearingTokenEvents.Liquidate( - gtId, - liquidator, - debtAmt, - false, - abi.encode(cToLiquidator), - abi.encode(cToTreasurer), - abi.encode(remainningC) - ); - - res.gt.liquidate(gtId, debtAmt, false); - state.collateralReserve -= collateralAmt; - StateChecker.checkMarketState(res, state); - - assert(res.ft.balanceOf(address(res.market)) == debtAmt); - assert(res.collateral.balanceOf(marketConfig.treasurer) == cToTreasurer); - assert(res.collateral.balanceOf(liquidator) == cToLiquidator); - assert(res.collateral.balanceOf(sender) == remainningC + senderCBalanceBefore); - vm.stopPrank(); - } - - function testRemovedCollateralLessThanRepayAmt() public { - uint128 debtAmt = 900e8; - uint256 collateralAmt = 0.93e18; - uint128 repayAmt = 300e8; - vm.startPrank(sender); - - (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); - vm.stopPrank(); - vm.startPrank(deployer); - // update oracle - res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth")); - res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.dai")); - vm.stopPrank(); - address liquidator = vm.randomAddress(); - vm.startPrank(liquidator); - - res.debt.mint(liquidator, repayAmt); - res.debt.approve(address(res.gt), repayAmt); - - uint256 senderCBalanceBefore = res.collateral.balanceOf(sender); - StateChecker.MarketState memory state = StateChecker.getMarketState(res); - - vm.expectEmit(); - // uint cToLiquidator = 0.31e18; - // uint cToTreasurer = 0; - // uint remainningC = 0.62e18; - (uint256 cToLiquidator, uint256 cToTreasurer, uint256 remainningC) = - LoanUtils.calcLiquidationResult(res, debtAmt, collateralAmt, repayAmt); - emit GearingTokenEvents.Liquidate( - gtId, - liquidator, - repayAmt, - true, - abi.encode(cToLiquidator), - abi.encode(cToTreasurer), - abi.encode(remainningC) - ); - - res.gt.liquidate(gtId, repayAmt, true); - state.collateralReserve -= (cToLiquidator + cToTreasurer); - state.debtReserve += repayAmt; - StateChecker.checkMarketState(res, state); - - assert(res.collateral.balanceOf(marketConfig.treasurer) == cToTreasurer); - assert(res.collateral.balanceOf(liquidator) == cToLiquidator); - assert(res.collateral.balanceOf(sender) == senderCBalanceBefore); - vm.stopPrank(); - } - - function testHalfLiquidate() public { - uint128 debtAmt = 9000e8; - uint256 collateralAmt = 10e18; - - vm.startPrank(sender); - - (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); - vm.stopPrank(); - vm.startPrank(deployer); - // update oracle - res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth")); - res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.dai")); - vm.stopPrank(); - (bool isLiquidable,, uint128 maxRepayAmt) = res.gt.getLiquidationInfo(gtId); - assert(isLiquidable); - assert(maxRepayAmt == debtAmt / 2); - address liquidator = vm.randomAddress(); - vm.startPrank(liquidator); - - res.debt.mint(liquidator, maxRepayAmt); - res.debt.approve(address(res.gt), maxRepayAmt); - - uint256 senderCBalanceBefore = res.collateral.balanceOf(sender); - StateChecker.MarketState memory state = StateChecker.getMarketState(res); - - vm.expectEmit(); - // uint cToLiquidator = 4.725e18; - // uint cToTreasurer = 0.225e18; - // uint remainningC = 5.05e18; - (uint256 cToLiquidator, uint256 cToTreasurer, uint256 remainningC) = - LoanUtils.calcLiquidationResult(res, debtAmt, collateralAmt, maxRepayAmt); - emit GearingTokenEvents.Liquidate( - gtId, - liquidator, - maxRepayAmt, - true, - abi.encode(cToLiquidator), - abi.encode(cToTreasurer), - abi.encode(remainningC) - ); - - res.gt.liquidate(gtId, maxRepayAmt, true); - state.collateralReserve -= (cToLiquidator + cToTreasurer); - state.debtReserve += maxRepayAmt; - StateChecker.checkMarketState(res, state); - - assert(res.collateral.balanceOf(marketConfig.treasurer) == cToTreasurer); - assert(res.collateral.balanceOf(liquidator) == cToLiquidator); - assert(res.collateral.balanceOf(sender) == senderCBalanceBefore); - vm.stopPrank(); - - (address owner, uint128 newDebtAmt, bytes memory collateralData) = res.gt.loanInfo(gtId); - assert(owner == sender); - assert(newDebtAmt == debtAmt - maxRepayAmt); - - assert(remainningC == abi.decode(collateralData, (uint256))); - uint128 ltv; - (isLiquidable, ltv, maxRepayAmt) = res.gt.getLiquidationInfo(gtId); - assert(ltv < liquidationLtv); - assert(!isLiquidable); - assert(maxRepayAmt == 0); - } - - function testLiquidateInWindowTime(uint16 exceedTime) public { - vm.assume(exceedTime < Constants.LIQUIDATION_WINDOW); - uint256 liquidateTime = marketConfig.maturity + exceedTime; - uint128 debtAmt = 1000e8; - uint256 collateralAmt = 1e18; - - vm.startPrank(sender); - - (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); - vm.stopPrank(); - vm.startPrank(deployer); - // update oracle - res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth")); - res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.dai")); - vm.stopPrank(); - - vm.warp(liquidateTime); - address liquidator = vm.randomAddress(); - vm.startPrank(liquidator); - - res.debt.mint(liquidator, debtAmt); - res.debt.approve(address(res.gt), debtAmt); - - uint256 senderCBalanceBefore = res.collateral.balanceOf(sender); - StateChecker.MarketState memory state = StateChecker.getMarketState(res); - - vm.expectEmit(); - uint256 cToLiquidator = collateralAmt; - uint256 cToTreasurer = 0; - uint256 remainningC = 0; - emit GearingTokenEvents.Liquidate( - gtId, - liquidator, - debtAmt, - true, - abi.encode(cToLiquidator), - abi.encode(cToTreasurer), - abi.encode(remainningC) - ); - - res.gt.liquidate(gtId, debtAmt, true); - state.collateralReserve -= collateralAmt; - state.debtReserve += debtAmt; - StateChecker.checkMarketState(res, state); - - assert(res.collateral.balanceOf(marketConfig.treasurer) == cToTreasurer); - assert(res.collateral.balanceOf(liquidator) == cToLiquidator); - assert(res.collateral.balanceOf(sender) == remainningC + senderCBalanceBefore); - vm.stopPrank(); - } - - function testLiquidatable() public { - uint128 debtAmt = 10000e8; - uint256 collateralAmt = 10e18; - - vm.startPrank(sender); - - (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); - vm.stopPrank(); - vm.startPrank(deployer); - // update oracle - res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth")); - res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.dai")); - vm.stopPrank(); - - vm.warp(marketConfig.maturity - 1); - (bool isLiquidable,, uint128 maxRepayAmt) = res.gt.getLiquidationInfo(gtId); - assert(isLiquidable); - assert(maxRepayAmt == debtAmt / 2); - - vm.warp(marketConfig.maturity); - (isLiquidable,, maxRepayAmt) = res.gt.getLiquidationInfo(gtId); - assert(isLiquidable); - assert(maxRepayAmt == debtAmt); - - vm.warp(marketConfig.maturity + Constants.LIQUIDATION_WINDOW); - (isLiquidable,, maxRepayAmt) = res.gt.getLiquidationInfo(gtId); - assert(!isLiquidable); - assert(maxRepayAmt == 0); - } - - function testLiquidateWithDecimalsExceed8() public { - uint128 debtAmt = 1e8; - uint256 collateralAmt = 1.01e18; - - vm.startPrank(sender); - - (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); - vm.stopPrank(); - vm.startPrank(deployer); - // update oracle - MockPriceFeed.RoundData memory data = JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth"); - data.answer = 1e18; // eth price 1e8 - res.collateralOracle.updateRoundData(data); - data.answer = 1e8; // dai price 1e18 - res.debtOracle.updateRoundData(data); - vm.stopPrank(); - - vm.warp(marketConfig.maturity + 1); - - address liquidator = vm.randomAddress(); - vm.startPrank(liquidator); - - res.debt.mint(liquidator, debtAmt); - res.debt.approve(address(res.gt), debtAmt); - - uint256 senderCBalanceBefore = res.collateral.balanceOf(sender); - StateChecker.MarketState memory state = StateChecker.getMarketState(res); - - vm.expectEmit(); - (uint256 cToLiquidator, uint256 cToTreasurer, uint256 remainningC) = - LoanUtils.calcLiquidationResult(res, debtAmt, collateralAmt, debtAmt); - emit GearingTokenEvents.Liquidate( - gtId, - liquidator, - debtAmt, - true, - abi.encode(cToLiquidator), - abi.encode(cToTreasurer), - abi.encode(remainningC) - ); - - res.gt.liquidate(gtId, debtAmt, true); - state.collateralReserve -= collateralAmt; - state.debtReserve += debtAmt; - StateChecker.checkMarketState(res, state); - - assert(res.collateral.balanceOf(marketConfig.treasurer) == cToTreasurer); - assert(res.collateral.balanceOf(liquidator) == cToLiquidator); - assert(res.collateral.balanceOf(sender) == remainningC + senderCBalanceBefore); - vm.stopPrank(); - } - - function testLiquidateWhenOracleOutdated() public { - uint128 debtAmt = 1000e8; - uint256 collateralAmt = 1e18; - - vm.startPrank(sender); - - (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); - vm.stopPrank(); - vm.startPrank(deployer); - MockPriceFeed.RoundData memory peth = JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth"); - MockPriceFeed.RoundData memory pdai = JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.dai"); - peth.updatedAt = block.timestamp - 1; - pdai.updatedAt = block.timestamp - 1; - res.collateralOracle.updateRoundData(peth); - res.debtOracle.updateRoundData(pdai); - - vm.stopPrank(); - - vm.prank(deployer); - res.oracle.submitPendingOracle( - address(res.collateral), IOracle.Oracle(res.collateralOracle, res.collateralOracle, 0, 3600, 3600) - ); - res.oracle.acceptPendingOracle(address(res.collateral)); - - vm.warp(block.timestamp + 3600); - address liquidator = vm.randomAddress(); - vm.startPrank(liquidator); - - res.debt.mint(liquidator, debtAmt); - res.debt.approve(address(res.gt), debtAmt); - - vm.expectRevert(abi.encodeWithSelector(IOracle.OracleIsNotWorking.selector, address(res.collateral))); - res.gt.liquidate(gtId, debtAmt, true); - - vm.stopPrank(); - vm.warp(block.timestamp - 1); - vm.prank(liquidator); - res.gt.liquidate(gtId, debtAmt, true); - } - - function testRevertByGtIsSafeWhenLiquidate() public { - uint128 debtAmt = 1000e8; - uint256 collateralAmt = 1e18; - - vm.startPrank(sender); - - (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); - vm.stopPrank(); - - address liquidator = vm.randomAddress(); - vm.startPrank(liquidator); - - res.debt.mint(liquidator, debtAmt); - res.debt.approve(address(res.gt), debtAmt); - - vm.expectRevert(abi.encodeWithSelector(GearingTokenErrors.GtIsSafe.selector, gtId)); - res.gt.liquidate(gtId, debtAmt, true); - - vm.stopPrank(); - } - - function testRevertByCanNotLiquidationAfterFinalDeadline() public { - uint256 liquidateTime = marketConfig.maturity + Constants.LIQUIDATION_WINDOW; - uint128 debtAmt = 1000e8; - uint256 collateralAmt = 1e18; - - vm.startPrank(sender); - - (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); - vm.stopPrank(); - vm.startPrank(deployer); - // update oracle - res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth")); - res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.dai")); - vm.stopPrank(); - - vm.warp(liquidateTime); - address liquidator = vm.randomAddress(); - vm.startPrank(liquidator); - - res.debt.mint(liquidator, debtAmt); - res.debt.approve(address(res.gt), debtAmt); - - vm.expectRevert( - abi.encodeWithSelector( - GearingTokenErrors.CanNotLiquidationAfterFinalDeadline.selector, - gtId, - marketConfig.maturity + Constants.LIQUIDATION_WINDOW - ) - ); - res.gt.liquidate(gtId, debtAmt, true); - } - - function testRevertByRepayAmtExceedsMaxRepayAmt() public { - uint128 debtAmt = 9000e8; - uint256 collateralAmt = 10e18; - - vm.startPrank(sender); - - (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); - vm.stopPrank(); - vm.startPrank(deployer); - // update oracle - res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth")); - res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.dai")); - vm.stopPrank(); - (bool isLiquidable,, uint128 maxRepayAmt) = res.gt.getLiquidationInfo(gtId); - assert(isLiquidable); - assert(maxRepayAmt == debtAmt / 2); - address liquidator = vm.randomAddress(); - vm.startPrank(liquidator); - - uint128 repayAmt = maxRepayAmt + 1; - res.debt.mint(liquidator, repayAmt); - res.debt.approve(address(res.gt), repayAmt); - - vm.expectRevert( - abi.encodeWithSelector(GearingTokenErrors.RepayAmtExceedsMaxRepayAmt.selector, gtId, repayAmt, maxRepayAmt) - ); - res.gt.liquidate(gtId, repayAmt, true); - - vm.stopPrank(); - } - - function testNoRevertByLtvIncreasedAfterLiquidation(uint128 repayAmt) public { - uint128 debtAmt = 900e8; - vm.assume(repayAmt >= 5e8 && repayAmt <= debtAmt - 5e8); - uint256 collateralAmt = 0.6e18; - vm.startPrank(sender); - - (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); - vm.stopPrank(); - vm.startPrank(deployer); - // update oracle - res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth")); - res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.dai")); - vm.stopPrank(); - address liquidator = vm.randomAddress(); - vm.startPrank(liquidator); - - res.debt.mint(liquidator, repayAmt); - res.debt.approve(address(res.gt), repayAmt); - - StateChecker.MarketState memory state = StateChecker.getMarketState(res); - (uint256 cToLiquidator, uint256 cToTreasurer, uint256 remainningC) = - LoanUtils.calcLiquidationResult(res, debtAmt, collateralAmt, repayAmt); - emit GearingTokenEvents.Liquidate( - gtId, - liquidator, - repayAmt, - true, - abi.encode(cToLiquidator), - abi.encode(cToTreasurer), - abi.encode(remainningC) - ); - res.gt.liquidate(gtId, repayAmt, true); - if (repayAmt < debtAmt) { - state.collateralReserve -= (cToLiquidator + cToTreasurer); - } else { - state.collateralReserve -= collateralAmt; - } - state.debtReserve += repayAmt; - StateChecker.checkMarketState(res, state); - - assert(res.collateral.balanceOf(marketConfig.treasurer) == cToTreasurer); - assert(res.collateral.balanceOf(liquidator) == cToLiquidator); - - vm.stopPrank(); - } - - function testFuzzMintGt(uint128 debtAmt, uint128 debtAmt2) public { - uint256 collateralAmt = 1e18; - vm.assume(debtAmt <= 1000e8); - vm.assume(debtAmt2 <= 600e8); - vm.startPrank(sender); - res.collateral.mint(sender, collateralAmt); - bytes memory collateralData = abi.encode(collateralAmt); - res.collateral.approve(address(res.gt), collateralAmt); - (uint256 gtId,) = res.market.issueFt(sender, debtAmt, collateralData); - - res.market.issueFtByExistedGt(sender, debtAmt2, gtId); - vm.stopPrank(); - } - - function testLiquidateZeroDebt() public { - uint256 collateralAmt = 1e18; - uint128 debtAmt = 0; - vm.startPrank(sender); - res.collateral.mint(sender, collateralAmt); - bytes memory collateralData = abi.encode(collateralAmt); - res.collateral.approve(address(res.gt), collateralAmt); - (uint256 gtId,) = res.market.issueFt(sender, debtAmt, collateralData); - vm.stopPrank(); - - address liquidator = vm.randomAddress(); - uint128 repayAmt = 0; - vm.startPrank(liquidator); - vm.expectRevert(abi.encodeWithSelector(GearingTokenErrors.GtIsSafe.selector, gtId)); - res.gt.liquidate(gtId, repayAmt, true); - - vm.warp(marketConfig.maturity); - res.gt.liquidate(gtId, repayAmt, true); - - assertEq(res.collateral.balanceOf(liquidator), 0); - assertEq(res.collateral.balanceOf(marketConfig.treasurer), 0); - assertEq(res.debt.balanceOf(sender), debtAmt); - vm.stopPrank(); - } - - function testRepayZeroDebt() public { - uint256 collateralAmt = 1e18; - uint128 debtAmt = 0; - vm.startPrank(sender); - res.collateral.mint(sender, collateralAmt); - bytes memory collateralData = abi.encode(collateralAmt); - res.collateral.approve(address(res.gt), collateralAmt); - (uint256 gtId,) = res.market.issueFt(sender, debtAmt, collateralData); - - res.gt.repay(gtId, 0, true); - assertEq(res.collateral.balanceOf(sender), collateralAmt); - vm.stopPrank(); - } -} diff --git a/test/LinkedList.t.sol b/test/LinkedList.t.sol deleted file mode 100644 index f265c30..0000000 --- a/test/LinkedList.t.sol +++ /dev/null @@ -1,69 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import "forge-std/Test.sol"; -import "contracts/lib/LinkedList.sol"; - -contract LinkedListTest is Test { - using LinkedList for mapping(uint64 => uint64); - - mapping(uint64 => uint64) list; - - function setUp() public { - // Reset list before each test - list[0] = 0; - } - - function testInsertIntoEmptyList() public { - list.insertWhenZeroAsRoot(5); - assertEq(list[0], 5, "First element should be 5"); - assertEq(list[5], 0, "Next element should be 0"); - } - - function testInsertMultipleOrdered() public { - list.insertWhenZeroAsRoot(5); - list.insertWhenZeroAsRoot(3); - list.insertWhenZeroAsRoot(7); - - // Check order: 3 -> 5 -> 7 - assertEq(list[0], 3, "First element should be 3"); - assertEq(list[3], 5, "Second element should be 5"); - assertEq(list[5], 7, "Third element should be 7"); - assertEq(list[7], 0, "Last element should point to 0"); - } - - function testInsertDuplicate() public { - list.insertWhenZeroAsRoot(5); - list.insertWhenZeroAsRoot(5); // Should be ignored - - assertEq(list[0], 5, "First element should still be 5"); - assertEq(list[5], 0, "Should still point to 0"); - } - - function testPopFromEmptyList() public { - list.popWhenZeroAsRoot(); - assertEq(list[0], 0, "Empty list should remain empty"); - } - - function testPopSingleElement() public { - list.insertWhenZeroAsRoot(5); - list.popWhenZeroAsRoot(); - - assertEq(list[0], 0, "List should be empty after pop"); - assertTrue(list[5] == 0, "Popped element should be cleared"); - } - - function testPopFromMultipleElements() public { - list.insertWhenZeroAsRoot(5); - list.insertWhenZeroAsRoot(3); - list.insertWhenZeroAsRoot(7); - - list.popWhenZeroAsRoot(); - - // After popping 3, should be: 5 -> 7 - assertEq(list[0], 5, "New first element should be 5"); - assertEq(list[5], 7, "Second element should be 7"); - assertEq(list[7], 0, "Last element should point to 0"); - assertTrue(list[3] == 0, "Popped element should be cleared"); - } -} diff --git a/test/Market.t.sol b/test/Market.t.sol deleted file mode 100644 index b96a80c..0000000 --- a/test/Market.t.sol +++ /dev/null @@ -1,413 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import "forge-std/Test.sol"; -import {console} from "forge-std/console.sol"; -import {DeployUtils} from "./utils/DeployUtils.sol"; -import {JSONLoader} from "./utils/JSONLoader.sol"; -import {StateChecker} from "./utils/StateChecker.sol"; -import {SwapUtils} from "./utils/SwapUtils.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; -import {IFlashLoanReceiver} from "contracts/IFlashLoanReceiver.sol"; -import {ITermMaxMarket, TermMaxMarket, Constants, MarketEvents, MarketErrors} from "contracts/TermMaxMarket.sol"; -import {ITermMaxOrder, TermMaxOrder, ISwapCallback, OrderEvents} from "contracts/TermMaxOrder.sol"; -import {MockERC20, ERC20} from "contracts/test/MockERC20.sol"; -import {MockPriceFeed} from "contracts/test/MockPriceFeed.sol"; -import {MockFlashLoanReceiver} from "contracts/test/MockFlashLoanReceiver.sol"; -import {IGearingToken} from "contracts/tokens/IGearingToken.sol"; -import "contracts/storage/TermMaxStorage.sol"; - -contract MarketTest is Test { - using JSONLoader for *; - - DeployUtils.Res res; - - OrderConfig orderConfig; - MarketConfig marketConfig; - - address deployer = vm.randomAddress(); - address maker = vm.randomAddress(); - address sender = vm.randomAddress(); - address treasurer = vm.randomAddress(); - string testdata; - - function setUp() public { - vm.startPrank(deployer); - testdata = vm.readFile(string.concat(vm.projectRoot(), "/test/testdata/testdata.json")); - - uint32 maxLtv = 0.89e8; - uint32 liquidationLtv = 0.9e8; - - marketConfig = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); - orderConfig = JSONLoader.getOrderConfigFromJson(testdata, ".orderConfig"); - res = DeployUtils.deployMarket(deployer, marketConfig, maxLtv, liquidationLtv); - - res.order = - res.market.createOrder(maker, orderConfig.maxXtReserve, ISwapCallback(address(0)), orderConfig.curveCuts); - - vm.warp(vm.parseUint(vm.parseJsonString(testdata, ".currentTime"))); - - // update oracle - res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.eth")); - res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.dai")); - - vm.stopPrank(); - } - - function testUpdateMarketConfig() public { - vm.startPrank(deployer); - marketConfig.treasurer = vm.randomAddress(); - marketConfig.feeConfig.mintGtFeeRatio = 0.02e8; - marketConfig.feeConfig.borrowTakerFeeRatio = 0.03e8; - marketConfig.feeConfig.borrowMakerFeeRatio = 0.04e8; - marketConfig.feeConfig.lendTakerFeeRatio = 0.05e8; - marketConfig.feeConfig.lendMakerFeeRatio = 0.06e8; - - vm.expectEmit(); - emit MarketEvents.UpdateMarketConfig(marketConfig); - res.market.updateMarketConfig(marketConfig); - - assertEq(res.market.config().treasurer, marketConfig.treasurer); - assertEq(res.gt.getGtConfig().treasurer, marketConfig.treasurer); - assertEq(res.market.config().feeConfig.mintGtFeeRatio, marketConfig.feeConfig.mintGtFeeRatio); - assertEq(res.market.config().feeConfig.borrowTakerFeeRatio, marketConfig.feeConfig.borrowTakerFeeRatio); - assertEq(res.market.config().feeConfig.borrowMakerFeeRatio, marketConfig.feeConfig.borrowMakerFeeRatio); - assertEq(res.market.config().feeConfig.lendTakerFeeRatio, marketConfig.feeConfig.lendTakerFeeRatio); - assertEq(res.market.config().feeConfig.lendMakerFeeRatio, marketConfig.feeConfig.lendMakerFeeRatio); - - vm.stopPrank(); - } - - function testUpdateMarketConfigWhenNotOwner() public { - vm.startPrank(sender); - marketConfig.treasurer = vm.randomAddress(); - vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, address(sender))); - res.market.updateMarketConfig(marketConfig); - vm.stopPrank(); - } - - function testUpdateOrderConfigInvalidParams() public { - vm.startPrank(deployer); - - MarketConfig memory newConfig = res.market.config(); - newConfig.feeConfig.mintGtFeeRef = uint32(Constants.DECIMAL_BASE * 5 + 1); - vm.expectRevert(abi.encodeWithSelector(MarketErrors.FeeTooHigh.selector)); - res.market.updateMarketConfig(newConfig); - - newConfig.feeConfig.mintGtFeeRef = 0; - newConfig.feeConfig.borrowMakerFeeRatio = uint32(Constants.MAX_FEE_RATIO); - vm.expectRevert(abi.encodeWithSelector(MarketErrors.FeeTooHigh.selector)); - res.market.updateMarketConfig(newConfig); - vm.stopPrank(); - } - - function testMint() public { - vm.startPrank(sender); - uint256 amount = 150e8; - res.debt.mint(sender, amount); - res.debt.approve(address(res.market), amount); - - emit MarketEvents.Mint(sender, sender, amount); - res.market.mint(sender, amount); - - assertEq(res.debt.balanceOf(sender), 0); - assertEq(res.ft.balanceOf(sender), amount); - assertEq(res.xt.balanceOf(sender), amount); - assertEq(res.debt.balanceOf(address(res.market)), amount); - - vm.stopPrank(); - } - - function testMintWhenTermIsNotOpen() public { - vm.startPrank(sender); - uint256 amount = 150e8; - res.debt.mint(sender, amount); - res.debt.approve(address(res.market), amount); - - vm.warp(marketConfig.maturity); - vm.expectRevert(abi.encodeWithSelector(MarketErrors.TermIsNotOpen.selector)); - res.market.mint(sender, amount); - - vm.stopPrank(); - } - - function testBurn() public { - vm.startPrank(sender); - uint256 amount = 150e8; - res.debt.mint(sender, amount); - res.debt.approve(address(res.market), amount); - res.market.mint(sender, amount); - - emit MarketEvents.Burn(sender, sender, amount); - res.market.burn(sender, sender, amount); - assertEq(res.debt.balanceOf(sender), amount); - assertEq(res.ft.balanceOf(sender), 0); - assertEq(res.xt.balanceOf(sender), 0); - assertEq(res.debt.balanceOf(address(res.market)), 0); - vm.stopPrank(); - } - - function testBurnWhenTermIsNotOpen() public { - vm.startPrank(sender); - uint256 amount = 150e8; - res.debt.mint(sender, amount); - res.debt.approve(address(res.market), amount); - vm.warp(marketConfig.maturity); - vm.expectRevert(abi.encodeWithSelector(MarketErrors.TermIsNotOpen.selector)); - res.market.burn(sender, sender, amount); - vm.stopPrank(); - } - - function testIssueFt() public { - vm.startPrank(sender); - uint128 debtAmt = 1000e8; - res.debt.mint(sender, debtAmt); - res.debt.approve(address(res.market), debtAmt); - res.market.mint(sender, debtAmt); - - uint256 fee = (res.market.mintGtFeeRatio() * debtAmt) / Constants.DECIMAL_BASE; - uint256 collateralAmt = 1e18; - res.collateral.mint(sender, collateralAmt); - res.collateral.approve(address(res.gt), collateralAmt); - vm.expectEmit(); - emit MarketEvents.IssueFt( - sender, sender, 1, debtAmt, uint128(debtAmt - fee), uint128(fee), abi.encode(collateralAmt) - ); - (uint256 gtId, uint128 ftOutAmt) = res.market.issueFt(sender, debtAmt, abi.encode(collateralAmt)); - - assertEq(gtId, 1); - assertEq(res.debt.balanceOf(sender), 0); - assertEq(debtAmt - fee, ftOutAmt); - assertEq(res.ft.balanceOf(sender), ftOutAmt + debtAmt); - assertEq(res.collateral.balanceOf(address(res.gt)), collateralAmt); - assertEq(res.debt.balanceOf(address(res.market)), debtAmt); - - (address owner, uint128 dAmt, bytes memory collateralData) = res.gt.loanInfo(gtId); - assertEq(owner, sender); - assertEq(dAmt, debtAmt); - - assertEq(abi.decode(collateralData, (uint256)), collateralAmt); - - vm.stopPrank(); - } - - function testIssueFtByExistGt() public { - vm.startPrank(sender); - uint128 debtAmt = 1000e8; - - uint256 collateralAmt = 1e18; - res.collateral.mint(sender, collateralAmt); - res.collateral.approve(address(res.gt), collateralAmt); - (uint256 gtId, uint128 ftOutAmt) = res.market.issueFt(sender, debtAmt, abi.encode(collateralAmt)); - - uint128 debtAmt2 = debtAmt / 2; - uint256 fee = (res.market.mintGtFeeRatio() * debtAmt2) / Constants.DECIMAL_BASE; - vm.expectEmit(); - emit MarketEvents.IssueFtByExistedGt(sender, sender, gtId, debtAmt2, uint128(debtAmt2 - fee), uint128(fee)); - uint256 ftOutAmt2 = res.market.issueFtByExistedGt(sender, debtAmt2, gtId); - - assertEq(res.ft.balanceOf(sender), ftOutAmt + ftOutAmt2); - (address owner, uint128 dAmt, bytes memory collateralData) = res.gt.loanInfo(gtId); - assertEq(owner, sender); - assertEq(dAmt, debtAmt + debtAmt2); - assertEq(abi.decode(collateralData, (uint256)), collateralAmt); - vm.stopPrank(); - } - - function testIssueFtByExistedGtWhenTermIsNotOpen() public { - vm.startPrank(sender); - uint128 debtAmt = 1000e8; - - vm.warp(marketConfig.maturity); - vm.expectRevert(abi.encodeWithSelector(MarketErrors.TermIsNotOpen.selector)); - res.market.issueFtByExistedGt(sender, debtAmt, 1); - vm.stopPrank(); - } - - function testIssueFtWhenTermIsNotOpen() public { - vm.startPrank(sender); - uint128 debtAmt = 1000e8; - - vm.warp(marketConfig.maturity); - vm.expectRevert(abi.encodeWithSelector(MarketErrors.TermIsNotOpen.selector)); - res.market.issueFt(sender, debtAmt, abi.encode(1e18)); - vm.stopPrank(); - } - - function testLeverage() public { - uint128 xtAmt = 1000e8; - uint256 collateralAmt = 1e18; - vm.startPrank(deployer); - res.debt.mint(deployer, xtAmt); - res.debt.approve(address(res.market), xtAmt); - res.market.mint(deployer, xtAmt); - res.xt.transfer(sender, xtAmt); - vm.stopPrank(); - - vm.startPrank(sender); - MockFlashLoanReceiver receiver = new MockFlashLoanReceiver(res.market); - res.xt.approve(address(receiver), xtAmt); - - res.collateral.mint(address(receiver), collateralAmt); - - uint256 debtAmt = xtAmt * Constants.DECIMAL_BASE / (Constants.DECIMAL_BASE - res.market.mintGtFeeRatio()); - - vm.expectEmit(); - emit MarketEvents.LeverageByXt( - address(receiver), sender, 1, uint128(debtAmt), xtAmt, uint128(debtAmt - xtAmt), abi.encode(collateralAmt) - ); - receiver.leverageByXt(xtAmt, abi.encode(sender, collateralAmt)); - - assertEq(res.debt.balanceOf(sender), 0); - assertEq(res.debt.balanceOf(address(res.market)), 0); - assertEq(res.debt.balanceOf(address(receiver)), xtAmt); - assertEq(res.xt.balanceOf(sender), 0); - - (address owner, uint128 dAmt, bytes memory collateralData) = res.gt.loanInfo(1); - assertEq(owner, sender); - - assertEq(dAmt, uint128(debtAmt)); - - assertEq(abi.decode(collateralData, (uint256)), collateralAmt); - - vm.stopPrank(); - } - - function testLeverageWhenTermIsNotOpen() public { - uint128 debtAmt = 1000e8; - uint256 collateralAmt = 1e18; - vm.startPrank(deployer); - res.debt.mint(deployer, debtAmt); - res.debt.approve(address(res.market), debtAmt); - res.market.mint(deployer, debtAmt); - res.xt.transfer(sender, debtAmt); - vm.stopPrank(); - - vm.startPrank(sender); - MockFlashLoanReceiver receiver = new MockFlashLoanReceiver(res.market); - res.xt.approve(address(receiver), debtAmt); - - vm.warp(marketConfig.maturity); - vm.expectRevert(abi.encodeWithSelector(MarketErrors.TermIsNotOpen.selector)); - receiver.leverageByXt(debtAmt, abi.encode(sender, collateralAmt)); - vm.stopPrank(); - } - - function testCreateOrder() public { - vm.startPrank(sender); - - vm.expectEmit(); - emit OrderEvents.OrderInitialized( - res.market, sender, orderConfig.maxXtReserve, ISwapCallback(address(0)), orderConfig.curveCuts - ); - ITermMaxOrder order = - res.market.createOrder(sender, orderConfig.maxXtReserve, ISwapCallback(address(0)), orderConfig.curveCuts); - assertEq(address(order.market()), address(res.market)); - assertEq(Ownable(address(order)).owner(), sender); - assertEq(order.orderConfig().maxXtReserve, orderConfig.maxXtReserve); - assertEq(order.maker(), sender); - - vm.stopPrank(); - } - - function testCreateOrderWhenTermIsNotOpen() public { - vm.startPrank(sender); - vm.warp(marketConfig.maturity); - vm.expectRevert(abi.encodeWithSelector(MarketErrors.TermIsNotOpen.selector)); - res.market.createOrder(sender, orderConfig.maxXtReserve, ISwapCallback(address(0)), orderConfig.curveCuts); - vm.stopPrank(); - } - - function testRedeem() public { - address bob = vm.randomAddress(); - address alice = vm.randomAddress(); - - uint128 depositAmt = 1000e8; - uint128 debtAmt = 100e8; - uint256 collateralAmt = 1e18; - - vm.startPrank(bob); - res.debt.mint(bob, depositAmt); - res.debt.approve(address(res.market), depositAmt); - res.market.mint(bob, depositAmt); - - res.xt.transfer(alice, debtAmt); - vm.stopPrank(); - - vm.startPrank(alice); - - MockFlashLoanReceiver receiver = new MockFlashLoanReceiver(res.market); - res.collateral.mint(address(receiver), collateralAmt); - - res.xt.approve(address(receiver), debtAmt); - receiver.leverageByXt(debtAmt, abi.encode(alice, collateralAmt)); - uint128 leverageFee = - uint128(debtAmt * Constants.DECIMAL_BASE / (Constants.DECIMAL_BASE - res.market.mintGtFeeRatio())) - debtAmt; - vm.stopPrank(); - - vm.warp(marketConfig.maturity + Constants.LIQUIDATION_WINDOW); - - vm.startPrank(bob); - res.ft.approve(address(res.market), depositAmt); - - (uint256 expectDebt, bytes memory collateralData) = res.market.previewRedeem(depositAmt); - vm.expectEmit(); - uint128 proportion = uint128(Constants.DECIMAL_BASE_SQ) * depositAmt / (depositAmt + leverageFee); - emit MarketEvents.Redeem(bob, bob, proportion, uint128(expectDebt), collateralData); - res.market.redeem(bob, bob, depositAmt); - uint256 expectCollateral = abi.decode(collateralData, (uint256)); - - assertEq(res.debt.balanceOf(bob), expectDebt); - assertEq(res.collateral.balanceOf(bob), expectCollateral); - assertEq(res.debt.balanceOf(address(res.market)), (depositAmt - debtAmt) - expectDebt); - assertEq(res.collateral.balanceOf(address(res.gt)), collateralAmt - expectCollateral); - assertEq(res.ft.balanceOf(bob), 0); - vm.stopPrank(); - } - - function testRedeemBeforeDeadline() public { - uint128 depositAmt = 1000e8; - - vm.startPrank(sender); - res.debt.mint(sender, depositAmt); - res.debt.approve(address(res.market), depositAmt); - res.market.mint(sender, depositAmt); - - res.ft.approve(address(res.market), depositAmt); - uint256 deadline = marketConfig.maturity + Constants.LIQUIDATION_WINDOW; - vm.warp(deadline - 1); - vm.expectRevert( - abi.encodeWithSelector(MarketErrors.CanNotRedeemBeforeFinalLiquidationDeadline.selector, deadline) - ); - res.market.redeem(sender, sender, depositAmt); - - vm.warp(marketConfig.maturity - 1); - vm.expectRevert( - abi.encodeWithSelector(MarketErrors.CanNotRedeemBeforeFinalLiquidationDeadline.selector, deadline) - ); - res.market.redeem(sender, sender, depositAmt); - - vm.stopPrank(); - } - - function testFuzzIssueFtByExistedGtDebtAmount(uint128 issueAmount) public { - vm.assume(issueAmount >= 1); - vm.assume(issueAmount <= type(uint64).max); - - uint128 debt = - uint128((issueAmount * Constants.DECIMAL_BASE) / (Constants.DECIMAL_BASE - res.market.mintGtFeeRatio())); - - vm.startPrank(sender); - - uint256 collateralAmt = type(uint128).max; - bytes memory collateralData = abi.encode(collateralAmt); - res.collateral.mint(sender, collateralAmt); - res.collateral.approve(address(res.gt), collateralAmt); - res.market.issueFt(sender, issueAmount, collateralData); - - uint128 ftOutAmt = res.market.issueFtByExistedGt(sender, debt, 1); - assertTrue(ftOutAmt == issueAmount); - vm.stopPrank(); - } -} diff --git a/test/OracleAggregator.t.sol b/test/OracleAggregator.t.sol deleted file mode 100644 index 67d32b0..0000000 --- a/test/OracleAggregator.t.sol +++ /dev/null @@ -1,647 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {Test} from "forge-std/Test.sol"; -import {OracleAggregator} from "../contracts/oracle/OracleAggregator.sol"; -import {AggregatorV3Interface, IOracle} from "../contracts/oracle/IOracle.sol"; -import {MockPriceFeed} from "../contracts/test/MockPriceFeed.sol"; - -contract OracleAggregatorTest is Test { - OracleAggregator public oracleAggregator; - MockPriceFeed public primaryFeed; - MockPriceFeed public backupFeed; - - address public constant OWNER = address(0x1); - address public constant ASSET = address(0x2); - uint256 public constant TIMELOCK = 1 days; - uint32 public constant HEARTBEAT = 1 hours; - uint32 public constant BACKUP_HEARTBEAT = 2 hours; - int256 public constant MAX_PRICE = 10000e8; - - // Price feed configuration - uint8 public constant DECIMALS = 8; - int256 public constant INITIAL_PRICE = 3000e8; - - function setUp() public { - // Deploy mock price feeds - primaryFeed = new MockPriceFeed(OWNER); - backupFeed = new MockPriceFeed(OWNER); - - // Set initial price data - MockPriceFeed.RoundData memory roundData = MockPriceFeed.RoundData({ - roundId: 1, - answer: INITIAL_PRICE, - startedAt: block.timestamp, - updatedAt: block.timestamp, - answeredInRound: 1 - }); - - vm.startPrank(OWNER); - primaryFeed.updateRoundData(roundData); - backupFeed.updateRoundData(roundData); - vm.stopPrank(); - - // Deploy OracleAggregator with owner and timelock - vm.prank(OWNER); - oracleAggregator = new OracleAggregator(OWNER, TIMELOCK); - } - - function test_SubmitPendingOracle() public { - IOracle.Oracle memory oracle = IOracle.Oracle({ - aggregator: primaryFeed, - backupAggregator: backupFeed, - heartbeat: HEARTBEAT, - backupHeartbeat: BACKUP_HEARTBEAT, - maxPrice: MAX_PRICE - }); - - vm.prank(OWNER); - oracleAggregator.submitPendingOracle(ASSET, oracle); - - // Access the Oracle struct directly from the mapping - ( - AggregatorV3Interface aggregator, - AggregatorV3Interface backupAggregator, - int256 maxPrice, - uint32 heartbeat, - uint32 backupHeartbeat - ) = oracleAggregator.oracles(ASSET); - assertEq(address(aggregator), address(0), "Oracle should not be set yet"); - assertEq(address(backupAggregator), address(0), "Backup oracle should not be set yet"); - assertEq(heartbeat, 0, "Heartbeat should not be set yet"); - assertEq(backupHeartbeat, 0, "Backup heartbeat should not be set yet"); - assertEq(maxPrice, 0, "Max price should not be set yet"); - - (IOracle.Oracle memory pendingOracle, uint64 validAt) = oracleAggregator.pendingOracles(ASSET); - assertEq(address(pendingOracle.aggregator), address(primaryFeed)); - assertEq(address(pendingOracle.backupAggregator), address(backupFeed)); - assertEq(pendingOracle.heartbeat, HEARTBEAT); - assertEq(pendingOracle.backupHeartbeat, BACKUP_HEARTBEAT); - assertEq(pendingOracle.maxPrice, MAX_PRICE); - assertEq(validAt, block.timestamp + TIMELOCK); - } - - function test_AcceptPendingOracle() public { - // Submit pending oracle - IOracle.Oracle memory oracle = IOracle.Oracle({ - aggregator: primaryFeed, - backupAggregator: backupFeed, - heartbeat: HEARTBEAT, - backupHeartbeat: BACKUP_HEARTBEAT, - maxPrice: MAX_PRICE - }); - - vm.prank(OWNER); - oracleAggregator.submitPendingOracle(ASSET, oracle); - - // Warp time past timelock - vm.warp(block.timestamp + TIMELOCK + 1); - - oracleAggregator.acceptPendingOracle(ASSET); - - // Access the Oracle struct directly from the mapping - ( - AggregatorV3Interface aggregator, - AggregatorV3Interface backupAggregator, - int256 maxPrice, - uint32 heartbeat, - uint32 backupHeartbeat - ) = oracleAggregator.oracles(ASSET); - assertEq(address(aggregator), address(primaryFeed)); - assertEq(address(backupAggregator), address(backupFeed)); - assertEq(heartbeat, HEARTBEAT); - assertEq(backupHeartbeat, BACKUP_HEARTBEAT); - assertEq(maxPrice, MAX_PRICE); - - // Verify pending oracle is cleared - (IOracle.Oracle memory pendingOracle, uint64 validAt) = oracleAggregator.pendingOracles(ASSET); - assertEq(address(pendingOracle.aggregator), address(0)); - assertEq(address(pendingOracle.backupAggregator), address(0)); - assertEq(pendingOracle.heartbeat, 0); - assertEq(pendingOracle.backupHeartbeat, 0); - assertEq(pendingOracle.maxPrice, 0); - assertEq(validAt, 0); - } - - function test_GetPrice_PrimaryOracle() public { - // Setup oracle - IOracle.Oracle memory oracle = IOracle.Oracle({ - aggregator: primaryFeed, - backupAggregator: backupFeed, - heartbeat: HEARTBEAT, - backupHeartbeat: BACKUP_HEARTBEAT, - maxPrice: MAX_PRICE - }); - - vm.startPrank(OWNER); - oracleAggregator.submitPendingOracle(ASSET, oracle); - vm.warp(block.timestamp + TIMELOCK + 1); - vm.stopPrank(); - - oracleAggregator.acceptPendingOracle(ASSET); - - // Update primary oracle timestamp to match current time - MockPriceFeed.RoundData memory roundData = MockPriceFeed.RoundData({ - roundId: 1, - answer: INITIAL_PRICE, - startedAt: block.timestamp, - updatedAt: block.timestamp, - answeredInRound: 1 - }); - vm.prank(OWNER); - primaryFeed.updateRoundData(roundData); - - // Get price - (uint256 price, uint8 decimals) = oracleAggregator.getPrice(ASSET); - assertEq(price, uint256(INITIAL_PRICE)); - assertEq(decimals, DECIMALS); - } - - function test_GetPrice_FallbackToBackup() public { - // Setup oracle - IOracle.Oracle memory oracle = IOracle.Oracle({ - aggregator: primaryFeed, - backupAggregator: backupFeed, - heartbeat: HEARTBEAT, - backupHeartbeat: BACKUP_HEARTBEAT, - maxPrice: MAX_PRICE - }); - - vm.startPrank(OWNER); - oracleAggregator.submitPendingOracle(ASSET, oracle); - vm.warp(block.timestamp + TIMELOCK + 1); - vm.stopPrank(); - - oracleAggregator.acceptPendingOracle(ASSET); - - // Make primary oracle stale - vm.warp(block.timestamp + HEARTBEAT + 1); - - // Update backup price - int256 backupPrice = 3100e8; - MockPriceFeed.RoundData memory roundData = MockPriceFeed.RoundData({ - roundId: 2, - answer: backupPrice, - startedAt: block.timestamp, - updatedAt: block.timestamp, - answeredInRound: 2 - }); - vm.prank(OWNER); - backupFeed.updateRoundData(roundData); - - // Get price - should use backup - (uint256 price, uint8 decimals) = oracleAggregator.getPrice(ASSET); - assertEq(price, uint256(backupPrice)); - assertEq(decimals, DECIMALS); - } - - function test_RevertGetPrice_BothOraclesStale() public { - // Setup oracle - IOracle.Oracle memory oracle = IOracle.Oracle({ - aggregator: primaryFeed, - backupAggregator: backupFeed, - heartbeat: HEARTBEAT, - backupHeartbeat: BACKUP_HEARTBEAT, - maxPrice: MAX_PRICE - }); - - vm.startPrank(OWNER); - oracleAggregator.submitPendingOracle(ASSET, oracle); - vm.warp(block.timestamp + TIMELOCK + 1); - vm.stopPrank(); - - oracleAggregator.acceptPendingOracle(ASSET); - - // Make both oracles stale - vm.warp(block.timestamp + HEARTBEAT + 1); - - vm.expectRevert(abi.encodeWithSignature("OracleIsNotWorking(address)", ASSET)); - // Should revert - oracleAggregator.getPrice(ASSET); - } - - function test_RevertSubmitPendingOracle_NotOwner() public { - IOracle.Oracle memory oracle = IOracle.Oracle({ - aggregator: primaryFeed, - backupAggregator: backupFeed, - heartbeat: HEARTBEAT, - backupHeartbeat: BACKUP_HEARTBEAT, - maxPrice: MAX_PRICE - }); - - vm.prank(address(0x3)); - vm.expectRevert(abi.encodeWithSignature("OwnableUnauthorizedAccount(address)", address(0x3))); - oracleAggregator.submitPendingOracle(ASSET, oracle); - } - - function test_RevertAcceptPendingOracle_BeforeTimelock() public { - // Submit pending oracle - IOracle.Oracle memory oracle = IOracle.Oracle({ - aggregator: primaryFeed, - backupAggregator: backupFeed, - heartbeat: HEARTBEAT, - backupHeartbeat: BACKUP_HEARTBEAT, - maxPrice: MAX_PRICE - }); - - vm.prank(OWNER); - oracleAggregator.submitPendingOracle(ASSET, oracle); - vm.expectRevert(abi.encodeWithSignature("TimelockNotElapsed()")); - // Try to accept before timelock expires - oracleAggregator.acceptPendingOracle(ASSET); - } - - function test_RemoveOracle() public { - // First add an oracle - IOracle.Oracle memory oracle = IOracle.Oracle({ - aggregator: primaryFeed, - backupAggregator: backupFeed, - heartbeat: HEARTBEAT, - backupHeartbeat: BACKUP_HEARTBEAT, - maxPrice: MAX_PRICE - }); - - vm.startPrank(OWNER); - oracleAggregator.submitPendingOracle(ASSET, oracle); - vm.warp(block.timestamp + TIMELOCK + 1); - vm.stopPrank(); - - oracleAggregator.acceptPendingOracle(ASSET); - - // Now remove it by submitting empty oracle - vm.prank(OWNER); - oracleAggregator.submitPendingOracle( - ASSET, - IOracle.Oracle({ - aggregator: AggregatorV3Interface(address(0)), - backupAggregator: AggregatorV3Interface(address(0)), - heartbeat: 0, - backupHeartbeat: 0, - maxPrice: 0 - }) - ); - - // Verify oracle is removed - ( - AggregatorV3Interface aggregator, - AggregatorV3Interface backupAggregator, - int256 maxPrice, - uint32 heartbeat, - uint32 backupHeartbeat - ) = oracleAggregator.oracles(ASSET); - assertEq(address(aggregator), address(0)); - assertEq(address(backupAggregator), address(0)); - assertEq(heartbeat, 0); - assertEq(backupHeartbeat, 0); - assertEq(maxPrice, 0); - } - - function test_GetPrice_PrimaryExceedsMaxPrice_NoBackup() public { - // Create an oracle with maxPrice and no backup - IOracle.Oracle memory oracle = IOracle.Oracle({ - aggregator: primaryFeed, - backupAggregator: AggregatorV3Interface(address(0)), - heartbeat: HEARTBEAT, - backupHeartbeat: 0, - maxPrice: MAX_PRICE - }); - - vm.startPrank(OWNER); - oracleAggregator.submitPendingOracle(ASSET, oracle); - vm.warp(block.timestamp + TIMELOCK + 1); - vm.stopPrank(); - - oracleAggregator.acceptPendingOracle(ASSET); - - // Set primary price above maxPrice - int256 highPrice = MAX_PRICE + 1000e8; - MockPriceFeed.RoundData memory roundData = MockPriceFeed.RoundData({ - roundId: 2, - answer: highPrice, - startedAt: block.timestamp, - updatedAt: block.timestamp, - answeredInRound: 2 - }); - vm.prank(OWNER); - primaryFeed.updateRoundData(roundData); - - // Get price - should return maxPrice instead of actual price - (uint256 price, uint8 decimals) = oracleAggregator.getPrice(ASSET); - assertEq(price, uint256(MAX_PRICE)); - assertEq(decimals, DECIMALS); - } - - function test_GetPrice_PrimaryExceedsMaxPrice_WithBackup() public { - // Create an oracle with maxPrice - IOracle.Oracle memory oracle = IOracle.Oracle({ - aggregator: primaryFeed, - backupAggregator: backupFeed, - heartbeat: HEARTBEAT, - backupHeartbeat: BACKUP_HEARTBEAT, - maxPrice: MAX_PRICE - }); - - vm.startPrank(OWNER); - oracleAggregator.submitPendingOracle(ASSET, oracle); - vm.warp(block.timestamp + TIMELOCK + 1); - vm.stopPrank(); - - oracleAggregator.acceptPendingOracle(ASSET); - - // Set primary price above maxPrice - int256 highPrice = MAX_PRICE + 1000e8; - MockPriceFeed.RoundData memory primaryRoundData = MockPriceFeed.RoundData({ - roundId: 2, - answer: highPrice, - startedAt: block.timestamp, - updatedAt: block.timestamp, - answeredInRound: 2 - }); - - // Set backup price below maxPrice - int256 validBackupPrice = MAX_PRICE - 1000e8; - MockPriceFeed.RoundData memory backupRoundData = MockPriceFeed.RoundData({ - roundId: 2, - answer: validBackupPrice, - startedAt: block.timestamp, - updatedAt: block.timestamp, - answeredInRound: 2 - }); - - vm.startPrank(OWNER); - primaryFeed.updateRoundData(primaryRoundData); - backupFeed.updateRoundData(backupRoundData); - vm.stopPrank(); - - // Get price - should fallback to backup oracle - (uint256 price, uint8 decimals) = oracleAggregator.getPrice(ASSET); - assertEq(price, uint256(validBackupPrice)); - assertEq(decimals, DECIMALS); - } - - function test_GetPrice_BothExceedMaxPrice() public { - // Create an oracle with maxPrice - IOracle.Oracle memory oracle = IOracle.Oracle({ - aggregator: primaryFeed, - backupAggregator: backupFeed, - heartbeat: HEARTBEAT, - backupHeartbeat: BACKUP_HEARTBEAT, - maxPrice: MAX_PRICE - }); - - vm.startPrank(OWNER); - oracleAggregator.submitPendingOracle(ASSET, oracle); - vm.warp(block.timestamp + TIMELOCK + 1); - vm.stopPrank(); - - oracleAggregator.acceptPendingOracle(ASSET); - - // Set both primary and backup prices above maxPrice - int256 highPrimaryPrice = MAX_PRICE + 1000e8; - MockPriceFeed.RoundData memory primaryRoundData = MockPriceFeed.RoundData({ - roundId: 2, - answer: highPrimaryPrice, - startedAt: block.timestamp, - updatedAt: block.timestamp, - answeredInRound: 2 - }); - - int256 highBackupPrice = MAX_PRICE + 500e8; - MockPriceFeed.RoundData memory backupRoundData = MockPriceFeed.RoundData({ - roundId: 2, - answer: highBackupPrice, - startedAt: block.timestamp, - updatedAt: block.timestamp, - answeredInRound: 2 - }); - - vm.startPrank(OWNER); - primaryFeed.updateRoundData(primaryRoundData); - backupFeed.updateRoundData(backupRoundData); - vm.stopPrank(); - - // Get price - should use backup capped at maxPrice - (uint256 price, uint8 decimals) = oracleAggregator.getPrice(ASSET); - assertEq(price, uint256(MAX_PRICE)); - assertEq(decimals, DECIMALS); - } - - function test_GetPrice_WithMaxPriceZero_PrimaryOracle() public { - // Create an oracle with maxPrice set to 0 (no price cap) - IOracle.Oracle memory oracle = IOracle.Oracle({ - aggregator: primaryFeed, - backupAggregator: backupFeed, - heartbeat: HEARTBEAT, - backupHeartbeat: BACKUP_HEARTBEAT, - maxPrice: 0 // No price cap - }); - - vm.startPrank(OWNER); - oracleAggregator.submitPendingOracle(ASSET, oracle); - vm.warp(block.timestamp + TIMELOCK + 1); - vm.stopPrank(); - - oracleAggregator.acceptPendingOracle(ASSET); - - // Set very high price that would normally exceed any reasonable cap - int256 extremelyHighPrice = 1000000e8; // 1 million units - MockPriceFeed.RoundData memory roundData = MockPriceFeed.RoundData({ - roundId: 2, - answer: extremelyHighPrice, - startedAt: block.timestamp, - updatedAt: block.timestamp, - answeredInRound: 2 - }); - vm.prank(OWNER); - primaryFeed.updateRoundData(roundData); - - // Get price - should return the full price without capping - (uint256 price, uint8 decimals) = oracleAggregator.getPrice(ASSET); - assertEq(price, uint256(extremelyHighPrice)); - assertEq(decimals, DECIMALS); - } - - function test_GetPrice_WithMaxPriceZero_FallbackToBackup() public { - // Create an oracle with maxPrice set to 0 (no price cap) - IOracle.Oracle memory oracle = IOracle.Oracle({ - aggregator: primaryFeed, - backupAggregator: backupFeed, - heartbeat: HEARTBEAT, - backupHeartbeat: BACKUP_HEARTBEAT, - maxPrice: 0 // No price cap - }); - - vm.startPrank(OWNER); - oracleAggregator.submitPendingOracle(ASSET, oracle); - vm.warp(block.timestamp + TIMELOCK + 1); - vm.stopPrank(); - - oracleAggregator.acceptPendingOracle(ASSET); - - // Make primary oracle stale - vm.warp(block.timestamp + HEARTBEAT + 1); - - // Set very high price on backup oracle - int256 extremelyHighBackupPrice = 2000000e8; // 2 million units - MockPriceFeed.RoundData memory roundData = MockPriceFeed.RoundData({ - roundId: 2, - answer: extremelyHighBackupPrice, - startedAt: block.timestamp, - updatedAt: block.timestamp, - answeredInRound: 2 - }); - vm.prank(OWNER); - backupFeed.updateRoundData(roundData); - - // Get price - should return the full backup price without capping - (uint256 price, uint8 decimals) = oracleAggregator.getPrice(ASSET); - assertEq(price, uint256(extremelyHighBackupPrice)); - assertEq(decimals, DECIMALS); - } - - function test_GetPrice_NoBackupAggregator() public { - // Create an oracle with no backup aggregator - IOracle.Oracle memory oracle = IOracle.Oracle({ - aggregator: primaryFeed, - backupAggregator: AggregatorV3Interface(address(0)), - heartbeat: HEARTBEAT, - backupHeartbeat: 0, - maxPrice: MAX_PRICE - }); - - vm.startPrank(OWNER); - oracleAggregator.submitPendingOracle(ASSET, oracle); - vm.warp(block.timestamp + TIMELOCK + 1); - vm.stopPrank(); - - oracleAggregator.acceptPendingOracle(ASSET); - - // Set normal price - int256 newPrice = 3200e8; - MockPriceFeed.RoundData memory roundData = MockPriceFeed.RoundData({ - roundId: 2, - answer: newPrice, - startedAt: block.timestamp, - updatedAt: block.timestamp, - answeredInRound: 2 - }); - vm.prank(OWNER); - primaryFeed.updateRoundData(roundData); - - // Get price - should return the primary price - (uint256 price, uint8 decimals) = oracleAggregator.getPrice(ASSET); - assertEq(price, uint256(newPrice)); - assertEq(decimals, DECIMALS); - } - - function test_RevertGetPrice_NoBackupAggregator_PrimaryStale() public { - // Create an oracle with no backup aggregator - IOracle.Oracle memory oracle = IOracle.Oracle({ - aggregator: primaryFeed, - backupAggregator: AggregatorV3Interface(address(0)), - heartbeat: HEARTBEAT, - backupHeartbeat: 0, - maxPrice: MAX_PRICE - }); - - vm.startPrank(OWNER); - oracleAggregator.submitPendingOracle(ASSET, oracle); - vm.warp(block.timestamp + TIMELOCK + 1); - vm.stopPrank(); - - oracleAggregator.acceptPendingOracle(ASSET); - - // Make primary oracle stale - vm.warp(block.timestamp + HEARTBEAT + 1); - - // Should revert since primary is stale and no backup exists - vm.expectRevert(abi.encodeWithSignature("OracleIsNotWorking(address)", ASSET)); - oracleAggregator.getPrice(ASSET); - } - - function test_RevertSubmitPendingOracle_DecimalMismatch() public { - // Create another mock feed with different decimals - MockPriceFeed differentDecimalsFeed = new MockPriceFeed(OWNER); - vm.startPrank(OWNER); - differentDecimalsFeed.setDecimals(DECIMALS + 2); // Different decimal precision - - // Set initial price data on the different decimals feed - MockPriceFeed.RoundData memory roundData = MockPriceFeed.RoundData({ - roundId: 1, - answer: INITIAL_PRICE, - startedAt: block.timestamp, - updatedAt: block.timestamp, - answeredInRound: 1 - }); - differentDecimalsFeed.updateRoundData(roundData); - vm.stopPrank(); - - // Try to set an oracle with mismatched decimals - IOracle.Oracle memory oracle = IOracle.Oracle({ - aggregator: primaryFeed, - backupAggregator: differentDecimalsFeed, - heartbeat: HEARTBEAT, - backupHeartbeat: BACKUP_HEARTBEAT, - maxPrice: MAX_PRICE - }); - - vm.prank(OWNER); - vm.expectRevert(abi.encodeWithSignature("InvalidAssetOrOracle()")); - oracleAggregator.submitPendingOracle(ASSET, oracle); - } - - function test_RevokePendingOracle() public { - // First submit a pending oracle - IOracle.Oracle memory oracle = IOracle.Oracle({ - aggregator: primaryFeed, - backupAggregator: backupFeed, - heartbeat: HEARTBEAT, - backupHeartbeat: BACKUP_HEARTBEAT, - maxPrice: MAX_PRICE - }); - - vm.prank(OWNER); - oracleAggregator.submitPendingOracle(ASSET, oracle); - - // Verify the pending oracle was set - (IOracle.Oracle memory pendingOracle, uint64 validAt) = oracleAggregator.pendingOracles(ASSET); - assertEq(address(pendingOracle.aggregator), address(primaryFeed)); - assertEq(validAt, block.timestamp + TIMELOCK); - - // Now revoke it - vm.prank(OWNER); - oracleAggregator.revokePendingOracle(ASSET); - - // Verify it was revoked - (pendingOracle, validAt) = oracleAggregator.pendingOracles(ASSET); - assertEq(address(pendingOracle.aggregator), address(0)); - assertEq(validAt, 0); - } - - function test_RevertRevokePendingOracle_NoPending() public { - // Try to revoke when there's no pending oracle - vm.prank(OWNER); - vm.expectRevert(abi.encodeWithSignature("NoPendingValue()")); - oracleAggregator.revokePendingOracle(ASSET); - } - - function test_RevertRevokePendingOracle_NotOwner() public { - // First submit a pending oracle - IOracle.Oracle memory oracle = IOracle.Oracle({ - aggregator: primaryFeed, - backupAggregator: backupFeed, - heartbeat: HEARTBEAT, - backupHeartbeat: BACKUP_HEARTBEAT, - maxPrice: MAX_PRICE - }); - - vm.prank(OWNER); - oracleAggregator.submitPendingOracle(ASSET, oracle); - - // Try to revoke from non-owner account - address nonOwner = address(0x123); - vm.prank(nonOwner); - vm.expectRevert(abi.encodeWithSignature("OwnableUnauthorizedAccount(address)", nonOwner)); - oracleAggregator.revokePendingOracle(ASSET); - } -} diff --git a/test/Order.t.sol b/test/Order.t.sol deleted file mode 100644 index db24350..0000000 --- a/test/Order.t.sol +++ /dev/null @@ -1,847 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import "forge-std/Test.sol"; -import {console} from "forge-std/console.sol"; -import {DeployUtils} from "./utils/DeployUtils.sol"; -import {LoanUtils} from "./utils/LoanUtils.sol"; -import {JSONLoader} from "./utils/JSONLoader.sol"; -import {StateChecker} from "./utils/StateChecker.sol"; -import {SwapUtils} from "./utils/SwapUtils.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; -import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; -import {IFlashLoanReceiver} from "contracts/IFlashLoanReceiver.sol"; -import {ITermMaxMarket, TermMaxMarket, Constants, MarketEvents, MarketErrors} from "contracts/TermMaxMarket.sol"; -import {ITermMaxOrder, TermMaxOrder, ISwapCallback, OrderEvents, OrderErrors} from "contracts/TermMaxOrder.sol"; -import {MockERC20, ERC20} from "contracts/test/MockERC20.sol"; -import {MockPriceFeed} from "contracts/test/MockPriceFeed.sol"; -import {MockFlashLoanReceiver} from "contracts/test/MockFlashLoanReceiver.sol"; -import {IGearingToken} from "contracts/tokens/IGearingToken.sol"; -import "contracts/storage/TermMaxStorage.sol"; - -contract OrderTest is Test { - using JSONLoader for *; - using SafeCast for *; - - DeployUtils.Res res; - - OrderConfig orderConfig; - MarketConfig marketConfig; - - address deployer = vm.randomAddress(); - address maker = vm.randomAddress(); - address sender = vm.randomAddress(); - address treasurer = vm.randomAddress(); - string testdata; - - function setUp() public { - vm.startPrank(deployer); - testdata = vm.readFile(string.concat(vm.projectRoot(), "/test/testdata/testdata.json")); - - uint32 maxLtv = 0.89e8; - uint32 liquidationLtv = 0.9e8; - - marketConfig = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); - orderConfig = JSONLoader.getOrderConfigFromJson(testdata, ".orderConfig"); - - res = DeployUtils.deployMarket(deployer, marketConfig, maxLtv, liquidationLtv); - - res.order = - res.market.createOrder(maker, orderConfig.maxXtReserve, ISwapCallback(address(0)), orderConfig.curveCuts); - - vm.warp(vm.parseUint(vm.parseJsonString(testdata, ".currentTime"))); - - // update oracle - res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.eth")); - res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.dai")); - - uint256 amount = 150e8; - res.debt.mint(deployer, amount); - res.debt.approve(address(res.market), amount); - res.market.mint(deployer, amount); - res.ft.transfer(address(res.order), amount); - res.xt.transfer(address(res.order), amount); - - vm.stopPrank(); - } - - function testInvalidCurveCuts() public { - vm.startPrank(maker); - { - OrderConfig memory newOrderConfig = orderConfig; - newOrderConfig.curveCuts.lendCurveCuts[0].offset = 0; - vm.expectRevert(abi.encodeWithSelector(OrderErrors.InvalidCurveCuts.selector)); - res.order.updateOrder(newOrderConfig, 0, 0); - } - - { - OrderConfig memory newOrderConfig = orderConfig; - newOrderConfig.curveCuts.borrowCurveCuts[0].offset = 0; - vm.expectRevert(abi.encodeWithSelector(OrderErrors.InvalidCurveCuts.selector)); - res.order.updateOrder(newOrderConfig, 0, 0); - } - - { - OrderConfig memory newOrderConfig = orderConfig; - newOrderConfig.curveCuts.borrowCurveCuts[1].offset = 0; - vm.expectRevert(abi.encodeWithSelector(OrderErrors.InvalidCurveCuts.selector)); - res.order.updateOrder(newOrderConfig, 0, 0); - } - - vm.stopPrank(); - } - - function testBuyFt() public { - vm.startPrank(sender); - - uint128 underlyingAmtIn = 100e8; - uint128 minTokenOut = 0e8; - res.debt.mint(sender, underlyingAmtIn); - res.debt.approve(address(res.order), underlyingAmtIn); - - uint256 actualOut = vm.parseUint(vm.parseJsonString(testdata, ".expected.testBuyFt.output.netOut")); - uint256 fee = vm.parseUint(vm.parseJsonString(testdata, ".expected.testBuyFt.output.fee")); - StateChecker.OrderState memory expectedState = - JSONLoader.getOrderStateFromJson(testdata, ".expected.testBuyFt.contractState"); - vm.expectEmit(); - emit OrderEvents.SwapExactTokenToToken( - res.debt, res.ft, sender, sender, underlyingAmtIn, uint128(actualOut), uint128(fee) - ); - uint256 netOut = res.order.swapExactTokenToToken( - res.debt, res.ft, sender, underlyingAmtIn, minTokenOut, block.timestamp + 1 hours - ); - - StateChecker.checkOrderState(res, expectedState); - - assert(netOut == actualOut); - assert(res.ft.balanceOf(sender) == netOut); - - vm.stopPrank(); - } - - function testBuyFtMinTokenOut() public { - vm.startPrank(sender); - - uint128 expectedNetOut = - uint128(vm.parseUint(vm.parseJsonString(testdata, ".expected.testBuyFt.output.netOut"))); - uint128 underlyingAmtIn = 100e8; - uint128 minTokenOut = expectedNetOut + 1; - - res.debt.mint(sender, underlyingAmtIn); - res.debt.approve(address(res.order), underlyingAmtIn); - vm.expectRevert(abi.encodeWithSelector(OrderErrors.UnexpectedAmount.selector, minTokenOut, expectedNetOut)); - res.order.swapExactTokenToToken( - res.debt, res.ft, sender, underlyingAmtIn, minTokenOut, block.timestamp + 1 hours - ); - - vm.stopPrank(); - } - - function testSwapTokenWhenTermIsNotOpen() public { - vm.startPrank(sender); - - uint128 underlyingAmtIn = 100e8; - uint128 minTokenOut = 0e8; - - res.debt.mint(sender, underlyingAmtIn); - res.debt.approve(address(res.order), underlyingAmtIn); - - vm.warp(res.market.config().maturity); - vm.expectRevert(abi.encodeWithSelector(OrderErrors.TermIsNotOpen.selector)); - res.order.swapExactTokenToToken( - res.debt, res.ft, sender, underlyingAmtIn, minTokenOut, block.timestamp + 1 hours - ); - - vm.stopPrank(); - } - - function testBuyXt() public { - vm.startPrank(sender); - - uint128 underlyingAmtIn = 5e8; - uint128 minTokenOut = 0e8; - res.debt.mint(sender, underlyingAmtIn); - res.debt.approve(address(res.order), underlyingAmtIn); - - uint256 actualOut = vm.parseUint(vm.parseJsonString(testdata, ".expected.testBuyXt.output.netOut")); - uint256 fee = vm.parseUint(vm.parseJsonString(testdata, ".expected.testBuyXt.output.fee")); - StateChecker.OrderState memory expectedState = - JSONLoader.getOrderStateFromJson(testdata, ".expected.testBuyXt.contractState"); - vm.expectEmit(); - emit OrderEvents.SwapExactTokenToToken( - res.debt, res.xt, sender, sender, underlyingAmtIn, uint128(actualOut), uint128(fee) - ); - uint256 netOut = res.order.swapExactTokenToToken( - res.debt, res.xt, sender, underlyingAmtIn, minTokenOut, block.timestamp + 1 hours - ); - - StateChecker.checkOrderState(res, expectedState); - - assert(netOut == actualOut); - assert(res.xt.balanceOf(sender) == netOut); - - vm.stopPrank(); - } - - function testBuyXtMinTokenOut() public { - vm.startPrank(sender); - - uint128 expectedNetOut = - uint128(vm.parseUint(vm.parseJsonString(testdata, ".expected.testBuyXt.output.netOut"))); - uint128 underlyingAmtIn = 5e8; - uint128 minTokenOut = expectedNetOut + 1; - - res.debt.mint(sender, underlyingAmtIn); - res.debt.approve(address(res.order), underlyingAmtIn); - vm.expectRevert(abi.encodeWithSelector(OrderErrors.UnexpectedAmount.selector, minTokenOut, expectedNetOut)); - res.order.swapExactTokenToToken( - res.debt, res.xt, sender, underlyingAmtIn, minTokenOut, block.timestamp + 1 hours - ); - - vm.stopPrank(); - } - - function testSellFt() public { - vm.startPrank(sender); - - uint128 underlyingAmtInForBuyFt = 100e8; - uint128 minFtOut = 0e8; - res.debt.mint(sender, underlyingAmtInForBuyFt); - res.debt.approve(address(res.order), underlyingAmtInForBuyFt); - uint128 ftAmtIn = uint128( - res.order.swapExactTokenToToken( - res.debt, res.ft, sender, underlyingAmtInForBuyFt, minFtOut, block.timestamp + 1 hours - ) - ); - uint128 minTokenOut = 0e8; - res.ft.approve(address(res.order), ftAmtIn); - - uint256 actualOut = vm.parseUint(vm.parseJsonString(testdata, ".expected.testSellFt.output.netOut")); - uint256 fee = vm.parseUint(vm.parseJsonString(testdata, ".expected.testSellFt.output.fee")); - StateChecker.OrderState memory expectedState = - JSONLoader.getOrderStateFromJson(testdata, ".expected.testSellFt.contractState"); - vm.expectEmit(); - emit OrderEvents.SwapExactTokenToToken( - res.ft, res.debt, sender, sender, ftAmtIn, uint128(actualOut), uint128(fee) - ); - uint256 netOut = - res.order.swapExactTokenToToken(res.ft, res.debt, sender, ftAmtIn, minTokenOut, block.timestamp + 1 hours); - - StateChecker.checkOrderState(res, expectedState); - - assert(netOut == actualOut); - assert(res.ft.balanceOf(sender) == 0); - assert(res.debt.balanceOf(sender) == netOut); - - vm.stopPrank(); - } - - function testSellFtMinTokenOut() public { - vm.startPrank(sender); - - uint128 expectedNetOut = - uint128(vm.parseUint(vm.parseJsonString(testdata, ".expected.testSellFt.output.netOut"))); - uint128 underlyingAmtInForBuyFt = 100e8; - uint128 minFtOut = 0e8; - res.debt.mint(sender, underlyingAmtInForBuyFt); - res.debt.approve(address(res.order), underlyingAmtInForBuyFt); - uint128 ftAmtIn = uint128( - res.order.swapExactTokenToToken( - res.debt, res.ft, sender, underlyingAmtInForBuyFt, minFtOut, block.timestamp + 1 hours - ) - ); - uint128 minTokenOut = expectedNetOut + 1; - - res.ft.approve(address(res.order), ftAmtIn); - vm.expectRevert(abi.encodeWithSelector(OrderErrors.UnexpectedAmount.selector, minTokenOut, expectedNetOut)); - res.order.swapExactTokenToToken(res.ft, res.debt, sender, ftAmtIn, minTokenOut, block.timestamp + 1 hours); - - vm.stopPrank(); - } - - function testSellXt() public { - vm.startPrank(sender); - - uint128 underlyingAmtInForBuyXt = 5e8; - uint128 minXTOut = 0e8; - res.debt.mint(sender, underlyingAmtInForBuyXt); - res.debt.approve(address(res.order), underlyingAmtInForBuyXt); - uint128 xtAmtIn = uint128( - res.order.swapExactTokenToToken( - res.debt, res.xt, sender, underlyingAmtInForBuyXt, minXTOut, block.timestamp + 1 hours - ) - ); - uint128 minTokenOut = 0e8; - res.xt.approve(address(res.order), xtAmtIn); - - uint256 actualOut = vm.parseUint(vm.parseJsonString(testdata, ".expected.testSellXt.output.netOut")); - uint256 fee = vm.parseUint(vm.parseJsonString(testdata, ".expected.testSellXt.output.fee")); - StateChecker.OrderState memory expectedState = - JSONLoader.getOrderStateFromJson(testdata, ".expected.testSellXt.contractState"); - vm.expectEmit(); - emit OrderEvents.SwapExactTokenToToken( - res.xt, res.debt, sender, sender, xtAmtIn, uint128(actualOut), uint128(fee) - ); - uint256 netOut = - res.order.swapExactTokenToToken(res.xt, res.debt, sender, xtAmtIn, minTokenOut, block.timestamp + 1 hours); - - StateChecker.checkOrderState(res, expectedState); - - assert(netOut == actualOut); - assert(res.xt.balanceOf(sender) == 0); - assert(res.debt.balanceOf(sender) == netOut); - - vm.stopPrank(); - } - - function testSellXtMinTokenOut() public { - vm.startPrank(sender); - - uint128 expectedNetOut = - uint128(vm.parseUint(vm.parseJsonString(testdata, ".expected.testSellXt.output.netOut"))); - uint128 underlyingAmtInForBuyXt = 5e8; - uint128 minXtOut = 0e8; - res.debt.mint(sender, underlyingAmtInForBuyXt); - res.debt.approve(address(res.order), underlyingAmtInForBuyXt); - uint128 xtAmtIn = uint128( - res.order.swapExactTokenToToken( - res.debt, res.xt, sender, underlyingAmtInForBuyXt, minXtOut, block.timestamp + 1 hours - ) - ); - uint128 minTokenOut = expectedNetOut + 1; - - res.xt.approve(address(res.order), xtAmtIn); - vm.expectRevert(abi.encodeWithSelector(OrderErrors.UnexpectedAmount.selector, minTokenOut, expectedNetOut)); - res.order.swapExactTokenToToken(res.xt, res.debt, sender, xtAmtIn, minTokenOut, block.timestamp + 1 hours); - - vm.stopPrank(); - } - - function testBuyExactFt() public { - vm.startPrank(sender); - uint128 ftOutAmt = 100e8; - uint128 maxTokenIn = 100e8; - res.debt.mint(sender, maxTokenIn); - res.debt.approve(address(res.order), maxTokenIn); - - uint256 actualIn = vm.parseUint(vm.parseJsonString(testdata, ".expected.testBuyExactFt.output.netOut")); - uint256 fee = vm.parseUint(vm.parseJsonString(testdata, ".expected.testBuyExactFt.output.fee")); - StateChecker.OrderState memory expectedState = - JSONLoader.getOrderStateFromJson(testdata, ".expected.testBuyExactFt.contractState"); - vm.expectEmit(); - emit OrderEvents.SwapTokenToExactToken( - res.debt, res.ft, sender, sender, ftOutAmt, uint128(actualIn), uint128(fee) - ); - uint256 netIn = - res.order.swapTokenToExactToken(res.debt, res.ft, sender, ftOutAmt, maxTokenIn, block.timestamp + 1 hours); - - StateChecker.checkOrderState(res, expectedState); - - assert(netIn < maxTokenIn); - assert(res.ft.balanceOf(sender) == ftOutAmt); - assert(res.debt.balanceOf(sender) == maxTokenIn - netIn); - - vm.stopPrank(); - } - - function testBuyExactXt() public { - vm.startPrank(sender); - uint128 xtOutAmt = 100e8; - uint128 maxTokenIn = 100e8; - res.debt.mint(sender, maxTokenIn); - res.debt.approve(address(res.order), maxTokenIn); - - uint256 actualIn = vm.parseUint(vm.parseJsonString(testdata, ".expected.testBuyExactXt.output.netOut")); - uint256 fee = vm.parseUint(vm.parseJsonString(testdata, ".expected.testBuyExactXt.output.fee")); - StateChecker.OrderState memory expectedState = - JSONLoader.getOrderStateFromJson(testdata, ".expected.testBuyExactXt.contractState"); - vm.expectEmit(); - emit OrderEvents.SwapTokenToExactToken( - res.debt, res.xt, sender, sender, xtOutAmt, uint128(actualIn), uint128(fee) - ); - uint256 netIn = - res.order.swapTokenToExactToken(res.debt, res.xt, sender, xtOutAmt, maxTokenIn, block.timestamp + 1 hours); - - StateChecker.checkOrderState(res, expectedState); - - assert(netIn < maxTokenIn); - assert(res.xt.balanceOf(sender) == xtOutAmt); - assert(res.debt.balanceOf(sender) == maxTokenIn - netIn); - vm.stopPrank(); - } - - function testSellFtForExactToken() public { - vm.startPrank(sender); - - uint128 underlyingAmtInForBuyFt = 100e8; - uint128 minFtOut = 0e8; - res.debt.mint(sender, underlyingAmtInForBuyFt); - res.debt.approve(address(res.order), underlyingAmtInForBuyFt); - uint128 maxTokenIn = uint128( - res.order.swapExactTokenToToken( - res.debt, res.ft, sender, underlyingAmtInForBuyFt, minFtOut, block.timestamp + 1 hours - ) - ); - uint128 debtOutAmt = 80e8; - res.ft.approve(address(res.order), maxTokenIn); - - uint256 actualIn = vm.parseUint(vm.parseJsonString(testdata, ".expected.testSellFtForExactToken.output.netOut")); - uint256 fee = vm.parseUint(vm.parseJsonString(testdata, ".expected.testSellFtForExactToken.output.fee")); - StateChecker.OrderState memory expectedState = - JSONLoader.getOrderStateFromJson(testdata, ".expected.testSellFtForExactToken.contractState"); - vm.expectEmit(); - emit OrderEvents.SwapTokenToExactToken( - res.ft, res.debt, sender, sender, debtOutAmt, uint128(actualIn), uint128(fee) - ); - uint256 netIn = - res.order.swapTokenToExactToken(res.ft, res.debt, sender, debtOutAmt, maxTokenIn, block.timestamp + 1 hours); - - StateChecker.checkOrderState(res, expectedState); - - assert(netIn < maxTokenIn); - assert(res.debt.balanceOf(sender) == debtOutAmt); - assert(res.ft.balanceOf(sender) == maxTokenIn - netIn); - - vm.stopPrank(); - } - - function testSellXtForExactToken() public { - vm.startPrank(sender); - - uint128 underlyingAmtInForBuyXt = 5e8; - uint128 minFtOut = 0e8; - res.debt.mint(sender, underlyingAmtInForBuyXt); - res.debt.approve(address(res.order), underlyingAmtInForBuyXt); - uint128 maxTokenIn = uint128( - res.order.swapExactTokenToToken( - res.debt, res.xt, sender, underlyingAmtInForBuyXt, minFtOut, block.timestamp + 1 hours - ) - ); - uint128 debtOutAmt = 3e8; - res.xt.approve(address(res.order), maxTokenIn); - - uint256 actualIn = vm.parseUint(vm.parseJsonString(testdata, ".expected.testSellXtForExactToken.output.netOut")); - uint256 fee = vm.parseUint(vm.parseJsonString(testdata, ".expected.testSellXtForExactToken.output.fee")); - StateChecker.OrderState memory expectedState = - JSONLoader.getOrderStateFromJson(testdata, ".expected.testSellXtForExactToken.contractState"); - vm.expectEmit(); - emit OrderEvents.SwapTokenToExactToken( - res.xt, res.debt, sender, sender, debtOutAmt, uint128(actualIn), uint128(fee) - ); - uint256 netIn = - res.order.swapTokenToExactToken(res.xt, res.debt, sender, debtOutAmt, maxTokenIn, block.timestamp + 1 hours); - - StateChecker.checkOrderState(res, expectedState); - - assert(netIn < maxTokenIn); - assert(res.debt.balanceOf(sender) == debtOutAmt); - assert(res.xt.balanceOf(sender) == maxTokenIn - netIn); - - vm.stopPrank(); - } - - function testByExactFtWhenTermIsNotOpen() public { - uint128 ftInAmt = 100e8; - uint128 maxTokenOut = 100e8; - res.debt.mint(sender, ftInAmt); - res.debt.approve(address(res.market), ftInAmt); - - vm.warp(res.market.config().maturity); - vm.expectRevert(abi.encodeWithSignature("TermIsNotOpen()")); - res.order.swapTokenToExactToken(res.debt, res.ft, sender, maxTokenOut, ftInAmt, block.timestamp + 1 hours); - } - - function testIssueFtWhenSwap() public { - vm.startPrank(maker); - // Mint a GT - (uint256 gtId,) = LoanUtils.fastMintGt(res, maker, 100e8, 1e18); - res.gt.approve(address(res.order), gtId); - orderConfig.gtId = gtId; - res.order.updateOrder(orderConfig, -150e8, 0); - vm.stopPrank(); - - uint128 ftOutAmt = 151e8; - uint128 maxTokenIn = 150e8; - vm.startPrank(sender); - res.debt.mint(sender, maxTokenIn); - res.debt.approve(address(res.order), maxTokenIn); - res.order.swapTokenToExactToken(res.debt, res.ft, sender, ftOutAmt, maxTokenIn, block.timestamp + 1 hours); - assertEq(res.ft.balanceOf(sender), ftOutAmt); - (, uint128 debtAmt,) = res.gt.loanInfo(gtId); - assertGt(debtAmt, 100e8); - vm.stopPrank(); - } - - function testIssueFtWhenNoAssets() public { - vm.startPrank(maker); - // Mint a GT - (uint256 gtId,) = LoanUtils.fastMintGt(res, maker, 100e8, 1e18); - res.gt.approve(address(res.order), gtId); - orderConfig.gtId = gtId; - res.order.updateOrder(orderConfig, -150e8, -150e8); - assert(res.ft.balanceOf(address(res.order)) == 0); - assert(res.xt.balanceOf(address(res.order)) == 0); - vm.stopPrank(); - - uint128 ftOutAmt = 151e8; - uint128 maxTokenIn = 150e8; - vm.startPrank(sender); - res.debt.mint(sender, maxTokenIn); - res.debt.approve(address(res.order), maxTokenIn); - res.order.swapTokenToExactToken(res.debt, res.ft, sender, ftOutAmt, maxTokenIn, block.timestamp + 1 hours); - assertEq(res.ft.balanceOf(sender), ftOutAmt); - (, uint128 debtAmt,) = res.gt.loanInfo(gtId); - assertGt(debtAmt, 100e8); - vm.stopPrank(); - } - - function testRevertWhenIssueFt() public { - vm.prank(maker); - res.order.updateOrder(orderConfig, -150e8, 0); - - uint128 ftOutAmt = 151e8; - uint128 maxTokenIn = 150e8; - vm.startPrank(sender); - - res.debt.mint(sender, maxTokenIn); - res.debt.approve(address(res.order), maxTokenIn); - vm.expectRevert(abi.encodeWithSelector(OrderErrors.CantNotIssueFtWithoutGt.selector)); - res.order.swapTokenToExactToken(res.debt, res.ft, sender, ftOutAmt, maxTokenIn, block.timestamp + 1 hours); - vm.stopPrank(); - } - - function testUpdateOrderConfig() public { - vm.startPrank(maker); - - // Prepare new curve cuts - OrderConfig memory newOrderConfig = JSONLoader.getOrderConfigFromJson(testdata, ".newOrderConfig"); - int256 ftChangeAmt = 1e8; - int256 xtChangeAmt = -1e8; - - deal(address(res.ft), maker, ftChangeAmt.toUint256()); - res.ft.approve(address(res.order), ftChangeAmt.toUint256()); - - // vm.expectEmit(); - // emit OrderEvents.UpdateOrder( - // newOrderConfig.curveCuts, - // ftChangeAmt, - // xtChangeAmt, - // orderConfig.gtId, - // orderConfig.maxXtReserve, - // ISwapCallback(address(0)) - // ); - res.order.updateOrder(newOrderConfig, ftChangeAmt, xtChangeAmt); - - // Verify curve was updated - OrderConfig memory updatedConfig = res.order.orderConfig(); - for (uint256 i = 0; i < updatedConfig.curveCuts.lendCurveCuts.length; i++) { - assertEq( - updatedConfig.curveCuts.lendCurveCuts[i].xtReserve, newOrderConfig.curveCuts.lendCurveCuts[i].xtReserve - ); - assertEq( - updatedConfig.curveCuts.lendCurveCuts[i].liqSquare, newOrderConfig.curveCuts.lendCurveCuts[i].liqSquare - ); - assertEq(updatedConfig.curveCuts.lendCurveCuts[i].offset, newOrderConfig.curveCuts.lendCurveCuts[i].offset); - } - for (uint256 i = 0; i < updatedConfig.curveCuts.borrowCurveCuts.length; i++) { - assertEq( - updatedConfig.curveCuts.borrowCurveCuts[i].xtReserve, - newOrderConfig.curveCuts.borrowCurveCuts[i].xtReserve - ); - assertEq( - updatedConfig.curveCuts.borrowCurveCuts[i].liqSquare, - newOrderConfig.curveCuts.borrowCurveCuts[i].liqSquare - ); - assertEq( - updatedConfig.curveCuts.borrowCurveCuts[i].offset, newOrderConfig.curveCuts.borrowCurveCuts[i].offset - ); - } - assertEq(res.xt.balanceOf(maker), (-xtChangeAmt).toUint256()); - assertEq(res.ft.balanceOf(maker), 0); - - vm.stopPrank(); - } - - function testOnlyMakerCanUpdateOrder() public { - vm.startPrank(sender); - - vm.expectRevert(abi.encodeWithSignature("OwnableUnauthorizedAccount(address)", sender)); - res.order.updateOrder(orderConfig, 0, 0); - - vm.stopPrank(); - } - - function testPauseAndUnpause() public { - vm.startPrank(maker); - - // Test pause - res.order.pause(); - assertTrue(TermMaxOrder(address(res.order)).paused()); - - // Verify swaps are blocked when paused - vm.expectRevert(abi.encodeWithSignature("EnforcedPause()")); - res.order.swapExactTokenToToken(res.ft, res.debt, sender, 1e8, 0, block.timestamp + 1 hours); - - // Test unpause - res.order.unpause(); - assertFalse(TermMaxOrder(address(res.order)).paused()); - - vm.stopPrank(); - } - - function testOnlyMakerCanPause() public { - vm.startPrank(sender); - - vm.expectRevert(abi.encodeWithSignature("OwnableUnauthorizedAccount(address)", sender)); - res.order.pause(); - - vm.stopPrank(); - } - - function testSwapReverts() public { - vm.startPrank(sender); - - // Test same token swap - vm.expectRevert(OrderErrors.CantSwapSameToken.selector); - res.order.swapExactTokenToToken(res.ft, res.ft, sender, 1e8, 0, block.timestamp + 1 hours); - - IERC20 token0 = IERC20(vm.randomAddress()); - IERC20 token1 = IERC20(vm.randomAddress()); - // Test invalid token combination - vm.expectRevert(abi.encodeWithSelector(OrderErrors.CantNotSwapToken.selector, token0, token1)); - res.order.swapExactTokenToToken(token0, token1, sender, 1e8, 0, block.timestamp + 1 hours); - - vm.stopPrank(); - } - - function testSwapWithCallback(uint128 swapAmt, bool isBuy, bool isFt) public { - vm.assume(swapAmt > 0 && swapAmt < 0.1e8); - - // Deploy mock callback contract - MockSwapCallback callback = new MockSwapCallback(); - - orderConfig.swapTrigger = callback; - vm.startPrank(maker); - res.order.updateOrder(orderConfig, 0, 0); - - res.debt.mint(maker, 150e8); - res.debt.approve(address(res.market), 150e8); - res.market.mint(address(res.order), 150e8); - vm.stopPrank(); - - vm.startPrank(sender); - - res.debt.mint(sender, swapAmt * 2); - - res.debt.approve(address(res.order), swapAmt); - res.debt.approve(address(res.market), swapAmt); - res.market.mint(sender, swapAmt); - - IERC20 tokenIn; - IERC20 tokenOut; - - if (isBuy && isFt) { - tokenIn = res.debt; - tokenOut = res.ft; - } - - if (isBuy && !isFt) { - tokenIn = res.debt; - tokenOut = res.xt; - } - - if (!isBuy && isFt) { - tokenIn = res.ft; - tokenOut = res.debt; - } - - if (!isBuy && !isFt) { - tokenIn = res.xt; - tokenOut = res.debt; - } - uint256 ftBalanceBefore = res.ft.balanceOf(address(res.order)); - uint256 xtBalanceBefore = res.xt.balanceOf(address(res.order)); - tokenIn.approve(address(res.order), swapAmt); - res.order.swapExactTokenToToken(tokenIn, tokenOut, sender, swapAmt, 0, block.timestamp + 1 hours); - - uint256 ftBalanceAfter = res.ft.balanceOf(address(res.order)); - uint256 xtBalanceAfter = res.xt.balanceOf(address(res.order)); - - assertEq(ftBalanceBefore.toInt256() + callback.deltaFt(), ftBalanceAfter.toInt256()); - assertEq(xtBalanceBefore.toInt256() + callback.deltaXt(), xtBalanceAfter.toInt256()); - - vm.stopPrank(); - } - - function testUpdateOrderFeeRate() public { - // Create new fee config - FeeConfig memory newFeeConfig = marketConfig.feeConfig; - newFeeConfig.lendTakerFeeRatio++; - newFeeConfig.borrowTakerFeeRatio++; - - // Test that non-owner cannot update fee rate - vm.expectRevert(abi.encodeWithSelector(OrderErrors.OnlyMarket.selector)); - vm.prank(sender); - res.order.updateFeeConfig(newFeeConfig); - - // Test that owner can update fee rate - vm.startPrank(deployer); - res.market.updateOrderFeeRate(res.order, newFeeConfig); - assertEq(res.order.orderConfig().feeConfig.lendTakerFeeRatio, newFeeConfig.lendTakerFeeRatio); - assertEq(res.order.orderConfig().feeConfig.borrowTakerFeeRatio, newFeeConfig.borrowTakerFeeRatio); - - // Test invalid fee rates (over 100%) - FeeConfig memory invalidFeeConfig = marketConfig.feeConfig; - invalidFeeConfig.lendTakerFeeRatio = Constants.MAX_FEE_RATIO; - vm.expectRevert(abi.encodeWithSelector(MarketErrors.FeeTooHigh.selector)); - res.market.updateOrderFeeRate(res.order, invalidFeeConfig); - vm.stopPrank(); - } - - function testRevertLendIsNotAllowed() public { - vm.startPrank(maker); - OrderConfig memory testOrderConfig = res.order.orderConfig(); - testOrderConfig.curveCuts.borrowCurveCuts = new CurveCut[](0); - - vm.expectEmit(); - emit OrderEvents.UpdateOrder( - testOrderConfig.curveCuts, - 0, - 0, - testOrderConfig.gtId, - testOrderConfig.maxXtReserve, - ISwapCallback(address(0)) - ); - res.order.updateOrder(testOrderConfig, 0, 0); - vm.stopPrank(); - - vm.startPrank(sender); - - uint128 underlyingAmtIn = 100e8; - uint128 minTokenOut = 0e8; - res.debt.mint(sender, underlyingAmtIn); - res.debt.approve(address(res.order), underlyingAmtIn); - - vm.expectRevert(abi.encodeWithSelector(OrderErrors.LendIsNotAllowed.selector)); - res.order.swapExactTokenToToken( - res.debt, res.ft, sender, underlyingAmtIn, minTokenOut, block.timestamp + 1 hours - ); - - vm.stopPrank(); - } - - function testRevertBorrowIsNotAllowed() public { - vm.startPrank(maker); - OrderConfig memory testOrderConfig = res.order.orderConfig(); - testOrderConfig.curveCuts.lendCurveCuts = new CurveCut[](0); - - vm.expectEmit(); - emit OrderEvents.UpdateOrder( - testOrderConfig.curveCuts, - 0, - 0, - testOrderConfig.gtId, - testOrderConfig.maxXtReserve, - ISwapCallback(address(0)) - ); - res.order.updateOrder(testOrderConfig, 0, 0); - vm.stopPrank(); - - vm.startPrank(sender); - - uint128 underlyingAmtIn = 100e8; - uint128 minTokenOut = 0e8; - res.debt.mint(sender, underlyingAmtIn); - res.debt.approve(address(res.order), underlyingAmtIn); - - vm.expectRevert(abi.encodeWithSelector(OrderErrors.BorrowIsNotAllowed.selector)); - res.order.swapExactTokenToToken( - res.debt, res.xt, sender, underlyingAmtIn, minTokenOut, block.timestamp + 1 hours - ); - - vm.stopPrank(); - } - - function testUtWhenDeadlineLessThanBlockTime() public { - vm.startPrank(sender); - - uint128 swapAmt = 5e8; - IERC20 tokenIn = IERC20(address(res.debt)); - IERC20 tokenOut = IERC20(address(res.xt)); - - // Set block timestamp - uint256 currentTime = 1000; - vm.warp(currentTime); - - // Try to swap with deadline less than block time - uint256 pastDeadline = currentTime - 1; - - tokenIn.approve(address(res.order), swapAmt); - - vm.expectRevert(OrderErrors.DeadlineExpired.selector); - res.order.swapExactTokenToToken(tokenIn, tokenOut, sender, swapAmt, 0, pastDeadline); - - vm.expectRevert(OrderErrors.DeadlineExpired.selector); - res.order.swapTokenToExactToken(tokenIn, tokenOut, sender, 1, swapAmt, pastDeadline); - - vm.stopPrank(); - } - - function testAprWithoutCurve() public { - vm.startPrank(maker); - OrderConfig memory testOrderConfig = res.order.orderConfig(); - testOrderConfig.curveCuts.lendCurveCuts = new CurveCut[](0); - testOrderConfig.curveCuts.borrowCurveCuts = new CurveCut[](0); - - vm.expectEmit(); - emit OrderEvents.UpdateOrder( - testOrderConfig.curveCuts, - 0, - 0, - testOrderConfig.gtId, - testOrderConfig.maxXtReserve, - ISwapCallback(address(0)) - ); - res.order.updateOrder(testOrderConfig, 0, 0); - vm.stopPrank(); - - (uint256 lendApr, uint256 borrowApr) = res.order.apr(); - - assert(lendApr == 0); - assert(borrowApr == type(uint256).max); - } - - function testAprWithCurve() public { - vm.startPrank(maker); - OrderConfig memory testOrderConfig = res.order.orderConfig(); - testOrderConfig.curveCuts.lendCurveCuts = new CurveCut[](0); - - res.order.updateOrder(testOrderConfig, 0, 0); - - (uint256 lendApr, uint256 borrowApr) = res.order.apr(); - - assert(lendApr == 0); - - testOrderConfig = res.order.orderConfig(); - testOrderConfig.curveCuts.borrowCurveCuts = new CurveCut[](0); - res.order.updateOrder(testOrderConfig, 0, 0); - - (lendApr, borrowApr) = res.order.apr(); - - assert(borrowApr == type(uint256).max); - - vm.stopPrank(); - } -} - -// Mock contracts for testing -contract MockSwapCallback is ISwapCallback { - int256 public deltaFt; - int256 public deltaXt; - - function afterSwap(uint256, uint256, int256 deltaFt_, int256 deltaXt_) external override { - deltaFt = deltaFt_; - deltaXt = deltaXt_; - } -} diff --git a/test/Router.t.sol b/test/Router.t.sol deleted file mode 100644 index b79220d..0000000 --- a/test/Router.t.sol +++ /dev/null @@ -1,699 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import "forge-std/Test.sol"; -import {console} from "forge-std/console.sol"; -import {DeployUtils} from "./utils/DeployUtils.sol"; -import {JSONLoader} from "./utils/JSONLoader.sol"; -import {StateChecker} from "./utils/StateChecker.sol"; -import {SwapUtils} from "./utils/SwapUtils.sol"; -import {LoanUtils} from "./utils/LoanUtils.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; -import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; -import {IFlashLoanReceiver} from "contracts/IFlashLoanReceiver.sol"; -import {ITermMaxMarket, TermMaxMarket, Constants, MarketEvents, MarketErrors} from "contracts/TermMaxMarket.sol"; -import {ITermMaxOrder, TermMaxOrder, ISwapCallback, OrderEvents, OrderErrors} from "contracts/TermMaxOrder.sol"; -import {MockERC20, ERC20} from "contracts/test/MockERC20.sol"; -import {MockPriceFeed} from "contracts/test/MockPriceFeed.sol"; -import {MockFlashLoanReceiver} from "contracts/test/MockFlashLoanReceiver.sol"; -import {IGearingToken} from "contracts/tokens/IGearingToken.sol"; -import {MockSwapAdapter} from "contracts/test/MockSwapAdapter.sol"; -import {SwapUnit, ISwapAdapter} from "contracts/router/ISwapAdapter.sol"; -import {RouterErrors, RouterEvents, TermMaxRouter, ITermMaxRouter} from "contracts/router/TermMaxRouter.sol"; -import "contracts/storage/TermMaxStorage.sol"; - -contract RouterTest is Test { - using JSONLoader for *; - using SafeCast for *; - - DeployUtils.Res res; - - OrderConfig orderConfig; - MarketConfig marketConfig; - - address deployer = vm.randomAddress(); - address maker = vm.randomAddress(); - address sender = vm.randomAddress(); - address treasurer = vm.randomAddress(); - string testdata; - - address pool = vm.randomAddress(); - - MockSwapAdapter adapter; - - function setUp() public { - vm.startPrank(deployer); - testdata = vm.readFile(string.concat(vm.projectRoot(), "/test/testdata/testdata.json")); - - uint32 maxLtv = 0.89e8; - uint32 liquidationLtv = 0.9e8; - - marketConfig = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); - orderConfig = JSONLoader.getOrderConfigFromJson(testdata, ".orderConfig"); - - res = DeployUtils.deployMarket(deployer, marketConfig, maxLtv, liquidationLtv); - - res.order = - res.market.createOrder(maker, orderConfig.maxXtReserve, ISwapCallback(address(0)), orderConfig.curveCuts); - - vm.warp(vm.parseUint(vm.parseJsonString(testdata, ".currentTime"))); - - // update oracle - res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.eth")); - res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.dai")); - - uint256 amount = 150e8; - res.debt.mint(deployer, amount); - res.debt.approve(address(res.market), amount); - res.market.mint(deployer, amount); - res.ft.transfer(address(res.order), amount); - res.xt.transfer(address(res.order), amount); - - res.router = DeployUtils.deployRouter(deployer); - adapter = new MockSwapAdapter(pool); - res.router.setAdapterWhitelist(address(adapter), true); - - vm.stopPrank(); - } - - function testSetAdapterWhitelist() public { - vm.startPrank(deployer); - - address randomAdapter = vm.randomAddress(); - res.router.setAdapterWhitelist(randomAdapter, true); - assertTrue(res.router.adapterWhitelist(randomAdapter)); - - res.router.setAdapterWhitelist(randomAdapter, false); - assertFalse(res.router.adapterWhitelist(randomAdapter)); - - vm.stopPrank(); - } - - function testSetAdapterWhitelistUnauthorized() public { - vm.startPrank(sender); - - address randomAdapter = vm.randomAddress(); - vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, address(sender))); - res.router.setAdapterWhitelist(randomAdapter, true); - - vm.stopPrank(); - } - - function testPause() public { - vm.startPrank(deployer); - - res.router.pause(); - assertTrue(res.router.paused()); - - res.router.unpause(); - assertFalse(res.router.paused()); - - vm.stopPrank(); - } - - function testPauseUnauthorized() public { - vm.startPrank(sender); - - vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, address(sender))); - res.router.pause(); - - vm.stopPrank(); - } - - function testSwapExactTokenToToken() public { - vm.startPrank(sender); - - uint128 amountIn = 100e8; - uint128[] memory tradingAmts = new uint128[](2); - tradingAmts[0] = 50e8; - tradingAmts[1] = 50e8; - uint128 mintTokenOut = 80e8; - - ITermMaxOrder[] memory orders = new ITermMaxOrder[](2); - orders[0] = res.order; - orders[1] = res.order; - - res.debt.mint(sender, amountIn); - res.debt.approve(address(res.router), amountIn); - uint256 netOut = res.router.swapExactTokenToToken( - res.debt, res.ft, sender, orders, tradingAmts, mintTokenOut, block.timestamp + 1 hours - ); - assertEq(netOut, res.ft.balanceOf(sender)); - - assertEq(res.debt.balanceOf(sender), 0); - - vm.stopPrank(); - } - - function testSwapTokenToExactToken() public { - vm.startPrank(sender); - - uint128 amountOut = 90e8; - uint128[] memory tradingAmts = new uint128[](2); - tradingAmts[0] = 45e8; - tradingAmts[1] = 45e8; - uint128 maxAmountIn = 100e8; - - ITermMaxOrder[] memory orders = new ITermMaxOrder[](2); - orders[0] = res.order; - orders[1] = res.order; - - res.debt.mint(sender, maxAmountIn); - res.debt.approve(address(res.router), maxAmountIn); - - uint256 balanceBefore = res.ft.balanceOf(sender); - uint256 amountIn = res.router.swapTokenToExactToken( - res.debt, res.ft, sender, orders, tradingAmts, maxAmountIn, block.timestamp + 1 hours - ); - uint256 balanceAfter = res.ft.balanceOf(sender); - - assertEq(maxAmountIn - amountIn, res.debt.balanceOf(sender)); - assertEq(balanceAfter - balanceBefore, amountOut); - - vm.stopPrank(); - } - - function testSellTokens(uint128 ftAmount, uint128 xtAmount) public { - //TODO check output - vm.assume(ftAmount <= 150e8 && xtAmount <= 150e8); - vm.startPrank(sender); - deal(address(res.ft), sender, ftAmount); - deal(address(res.xt), sender, xtAmount); - - ITermMaxOrder[] memory orders = new ITermMaxOrder[](2); - orders[0] = res.order; - orders[1] = res.order; - - (uint128 maxBurn, uint128 sellAmt) = - ftAmount > xtAmount ? (xtAmount, ftAmount - xtAmount) : (ftAmount, xtAmount - ftAmount); - uint128[] memory tradingAmts = new uint128[](2); - tradingAmts[0] = sellAmt / 2; - tradingAmts[1] = sellAmt / 2; - uint128 mintTokenOut = 0; - - res.ft.approve(address(res.router), ftAmount); - res.xt.approve(address(res.router), xtAmount); - - // vm.expectEmit(); - // emit ITermMaxRouter.SellTokens(res.market, tokenToSell, sender, orders, tradingAmts, mintTokenOut); - uint256 netOut = res.router.sellTokens( - sender, res.market, ftAmount, xtAmount, orders, tradingAmts, mintTokenOut, block.timestamp - ); - assertEq(netOut, res.debt.balanceOf(sender)); - assertEq(res.ft.balanceOf(sender), 0); - assertEq(res.xt.balanceOf(sender), 0); - assert(maxBurn <= netOut); - - vm.stopPrank(); - } - - function testLeaveFromToken() public { - vm.startPrank(sender); - - uint128 minXtOut = 0; - uint128 tokenToSwap = 100e8; - uint128 maxLtv = 0.8e8; - uint256 minCollAmt = 1e18; - res.debt.mint(sender, tokenToSwap + 2e8 * 2); - - ITermMaxOrder[] memory orders = new ITermMaxOrder[](2); - orders[0] = res.order; - orders[1] = res.order; - - uint128[] memory amtsToBuyXt = new uint128[](2); - amtsToBuyXt[0] = 2e8; - amtsToBuyXt[1] = 2e8; - - SwapUnit[] memory units = new SwapUnit[](1); - units[0] = SwapUnit(address(adapter), address(res.debt), address(res.collateral), abi.encode(minCollAmt)); - - res.debt.approve(address(res.router), tokenToSwap + 2e8 * 2); - (uint256 gtId, uint256 netXtOut) = res.router.leverageFromToken( - sender, res.market, orders, amtsToBuyXt, minXtOut, tokenToSwap, maxLtv, units, block.timestamp - ); - (address owner, uint128 debtAmt, bytes memory collateralData) = res.gt.loanInfo(gtId); - assertEq(owner, sender); - assertEq(minCollAmt, abi.decode(collateralData, (uint256))); - assertEq(netXtOut * Constants.DECIMAL_BASE / (Constants.DECIMAL_BASE - res.market.mintGtFeeRatio()), debtAmt); - vm.stopPrank(); - } - - function testLeverageFromXt() public { - vm.startPrank(sender); - - uint128 xtAmt = 10e8; - uint128 tokenToSwap = 100e8; - uint128 maxLtv = 0.8e8; - uint256 minCollAmt = 1e18; - - deal(address(res.xt), sender, xtAmt); - - SwapUnit[] memory units = new SwapUnit[](1); - units[0] = SwapUnit(address(adapter), address(res.debt), address(res.collateral), abi.encode(minCollAmt)); - - res.xt.approve(address(res.router), xtAmt); - res.debt.mint(sender, tokenToSwap); - res.debt.approve(address(res.router), tokenToSwap); - - uint256 gtId = res.router.leverageFromXt(sender, res.market, xtAmt, tokenToSwap, maxLtv, units); - (address owner, uint128 debtAmt, bytes memory collateralData) = res.gt.loanInfo(gtId); - assertEq(owner, sender); - assertEq(minCollAmt, abi.decode(collateralData, (uint256))); - assertEq( - uint128(xtAmt * Constants.DECIMAL_BASE / (Constants.DECIMAL_BASE - res.market.mintGtFeeRatio())), debtAmt - ); - vm.stopPrank(); - } - - function testLeverageFromCollateral() public { - vm.startPrank(sender); - - uint128 xtAmt = 10e8; - uint128 collateralAmt = 0.5e18; - uint128 maxLtv = 0.8e8; - uint256 minCollAmt = 0.5e18; - - deal(address(res.xt), sender, xtAmt); - - SwapUnit[] memory units = new SwapUnit[](1); - units[0] = SwapUnit(address(adapter), address(res.debt), address(res.collateral), abi.encode(minCollAmt)); - - res.xt.approve(address(res.router), xtAmt); - res.collateral.mint(sender, collateralAmt); - res.collateral.approve(address(res.router), collateralAmt); - - uint256 gtId = res.router.leverageFromXtAndCollateral(sender, res.market, xtAmt, collateralAmt, maxLtv, units); - (address owner, uint128 debtAmt, bytes memory collateralData) = res.gt.loanInfo(gtId); - assertEq(owner, sender); - assertEq(minCollAmt + collateralAmt, abi.decode(collateralData, (uint256))); - assertEq( - uint128(xtAmt * Constants.DECIMAL_BASE / (Constants.DECIMAL_BASE - res.market.mintGtFeeRatio())), debtAmt - ); - vm.stopPrank(); - } - - function testLeverage_LtvTooBigger() public { - vm.startPrank(sender); - - uint128 xtAmt = 100e8; - uint128 tokenToSwap = 100e8; - uint128 maxLtv = 0.1e2; - uint256 minCollAmt = 1e18; - - uint256 ltv = (xtAmt * Constants.DECIMAL_BASE / (Constants.DECIMAL_BASE - res.market.mintGtFeeRatio())) / 2000; - - deal(address(res.xt), sender, xtAmt); - - SwapUnit[] memory units = new SwapUnit[](1); - units[0] = SwapUnit(address(adapter), address(res.debt), address(res.collateral), abi.encode(minCollAmt)); - - res.xt.approve(address(res.router), xtAmt); - res.debt.mint(sender, tokenToSwap); - res.debt.approve(address(res.router), tokenToSwap); - - vm.expectRevert( - abi.encodeWithSelector(RouterErrors.LtvBiggerThanExpected.selector, uint128(maxLtv), uint128(ltv)) - ); - res.router.leverageFromXt(sender, res.market, xtAmt, tokenToSwap, maxLtv, units); - - vm.stopPrank(); - } - - function testBorrowTokenFromCollateral() public { - vm.startPrank(sender); - - uint256 collInAmt = 1e18; - uint128 borrowAmt = 80e8; - uint128 maxDebtAmt = 100e8; - - // uint fee = (res.market.mintGtFeeRatio() * maxDebtAmt) / Constants.DECIMAL_BASE; - // uint ftAmt = maxDebtAmt - fee; - - ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); - orders[0] = res.order; - uint128[] memory tokenAmtsWantBuy = new uint128[](1); - tokenAmtsWantBuy[0] = borrowAmt; - - res.collateral.mint(sender, collInAmt); - res.collateral.approve(address(res.router), collInAmt); - - // vm.expectEmit(); - // emit RouterEvents.Borrow(res.market, gtId, sender, sender, collInAmt, maxDebtAmt.toUint128(), borrowAmt); - uint256 gtId = res.router.borrowTokenFromCollateral( - sender, res.market, collInAmt, orders, tokenAmtsWantBuy, maxDebtAmt, block.timestamp + 1 hours - ); - - (address owner, uint128 debtAmt, bytes memory collateralData) = res.gt.loanInfo(gtId); - assertEq(owner, sender); - assertEq(collInAmt, abi.decode(collateralData, (uint256))); - assert(debtAmt <= maxDebtAmt); - assertEq(res.debt.balanceOf(sender), borrowAmt); - - vm.stopPrank(); - } - - function testBorrowTokenFromCollateralCase2() public { - vm.startPrank(sender); - - uint256 collInAmt = 1e18; - uint128 borrowAmt = 80e8; - - res.collateral.mint(sender, collInAmt); - res.collateral.approve(address(res.router), collInAmt); - - res.debt.mint(sender, borrowAmt); - res.debt.approve(address(res.market), borrowAmt); - res.market.mint(sender, borrowAmt); - - res.xt.approve(address(res.router), borrowAmt); - - uint256 mintGtFeeRatio = res.market.mintGtFeeRatio(); - uint128 previewDebtAmt = - ((borrowAmt * Constants.DECIMAL_BASE) / (Constants.DECIMAL_BASE - mintGtFeeRatio)).toUint128(); - - vm.expectEmit(); - emit RouterEvents.Borrow(res.market, 1, sender, sender, collInAmt, previewDebtAmt, borrowAmt); - - uint256 gtId = res.router.borrowTokenFromCollateral(sender, res.market, collInAmt, borrowAmt); - (address owner, uint128 debtAmt, bytes memory collateralData) = res.gt.loanInfo(gtId); - assertEq(owner, sender); - assertEq(collInAmt, abi.decode(collateralData, (uint256))); - assert(previewDebtAmt == debtAmt); - assertEq(res.debt.balanceOf(sender), borrowAmt); - - vm.stopPrank(); - } - - function testBorrowTokenFromGt() public { - vm.startPrank(sender); - uint256 collInAmt = 1e18; - - (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, 100e8, collInAmt); - - uint128 borrowAmt = 80e8; - - res.debt.mint(sender, borrowAmt); - res.debt.approve(address(res.market), borrowAmt); - res.market.mint(sender, borrowAmt); - - res.xt.approve(address(res.router), borrowAmt); - res.gt.approve(address(res.router), gtId); - - uint256 mintGtFeeRatio = res.market.mintGtFeeRatio(); - uint128 previewDebtAmt = - ((borrowAmt * Constants.DECIMAL_BASE) / (Constants.DECIMAL_BASE - mintGtFeeRatio)).toUint128(); - - vm.expectEmit(); - emit RouterEvents.Borrow(res.market, 1, sender, sender, 0, previewDebtAmt, borrowAmt); - - res.router.borrowTokenFromGt(sender, res.market, gtId, borrowAmt); - - (, uint128 dAmt,) = res.gt.loanInfo(gtId); - assert(dAmt == 100e8 + previewDebtAmt); - assertEq(res.debt.balanceOf(sender), borrowAmt); - - vm.stopPrank(); - } - - function testBorrowTokenFromGtInvalidSender() public { - vm.startPrank(sender); - uint256 collInAmt = 1e18; - - (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, 100e8, collInAmt); - - uint128 borrowAmt = 80e8; - - res.debt.mint(sender, borrowAmt); - res.debt.approve(address(res.market), borrowAmt); - res.market.mint(sender, borrowAmt); - - res.xt.approve(address(res.router), borrowAmt); - res.gt.approve(address(res.router), gtId); - - uint256 mintGtFeeRatio = res.market.mintGtFeeRatio(); - ((borrowAmt * Constants.DECIMAL_BASE) / (Constants.DECIMAL_BASE - mintGtFeeRatio)).toUint128(); - vm.stopPrank(); - - vm.expectRevert(abi.encodeWithSelector(RouterErrors.GtNotOwnedBySender.selector)); - vm.prank(deployer); - res.router.borrowTokenFromGt(sender, res.market, gtId, borrowAmt); - - vm.stopPrank(); - } - - function testFlashRepayFromCollateral() public { - vm.startPrank(sender); - uint128 debtAmt = 100e8; - (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, 1e18); - - ITermMaxOrder[] memory orders = new ITermMaxOrder[](0); - uint128[] memory amtsToBuyFt = new uint128[](0); - bool byDebtToken = true; - - uint256 mintTokenOut = 2000e8; - SwapUnit[] memory units = new SwapUnit[](1); - units[0] = SwapUnit(address(adapter), address(res.collateral), address(res.debt), abi.encode(mintTokenOut)); - - res.gt.approve(address(res.router), gtId); - ITermMaxRouter.TermMaxSwapData memory swapData; - res.router.flashRepayFromColl(sender, res.market, gtId, byDebtToken, units, swapData); - - assertEq(res.collateral.balanceOf(sender), 0); - assertEq(res.debt.balanceOf(sender), mintTokenOut - debtAmt); - - vm.expectRevert(abi.encodePacked(bytes4(keccak256("ERC721NonexistentToken(uint256)")), gtId)); - res.gt.loanInfo(gtId); - - vm.stopPrank(); - } - - function testFlashRepayFromCollateral_ByFt() public { - vm.startPrank(sender); - uint128 debtAmt = 100e8; - (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, 1e18); - - ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); - orders[0] = res.order; - uint128[] memory amtsToBuyFt = new uint128[](1); - amtsToBuyFt[0] = debtAmt; - - bool byDebtToken = false; - - uint256 mintTokenOut = 2000e8; - SwapUnit[] memory units = new SwapUnit[](1); - units[0] = SwapUnit(address(adapter), address(res.collateral), address(res.debt), abi.encode(mintTokenOut)); - - ITermMaxRouter.TermMaxSwapData memory swapData; - swapData.orders = orders; - swapData.tradingAmts = amtsToBuyFt; - swapData.tokenIn = address(res.debt); - swapData.tokenOut = address(res.ft); - swapData.netTokenAmt = 0; - swapData.deadline = block.timestamp + 1 hours; - - res.gt.approve(address(res.router), gtId); - res.router.flashRepayFromColl(sender, res.market, gtId, byDebtToken, units, swapData); - - assertEq(res.collateral.balanceOf(sender), 0); - assert(res.debt.balanceOf(sender) > mintTokenOut - debtAmt); - - vm.expectRevert(abi.encodePacked(bytes4(keccak256("ERC721NonexistentToken(uint256)")), gtId)); - res.gt.loanInfo(gtId); - - vm.stopPrank(); - } - - function testRepayByTokenThroughFt() public { - vm.startPrank(sender); - uint128 debtAmt = 100e8; - uint256 collateralAmt = 1e18; - (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); - - ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); - orders[0] = res.order; - uint128[] memory amtsToBuyFt = new uint128[](1); - amtsToBuyFt[0] = debtAmt; - uint128 maxTokenIn = debtAmt; - - res.debt.mint(sender, maxTokenIn); - res.debt.approve(address(res.router), maxTokenIn); - - uint256 returnAmt = - res.router.repayByTokenThroughFt(sender, res.market, gtId, orders, amtsToBuyFt, maxTokenIn, block.timestamp); - assertEq(res.debt.balanceOf(sender), returnAmt); - assertEq(res.collateral.balanceOf(sender), collateralAmt); - - vm.expectRevert(abi.encodePacked(bytes4(keccak256("ERC721NonexistentToken(uint256)")), gtId)); - res.gt.loanInfo(gtId); - - vm.stopPrank(); - } - - function testPartialRepayByTokenThroughFt() public { - vm.startPrank(sender); - uint128 debtAmt = 100e8; - uint256 collateralAmt = 1e18; - (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); - - ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); - orders[0] = res.order; - uint128[] memory amtsToBuyFt = new uint128[](1); - amtsToBuyFt[0] = debtAmt / 2; - uint128 maxTokenIn = debtAmt; - - res.debt.mint(sender, maxTokenIn); - res.debt.approve(address(res.router), maxTokenIn); - - uint256 returnAmt = - res.router.repayByTokenThroughFt(sender, res.market, gtId, orders, amtsToBuyFt, maxTokenIn, block.timestamp); - assertEq(res.debt.balanceOf(sender), returnAmt); - assertEq(res.collateral.balanceOf(sender), 0); - - (address owner, uint128 dAmt, bytes memory collateralData) = res.gt.loanInfo(gtId); - assertEq(owner, sender); - assertEq(collateralAmt, abi.decode(collateralData, (uint256))); - assertEq(dAmt, debtAmt / 2); - - vm.stopPrank(); - } - - function testRedeemAndSwap() public { - address bob = vm.randomAddress(); - address alice = vm.randomAddress(); - - uint128 depositAmt = 1000e8; - uint128 debtAmt = 100e8; - uint256 collateralAmt = 1e18; - - vm.startPrank(bob); - res.debt.mint(bob, depositAmt); - res.debt.approve(address(res.market), depositAmt); - res.market.mint(bob, depositAmt); - - res.xt.transfer(alice, debtAmt); - vm.stopPrank(); - - vm.startPrank(alice); - - MockFlashLoanReceiver receiver = new MockFlashLoanReceiver(res.market); - res.collateral.mint(address(receiver), collateralAmt); - - res.xt.approve(address(receiver), debtAmt); - receiver.leverageByXt(debtAmt, abi.encode(alice, collateralAmt)); - vm.stopPrank(); - - vm.warp(marketConfig.maturity + Constants.LIQUIDATION_WINDOW); - - vm.startPrank(bob); - - uint256 minDebtOutAmt = 1000e8; - SwapUnit[] memory units = new SwapUnit[](1); - units[0] = SwapUnit(address(adapter), address(res.collateral), address(res.debt), abi.encode(minDebtOutAmt)); - - res.ft.approve(address(res.router), depositAmt); - uint256 ftTotalSupply = res.ft.totalSupply(); - uint256 redeemedDebtToken = (res.debt.balanceOf(address(res.market)) * depositAmt) / ftTotalSupply; - - uint256 expectedOutput = redeemedDebtToken + minDebtOutAmt; - - vm.expectEmit(); - emit RouterEvents.RedeemAndSwap(res.market, depositAmt, bob, bob, expectedOutput); - uint256 netOutput = res.router.redeemAndSwap(bob, res.market, depositAmt, units, expectedOutput); - - assertEq(netOutput, expectedOutput); - assertEq(res.debt.balanceOf(bob), netOutput); - - vm.stopPrank(); - } - - function testSwapUnitsIsEmpty() public { - address bob = vm.randomAddress(); - address alice = vm.randomAddress(); - - uint128 depositAmt = 1000e8; - uint128 debtAmt = 100e8; - uint256 collateralAmt = 1e18; - - vm.startPrank(bob); - res.debt.mint(bob, depositAmt); - res.debt.approve(address(res.market), depositAmt); - res.market.mint(bob, depositAmt); - - res.xt.transfer(alice, debtAmt); - vm.stopPrank(); - - vm.startPrank(alice); - - MockFlashLoanReceiver receiver = new MockFlashLoanReceiver(res.market); - res.collateral.mint(address(receiver), collateralAmt); - - res.xt.approve(address(receiver), debtAmt); - receiver.leverageByXt(debtAmt, abi.encode(alice, collateralAmt)); - vm.stopPrank(); - - vm.warp(marketConfig.maturity + Constants.LIQUIDATION_WINDOW); - - vm.startPrank(bob); - - uint256 minDebtOutAmt = 1000e8; - SwapUnit[] memory units = new SwapUnit[](0); - res.ft.approve(address(res.router), depositAmt); - - vm.expectRevert(abi.encodeWithSelector(RouterErrors.SwapUnitsIsEmpty.selector)); - res.router.redeemAndSwap(bob, res.market, depositAmt, units, minDebtOutAmt); - - vm.stopPrank(); - } - - function testCreateOrderAndDeposit() public { - vm.startPrank(sender); - - uint256 maxXtReserve = 1000e8; - - ISwapCallback swapTrigger = ISwapCallback(address(0)); - uint256 debtTokenToDeposit = 1e8; - uint128 ftToDeposit = 2e8; - uint128 xtToDeposit = 10e8; - CurveCuts memory curveCuts = orderConfig.curveCuts; - deal(address(res.ft), sender, ftToDeposit); - deal(address(res.xt), sender, xtToDeposit); - res.debt.mint(sender, debtTokenToDeposit); - res.debt.approve(address(res.router), debtTokenToDeposit); - res.ft.approve(address(res.router), ftToDeposit); - res.xt.approve(address(res.router), xtToDeposit); - ITermMaxOrder order = res.router.createOrderAndDeposit( - res.market, maker, maxXtReserve, swapTrigger, debtTokenToDeposit, ftToDeposit, xtToDeposit, curveCuts - ); - - assertEq(order.maker(), maker); - assertEq(res.ft.balanceOf(address(order)), ftToDeposit + debtTokenToDeposit); - assertEq(res.xt.balanceOf(address(order)), xtToDeposit + debtTokenToDeposit); - } - - function testOrdersAndAmtsLengthNotMatch() public { - vm.startPrank(sender); - - uint128[] memory tradingAmts = new uint128[](2); - tradingAmts[0] = 45e8; - tradingAmts[1] = 45e8; - uint128 maxAmountIn = 100e8; - - ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); - orders[0] = res.order; - - res.debt.mint(sender, maxAmountIn); - res.debt.approve(address(res.router), maxAmountIn); - - vm.expectRevert(RouterErrors.OrdersAndAmtsLengthNotMatch.selector); - res.router.swapTokenToExactToken( - res.debt, res.ft, sender, orders, tradingAmts, maxAmountIn, block.timestamp + 1 hours - ); - - vm.expectRevert(RouterErrors.OrdersAndAmtsLengthNotMatch.selector); - res.router.swapExactTokenToToken( - res.debt, res.ft, sender, orders, tradingAmts, maxAmountIn, block.timestamp + 1 hours - ); - vm.stopPrank(); - } -} diff --git a/test/TermMaxTestBase.t.sol b/test/TermMaxTestBase.t.sol deleted file mode 100644 index 4da5e20..0000000 --- a/test/TermMaxTestBase.t.sol +++ /dev/null @@ -1,124 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import "forge-std/Test.sol"; -import {console} from "forge-std/console.sol"; -import {DeployUtils} from "./utils/DeployUtils.sol"; -import {JSONLoader} from "./utils/JSONLoader.sol"; -import {StateChecker} from "./utils/StateChecker.sol"; -import {SwapUtils} from "./utils/SwapUtils.sol"; -import {LoanUtils} from "./utils/LoanUtils.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; -import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; -import {IFlashLoanReceiver} from "contracts/IFlashLoanReceiver.sol"; -import {ITermMaxMarket, TermMaxMarket, Constants, MarketEvents, MarketErrors} from "contracts/TermMaxMarket.sol"; -import {ITermMaxOrder, TermMaxOrder, ISwapCallback, OrderEvents, OrderErrors} from "contracts/TermMaxOrder.sol"; -import {MockERC20, ERC20} from "contracts/test/MockERC20.sol"; -import {MockPriceFeed} from "contracts/test/MockPriceFeed.sol"; -import {TermMaxVault} from "contracts/vault/TermMaxVault.sol"; -import {VaultErrors, VaultEvents, ITermMaxVault} from "contracts/vault/TermMaxVault.sol"; -import {OrderManager} from "contracts/vault/OrderManager.sol"; -import {VaultConstants} from "contracts/lib/VaultConstants.sol"; -import {PendingAddress, PendingUint192} from "contracts/lib/PendingLib.sol"; -import {MockSwapAdapter} from "contracts/test/MockSwapAdapter.sol"; -import {SwapUnit, ISwapAdapter} from "contracts/router/ISwapAdapter.sol"; -import {RouterErrors, RouterEvents, TermMaxRouter} from "contracts/router/TermMaxRouter.sol"; -import "contracts/storage/TermMaxStorage.sol"; - -abstract contract TermMaxTestBase is Test { - using JSONLoader for *; - using SafeCast for *; - - DeployUtils.Res res; - - OrderConfig orderConfig; - MarketConfig marketConfig; - - address admin = vm.randomAddress(); - address curator = vm.randomAddress(); - address allocator = vm.randomAddress(); - address guardian = vm.randomAddress(); - address treasurer = vm.randomAddress(); - string testdata; - - ITermMaxVault vault; - - uint256 timelock = 86400; - uint256 maxCapacity = 1000000e18; - uint64 performanceFeeRate = 0.5e8; - - ITermMaxMarket market2; - - uint256 currentTime; - uint32 maxLtv = 0.89e8; - uint32 liquidationLtv = 0.9e8; - VaultInitialParams initialParams; - - address pool = vm.randomAddress(); - - MockSwapAdapter adapter; - - function setUp() public { - vm.startPrank(admin); - testdata = vm.readFile(string.concat(vm.projectRoot(), "/test/testdata/testdata.json")); - - currentTime = vm.parseUint(vm.parseJsonString(testdata, ".currentTime")); - vm.warp(currentTime); - - marketConfig = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); - orderConfig = JSONLoader.getOrderConfigFromJson(testdata, ".orderConfig"); - marketConfig.maturity = uint64(currentTime + 90 days); - res = DeployUtils.deployMockMarket(admin, marketConfig, maxLtv, liquidationLtv); - MarketConfig memory marketConfig2 = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); - marketConfig2.maturity = uint64(currentTime + 180 days); - - market2 = ITermMaxMarket( - res.factory.createMarket( - DeployUtils.GT_ERC20, - MarketInitialParams({ - collateral: address(res.collateral), - debtToken: res.debt, - admin: admin, - gtImplementation: address(0), - marketConfig: marketConfig2, - loanConfig: LoanConfig({ - maxLtv: maxLtv, - liquidationLtv: liquidationLtv, - liquidatable: true, - oracle: res.oracle - }), - gtInitalParams: abi.encode(type(uint256).max), - tokenName: "test", - tokenSymbol: "test" - }), - 0 - ) - ); - - // update oracle - res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.eth")); - res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.dai")); - - initialParams = VaultInitialParams( - admin, curator, timelock, res.debt, maxCapacity, "Vault-DAI", "Vault-DAI", performanceFeeRate - ); - - res.vault = DeployUtils.deployVault(initialParams); - - res.vault.submitGuardian(guardian); - res.vault.setIsAllocator(allocator, true); - - res.vault.submitMarket(address(res.market), true); - vm.warp(currentTime + timelock + 1); - res.vault.acceptMarket(address(res.market)); - vm.warp(currentTime); - - res.order = res.vault.createOrder(res.market, maxCapacity, 0, orderConfig.curveCuts); - - res.router = DeployUtils.deployRouter(admin); - adapter = new MockSwapAdapter(pool); - res.router.setAdapterWhitelist(address(adapter), true); - vm.stopPrank(); - } -} diff --git a/test/TermMaxToken.t.sol b/test/TermMaxToken.t.sol deleted file mode 100644 index 06b23c2..0000000 --- a/test/TermMaxToken.t.sol +++ /dev/null @@ -1,440 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {TermMaxToken, StakingBuffer} from "contracts/tokens/TermMaxToken.sol"; -import {Test} from "forge-std/Test.sol"; -import {MockAave} from "contracts/test/MockAave.sol"; -import {MockERC20} from "contracts/test/MockERC20.sol"; -import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; -import {IERC20Errors} from "@openzeppelin/contracts/interfaces/draft-IERC6093.sol"; - -contract TermMaxTokenTest is Test { - TermMaxToken public termMaxToken; - MockAave public aavePool; - MockERC20 public underlying; - address public admin = vm.randomAddress(); - - function setUp() public { - underlying = new MockERC20("USDC", "USDC", 6); - aavePool = new MockAave(address(underlying)); - - vm.label(address(underlying), "USDC"); - vm.label(address(aavePool), "AavePool"); - vm.label(admin, "Admin"); - - address implementation = address(new TermMaxToken(address(aavePool), 0)); - termMaxToken = TermMaxToken( - address( - new ERC1967Proxy( - implementation, - abi.encodeWithSelector( - TermMaxToken.initialize.selector, - admin, - address(underlying), - StakingBuffer.BufferConfig({minimumBuffer: 1000e6, maximumBuffer: 10000e6, buffer: 5000e6}) - ) - ) - ) - ); - - vm.label(address(termMaxToken), "tmxUSDC"); - } - - function testMint() public { - uint256 amount = 1000e6; - underlying.mint(address(this), amount); - underlying.approve(address(termMaxToken), amount); - - termMaxToken.mint(address(this), amount); - - assertEq(termMaxToken.balanceOf(address(this)), amount); - assertEq(underlying.balanceOf(address(this)), 0); - // Check that aTokens were minted to the TermMaxToken contract - assertEq(aavePool.balanceOf(address(termMaxToken)), 0); - assertEq(underlying.balanceOf(address(termMaxToken)), amount); - } - - function testBurn() public { - uint256 amount = 1000e6; - underlying.mint(address(this), amount); - underlying.approve(address(termMaxToken), amount); - termMaxToken.mint(address(this), amount); - - termMaxToken.burn(address(this), amount); - - assertEq(termMaxToken.balanceOf(address(this)), 0); - assertEq(underlying.balanceOf(address(this)), amount); - assertEq(aavePool.balanceOf(address(termMaxToken)), 0); - } - - function testBurnToAToken() public { - uint256 amount = 1000e6; - underlying.mint(address(this), amount); - underlying.approve(address(termMaxToken), amount); - termMaxToken.mint(address(this), amount); - - vm.expectRevert(); - termMaxToken.burnToAToken(address(this), amount); - - underlying.mint(address(this), amount * 10); - underlying.approve(address(termMaxToken), amount * 10); - termMaxToken.mint(address(this), amount * 10); - - termMaxToken.burnToAToken(address(this), amount); - - assertEq(termMaxToken.balanceOf(address(this)), amount * 10); - assertEq(aavePool.balanceOf(address(this)), amount); - } - - function testWithdrawIncomeAssets() public { - // Setup - mint some tokens - uint256 amount = 1000e6; - underlying.mint(address(this), amount); - underlying.approve(address(termMaxToken), amount); - termMaxToken.mint(address(this), amount); - - // Simulate yield by directly minting aTokens to the TermMaxToken contract - uint256 yieldAmount = 100e6; - aavePool.simulateInterestAccrual(address(termMaxToken), yieldAmount); - - // Withdraw income as the admin - vm.startPrank(admin); - termMaxToken.withdrawIncomeAssets(address(underlying), admin, yieldAmount); - vm.stopPrank(); - - // Assert balances are correct - assertEq(underlying.balanceOf(admin), yieldAmount); - assertEq(termMaxToken.totalIncomeAssets(), yieldAmount); - } - - function testUpdateBufferConfigAndAddReserves() public { - uint256 additionalReserves = 500e6; - underlying.mint(admin, additionalReserves); - - vm.startPrank(admin); - underlying.approve(address(termMaxToken), additionalReserves); - - StakingBuffer.BufferConfig memory newConfig = - StakingBuffer.BufferConfig({minimumBuffer: 2000e6, maximumBuffer: 20000e6, buffer: 10000e6}); - - termMaxToken.updateBufferConfigAndAddReserves(additionalReserves, newConfig); - vm.stopPrank(); - - // Get current buffer config - (uint256 minimumBuffer, uint256 maximumBuffer, uint256 buffer) = termMaxToken.bufferConfig(); - - // Assert the new config was set correctly - assertEq(minimumBuffer, newConfig.minimumBuffer); - assertEq(maximumBuffer, newConfig.maximumBuffer); - assertEq(buffer, newConfig.buffer); - - // Assert the additional reserves were added - assertEq(underlying.balanceOf(address(termMaxToken)), additionalReserves); - } - - function testTotalIncomeAssets() public { - uint256 amount = 1000e6; - underlying.mint(address(this), amount); - underlying.approve(address(termMaxToken), amount); - termMaxToken.mint(address(this), amount); - - // Simulate yield by directly minting aTokens to the TermMaxToken contract - uint256 yieldAmount = 100e6; - aavePool.simulateInterestAccrual(address(termMaxToken), yieldAmount); - - assertEq(termMaxToken.totalIncomeAssets(), yieldAmount); - } - - function testMintZeroAmount() public { - // The mint function doesn't explicitly check for zero amounts at the ERC20 level, - // but it should revert due to transferFrom of zero amount or other validations - underlying.mint(address(this), 0); - underlying.approve(address(termMaxToken), 0); - - // This should succeed as minting 0 tokens is typically allowed - termMaxToken.mint(address(this), 0); - assertEq(termMaxToken.balanceOf(address(this)), 0); - } - - function testBurnMoreThanBalance() public { - uint256 amount = 1000e6; - underlying.mint(address(this), amount); - underlying.approve(address(termMaxToken), amount); - termMaxToken.mint(address(this), amount); - - vm.expectRevert(); - termMaxToken.burn(address(this), amount + 1); - } - - function testWithdrawTooMuchIncome() public { - // Setup - mint some tokens - uint256 amount = 1000e6; - underlying.mint(address(this), amount); - underlying.approve(address(termMaxToken), amount); - termMaxToken.mint(address(this), amount); - - // Simulate yield by directly minting aTokens to the TermMaxToken contract - uint256 yieldAmount = 100e6; - aavePool.simulateInterestAccrual(address(termMaxToken), yieldAmount); - - // Try to withdraw more than available income - vm.startPrank(admin); - vm.expectRevert(); - termMaxToken.withdrawIncomeAssets(address(underlying), admin, yieldAmount + 1); - vm.stopPrank(); - } - - function testNonAdminCannotWithdrawIncome() public { - // Setup - mint some tokens - uint256 amount = 1000e6; - underlying.mint(address(this), amount); - underlying.approve(address(termMaxToken), amount); - termMaxToken.mint(address(this), amount); - - // Simulate yield by directly minting aTokens to the TermMaxToken contract - uint256 yieldAmount = 100e6; - aavePool.simulateInterestAccrual(address(termMaxToken), yieldAmount); - - // Try to withdraw as non-admin - vm.expectRevert(); - termMaxToken.withdrawIncomeAssets(address(underlying), address(this), yieldAmount); - } - - function testNonAdminCannotUpdateBufferConfig() public { - StakingBuffer.BufferConfig memory newConfig = - StakingBuffer.BufferConfig({minimumBuffer: 2000e6, maximumBuffer: 20000e6, buffer: 10000e6}); - - vm.expectRevert(); - termMaxToken.updateBufferConfigAndAddReserves(0, newConfig); - } - - function testWithdrawIncomeAsAToken() public { - // Setup - mint some tokens - uint256 amount = 1000e6; - underlying.mint(address(this), amount); - underlying.approve(address(termMaxToken), amount); - termMaxToken.mint(address(this), amount); - - // Simulate yield by directly minting aTokens to the TermMaxToken contract - uint256 yieldAmount = 100e6; - aavePool.simulateInterestAccrual(address(termMaxToken), yieldAmount); - - // Withdraw income as aToken - vm.startPrank(admin); - termMaxToken.withdrawIncomeAssets(address(aavePool), admin, yieldAmount); - vm.stopPrank(); - - // Assert balances are correct - assertEq(aavePool.balanceOf(admin), yieldAmount); - } - - function testWithdrawIncomeAsInvalidToken() public { - // Setup - MockERC20 invalidToken = new MockERC20("Invalid", "INV", 18); - - // Attempt to withdraw income with invalid token - vm.startPrank(admin); - vm.expectRevert(); - termMaxToken.withdrawIncomeAssets(address(invalidToken), admin, 100e6); - vm.stopPrank(); - } - - function testInvalidBufferConfiguration() public { - vm.startPrank(admin); - - // Test minimum buffer greater than maximum buffer - vm.expectRevert(abi.encodeWithSelector(StakingBuffer.InvalidBuffer.selector, 10000e6, 5000e6, 7500e6)); - termMaxToken.updateBufferConfigAndAddReserves( - 0, StakingBuffer.BufferConfig({minimumBuffer: 10000e6, maximumBuffer: 5000e6, buffer: 7500e6}) - ); - - // Test buffer outside min/max range (below minimum) - vm.expectRevert(abi.encodeWithSelector(StakingBuffer.InvalidBuffer.selector, 5000e6, 10000e6, 4000e6)); - termMaxToken.updateBufferConfigAndAddReserves( - 0, StakingBuffer.BufferConfig({minimumBuffer: 5000e6, maximumBuffer: 10000e6, buffer: 4000e6}) - ); - - // Test buffer outside min/max range (above maximum) - vm.expectRevert(abi.encodeWithSelector(StakingBuffer.InvalidBuffer.selector, 5000e6, 10000e6, 11000e6)); - termMaxToken.updateBufferConfigAndAddReserves( - 0, StakingBuffer.BufferConfig({minimumBuffer: 5000e6, maximumBuffer: 10000e6, buffer: 11000e6}) - ); - - vm.stopPrank(); - } - - function testUnauthorizedAccess() public { - address unauthorizedUser = vm.randomAddress(); - - // Test unauthorized buffer config update - vm.startPrank(unauthorizedUser); - vm.expectRevert(); - termMaxToken.updateBufferConfigAndAddReserves( - 0, StakingBuffer.BufferConfig({minimumBuffer: 2000e6, maximumBuffer: 20000e6, buffer: 10000e6}) - ); - vm.stopPrank(); - - // Test unauthorized income withdrawal - vm.startPrank(unauthorizedUser); - vm.expectRevert(); - termMaxToken.withdrawIncomeAssets(address(termMaxToken), unauthorizedUser, 100e6); - vm.stopPrank(); - } - - function testBurnToATokenInsufficientStaking() public { - uint256 amount = 1000e6; - underlying.mint(address(this), amount); - underlying.approve(address(termMaxToken), amount); - termMaxToken.mint(address(this), amount); - - // Should revert when trying to burn to aToken without sufficient staking buffer - vm.expectRevert( - abi.encodeWithSelector(IERC20Errors.ERC20InsufficientBalance.selector, address(termMaxToken), 0, amount) - ); - termMaxToken.burnToAToken(address(this), amount); - } - - function testBurnToATokenExceedsBalance() public { - uint256 amount = 1000e6; - underlying.mint(address(this), amount * 20); - underlying.approve(address(termMaxToken), amount * 20); - termMaxToken.mint(address(this), amount * 20); - - // Should revert when trying to burn more than balance - vm.expectRevert( - abi.encodeWithSelector( - IERC20Errors.ERC20InsufficientBalance.selector, address(this), amount * 20, amount * 21 - ) - ); - termMaxToken.burnToAToken(address(this), amount * 21); - } - - function testMintWithInsufficientApproval() public { - uint256 amount = 1000e6; - underlying.mint(address(this), amount); - underlying.approve(address(termMaxToken), amount - 1); // Insufficient approval - - vm.expectRevert( - abi.encodeWithSelector( - IERC20Errors.ERC20InsufficientAllowance.selector, address(termMaxToken), amount - 1, amount - ) - ); - termMaxToken.mint(address(this), amount); - } - - function testBurnWithInsufficientBalance() public { - uint256 amount = 1000e6; - underlying.mint(address(this), amount); - underlying.approve(address(termMaxToken), amount); - termMaxToken.mint(address(this), amount); - - // Try to burn more than balance - vm.expectRevert( - abi.encodeWithSelector(IERC20Errors.ERC20InsufficientBalance.selector, address(this), amount, amount + 1) - ); - termMaxToken.burn(address(this), amount + 1); - } - - function testWithdrawIncomeToZeroAddress() public { - uint256 amount = 1000e6; - underlying.mint(address(this), amount); - underlying.approve(address(termMaxToken), amount); - termMaxToken.mint(address(this), amount); - - uint256 yieldAmount = 100e6; - aavePool.simulateInterestAccrual(address(termMaxToken), yieldAmount); - - vm.startPrank(admin); - vm.expectRevert(abi.encodeWithSelector(IERC20Errors.ERC20InvalidReceiver.selector, address(0))); - termMaxToken.withdrawIncomeAssets(address(underlying), address(0), yieldAmount); - vm.stopPrank(); - } - - function testMintToZeroAddress() public { - uint256 amount = 1000e6; - underlying.mint(address(this), amount); - underlying.approve(address(termMaxToken), amount); - - vm.expectRevert(abi.encodeWithSelector(IERC20Errors.ERC20InvalidReceiver.selector, address(0))); - termMaxToken.mint(address(0), amount); - } - - function testBurnToZeroAddress() public { - uint256 amount = 1000e6; - underlying.mint(address(this), amount); - underlying.approve(address(termMaxToken), amount); - termMaxToken.mint(address(this), amount); - vm.expectRevert(abi.encodeWithSelector(IERC20Errors.ERC20InvalidReceiver.selector, address(0))); - termMaxToken.burn(address(0), amount); - } - - function testUpdateBufferWithInsufficientBalance() public { - uint256 additionalReserves = 500e6; - // Don't mint tokens to admin - - vm.startPrank(admin); - underlying.approve(address(termMaxToken), additionalReserves); - - StakingBuffer.BufferConfig memory newConfig = - StakingBuffer.BufferConfig({minimumBuffer: 2000e6, maximumBuffer: 20000e6, buffer: 10000e6}); - - vm.expectRevert( - abi.encodeWithSelector(IERC20Errors.ERC20InsufficientBalance.selector, admin, 0, additionalReserves) - ); - termMaxToken.updateBufferConfigAndAddReserves(additionalReserves, newConfig); - vm.stopPrank(); - } - - function testTermMaxTokenFuzzActions() public { - vm.prank(admin); - termMaxToken.updateBufferConfigAndAddReserves( - 0, StakingBuffer.BufferConfig({minimumBuffer: 500e6, maximumBuffer: 1000e6, buffer: 700e6}) - ); - - address[] memory accounts = new address[](10); - for (uint256 i = 0; i < accounts.length; i++) { - accounts[i] = vm.addr(i + 1); // Create unique addresses for each account - } - uint256 totalInterest = 0; - for (uint256 i = 0; i < 1000; i++) { - uint256 amount = vm.randomUint(1e6, 1000000e6); - address account = accounts[vm.randomUint(0, accounts.length - 1)]; - vm.startPrank(account); - uint256 action = vm.randomUint(0, 2); // 0 for mint, 1 for burn - - uint256 underlyingBalanceBefore = underlying.balanceOf(account); - uint256 tmxTokenBalanceBefore = termMaxToken.balanceOf(account); - if (action == 0 || tmxTokenBalanceBefore < amount) { - if (underlyingBalanceBefore < amount) { - underlying.mint(account, amount - underlyingBalanceBefore); - } - // Mint action - underlying.mint(account, amount); - underlying.approve(address(termMaxToken), amount); - termMaxToken.mint(account, amount); - assertEq(termMaxToken.balanceOf(account), amount + tmxTokenBalanceBefore); - } else { - // Burn action - if (termMaxToken.balanceOf(account) >= amount) { - termMaxToken.burn(account, amount); - assertEq(termMaxToken.balanceOf(account), tmxTokenBalanceBefore - amount); - assertEq(underlying.balanceOf(account), underlyingBalanceBefore + amount); - } - } - - // Simulate interest accrual - uint256 rate = vm.randomUint(0.01e8, 0.1e8); - uint256 aTokenBalanceBefore = aavePool.balanceOf(address(termMaxToken)); - uint256 interest = (aTokenBalanceBefore * rate) / 1e8; // Interest accrued - aavePool.simulateInterestAccrual(address(termMaxToken), interest); - totalInterest += interest; - vm.stopPrank(); - } - - assertEq(termMaxToken.totalIncomeAssets(), totalInterest); - assertEq( - underlying.balanceOf(address(termMaxToken)) + aavePool.balanceOf(address(termMaxToken)), - totalInterest + termMaxToken.totalSupply() - ); - } -} diff --git a/test/Vault.t.sol b/test/Vault.t.sol deleted file mode 100644 index 8905418..0000000 --- a/test/Vault.t.sol +++ /dev/null @@ -1,1085 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import "forge-std/Test.sol"; -import {console} from "forge-std/console.sol"; -import {DeployUtils} from "./utils/DeployUtils.sol"; -import {JSONLoader} from "./utils/JSONLoader.sol"; -import {StateChecker} from "./utils/StateChecker.sol"; -import {SwapUtils} from "./utils/SwapUtils.sol"; -import {LoanUtils} from "./utils/LoanUtils.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; -import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; -import {IFlashLoanReceiver} from "contracts/IFlashLoanReceiver.sol"; -import {ITermMaxMarket, TermMaxMarket, Constants, MarketEvents, MarketErrors} from "contracts/TermMaxMarket.sol"; -import {ITermMaxOrder, TermMaxOrder, ISwapCallback, OrderEvents, OrderErrors} from "contracts/TermMaxOrder.sol"; -import {MockERC20, ERC20} from "contracts/test/MockERC20.sol"; -import {MockPriceFeed} from "contracts/test/MockPriceFeed.sol"; -import {TermMaxVault} from "contracts/vault/TermMaxVault.sol"; -import {VaultErrors, VaultEvents, ITermMaxVault} from "contracts/vault/TermMaxVault.sol"; -import {OrderManager, OrderInfo} from "contracts/vault/OrderManager.sol"; -import {VaultConstants} from "contracts/lib/VaultConstants.sol"; -import {PendingAddress, PendingUint192} from "contracts/lib/PendingLib.sol"; -import "contracts/storage/TermMaxStorage.sol"; - -contract VaultTest is Test { - using JSONLoader for *; - using SafeCast for *; - - DeployUtils.Res res; - - OrderConfig orderConfig; - MarketConfig marketConfig; - - address deployer = vm.randomAddress(); - address curator = vm.randomAddress(); - address allocator = vm.randomAddress(); - address guardian = vm.randomAddress(); - address lper = vm.randomAddress(); - address treasurer = vm.randomAddress(); - string testdata; - - ITermMaxVault vault; - - uint256 timelock = 86400; - uint256 maxCapacity = 1000000e18; - uint64 performanceFeeRate = 0.5e8; - - ITermMaxMarket market2; - - uint256 currentTime; - uint32 maxLtv = 0.89e8; - uint32 liquidationLtv = 0.9e8; - VaultInitialParams initialParams; - - function setUp() public { - vm.startPrank(deployer); - testdata = vm.readFile(string.concat(vm.projectRoot(), "/test/testdata/testdata.json")); - - currentTime = vm.parseUint(vm.parseJsonString(testdata, ".currentTime")); - vm.warp(currentTime); - - marketConfig = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); - orderConfig = JSONLoader.getOrderConfigFromJson(testdata, ".orderConfig"); - marketConfig.maturity = uint64(currentTime + 90 days); - res = DeployUtils.deployMockMarket(deployer, marketConfig, maxLtv, liquidationLtv); - MarketConfig memory marketConfig2 = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); - marketConfig2.maturity = uint64(currentTime + 180 days); - - market2 = ITermMaxMarket( - res.factory.createMarket( - DeployUtils.GT_ERC20, - MarketInitialParams({ - collateral: address(res.collateral), - debtToken: res.debt, - admin: deployer, - gtImplementation: address(0), - marketConfig: marketConfig2, - loanConfig: LoanConfig({ - maxLtv: maxLtv, - liquidationLtv: liquidationLtv, - liquidatable: true, - oracle: res.oracle - }), - gtInitalParams: abi.encode(type(uint256).max), - tokenName: "test", - tokenSymbol: "test" - }), - 0 - ) - ); - - // update oracle - res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.eth")); - res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.dai")); - - uint256 amount = 10000e8; - - initialParams = VaultInitialParams( - deployer, curator, timelock, res.debt, maxCapacity, "Vault-DAI", "Vault-DAI", performanceFeeRate - ); - - vault = DeployUtils.deployVault(initialParams); - - vault.submitGuardian(guardian); - vault.setIsAllocator(allocator, true); - - vault.submitMarket(address(res.market), true); - vault.submitMarket(address(market2), true); - vm.warp(currentTime + timelock + 1); - vault.acceptMarket(address(res.market)); - vault.acceptMarket(address(market2)); - vm.warp(currentTime); - - res.debt.mint(deployer, amount); - res.debt.approve(address(vault), amount); - vault.deposit(amount, deployer); - - res.order = vault.createOrder(res.market, maxCapacity, amount, orderConfig.curveCuts); - - res.debt.mint(deployer, 10000e18); - res.debt.approve(address(res.market), 10000e18); - res.market.mint(deployer, 10000e18); - vm.stopPrank(); - } - - function testRoleManagement() public { - // Test initial roles - assertEq(vault.guardian(), guardian); - assertEq(vault.curator(), curator); - assertTrue(vault.isAllocator(allocator)); - - // Test guardian role checks - vm.startPrank(deployer); - address newGuardian = address(0x123); - vault.submitGuardian(newGuardian); - - // Should not be set immediately due to timelock - assertEq(vault.guardian(), guardian); - - // Move forward past timelock - vm.warp(block.timestamp + timelock + 1); - vault.acceptGuardian(); - assertEq(vault.guardian(), newGuardian); - vm.stopPrank(); - - // Test revoke guardian - address nextGuardian = address(0x456); - vm.prank(deployer); - vault.submitGuardian(nextGuardian); - - vm.prank(newGuardian); - vault.revokePendingGuardian(); - assertEq(vault.pendingGuardian().value, address(0)); - - // Test curator role - vm.prank(deployer); - address newCurator = address(0x456); - vault.setCurator(newCurator); - assertEq(vault.curator(), newCurator); - - // Test allocator management - vm.prank(deployer); - address newAllocator = address(0x789); - vault.setIsAllocator(newAllocator, true); - assertTrue(vault.isAllocator(newAllocator)); - } - - function test_RevertSetGuardian() public { - address newGuardian = address(0x123); - vm.prank(allocator); - vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, allocator)); - vault.submitGuardian(newGuardian); - - vm.startPrank(deployer); - vault.submitGuardian(newGuardian); - - vm.expectRevert(VaultErrors.AlreadyPending.selector); - vault.submitGuardian(newGuardian); - - vm.expectRevert(VaultErrors.TimelockNotElapsed.selector); - vault.acceptGuardian(); - - vm.warp(block.timestamp + 1 days + 1); - vault.acceptGuardian(); - - vm.expectRevert(VaultErrors.AlreadySet.selector); - vault.submitGuardian(address(0x123)); - - vm.stopPrank(); - } - - function testMarketWhitelist() public { - // check current timelock value - assertEq(vault.timelock(), 86400); - - // submit market - vm.startPrank(curator); - address market = address(0x123); - vault.submitMarket(market, false); - - assertEq(vault.marketWhitelist(market), false); - vault.submitMarket(market, true); - - assertEq(vault.marketWhitelist(market), false); - - // The validAt of the newly submitted market is the current time, without timelock - PendingUint192 memory pendingMarket = vault.pendingMarkets(market); - assertEq(pendingMarket.validAt, block.timestamp + 86400); - - vm.warp(block.timestamp + 86400 + 1); - vault.acceptMarket(market); - assertEq(vault.marketWhitelist(market), true); - - vault.submitMarket(market, false); - assertEq(vault.marketWhitelist(market), false); - vm.stopPrank(); - - // Test revoke market - address newMarket = address(0x456); - vm.prank(curator); - vault.submitMarket(newMarket, true); - - vm.prank(guardian); - vault.revokePendingMarket(newMarket); - assertEq(vault.pendingMarkets(newMarket).validAt, 0); - } - - function test_RevertSetMarketWhitelist() public { - address market = address(0x123); - - vm.prank(vm.randomAddress()); - vm.expectRevert(VaultErrors.NotCuratorRole.selector); - vault.submitMarket(market, true); - - vm.startPrank(curator); - vault.submitMarket(market, true); - - vm.expectRevert(VaultErrors.AlreadyPending.selector); - vault.submitMarket(market, true); - - vm.expectRevert(VaultErrors.TimelockNotElapsed.selector); - vault.acceptMarket(market); - - vm.warp(block.timestamp + 86400 + 1); - vault.acceptMarket(market); - - vm.expectRevert(VaultErrors.AlreadySet.selector); - vault.submitMarket(market, true); - - vm.stopPrank(); - } - - function test_RevertCreateOrder() public { - ITermMaxMarket market = ITermMaxMarket(address(0x123)); - address bob = lper; - vm.startPrank(bob); - - vm.expectRevert(VaultErrors.NotCuratorRole.selector); - vault.createOrder(market, maxCapacity, 0, orderConfig.curveCuts); - - vm.stopPrank(); - - vm.startPrank(curator); - vm.expectRevert(VaultErrors.MarketNotWhitelisted.selector); - vault.createOrder(market, maxCapacity, 0, orderConfig.curveCuts); - vm.stopPrank(); - } - - function testTimelockManagement() public { - uint256 newTimelock = 2 days; - - vm.prank(curator); - vault.submitTimelock(newTimelock); - assertEq(vault.timelock(), newTimelock); - - newTimelock = 1.5 days; - vm.prank(curator); - vault.submitTimelock(newTimelock); - assertEq(vault.timelock(), 2 days); - - PendingUint192 memory pendingTimelock = vault.pendingTimelock(); - assertEq(uint256(pendingTimelock.value), newTimelock); - assertEq(vault.timelock(), 2 days); - - // Can accept after timelock period - vm.warp(currentTime + 2 days); - vm.prank(vm.randomAddress()); - vault.acceptTimelock(); - assertEq(vault.timelock(), newTimelock); - - // revoke - vm.warp(currentTime + 3 days); - vm.prank(curator); - vault.submitTimelock(1 days); - vm.prank(guardian); - vault.revokePendingTimelock(); - pendingTimelock = vault.pendingTimelock(); - assertEq(uint256(pendingTimelock.value), 0); - } - - function test_RevertSetTimelock() public { - uint256 newTimelock = 2 days; - vm.startPrank(curator); - - vault.submitTimelock(newTimelock); - - vm.expectRevert(VaultErrors.AlreadySet.selector); - vault.submitTimelock(newTimelock); - - newTimelock = 1.5 days; - vault.submitTimelock(newTimelock); - - vm.expectRevert(VaultErrors.AlreadyPending.selector); - vault.submitTimelock(newTimelock); - - vm.warp(currentTime + 2 days); - vault.acceptTimelock(); - - vm.expectRevert(VaultErrors.BelowMinTimelock.selector); - vault.submitTimelock(1 days - 1); - - vm.expectRevert(VaultErrors.AboveMaxTimelock.selector); - vault.submitTimelock(VaultConstants.MAX_TIMELOCK + 1); - - vm.expectRevert(VaultErrors.NoPendingValue.selector); - vault.acceptTimelock(); - - vault.submitTimelock(1 days); - vm.warp(currentTime + 0.9 days); - vm.expectRevert(VaultErrors.TimelockNotElapsed.selector); - vault.acceptTimelock(); - - vm.stopPrank(); - - vm.expectRevert(VaultErrors.NotCuratorRole.selector); - vault.submitTimelock(1 days); - } - - function testPerformanceFeeRate() public { - uint184 newPercentage = 0.4e8; - - vm.prank(curator); - vault.submitPerformanceFeeRate(newPercentage); - - uint256 percentage = vault.performanceFeeRate(); - assertEq(percentage, newPercentage); - - newPercentage = 0.5e8; - vm.prank(curator); - vault.submitPerformanceFeeRate(newPercentage); - - vm.prank(guardian); - vault.revokePendingPerformanceFeeRate(); - - vm.prank(curator); - vault.submitPerformanceFeeRate(newPercentage); - - PendingUint192 memory pendingFeeRate = vault.pendingPerformanceFeeRate(); - assertEq(uint256(pendingFeeRate.value), newPercentage); - - vm.warp(pendingFeeRate.validAt); - vm.prank(vm.randomAddress()); - vault.acceptPerformanceFeeRate(); - percentage = vault.performanceFeeRate(); - assertEq(percentage, newPercentage); - } - - function test_RevertSetPerformanceFeeRate() public { - uint184 newPercentage = 0.5e8; - - vm.prank(curator); - vm.expectRevert(VaultErrors.AlreadySet.selector); - vault.submitPerformanceFeeRate(newPercentage); - - newPercentage = 0.6e8; - vm.prank(curator); - vm.expectRevert(VaultErrors.PerformanceFeeRateExceeded.selector); - vault.submitPerformanceFeeRate(newPercentage); - - vm.prank(vm.randomAddress()); - vm.expectRevert(VaultErrors.NotCuratorRole.selector); - vault.submitPerformanceFeeRate(newPercentage); - - newPercentage = 0.4e8; - vm.startPrank(curator); - vault.submitPerformanceFeeRate(newPercentage); - - newPercentage = 0.41e8; - vault.submitPerformanceFeeRate(newPercentage); - - newPercentage = 0.42e8; - vm.expectRevert(VaultErrors.AlreadyPending.selector); - vault.submitPerformanceFeeRate(newPercentage); - - vm.stopPrank(); - } - - function testSupplyQueue(uint256 orderCount, uint256 seed) public { - vm.assume(orderCount < VaultConstants.MAX_QUEUE_LENGTH && orderCount > 0); - address[] memory supplyQueue = new address[](orderCount); - supplyQueue[0] = vault.supplyQueue(0); - vm.startPrank(curator); - for (uint256 i = 1; i < orderCount; i++) { - address order = address(vault.createOrder(res.market, maxCapacity, 0, orderConfig.curveCuts)); - OrderInfo memory orderInfo = vault.orderMapping(order); - assertEq(address(orderInfo.market), address(res.market)); - assertEq(orderInfo.maturity, res.market.config().maturity); - assertEq(address(orderInfo.ft), address(res.ft)); - assertEq(address(orderInfo.xt), address(res.xt)); - supplyQueue[i] = order; - assertEq(vault.supplyQueue(i), order); - } - - uint256[] memory indexes = new uint256[](orderCount); - for (uint256 i = 0; i < orderCount; i++) { - indexes[i] = i; - } - indexes = shuffle(indexes, seed); - vault.updateSupplyQueue(indexes); - - for (uint256 i = 0; i < orderCount; i++) { - assertEq(vault.supplyQueue(i), supplyQueue[indexes[i]]); - } - - vm.stopPrank(); - } - - function testWithdrawQueue(uint256 orderCount, uint256 seed) public { - vm.assume(orderCount < VaultConstants.MAX_QUEUE_LENGTH && orderCount > 0); - address[] memory withdrawQueue = new address[](orderCount); - withdrawQueue[0] = vault.withdrawQueue(0); - vm.startPrank(curator); - for (uint256 i = 1; i < orderCount; i++) { - address order = address(vault.createOrder(res.market, maxCapacity, 0, orderConfig.curveCuts)); - withdrawQueue[i] = order; - assertEq(vault.withdrawQueue(i), order); - } - - uint256[] memory indexes = new uint256[](orderCount); - for (uint256 i = 0; i < orderCount; i++) { - indexes[i] = i; - } - indexes = shuffle(indexes, seed); - vault.updateWithdrawQueue(indexes); - - for (uint256 i = 0; i < orderCount; i++) { - assertEq(vault.withdrawQueue(i), withdrawQueue[indexes[i]]); - } - - vm.stopPrank(); - } - - function shuffle(uint256[] memory arr, uint256 seed) public pure returns (uint256[] memory) { - uint256 length = arr.length; - - for (uint256 i = length - 1; i > 0; i--) { - uint256 j = seed % (i + 1); - - uint256 temp = arr[i]; - arr[i] = arr[j]; - arr[j] = temp; - } - - return arr; - } - - function test_RevertSupplyQueue() public { - vm.prank(lper); - vm.expectRevert(VaultErrors.NotAllocatorRole.selector); - vault.updateSupplyQueue(new uint256[](0)); - - vm.startPrank(curator); - vm.expectRevert(VaultErrors.SupplyQueueLengthMismatch.selector); - vault.updateSupplyQueue(new uint256[](0)); - - address order2 = address(vault.createOrder(res.market, maxCapacity, 0, orderConfig.curveCuts)); - uint256[] memory indexes = new uint256[](2); - indexes[0] = 1; - indexes[1] = 1; - vm.expectRevert(abi.encodeWithSelector(VaultErrors.DuplicateOrder.selector, order2)); - vault.updateSupplyQueue(indexes); - - vm.stopPrank(); - } - - function test_RevertWithdrawQueue() public { - vm.prank(lper); - vm.expectRevert(VaultErrors.NotAllocatorRole.selector); - vault.updateWithdrawQueue(new uint256[](0)); - - vm.startPrank(curator); - vm.expectRevert(VaultErrors.WithdrawQueueLengthMismatch.selector); - vault.updateWithdrawQueue(new uint256[](0)); - - address order2 = address(vault.createOrder(res.market, maxCapacity, 0, orderConfig.curveCuts)); - uint256[] memory indexes = new uint256[](2); - indexes[0] = 1; - indexes[1] = 1; - vm.expectRevert(abi.encodeWithSelector(VaultErrors.DuplicateOrder.selector, order2)); - vault.updateWithdrawQueue(indexes); - - vm.stopPrank(); - } - - function testUpdateOrder() public { - vm.startPrank(curator); - ITermMaxOrder[] memory orders = new ITermMaxOrder[](3); - orders[0] = res.order; - orders[1] = vault.createOrder(res.market, maxCapacity, 0, orderConfig.curveCuts); - orders[2] = vault.createOrder(res.market, maxCapacity, 0, orderConfig.curveCuts); - - int256[] memory changes = new int256[](3); - changes[0] = -3000; - changes[1] = 2000; - changes[2] = 1000; - - uint256[] memory maxSupplies = new uint256[](3); - maxSupplies[0] = maxCapacity - 1; - maxSupplies[1] = maxCapacity + 1; - maxSupplies[2] = maxCapacity; - - CurveCuts[] memory curveCuts = new CurveCuts[](3); - CurveCuts memory newCurveCuts = orderConfig.curveCuts; - newCurveCuts.lendCurveCuts[0].liqSquare++; - curveCuts[0] = newCurveCuts; - newCurveCuts.lendCurveCuts[0].liqSquare++; - curveCuts[1] = newCurveCuts; - newCurveCuts.lendCurveCuts[0].liqSquare++; - curveCuts[2] = newCurveCuts; - - uint256[] memory balancesBefore = new uint256[](3); - balancesBefore[0] = res.ft.balanceOf(address(orders[0])); - balancesBefore[1] = res.ft.balanceOf(address(orders[1])); - balancesBefore[2] = res.ft.balanceOf(address(orders[2])); - vault.updateOrders(orders, changes, maxSupplies, curveCuts); - - for (uint256 i = 0; i < orders.length; i++) { - assertEq(orders[i].orderConfig().maxXtReserve, maxSupplies[i]); - if (changes[i] < 0) { - assertEq(res.ft.balanceOf(address(orders[i])), balancesBefore[i] - (-changes[i]).toUint256()); - } else { - assertEq(res.ft.balanceOf(address(orders[i])), balancesBefore[i] + changes[i].toUint256()); - } - assertEq( - orders[i].orderConfig().curveCuts.lendCurveCuts[0].liqSquare, curveCuts[i].lendCurveCuts[0].liqSquare - ); - } - - vm.stopPrank(); - } - - function testDeposit() public { - vm.warp(currentTime + 2 days); - buyXt(48.219178e8, 1000e8); - - vm.warp(currentTime + 2 days); - address lper2 = vm.randomAddress(); - uint256 amount2 = 20000e8; - res.debt.mint(lper2, amount2); - vm.startPrank(lper2); - res.debt.approve(address(vault), amount2); - uint256 share = vault.previewDeposit(amount2); - vault.deposit(amount2, lper2); - assertEq(vault.balanceOf(lper2), share); - - vm.stopPrank(); - } - - function testDepositWhenNoOrders() public { - initialParams.name = "Vault-DAI2"; - initialParams.symbol = "Vault-DAI2"; - ITermMaxVault vault2 = DeployUtils.deployVault(initialParams); - vm.startPrank(deployer); - uint256 amount = 10000e8; - res.debt.mint(deployer, amount); - res.debt.approve(address(vault2), amount); - uint256 share = vault2.previewDeposit(amount); - vault2.deposit(amount, deployer); - assertEq(vault2.balanceOf(deployer), share); - assertEq(vault2.totalFt(), amount); - assertEq(vault2.totalAssets(), amount); - assertEq(vault2.totalSupply(), share); - vm.stopPrank(); - - vm.startPrank(lper); - res.debt.mint(lper, amount); - res.debt.approve(address(vault2), amount); - uint256 share2 = vault2.previewDeposit(amount); - vault2.deposit(amount, lper); - assertEq(vault2.balanceOf(lper), share2); - assertEq(vault2.totalFt(), amount + amount); - assertEq(vault2.totalAssets(), amount + amount); - assertEq(vault2.totalSupply(), share + share2); - vm.stopPrank(); - } - - function testRedeem() public { - vm.warp(currentTime + 2 days); - buyXt(48.219178e8, 1000e8); - vm.warp(currentTime + 4 days); - address lper2 = vm.randomAddress(); - uint256 amount2 = 10000e8; - res.debt.mint(lper2, amount2); - vm.startPrank(lper2); - res.debt.approve(address(vault), amount2); - vault.deposit(amount2, lper2); - vm.stopPrank(); - - vm.startPrank(deployer); - uint256 totalFt = vault.totalFt(); - uint256 lockedFr = vault.totalAssets(); - - uint256 share = vault.balanceOf(deployer); - uint256 redeemmedAmt = vault.previewRedeem(share); - assertEq(redeemmedAmt, vault.redeem(share, deployer, deployer)); - assert(redeemmedAmt > 10000e8); - assertEq(vault.totalFt(), totalFt - redeemmedAmt); - assertEq(vault.totalAssets(), lockedFr - redeemmedAmt); - - vm.stopPrank(); - } - - // redeem when balance bigger tha redeemed - function testRedeemCase2() public { - vm.warp(currentTime + 2 days); - buyXt(48.219178e8, 1000e8); - - vm.warp(currentTime + 4 days); - address lper2 = vm.randomAddress(); - uint256 amount2 = 10000e8; - res.debt.mint(lper2, amount2); - vm.startPrank(lper2); - res.debt.approve(address(vault), amount2); - vault.deposit(amount2, lper2); - vm.stopPrank(); - - vm.startPrank(curator); - ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); - orders[0] = res.order; - - int256[] memory changes = new int256[](1); - changes[0] = -1000e8; - - uint256[] memory maxSupplies = new uint256[](1); - maxSupplies[0] = maxCapacity; - - CurveCuts[] memory curveCuts = new CurveCuts[](1); - curveCuts[0] = orderConfig.curveCuts; - - vault.updateOrders(orders, changes, maxSupplies, curveCuts); - vm.stopPrank(); - - vm.startPrank(deployer); - uint256 totalFt = vault.totalFt(); - uint256 lockedFr = vault.totalAssets(); - - uint256 share = 100e8; - uint256 redeemmedAmt = vault.previewRedeem(share); - assertEq(redeemmedAmt, vault.redeem(share, deployer, deployer)); - assert(redeemmedAmt > share); - assertEq(vault.totalFt(), totalFt - redeemmedAmt); - assertEq(vault.totalAssets(), lockedFr - redeemmedAmt); - - vm.stopPrank(); - } - - function testActions() public { - console.log("----day 2----"); - vm.warp(currentTime + 2 days); - buyXt(48.219178e8, 1000e8); - console.log("anulizedInterest:", vault.annualizedInterest()); - console.log("apr:", vault.apr()); - - console.log("----day 3----"); - vm.warp(currentTime + 3 days); - console.log("new principal:", vault.totalAssets()); - address lper2 = vm.randomAddress(); - uint256 amount2 = 10000e8; - res.debt.mint(lper2, amount2); - vm.startPrank(lper2); - res.debt.approve(address(vault), amount2); - vault.deposit(amount2, lper2); - vm.stopPrank(); - console.log("principal after deposit:", vault.totalAssets()); - console.log("total supply:", vault.totalSupply()); - console.log("anulizedInterest:", vault.annualizedInterest()); - console.log("apr:", vault.apr()); - - console.log("----day 4----"); - vm.warp(currentTime + 4 days); - swapFtToXt(94.247e8, 2000e8); - console.log("1-principal after swap:", vault.totalAssets()); - console.log("1-anulizedInterest:", vault.annualizedInterest()); - console.log("1-apr:", vault.apr()); - swapFtToXt(94.247e8, 2000e8); - console.log("2-principal after swap:", vault.totalAssets()); - console.log("2-anulizedInterest:", vault.annualizedInterest()); - console.log("2-apr:", vault.apr()); - - console.log("----day 6----"); - vm.warp(currentTime + 6 days); - console.log("new principal:", vault.totalAssets()); - vm.startPrank(lper2); - console.log("previewRedeem: ", vault.previewRedeem(1000e8)); - assertEq(vault.previewRedeem(1000e8), vault.redeem(1000e8, lper2, lper2)); - console.log("principal after redeem:", vault.totalAssets()); - console.log("total supply:", vault.totalSupply()); - console.log("anulizedInterest:", vault.annualizedInterest()); - console.log("apr:", vault.apr()); - vm.stopPrank(); - - console.log("----day 91----"); - vm.warp(currentTime + 91 days); - console.log("new principal:", vault.totalAssets()); - console.log("previewRedeem: ", vault.previewRedeem(1000e8)); - - console.log("----day 92----"); - vm.warp(currentTime + 92 days); - console.log("new principal:", vault.totalAssets()); - vm.startPrank(lper2); - console.log("previewRedeem: ", vault.previewRedeem(1000e8)); - assertEq(vault.previewRedeem(1000e8), vault.redeem(1000e8, lper2, lper2)); - console.log("principal after redeem:", vault.totalAssets()); - console.log("total supply:", vault.totalSupply()); - console.log("anulizedInterest:", vault.annualizedInterest()); - console.log("apr:", vault.apr()); - vm.stopPrank(); - } - - function testAnulizedInterestLessThanZero() public { - uint128 tokenAmtIn = 100e8; - uint128 ftAmtOut = 100e8; - address taker = vm.randomAddress(); - res.debt.mint(taker, tokenAmtIn); - vm.startPrank(taker); - res.debt.approve(address(res.order), tokenAmtIn); - vm.expectRevert(VaultErrors.OrderHasNegativeInterest.selector); - res.order.swapExactTokenToToken(res.debt, res.ft, taker, tokenAmtIn, ftAmtOut, block.timestamp + 1 hours); - vm.stopPrank(); - } - - function testLockedFtGreaterThanTotalFt() public { - vm.warp(currentTime + 2 days); - buyXt(50e8, 1000e8); - - vm.warp(currentTime + 4 days); - uint128 tokenAmtIn = 80e8; - uint128 ftAmtOut = 130e8; - - address taker = vm.randomAddress(); - res.debt.mint(taker, tokenAmtIn); - vm.startPrank(taker); - res.debt.approve(address(res.order), tokenAmtIn); - - vm.expectRevert(VaultErrors.LockedFtGreaterThanTotalFt.selector); - res.order.swapExactTokenToToken(res.debt, res.ft, taker, tokenAmtIn, ftAmtOut, block.timestamp + 1 hours); - vm.stopPrank(); - } - - function testOrderHasNegativeInterest() public { - vm.warp(currentTime + 2 days); - uint128 tokenAmtIn = 90e8; - uint128 ftAmtOut = 100e8; - address taker = vm.randomAddress(); - res.debt.mint(taker, tokenAmtIn); - vm.startPrank(taker); - res.debt.approve(address(res.order), tokenAmtIn); - vm.expectRevert(VaultErrors.OrderHasNegativeInterest.selector); - res.order.swapExactTokenToToken(res.debt, res.ft, taker, tokenAmtIn, ftAmtOut, block.timestamp + 1 hours); - vm.stopPrank(); - } - - function testRedeemFromMarket() public { - vm.warp(currentTime + 2 days); - buyXt(48.219178e8, 1000e8); - - vm.warp(currentTime + 3 days); - address lper2 = vm.randomAddress(); - uint256 amount2 = 10000e8; - res.debt.mint(lper2, amount2); - vm.startPrank(lper2); - res.debt.approve(address(vault), amount2); - vault.deposit(amount2, lper2); - vm.stopPrank(); - - vm.startPrank(curator); - address order2 = address(vault.createOrder(market2, maxCapacity, 0, orderConfig.curveCuts)); - uint256[] memory indexes = new uint256[](2); - indexes[0] = 1; - indexes[1] = 0; - vault.updateSupplyQueue(indexes); - - res.debt.mint(curator, 10000e8); - res.debt.approve(address(vault), 10000e8); - vault.deposit(10000e8, curator); - - vm.stopPrank(); - - vm.warp(currentTime + 92 days); - - vm.startPrank(lper2); - - vault.redeem(1000e8, lper2, lper2); - vm.stopPrank(); - - uint256 performanceFee = vault.performanceFee(); - vm.prank(curator); - vault.withdrawPerformanceFee(curator, performanceFee); - - assertEq(vault.performanceFee(), 0); - assertEq(vault.annualizedInterest(), 0); - assertEq(vault.supplyQueueLength(), 1); - assertEq(vault.supplyQueue(0), order2); - assertEq(vault.withdrawQueueLength(), 1); - assertEq(vault.withdrawQueue(0), order2); - - vm.warp(currentTime + 182 days); - vm.prank(lper2); - vault.redeem(1000e8, lper2, lper2); - - vm.prank(curator); - vault.redeemOrder(ITermMaxOrder(order2)); - - assertEq(vault.performanceFee(), 0); - assertEq(vault.annualizedInterest(), 0); - assertEq(vault.supplyQueueLength(), 0); - assertEq(vault.withdrawQueueLength(), 0); - } - - function testRedeemFromMarket2() public { - vm.warp(currentTime + 2 days); - buyXt(48.219178e8, 1000e8); - - vm.warp(currentTime + 3 days); - address lper2 = vm.randomAddress(); - uint256 amount2 = 10000e8; - res.debt.mint(lper2, amount2); - vm.startPrank(lper2); - res.debt.approve(address(vault), amount2); - vault.deposit(amount2, lper2); - vm.stopPrank(); - - vm.startPrank(curator); - address order2 = address(vault.createOrder(market2, maxCapacity, 0, orderConfig.curveCuts)); - uint256[] memory indexes = new uint256[](2); - indexes[0] = 1; - indexes[1] = 0; - vault.updateSupplyQueue(indexes); - - res.debt.mint(curator, 10000e8); - res.debt.approve(address(vault), 10000e8); - vault.deposit(10000e8, curator); - - vm.stopPrank(); - - (, IERC20 xt,,,) = market2.tokens(); - - vm.warp(currentTime + 4 days); - { - address taker = vm.randomAddress(); - uint128 tokenAmtIn = 50e8; - res.debt.mint(taker, tokenAmtIn); - vm.startPrank(taker); - res.debt.approve(address(order2), tokenAmtIn); - ITermMaxOrder(order2).swapExactTokenToToken( - res.debt, xt, taker, tokenAmtIn, 1000e8, block.timestamp + 1 hours - ); - vm.stopPrank(); - } - - vm.warp(currentTime + 92 days); - - { - address taker = vm.randomAddress(); - uint128 tokenAmtIn = 50e8; - res.debt.mint(taker, tokenAmtIn); - vm.startPrank(taker); - res.debt.approve(address(order2), tokenAmtIn); - ITermMaxOrder(order2).swapExactTokenToToken( - res.debt, xt, taker, tokenAmtIn, 1000e8, block.timestamp + 1 hours - ); - vm.stopPrank(); - } - - vm.prank(lper2); - vault.redeem(100e8, lper2, lper2); - - uint256 performanceFee = vault.performanceFee(); - vm.prank(curator); - vault.withdrawPerformanceFee(curator, performanceFee); - - assertEq(vault.performanceFee(), 0); - assertGt(vault.annualizedInterest(), 0); - assertEq(vault.supplyQueueLength(), 1); - assertEq(vault.supplyQueue(0), order2); - assertEq(vault.withdrawQueueLength(), 1); - assertEq(vault.withdrawQueue(0), order2); - - vm.warp(currentTime + 182 days); - vm.prank(lper2); - vault.redeem(100e8, lper2, lper2); - - vm.prank(curator); - vault.redeemOrder(ITermMaxOrder(order2)); - - assertGt(vault.performanceFee(), 0); - assertEq(vault.annualizedInterest(), 0); - assertEq(vault.supplyQueueLength(), 0); - assertEq(vault.withdrawQueueLength(), 0); - } - - function testBadDebt() public { - vm.warp(currentTime + 2 days); - buyXt(48.219178e8, 1000e8); - - vm.warp(currentTime + 3 days); - address lper2 = vm.randomAddress(); - uint256 amount2 = 10000e8; - res.debt.mint(lper2, amount2); - vm.startPrank(lper2); - res.debt.approve(address(vault), amount2); - vault.deposit(amount2, lper2); - vm.stopPrank(); - - address borrower = vm.randomAddress(); - vm.startPrank(borrower); - LoanUtils.fastMintGt(res, borrower, 1000e8, 1e18); - vm.stopPrank(); - - vm.warp(marketConfig.maturity + 1 days); - - uint256 propotion = (res.ft.balanceOf(address(res.order)) * Constants.DECIMAL_BASE_SQ) - / (res.ft.totalSupply() - res.ft.balanceOf(address(res.market))); - - uint256 tokenOut = (res.debt.balanceOf(address(res.market)) * propotion) / Constants.DECIMAL_BASE_SQ; - uint256 badDebt = res.ft.balanceOf(address(res.order)) - tokenOut; - uint256 delivered = (propotion * 1e18) / Constants.DECIMAL_BASE_SQ; - - vm.startPrank(lper2); - vault.redeem(1000e8, lper2, lper2); - vm.stopPrank(); - - assertEq(vault.badDebtMapping(address(res.collateral)), badDebt); - assertEq(res.collateral.balanceOf(address(vault)), delivered); - - uint256 shareToDealBadDebt = vault.previewWithdraw(badDebt / 2); - vm.startPrank(lper2); - (uint256 shares, uint256 collateralOut) = vault.dealBadDebt(address(res.collateral), badDebt / 2, lper2, lper2); - assertEq(shares, shareToDealBadDebt); - assertEq(collateralOut, ((badDebt / 2) * delivered) / badDebt); - assertEq(vault.badDebtMapping(address(res.collateral)), badDebt - badDebt / 2); - assertEq(res.collateral.balanceOf(address(vault)), delivered - collateralOut); - vm.stopPrank(); - - vm.startPrank(lper2); - shareToDealBadDebt = vault.previewWithdraw(badDebt - badDebt / 2); - uint256 remainningCollateral = res.collateral.balanceOf(address(vault)); - vm.expectEmit(); - emit VaultEvents.DealBadDebt( - lper2, lper2, address(res.collateral), badDebt - badDebt / 2, shareToDealBadDebt, remainningCollateral - ); - (shares, collateralOut) = vault.dealBadDebt(address(res.collateral), badDebt - badDebt / 2, lper2, lper2); - assertEq(shares, shareToDealBadDebt); - assertEq(collateralOut, remainningCollateral); - assertEq(vault.badDebtMapping(address(res.collateral)), 0); - assertEq(res.collateral.balanceOf(address(vault)), 0); - vm.stopPrank(); - } - - function testDealBadDebtRevert() public { - vm.warp(currentTime + 2 days); - buyXt(48.219178e8, 1000e8); - - vm.warp(currentTime + 3 days); - address lper2 = vm.randomAddress(); - uint256 amount2 = 10000e8; - res.debt.mint(lper2, amount2); - vm.startPrank(lper2); - res.debt.approve(address(vault), amount2); - vault.deposit(amount2, lper2); - vm.stopPrank(); - - address borrower = vm.randomAddress(); - vm.startPrank(borrower); - LoanUtils.fastMintGt(res, borrower, 1000e8, 1e18); - vm.stopPrank(); - - vm.warp(currentTime + 92 days); - vm.startPrank(lper2); - vault.redeem(1000e8, lper2, lper2); - - uint256 badDebt = vault.badDebtMapping(address(res.collateral)); - vm.expectRevert(abi.encodeWithSelector(VaultErrors.InsufficientFunds.selector, badDebt, 2000e8)); - vault.dealBadDebt(address(res.collateral), 2000e8, lper2, lper2); - - vault.dealBadDebt(address(res.collateral), badDebt, lper2, lper2); - - vm.expectRevert(abi.encodeWithSelector(VaultErrors.NoBadDebt.selector, address(res.collateral))); - vault.dealBadDebt(address(res.collateral), 10e8, lper2, lper2); - - vm.stopPrank(); - } - - function buyFt(uint128 tokenAmtIn, uint128 ftAmtOut) internal { - address taker = vm.randomAddress(); - res.debt.mint(taker, tokenAmtIn); - vm.startPrank(taker); - res.debt.approve(address(res.order), tokenAmtIn); - res.order.swapExactTokenToToken(res.debt, res.ft, taker, tokenAmtIn, ftAmtOut, block.timestamp + 1 hours); - vm.stopPrank(); - } - - function buyXt(uint128 tokenAmtIn, uint128 xtAmtOut) internal { - address taker = vm.randomAddress(); - res.debt.mint(taker, tokenAmtIn); - vm.startPrank(taker); - res.debt.approve(address(res.order), tokenAmtIn); - res.order.swapExactTokenToToken(res.debt, res.xt, taker, tokenAmtIn, xtAmtOut, block.timestamp + 1 hours); - vm.stopPrank(); - } - - function sellFt(uint128 ftAmtIn, uint128 tokenAmtOut) internal { - address taker = vm.randomAddress(); - vm.prank(deployer); - res.ft.transfer(taker, ftAmtIn); - vm.startPrank(taker); - res.ft.approve(address(res.order), ftAmtIn); - res.order.swapExactTokenToToken(res.ft, res.debt, taker, ftAmtIn, tokenAmtOut, block.timestamp + 1 hours); - vm.stopPrank(); - } - - function sellXt(uint128 xtAmtIn, uint128 tokenAmtOut) internal { - address taker = vm.randomAddress(); - vm.prank(deployer); - res.xt.transfer(taker, xtAmtIn); - vm.startPrank(taker); - res.xt.approve(address(res.order), xtAmtIn); - res.order.swapExactTokenToToken(res.xt, res.debt, taker, xtAmtIn, tokenAmtOut, block.timestamp + 1 hours); - vm.stopPrank(); - } - - function swapFtToXt(uint128 ftAmtIn, uint128 xtAmtOut) internal { - address taker = vm.randomAddress(); - vm.prank(deployer); - res.ft.transfer(taker, ftAmtIn); - vm.startPrank(taker); - res.ft.approve(address(res.order), ftAmtIn); - res.order.swapExactTokenToToken(res.ft, res.xt, taker, ftAmtIn, xtAmtOut, block.timestamp + 1 hours); - vm.stopPrank(); - } - - function swapXtToFt(uint128 xtAmtIn, uint128 ftAmtOut) internal { - address taker = vm.randomAddress(); - vm.prank(deployer); - res.xt.transfer(taker, xtAmtIn); - vm.startPrank(taker); - res.xt.approve(address(res.order), xtAmtIn); - res.order.swapExactTokenToToken(res.xt, res.ft, taker, xtAmtIn, ftAmtOut, block.timestamp + 1 hours); - vm.stopPrank(); - } - - function testFixFindings101() public { - vm.prank(curator); - vault.createOrder(res.market, maxCapacity, 0, orderConfig.curveCuts); - address lper = vm.randomAddress(); - - res.debt.mint(lper, 100 ether); - - // depositing funds for lp1 - vm.startPrank(lper); - res.debt.approve(address(vault), 100 ether); - vault.deposit(100 ether, lper); - vm.stopPrank(); - - vm.warp(currentTime + 110 days); - - vm.startPrank(lper); - vault.withdraw(100 ether, lper, lper); - } - - function _daysToMaturity(uint256 _now) internal view returns (uint256 daysToMaturity) { - daysToMaturity = (res.market.config().maturity - _now + Constants.SECONDS_IN_DAY - 1) / Constants.SECONDS_IN_DAY; - } -} diff --git a/test/Vault2.t.sol b/test/Vault2.t.sol deleted file mode 100644 index 23ae387..0000000 --- a/test/Vault2.t.sol +++ /dev/null @@ -1,251 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import "forge-std/Test.sol"; -import {console} from "forge-std/console.sol"; -import {DeployUtils} from "./utils/DeployUtils.sol"; -import {JSONLoader} from "./utils/JSONLoader.sol"; -import {StateChecker} from "./utils/StateChecker.sol"; -import {SwapUtils} from "./utils/SwapUtils.sol"; -import {LoanUtils} from "./utils/LoanUtils.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; -import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; -import {IFlashLoanReceiver} from "contracts/IFlashLoanReceiver.sol"; -import {ITermMaxMarket, TermMaxMarket, Constants, MarketEvents, MarketErrors} from "contracts/TermMaxMarket.sol"; -import {ITermMaxOrder, TermMaxOrder, ISwapCallback, OrderEvents, OrderErrors} from "contracts/TermMaxOrder.sol"; -import {MockERC20, ERC20} from "contracts/test/MockERC20.sol"; -import {IMintableERC20} from "contracts/tokens/IMintableERC20.sol"; -import {MockPriceFeed} from "contracts/test/MockPriceFeed.sol"; -import {TermMaxVault} from "contracts/vault/TermMaxVault.sol"; -import {VaultErrors, VaultEvents, ITermMaxVault} from "contracts/vault/TermMaxVault.sol"; -import {OrderManager, OrderInfo} from "contracts/vault/OrderManager.sol"; -import {VaultConstants} from "contracts/lib/VaultConstants.sol"; -import {PendingAddress, PendingUint192} from "contracts/lib/PendingLib.sol"; -import "contracts/storage/TermMaxStorage.sol"; - -contract VaultTest2 is Test { - using JSONLoader for *; - using SafeCast for *; - - OrderConfig orderConfig; - MarketConfig marketConfig; - - address deployer = vm.randomAddress(); - address curator = vm.randomAddress(); - address allocator = vm.randomAddress(); - address guardian = vm.randomAddress(); - address lper = vm.randomAddress(); - address treasurer = vm.randomAddress(); - string testdata; - - ITermMaxVault vault; - - uint256 timelock = 86400; - uint256 maxCapacity = 1000000e18; - uint64 performanceFeeRate = 0.1e8; - - ITermMaxMarket market2; - - uint256 currentTime; - uint32 maxLtv = 0.89e8; - uint32 liquidationLtv = 0.9e8; - VaultInitialParams initialParams; - - DeployUtils.Res[] resources; - - address bob = vm.addr(0x123); - address alice = vm.addr(0x456); - address charlie = vm.addr(0x789); - - address[] users = [bob, alice, charlie]; - - uint256[] durations = [3, 4, 10, 20, 5, 5, 3, 15, 20, 12]; - - function setUp() public { - vm.startPrank(deployer); - testdata = vm.readFile(string.concat(vm.projectRoot(), "/test/testdata/testdata.json")); - - currentTime = vm.parseUint(vm.parseJsonString(testdata, ".currentTime")); - vm.warp(currentTime); - - marketConfig = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); - orderConfig = JSONLoader.getOrderConfigFromJson(testdata, ".orderConfig"); - - MockERC20 debt = new MockERC20("DAI", "DAI", 6); - for (uint256 i = 0; i < 10; i++) { - resources.push( - DeployUtils.deployMockMarket2(deployer, debt, durations[i], marketConfig, maxLtv, liquidationLtv) - ); - } - - initialParams = VaultInitialParams( - deployer, curator, timelock, debt, maxCapacity, "Vault-DAI", "Vault-DAI", performanceFeeRate - ); - - vault = DeployUtils.deployVault(initialParams); - - vault.submitGuardian(guardian); - vault.setIsAllocator(allocator, true); - - for (uint256 i = 0; i < resources.length; i++) { - address market = address(resources[i].market); - vault.submitMarket(market, true); - vm.warp(currentTime + timelock + 1); - vault.acceptMarket(market); - vm.warp(currentTime); - } - - vm.stopPrank(); - - debt.mint(bob, 10000e16); - vm.startPrank(bob); - debt.approve(address(vault), maxCapacity); - vault.deposit(10000e16 / 2, bob); - vm.stopPrank(); - - vm.startPrank(alice); - debt.mint(alice, 5000e18); - debt.approve(address(vault), maxCapacity); - vault.deposit(5000e18 / 2, alice); - vm.stopPrank(); - - vm.startPrank(charlie); - debt.mint(charlie, 20e15); - debt.approve(address(vault), maxCapacity); - vault.deposit(20e15 / 2, charlie); - vm.stopPrank(); - - for (uint256 i = 0; i < resources.length; i++) { - vm.startPrank(deployer); - ITermMaxMarket market = resources[i].market; - resources[i].order = vault.createOrder(market, maxCapacity, i * 1e15, orderConfig.curveCuts); - vm.stopPrank(); - } - } - - function testDust() public { - uint256 count = 0; - while (block.timestamp < currentTime + 30 days) { - uint256 k = vm.randomUint(2 ** 128 - 1, 2 ** 256 - 1); - uint256 period = vm.randomUint(2000, 3600); - count++; - vm.warp(block.timestamp); - uint256 i = k % 10; - // ITermMaxMarket market = resources[i].market; - ITermMaxOrder order = resources[i].order; - uint256 amount = k % 1e4; - // (, uint256 borrowApr) = order.apr(); - // uint256 virturalApr = borrowApr * (block.timestamp - currentTime) / 365 days; - uint256 ftBalance = resources[i].ft.balanceOf(address(order)); - uint256 xtBalance = resources[i].xt.balanceOf(address(order)); - - if (xtBalance < ftBalance * 8 / 10 && amount * 2 < ftBalance) { - console.log("buy ft:", amount); - buyFt(order, uint128(amount), uint128(amount * 2)); - } else if (amount * 2 < xtBalance) { - console.log("buy xt:", amount); - buyXt(order, uint128(amount), uint128(amount * 2)); - } - - if (i < 3) { - vm.prank(users[i]); - if (block.timestamp % 2 == 0) { - console.log("redeem:", i); - vault.redeem(1e5, users[i], users[i]); - } else { - console.log("deposit:", i); - vault.deposit(1e5, users[i]); - } - } - - vm.warp(block.timestamp + period); - } - vm.warp(block.timestamp + 60 days); - console.log("---- do redeem ---"); - for (uint256 i = 0; i < resources.length; i++) { - vm.prank(curator); - vault.redeemOrder(resources[i].order); - } - uint256 performanceFee = vault.performanceFee(); - console.log("performanceFee:", performanceFee); - vm.prank(curator); - vault.withdrawPerformanceFee(curator, performanceFee); - - vm.warp(block.timestamp + 10); - console.log("---- status ---"); - console.log("run count:", count); - console.log("total assets:", vault.totalAssets()); - console.log("total supply:", vault.totalSupply()); - console.log("annualizedInterest:", vault.annualizedInterest()); - console.log("apr:", vault.apr()); - console.log("total ft:", vault.totalFt()); - console.log("actual balance:", resources[0].debt.balanceOf(address(vault))); - console.log("accretingPrincipal:", vault.accretingPrincipal()); - - console.log("---- do redeem ---"); - console.log("asset:", address(resources[0].debt)); - console.log("vault:", address(vault)); - for (uint256 i = 0; i < resources.length; i++) { - address collateral = address(resources[i].collateral); - if (vault.badDebtMapping(collateral) > 0) { - console.log("badDebt:", vault.badDebtMapping(collateral)); - console.log("collateral:", collateral); - } - } - for (uint256 i = 0; i < users.length; i++) { - console.log("user i:", i); - console.log("balance:", vault.balanceOf(users[i])); - vm.startPrank(users[i]); - uint256 redeemed = vault.redeem(vault.balanceOf(users[i]), users[i], users[i]); - console.log("redeemed:", redeemed); - console.log("remainning total assets:", vault.totalAssets()); - vm.stopPrank(); - } - uint256 dustAmt = resources[0].debt.balanceOf(address(vault)); - console.log("remaining balance:", dustAmt); - assertLe(dustAmt, 3); - } - - function buyFt(ITermMaxOrder order, uint128 tokenAmtIn, uint128 ftAmtOut) internal { - address taker = vm.randomAddress(); - (IMintableERC20 ft, IMintableERC20 xt,,, IERC20 debt) = order.market().tokens(); - IMintableERC20(address(debt)).mint(taker, tokenAmtIn); - vm.startPrank(taker); - debt.approve(address(order), tokenAmtIn); - order.swapExactTokenToToken(debt, ft, taker, tokenAmtIn, ftAmtOut, block.timestamp + 1 hours); - vm.stopPrank(); - } - - function buyXt(ITermMaxOrder order, uint128 tokenAmtIn, uint128 xtAmtOut) internal { - address taker = vm.randomAddress(); - (IMintableERC20 ft, IMintableERC20 xt,,, IERC20 debt) = order.market().tokens(); - IMintableERC20(address(debt)).mint(taker, tokenAmtIn); - vm.startPrank(taker); - debt.approve(address(order), tokenAmtIn); - order.swapExactTokenToToken(debt, xt, taker, tokenAmtIn, xtAmtOut, block.timestamp + 1 hours); - vm.stopPrank(); - } - - function sellFt(ITermMaxOrder order, uint128 ftAmtIn, uint128 tokenAmtOut) internal { - address taker = vm.randomAddress(); - (IMintableERC20 ft, IMintableERC20 xt,,, IERC20 debt) = order.market().tokens(); - vm.prank(deployer); - ft.transfer(taker, ftAmtIn); - vm.startPrank(taker); - ft.approve(address(order), ftAmtIn); - order.swapExactTokenToToken(ft, debt, taker, ftAmtIn, tokenAmtOut, block.timestamp + 1 hours); - vm.stopPrank(); - } - - function sellXt(ITermMaxOrder order, uint128 xtAmtIn, uint128 tokenAmtOut) internal { - address taker = vm.randomAddress(); - (IMintableERC20 ft, IMintableERC20 xt,,, IERC20 debt) = order.market().tokens(); - vm.prank(deployer); - xt.transfer(taker, xtAmtIn); - vm.startPrank(taker); - xt.approve(address(order), xtAmtIn); - order.swapExactTokenToToken(xt, debt, taker, xtAmtIn, tokenAmtOut, block.timestamp + 1 hours); - vm.stopPrank(); - } -} diff --git a/test/integration/ArbSepolia.t.sol.bak b/test/integration/ArbSepolia.t.sol.bak deleted file mode 100644 index f82c52b..0000000 --- a/test/integration/ArbSepolia.t.sol.bak +++ /dev/null @@ -1,191 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import "forge-std/Test.sol"; -import {console} from "forge-std/console.sol"; -import {TermMaxFactory} from "../../contracts/core/factory/TermMaxFactory.sol"; -import {ITermMaxFactory} from "../../contracts/core/factory/ITermMaxFactory.sol"; -import {TermMaxRouter} from "../../contracts/router/TermMaxRouter.sol"; -import {ITermMaxRouter} from "../../contracts/router/ITermMaxRouter.sol"; -import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; -import {TermMaxMarket} from "../../contracts/core/TermMaxMarket.sol"; -import {ITermMaxMarket} from "../../contracts/core/TermMaxMarket.sol"; -import {MockERC20} from "../../contracts/test/MockERC20.sol"; -import {MarketConfig} from "../../contracts/core/storage/TermMaxStorage.sol"; -import {IMintableERC20} from "../../contracts/core/tokens/IMintableERC20.sol"; -import {IGearingToken} from "../../contracts/core/tokens/IGearingToken.sol"; -import {IOracle, OracleAggregator, AggregatorV3Interface} from "contracts/core/oracle/OracleAggregator.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; -import {MockSwapAdapter} from "../../contracts/test/MockSwapAdapter.sol"; -import {Faucet} from "../../contracts/test/testnet/Faucet.sol"; -import {FaucetERC20} from "../../contracts/test/testnet/FaucetERC20.sol"; -import {SwapUnit} from "../../contracts/router/ISwapAdapter.sol"; -import {MockPriceFeed} from "../../contracts/test/MockPriceFeed.sol"; - -contract E2ETest is Test { - // deployer config - uint256 userPrivateKey = vm.envUint("ARB_SEPOLIA_DEPLOYER_PRIVATE_KEY"); - address userAddr = vm.addr(userPrivateKey); - - // address config - // address faucetAddr = address(0xdB94B6E81E0b9F0874ABa5F4F8258c31A9b97Ce8); - // address factoryAddr = address(0x4f29f479D3e6c41aD3fC8C7c8D6f423Cb2784b8e); - address routerAddr = address(0xA53500974648F3d00336a0533955e3404503dB90); - address swapAdapter = address(0x98838B33E85A56b2C9c8F7D7D6a1A7d2484b8e67); - address marketAddr = address(0x78494Cbb1AB24900f045b673e6640eb0595aD2D7); - address collateralPriceFeedAddr = - address(0x1Aee5396e5B010Eb6462396c4D8753B66B0ae089); - address underlyingPriceFeedAddr = - address(0x6f2c71259f2935c106769bEBc3A6a6ED86533616); - - TermMaxMarket market = TermMaxMarket(marketAddr); - TermMaxRouter router = TermMaxRouter(routerAddr); - IMintableERC20 ft; - IMintableERC20 xt; - IMintableERC20 lpFt; - IMintableERC20 lpXt; - IGearingToken gt; - address collateralAddr; - FaucetERC20 collateral; - FaucetERC20 underlying; - IERC20 underlyingERC20; - MockPriceFeed collateralPriceFeed = MockPriceFeed(collateralPriceFeedAddr); - MockPriceFeed underlyingPriceFeed = - MockPriceFeed(address(underlyingPriceFeedAddr)); - - function setUp() public { - string memory ARB_SEPOLIA_RPC_URL = vm.envString("ARB_SEPOLIA_RPC_URL"); - // string memory ARB_SEPOLIA_RPC_URL = "http://127.0.0.1:8545"; - - uint256 arbSepoliaFork = vm.createFork(ARB_SEPOLIA_RPC_URL); - vm.selectFork(arbSepoliaFork); - vm.rollFork(101029414); - // vm.warp(1732648114); - vm.warp(vm.getBlockTimestamp() + 100); - - (ft, xt, lpFt, lpXt, gt, collateralAddr, underlyingERC20) = market - .tokens(); - collateral = FaucetERC20(collateralAddr); - underlying = FaucetERC20(address(underlyingERC20)); - } - - function testIntegration() public { - // provide liquidity - vm.startBroadcast(userPrivateKey); - uint256 amount = 1000000e6; - underlying.mint(userAddr, amount); - underlying.approve(routerAddr, amount); - router.provideLiquidity(userAddr, market, amount); - vm.stopBroadcast(); - - // leverage from token - vm.startBroadcast(userPrivateKey); - uint256 underlyingAmtBase = 10 ** underlying.decimals(); - uint256 collateralAmtBase = 10 ** collateral.decimals(); - uint256 priceBase = 1e8; - uint256 aprBase = 1e8; - uint64 daysInYear = 365; - uint64 secondsInDay = 86400; - uint64 ltvBase = 1e8; - - MarketConfig memory config = market.config(); - uint64 maturity = config.maturity; - uint64 dayToMaturity = uint64( - (maturity - vm.getBlockTimestamp() + secondsInDay - 1) / - secondsInDay - ); - uint64 apr = config.apr > 0 ? uint64(config.apr) : uint64(-config.apr); - uint64 initialLtv = config.initialLtv; - uint256 ftPrice = (daysInYear * aprBase * priceBase) / - (aprBase * daysInYear + apr * dayToMaturity); - uint256 xtPrice = priceBase - (ftPrice * initialLtv) / ltvBase; - (, int256 collateralAnswer, , , ) = collateralPriceFeed - .latestRoundData(); - (, int256 underlyingAnswer, , , ) = underlyingPriceFeed - .latestRoundData(); - - uint256 collateralPrice = uint256(collateralAnswer); - console.log("FT APR:", apr); - console.log("FT price:", ftPrice); - console.log("XT price:", xtPrice); - console.log("collateral price:", collateralPrice); - console.log("underlying price:", underlyingAnswer); - console.log("day to maturity:", dayToMaturity); - uint256 tokenToBuyCollateralAmt = 0; - uint256 tokenToBuyXtAmt = 1000e6; - uint256 maxLtv = 89000000; - uint256 mintXtAmt = 0; - - uint256 n = priceBase * - collateralAmtBase * - (tokenToBuyCollateralAmt * - underlyingAmtBase * - xtPrice + - underlyingAmtBase * - tokenToBuyXtAmt * - priceBase); - uint256 d = underlyingAmtBase * - underlyingAmtBase * - xtPrice * - collateralPrice; - uint256 tokenOutAmt = n / d; - uint256 xtAmtZeroSlippage = (tokenToBuyXtAmt * priceBase) / xtPrice; - SwapUnit[] memory swapUnits = new SwapUnit[](1); - swapUnits[0] = SwapUnit({ - adapter: swapAdapter, - tokenIn: address(underlying), - tokenOut: address(collateral), - swapData: abi.encode( - underlyingPriceFeedAddr, - collateralPriceFeedAddr - ) - }); - console.log( - "Token to buy XT amount:", - tokenToBuyXtAmt / 10 ** underlying.decimals() - ); - console.log("Token to buy collateral amount:", tokenToBuyCollateralAmt); - console.log("xt amount with zero slippage:", xtAmtZeroSlippage); - console.log( - "Token out amount:", - tokenOutAmt / 10 ** collateral.decimals() - ); - underlying.mint(userAddr, tokenToBuyCollateralAmt + tokenToBuyXtAmt); - underlying.approve( - routerAddr, - tokenToBuyCollateralAmt + tokenToBuyXtAmt - ); - (uint256 gtId, uint256 netXtOut) = router.leverageFromToken( - userAddr, - market, - tokenToBuyCollateralAmt, - tokenToBuyXtAmt, - maxLtv, - mintXtAmt, - swapUnits, - config.lsf, - block.timestamp + 1 hours - ); - console.log("xt amount with slippage:", netXtOut); - ( - address owner, - uint128 debtAmt, - uint128 ltv, - bytes memory collateralDta - ) = gt.loanInfo(gtId); - uint128 collateralAmt = abi.decode(collateralDta, (uint128)); - console.log("Gearing token ID:", gtId); - console.log("Gearing token owner:", owner); - console.log( - "Gearing token debt amount:", - debtAmt / 10 ** underlying.decimals() - ); - console.log( - "Gearing token collateral amount:", - collateralAmt / 10 ** collateral.decimals() - ); - console.log("Gearing token ltv:", ltv); - vm.stopBroadcast(); - } -} diff --git a/test/integration/ForkDebugger.t.sol b/test/integration/ForkDebugger.t.sol deleted file mode 100644 index 82ea6f8..0000000 --- a/test/integration/ForkDebugger.t.sol +++ /dev/null @@ -1,148 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import "forge-std/Test.sol"; -import {console} from "forge-std/console.sol"; -import {TermMaxFactory} from "../../contracts/factory/TermMaxFactory.sol"; -import {ITermMaxFactory} from "../../contracts/factory/ITermMaxFactory.sol"; -import {TermMaxRouter} from "../../contracts/router/TermMaxRouter.sol"; -import {ITermMaxRouter} from "../../contracts/router/ITermMaxRouter.sol"; -import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; -import {TermMaxMarket} from "../../contracts/TermMaxMarket.sol"; -import {ITermMaxMarket} from "../../contracts/TermMaxMarket.sol"; -import {MockERC20} from "../../contracts/test/MockERC20.sol"; -import {MarketConfig} from "../../contracts/storage/TermMaxStorage.sol"; -import {IMintableERC20} from "../../contracts/tokens/IMintableERC20.sol"; -import {IGearingToken} from "../../contracts/tokens/IGearingToken.sol"; -import {IOracle, OracleAggregator, AggregatorV3Interface} from "contracts/oracle/OracleAggregator.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; -import {MockSwapAdapter} from "../../contracts/test/MockSwapAdapter.sol"; -import {Faucet} from "../../contracts/test/testnet/Faucet.sol"; -import {FaucetERC20} from "../../contracts/test/testnet/FaucetERC20.sol"; -import {SwapUnit} from "../../contracts/router/ISwapAdapter.sol"; -import {MockPriceFeed} from "../../contracts/test/MockPriceFeed.sol"; -import {TermMaxOrder, ISwapCallback} from "../../contracts/TermMaxOrder.sol"; -import {ITermMaxOrder} from "../../contracts/ITermMaxOrder.sol"; -import {OrderConfig} from "../../contracts/storage/TermMaxStorage.sol"; -import {DeployUtils} from "../utils/DeployUtils.sol"; -import {JSONLoader} from "../utils/JSONLoader.sol"; -import "contracts/storage/TermMaxStorage.sol"; - -contract ForkDebugger is Test { - // EOA config - uint256 deployerPrivateKey = vm.envUint("HOLESKY_DEPLOYER_PRIVATE_KEY"); - address deployerAddr = vm.addr(deployerPrivateKey); - uint256 userPrivateKey = vm.envUint("HOLESKY_DEPLOYER_PRIVATE_KEY"); - address userAddr = vm.addr(userPrivateKey); - - // address config - address faucetAddr = address(0x979963a328dd54b684A522cccb0bA49458dD74ba); - address routerAddr = address(0x2fA0C6B02F329bc400eB638a764f6CAEa1C11047); - address swapAdapter = address(0x8be4b9f85C9534C2Fb445E7426858A8AAB1D210a); - address marketAddr = address(0xAACB14efD381c1659F0bD28c3Ac7cFe8Ad0F342f); - address orderAddr = address(0x3Cf9Ba89761DFb1C5c370A5f64b692Cd05abcDf6); - address oracleAggregatorAddr = address(0xd3623A77E2C38E1D528E0a4b1Cd7E5267323a5EC); - - TermMaxRouter router = TermMaxRouter(routerAddr); - OracleAggregator oracleAggregator = OracleAggregator(oracleAggregator); - ITermMaxMarket market = ITermMaxMarket(marketAddr); - TermMaxOrder order = TermMaxOrder(orderAddr); - IMintableERC20 ft; - IMintableERC20 xt; - IGearingToken gt; - address collateralAddr; - FaucetERC20 collateral; - FaucetERC20 underlying; - IERC20 underlyingERC20; - - ITermMaxMarket testMarket; - ITermMaxOrder testOrder; - IMintableERC20 testFt; - IMintableERC20 testXt; - IGearingToken testGt; - address testCollateralAddr; - FaucetERC20 testCollateral; - FaucetERC20 testUnderlying; - IERC20 testUnderlyingERC20; - OrderConfig orderConfig; - MarketConfig marketConfig; - DeployUtils.Res res; - bytes32 constant GT_ERC20 = keccak256("GearingTokenWithERC20"); - - // function setUp() public { - // string memory FORK_RPC_URL = vm.envString("HOLESKY_RPC_URL"); - - // uint256 fork = vm.createFork(FORK_RPC_URL); - // vm.selectFork(fork); - - // deployTestContracts(); - // } - - // function deployTestContracts() public { - // (ft, xt, gt, collateralAddr, underlyingERC20) = market.tokens(); - // collateral = FaucetERC20(collateralAddr); - // underlying = FaucetERC20(address(underlyingERC20)); - // marketConfig = market.config(); - // GtConfig memory gtConfig = gt.getGtConfig(); - - // MarketInitialParams memory initialParams = MarketInitialParams({ - // collateral: address(collateral), - // debtToken: underlying, - // admin: deployerAddr, - // gtImplementation: address(0), - // marketConfig: marketConfig, - // loanConfig: LoanConfig({ - // oracle: oracleAggregator, - // liquidationLtv: gtConfig.loanConfig.liquidationLtv, - // maxLtv: gtConfig.loanConfig.maxLtv, - // liquidatable: true - // }), - // gtInitalParams: abi.encode(type(uint256).max), - // tokenName: "Test Market", - // tokenSymbol: "Test Market" - // }); - - // vm.startPrank(deployerAddr); - // TermMaxFactory testFactory = DeployUtils.deployFactory(deployerAddr); - // testMarket = ITermMaxMarket(testFactory.createMarket(GT_ERC20, initialParams, 0)); - // vm.stopPrank(); - - // vm.startPrank(router.owner()); - // router.setMarketWhitelist(address(testMarket), true); - // vm.stopPrank(); - - // (testFt, testXt, testGt, testCollateralAddr, testUnderlyingERC20) = testMarket.tokens(); - // } - - // function testIntegration() public { - // (uint256 oriFtReserve, uint256 oriXtReserve) = order.tokenReserves(); - // OrderConfig memory testOrderConfig = order.orderConfig(); - // console.log("ft reserve: %d", oriFtReserve); - // console.log("xt reserve: %d", oriXtReserve); - // for (uint256 i = 0; i < testOrderConfig.curveCuts.lendCurveCuts.length; i++) { - // console.log("lend curve cut - %d", i); - // console.log(" - xt reserve: %d", testOrderConfig.curveCuts.lendCurveCuts[i].xtReserve); - // console.log(" - liqSquare: %d", testOrderConfig.curveCuts.lendCurveCuts[i].liqSquare); - // console.log(" - offset: %d", testOrderConfig.curveCuts.lendCurveCuts[i].offset); - // } - // for (uint256 i = 0; i < testOrderConfig.curveCuts.borrowCurveCuts.length; i++) { - // console.log("borrow curve cut - %d", i); - // console.log(" - xt reserve: %d", testOrderConfig.curveCuts.borrowCurveCuts[i].xtReserve); - // console.log(" - liqSquare: %d", testOrderConfig.curveCuts.borrowCurveCuts[i].liqSquare); - // console.log(" - offset: %d", testOrderConfig.curveCuts.borrowCurveCuts[i].offset); - // } - // vm.startPrank(userAddr); - // testOrder = testMarket.createOrder( - // userAddr, testOrderConfig.maxXtReserve, ISwapCallback(address(0)), testOrderConfig.curveCuts - // ); - // uint256 mintAmt = oriFtReserve + oriXtReserve; - // underlying.mint(userAddr, mintAmt); - // underlying.approve(address(testMarket), mintAmt); - // testMarket.mint(userAddr, mintAmt); - // testFt.transfer(address(testOrder), oriFtReserve); - // testXt.transfer(address(testOrder), oriXtReserve); - // vm.stopPrank(); - // (uint256 oriLendApr, uint256 oriBorrowApr) = testOrder.apr(); - // } -} diff --git a/test/integration/ForkFlashRepay.t.sol b/test/integration/ForkFlashRepay.t.sol deleted file mode 100644 index c6a8fb5..0000000 --- a/test/integration/ForkFlashRepay.t.sol +++ /dev/null @@ -1,256 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; -import {ITermMaxMarket} from "contracts/ITermMaxMarket.sol"; -import {ITermMaxOrder} from "contracts/ITermMaxOrder.sol"; -import {SwapUnit, ITermMaxRouter, TermMaxRouter} from "contracts/router/TermMaxRouter.sol"; -import { - IGearingToken, - GearingTokenEvents, - AbstractGearingToken, - GtConfig -} from "contracts/tokens/AbstractGearingToken.sol"; -import {PendleSwapV3Adapter} from "contracts/router/swapAdapters/PendleSwapV3Adapter.sol"; -import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; -import {IOracle} from "contracts/oracle/IOracleV1.sol"; -import { - ForkBaseTest, - TermMaxFactory, - MarketConfig, - IERC20, - MarketInitialParams, - IERC20Metadata -} from "test/mainnet-fork/ForkBaseTest.sol"; -import {console} from "forge-std/console.sol"; - -interface TestOracle is IOracle { - function acceptPendingOracle(address asset) external; - function oracles(address asset) external returns (address aggregator, address backupAggregator, uint32 heartbeat); -} - -contract ForkFlashRepay is ForkBaseTest { - string MAINNET_RPC_URL = vm.envString("MAINNET_RPC_URL"); - string DATA_PATH = string.concat(vm.projectRoot(), "/test/testdata/fork/mainnet.json"); - - uint64 may_30 = 1748534400; // 2025-05-30 00:00:00 - uint64 aug_1 = 1753977600; // 2025-08-01 00:00:00 - address pt_susde_may_29 = 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308; - address pt_susde_jun_31 = 0x3b3fB9C57858EF816833dC91565EFcd85D96f634; - address usdc = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; - address usde = 0x4c9EDD5852cd905f086C759E8383e09bff1E68B3; - address susde = 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497; - TestOracle oracle = TestOracle(0xE3a31690392E8E18DC3d862651C079339E2c1ADE); - - ITermMaxMarket mmay_30 = ITermMaxMarket(0xe867255dC0c3a27c90f756ECC566a5292ce19492); - ITermMaxMarket maug_1 = ITermMaxMarket(0xdBB2D44c238c459cCB820De886ABF721EF6E6941); - ITermMaxOrder o_may_30 = ITermMaxOrder(0xe99ee5b18cB57276EbEADf0E773E4f8Ab49Db9B7); - ITermMaxOrder o_aug_1 = ITermMaxOrder(0x71Df74d65c3895C8FA5a1c8E8d93A7eE30A1aFc7); - address pendleAdapter; - address odosAdapter = 0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779; - TermMaxRouter router; - - function _getForkRpcUrl() internal view override returns (string memory) { - return MAINNET_RPC_URL; - } - - function _getDataPath() internal view override returns (string memory) { - return DATA_PATH; - } - - function _finishSetup() internal override { - vm.roll(22486319); // 2025-05-15 - - address accessManager = Ownable(address(oracle)).owner(); - vm.startPrank(accessManager); - address[] memory tokens = new address[](4); - tokens[0] = usdc; - tokens[1] = susde; - tokens[2] = pt_susde_may_29; - tokens[3] = pt_susde_jun_31; - - for (uint256 i = 0; i < tokens.length; i++) { - address token = tokens[i]; - (address aggregator, address backupAggregator,) = oracle.oracles(token); - IOracle.Oracle memory oracleData = IOracle.Oracle({ - aggregator: AggregatorV3Interface(aggregator), - backupAggregator: AggregatorV3Interface(backupAggregator), - heartbeat: 365 days - }); - oracle.submitPendingOracle(token, oracleData); - } - vm.warp(block.timestamp + 1 days); - for (uint256 i = 0; i < tokens.length; i++) { - address token = tokens[i]; - oracle.acceptPendingOracle(token); - } - - vm.stopPrank(); - - PendleSwapV3Adapter adapter = new PendleSwapV3Adapter(0x888888888889758F76e7103c6CbF23ABbF58F946); - pendleAdapter = address(adapter); - - vm.label(pt_susde_may_29, "pt_susde_may_29"); - vm.label(pt_susde_jun_31, "pt_susde_jun_31"); - vm.label(susde, "susde"); - vm.label(address(oracle), "oracle"); - vm.label(address(mmay_30), "mmay_30"); - vm.label(address(maug_1), "maug_1"); - vm.label(address(o_may_30), "o_may_30"); - vm.label(address(o_aug_1), "o_aug_1"); - vm.label(address(pendleAdapter), "pendleAdapter"); - - address admin = vm.randomAddress(); - - vm.startPrank(admin); - router = deployRouter(admin); - router.setAdapterWhitelist(pendleAdapter, true); - router.setAdapterWhitelist(odosAdapter, true); - vm.stopPrank(); - } - - function testFlashRepayPtV2() public { - vm.roll(22494579); // 2025-05-15 - address borrower = vm.randomAddress(); - vm.label(borrower, "borrower"); - address admin = vm.randomAddress(); - vm.label(admin, "admin"); - - vm.startPrank(admin); - ITermMaxMarket market; - uint256 gtId1; - uint128 oldDebt = 1000e6; - uint256 oldCollateral = 35012712455278300958037; - - deal(pt_susde_may_29, admin, oldCollateral); - - // create new market support v2 flash repay - { - TermMaxFactory f2 = deployFactory(admin); - MarketConfig memory marketConfig = mmay_30.config(); - (,, IGearingToken gt, address collateral, IERC20 debtToken) = mmay_30.tokens(); - GtConfig memory gtConfig = gt.getGtConfig(); - MarketInitialParams memory params = MarketInitialParams({ - collateral: collateral, - debtToken: IERC20Metadata(address(debtToken)), - admin: admin, - gtImplementation: address(0), - marketConfig: marketConfig, - loanConfig: gtConfig.loanConfig, - gtInitalParams: abi.encode(type(uint128).max), - tokenName: "Test", - tokenSymbol: "TEST" - }); - market = ITermMaxMarket(f2.createMarket(keccak256("GearingTokenWithERC20"), params, 1)); - vm.label(address(market), "newMarket"); - - (,, IGearingToken gt2,,) = market.tokens(); - - IERC20(pt_susde_may_29).approve(address(gt2), oldCollateral); - (gtId1,) = market.issueFt(borrower, oldDebt, abi.encode(oldCollateral)); - - vm.label(address(market), "market_may_30"); - vm.label(address(gt2), "gt_may_30"); - } - - vm.stopPrank(); - vm.startPrank(borrower); - vm.warp(may_30 - 0.5 days); - uint128 repayAmount = 300e6; - uint256 removedCollateral = 25012712455278300958037; - // roll gt - { - ITermMaxOrder[] memory orders = new ITermMaxOrder[](0); - uint128[] memory amounts = new uint128[](0); - SwapUnit[] memory swapUnits = new SwapUnit[](2); - address pm1 = 0xB162B764044697cf03617C2EFbcB1f42e31E4766; - swapUnits[0] = SwapUnit({ - adapter: pendleAdapter, - tokenIn: pt_susde_may_29, - tokenOut: susde, - swapData: abi.encode(pm1, removedCollateral, 0) - }); - swapUnits[1] = SwapUnit({ - adapter: 0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779, - tokenIn: susde, - tokenOut: usdc, - swapData: hex"0000000000000000000000009d39a5de30e57443bff2a8307a4256c8797a349700000000000000000000000000000000000000000000048103daed12389fbcc800000000000000000000000076edf8c155a1e0d9b2ad11b04d9671cbc25fee99000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000005d443b21d00000000000000000000000000000000000000000000000000000005b66b4d45000000000000000000000000c47591f5c023e44931c78d5a993834875b79fb11000000000000000000000000000000000000000000000000000000000000014000000000000000000000000076edf8c155a1e0d9b2ad11b04d9671cbc25fee9900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084010206000d0100010201022700000304000d0101050400ff00000000000000007eb59373d63627be64b42406b108b602174b4ccc9d39a5de30e57443bff2a8307a4256c8797a3497dac17f958d2ee523a2206206994597c13d831ec7c02aaa39b223fe8d0a0e5c4f27ead9083c756cc288e6a0c2ddd26feeb64f039a2c41296fcb3f564000000000000000000000000000000000000000000000000000000000" - }); - (IERC20 ft,, IGearingToken gt, address collateral,) = market.tokens(); - console.log("usdc balance before:", IERC20(usdc).balanceOf(borrower)); - gt.approve(address(router), gtId1); - ITermMaxRouter.TermMaxSwapData memory swapData; - router.flashRepayFromCollV2( - borrower, market, gtId1, repayAmount, true, abi.encode(removedCollateral), swapUnits, swapData - ); - console.log("usdc balance after:", IERC20(usdc).balanceOf(borrower)); - - (address owner, uint128 currentDebt, bytes memory currentCollateral) = gt.loanInfo(gtId1); - assertEq(owner, borrower, "borrower should be the same"); - assertEq(currentDebt, oldDebt - repayAmount, "debt should be the same"); - assertEq( - abi.decode(currentCollateral, (uint256)), - oldCollateral - removedCollateral, - "collateral should be the same" - ); - vm.stopPrank(); - } - - vm.stopPrank(); - } - - function testFlashRepayPt() public { - vm.roll(22494579); // 2025-05-15 - - address borrower; - address admin = vm.randomAddress(); - - vm.startPrank(admin); - TermMaxRouter router = deployRouter(admin); - router.setAdapterWhitelist(pendleAdapter, true); - router.setAdapterWhitelist(0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779, true); - vm.stopPrank(); - - uint128 debt; - uint256 collateralAmount; - // deal(pt_susde_may_29, borrower, collateralAmount); - uint256 gt1 = 5; - - { - (IERC20 ft,, IGearingToken gt, address collateral,) = mmay_30.tokens(); - (address owner, uint128 debtAmt, bytes memory collateralData) = gt.loanInfo(gt1); - borrower = owner; - debt = debtAmt; - collateralAmount = abi.decode(collateralData, (uint256)); - console.log("collateralAmount:", collateralAmount); - console.log("debt:", debt); - - vm.startPrank(borrower); - vm.warp(may_30 - 0.5 days); - - ITermMaxOrder[] memory orders = new ITermMaxOrder[](0); - uint128[] memory amounts = new uint128[](0); - SwapUnit[] memory swapUnits = new SwapUnit[](2); - address pm1 = 0xB162B764044697cf03617C2EFbcB1f42e31E4766; - swapUnits[0] = SwapUnit({ - adapter: pendleAdapter, - tokenIn: pt_susde_may_29, - tokenOut: susde, - swapData: abi.encode(pm1, collateralAmount, 0) - }); - swapUnits[1] = SwapUnit({ - adapter: odosAdapter, - tokenIn: susde, - tokenOut: usdc, - swapData: hex"0000000000000000000000009d39a5de30e57443bff2a8307a4256c8797a349700000000000000000000000000000000000000000000048103daed12389fbcc800000000000000000000000076edf8c155a1e0d9b2ad11b04d9671cbc25fee99000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000005d443b21d00000000000000000000000000000000000000000000000000000005b66b4d45000000000000000000000000c47591f5c023e44931c78d5a993834875b79fb11000000000000000000000000000000000000000000000000000000000000014000000000000000000000000076edf8c155a1e0d9b2ad11b04d9671cbc25fee9900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084010206000d0100010201022700000304000d0101050400ff00000000000000007eb59373d63627be64b42406b108b602174b4ccc9d39a5de30e57443bff2a8307a4256c8797a3497dac17f958d2ee523a2206206994597c13d831ec7c02aaa39b223fe8d0a0e5c4f27ead9083c756cc288e6a0c2ddd26feeb64f039a2c41296fcb3f564000000000000000000000000000000000000000000000000000000000" - }); - - console.log("usdc balance before:", IERC20(usdc).balanceOf(borrower)); - gt.approve(address(router), gt1); - ITermMaxRouter.TermMaxSwapData memory swapData; - router.flashRepayFromColl(borrower, mmay_30, gt1, true, swapUnits, swapData); - console.log("usdc balance after:", IERC20(usdc).balanceOf(borrower)); - vm.stopPrank(); - } - } -} diff --git a/test/integration/ForkPriceFeed.t.sol b/test/integration/ForkPriceFeed.t.sol deleted file mode 100644 index ffa1d3d..0000000 --- a/test/integration/ForkPriceFeed.t.sol +++ /dev/null @@ -1,58 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; -import {ITermMaxMarket} from "contracts/ITermMaxMarket.sol"; -import {ITermMaxOrder} from "contracts/ITermMaxOrder.sol"; -import {SwapUnit, ITermMaxRouter, TermMaxRouter} from "contracts/router/TermMaxRouter.sol"; -import { - IGearingToken, - GearingTokenEvents, - AbstractGearingToken, - GtConfig -} from "contracts/tokens/AbstractGearingToken.sol"; -import {PendleSwapV3Adapter} from "contracts/router/swapAdapters/PendleSwapV3Adapter.sol"; -import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; -import {IOracle} from "contracts/oracle/IOracleV1.sol"; -import { - ForkBaseTest, - TermMaxFactory, - MarketConfig, - IERC20, - MarketInitialParams, - IERC20Metadata -} from "test/mainnet-fork/ForkBaseTest.sol"; -import {TermMaxPriceFeedFactory} from "contracts/factory/TermMaxPriceFeedFactory.sol"; -import {console} from "forge-std/console.sol"; - -interface TestOracle is IOracle { - function acceptPendingOracle(address asset) external; - function oracles(address asset) external returns (address aggregator, address backupAggregator, uint32 heartbeat); -} - -contract ForkPriceFeed is ForkBaseTest { - string MAINNET_RPC_URL = vm.envString("MAINNET_RPC_URL"); - string DATA_PATH = string.concat(vm.projectRoot(), "/test/testdata/fork/mainnet.json"); - - function _getForkRpcUrl() internal view override returns (string memory) { - return MAINNET_RPC_URL; - } - - function _getDataPath() internal view override returns (string memory) { - return DATA_PATH; - } - - function _finishSetup() internal override {} - - function testPriceFeed() public { - TermMaxPriceFeedFactory priceFeedFactory = new TermMaxPriceFeedFactory(); - address pendlePYLpOracle = 0x9a9Fa8338dd5E5B2188006f1Cd2Ef26d921650C2; - address ptMarket = 0x266728b30c98B24De810E3325aDC615486988Cb2; - address mMEVToUsd = 0x5f09Aff8B9b1f488B7d1bbaD4D89648579e55d61; - AggregatorV3Interface ptFeed = - AggregatorV3Interface(priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, ptMarket, 900, mMEVToUsd)); - (, int256 answer,,,) = ptFeed.latestRoundData(); - console.log("pt_mMEV_31JUL2025 price feed address", address(ptFeed)); - console.log("pt_mMEV_31JUL2025 last answer", answer); - } -} diff --git a/test/integration/ForkRollOver.t.sol b/test/integration/ForkRollOver.t.sol deleted file mode 100644 index e2d7820..0000000 --- a/test/integration/ForkRollOver.t.sol +++ /dev/null @@ -1,496 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; -import {ITermMaxMarket} from "contracts/ITermMaxMarket.sol"; -import {ITermMaxOrder} from "contracts/ITermMaxOrder.sol"; -import {SwapUnit, ITermMaxRouter, TermMaxRouter} from "contracts/router/TermMaxRouter.sol"; -import { - IGearingToken, - GearingTokenEvents, - AbstractGearingToken, - GtConfig -} from "contracts/tokens/AbstractGearingToken.sol"; -import {PendleSwapV3Adapter} from "contracts/router/swapAdapters/PendleSwapV3Adapter.sol"; -import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; -import {IOracle} from "contracts/oracle/IOracleV1.sol"; -import { - ForkBaseTest, - TermMaxFactory, - MarketConfig, - IERC20, - MarketInitialParams, - IERC20Metadata -} from "test/mainnet-fork/ForkBaseTest.sol"; -import {console} from "forge-std/console.sol"; - -interface TestOracle is IOracle { - function acceptPendingOracle(address asset) external; - function oracles(address asset) external returns (address aggregator, address backupAggregator, uint32 heartbeat); -} - -contract ForkRollover is ForkBaseTest { - string MAINNET_RPC_URL = vm.envString("MAINNET_RPC_URL"); - string DATA_PATH = string.concat(vm.projectRoot(), "/test/testdata/fork/mainnet.json"); - - uint64 may_30 = 1748534400; // 2025-05-30 00:00:00 - uint64 aug_1 = 1753977600; // 2025-08-01 00:00:00 - address pt_susde_may_29 = 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308; - address pt_susde_jun_31 = 0x3b3fB9C57858EF816833dC91565EFcd85D96f634; - address usdc = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; - address usde = 0x4c9EDD5852cd905f086C759E8383e09bff1E68B3; - address susde = 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497; - TestOracle oracle = TestOracle(0xE3a31690392E8E18DC3d862651C079339E2c1ADE); - - ITermMaxMarket mmay_30 = ITermMaxMarket(0xe867255dC0c3a27c90f756ECC566a5292ce19492); - ITermMaxMarket maug_1 = ITermMaxMarket(0xdBB2D44c238c459cCB820De886ABF721EF6E6941); - ITermMaxOrder o_may_30 = ITermMaxOrder(0xe99ee5b18cB57276EbEADf0E773E4f8Ab49Db9B7); - ITermMaxOrder o_aug_1 = ITermMaxOrder(0x71Df74d65c3895C8FA5a1c8E8d93A7eE30A1aFc7); - address pendleAdapter; - address odosAdapter = 0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779; - TermMaxRouter router; - - function _getForkRpcUrl() internal view override returns (string memory) { - return MAINNET_RPC_URL; - } - - function _getDataPath() internal view override returns (string memory) { - return DATA_PATH; - } - - function _finishSetup() internal override { - vm.roll(22486319); // 2025-05-15 - - address accessManager = Ownable(address(oracle)).owner(); - vm.startPrank(accessManager); - address[] memory tokens = new address[](4); - tokens[0] = usdc; - tokens[1] = susde; - tokens[2] = pt_susde_may_29; - tokens[3] = pt_susde_jun_31; - - for (uint256 i = 0; i < tokens.length; i++) { - address token = tokens[i]; - (address aggregator, address backupAggregator,) = oracle.oracles(token); - IOracle.Oracle memory oracleData = IOracle.Oracle({ - aggregator: AggregatorV3Interface(aggregator), - backupAggregator: AggregatorV3Interface(backupAggregator), - heartbeat: 365 days - }); - oracle.submitPendingOracle(token, oracleData); - } - vm.warp(block.timestamp + 1 days); - for (uint256 i = 0; i < tokens.length; i++) { - address token = tokens[i]; - oracle.acceptPendingOracle(token); - } - - vm.stopPrank(); - - PendleSwapV3Adapter adapter = new PendleSwapV3Adapter(0x888888888889758F76e7103c6CbF23ABbF58F946); - pendleAdapter = address(adapter); - - vm.label(pt_susde_may_29, "pt_susde_may_29"); - vm.label(pt_susde_jun_31, "pt_susde_jun_31"); - vm.label(susde, "susde"); - vm.label(address(oracle), "oracle"); - vm.label(address(mmay_30), "mmay_30"); - vm.label(address(maug_1), "maug_1"); - vm.label(address(o_may_30), "o_may_30"); - vm.label(address(o_aug_1), "o_aug_1"); - vm.label(address(pendleAdapter), "pendleAdapter"); - - address admin = vm.randomAddress(); - - vm.startPrank(admin); - router = deployRouter(admin); - router.setAdapterWhitelist(pendleAdapter, true); - router.setAdapterWhitelist(odosAdapter, true); - vm.stopPrank(); - } - - function testRolloverPt() public { - uint128 debt; - uint256 collateralAmount; - // deal(pt_susde_may_29, borrower, collateralAmount); - uint256 gt1 = 5; - address borrower; - { - (,, IGearingToken gt,,) = mmay_30.tokens(); - (address owner, uint128 debtAmt, bytes memory collateralData) = gt.loanInfo(gt1); - borrower = owner; - debt = debtAmt; - collateralAmount = abi.decode(collateralData, (uint256)); - console.log("collateralAmount:", collateralAmount); - console.log("debt:", debt); - } - { - (,, IGearingToken gt,,) = mmay_30.tokens(); - (address owner, uint128 debtAmt, bytes memory collateralData) = gt.loanInfo(gt1); - borrower = owner; - debt = debtAmt; - collateralAmount = abi.decode(collateralData, (uint256)); - console.log("collateralAmount:", collateralAmount); - console.log("debt:", debt); - } - vm.startPrank(borrower); - vm.warp(may_30 - 0.5 days); - // roll gt - { - address pm1 = 0xB162B764044697cf03617C2EFbcB1f42e31E4766; - address pm2 = 0x4339Ffe2B7592Dc783ed13cCE310531aB366dEac; - - SwapUnit[] memory swapUnits = new SwapUnit[](2); - swapUnits[0] = SwapUnit({ - adapter: pendleAdapter, - tokenIn: pt_susde_may_29, - tokenOut: susde, - swapData: abi.encode(pm1, collateralAmount, 0) - }); - swapUnits[1] = SwapUnit({ - adapter: pendleAdapter, - tokenIn: susde, - tokenOut: pt_susde_jun_31, - swapData: abi.encode(pm2, 1e18, 0) - }); - - uint128 additionalAssets = debt / 10; - - ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); - orders[0] = ITermMaxOrder(address(o_aug_1)); - uint128[] memory amounts = new uint128[](1); - amounts[0] = debt - additionalAssets; - (IERC20 ft,, IGearingToken gt, address collateral,) = mmay_30.tokens(); - - deal(usdc, borrower, additionalAssets); - IERC20(usdc).approve(address(router), additionalAssets); - gt.approve(address(router), gt1); - - (IERC20 ft_aug_1,,,,) = maug_1.tokens(); - ITermMaxRouter.TermMaxSwapData memory swapData = ITermMaxRouter.TermMaxSwapData({ - tokenIn: address(ft_aug_1), - tokenOut: usdc, - orders: orders, - tradingAmts: amounts, - netTokenAmt: debt, - deadline: aug_1 - }); - uint128 maxLtv = 0.9e8; - uint256 gtId2 = - router.rolloverGt(borrower, gt, gt1, additionalAssets, swapUnits, maug_1, 0, swapData, maxLtv); - console.log("new gtId:", gtId2); - } - - vm.stopPrank(); - } - - function testRolloverPtWithCollateral() public { - uint128 debt; - uint256 collateralAmount; - // deal(pt_susde_may_29, borrower, collateralAmount); - uint256 gt1 = 5; - address borrower; - { - (,, IGearingToken gt,,) = mmay_30.tokens(); - (address owner, uint128 debtAmt, bytes memory collateralData) = gt.loanInfo(gt1); - borrower = owner; - debt = debtAmt; - collateralAmount = abi.decode(collateralData, (uint256)); - console.log("collateralAmount:", collateralAmount); - console.log("debt:", debt); - } - { - (,, IGearingToken gt,,) = mmay_30.tokens(); - (address owner, uint128 debtAmt, bytes memory collateralData) = gt.loanInfo(gt1); - borrower = owner; - debt = debtAmt; - collateralAmount = abi.decode(collateralData, (uint256)); - console.log("collateralAmount:", collateralAmount); - console.log("debt:", debt); - } - vm.startPrank(borrower); - vm.warp(may_30 - 0.5 days); - // roll gt - { - address pm1 = 0xB162B764044697cf03617C2EFbcB1f42e31E4766; - address pm2 = 0x4339Ffe2B7592Dc783ed13cCE310531aB366dEac; - - SwapUnit[] memory swapUnits = new SwapUnit[](2); - swapUnits[0] = SwapUnit({ - adapter: pendleAdapter, - tokenIn: pt_susde_may_29, - tokenOut: susde, - swapData: abi.encode(pm1, collateralAmount, 0) - }); - swapUnits[1] = SwapUnit({ - adapter: pendleAdapter, - tokenIn: susde, - tokenOut: pt_susde_jun_31, - swapData: abi.encode(pm2, 1e18, 0) - }); - - uint128 additionalAssets = 0; - uint256 additionalCollateral = 0.2 ether; - - ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); - orders[0] = ITermMaxOrder(address(o_aug_1)); - uint128[] memory amounts = new uint128[](1); - amounts[0] = debt - additionalAssets; - (IERC20 ft,, IGearingToken gt, address collateral,) = mmay_30.tokens(); - - deal(pt_susde_jun_31, borrower, additionalCollateral); - IERC20(pt_susde_jun_31).approve(address(router), additionalCollateral); - gt.approve(address(router), gt1); - - (IERC20 ft_aug_1,,,,) = maug_1.tokens(); - ITermMaxRouter.TermMaxSwapData memory swapData = ITermMaxRouter.TermMaxSwapData({ - tokenIn: address(ft_aug_1), - tokenOut: usdc, - orders: orders, - tradingAmts: amounts, - netTokenAmt: debt + debt / 15, - deadline: aug_1 - }); - uint128 maxLtv = 0.9e8; - uint256 gtId2 = router.rolloverGt( - borrower, gt, gt1, additionalAssets, swapUnits, maug_1, additionalCollateral, swapData, maxLtv - ); - console.log("new gtId:", gtId2); - } - - vm.stopPrank(); - } - - function testRolloverPtV2() public { - address borrower = vm.randomAddress(); - vm.label(borrower, "borrower"); - address admin = vm.randomAddress(); - vm.label(admin, "admin"); - - vm.startPrank(admin); - ITermMaxMarket market; - uint256 gtId1; - uint128 oldDebt = 100e6; - uint256 oldCollateral = 1000e18; - - deal(pt_susde_may_29, admin, oldCollateral); - - // create new market support v2 flash repay - { - TermMaxFactory f2 = deployFactory(admin); - MarketConfig memory marketConfig = mmay_30.config(); - (,, IGearingToken gt, address collateral, IERC20 debtToken) = mmay_30.tokens(); - GtConfig memory gtConfig = gt.getGtConfig(); - MarketInitialParams memory params = MarketInitialParams({ - collateral: collateral, - debtToken: IERC20Metadata(address(debtToken)), - admin: admin, - gtImplementation: address(0), - marketConfig: marketConfig, - loanConfig: gtConfig.loanConfig, - gtInitalParams: abi.encode(type(uint128).max), - tokenName: "Test", - tokenSymbol: "TEST" - }); - market = ITermMaxMarket(f2.createMarket(keccak256("GearingTokenWithERC20"), params, 1)); - vm.label(address(market), "newMarket"); - - (,, IGearingToken gt2,,) = market.tokens(); - - IERC20(pt_susde_may_29).approve(address(gt2), oldCollateral); - (gtId1,) = market.issueFt(borrower, 100e6, abi.encode(oldCollateral)); - - vm.label(address(market), "market_may_30"); - vm.label(address(gt2), "gt_may_30"); - } - - vm.stopPrank(); - - uint128 debt = 20e6; - uint256 collateralAmount = 500e18; - - vm.startPrank(borrower); - vm.warp(may_30 - 0.5 days); - // roll gt - { - address pm1 = 0xB162B764044697cf03617C2EFbcB1f42e31E4766; - address pm2 = 0x4339Ffe2B7592Dc783ed13cCE310531aB366dEac; - - SwapUnit[] memory swapUnits = new SwapUnit[](2); - swapUnits[0] = SwapUnit({ - adapter: pendleAdapter, - tokenIn: pt_susde_may_29, - tokenOut: susde, - swapData: abi.encode(pm1, collateralAmount, 0) - }); - swapUnits[1] = SwapUnit({ - adapter: pendleAdapter, - tokenIn: susde, - tokenOut: pt_susde_jun_31, - swapData: abi.encode(pm2, 1e18, 0) - }); - - uint128 additionalAssets = debt / 10; - - ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); - orders[0] = ITermMaxOrder(address(o_aug_1)); - uint128[] memory amounts = new uint128[](1); - amounts[0] = debt - additionalAssets; - (IERC20 ft,, IGearingToken gt, address collateral,) = market.tokens(); - - deal(usdc, borrower, additionalAssets); - IERC20(usdc).approve(address(router), additionalAssets); - gt.approve(address(router), gtId1); - - (IERC20 ft_aug_1,,,,) = maug_1.tokens(); - ITermMaxRouter.TermMaxSwapData memory swapData = ITermMaxRouter.TermMaxSwapData({ - tokenIn: address(ft_aug_1), - tokenOut: usdc, - orders: orders, - tradingAmts: amounts, - netTokenAmt: debt, - deadline: aug_1 - }); - - uint128 maxLtv = 0.9e8; - uint256 gtId2 = router.rolloverGtV2( - borrower, gt, gtId1, debt, additionalAssets, collateralAmount, swapUnits, maug_1, 0, swapData, maxLtv - ); - - (address owner, uint128 currentDebt, bytes memory currentCollateral) = gt.loanInfo(gtId1); - assertEq(owner, borrower, "borrower should be the same"); - assertEq(currentDebt + debt, oldDebt, "debt should be the same"); - assertEq( - abi.decode(currentCollateral, (uint256)), - oldCollateral - collateralAmount, - "collateral should be the same" - ); - - (,, IGearingToken gt2,,) = maug_1.tokens(); - console.log("new gtId:", gtId2); - (address owner2, uint128 currentDebt2, bytes memory currentCollateral2) = gt2.loanInfo(gtId2); - assertEq(owner2, borrower, "borrower should be the same"); - console.log("new gt debt:", currentDebt2 / 1e6); - console.log("new gt collateral:", abi.decode(currentCollateral2, (uint256)) / 1e18); - } - - vm.stopPrank(); - } - - function testRolloverPtV2WithCollateral() public { - address borrower = vm.randomAddress(); - vm.label(borrower, "borrower"); - address admin = vm.randomAddress(); - vm.label(admin, "admin"); - - vm.startPrank(admin); - ITermMaxMarket market; - uint256 gtId1; - uint128 oldDebt = 100e6; - uint256 oldCollateral = 1000e18; - - deal(pt_susde_may_29, admin, oldCollateral); - - // create new market support v2 flash repay - { - TermMaxFactory f2 = deployFactory(admin); - MarketConfig memory marketConfig = mmay_30.config(); - (,, IGearingToken gt, address collateral, IERC20 debtToken) = mmay_30.tokens(); - GtConfig memory gtConfig = gt.getGtConfig(); - MarketInitialParams memory params = MarketInitialParams({ - collateral: collateral, - debtToken: IERC20Metadata(address(debtToken)), - admin: admin, - gtImplementation: address(0), - marketConfig: marketConfig, - loanConfig: gtConfig.loanConfig, - gtInitalParams: abi.encode(type(uint128).max), - tokenName: "Test", - tokenSymbol: "TEST" - }); - market = ITermMaxMarket(f2.createMarket(keccak256("GearingTokenWithERC20"), params, 1)); - vm.label(address(market), "newMarket"); - - (,, IGearingToken gt2,,) = market.tokens(); - - IERC20(pt_susde_may_29).approve(address(gt2), oldCollateral); - (gtId1,) = market.issueFt(borrower, 100e6, abi.encode(oldCollateral)); - - vm.label(address(market), "market_may_30"); - vm.label(address(gt2), "gt_may_30"); - } - - vm.stopPrank(); - - uint128 debt = 20e6; - uint256 collateralAmount = 500e18; - - vm.startPrank(borrower); - vm.warp(may_30 - 0.5 days); - // roll gt - { - address pm1 = 0xB162B764044697cf03617C2EFbcB1f42e31E4766; - address pm2 = 0x4339Ffe2B7592Dc783ed13cCE310531aB366dEac; - - SwapUnit[] memory swapUnits = new SwapUnit[](2); - swapUnits[0] = SwapUnit({ - adapter: pendleAdapter, - tokenIn: pt_susde_may_29, - tokenOut: susde, - swapData: abi.encode(pm1, collateralAmount, 0) - }); - swapUnits[1] = SwapUnit({ - adapter: pendleAdapter, - tokenIn: susde, - tokenOut: pt_susde_jun_31, - swapData: abi.encode(pm2, 1e18, 0) - }); - - uint128 additionalAssets = 0; - uint256 additionalCollateral = 2 ether; - - ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); - orders[0] = ITermMaxOrder(address(o_aug_1)); - uint128[] memory amounts = new uint128[](1); - amounts[0] = debt - additionalAssets; - (IERC20 ft,, IGearingToken gt, address collateral,) = market.tokens(); - - deal(pt_susde_jun_31, borrower, additionalCollateral); - IERC20(pt_susde_jun_31).approve(address(router), additionalCollateral); - gt.approve(address(router), gtId1); - - (IERC20 ft_aug_1,,,,) = maug_1.tokens(); - ITermMaxRouter.TermMaxSwapData memory swapData = ITermMaxRouter.TermMaxSwapData({ - tokenIn: address(ft_aug_1), - tokenOut: usdc, - orders: orders, - tradingAmts: amounts, - netTokenAmt: debt + 10e6, - deadline: aug_1 - }); - - uint128 maxLtv = 0.9e8; - uint256 gtId2 = router.rolloverGtV2( - borrower, gt, gtId1, debt, additionalAssets, collateralAmount, swapUnits, maug_1, 0, swapData, maxLtv - ); - - (address owner, uint128 currentDebt, bytes memory currentCollateral) = gt.loanInfo(gtId1); - assertEq(owner, borrower, "borrower should be the same"); - assertEq(currentDebt + debt, oldDebt, "debt should be the same"); - assertEq( - abi.decode(currentCollateral, (uint256)), - oldCollateral - collateralAmount, - "collateral should be the same" - ); - - (,, IGearingToken gt2,,) = maug_1.tokens(); - console.log("new gtId:", gtId2); - (address owner2, uint128 currentDebt2, bytes memory currentCollateral2) = gt2.loanInfo(gtId2); - assertEq(owner2, borrower, "borrower should be the same"); - console.log("new gt debt:", currentDebt2 / 1e6); - console.log("new gt collateral:", abi.decode(currentCollateral2, (uint256)) / 1e18); - } - - vm.stopPrank(); - } -} diff --git a/test/mainnet-fork/ForkBaseTest.sol b/test/mainnet-fork/ForkBaseTest.sol deleted file mode 100644 index e79e3c1..0000000 --- a/test/mainnet-fork/ForkBaseTest.sol +++ /dev/null @@ -1,173 +0,0 @@ -pragma solidity ^0.8.27; - -import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; -import {TermMaxFactory} from "contracts/factory/TermMaxFactory.sol"; -import {ITermMaxFactory} from "contracts/factory/ITermMaxFactory.sol"; -import {TermMaxRouter} from "contracts/router/TermMaxRouter.sol"; -import {ITermMaxRouter} from "contracts/router/ITermMaxRouter.sol"; -import {TermMaxMarket, Constants, SafeCast} from "contracts/TermMaxMarket.sol"; -import {TermMaxOrder, OrderConfig} from "contracts/TermMaxOrder.sol"; -import {MockERC20} from "contracts/test/MockERC20.sol"; -import {MockPriceFeed} from "contracts/test/MockPriceFeed.sol"; -import {MockOrder} from "contracts/test/MockOrder.sol"; -import {IMintableERC20, MintableERC20} from "contracts/tokens/MintableERC20.sol"; -import {SwapAdapter} from "contracts/test/testnet/SwapAdapter.sol"; -import {IOracle, OracleAggregator} from "contracts/oracle/OracleAggregator.sol"; -import {IOrderManager, OrderManager} from "contracts/vault/OrderManager.sol"; -import {ITermMaxVault, TermMaxVault} from "contracts/vault/TermMaxVault.sol"; -import {VaultFactory, IVaultFactory} from "contracts/factory/VaultFactory.sol"; -import { - MarketConfig, - FeeConfig, - MarketInitialParams, - LoanConfig, - VaultInitialParams -} from "contracts/storage/TermMaxStorage.sol"; -import {JSONLoader} from "test/utils/JSONLoader.sol"; -import "forge-std/Test.sol"; - -abstract contract ForkBaseTest is Test { - using SafeCast for *; - - string jsonData; - - string[] tokenPairs; - - function _finishSetup() internal virtual; - - function setUp() public { - jsonData = vm.readFile(_getDataPath()); - _readTokenPairs(); - - uint256 mainnetFork = vm.createFork(_getForkRpcUrl()); - vm.selectFork(mainnetFork); - - _finishSetup(); - } - - function _getForkRpcUrl() internal view virtual returns (string memory); - - function _getDataPath() internal view virtual returns (string memory); - - function _readTokenPairs() internal { - // uint256 len = vm.parseJsonUint(jsonData, ".tokenPairs.length"); - string[] memory _tokenPairs = vm.parseJsonStringArray(jsonData, ".tokenPairs"); - for (uint256 i = 0; i < _tokenPairs.length; i++) { - tokenPairs.push(string.concat(".", _tokenPairs[i])); - } - } - - function _readBlockNumber(string memory key) internal view returns (uint256) { - return uint256(vm.parseJsonUint(jsonData, string.concat(key, ".blockNumber"))); - } - - function _readMarketInitialParams(string memory key) - internal - returns (MarketInitialParams memory marketInitialParams) - { - marketInitialParams.admin = vm.randomAddress(); - marketInitialParams.collateral = vm.parseJsonAddress(jsonData, string.concat(key, ".collateral")); - marketInitialParams.debtToken = IERC20Metadata(vm.parseJsonAddress(jsonData, string.concat(key, ".debtToken"))); - - marketInitialParams.tokenName = key; - marketInitialParams.tokenSymbol = key; - - MarketConfig memory marketConfig; - - marketConfig.feeConfig.mintGtFeeRatio = - uint32(vm.parseUint(vm.parseJsonString(jsonData, string.concat(key, ".feeConfig.mintGtFeeRatio")))); - marketConfig.feeConfig.mintGtFeeRef = - uint32(vm.parseUint(vm.parseJsonString(jsonData, string.concat(key, ".feeConfig.mintGtFeeRef")))); - marketConfig.feeConfig.lendTakerFeeRatio = - uint32(vm.parseUint(vm.parseJsonString(jsonData, string.concat(key, ".feeConfig.lendTakerFeeRatio")))); - marketConfig.feeConfig.borrowTakerFeeRatio = - uint32(vm.parseUint(vm.parseJsonString(jsonData, string.concat(key, ".feeConfig.borrowTakerFeeRatio")))); - marketConfig.feeConfig.lendMakerFeeRatio = - uint32(vm.parseUint(vm.parseJsonString(jsonData, string.concat(key, ".feeConfig.lendMakerFeeRatio")))); - marketConfig.feeConfig.borrowMakerFeeRatio = - uint32(vm.parseUint(vm.parseJsonString(jsonData, string.concat(key, ".feeConfig.borrowMakerFeeRatio")))); - marketInitialParams.marketConfig = marketConfig; - - marketConfig.treasurer = vm.randomAddress(); - marketConfig.maturity = - uint64(86400 * vm.parseUint(vm.parseJsonString(jsonData, string.concat(key, ".duration")))); - - marketInitialParams.loanConfig.maxLtv = - uint32(vm.parseUint(vm.parseJsonString(jsonData, string.concat(key, ".loanConfig.maxLtv")))); - marketInitialParams.loanConfig.liquidationLtv = - uint32(vm.parseUint(vm.parseJsonString(jsonData, string.concat(key, ".loanConfig.liquidationLtv")))); - marketInitialParams.loanConfig.liquidatable = - vm.parseBool(vm.parseJsonString(jsonData, string.concat(key, ".loanConfig.liquidatable"))); - - marketInitialParams.gtInitalParams = abi.encode(type(uint256).max); - - return marketInitialParams; - } - - function _readOrderConfig(string memory key) internal view returns (OrderConfig memory orderConfig) { - orderConfig = JSONLoader.getOrderConfigFromJson(jsonData, string.concat(key, ".orderConfig")); - return orderConfig; - } - - function _readVaultInitialParams(address admin, IERC20 debtToken, string memory key) - internal - returns (VaultInitialParams memory vaultInitialParams) - { - vaultInitialParams.admin = admin; - vaultInitialParams.curator = vm.randomAddress(); - vaultInitialParams.timelock = 1 days; - vaultInitialParams.asset = debtToken; - vaultInitialParams.maxCapacity = type(uint128).max; - vaultInitialParams.name = string.concat("Vault-", key); - vaultInitialParams.symbol = string.concat("Vault-", key); - vaultInitialParams.performanceFeeRate = 0.1e8; - return vaultInitialParams; - } - - function _setPriceFeedInTokenDecimal8( - MockPriceFeed priceFeed, - uint8 tokenDecimals, - MockPriceFeed.RoundData memory roundData - ) internal { - roundData.answer = - (roundData.answer.toUint256() * (10 ** uint256(tokenDecimals)) / Constants.DECIMAL_BASE).toInt256(); - priceFeed.updateRoundData(roundData); - } - - function deployFactory(address admin) public returns (TermMaxFactory factory) { - address tokenImplementation = address(new MintableERC20()); - address orderImplementation = address(new TermMaxOrder()); - TermMaxMarket m = new TermMaxMarket(tokenImplementation, orderImplementation); - factory = new TermMaxFactory(admin, address(m)); - } - - function deployFactoryWithMockOrder(address admin) public returns (TermMaxFactory factory) { - address tokenImplementation = address(new MintableERC20()); - address orderImplementation = address(new MockOrder()); - TermMaxMarket m = new TermMaxMarket(tokenImplementation, orderImplementation); - factory = new TermMaxFactory(admin, address(m)); - } - - function deployVaultFactory() public returns (VaultFactory vaultFactory) { - OrderManager orderManager = new OrderManager(); - TermMaxVault implementation = new TermMaxVault(address(orderManager)); - vaultFactory = new VaultFactory(address(implementation)); - } - - function deployOracleAggregator(address admin) public returns (OracleAggregator oracle) { - oracle = new OracleAggregator(admin, 0); - } - - function deployMockPriceFeed(address admin) public returns (MockPriceFeed priceFeed) { - priceFeed = new MockPriceFeed(admin); - } - - function deployRouter(address admin) public returns (TermMaxRouter router) { - TermMaxRouter implementation = new TermMaxRouter(); - bytes memory data = abi.encodeCall(TermMaxRouter.initialize, admin); - ERC1967Proxy proxy = new ERC1967Proxy(address(implementation), data); - router = TermMaxRouter(address(proxy)); - } -} diff --git a/test/mainnet-fork/GtBaseTest.t.sol b/test/mainnet-fork/GtBaseTest.t.sol deleted file mode 100644 index 04b383a..0000000 --- a/test/mainnet-fork/GtBaseTest.t.sol +++ /dev/null @@ -1,389 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import "forge-std/Test.sol"; -import {DeployUtils} from "../utils/DeployUtils.sol"; -import {JSONLoader} from "../utils/JSONLoader.sol"; -import {StateChecker} from "../utils/StateChecker.sol"; -import {SwapUtils} from "../utils/SwapUtils.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; -import {TermMaxFactory} from "contracts/factory/TermMaxFactory.sol"; -import {Constants} from "contracts/lib/Constants.sol"; -import {ITermMaxMarket, TermMaxMarket, MarketEvents} from "contracts/TermMaxMarket.sol"; -import {ITermMaxOrder} from "contracts/ITermMaxOrder.sol"; -import {IMintableERC20} from "contracts/tokens/IMintableERC20.sol"; -import {MockPriceFeed} from "contracts/test/MockPriceFeed.sol"; -import {IGearingToken, AbstractGearingToken, GearingTokenConstants} from "contracts/tokens/AbstractGearingToken.sol"; -import {IOracle, OracleAggregator, AggregatorV3Interface} from "contracts/oracle/OracleAggregator.sol"; -import {TermMaxRouter, ISwapAdapter, ITermMaxRouter, SwapUnit, RouterErrors} from "contracts/router/TermMaxRouter.sol"; -import {UniswapV3Adapter, ERC20SwapAdapter} from "contracts/router/swapAdapters/UniswapV3Adapter.sol"; -import {PendleSwapV3Adapter} from "contracts/router/swapAdapters/PendleSwapV3Adapter.sol"; -import {OdosV2Adapter, IOdosRouterV2} from "contracts/router/swapAdapters/OdosV2Adapter.sol"; -import {ERC4626VaultAdapter} from "contracts/router/swapAdapters/ERC4626VaultAdapter.sol"; -import {TermMaxOrder, ITermMaxOrder} from "contracts/TermMaxOrder.sol"; -import {ForkBaseTest} from "./ForkBaseTest.sol"; -import {RouterEvents} from "contracts/events/RouterEvents.sol"; -import {MockFlashLoanReceiver} from "contracts/test/MockFlashLoanReceiver.sol"; -import "contracts/storage/TermMaxStorage.sol"; - -abstract contract GtBaseTest is ForkBaseTest { - enum TokenType { - General, - Pendle, - Morpho - } - - struct SwapData { - uint128 debtAmt; - uint128 swapAmtIn; - TokenType tokenType; - SwapUnit[] leverageUnits; - SwapUnit[] flashRepayUnits; - } - - struct SwapAdapters { - address uniswapAdapter; - address pendleAdapter; - address odosAdapter; - address vaultAdapter; - } - - struct GtTestRes { - uint256 blockNumber; - uint256 orderInitialAmount; - MarketInitialParams marketInitialParams; - OrderConfig orderConfig; - TermMaxMarket market; - IMintableERC20 ft; - IMintableERC20 xt; - IGearingToken gt; - IERC20Metadata collateral; - IERC20Metadata debtToken; - IOracle oracle; - MockPriceFeed collateralPriceFeed; - MockPriceFeed debtPriceFeed; - ITermMaxOrder order; - ITermMaxRouter router; - uint256 maxXtReserve; - address maker; - SwapData swapData; - SwapAdapters swapAdapters; - } - - function _initializeGtTestRes(string memory key) internal returns (GtTestRes memory) { - GtTestRes memory res; - res.blockNumber = _readBlockNumber(key); - res.marketInitialParams = _readMarketInitialParams(key); - res.orderConfig = _readOrderConfig(key); - res.maker = vm.randomAddress(); - res.maxXtReserve = type(uint128).max; - - vm.rollFork(res.blockNumber); - - vm.startPrank(res.marketInitialParams.admin); - - res.oracle = deployOracleAggregator(res.marketInitialParams.admin); - res.collateralPriceFeed = deployMockPriceFeed(res.marketInitialParams.admin); - res.debtPriceFeed = deployMockPriceFeed(res.marketInitialParams.admin); - res.oracle.submitPendingOracle( - address(res.marketInitialParams.collateral), - IOracle.Oracle(res.collateralPriceFeed, res.collateralPriceFeed, 0, 0, 0) - ); - res.oracle.submitPendingOracle( - address(res.marketInitialParams.debtToken), IOracle.Oracle(res.debtPriceFeed, res.debtPriceFeed, 0, 0, 0) - ); - - res.oracle.acceptPendingOracle(address(res.marketInitialParams.collateral)); - res.oracle.acceptPendingOracle(address(res.marketInitialParams.debtToken)); - - res.marketInitialParams.marketConfig.maturity += uint64(block.timestamp); - res.marketInitialParams.loanConfig.oracle = res.oracle; - - res.market = TermMaxMarket( - deployFactory(res.marketInitialParams.admin).createMarket( - keccak256("GearingTokenWithERC20"), res.marketInitialParams, 0 - ) - ); - - (res.ft, res.xt, res.gt,,) = res.market.tokens(); - res.debtToken = res.marketInitialParams.debtToken; - res.collateral = IERC20Metadata(res.marketInitialParams.collateral); - - // set all price as 1 USD = 1e8 tokens - uint8 debtDecimals = res.debtToken.decimals(); - _setPriceFeedInTokenDecimal8( - res.debtPriceFeed, debtDecimals, MockPriceFeed.RoundData(1, 1e8, block.timestamp, block.timestamp, 0) - ); - uint8 collateralDecimals = res.collateral.decimals(); - _setPriceFeedInTokenDecimal8( - res.collateralPriceFeed, - collateralDecimals, - MockPriceFeed.RoundData(1, 1e8, block.timestamp, block.timestamp, 0) - ); - - res.order = - res.market.createOrder(res.maker, res.maxXtReserve, ISwapCallback(address(0)), res.orderConfig.curveCuts); - - res.swapAdapters.uniswapAdapter = - address(new UniswapV3Adapter(vm.parseJsonAddress(jsonData, ".routers.uniswapRouter"))); - res.swapAdapters.pendleAdapter = - address(new PendleSwapV3Adapter(vm.parseJsonAddress(jsonData, ".routers.pendleRouter"))); - res.swapAdapters.odosAdapter = address(new OdosV2Adapter(vm.parseJsonAddress(jsonData, ".routers.odosRouter"))); - res.swapAdapters.vaultAdapter = address(new ERC4626VaultAdapter()); - res.router = deployRouter(res.marketInitialParams.admin); - res.router.setAdapterWhitelist(res.swapAdapters.uniswapAdapter, true); - res.router.setAdapterWhitelist(res.swapAdapters.pendleAdapter, true); - res.router.setAdapterWhitelist(res.swapAdapters.odosAdapter, true); - res.router.setAdapterWhitelist(res.swapAdapters.vaultAdapter, true); - res.swapData = _readSwapData(key); - - res.orderInitialAmount = vm.parseJsonUint(jsonData, string.concat(key, ".orderInitialAmount")); - deal(address(res.debtToken), res.marketInitialParams.admin, res.orderInitialAmount); - - res.debtToken.approve(address(res.market), res.orderInitialAmount); - res.market.mint(address(res.order), res.orderInitialAmount); - - vm.stopPrank(); - - return res; - } - - function _readSwapData(string memory key) internal view returns (SwapData memory data) { - data.tokenType = TokenType(vm.parseJsonUint(jsonData, string.concat(key, ".swapData.tokenType"))); - data.debtAmt = uint128(vm.parseJsonUint(jsonData, string.concat(key, ".swapData.debtAmt"))); - data.swapAmtIn = uint128(vm.parseJsonUint(jsonData, string.concat(key, ".swapData.swapAmtIn"))); - - uint256 length = vm.parseJsonUint(jsonData, string.concat(key, ".swapData.length")); - data.leverageUnits = new SwapUnit[](length); - data.flashRepayUnits = new SwapUnit[](length); - for (uint256 i = 0; i < length; i++) { - data.leverageUnits[i] = _readSwapUnit(string.concat(key, ".swapData.leverageUnits.", vm.toString(i))); - data.flashRepayUnits[i] = _readSwapUnit(string.concat(key, ".swapData.flashRepayUnits.", vm.toString(i))); - } - } - - function _readSwapUnit(string memory key) internal view returns (SwapUnit memory data) { - data.adapter = vm.parseJsonAddress(jsonData, string.concat(key, ".adapter")); - data.tokenIn = vm.parseJsonAddress(jsonData, string.concat(key, ".tokenIn")); - data.tokenOut = vm.parseJsonAddress(jsonData, string.concat(key, ".tokenOut")); - data.swapData = vm.parseJsonBytes(jsonData, string.concat(key, ".swapData")); - } - - function _updateCollateralPrice(GtTestRes memory res, int256 price) internal { - vm.startPrank(res.marketInitialParams.admin); - // set all price as 1 USD = 1e8 tokens - uint8 decimals = res.collateral.decimals(); - (uint80 roundId,,,,) = res.collateralPriceFeed.latestRoundData(); - roundId++; - uint256 time = block.timestamp; - _setPriceFeedInTokenDecimal8( - res.collateralPriceFeed, decimals, MockPriceFeed.RoundData(roundId, price, time, time, 0) - ); - vm.stopPrank(); - } - - function _testBorrow(GtTestRes memory res, uint256 collInAmt, uint128 borrowAmt, uint128 maxDebtAmt) internal { - address taker = vm.randomAddress(); - - vm.startPrank(taker); - - ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); - orders[0] = res.order; - uint128[] memory tokenAmtsWantBuy = new uint128[](1); - tokenAmtsWantBuy[0] = borrowAmt; - - deal(address(res.collateral), taker, collInAmt); - res.collateral.approve(address(res.router), collInAmt); - - uint256 gtId = res.router.borrowTokenFromCollateral( - taker, res.market, collInAmt, orders, tokenAmtsWantBuy, maxDebtAmt, block.timestamp + 1 hours - ); - (address owner, uint128 debtAmt, bytes memory collateralData) = res.gt.loanInfo(gtId); - assertEq(owner, taker); - assertEq(collInAmt, abi.decode(collateralData, (uint256))); - assertLe(debtAmt, maxDebtAmt); - assertEq(res.debtToken.balanceOf(taker), borrowAmt); - - vm.stopPrank(); - } - - function _testLeverageFromXt( - GtTestRes memory res, - address taker, - uint128 xtAmtIn, - uint128 tokenAmtIn, - SwapUnit[] memory units - ) internal returns (uint256 gtId) { - vm.startPrank(taker); - deal(taker, 1e8); - deal(address(res.debtToken), taker, xtAmtIn); - res.debtToken.approve(address(res.market), xtAmtIn); - res.market.mint(taker, xtAmtIn); - - uint256 maxLtv = res.marketInitialParams.loanConfig.maxLtv; - - deal(address(res.debtToken), taker, tokenAmtIn); - res.debtToken.approve(address(res.router), tokenAmtIn); - - uint256 debtTokenBalanceBeforeSwap = res.debtToken.balanceOf(taker); - uint256 xtAmtBeforeSwap = res.xt.balanceOf(taker); - - res.xt.approve(address(res.router), xtAmtIn); - gtId = res.router.leverageFromXt(taker, res.market, xtAmtIn, tokenAmtIn, uint128(maxLtv), units); - - uint256 debtTokenBalanceAfterSwap = res.debtToken.balanceOf(taker); - uint256 xtAmtAfterSwap = res.xt.balanceOf(taker); - - assertEq(debtTokenBalanceBeforeSwap - debtTokenBalanceAfterSwap, tokenAmtIn); - assertEq(xtAmtBeforeSwap - xtAmtAfterSwap, xtAmtIn); - - assertEq(res.collateral.balanceOf(taker), 0); - - assertEq(res.debtToken.balanceOf(address(res.router)), 0); - assertEq(res.xt.balanceOf(address(res.router)), 0); - assertEq(res.debtToken.balanceOf(address(res.router)), 0); - assertEq(res.collateral.balanceOf(address(res.router)), 0); - - vm.stopPrank(); - } - - function _testLeverageFromToken( - GtTestRes memory res, - address taker, - uint128 tokenAmtToBuyXt, - uint128 tokenAmtIn, - SwapUnit[] memory units - ) internal returns (uint256 gtId) { - vm.startPrank(taker); - deal(taker, 1e8); - - uint256 maxLtv = res.marketInitialParams.loanConfig.maxLtv; - uint128 minXTOut = 0e8; - deal(address(res.debtToken), taker, tokenAmtToBuyXt + tokenAmtIn); - res.debtToken.approve(address(res.router), tokenAmtToBuyXt + tokenAmtIn); - - uint256 debtTokenBalanceBeforeSwap = res.debtToken.balanceOf(taker); - - ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); - orders[0] = res.order; - uint128[] memory amtsToBuyXt = new uint128[](1); - amtsToBuyXt[0] = tokenAmtToBuyXt; - - (gtId,) = res.router.leverageFromToken( - taker, - res.market, - orders, - amtsToBuyXt, - minXTOut, - tokenAmtIn, - uint128(maxLtv), - units, - block.timestamp + 1 hours - ); - - uint256 debtTokenBalanceAfterSwap = res.debtToken.balanceOf(taker); - - assertEq(debtTokenBalanceBeforeSwap - debtTokenBalanceAfterSwap, tokenAmtToBuyXt + tokenAmtIn); - - assertEq(res.collateral.balanceOf(taker), 0); - - assertEq(res.debtToken.balanceOf(address(res.router)), 0); - assertEq(res.xt.balanceOf(address(res.router)), 0); - assertEq(res.debtToken.balanceOf(address(res.router)), 0); - assertEq(res.collateral.balanceOf(address(res.router)), 0); - - vm.stopPrank(); - } - - function _testFlashRepay(GtTestRes memory res, uint256 gtId, address taker, SwapUnit[] memory units) internal { - deal(taker, 1e18); - - vm.startPrank(taker); - - res.gt.approve(address(res.router), gtId); - - uint256 debtTokenBalanceBeforeRepay = res.debtToken.balanceOf(taker); - bool byDebtToken = true; - - ITermMaxRouter.TermMaxSwapData memory swapData; - - (, uint128 debtAmt, bytes memory collateralData) = res.gt.loanInfo(gtId); - uint256 netTokenOut = res.router.flashRepayFromCollV2( - taker, res.market, gtId, debtAmt, byDebtToken, collateralData, units, swapData - ); - - uint256 debtTokenBalanceAfterRepay = res.debtToken.balanceOf(taker); - - assertEq(debtTokenBalanceAfterRepay - debtTokenBalanceBeforeRepay, netTokenOut); - - vm.stopPrank(); - } - - function _testFlashRepayByFt(GtTestRes memory res, uint256 gtId, address taker, SwapUnit[] memory units) internal { - deal(taker, 1e18); - - vm.startPrank(taker); - res.gt.approve(address(res.router), gtId); - - uint256 debtTokenBalanceBeforeRepay = res.debtToken.balanceOf(taker); - ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); - orders[0] = res.order; - uint128[] memory amtsToBuyFt = new uint128[](1); - - (, uint128 debtAmt, bytes memory collateralData) = res.gt.loanInfo(gtId); - amtsToBuyFt[0] = debtAmt; - bool byDebtToken = false; - - ITermMaxRouter.TermMaxSwapData memory swapData; - swapData.tokenIn = address(res.debtToken); - swapData.tokenOut = address(res.ft); - swapData.orders = orders; - swapData.tradingAmts = amtsToBuyFt; - swapData.deadline = block.timestamp + 1 hours; - - uint256 netTokenOut = res.router.flashRepayFromCollV2( - taker, res.market, gtId, debtAmt, byDebtToken, collateralData, units, swapData - ); - - uint256 debtTokenBalanceAfterRepay = res.debtToken.balanceOf(taker); - - assertEq(debtTokenBalanceAfterRepay - debtTokenBalanceBeforeRepay, netTokenOut); - - vm.stopPrank(); - } - - function _testLiquidate(GtTestRes memory res, address liquidator, uint256 gtId) - internal - returns (uint256 collateralAmt) - { - deal(liquidator, 1e18); - vm.startPrank(liquidator); - - (, uint128 debtAmt,) = res.gt.loanInfo(gtId); - - deal(address(res.debtToken), liquidator, debtAmt); - res.debtToken.approve(address(res.gt), debtAmt); - - collateralAmt = res.collateral.balanceOf(liquidator); - - bool byDebtToken = true; - res.gt.liquidate(gtId, debtAmt, byDebtToken); - - collateralAmt = res.collateral.balanceOf(liquidator) - collateralAmt; - - vm.stopPrank(); - } - - function _fastLoan(GtTestRes memory res, address taker, uint256 debtAmt, uint256 collateralAmt) - internal - returns (uint256 gtId) - { - vm.startPrank(taker); - deal(taker, 1e18); - deal(address(res.collateral), taker, collateralAmt); - res.collateral.approve(address(res.gt), collateralAmt); - (gtId,) = res.market.issueFt(taker, uint128(debtAmt), abi.encode(collateralAmt)); - vm.stopPrank(); - } -} diff --git a/test/mainnet-fork/MarketBaseTest.t.sol b/test/mainnet-fork/MarketBaseTest.t.sol deleted file mode 100644 index a2c33f4..0000000 --- a/test/mainnet-fork/MarketBaseTest.t.sol +++ /dev/null @@ -1,229 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import "forge-std/Test.sol"; -import {DeployUtils} from "../utils/DeployUtils.sol"; -import {JSONLoader} from "../utils/JSONLoader.sol"; -import {StateChecker} from "../utils/StateChecker.sol"; -import {SwapUtils} from "../utils/SwapUtils.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; -import {TermMaxFactory} from "contracts/factory/TermMaxFactory.sol"; -import {Constants} from "contracts/lib/Constants.sol"; -import {ITermMaxMarket, TermMaxMarket, MarketEvents, SafeCast} from "contracts/TermMaxMarket.sol"; -import {ITermMaxOrder} from "contracts/ITermMaxOrder.sol"; -import {IMintableERC20} from "contracts/tokens/IMintableERC20.sol"; -import {MockPriceFeed} from "contracts/test/MockPriceFeed.sol"; -import {IGearingToken, AbstractGearingToken} from "contracts/tokens/AbstractGearingToken.sol"; -import {IOracle, OracleAggregator, AggregatorV3Interface} from "contracts/oracle/OracleAggregator.sol"; -import {TermMaxRouter, ISwapAdapter, ITermMaxRouter, SwapUnit, RouterErrors} from "contracts/router/TermMaxRouter.sol"; -import {UniswapV3Adapter, ERC20SwapAdapter} from "contracts/router/swapAdapters/UniswapV3Adapter.sol"; -import {PendleSwapV3Adapter} from "contracts/router/swapAdapters/PendleSwapV3Adapter.sol"; -import {OdosV2Adapter, IOdosRouterV2} from "contracts/router/swapAdapters/OdosV2Adapter.sol"; -import {TermMaxOrder, ITermMaxOrder} from "contracts/TermMaxOrder.sol"; -import {ForkBaseTest} from "./ForkBaseTest.sol"; -import {RouterEvents} from "contracts/events/RouterEvents.sol"; -import {MockFlashLoanReceiver} from "contracts/test/MockFlashLoanReceiver.sol"; -import "contracts/storage/TermMaxStorage.sol"; - -abstract contract MarketBaseTest is ForkBaseTest { - using SafeCast for *; - - struct MarketTestRes { - uint256 blockNumber; - uint256 orderInitialAmount; - MarketInitialParams marketInitialParams; - OrderConfig orderConfig; - TermMaxMarket market; - IMintableERC20 ft; - IMintableERC20 xt; - IGearingToken gt; - IERC20Metadata collateral; - IERC20Metadata debtToken; - IOracle oracle; - MockPriceFeed collateralPriceFeed; - MockPriceFeed debtPriceFeed; - ITermMaxOrder order; - ITermMaxRouter router; - uint256 maxXtReserve; - address maker; - } - - function _initializeMarketTestRes(string memory key) internal returns (MarketTestRes memory) { - MarketTestRes memory res; - res.blockNumber = _readBlockNumber(key); - res.marketInitialParams = _readMarketInitialParams(key); - res.orderConfig = _readOrderConfig(key); - res.maker = vm.randomAddress(); - res.maxXtReserve = type(uint128).max; - - vm.rollFork(res.blockNumber); - - vm.startPrank(res.marketInitialParams.admin); - - res.oracle = deployOracleAggregator(res.marketInitialParams.admin); - res.collateralPriceFeed = deployMockPriceFeed(res.marketInitialParams.admin); - res.debtPriceFeed = deployMockPriceFeed(res.marketInitialParams.admin); - res.oracle.submitPendingOracle( - address(res.marketInitialParams.collateral), - IOracle.Oracle(res.collateralPriceFeed, res.collateralPriceFeed, 0, 0, 0) - ); - res.oracle.submitPendingOracle( - address(res.marketInitialParams.debtToken), IOracle.Oracle(res.debtPriceFeed, res.debtPriceFeed, 0, 0, 0) - ); - res.oracle.acceptPendingOracle(address(res.marketInitialParams.collateral)); - res.oracle.acceptPendingOracle(address(res.marketInitialParams.debtToken)); - - res.marketInitialParams.marketConfig.maturity += uint64(block.timestamp); - res.marketInitialParams.loanConfig.oracle = res.oracle; - - res.market = TermMaxMarket( - deployFactory(res.marketInitialParams.admin).createMarket( - keccak256("GearingTokenWithERC20"), res.marketInitialParams, 0 - ) - ); - - (res.ft, res.xt, res.gt,,) = res.market.tokens(); - res.debtToken = res.marketInitialParams.debtToken; - res.collateral = IERC20Metadata(res.marketInitialParams.collateral); - - // set all price as 1 USD = 1e8 tokens - uint8 debtDecimals = res.debtToken.decimals(); - _setPriceFeedInTokenDecimal8( - res.debtPriceFeed, debtDecimals, MockPriceFeed.RoundData(1, 1e8, block.timestamp, block.timestamp, 0) - ); - uint8 collateralDecimals = res.collateral.decimals(); - _setPriceFeedInTokenDecimal8( - res.collateralPriceFeed, - collateralDecimals, - MockPriceFeed.RoundData(1, 1e8, block.timestamp, block.timestamp, 0) - ); - - res.order = - res.market.createOrder(res.maker, res.maxXtReserve, ISwapCallback(address(0)), res.orderConfig.curveCuts); - - res.router = deployRouter(res.marketInitialParams.admin); - - res.orderInitialAmount = vm.parseJsonUint(jsonData, string.concat(key, ".orderInitialAmount")); - deal(address(res.debtToken), res.marketInitialParams.admin, res.orderInitialAmount); - - res.debtToken.approve(address(res.market), res.orderInitialAmount); - res.market.mint(address(res.order), res.orderInitialAmount); - - vm.stopPrank(); - - return res; - } - - function _testMint(MarketTestRes memory res) internal { - address to = vm.randomAddress(); - uint256 amount = 100e8; - deal(address(res.debtToken), to, amount); - deal(to, 1e18); - vm.startPrank(to); - res.debtToken.approve(address(res.market), amount); - res.market.mint(to, amount); - vm.assertEq(res.ft.balanceOf(to), amount); - vm.assertEq(res.xt.balanceOf(to), amount); - vm.stopPrank(); - } - - function _testBurn(MarketTestRes memory res) internal { - address taker = vm.randomAddress(); - uint256 amount = 100e8; - deal(taker, 1e18); - deal(address(res.debtToken), taker, amount); - vm.startPrank(taker); - res.debtToken.approve(address(res.market), amount); - res.market.mint(taker, amount); - - res.market.burn(taker, taker, amount); - vm.assertEq(res.debtToken.balanceOf(taker), amount); - vm.stopPrank(); - } - - function _testRedeem(MarketTestRes memory res) internal { - MarketConfig memory marketConfig = res.market.config(); - vm.prank(res.marketInitialParams.admin); - res.market.updateMarketConfig(marketConfig); - - address bob = vm.randomAddress(); - address alice = vm.randomAddress(); - deal(bob, 1e18); - deal(alice, 1e18); - - uint128 depositAmt = uint128(res.orderInitialAmount); - uint128 debtAmt = uint128(res.orderInitialAmount / 20); - uint256 collateralAmt = uint256(res.orderInitialAmount / 10); - - vm.startPrank(bob); - deal(address(res.debtToken), bob, depositAmt); - res.debtToken.approve(address(res.market), depositAmt); - res.market.mint(bob, depositAmt); - - res.xt.transfer(alice, debtAmt); - vm.stopPrank(); - - vm.startPrank(alice); - - MockFlashLoanReceiver receiver = new MockFlashLoanReceiver(res.market); - deal(address(res.collateral), address(receiver), collateralAmt); - - res.xt.approve(address(receiver), debtAmt); - receiver.leverageByXt(debtAmt, abi.encode(alice, collateralAmt)); - vm.stopPrank(); - - vm.warp(marketConfig.maturity + Constants.LIQUIDATION_WINDOW); - - vm.startPrank(bob); - res.ft.approve(address(res.market), depositAmt); - - uint256 propotion = - depositAmt * Constants.DECIMAL_BASE_SQ / (res.ft.totalSupply() - res.ft.balanceOf(address(res.market))); - uint256 redeemAmt = propotion * res.debtToken.balanceOf(address(res.market)) / Constants.DECIMAL_BASE_SQ; - uint256 redeemedCollateral = propotion * res.collateral.balanceOf(address(res.gt)) / Constants.DECIMAL_BASE_SQ; - - vm.expectEmit(); - emit MarketEvents.Redeem(bob, bob, uint128(propotion), uint128(redeemAmt), abi.encode(redeemedCollateral)); - res.market.redeem(bob, bob, depositAmt); - - assertEq(res.debtToken.balanceOf(bob), redeemAmt); - assertEq(res.collateral.balanceOf(bob), redeemedCollateral); - assertEq(res.ft.balanceOf(bob), 0); - vm.stopPrank(); - } - - function _testIssueFtByGtWhenSwap(MarketTestRes memory res, uint256 collateralAmt, uint128 debtAmt) internal { - address taker = vm.randomAddress(); - deal(taker, 1e18); - - uint128 ftOutAmt = 151e8; - uint128 maxTokenIn = 150e8; - - vm.startPrank(res.maker); - deal(res.maker, 1e18); - deal(address(res.collateral), res.maker, collateralAmt); - res.collateral.approve(address(res.gt), collateralAmt); - (uint256 gtId,) = res.market.issueFt(res.maker, debtAmt, abi.encode(collateralAmt)); - - res.gt.approve(address(res.order), gtId); - OrderConfig memory orderConfig = res.order.orderConfig(); - orderConfig.gtId = gtId; - // make sure ft reserve in order is zero and xt is 150e8 - res.order.updateOrder( - orderConfig, - -(res.ft.balanceOf(address(res.order)).toInt256()), - -(res.xt.balanceOf(address(res.order)) - maxTokenIn).toInt256() - ); - vm.stopPrank(); - - vm.startPrank(taker); - deal(address(res.debtToken), taker, maxTokenIn); - res.debtToken.approve(address(res.order), maxTokenIn); - res.order.swapTokenToExactToken(res.debtToken, res.ft, taker, ftOutAmt, maxTokenIn, block.timestamp + 1 hours); - assertEq(res.ft.balanceOf(taker), ftOutAmt); - (, uint128 debtAmtNow,) = res.gt.loanInfo(gtId); - assertGt(debtAmtNow, debtAmt); - vm.stopPrank(); - } -} diff --git a/test/mainnet-fork/VaultBaseTest.t.sol b/test/mainnet-fork/VaultBaseTest.t.sol deleted file mode 100644 index e63463b..0000000 --- a/test/mainnet-fork/VaultBaseTest.t.sol +++ /dev/null @@ -1,247 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import "forge-std/Test.sol"; -import {DeployUtils} from "../utils/DeployUtils.sol"; -import {JSONLoader} from "../utils/JSONLoader.sol"; -import {StateChecker} from "../utils/StateChecker.sol"; -import {SwapUtils} from "../utils/SwapUtils.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; -import {TermMaxFactory} from "contracts/factory/TermMaxFactory.sol"; -import {Constants} from "contracts/lib/Constants.sol"; -import {ITermMaxMarket, TermMaxMarket, MarketEvents} from "contracts/TermMaxMarket.sol"; -import {ITermMaxOrder} from "contracts/ITermMaxOrder.sol"; -import {IMintableERC20} from "contracts/tokens/IMintableERC20.sol"; -import {MockPriceFeed} from "contracts/test/MockPriceFeed.sol"; -import {IGearingToken, AbstractGearingToken} from "contracts/tokens/AbstractGearingToken.sol"; -import {IOracle, OracleAggregator, AggregatorV3Interface} from "contracts/oracle/OracleAggregator.sol"; -import {TermMaxRouter, ISwapAdapter, ITermMaxRouter, SwapUnit, RouterErrors} from "contracts/router/TermMaxRouter.sol"; -import {UniswapV3Adapter, ERC20SwapAdapter} from "contracts/router/swapAdapters/UniswapV3Adapter.sol"; -import {PendleSwapV3Adapter} from "contracts/router/swapAdapters/PendleSwapV3Adapter.sol"; -import {OdosV2Adapter, IOdosRouterV2} from "contracts/router/swapAdapters/OdosV2Adapter.sol"; -import {TermMaxOrder, ITermMaxOrder} from "contracts/TermMaxOrder.sol"; -import {ForkBaseTest} from "./ForkBaseTest.sol"; -import {RouterEvents} from "contracts/events/RouterEvents.sol"; -import {MockFlashLoanReceiver} from "contracts/test/MockFlashLoanReceiver.sol"; -import {TermMaxVault} from "contracts/vault/TermMaxVault.sol"; -import {VaultErrors, VaultEvents, ITermMaxVault} from "contracts/vault/TermMaxVault.sol"; -import {OrderManager} from "contracts/vault/OrderManager.sol"; -import {VaultConstants} from "contracts/lib/VaultConstants.sol"; -import {PendingAddress, PendingUint192} from "contracts/lib/PendingLib.sol"; -import "contracts/storage/TermMaxStorage.sol"; - -abstract contract VaultBaseTest is ForkBaseTest { - struct VaultTestRes { - uint256 blockNumber; - uint256 orderInitialAmount; - MarketInitialParams marketInitialParams; - OrderConfig orderConfig; - TermMaxMarket market; - IMintableERC20 ft; - IMintableERC20 xt; - IGearingToken gt; - IERC20Metadata collateral; - IERC20Metadata debtToken; - IOracle oracle; - MockPriceFeed collateralPriceFeed; - MockPriceFeed debtPriceFeed; - ITermMaxOrder order; - ITermMaxVault vault; - VaultInitialParams vaultInitialParams; - uint256 currentTime; - uint256 maxCapacity; - address maker; - } - - function _initializeVaultTestRes(string memory key) internal returns (VaultTestRes memory) { - VaultTestRes memory res; - res.blockNumber = _readBlockNumber(key); - res.orderInitialAmount = vm.parseJsonUint(jsonData, string.concat(key, ".orderInitialAmount")); - res.marketInitialParams = _readMarketInitialParams(key); - res.orderConfig = _readOrderConfig(key); - res.maker = vm.randomAddress(); - - vm.rollFork(res.blockNumber); - res.currentTime = block.timestamp; - - _generateVaultInitialParams(res); - - vm.startPrank(res.marketInitialParams.admin); - - res.oracle = deployOracleAggregator(res.marketInitialParams.admin); - res.collateralPriceFeed = deployMockPriceFeed(res.marketInitialParams.admin); - res.debtPriceFeed = deployMockPriceFeed(res.marketInitialParams.admin); - res.oracle.submitPendingOracle( - address(res.marketInitialParams.collateral), - IOracle.Oracle(res.collateralPriceFeed, res.collateralPriceFeed, 365 days, 365 days, 0) - ); - res.oracle.submitPendingOracle( - address(res.marketInitialParams.debtToken), - IOracle.Oracle(res.debtPriceFeed, res.debtPriceFeed, 365 days, 365 days, 0) - ); - res.oracle.acceptPendingOracle(address(res.marketInitialParams.collateral)); - res.oracle.acceptPendingOracle(address(res.marketInitialParams.debtToken)); - - res.marketInitialParams.marketConfig.maturity += uint64(block.timestamp); - res.marketInitialParams.loanConfig.oracle = res.oracle; - - res.market = TermMaxMarket( - deployFactoryWithMockOrder(res.marketInitialParams.admin).createMarket( - keccak256("GearingTokenWithERC20"), res.marketInitialParams, 0 - ) - ); - - (res.ft, res.xt, res.gt,,) = res.market.tokens(); - res.debtToken = res.marketInitialParams.debtToken; - res.collateral = IERC20Metadata(res.marketInitialParams.collateral); - - // set all price as 1 USD = 1e8 tokens - uint8 debtDecimals = res.debtToken.decimals(); - _setPriceFeedInTokenDecimal8( - res.debtPriceFeed, debtDecimals, MockPriceFeed.RoundData(1, 1e8, block.timestamp, block.timestamp, 0) - ); - uint8 collateralDecimals = res.collateral.decimals(); - _setPriceFeedInTokenDecimal8( - res.collateralPriceFeed, - collateralDecimals, - MockPriceFeed.RoundData(1, 1e8, block.timestamp, block.timestamp, 0) - ); - - res.vault = ITermMaxVault(deployVaultFactory().createVault(res.vaultInitialParams, 0)); - - res.vault.submitMarket(address(res.market), true); - vm.warp(res.currentTime + res.vaultInitialParams.timelock + 1); - res.vault.acceptMarket(address(res.market)); - - vm.warp(res.currentTime); - - res.orderInitialAmount = vm.parseJsonUint(jsonData, string.concat(key, ".orderInitialAmount")); - deal(address(res.debtToken), res.marketInitialParams.admin, res.orderInitialAmount); - - res.debtToken.approve(address(res.vault), res.orderInitialAmount); - res.vault.deposit(res.orderInitialAmount, res.marketInitialParams.admin); - - res.order = res.vault.createOrder( - res.market, res.vaultInitialParams.maxCapacity, res.orderInitialAmount, res.orderConfig.curveCuts - ); - - vm.stopPrank(); - - return res; - } - - function _generateVaultInitialParams(VaultTestRes memory res) internal { - res.vaultInitialParams.admin = res.marketInitialParams.admin; - res.vaultInitialParams.curator = vm.randomAddress(); - res.vaultInitialParams.timelock = 1 days; - res.vaultInitialParams.asset = res.marketInitialParams.debtToken; - res.vaultInitialParams.maxCapacity = type(uint128).max; - res.vaultInitialParams.name = string.concat("Vault-", res.marketInitialParams.tokenName); - res.vaultInitialParams.symbol = res.vaultInitialParams.name; - res.vaultInitialParams.performanceFeeRate = 0.1e8; - } - - function _testDeposit(VaultTestRes memory res) internal { - _buyXt(res, 48.219178e8, uint128(res.orderInitialAmount / 100)); - vm.warp(res.currentTime + 2 days); - address lper2 = vm.randomAddress(); - uint256 amount2 = 20000e8; - deal(lper2, 1e18); - deal(address(res.debtToken), lper2, amount2); - vm.startPrank(lper2); - res.debtToken.approve(address(res.vault), amount2); - uint256 share = res.vault.previewDeposit(amount2); - res.vault.deposit(amount2, lper2); - assertEq(res.vault.balanceOf(lper2), share); - - vm.stopPrank(); - } - - function _testRedeem(VaultTestRes memory res) internal { - vm.warp(res.currentTime + 2 days); - _buyXt(res, 48.219178e8, uint128(res.orderInitialAmount / 100)); - vm.warp(res.currentTime + 4 days); - address lper2 = vm.randomAddress(); - uint256 amount2 = 10000e8; - deal(lper2, 1e18); - deal(address(res.debtToken), lper2, amount2); - vm.startPrank(lper2); - res.debtToken.approve(address(res.vault), amount2); - res.vault.deposit(amount2, lper2); - vm.stopPrank(); - - address admin = res.marketInitialParams.admin; - vm.startPrank(admin); - uint256 share = res.vault.balanceOf(admin); - uint256 redeem = res.vault.previewRedeem(share); - assertEq(redeem, res.vault.redeem(share, admin, admin)); - assertGt(redeem, amount2); - vm.stopPrank(); - } - - function _testBadDebt(VaultTestRes memory res) internal { - vm.warp(res.currentTime + 2 days); - _buyXt(res, 48.219178e8, uint128(res.orderInitialAmount / 100)); - - vm.warp(res.currentTime + 3 days); - address lper2 = vm.randomAddress(); - deal(lper2, 1e18); - uint256 amount2 = 100e8; - deal(address(res.debtToken), lper2, amount2); - vm.startPrank(lper2); - res.debtToken.approve(address(res.vault), amount2); - res.vault.deposit(amount2, lper2); - vm.stopPrank(); - - address borrower = vm.randomAddress(); - vm.startPrank(borrower); - deal(borrower, 1e18); - uint256 collateralAmt = 1e18; - deal(address(res.collateral), borrower, collateralAmt); - res.collateral.approve(address(res.gt), collateralAmt); - res.market.issueFt(borrower, uint128(res.orderInitialAmount / 10), abi.encode(collateralAmt)); - vm.stopPrank(); - - vm.warp(res.currentTime + 92 days); - - uint256 propotion = (res.ft.balanceOf(address(res.order)) * Constants.DECIMAL_BASE_SQ) - / (res.ft.totalSupply() - res.ft.balanceOf(address(res.market))); - - uint256 tokenOut = (res.debtToken.balanceOf(address(res.market)) * propotion) / Constants.DECIMAL_BASE_SQ; - uint256 badDebt = res.ft.balanceOf(address(res.order)) - tokenOut; - uint256 delivered = (propotion * 1e18) / Constants.DECIMAL_BASE_SQ; - - vm.startPrank(lper2); - res.vault.redeem(10e8, lper2, lper2); - vm.stopPrank(); - - assertEq(res.vault.badDebtMapping(address(res.collateral)), badDebt); - assertEq(res.collateral.balanceOf(address(res.vault)), delivered); - - uint256 shareToDealBadDebt = res.vault.balanceOf(lper2); - uint256 withdrawAmt = res.vault.previewRedeem(shareToDealBadDebt); - if (withdrawAmt > badDebt) { - withdrawAmt = badDebt; - } - - vm.startPrank(lper2); - (uint256 shares, uint256 collateralOut) = - res.vault.dealBadDebt(address(res.collateral), withdrawAmt, lper2, lper2); - assertEq(shares, shareToDealBadDebt); - assertEq(collateralOut, (withdrawAmt * delivered) / badDebt); - assertEq(res.vault.badDebtMapping(address(res.collateral)), badDebt - withdrawAmt); - assertEq(res.collateral.balanceOf(address(res.vault)), delivered - collateralOut); - vm.stopPrank(); - } - - function _buyXt(VaultTestRes memory res, uint128 tokenAmtIn, uint128 xtAmtOut) internal { - address taker = vm.randomAddress(); - deal(taker, 1e18); - deal(address(res.debtToken), taker, tokenAmtIn); - vm.startPrank(taker); - res.debtToken.approve(address(res.order), tokenAmtIn); - res.order.swapExactTokenToToken(res.debtToken, res.xt, taker, tokenAmtIn, xtAmtOut, block.timestamp + 1 hours); - vm.stopPrank(); - } -} diff --git a/test/mainnet-fork/mainnet/ForkGt.t.sol b/test/mainnet-fork/mainnet/ForkGt.t.sol deleted file mode 100644 index 9d4bf06..0000000 --- a/test/mainnet-fork/mainnet/ForkGt.t.sol +++ /dev/null @@ -1,154 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import "../GtBaseTest.t.sol"; - -contract ForkGt is GtBaseTest { - string MAINNET_RPC_URL = vm.envString("MAINNET_RPC_URL"); - string DATA_PATH = string.concat(vm.projectRoot(), "/test/testdata/fork/mainnet.json"); - - function _getForkRpcUrl() internal view override returns (string memory) { - return MAINNET_RPC_URL; - } - - function _getDataPath() internal view override returns (string memory) { - return DATA_PATH; - } - - function _finishSetup() internal override {} - - function testBorrow() public { - for (uint256 i = 0; i < tokenPairs.length; i++) { - string memory tokenPair = tokenPairs[i]; - GtTestRes memory res = _initializeGtTestRes(tokenPair); - uint256 collateralAmt = res.orderInitialAmount / 10; - uint128 borrowAmt = uint128(res.orderInitialAmount / 30); - uint128 maxDebtAmt = uint128(res.orderInitialAmount / 20); - _testBorrow(res, collateralAmt, borrowAmt, maxDebtAmt); - } - } - - function testLeverageFromXt() public { - for (uint256 i = 0; i < tokenPairs.length; i++) { - string memory tokenPair = tokenPairs[i]; - GtTestRes memory res = _initializeGtTestRes(tokenPair); - if (res.swapData.tokenType == TokenType.General) { - res.swapData.leverageUnits[0].adapter = res.swapAdapters.odosAdapter; - } else if (res.swapData.tokenType == TokenType.Pendle) { - if (res.swapData.leverageUnits.length == 1) { - res.swapData.leverageUnits[0].adapter = res.swapAdapters.pendleAdapter; - } else { - res.swapData.leverageUnits[1].adapter = res.swapAdapters.pendleAdapter; - res.swapData.leverageUnits[0].adapter = res.swapAdapters.odosAdapter; - } - } else if (res.swapData.tokenType == TokenType.Morpho) { - if (res.swapData.leverageUnits.length == 1) { - res.swapData.leverageUnits[0].adapter = res.swapAdapters.vaultAdapter; - } else { - res.swapData.leverageUnits[1].adapter = res.swapAdapters.vaultAdapter; - res.swapData.leverageUnits[0].adapter = res.swapAdapters.odosAdapter; - } - } - - address taker = vm.randomAddress(); - - _testLeverageFromXt(res, taker, res.swapData.debtAmt, res.swapData.swapAmtIn, res.swapData.leverageUnits); - } - } - - function testFlashRepay() public { - for (uint256 i = 0; i < tokenPairs.length; i++) { - string memory tokenPair = tokenPairs[i]; - GtTestRes memory res = _initializeGtTestRes(tokenPair); - if (res.swapData.tokenType == TokenType.General) { - res.swapData.leverageUnits[0].adapter = res.swapAdapters.odosAdapter; - res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.odosAdapter; - } else if (res.swapData.tokenType == TokenType.Pendle) { - if (res.swapData.leverageUnits.length == 1) { - res.swapData.leverageUnits[0].adapter = res.swapAdapters.pendleAdapter; - res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.pendleAdapter; - } else { - res.swapData.leverageUnits[1].adapter = res.swapAdapters.pendleAdapter; - res.swapData.leverageUnits[0].adapter = res.swapAdapters.odosAdapter; - - res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.pendleAdapter; - res.swapData.flashRepayUnits[1].adapter = res.swapAdapters.odosAdapter; - } - } else if (res.swapData.tokenType == TokenType.Morpho) { - if (res.swapData.leverageUnits.length == 1) { - res.swapData.leverageUnits[0].adapter = res.swapAdapters.vaultAdapter; - res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.vaultAdapter; - } else { - res.swapData.leverageUnits[1].adapter = res.swapAdapters.vaultAdapter; - res.swapData.leverageUnits[0].adapter = res.swapAdapters.odosAdapter; - - res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.vaultAdapter; - res.swapData.flashRepayUnits[1].adapter = res.swapAdapters.odosAdapter; - } - } - - address taker = vm.randomAddress(); - uint256 gtId = _testLeverageFromXt( - res, taker, res.swapData.debtAmt, res.swapData.swapAmtIn, res.swapData.leverageUnits - ); - _testFlashRepay(res, gtId, taker, res.swapData.flashRepayUnits); - } - } - - function testFlashRepayByFt() public { - for (uint256 i = 0; i < tokenPairs.length; i++) { - string memory tokenPair = tokenPairs[i]; - GtTestRes memory res = _initializeGtTestRes(tokenPair); - if (res.swapData.tokenType == TokenType.General) { - res.swapData.leverageUnits[0].adapter = res.swapAdapters.odosAdapter; - res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.odosAdapter; - } else if (res.swapData.tokenType == TokenType.Pendle) { - if (res.swapData.leverageUnits.length == 1) { - res.swapData.leverageUnits[0].adapter = res.swapAdapters.pendleAdapter; - res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.pendleAdapter; - } else { - res.swapData.leverageUnits[1].adapter = res.swapAdapters.pendleAdapter; - res.swapData.leverageUnits[0].adapter = res.swapAdapters.odosAdapter; - - res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.pendleAdapter; - res.swapData.flashRepayUnits[1].adapter = res.swapAdapters.odosAdapter; - } - } else if (res.swapData.tokenType == TokenType.Morpho) { - if (res.swapData.leverageUnits.length == 1) { - res.swapData.leverageUnits[0].adapter = res.swapAdapters.vaultAdapter; - res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.vaultAdapter; - } else { - res.swapData.leverageUnits[1].adapter = res.swapAdapters.vaultAdapter; - res.swapData.leverageUnits[0].adapter = res.swapAdapters.odosAdapter; - - res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.vaultAdapter; - res.swapData.flashRepayUnits[1].adapter = res.swapAdapters.odosAdapter; - } - } - - address taker = vm.randomAddress(); - uint256 gtId = _testLeverageFromXt( - res, taker, res.swapData.debtAmt, res.swapData.swapAmtIn, res.swapData.leverageUnits - ); - _testFlashRepayByFt(res, gtId, taker, res.swapData.flashRepayUnits); - } - } - - function testLiquidate() public { - for (uint256 i = 0; i < tokenPairs.length; i++) { - string memory tokenPair = tokenPairs[i]; - GtTestRes memory res = _initializeGtTestRes(tokenPair); - - address liquidator = vm.randomAddress(); - address borrower = vm.randomAddress(); - - uint256 collateralAmt = res.orderInitialAmount / 10; - uint128 borrowAmt = uint128(res.orderInitialAmount / 20); - - uint256 gtId = _fastLoan(res, borrower, borrowAmt, collateralAmt); - _updateCollateralPrice(res, 0.5e8); - - _testLiquidate(res, liquidator, gtId); - } - } -} diff --git a/test/mainnet-fork/mainnet/ForkMarket.t.sol b/test/mainnet-fork/mainnet/ForkMarket.t.sol deleted file mode 100644 index d24d1fb..0000000 --- a/test/mainnet-fork/mainnet/ForkMarket.t.sol +++ /dev/null @@ -1,45 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import "../MarketBaseTest.t.sol"; - -contract ForkMarket is MarketBaseTest { - string MAINNET_RPC_URL = vm.envString("MAINNET_RPC_URL"); - string DATA_PATH = string.concat(vm.projectRoot(), "/test/testdata/fork/mainnet.json"); - - function _getForkRpcUrl() internal view override returns (string memory) { - return MAINNET_RPC_URL; - } - - function _getDataPath() internal view override returns (string memory) { - return DATA_PATH; - } - - function _finishSetup() internal override {} - - function testMint() public { - for (uint256 i = 0; i < tokenPairs.length; i++) { - string memory tokenPair = tokenPairs[i]; - MarketTestRes memory res = _initializeMarketTestRes(tokenPair); - _testMint(res); - } - } - - function testRedeem() public { - for (uint256 i = 0; i < tokenPairs.length; i++) { - string memory tokenPair = tokenPairs[i]; - MarketTestRes memory res = _initializeMarketTestRes(tokenPair); - _testRedeem(res); - } - } - - function testIssueFtByGtWhenSwap() public { - for (uint256 i = 0; i < tokenPairs.length; i++) { - string memory tokenPair = tokenPairs[i]; - MarketTestRes memory res = _initializeMarketTestRes(tokenPair); - uint256 collateralAmt = res.orderInitialAmount / 10; - uint128 debtAmt = uint128(res.orderInitialAmount / 100); - _testIssueFtByGtWhenSwap(res, collateralAmt, debtAmt); - } - } -} diff --git a/test/mainnet-fork/mainnet/ForkPriceFeed.t.sol b/test/mainnet-fork/mainnet/ForkPriceFeed.t.sol deleted file mode 100644 index 7a40ac2..0000000 --- a/test/mainnet-fork/mainnet/ForkPriceFeed.t.sol +++ /dev/null @@ -1,134 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; -import "../ForkBaseTest.sol"; -import {TermMaxPriceFeedFactory} from "contracts/factory/TermMaxPriceFeedFactory.sol"; - -contract ForkPriceFeed is ForkBaseTest { - string MAINNET_RPC_URL = vm.envString("MAINNET_RPC_URL"); - string DATA_PATH = string.concat(vm.projectRoot(), "/test/testdata/fork/mainnet.json"); - - function _getForkRpcUrl() internal view override returns (string memory) { - return MAINNET_RPC_URL; - } - - function _getDataPath() internal view override returns (string memory) { - return DATA_PATH; - } - - function _finishSetup() internal override {} - - function testPriceFeed() public { - TermMaxPriceFeedFactory priceFeedFactory = new TermMaxPriceFeedFactory(); - address pendlePYLpOracle = 0x9a9Fa8338dd5E5B2188006f1Cd2Ef26d921650C2; - address pufferEthOracle; - { - address pufferEthToEth = 0x76A495b0bFfb53ef3F0E94ef0763e03cE410835C; - address ethToUsd = 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419; - address pufEth = 0xD9A442856C234a39a81a089C06451EBAa4306a72; - AggregatorV3Interface pufferEthFeed = - AggregatorV3Interface(priceFeedFactory.createPriceFeedConverter(pufferEthToEth, ethToUsd, pufEth)); - (, int256 answer,,,) = pufferEthFeed.latestRoundData(); - console.log("pufferEth price feed description", pufferEthFeed.description()); - console.log("pufferEth price feed address", address(pufferEthFeed)); - console.log("pufferEth last answer", answer); - pufferEthOracle = address(pufferEthFeed); - } - - { - address pt_market = 0xB162B764044697cf03617C2EFbcB1f42e31E4766; - address susdeToUsd = 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099; - - AggregatorV3Interface ptFeed = AggregatorV3Interface( - priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, pt_market, 900, susdeToUsd) - ); - (, int256 answer,,,) = ptFeed.latestRoundData(); - console.log("pt_sUsde_29MAY2025 price feed description", ptFeed.description()); - console.log("pt_sUsde_29MAY2025 price feed address", address(ptFeed)); - console.log("pt_sUsde_29MAY2025 last answer", answer); - } - - { - address USUALUSDCPlusVault = 0xd63070114470f685b75B74D60EEc7c1113d33a3D; - address usdcToUsd = 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6; - AggregatorV3Interface usdcPlusFeed = - AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usdcToUsd, USUALUSDCPlusVault)); - (, int256 answer,,,) = usdcPlusFeed.latestRoundData(); - console.log("USUALUSDC+ price feed description", usdcPlusFeed.description()); - console.log("USUALUSDC+ price feed address", address(usdcPlusFeed)); - console.log("USUALUSDC+ last answer", answer); - } - - { - address MCwETHVault = 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8; - address wethToUsd = 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419; - AggregatorV3Interface wethFeed = - AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(wethToUsd, MCwETHVault)); - (, int256 answer,,,) = wethFeed.latestRoundData(); - console.log("MCwETH price feed description", wethFeed.description()); - console.log("MCwETH price feed address", address(wethFeed)); - console.log("MCwETH last answer", answer); - } - - { - address PT_pufETH_26JUN2025_market = 0x58612beB0e8a126735b19BB222cbC7fC2C162D2a; - AggregatorV3Interface ptFeed = AggregatorV3Interface( - priceFeedFactory.createPTWithPriceFeed( - pendlePYLpOracle, PT_pufETH_26JUN2025_market, 900, pufferEthOracle - ) - ); - (, int256 answer,,,) = ptFeed.latestRoundData(); - console.log("pt_pufETH_26JUN2025 price feed description", ptFeed.description()); - console.log("pt_pufETH_26JUN2025 price feed address", address(ptFeed)); - console.log("pt_pufETH_26JUN2025 last answer", answer); - } - - { - address eUSDeVault = 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F; - address usdeToUsd = 0xa569d910839Ae8865Da8F8e70FfFb0cBA869F961; - AggregatorV3Interface usdeFeed = - AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usdeToUsd, eUSDeVault)); - (, int256 answer,,,) = usdeFeed.latestRoundData(); - console.log("eUSDe price feed description", usdeFeed.description()); - console.log("eUSDe price feed address", address(usdeFeed)); - console.log("eUSDe last answer", answer); - } - - { - address PT_USD0PlusPlus_26JUN2025_market = 0x048680F64d6DFf1748ba6D9a01F578433787e24B; - address usd0PlusPlusToUsd = 0xFC9e30Cf89f8A00dba3D34edf8b65BCDAdeCC1cB; - AggregatorV3Interface usd0PlusPlusFeed = AggregatorV3Interface( - priceFeedFactory.createPTWithPriceFeed( - pendlePYLpOracle, PT_USD0PlusPlus_26JUN2025_market, 900, usd0PlusPlusToUsd - ) - ); - (, int256 answer,,,) = usd0PlusPlusFeed.latestRoundData(); - console.log("PT_USD0PlusPlus_26JUN2025_market price feed description", usd0PlusPlusFeed.description()); - console.log("PT_USD0PlusPlus_26JUN2025_market price feed address", address(usd0PlusPlusFeed)); - console.log("PT_USD0PlusPlus_26JUN2025_market last answer", answer); - } - - { - address upUSDCVault = 0x80E1048eDE66ec4c364b4F22C8768fc657FF6A42; - address usdcToUsd = 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6; - AggregatorV3Interface usdcFeed = - AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usdcToUsd, upUSDCVault)); - (, int256 answer,,,) = usdcFeed.latestRoundData(); - console.log("upUSDC price feed description", usdcFeed.description()); - console.log("upUSDC price feed address", address(usdcFeed)); - console.log("upUSDC last answer", answer); - } - - { - address usualxVault = 0x06B964d96f5dCF7Eae9d7C559B09EDCe244d4B8E; - address usualToUsd = 0x2240AE461B34CC56D654ba5FA5830A243Ca54840; - AggregatorV3Interface usualFeed = - AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usualToUsd, usualxVault)); - (, int256 answer,,,) = usualFeed.latestRoundData(); - console.log("usualx price feed description", usualFeed.description()); - console.log("usualx price feed address", address(usualFeed)); - console.log("usualx last answer", answer); - } - } -} diff --git a/test/mainnet-fork/mainnet/ForkVault.t.sol b/test/mainnet-fork/mainnet/ForkVault.t.sol deleted file mode 100644 index 0f073dd..0000000 --- a/test/mainnet-fork/mainnet/ForkVault.t.sol +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import "../VaultBaseTest.t.sol"; - -contract ForkVault is VaultBaseTest { - string MAINNET_RPC_URL = vm.envString("MAINNET_RPC_URL"); - string DATA_PATH = string.concat(vm.projectRoot(), "/test/testdata/fork/mainnet.json"); - - function _getForkRpcUrl() internal view override returns (string memory) { - return MAINNET_RPC_URL; - } - - function _getDataPath() internal view override returns (string memory) { - return DATA_PATH; - } - - function _finishSetup() internal override {} - - function testDeposit() public { - for (uint256 i = 0; i < tokenPairs.length; i++) { - string memory tokenPair = tokenPairs[i]; - VaultTestRes memory res = _initializeVaultTestRes(tokenPair); - _testDeposit(res); - } - } - - function testRedeem() public { - for (uint256 i = 0; i < tokenPairs.length; i++) { - string memory tokenPair = tokenPairs[i]; - VaultTestRes memory res = _initializeVaultTestRes(tokenPair); - _testRedeem(res); - } - } - - function testBadDebt() public { - for (uint256 i = 0; i < tokenPairs.length; i++) { - string memory tokenPair = tokenPairs[i]; - VaultTestRes memory res = _initializeVaultTestRes(tokenPair); - _testBadDebt(res); - } - } -} diff --git a/test/utils/DeployUtils.sol b/test/utils/DeployUtils.sol deleted file mode 100644 index ffdbfb4..0000000 --- a/test/utils/DeployUtils.sol +++ /dev/null @@ -1,314 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {console} from "forge-std/Script.sol"; -import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; - -import {ITermMaxMarket, TermMaxMarket} from "contracts/TermMaxMarket.sol"; -import {ITermMaxOrder, ISwapCallback, TermMaxOrder} from "contracts/TermMaxOrder.sol"; -import {MockERC20, ERC20} from "contracts/test/MockERC20.sol"; -import {MockPriceFeed} from "contracts/test/MockPriceFeed.sol"; -import {IMintableERC20, MintableERC20} from "contracts/tokens/MintableERC20.sol"; -import {IGearingToken} from "contracts/tokens/IGearingToken.sol"; -import {ITermMaxFactory, TermMaxFactory} from "contracts/factory/TermMaxFactory.sol"; -import {TermMaxRouter} from "contracts/router/TermMaxRouter.sol"; -import {IOracle, OracleAggregator, AggregatorV3Interface} from "contracts/oracle/OracleAggregator.sol"; -import {MockOrder} from "contracts/test/MockOrder.sol"; -import {VaultFactory, IVaultFactory} from "contracts/factory/VaultFactory.sol"; -import {OrderManager} from "contracts/vault/OrderManager.sol"; -import {TermMaxVault, ITermMaxVault} from "contracts/vault/TermMaxVault.sol"; -import {AccessManager} from "contracts/access/AccessManager.sol"; -import "contracts/storage/TermMaxStorage.sol"; - -library DeployUtils { - bytes32 constant GT_ERC20 = keccak256("GearingTokenWithERC20"); - - struct SwapRange { - uint256 buyFtMax; - uint256 buyXtMax; - uint256 sellFtMax; - uint256 sellXtMax; - uint256 buyExactFtMax; - uint256 buyExactXtMax; - uint256 sellFtForExactTokenMax; - uint256 sellXtForExactTokenMax; - } - - struct Res { - ITermMaxVault vault; - IVaultFactory vaultFactory; - TermMaxFactory factory; - ITermMaxOrder order; - TermMaxRouter router; - MarketConfig marketConfig; - OrderConfig orderConfig; - ITermMaxMarket market; - IMintableERC20 ft; - IMintableERC20 xt; - IGearingToken gt; - MockPriceFeed debtOracle; - MockPriceFeed collateralOracle; - OracleAggregator oracle; - MockERC20 collateral; - MockERC20 debt; - SwapRange swapRange; - } - - function deployMarket(address admin, MarketConfig memory marketConfig, uint32 maxLtv, uint32 liquidationLtv) - internal - returns (Res memory res) - { - res.factory = deployFactory(admin); - - res.collateral = new MockERC20("ETH", "ETH", 18); - res.debt = new MockERC20("DAI", "DAI", 8); - - res.debtOracle = new MockPriceFeed(admin); - res.collateralOracle = new MockPriceFeed(admin); - res.oracle = deployOracle(admin, 0); - - res.oracle.submitPendingOracle( - address(res.debt), IOracle.Oracle(res.debtOracle, res.debtOracle, 0, 365 days, 0) - ); - res.oracle.submitPendingOracle( - address(res.collateral), IOracle.Oracle(res.collateralOracle, res.collateralOracle, 0, 365 days, 0) - ); - - res.oracle.acceptPendingOracle(address(res.debt)); - res.oracle.acceptPendingOracle(address(res.collateral)); - - MockPriceFeed.RoundData memory roundData = MockPriceFeed.RoundData({ - roundId: 1, - answer: int256(1e1 ** res.collateralOracle.decimals()), - startedAt: 0, - updatedAt: 0, - answeredInRound: 0 - }); - res.collateralOracle.updateRoundData(roundData); - - MarketInitialParams memory initialParams = MarketInitialParams({ - collateral: address(res.collateral), - debtToken: res.debt, - admin: admin, - gtImplementation: address(0), - marketConfig: marketConfig, - loanConfig: LoanConfig({oracle: res.oracle, liquidationLtv: liquidationLtv, maxLtv: maxLtv, liquidatable: true}), - gtInitalParams: abi.encode(type(uint256).max), - tokenName: "DAI-ETH", - tokenSymbol: "DAI-ETH" - }); - - res.marketConfig = marketConfig; - res.market = ITermMaxMarket(res.factory.createMarket(GT_ERC20, initialParams, 0)); - - (res.ft, res.xt, res.gt,,) = res.market.tokens(); - } - - function deployMarket( - address admin, - MarketConfig memory marketConfig, - uint32 maxLtv, - uint32 liquidationLtv, - address collateral, - address debt - ) internal returns (Res memory res) { - res.factory = deployFactory(admin); - - res.collateral = MockERC20(collateral); - res.debt = MockERC20(debt); - - res.debtOracle = new MockPriceFeed(admin); - res.collateralOracle = new MockPriceFeed(admin); - res.oracle = deployOracle(admin, 0); - - res.oracle.submitPendingOracle( - address(res.debt), IOracle.Oracle(res.debtOracle, res.debtOracle, 0, 365 days, 0) - ); - res.oracle.submitPendingOracle( - address(res.collateral), IOracle.Oracle(res.collateralOracle, res.collateralOracle, 0, 365 days, 0) - ); - res.oracle.acceptPendingOracle(address(res.debt)); - res.oracle.acceptPendingOracle(address(res.collateral)); - - MockPriceFeed.RoundData memory roundData = MockPriceFeed.RoundData({ - roundId: 1, - answer: int256(1e1 ** res.collateralOracle.decimals()), - startedAt: 0, - updatedAt: 0, - answeredInRound: 0 - }); - res.collateralOracle.updateRoundData(roundData); - - MarketInitialParams memory initialParams = MarketInitialParams({ - collateral: address(res.collateral), - debtToken: res.debt, - admin: admin, - gtImplementation: address(0), - marketConfig: marketConfig, - loanConfig: LoanConfig({oracle: res.oracle, liquidationLtv: liquidationLtv, maxLtv: maxLtv, liquidatable: true}), - gtInitalParams: abi.encode(type(uint256).max), - tokenName: "DAI-ETH", - tokenSymbol: "DAI-ETH" - }); - - res.marketConfig = marketConfig; - res.market = ITermMaxMarket(res.factory.createMarket(GT_ERC20, initialParams, 0)); - - (res.ft, res.xt, res.gt,,) = res.market.tokens(); - } - - function deployMockMarket2( - address admin, - IERC20 debt, - uint256 duration, - MarketConfig memory mc, - uint32 maxLtv, - uint32 liquidationLtv - ) internal returns (Res memory res) { - res.factory = deployFactoryWithMockOrder(admin); - res.debt = MockERC20(address(debt)); - MarketConfig memory marketConfig = mc; - marketConfig.maturity += uint64(duration * 1 days); - - res.collateral = new MockERC20("ETH", "ETH", 18); - - res.debtOracle = new MockPriceFeed(admin); - res.collateralOracle = new MockPriceFeed(admin); - res.oracle = deployOracle(admin, 0); - - res.oracle.submitPendingOracle( - address(res.debt), IOracle.Oracle(res.debtOracle, res.debtOracle, 0, 365 days, 0) - ); - res.oracle.submitPendingOracle( - address(res.collateral), IOracle.Oracle(res.collateralOracle, res.collateralOracle, 0, 365 days, 0) - ); - res.oracle.acceptPendingOracle(address(res.debt)); - res.oracle.acceptPendingOracle(address(res.collateral)); - - MockPriceFeed.RoundData memory roundData = MockPriceFeed.RoundData({ - roundId: 1, - answer: int256(1e1 ** res.collateralOracle.decimals()), - startedAt: 0, - updatedAt: 0, - answeredInRound: 0 - }); - res.collateralOracle.updateRoundData(roundData); - - MarketInitialParams memory initialParams = MarketInitialParams({ - collateral: address(res.collateral), - debtToken: res.debt, - admin: admin, - gtImplementation: address(0), - marketConfig: marketConfig, - loanConfig: LoanConfig({oracle: res.oracle, liquidationLtv: liquidationLtv, maxLtv: maxLtv, liquidatable: true}), - gtInitalParams: abi.encode(type(uint256).max), - tokenName: "DAI-ETH", - tokenSymbol: "DAI-ETH" - }); - - res.marketConfig = marketConfig; - res.market = ITermMaxMarket(res.factory.createMarket(GT_ERC20, initialParams, 0)); - - (res.ft, res.xt, res.gt,,) = res.market.tokens(); - } - - function deployMockMarket(address admin, MarketConfig memory marketConfig, uint32 maxLtv, uint32 liquidationLtv) - internal - returns (Res memory res) - { - res.factory = deployFactoryWithMockOrder(admin); - - res.collateral = new MockERC20("ETH", "ETH", 18); - res.debt = new MockERC20("DAI", "DAI", 8); - - res.debtOracle = new MockPriceFeed(admin); - res.collateralOracle = new MockPriceFeed(admin); - res.oracle = deployOracle(admin, 0); - - res.oracle.submitPendingOracle( - address(res.debt), IOracle.Oracle(res.debtOracle, res.debtOracle, 0, 365 days, 0) - ); - res.oracle.submitPendingOracle( - address(res.collateral), IOracle.Oracle(res.collateralOracle, res.collateralOracle, 0, 365 days, 0) - ); - res.oracle.acceptPendingOracle(address(res.debt)); - res.oracle.acceptPendingOracle(address(res.collateral)); - - MockPriceFeed.RoundData memory roundData = MockPriceFeed.RoundData({ - roundId: 1, - answer: int256(1e1 ** res.collateralOracle.decimals()), - startedAt: 0, - updatedAt: 0, - answeredInRound: 0 - }); - res.collateralOracle.updateRoundData(roundData); - - MarketInitialParams memory initialParams = MarketInitialParams({ - collateral: address(res.collateral), - debtToken: res.debt, - admin: admin, - gtImplementation: address(0), - marketConfig: marketConfig, - loanConfig: LoanConfig({oracle: res.oracle, liquidationLtv: liquidationLtv, maxLtv: maxLtv, liquidatable: true}), - gtInitalParams: abi.encode(type(uint256).max), - tokenName: "DAI-ETH", - tokenSymbol: "DAI-ETH" - }); - - res.marketConfig = marketConfig; - res.market = ITermMaxMarket(res.factory.createMarket(GT_ERC20, initialParams, 0)); - - (res.ft, res.xt, res.gt,,) = res.market.tokens(); - } - - function deployOrder( - ITermMaxMarket market, - address maker, - uint256 maxXtReserve, - ISwapCallback swapTrigger, - CurveCuts memory curveCuts - ) public returns (ITermMaxOrder order) { - order = market.createOrder(maker, maxXtReserve, swapTrigger, curveCuts); - } - - function deployFactory(address admin) public returns (TermMaxFactory factory) { - address tokenImplementation = address(new MintableERC20()); - address orderImplementation = address(new TermMaxOrder()); - TermMaxMarket m = new TermMaxMarket(tokenImplementation, orderImplementation); - factory = new TermMaxFactory(admin, address(m)); - } - - function deployFactoryWithMockOrder(address admin) public returns (TermMaxFactory factory) { - address tokenImplementation = address(new MintableERC20()); - address orderImplementation = address(new MockOrder()); - TermMaxMarket m = new TermMaxMarket(tokenImplementation, orderImplementation); - factory = new TermMaxFactory(admin, address(m)); - } - - function deployOracle(address admin, uint256 timeLock) public returns (OracleAggregator oracle) { - oracle = new OracleAggregator(admin, timeLock); - } - - function deployRouter(address admin) public returns (TermMaxRouter router) { - TermMaxRouter implementation = new TermMaxRouter(); - bytes memory data = abi.encodeCall(TermMaxRouter.initialize, admin); - ERC1967Proxy proxy = new ERC1967Proxy(address(implementation), data); - router = TermMaxRouter(address(proxy)); - } - - function deployVault(VaultInitialParams memory initialParams) public returns (ITermMaxVault vault) { - OrderManager orderManager = new OrderManager(); - TermMaxVault implementation = new TermMaxVault(address(orderManager)); - VaultFactory vaultFactory = new VaultFactory(address(implementation)); - - vault = ITermMaxVault(vaultFactory.createVault(initialParams, 0)); - } - - function deployAccessManager(address admin) internal returns (AccessManager accessManager) { - AccessManager implementation = new AccessManager(); - bytes memory data = abi.encodeCall(AccessManager.initialize, admin); - ERC1967Proxy proxy = new ERC1967Proxy(address(implementation), data); - accessManager = AccessManager(address(proxy)); - } -} diff --git a/test/utils/JSONLoader.sol b/test/utils/JSONLoader.sol deleted file mode 100644 index a4c704d..0000000 --- a/test/utils/JSONLoader.sol +++ /dev/null @@ -1,113 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import "forge-std/Test.sol"; -import {StateChecker} from "./StateChecker.sol"; -import "contracts/storage/TermMaxStorage.sol"; -import {MockPriceFeed} from "contracts/test/MockPriceFeed.sol"; -import {DeployUtils} from "./DeployUtils.sol"; - -library JSONLoader { - Vm constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); - - function getOrderStateFromJson(string memory testdataJSON, string memory key) - internal - pure - returns (StateChecker.OrderState memory state) - { - state.ftReserve = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".ftReserve"))); - state.xtReserve = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".xtReserve"))); - } - - function getMarketConfigFromJson(address treasurer, string memory testdataJSON, string memory key) - internal - pure - returns (MarketConfig memory marketConfig) - { - marketConfig.treasurer = treasurer; - marketConfig.maturity = uint64(vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".maturity")))); - marketConfig.feeConfig.mintGtFeeRatio = - uint32(vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".mintGtFeeRatio")))); - marketConfig.feeConfig.mintGtFeeRef = - uint32(vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".mintGtFeeRef")))); - marketConfig.feeConfig.lendTakerFeeRatio = - uint32(vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".lendTakerFeeRatio")))); - marketConfig.feeConfig.borrowTakerFeeRatio = - uint32(vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".borrowTakerFeeRatio")))); - marketConfig.feeConfig.lendMakerFeeRatio = - uint32(vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".lendMakerFeeRatio")))); - marketConfig.feeConfig.borrowMakerFeeRatio = - uint32(vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".borrowMakerFeeRatio")))); - } - - function getOrderConfigFromJson(string memory testdataJSON, string memory key) - internal - pure - returns (OrderConfig memory orderConfig) - { - orderConfig.maxXtReserve = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".maxXtReserve"))); - orderConfig.gtId = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".gtId"))); - - { - string memory curveCutsPath = string.concat(key, ".borrowCurveCuts"); - uint256 length = - vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".borrowCurveCuts.length"))); - orderConfig.curveCuts.borrowCurveCuts = new CurveCut[](length); - - for (uint256 i = 0; i < length; i++) { - string memory indexPath = string.concat(curveCutsPath, ".", vm.toString(i)); - orderConfig.curveCuts.borrowCurveCuts[i].xtReserve = - vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(indexPath, ".xtReserve"))); - orderConfig.curveCuts.borrowCurveCuts[i].liqSquare = - vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(indexPath, ".liqSquare"))); - orderConfig.curveCuts.borrowCurveCuts[i].offset = - vm.parseInt(vm.parseJsonString(testdataJSON, string.concat(indexPath, ".offset"))); - } - } - { - string memory curveCutsPath = string.concat(key, ".lendCurveCuts"); - uint256 length = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".lendCurveCuts.length"))); - orderConfig.curveCuts.lendCurveCuts = new CurveCut[](length); - - for (uint256 i = 0; i < length; i++) { - string memory indexPath = string.concat(curveCutsPath, ".", vm.toString(i)); - orderConfig.curveCuts.lendCurveCuts[i].xtReserve = - vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(indexPath, ".xtReserve"))); - orderConfig.curveCuts.lendCurveCuts[i].liqSquare = - vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(indexPath, ".liqSquare"))); - orderConfig.curveCuts.lendCurveCuts[i].offset = - vm.parseInt(vm.parseJsonString(testdataJSON, string.concat(indexPath, ".offset"))); - } - } - } - - function getSwapRangeFromJson(string memory testdataJSON, string memory key) - internal - pure - returns (DeployUtils.SwapRange memory swapRange) - { - swapRange.buyFtMax = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".buyFtMax"))); - swapRange.buyXtMax = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".buyXtMax"))); - swapRange.sellFtMax = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".sellFtMax"))); - swapRange.sellXtMax = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".sellXtMax"))); - swapRange.buyExactFtMax = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".buyExactFtMax"))); - swapRange.buyExactXtMax = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".buyExactXtMax"))); - swapRange.sellFtForExactTokenMax = - vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".sellFtForExactTokenMax"))); - swapRange.sellXtForExactTokenMax = - vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".sellXtForExactTokenMax"))); - } - - function getRoundDataFromJson(string memory testdataJSON, string memory key) - internal - pure - returns (MockPriceFeed.RoundData memory priceData) - { - priceData.roundId = uint80(vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".roundId")))); - priceData.answer = vm.parseInt(vm.parseJsonString(testdataJSON, string.concat(key, ".answer"))); - priceData.startedAt = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".startedAt"))); - priceData.updatedAt = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".updatedAt"))); - priceData.answeredInRound = - uint80(vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".answeredInRound")))); - } -} diff --git a/test/utils/LoanUtils.sol b/test/utils/LoanUtils.sol deleted file mode 100644 index f7578c4..0000000 --- a/test/utils/LoanUtils.sol +++ /dev/null @@ -1,81 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {console} from "forge-std/Script.sol"; -import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; -import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; -import {Constants} from "contracts/lib/Constants.sol"; -import {DeployUtils} from "./DeployUtils.sol"; - -library LoanUtils { - using SafeCast for uint256; - using SafeCast for int256; - - function calcLtv(DeployUtils.Res memory res, uint256 debtAmt, uint256 collateralAmt) - internal - view - returns (uint256 ltv) - { - (, int256 cPrice,,,) = res.collateralOracle.latestRoundData(); - (, int256 uPrice,,,) = res.debtOracle.latestRoundData(); - uint256 cpDecimals = 10 ** res.collateralOracle.decimals(); - uint256 upDecimals = 10 ** res.debtOracle.decimals(); - uint256 cDecimals = 10 ** res.collateral.decimals(); - uint256 uDecimals = 10 ** res.debt.decimals(); - uint256 debtValue = (debtAmt * uPrice.toUint256()) / uDecimals; - uint256 collateralValue = (collateralAmt * cPrice.toUint256()) / (cpDecimals * cDecimals); - if (collateralValue == 0) { - return 2 ** 128 - 1; - } - ltv = (debtValue * Constants.DECIMAL_BASE) / (collateralValue * upDecimals); - } - - function calcLiquidationResult(DeployUtils.Res memory res, uint256 debtAmt, uint256 collateralAmt, uint256 repayAmt) - internal - view - returns (uint256 cToLiquidator, uint256 cToTreasurer, uint256 remainningC) - { - uint256 REWARD_TO_LIQUIDATOR = 0.05e8; - uint256 REWARD_TO_PROTOCOL = 0.05e8; - (, int256 cPrice,,,) = res.collateralOracle.latestRoundData(); - (, int256 uPrice,,,) = res.debtOracle.latestRoundData(); - uint256 cpDecimals = 10 ** res.collateralOracle.decimals(); - uint256 upDecimals = 10 ** res.debtOracle.decimals(); - uint256 cDecimals = 10 ** res.collateral.decimals(); - uint256 uDecimals = 10 ** res.debt.decimals(); - - uint256 udPriceToCdPrice = - (uPrice.toUint256() * cpDecimals * cpDecimals * 10 + cPrice.toUint256() - 1) / (cPrice.toUint256()); - - uint256 cEqualRepayAmt = (repayAmt * udPriceToCdPrice * cDecimals) / (uDecimals * cpDecimals * upDecimals * 10); - - uint256 rewardToLiquidator = (cEqualRepayAmt * REWARD_TO_LIQUIDATOR) / Constants.DECIMAL_BASE; - uint256 rewardToProtocol = (cEqualRepayAmt * REWARD_TO_PROTOCOL) / Constants.DECIMAL_BASE; - - uint256 removedCollateralAmt = cEqualRepayAmt + rewardToLiquidator + rewardToProtocol; - if (removedCollateralAmt > (collateralAmt * repayAmt) / debtAmt) { - removedCollateralAmt = (collateralAmt * repayAmt) / debtAmt; - } - if (cEqualRepayAmt + rewardToLiquidator >= removedCollateralAmt) { - cToLiquidator = removedCollateralAmt; - } else if (cEqualRepayAmt + rewardToLiquidator + rewardToProtocol >= removedCollateralAmt) { - cToLiquidator = cEqualRepayAmt + rewardToLiquidator; - cToTreasurer = removedCollateralAmt - cToLiquidator; - } else { - cToLiquidator = cEqualRepayAmt + rewardToLiquidator; - cToTreasurer = rewardToProtocol; - } - remainningC = collateralAmt - removedCollateralAmt; - } - - function fastMintGt(DeployUtils.Res memory res, address to, uint128 debtAmt, uint256 collateralAmt) - internal - returns (uint256 gtId, uint128 ftOutAmt) - { - res.collateral.mint(to, collateralAmt); - res.collateral.approve(address(res.gt), collateralAmt); - bytes memory collateralData = abi.encode(collateralAmt); - - (gtId, ftOutAmt) = res.market.issueFt(to, debtAmt, collateralData); - } -} diff --git a/test/utils/StateChecker.sol b/test/utils/StateChecker.sol deleted file mode 100644 index df21156..0000000 --- a/test/utils/StateChecker.sol +++ /dev/null @@ -1,51 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {console} from "forge-std/console.sol"; -import {DeployUtils} from "./DeployUtils.sol"; -import "contracts/storage/TermMaxStorage.sol"; - -library StateChecker { - struct MarketState { - uint256 collateralReserve; - uint256 debtReserve; - } - - struct OrderState { - uint256 ftReserve; - uint256 xtReserve; - } - - function checkMarketState(DeployUtils.Res memory res, MarketState memory expect) internal view { - require(res.collateral.balanceOf(address(res.gt)) == expect.collateralReserve, "collateralReserve unexpect"); - require(res.debt.balanceOf(address(res.market)) == expect.debtReserve, "debtReserve unexpect"); - } - - function getMarketState(DeployUtils.Res memory res) internal view returns (MarketState memory state) { - state.collateralReserve = res.collateral.balanceOf(address(res.gt)); - state.debtReserve = res.debt.balanceOf(address(res.market)); - } - - function checkOrderState(DeployUtils.Res memory res, OrderState memory expect) internal view { - address order = address(res.order); - require(res.ft.balanceOf(order) == expect.ftReserve, "ftReserve unexpect"); - require(res.xt.balanceOf(order) == expect.xtReserve, "xtReserve unexpect"); - } - - function getOrderState(DeployUtils.Res memory res) internal view returns (OrderState memory state) { - address order = address(res.order); - state.ftReserve = res.ft.balanceOf(order); - state.xtReserve = res.xt.balanceOf(order); - } - - function getUserBalances(DeployUtils.Res memory res, address user) - internal - view - returns (uint256[6] memory balances) - { - balances[0] = res.ft.balanceOf(user); - balances[1] = res.xt.balanceOf(user); - balances[2] = res.debt.balanceOf(user); - balances[3] = res.collateral.balanceOf(user); - } -} diff --git a/test/utils/SwapUtils.sol b/test/utils/SwapUtils.sol deleted file mode 100644 index 54a2a6b..0000000 --- a/test/utils/SwapUtils.sol +++ /dev/null @@ -1,26 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {console} from "forge-std/Script.sol"; -import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; -import {Constants} from "contracts/lib/Constants.sol"; -import {DeployUtils} from "./DeployUtils.sol"; - -library SwapUtils { - using SafeCast for uint256; - using SafeCast for int256; - - function getPrice(DeployUtils.Res memory res) internal view returns (uint256 pFt, uint256 pXt) { - (uint256 lendApr_, uint256 borrowApr_) = res.order.apr(); - - uint256 dtm = daysToMaturity(res.market.config().maturity); - pFt = Constants.DECIMAL_BASE_SQ / (Constants.DECIMAL_BASE + (lendApr_ * dtm) / Constants.DAYS_IN_YEAR); - uint256 pFtBorrow = - Constants.DECIMAL_BASE_SQ / (Constants.DECIMAL_BASE + (borrowApr_ * dtm) / Constants.DAYS_IN_YEAR); - pXt = Constants.DECIMAL_BASE - pFtBorrow / Constants.DECIMAL_BASE; - } - - function daysToMaturity(uint256 maturity) internal view returns (uint256) { - return (maturity - block.timestamp + Constants.SECONDS_IN_DAY - 1) / Constants.SECONDS_IN_DAY; - } -} diff --git a/test/v2/integration/ForkPrdFlashRepay.t.sol b/test/v2/integration/ForkPrdFlashRepay.t.sol index 7d6d1d8..1aa955b 100644 --- a/test/v2/integration/ForkPrdFlashRepay.t.sol +++ b/test/v2/integration/ForkPrdFlashRepay.t.sol @@ -2,26 +2,28 @@ pragma solidity ^0.8.27; import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; -import {ITermMaxMarket} from "contracts/ITermMaxMarket.sol"; -import {ITermMaxOrder} from "contracts/ITermMaxOrder.sol"; -import {SwapUnit, ITermMaxRouter, TermMaxRouter} from "contracts/router/TermMaxRouter.sol"; +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; +import {ITermMaxMarket} from "contracts/v1/ITermMaxMarket.sol"; +import {ITermMaxOrder} from "contracts/v1/ITermMaxOrder.sol"; +import {SwapUnit, ITermMaxRouter, TermMaxRouter} from "contracts/v1/router/TermMaxRouter.sol"; import { IGearingToken, GearingTokenEvents, AbstractGearingToken, GtConfig -} from "contracts/tokens/AbstractGearingToken.sol"; -import {PendleSwapV3Adapter} from "contracts/router/swapAdapters/PendleSwapV3Adapter.sol"; -import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; -import {IOracle} from "contracts/oracle/IOracleV1.sol"; +} from "contracts/v1/tokens/AbstractGearingToken.sol"; +import {PendleSwapV3AdapterV2} from "contracts/v2/router/swapAdapters/PendleSwapV3AdapterV2.sol"; +import {IOracle} from "contracts/v1/oracle/IOracle.sol"; import { - ForkBaseTest, - TermMaxFactory, + ForkBaseTestV2, + TermMaxFactoryV2, MarketConfig, IERC20, MarketInitialParams, IERC20Metadata -} from "test/mainnet-fork/ForkBaseTest.sol"; +} from "../mainnet-fork/ForkBaseTestV2.sol"; +import {ITermMaxMarketV2} from "contracts/v2/ITermMaxMarketV2.sol"; +import {ITermMaxRouterV2, TermMaxRouterV2} from "contracts/v2/router/TermMaxRouterV2.sol"; import {console} from "forge-std/console.sol"; interface TestOracle is IOracle { @@ -29,7 +31,7 @@ interface TestOracle is IOracle { function oracles(address asset) external returns (address aggregator, address backupAggregator, uint32 heartbeat); } -contract ForkPrdFlashRepay is ForkBaseTest { +contract ForkPrdFlashRepay is ForkBaseTestV2 { string MAINNET_RPC_URL = vm.envString("MAINNET_RPC_URL"); string DATA_PATH = string.concat(vm.projectRoot(), "/test/testdata/fork/mainnet.json"); @@ -48,7 +50,7 @@ contract ForkPrdFlashRepay is ForkBaseTest { ITermMaxOrder o_aug_1 = ITermMaxOrder(0x71Df74d65c3895C8FA5a1c8E8d93A7eE30A1aFc7); address pendleAdapter; address odosAdapter = 0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779; - TermMaxRouter router; + TermMaxRouterV2 router; function _getForkRpcUrl() internal view override returns (string memory) { return MAINNET_RPC_URL; @@ -87,7 +89,7 @@ contract ForkPrdFlashRepay is ForkBaseTest { vm.stopPrank(); - PendleSwapV3Adapter adapter = new PendleSwapV3Adapter(0x888888888889758F76e7103c6CbF23ABbF58F946); + PendleSwapV3AdapterV2 adapter = new PendleSwapV3AdapterV2(0x888888888889758F76e7103c6CbF23ABbF58F946); pendleAdapter = address(adapter); vm.label(pt_susde_may_29, "pt_susde_may_29"); @@ -110,7 +112,6 @@ contract ForkPrdFlashRepay is ForkBaseTest { } function testFlashRepayPtV2() public { - vm.roll(22494579); // 2025-05-15 address borrower = vm.randomAddress(); vm.label(borrower, "borrower"); address admin = vm.randomAddress(); @@ -126,7 +127,7 @@ contract ForkPrdFlashRepay is ForkBaseTest { // create new market support v2 flash repay { - TermMaxFactory f2 = deployFactory(admin); + TermMaxFactoryV2 f2 = deployFactory(admin); MarketConfig memory marketConfig = mmay_30.config(); (,, IGearingToken gt, address collateral, IERC20 debtToken) = mmay_30.tokens(); GtConfig memory gtConfig = gt.getGtConfig(); @@ -179,7 +180,7 @@ contract ForkPrdFlashRepay is ForkBaseTest { (IERC20 ft,, IGearingToken gt, address collateral,) = market.tokens(); console.log("usdc balance before:", IERC20(usdc).balanceOf(borrower)); gt.approve(address(router), gtId1); - ITermMaxRouter.TermMaxSwapData memory swapData; + ITermMaxRouterV2.TermMaxSwapData memory swapData; router.flashRepayFromCollV2( borrower, market, gtId1, repayAmount, true, abi.encode(removedCollateral), swapUnits, swapData ); @@ -200,15 +201,13 @@ contract ForkPrdFlashRepay is ForkBaseTest { } function testFlashRepayPt() public { - vm.roll(22494579); // 2025-05-15 - address borrower; address admin = vm.randomAddress(); vm.startPrank(admin); - TermMaxRouter router = deployRouter(admin); - router.setAdapterWhitelist(pendleAdapter, true); - router.setAdapterWhitelist(0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779, true); + TermMaxRouterV2 router2 = deployRouter(admin); + router2.setAdapterWhitelist(pendleAdapter, true); + router2.setAdapterWhitelist(0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779, true); vm.stopPrank(); uint128 debt; @@ -246,9 +245,9 @@ contract ForkPrdFlashRepay is ForkBaseTest { }); console.log("usdc balance before:", IERC20(usdc).balanceOf(borrower)); - gt.approve(address(router), gt1); - ITermMaxRouter.TermMaxSwapData memory swapData; - router.flashRepayFromColl(borrower, mmay_30, gt1, true, swapUnits, swapData); + gt.approve(address(router2), gt1); + ITermMaxRouterV2.TermMaxSwapData memory swapData; + router2.flashRepayFromColl(borrower, mmay_30, gt1, true, swapUnits, swapData); console.log("usdc balance after:", IERC20(usdc).balanceOf(borrower)); vm.stopPrank(); } diff --git a/test/v2/integration/ForkPrdRollOver.t.sol b/test/v2/integration/ForkPrdRollOver.t.sol index 49933d7..4506d80 100644 --- a/test/v2/integration/ForkPrdRollOver.t.sol +++ b/test/v2/integration/ForkPrdRollOver.t.sol @@ -13,7 +13,7 @@ import { GtConfig } from "contracts/v1/tokens/AbstractGearingToken.sol"; import {PendleSwapV3AdapterV2} from "contracts/v2/router/swapAdapters/PendleSwapV3AdapterV2.sol"; -import {IOracle} from "contracts/oracle/IOracleV1.sol"; +import {IOracle} from "contracts/v1/oracle/IOracle.sol"; import { ForkBaseTestV2, TermMaxFactoryV2, diff --git a/test/tokenomics/PreTMX.t.sol b/test/v2/tokenomics/PreTMX.t.sol similarity index 99% rename from test/tokenomics/PreTMX.t.sol rename to test/v2/tokenomics/PreTMX.t.sol index 7ec2620..8fed31d 100644 --- a/test/tokenomics/PreTMX.t.sol +++ b/test/v2/tokenomics/PreTMX.t.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.20; import {Test, console} from "forge-std/Test.sol"; -import {PreTMX} from "../../contracts/tokenomics/PreTMX.sol"; +import {PreTMX} from "contracts/v2/tokenomics/PreTMX.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {Ownable2Step} from "@openzeppelin/contracts/access/Ownable2Step.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; From a9e3394e57d702475b885300174e43ff0a78aa64 Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 3 Jun 2025 12:19:55 +0800 Subject: [PATCH 057/194] remove old contracts --- contracts/IFlashLoanReceiver.sol | 21 - contracts/ISwapCallback.sol | 18 - contracts/ITermMaxMarket.sol | 109 --- contracts/ITermMaxOrder.sol | 100 --- contracts/TermMaxMarket.sol | 392 --------- contracts/TermMaxOrder.sol | 778 ------------------ contracts/access/AccessManager.sol | 201 ----- contracts/errors/FactoryErrors.sol | 19 - contracts/errors/GearingTokenErrors.sol | 48 -- contracts/errors/MarketErrors.sol | 36 - contracts/errors/OrderErrors.sol | 90 -- contracts/errors/RouterErrors.sol | 27 - contracts/errors/TermMaxTokenErrors.sol | 20 - contracts/errors/VaultErrors.sol | 134 --- contracts/events/FactoryEvents.sol | 34 - contracts/events/GearingTokenEvents.sol | 64 -- contracts/events/MarketEvents.sol | 131 --- contracts/events/OrderEvents.sol | 108 --- contracts/events/RouterEvents.sol | 181 ---- contracts/events/TermMaxTokenEvents.sol | 19 - contracts/events/VaultEvents.sol | 199 ----- contracts/extensions/aave/IAaveV3Minimal.sol | 94 --- contracts/extensions/pendle/PendleHelper.sol | 40 - contracts/factory/ITermMaxFactory.sol | 31 - contracts/factory/IVaultFactory.sol | 41 - contracts/factory/TermMaxFactory.sol | 74 -- contracts/factory/TermMaxPriceFeedFactory.sol | 36 - contracts/factory/VaultFactory.sol | 54 -- contracts/lib/ArrayUtils.sol | 22 - contracts/lib/Constants.sol | 21 - contracts/lib/GearingTokenConstants.sol | 16 - contracts/lib/LinkedList.sol | 37 - contracts/lib/MarketConstants.sol | 9 - contracts/lib/MathLib.sol | 152 ---- contracts/lib/PendingLib.sol | 38 - contracts/lib/StringUtil.sol | 8 - contracts/lib/TermMaxCurve.sol | 391 --------- contracts/lib/TransferUtils.sol | 45 - contracts/lib/VaultConstants.sol | 22 - contracts/oracle/IOracle.sol | 30 - contracts/oracle/IOracleV1.sol | 26 - contracts/oracle/OracleAggregator.sol | 158 ---- .../oracle/priceFeeds/ITermMaxPriceFeed.sol | 14 - .../priceFeeds/TermMaxERC4626PriceFeed.sol | 63 -- .../oracle/priceFeeds/TermMaxPTPriceFeed.sol | 135 --- .../priceFeeds/TermMaxPriceFeedConverter.sol | 63 -- contracts/router/ISwapAdapter.sol | 49 -- contracts/router/ITermMaxRouter.sol | 333 -------- contracts/router/MarketViewer.sol | 337 -------- contracts/router/TermMaxRouter.sol | 742 ----------------- .../router/swapAdapters/ERC20SwapAdapter.sol | 80 -- .../swapAdapters/ERC4626VaultAdapter.sol | 52 -- .../swapAdapters/KyberswapV2Adapter.sol | 48 -- .../router/swapAdapters/OdosV2Adapter.sol | 66 -- .../swapAdapters/PendleSwapV3Adapter.sol | 64 -- .../router/swapAdapters/UniswapV3Adapter.sol | 45 - contracts/storage/TermMaxStorage.sol | 124 --- contracts/test/MockAave.sol | 58 -- contracts/test/MockERC20.sol | 20 - contracts/test/MockFlashLoanReceiver.sol | 37 - contracts/test/MockFlashRepayer.sol | 32 - contracts/test/MockOrder.sol | 317 ------- contracts/test/MockPriceFeed.sol | 75 -- contracts/test/MockSwapAdapter.sol | 27 - contracts/test/testnet/Faucet.sol | 109 --- contracts/test/testnet/FaucetERC20.sol | 24 - contracts/test/testnet/SwapAdapter.sol | 41 - contracts/tokenomics/PreTMX.sol | 84 -- contracts/tokens/AbstractGearingToken.sol | 586 ------------- contracts/tokens/GearingTokenWithERC20.sol | 228 ----- contracts/tokens/IFlashRepayer.sol | 25 - contracts/tokens/IGearingToken.sol | 141 ---- contracts/tokens/IMintableERC20.sol | 40 - contracts/tokens/MintableERC20.sol | 59 -- contracts/tokens/StakingBuffer.sol | 62 -- contracts/tokens/TermMaxToken.sol | 180 ---- contracts/vault/IOrderManager.sol | 98 --- contracts/vault/ITermMaxVault.sol | 296 ------- contracts/vault/OrderManager.sol | 381 --------- contracts/vault/TermMaxVault.sol | 753 ----------------- contracts/vault/VaultStorage.sol | 58 -- 81 files changed, 10020 deletions(-) delete mode 100644 contracts/IFlashLoanReceiver.sol delete mode 100644 contracts/ISwapCallback.sol delete mode 100644 contracts/ITermMaxMarket.sol delete mode 100644 contracts/ITermMaxOrder.sol delete mode 100644 contracts/TermMaxMarket.sol delete mode 100644 contracts/TermMaxOrder.sol delete mode 100644 contracts/access/AccessManager.sol delete mode 100644 contracts/errors/FactoryErrors.sol delete mode 100644 contracts/errors/GearingTokenErrors.sol delete mode 100644 contracts/errors/MarketErrors.sol delete mode 100644 contracts/errors/OrderErrors.sol delete mode 100644 contracts/errors/RouterErrors.sol delete mode 100644 contracts/errors/TermMaxTokenErrors.sol delete mode 100644 contracts/errors/VaultErrors.sol delete mode 100644 contracts/events/FactoryEvents.sol delete mode 100644 contracts/events/GearingTokenEvents.sol delete mode 100644 contracts/events/MarketEvents.sol delete mode 100644 contracts/events/OrderEvents.sol delete mode 100644 contracts/events/RouterEvents.sol delete mode 100644 contracts/events/TermMaxTokenEvents.sol delete mode 100644 contracts/events/VaultEvents.sol delete mode 100644 contracts/extensions/aave/IAaveV3Minimal.sol delete mode 100644 contracts/extensions/pendle/PendleHelper.sol delete mode 100644 contracts/factory/ITermMaxFactory.sol delete mode 100644 contracts/factory/IVaultFactory.sol delete mode 100644 contracts/factory/TermMaxFactory.sol delete mode 100644 contracts/factory/TermMaxPriceFeedFactory.sol delete mode 100644 contracts/factory/VaultFactory.sol delete mode 100644 contracts/lib/ArrayUtils.sol delete mode 100644 contracts/lib/Constants.sol delete mode 100644 contracts/lib/GearingTokenConstants.sol delete mode 100644 contracts/lib/LinkedList.sol delete mode 100644 contracts/lib/MarketConstants.sol delete mode 100644 contracts/lib/MathLib.sol delete mode 100644 contracts/lib/PendingLib.sol delete mode 100644 contracts/lib/StringUtil.sol delete mode 100644 contracts/lib/TermMaxCurve.sol delete mode 100644 contracts/lib/TransferUtils.sol delete mode 100644 contracts/lib/VaultConstants.sol delete mode 100644 contracts/oracle/IOracle.sol delete mode 100644 contracts/oracle/IOracleV1.sol delete mode 100644 contracts/oracle/OracleAggregator.sol delete mode 100644 contracts/oracle/priceFeeds/ITermMaxPriceFeed.sol delete mode 100644 contracts/oracle/priceFeeds/TermMaxERC4626PriceFeed.sol delete mode 100644 contracts/oracle/priceFeeds/TermMaxPTPriceFeed.sol delete mode 100644 contracts/oracle/priceFeeds/TermMaxPriceFeedConverter.sol delete mode 100644 contracts/router/ISwapAdapter.sol delete mode 100644 contracts/router/ITermMaxRouter.sol delete mode 100644 contracts/router/MarketViewer.sol delete mode 100644 contracts/router/TermMaxRouter.sol delete mode 100644 contracts/router/swapAdapters/ERC20SwapAdapter.sol delete mode 100644 contracts/router/swapAdapters/ERC4626VaultAdapter.sol delete mode 100644 contracts/router/swapAdapters/KyberswapV2Adapter.sol delete mode 100644 contracts/router/swapAdapters/OdosV2Adapter.sol delete mode 100644 contracts/router/swapAdapters/PendleSwapV3Adapter.sol delete mode 100644 contracts/router/swapAdapters/UniswapV3Adapter.sol delete mode 100644 contracts/storage/TermMaxStorage.sol delete mode 100644 contracts/test/MockAave.sol delete mode 100644 contracts/test/MockERC20.sol delete mode 100644 contracts/test/MockFlashLoanReceiver.sol delete mode 100644 contracts/test/MockFlashRepayer.sol delete mode 100644 contracts/test/MockOrder.sol delete mode 100644 contracts/test/MockPriceFeed.sol delete mode 100644 contracts/test/MockSwapAdapter.sol delete mode 100644 contracts/test/testnet/Faucet.sol delete mode 100644 contracts/test/testnet/FaucetERC20.sol delete mode 100644 contracts/test/testnet/SwapAdapter.sol delete mode 100644 contracts/tokenomics/PreTMX.sol delete mode 100644 contracts/tokens/AbstractGearingToken.sol delete mode 100644 contracts/tokens/GearingTokenWithERC20.sol delete mode 100644 contracts/tokens/IFlashRepayer.sol delete mode 100644 contracts/tokens/IGearingToken.sol delete mode 100644 contracts/tokens/IMintableERC20.sol delete mode 100644 contracts/tokens/MintableERC20.sol delete mode 100644 contracts/tokens/StakingBuffer.sol delete mode 100644 contracts/tokens/TermMaxToken.sol delete mode 100644 contracts/vault/IOrderManager.sol delete mode 100644 contracts/vault/ITermMaxVault.sol delete mode 100644 contracts/vault/OrderManager.sol delete mode 100644 contracts/vault/TermMaxVault.sol delete mode 100644 contracts/vault/VaultStorage.sol diff --git a/contracts/IFlashLoanReceiver.sol b/contracts/IFlashLoanReceiver.sol deleted file mode 100644 index 56c9742..0000000 --- a/contracts/IFlashLoanReceiver.sol +++ /dev/null @@ -1,21 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; - -/** - * @title The interface of flash loan in TermMax - * @author Term Structure Labs - */ -interface IFlashLoanReceiver { - /// @notice Execute operation to be called in flash loan function - /// @dev Add your operations logic here - /// @param gtReceiver Who will receive Gearing Token - /// @param asset Asset to be flash loaned - /// @param amount Amount to be flash loaned - /// @param data Data to be passed to the receiver - /// @return collateralData Collateral data for borrowing - function executeOperation(address gtReceiver, IERC20 asset, uint256 amount, bytes calldata data) - external - returns (bytes memory collateralData); -} diff --git a/contracts/ISwapCallback.sol b/contracts/ISwapCallback.sol deleted file mode 100644 index 4f3e615..0000000 --- a/contracts/ISwapCallback.sol +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title TermMax Swap Callback Interface - * @author Term Structure Labs - * @notice Interface for handling callbacks after swap operations in TermMax - */ -interface ISwapCallback { - /** - * @notice Callback function called after a swap operation - * @param ftReserve The reserve of the FT token - * @param xtReserve The reserve of the XT token - * @param deltaFt The change in FT token balance (positive for receiving, negative for paying) - * @param deltaXt The change in XT token balance (positive for receiving, negative for paying) - */ - function afterSwap(uint256 ftReserve, uint256 xtReserve, int256 deltaFt, int256 deltaXt) external; -} diff --git a/contracts/ITermMaxMarket.sol b/contracts/ITermMaxMarket.sol deleted file mode 100644 index bcbe20c..0000000 --- a/contracts/ITermMaxMarket.sol +++ /dev/null @@ -1,109 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IMintableERC20, IERC20} from "./tokens/IMintableERC20.sol"; -import {IGearingToken} from "./tokens/IGearingToken.sol"; -import {ITermMaxOrder} from "./ITermMaxOrder.sol"; -import {MarketConfig, MarketInitialParams, CurveCuts, FeeConfig} from "./storage/TermMaxStorage.sol"; -import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol"; -import {ISwapCallback} from "./ISwapCallback.sol"; - -/** - * @title TermMax Market interface - * @author Term Structure Labs - */ -interface ITermMaxMarket { - /// @notice Initialize the token and configuration of the market - function initialize(MarketInitialParams memory params) external; - - function name() external view returns (string memory); - - /// @notice Return the configuration - function config() external view returns (MarketConfig memory); - - /// @notice Set the market configuration - function updateMarketConfig(MarketConfig calldata newConfig) external; - - /// @notice Return the tokens in TermMax Market - /// @return ft Fixed-rate Token(bond token). Earning Fixed Income with High Certainty - /// @return xt Intermediary Token for Collateralization and Leveragin - /// @return gt Gearing Token - /// @return collateral Collateral token - /// @return underlying Underlying Token(debt) - function tokens() - external - view - returns (IMintableERC20 ft, IMintableERC20 xt, IGearingToken gt, address collateral, IERC20 underlying); - - /// @notice Mint FT and XT tokens by underlying token. - /// No price slippage or handling fees. - /// @param debtTokenAmt Amount of underlying token want to lock - function mint(address recipient, uint256 debtTokenAmt) external; - - /// @notice Burn FT and XT to get underlying token. - /// No price slippage or handling fees. - /// @param owner The owner of the tokens to be burned - /// @param recipient The address to receive the underlying token - /// @param debtTokenAmt Amount of underlying token want to get - function burn(address owner, address recipient, uint256 debtTokenAmt) external; - - /// @notice Using collateral to issue FT tokens. - /// Caller will get FT(bond) tokens equal to the debt amount subtract issue fee - /// @param debt The amount of debt, unit by underlying token - /// @param collateralData The encoded data of collateral - /// @return gtId The id of Gearing Token - /// - function issueFt(address recipient, uint128 debt, bytes calldata collateralData) - external - returns (uint256 gtId, uint128 ftOutAmt); - - /// @notice Return the issue fee ratio - function mintGtFeeRatio() external view returns (uint256); - - /// @notice Using collateral to issue FT tokens. - /// Caller will get FT(bond) tokens equal to the debt amount subtract issue fee - /// @param recipient Who will receive Gearing Token - /// @param debt The amount of debt, unit by underlying token - /// @param gtId The id of Gearing Token - /// @return ftOutAmt The amount of FT issued - /// - function issueFtByExistedGt(address recipient, uint128 debt, uint256 gtId) external returns (uint128 ftOutAmt); - - /// @notice Flash loan underlying token for leverage - /// @param xtOwner The owner of XT token - /// @param recipient Who will receive Gearing Token - /// @param xtAmt The amount of XT token. - /// The caller will receive an equal amount of underlying token by flash loan. - /// @param callbackData The data of flash loan callback - /// @return gtId The id of Gearing Token - function leverageByXt(address xtOwner, address recipient, uint128 xtAmt, bytes calldata callbackData) - external - returns (uint256 gtId); - - /// @notice Preview the redeem amount and delivery data - /// @param ftAmount The amount of FT want to redeem - /// @return debtTokenAmt The amount of debt token - /// @return deliveryData The delivery data - function previewRedeem(uint256 ftAmount) external view returns (uint256 debtTokenAmt, bytes memory deliveryData); - - /// @notice Redeem underlying tokens after maturity - /// @param ftOwner The owner of FT token - /// @param recipient Who will receive the underlying tokens - /// @param ftAmount The amount of FT want to redeem - /// @return debtTokenAmt The amount of debt token - /// @return deliveryData The delivery data - function redeem(address ftOwner, address recipient, uint256 ftAmount) - external - returns (uint256 debtTokenAmt, bytes memory deliveryData); - - /// @notice Set the configuration of Gearing Token - function updateGtConfig(bytes memory configData) external; - - /// @notice Set the fee rate of order - function updateOrderFeeRate(ITermMaxOrder order, FeeConfig memory newFeeConfig) external; - - /// @notice Create a new order - function createOrder(address maker, uint256 maxXtReserve, ISwapCallback swapTrigger, CurveCuts memory curveCuts) - external - returns (ITermMaxOrder order); -} diff --git a/contracts/ITermMaxOrder.sol b/contracts/ITermMaxOrder.sol deleted file mode 100644 index cc3e460..0000000 --- a/contracts/ITermMaxOrder.sol +++ /dev/null @@ -1,100 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {IMintableERC20, IERC20} from "./tokens/IMintableERC20.sol"; -import {IGearingToken} from "./tokens/IGearingToken.sol"; -import {ITermMaxMarket} from "./ITermMaxMarket.sol"; -import {OrderConfig, MarketConfig, CurveCuts, FeeConfig} from "./storage/TermMaxStorage.sol"; -import {ISwapCallback} from "./ISwapCallback.sol"; - -/** - * @title TermMax Order interface - * @author Term Structure Labs - */ -interface ITermMaxOrder { - /// @notice Initialize the token and configuration of the order - /// @param maker The maker - /// @param tokens The tokens - /// @param gt The Gearing Token - /// @param maxXtReserve The maximum reserve of XT token - /// @param curveCuts The curve cuts - /// @param marketConfig The market configuration - /// @dev Only factory will call this function once when deploying new market - function initialize( - address maker, - IERC20[3] memory tokens, - IGearingToken gt, - uint256 maxXtReserve, - ISwapCallback trigger, - CurveCuts memory curveCuts, - MarketConfig memory marketConfig - ) external; - - /// @notice Return the configuration - function orderConfig() external view returns (OrderConfig memory); - - /// @notice Return the maker - function maker() external view returns (address); - - /// @notice Set the market configuration - /// @param newOrderConfig New order configuration - /// @param ftChangeAmt Change amount of FT reserve - /// @param xtChangeAmt Change amount of XT reserve - function updateOrder(OrderConfig memory newOrderConfig, int256 ftChangeAmt, int256 xtChangeAmt) external; - - function withdrawAssets(IERC20 token, address recipient, uint256 amount) external; - - function updateFeeConfig(FeeConfig memory newFeeConfig) external; - - /// @notice Return the token reserves - function tokenReserves() external view returns (uint256 ftReserve, uint256 xtReserve); - - /// @notice Return the tokens in TermMax Market - /// @return market The market - function market() external view returns (ITermMaxMarket market); - - /// @notice Return the current apr of the amm order book - /// @return lendApr Lend APR - /// @return borrowApr Borrow APR - function apr() external view returns (uint256 lendApr, uint256 borrowApr); - - /// @notice Swap exact token to token - /// @param tokenIn The token want to swap - /// @param tokenOut The token want to receive - /// @param recipient Who receive output tokens - /// @param tokenAmtIn The number of tokenIn tokens input - /// @param minTokenOut Minimum number of tokenOut token outputs required - /// @param deadline The timestamp after which the transaction will revert - /// @return netOut The actual number of tokenOut tokens received - function swapExactTokenToToken( - IERC20 tokenIn, - IERC20 tokenOut, - address recipient, - uint128 tokenAmtIn, - uint128 minTokenOut, - uint256 deadline - ) external returns (uint256 netOut); - - /// @notice Swap token to exact token - /// @param tokenIn The token want to swap - /// @param tokenOut The token want to receive - /// @param recipient Who receive output tokens - /// @param tokenAmtOut The number of tokenOut tokens output - /// @param maxTokenIn Maximum number of tokenIn token inputs required - /// @param deadline The timestamp after which the transaction will revert - /// @return netIn The actual number of tokenIn tokens input - function swapTokenToExactToken( - IERC20 tokenIn, - IERC20 tokenOut, - address recipient, - uint128 tokenAmtOut, - uint128 maxTokenIn, - uint256 deadline - ) external returns (uint256 netIn); - - /// @notice Suspension of market trading - function pause() external; - - /// @notice Open Market Trading - function unpause() external; -} diff --git a/contracts/TermMaxMarket.sol b/contracts/TermMaxMarket.sol deleted file mode 100644 index c8a209d..0000000 --- a/contracts/TermMaxMarket.sol +++ /dev/null @@ -1,392 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.27; - -import { - OwnableUpgradeable, - Ownable2StepUpgradeable -} from "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; -import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; -import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; -import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol"; -import {ITermMaxMarket, IMintableERC20, IERC20} from "./ITermMaxMarket.sol"; -import {IGearingToken} from "./tokens/IGearingToken.sol"; -import {IFlashLoanReceiver} from "./IFlashLoanReceiver.sol"; -import {ITermMaxOrder} from "./ITermMaxOrder.sol"; -import {Constants} from "./lib/Constants.sol"; -import {MarketConstants} from "./lib/MarketConstants.sol"; -import {MarketErrors} from "./errors/MarketErrors.sol"; -import {MarketEvents} from "./events/MarketEvents.sol"; -import {StringUtil} from "./lib/StringUtil.sol"; -import {MarketConfig, MarketInitialParams, GtConfig, CurveCuts, FeeConfig} from "./storage/TermMaxStorage.sol"; -import {ISwapCallback} from "./ISwapCallback.sol"; -import {TransferUtils} from "./lib/TransferUtils.sol"; - -/** - * @title TermMax Market - * @author Term Structure Labs - */ -contract TermMaxMarket is - ITermMaxMarket, - ReentrancyGuardUpgradeable, - Ownable2StepUpgradeable, - MarketErrors, - MarketEvents -{ - using SafeCast for uint256; - using SafeCast for int256; - using TransferUtils for IERC20; - using TransferUtils for IMintableERC20; - using StringUtil for string; - - address immutable MINTABLE_ERC20_IMPLEMENT; - address immutable TERMMAX_ORDER_IMPLEMENT; - - MarketConfig private _config; - address private collateral; - IERC20 private debtToken; - IMintableERC20 private ft; - IMintableERC20 private xt; - IGearingToken private gt; - - string public name; - - /// @notice Check if the market is tradable - modifier isOpen() { - if (block.timestamp >= _config.maturity) { - revert TermIsNotOpen(); - } - _; - } - - constructor(address MINTABLE_ERC20_IMPLEMENT_, address TERMMAX_ORDER_IMPLEMENT_) { - MINTABLE_ERC20_IMPLEMENT = MINTABLE_ERC20_IMPLEMENT_; - TERMMAX_ORDER_IMPLEMENT = TERMMAX_ORDER_IMPLEMENT_; - _disableInitializers(); - } - - function mintGtFeeRatio() public view override returns (uint256) { - uint256 daysToMaturity = _daysToMaturity(_config.maturity); - return (daysToMaturity * uint256(_config.feeConfig.mintGtFeeRatio) * uint256(_config.feeConfig.mintGtFeeRef)) - / (Constants.DAYS_IN_YEAR * Constants.DECIMAL_BASE + uint256(_config.feeConfig.mintGtFeeRef) * daysToMaturity); - } - - /** - * @inheritdoc ITermMaxMarket - */ - function initialize(MarketInitialParams memory params) external override initializer { - __Ownable_init(params.admin); - __ReentrancyGuard_init(); - if (params.collateral == address(params.debtToken)) revert CollateralCanNotEqualUnderlyinng(); - MarketConfig memory config_ = params.marketConfig; - if (config_.maturity <= block.timestamp) revert InvalidMaturity(); - _checkFee(config_.feeConfig); - - debtToken = params.debtToken; - collateral = params.collateral; - _config = config_; - - (ft, xt, gt) = _deployTokens(params); - name = _contactString(MarketConstants.PREFIX_MARKET, params.tokenName); - emit MarketInitialized(params.collateral, params.debtToken, _config.maturity, ft, xt, gt); - } - - function _deployTokens(MarketInitialParams memory params) - internal - returns (IMintableERC20 ft_, IMintableERC20 xt_, IGearingToken gt_) - { - ft_ = IMintableERC20(Clones.clone(MINTABLE_ERC20_IMPLEMENT)); - xt_ = IMintableERC20(Clones.clone(MINTABLE_ERC20_IMPLEMENT)); - gt_ = IGearingToken(Clones.clone(params.gtImplementation)); - uint8 decimals = params.debtToken.decimals(); - ft_.initialize( - MarketConstants.PREFIX_FT.contact(params.tokenName), - MarketConstants.PREFIX_FT.contact(params.tokenSymbol), - decimals - ); - xt_.initialize( - MarketConstants.PREFIX_XT.contact(params.tokenName), - MarketConstants.PREFIX_XT.contact(params.tokenSymbol), - decimals - ); - gt_.initialize( - MarketConstants.PREFIX_GT.contact(params.tokenName), - MarketConstants.PREFIX_GT.contact(params.tokenSymbol), - GtConfig( - params.collateral, - params.debtToken, - ft_, - params.marketConfig.treasurer, - params.marketConfig.maturity, - params.loanConfig - ), - params.gtInitalParams - ); - } - - function _contactString(string memory a, string memory b) internal pure returns (string memory) { - return string(abi.encodePacked(a, b)); - } - - /** - * @inheritdoc ITermMaxMarket - */ - function config() public view override returns (MarketConfig memory) { - return _config; - } - - /** - * @inheritdoc ITermMaxMarket - */ - function tokens() external view override returns (IMintableERC20, IMintableERC20, IGearingToken, address, IERC20) { - return (ft, xt, gt, collateral, debtToken); - } - - /** - * @inheritdoc ITermMaxMarket - */ - function updateMarketConfig(MarketConfig calldata newConfig) external override onlyOwner { - MarketConfig memory mConfig = _config; - if (newConfig.treasurer != mConfig.treasurer) { - mConfig.treasurer = newConfig.treasurer; - gt.setTreasurer(newConfig.treasurer); - } - _checkFee(newConfig.feeConfig); - mConfig.feeConfig = newConfig.feeConfig; - - _config = mConfig; - emit UpdateMarketConfig(mConfig); - } - - function _checkFee(FeeConfig memory fee) internal pure { - if ( - fee.borrowTakerFeeRatio >= Constants.MAX_FEE_RATIO || fee.borrowMakerFeeRatio >= Constants.MAX_FEE_RATIO - || fee.lendTakerFeeRatio >= Constants.MAX_FEE_RATIO || fee.lendMakerFeeRatio >= Constants.MAX_FEE_RATIO - || fee.mintGtFeeRatio >= Constants.MAX_FEE_RATIO || fee.mintGtFeeRef > 5 * Constants.DECIMAL_BASE - ) revert FeeTooHigh(); - } - - /// @notice Calculate how many days until expiration - function _daysToMaturity(uint256 maturity) internal view returns (uint256 daysToMaturity) { - daysToMaturity = (maturity - block.timestamp + Constants.SECONDS_IN_DAY - 1) / Constants.SECONDS_IN_DAY; - } - - function mint(address recipient, uint256 debtTokenAmt) external override nonReentrant isOpen { - _mint(msg.sender, recipient, debtTokenAmt); - } - - function _mint(address caller, address recipient, uint256 debtTokenAmt) internal { - debtToken.safeTransferFrom(caller, address(this), debtTokenAmt); - - ft.mint(recipient, debtTokenAmt); - xt.mint(recipient, debtTokenAmt); - - emit Mint(caller, recipient, debtTokenAmt); - } - - function burn(address owner, address recipient, uint256 debtTokenAmt) external override nonReentrant isOpen { - _burn(owner, msg.sender, recipient, debtTokenAmt); - } - - function _burn(address owner, address spender, address recipient, uint256 debtTokenAmt) internal { - ft.burn(owner, spender, debtTokenAmt); - xt.burn(owner, spender, debtTokenAmt); - - debtToken.safeTransfer(recipient, debtTokenAmt); - - emit Burn(owner, recipient, debtTokenAmt); - } - - /** - * @inheritdoc ITermMaxMarket - */ - function leverageByXt(address xtOwner, address recipient, uint128 xtAmt, bytes calldata callbackData) - external - override - nonReentrant - isOpen - returns (uint256 gtId) - { - return _leverageByXt(xtOwner, msg.sender, recipient, xtAmt, callbackData); - } - - function _leverageByXt( - address xtOwner, - address loanReceiver, - address gtReceiver, - uint128 xtAmt, - bytes calldata callbackData - ) internal returns (uint256 gtId) { - // Send debt to borrower - debtToken.safeTransfer(loanReceiver, xtAmt); - // Callback function - bytes memory collateralData = - IFlashLoanReceiver(loanReceiver).executeOperation(gtReceiver, debtToken, xtAmt, callbackData); - - uint128 debt = ((xtAmt * Constants.DECIMAL_BASE) / (Constants.DECIMAL_BASE - mintGtFeeRatio())).toUint128(); - - MarketConfig memory mConfig = _config; - uint128 leverageFee = debt - xtAmt; - ft.mint(mConfig.treasurer, leverageFee); - - // Mint GT - gtId = gt.mint(loanReceiver, gtReceiver, debt, collateralData); - - xt.burn(xtOwner, msg.sender, xtAmt); - emit LeverageByXt(loanReceiver, gtReceiver, gtId, debt, xtAmt, leverageFee, collateralData); - } - - /** - * @inheritdoc ITermMaxMarket - */ - function issueFt(address recipient, uint128 debt, bytes calldata collateralData) - external - override - nonReentrant - isOpen - returns (uint256 gtId, uint128 ftOutAmt) - { - return _issueFt(msg.sender, recipient, debt, collateralData); - } - - function _issueFt(address caller, address recipient, uint128 debt, bytes calldata collateralData) - internal - returns (uint256 gtId, uint128 ftOutAmt) - { - // Mint GT - gtId = gt.mint(caller, recipient, debt, collateralData); - - MarketConfig memory mConfig = _config; - uint128 issueFee = ((debt * mintGtFeeRatio()) / Constants.DECIMAL_BASE).toUint128(); - // Mint ft amount = debt amount, send issueFee to treasurer and other to caller - ft.mint(mConfig.treasurer, issueFee); - ftOutAmt = debt - issueFee; - ft.mint(recipient, ftOutAmt); - - emit IssueFt(caller, recipient, gtId, debt, ftOutAmt, issueFee, collateralData); - } - - /** - * @inheritdoc ITermMaxMarket - */ - function issueFtByExistedGt(address recipient, uint128 debt, uint256 gtId) - external - override - nonReentrant - isOpen - returns (uint128 ftOutAmt) - { - return _issueFtByExistedGt(msg.sender, recipient, debt, gtId); - } - - function _issueFtByExistedGt(address caller, address recipient, uint128 debt, uint256 gtId) - internal - returns (uint128 ftOutAmt) - { - gt.augmentDebt(caller, gtId, debt); - - MarketConfig memory mConfig = _config; - uint128 issueFee = ((debt * mintGtFeeRatio()) / Constants.DECIMAL_BASE).toUint128(); - // Mint ft amount = debt amount, send issueFee to treasurer and other to caller - ft.mint(mConfig.treasurer, issueFee); - ftOutAmt = debt - issueFee; - ft.mint(recipient, ftOutAmt); - - emit IssueFtByExistedGt(caller, recipient, gtId, debt, ftOutAmt, issueFee); - } - - /** - * @inheritdoc ITermMaxMarket - */ - function previewRedeem(uint256 ftAmount) - external - view - override - returns (uint256 debtTokenAmt, bytes memory deliveryData) - { - MarketConfig memory mConfig = _config; - { - uint256 liquidationDeadline = - gt.liquidatable() ? mConfig.maturity + Constants.LIQUIDATION_WINDOW : mConfig.maturity; - if (block.timestamp < liquidationDeadline) { - revert CanNotRedeemBeforeFinalLiquidationDeadline(liquidationDeadline); - } - } - - // The proportion that user will get how many debtToken and collateral should be deliveried - uint256 proportion = (ftAmount * Constants.DECIMAL_BASE_SQ) / (ft.totalSupply() - ft.balanceOf(address(this))); - - deliveryData = gt.previewDelivery(proportion); - - debtTokenAmt = ((debtToken.balanceOf(address(this))) * proportion) / Constants.DECIMAL_BASE_SQ; - } - - /** - * @inheritdoc ITermMaxMarket - */ - function redeem(address ftOwner, address recipient, uint256 ftAmount) - external - virtual - override - nonReentrant - returns (uint256, bytes memory) - { - return _redeem(ftOwner, msg.sender, recipient, ftAmount); - } - - function _redeem(address ftOwner, address caller, address recipient, uint256 ftAmount) - internal - returns (uint256 debtTokenAmt, bytes memory deliveryData) - { - MarketConfig memory mConfig = _config; - { - uint256 liquidationDeadline = - gt.liquidatable() ? mConfig.maturity + Constants.LIQUIDATION_WINDOW : mConfig.maturity; - if (block.timestamp < liquidationDeadline) { - revert CanNotRedeemBeforeFinalLiquidationDeadline(liquidationDeadline); - } - } - // burn ft reserves(from repayment or liquidation) - uint256 ftReserve = ft.balanceOf(address(this)); - if (ftReserve > 0) { - ft.burn(address(this), address(this), ftReserve); - } - - // The proportion that user will get how many debtToken and collateral should be deliveried - uint256 proportion = (ftAmount * Constants.DECIMAL_BASE_SQ) / ft.totalSupply(); - - // Burn ft - ft.burn(ftOwner, caller, ftAmount); - - deliveryData = gt.delivery(proportion, recipient); - // Transfer debtToken output - debtTokenAmt += ((debtToken.balanceOf(address(this))) * proportion) / Constants.DECIMAL_BASE_SQ; - debtToken.safeTransfer(recipient, debtTokenAmt); - emit Redeem(caller, recipient, proportion.toUint128(), debtTokenAmt.toUint128(), deliveryData); - } - - /** - * @inheritdoc ITermMaxMarket - */ - function updateGtConfig(bytes memory configData) external override onlyOwner { - gt.updateConfig(configData); - } - - /** - * @inheritdoc ITermMaxMarket - */ - function createOrder(address maker, uint256 maxXtReserve, ISwapCallback swapTrigger, CurveCuts memory curveCuts) - external - nonReentrant - isOpen - returns (ITermMaxOrder order) - { - order = ITermMaxOrder(Clones.clone(TERMMAX_ORDER_IMPLEMENT)); - order.initialize(maker, [ft, xt, debtToken], gt, maxXtReserve, swapTrigger, curveCuts, _config); - emit CreateOrder(maker, order); - } - - function updateOrderFeeRate(ITermMaxOrder order, FeeConfig memory newFeeConfig) external onlyOwner { - _checkFee(newFeeConfig); - order.updateFeeConfig(newFeeConfig); - } -} diff --git a/contracts/TermMaxOrder.sol b/contracts/TermMaxOrder.sol deleted file mode 100644 index 9d5aa49..0000000 --- a/contracts/TermMaxOrder.sol +++ /dev/null @@ -1,778 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.27; - -import { - OwnableUpgradeable, - Ownable2StepUpgradeable -} from "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; -import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; -import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; -import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; -import {ITermMaxOrder, IERC20} from "./ITermMaxOrder.sol"; -import {ITermMaxMarket} from "./ITermMaxMarket.sol"; -import {IGearingToken} from "./tokens/IGearingToken.sol"; -import {IFlashLoanReceiver} from "./IFlashLoanReceiver.sol"; -import {Constants} from "./lib/Constants.sol"; -import {TermMaxCurve, MathLib} from "./lib/TermMaxCurve.sol"; -import {OrderErrors} from "./errors/OrderErrors.sol"; -import {OrderEvents} from "./events/OrderEvents.sol"; -import {OrderConfig, MarketConfig, CurveCuts, CurveCut, FeeConfig} from "./storage/TermMaxStorage.sol"; -import {ISwapCallback} from "./ISwapCallback.sol"; -import {TransferUtils} from "./lib/TransferUtils.sol"; - -/** - * @title TermMax Order - * @author Term Structure Labs - */ -contract TermMaxOrder is - ITermMaxOrder, - ReentrancyGuardUpgradeable, - Ownable2StepUpgradeable, - PausableUpgradeable, - OrderErrors, - OrderEvents -{ - using SafeCast for uint256; - using SafeCast for int256; - using TransferUtils for IERC20; - using MathLib for *; - - ITermMaxMarket public market; - - IERC20 private ft; - IERC20 private xt; - IERC20 private debtToken; - IGearingToken private gt; - - OrderConfig private _orderConfig; - - uint64 private maturity; - - uint256 private constant T_FT_RESERVE_STORE = 0; - uint256 private constant T_XT_RESERVE_STORE = 1; - - function setInitialFtReserve(uint256 ftReserve) private { - assembly { - tstore(T_FT_RESERVE_STORE, ftReserve) - } - } - - function setInitialXtReserve(uint256 xtReserve) private { - assembly { - tstore(T_XT_RESERVE_STORE, xtReserve) - } - } - - function getInitialFtReserve() private view returns (uint256 ftReserve) { - assembly { - ftReserve := tload(T_FT_RESERVE_STORE) - } - } - - function getInitialXtReserve() private view returns (uint256 xtReserve) { - assembly { - xtReserve := tload(T_XT_RESERVE_STORE) - } - } - - /// @notice Check if the market is borrowing allowed - modifier isBorrowingAllowed(OrderConfig memory config) { - if (config.curveCuts.lendCurveCuts.length == 0) { - revert BorrowIsNotAllowed(); - } - _; - } - - /// @notice Check if the market is lending allowed - modifier isLendingAllowed(OrderConfig memory config) { - if (config.curveCuts.borrowCurveCuts.length == 0) { - revert LendIsNotAllowed(); - } - _; - } - - /// @notice Check if the order is tradable - modifier isOpen() { - _requireNotPaused(); - if (block.timestamp >= maturity) { - revert TermIsNotOpen(); - } - _; - } - - modifier onlyMarket() { - if (msg.sender != address(market)) revert OnlyMarket(); - _; - } - - constructor() { - _disableInitializers(); - } - - function maker() public view returns (address) { - return owner(); - } - - /** - * @inheritdoc ITermMaxOrder - */ - function initialize( - address maker_, - IERC20[3] memory tokens, - IGearingToken gt_, - uint256 maxXtReserve_, - ISwapCallback swapTrigger, - CurveCuts memory curveCuts_, - MarketConfig memory marketConfig - ) external override initializer { - __Ownable_init(maker_); - __ReentrancyGuard_init(); - __Pausable_init(); - market = ITermMaxMarket(_msgSender()); - - // _orderConfig.curveCuts = curveCuts_; - _updateCurve(curveCuts_); - _orderConfig.feeConfig = marketConfig.feeConfig; - _orderConfig.maxXtReserve = maxXtReserve_; - _orderConfig.swapTrigger = swapTrigger; - maturity = marketConfig.maturity; - - ft = tokens[0]; - xt = tokens[1]; - debtToken = tokens[2]; - gt = gt_; - emit OrderInitialized(market, maker_, maxXtReserve_, swapTrigger, curveCuts_); - } - - /** - * @inheritdoc ITermMaxOrder - */ - function orderConfig() external view returns (OrderConfig memory) { - return _orderConfig; - } - - /** - * @inheritdoc ITermMaxOrder - */ - function tokenReserves() public view override returns (uint256, uint256) { - return (ft.balanceOf(address(this)), xt.balanceOf(address(this))); - } - - /** - * @inheritdoc ITermMaxOrder - */ - function apr() external view override returns (uint256 lendApr_, uint256 borrowApr_) { - uint256 daysToMaturity = _daysToMaturity(); - uint256 oriXtReserve = xt.balanceOf(address(this)); - - CurveCuts memory curveCuts = _orderConfig.curveCuts; - if (curveCuts.lendCurveCuts.length == 0) { - lendApr_ = 0; - } else { - uint256 lendCutId = TermMaxCurve.calcCutId(curveCuts.lendCurveCuts, oriXtReserve); - (, uint256 lendVXtReserve, uint256 lendVFtReserve) = TermMaxCurve.calcIntervalProps( - Constants.DECIMAL_BASE, daysToMaturity, curveCuts.lendCurveCuts[lendCutId], oriXtReserve - ); - lendApr_ = - ((lendVFtReserve * Constants.DECIMAL_BASE * Constants.DAYS_IN_YEAR) / (lendVXtReserve * daysToMaturity)); - } - if (curveCuts.borrowCurveCuts.length == 0) { - borrowApr_ = type(uint256).max; - } else { - uint256 borrowCutId = TermMaxCurve.calcCutId(curveCuts.borrowCurveCuts, oriXtReserve); - (, uint256 borrowVXtReserve, uint256 borrowVFtReserve) = TermMaxCurve.calcIntervalProps( - Constants.DECIMAL_BASE, daysToMaturity, curveCuts.borrowCurveCuts[borrowCutId], oriXtReserve - ); - - borrowApr_ = ( - (borrowVFtReserve * Constants.DECIMAL_BASE * Constants.DAYS_IN_YEAR) - / (borrowVXtReserve * daysToMaturity) - ); - } - } - - /** - * @inheritdoc ITermMaxOrder - */ - function updateOrder(OrderConfig memory newOrderConfig, int256 ftChangeAmt, int256 xtChangeAmt) - external - override - onlyOwner - { - _updateCurve(newOrderConfig.curveCuts); - if (ftChangeAmt > 0) { - ft.safeTransferFrom(msg.sender, address(this), ftChangeAmt.toUint256()); - } else if (ftChangeAmt < 0) { - ft.safeTransfer(msg.sender, (-ftChangeAmt).toUint256()); - } - if (xtChangeAmt > 0) { - xt.safeTransferFrom(msg.sender, address(this), xtChangeAmt.toUint256()); - } else if (xtChangeAmt < 0) { - xt.safeTransfer(msg.sender, (-xtChangeAmt).toUint256()); - } - _orderConfig.maxXtReserve = newOrderConfig.maxXtReserve; - _orderConfig.gtId = newOrderConfig.gtId; - _orderConfig.swapTrigger = newOrderConfig.swapTrigger; - emit UpdateOrder( - newOrderConfig.curveCuts, - ftChangeAmt, - xtChangeAmt, - newOrderConfig.gtId, - newOrderConfig.maxXtReserve, - newOrderConfig.swapTrigger - ); - } - - function _updateCurve(CurveCuts memory newCurveCuts) internal { - bytes32 newCurveCutsHash = keccak256(abi.encode(newCurveCuts)); - CurveCuts memory oldCurveCuts = _orderConfig.curveCuts; - if (keccak256(abi.encode(oldCurveCuts)) != newCurveCutsHash) { - if (newCurveCuts.lendCurveCuts.length > 0) { - if (newCurveCuts.lendCurveCuts[0].liqSquare == 0 || newCurveCuts.lendCurveCuts[0].xtReserve != 0) { - revert InvalidCurveCuts(); - } - } - for (uint256 i = 1; i < newCurveCuts.lendCurveCuts.length; i++) { - if ( - newCurveCuts.lendCurveCuts[i].liqSquare == 0 - || newCurveCuts.lendCurveCuts[i].xtReserve <= newCurveCuts.lendCurveCuts[i - 1].xtReserve - ) { - revert InvalidCurveCuts(); - } - /* - R := (x' + beta') ^ 2 * DECIMAL_BASE / (x' + beta) ^ 2 - L' ^ 2 := L ^ 2 * R / DECIMAL_BASE - */ - if ( - newCurveCuts.lendCurveCuts[i].liqSquare - != ( - newCurveCuts.lendCurveCuts[i - 1].liqSquare - * ( - ( - ( - newCurveCuts.lendCurveCuts[i].xtReserve.plusInt256( - newCurveCuts.lendCurveCuts[i].offset - ) - ) ** 2 * Constants.DECIMAL_BASE - ) - / ( - newCurveCuts.lendCurveCuts[i].xtReserve.plusInt256( - newCurveCuts.lendCurveCuts[i - 1].offset - ) ** 2 - ) - ) - ) / Constants.DECIMAL_BASE - ) revert InvalidCurveCuts(); - } - if (newCurveCuts.borrowCurveCuts.length > 0) { - if (newCurveCuts.borrowCurveCuts[0].liqSquare == 0 || newCurveCuts.borrowCurveCuts[0].xtReserve != 0) { - revert InvalidCurveCuts(); - } - } - for (uint256 i = 1; i < newCurveCuts.borrowCurveCuts.length; i++) { - if ( - newCurveCuts.borrowCurveCuts[i].liqSquare == 0 - || newCurveCuts.borrowCurveCuts[i].xtReserve <= newCurveCuts.borrowCurveCuts[i - 1].xtReserve - ) { - revert InvalidCurveCuts(); - } - if ( - newCurveCuts.borrowCurveCuts[i].liqSquare - != ( - newCurveCuts.borrowCurveCuts[i - 1].liqSquare - * ( - ( - ( - newCurveCuts.borrowCurveCuts[i].xtReserve.plusInt256( - newCurveCuts.borrowCurveCuts[i].offset - ) - ) ** 2 * Constants.DECIMAL_BASE - ) - / ( - newCurveCuts.borrowCurveCuts[i].xtReserve.plusInt256( - newCurveCuts.borrowCurveCuts[i - 1].offset - ) ** 2 - ) - ) - ) / Constants.DECIMAL_BASE - ) revert InvalidCurveCuts(); - } - _orderConfig.curveCuts = newCurveCuts; - } - } - - function updateFeeConfig(FeeConfig memory newFeeConfig) external override onlyMarket { - _orderConfig.feeConfig = newFeeConfig; - emit UpdateFeeConfig(newFeeConfig); - } - - /// @notice Calculate how many days until expiration - function _daysToMaturity() internal view returns (uint256 daysToMaturity) { - daysToMaturity = (maturity - block.timestamp + Constants.SECONDS_IN_DAY - 1) / Constants.SECONDS_IN_DAY; - } - - /** - * @inheritdoc ITermMaxOrder - */ - function swapExactTokenToToken( - IERC20 tokenIn, - IERC20 tokenOut, - address recipient, - uint128 tokenAmtIn, - uint128 minTokenOut, - uint256 deadline - ) external override nonReentrant isOpen returns (uint256 netTokenOut) { - if (block.timestamp > deadline) revert DeadlineExpired(); - if (tokenIn == tokenOut) revert CantSwapSameToken(); - OrderConfig memory config = _orderConfig; - uint256 feeAmt; - if (tokenAmtIn != 0) { - // Store ft and xt reserve before swap - setInitialFtReserve(ft.balanceOf(address(this))); - setInitialXtReserve(xt.balanceOf(address(this))); - if (tokenIn == ft && tokenOut == debtToken) { - (netTokenOut, feeAmt) = _sellFt(tokenAmtIn, minTokenOut, msg.sender, recipient, config); - } else if (tokenIn == xt && tokenOut == debtToken) { - (netTokenOut, feeAmt) = _sellXt(tokenAmtIn, minTokenOut, msg.sender, recipient, config); - } else if (tokenIn == debtToken && tokenOut == ft) { - (netTokenOut, feeAmt) = _buyFt(tokenAmtIn, minTokenOut, msg.sender, recipient, config); - } else if (tokenIn == debtToken && tokenOut == xt) { - (netTokenOut, feeAmt) = _buyXt(tokenAmtIn, minTokenOut, msg.sender, recipient, config); - } else { - revert CantNotSwapToken(tokenIn, tokenOut); - } - // transfer fee to treasurer - ft.safeTransfer(market.config().treasurer, feeAmt); - /// @dev callback the changes of ft and xt reserve to trigger - if (address(_orderConfig.swapTrigger) != address(0)) { - uint256 ftReserve = ft.balanceOf(address(this)); - uint256 xtReserve = xt.balanceOf(address(this)); - int256 deltaFt = ftReserve.toInt256() - getInitialFtReserve().toInt256(); - int256 deltaXt = xtReserve.toInt256() - getInitialXtReserve().toInt256(); - _orderConfig.swapTrigger.afterSwap(ftReserve, xtReserve, deltaFt, deltaXt); - } - } else { - if (address(_orderConfig.swapTrigger) != address(0)) { - uint256 ftReserve = ft.balanceOf(address(this)); - uint256 xtReserve = xt.balanceOf(address(this)); - _orderConfig.swapTrigger.afterSwap(ftReserve, xtReserve, 0, 0); - } - } - - emit SwapExactTokenToToken( - tokenIn, tokenOut, msg.sender, recipient, tokenAmtIn, netTokenOut.toUint128(), feeAmt.toUint128() - ); - } - - function _buyFt( - uint256 debtTokenAmtIn, - uint256 minTokenOut, - address caller, - address recipient, - OrderConfig memory config - ) internal isLendingAllowed(config) returns (uint256 netOut, uint256 feeAmt) { - (netOut, feeAmt) = _buyToken(caller, recipient, debtTokenAmtIn, minTokenOut, config, _buyFtStep); - if (xt.balanceOf(address(this)) > config.maxXtReserve) { - revert XtReserveTooHigh(); - } - } - - function _buyXt( - uint256 debtTokenAmtIn, - uint256 minTokenOut, - address caller, - address recipient, - OrderConfig memory config - ) internal isBorrowingAllowed(config) returns (uint256 netOut, uint256 feeAmt) { - (netOut, feeAmt) = _buyToken(caller, recipient, debtTokenAmtIn, minTokenOut, config, _buyXtStep); - } - - function _sellFt( - uint256 ftAmtIn, - uint256 minDebtTokenOut, - address caller, - address recipient, - OrderConfig memory config - ) internal isBorrowingAllowed(config) returns (uint256 netOut, uint256 feeAmt) { - (netOut, feeAmt) = _sellToken(caller, recipient, ftAmtIn, minDebtTokenOut, config, _sellFtStep); - } - - function _sellXt( - uint256 xtAmtIn, - uint256 minDebtTokenOut, - address caller, - address recipient, - OrderConfig memory config - ) internal isLendingAllowed(config) returns (uint256 netOut, uint256 feeAmt) { - (netOut, feeAmt) = _sellToken(caller, recipient, xtAmtIn, minDebtTokenOut, config, _sellXtStep); - if (xt.balanceOf(address(this)) > config.maxXtReserve) { - revert XtReserveTooHigh(); - } - } - - function _buyToken( - address caller, - address recipient, - uint256 debtTokenAmtIn, - uint256 minTokenOut, - OrderConfig memory config, - function(uint, uint, uint, OrderConfig memory) internal view returns (uint, uint, IERC20) func - ) internal returns (uint256, uint256) { - uint256 daysToMaturity = _daysToMaturity(); - uint256 oriXtReserve = getInitialXtReserve(); - - (uint256 tokenAmtOut, uint256 feeAmt, IERC20 tokenOut) = - func(daysToMaturity, oriXtReserve, debtTokenAmtIn, config); - - uint256 netOut = tokenAmtOut + debtTokenAmtIn; - if (netOut < minTokenOut) revert UnexpectedAmount(minTokenOut, netOut); - - debtToken.safeTransferFrom(caller, address(this), debtTokenAmtIn); - - debtToken.safeIncreaseAllowance(address(market), debtTokenAmtIn); - market.mint(address(this), debtTokenAmtIn); - if (tokenOut == ft) { - uint256 ftReserve = getInitialFtReserve(); - _issueFtToSelf(ftReserve + debtTokenAmtIn, netOut + feeAmt, config); - } - - tokenOut.safeTransfer(recipient, netOut); - - return (netOut, feeAmt); - } - - function _buyFtStep(uint256 daysToMaturity, uint256 oriXtReserve, uint256 debtTokenAmtIn, OrderConfig memory config) - internal - view - returns (uint256 tokenAmtOut, uint256 feeAmt, IERC20 tokenOut) - { - FeeConfig memory feeConfig = config.feeConfig; - CurveCut[] memory cuts = config.curveCuts.borrowCurveCuts; - uint256 nif = Constants.DECIMAL_BASE - uint256(feeConfig.lendTakerFeeRatio); - (, tokenAmtOut) = TermMaxCurve.buyFt(nif, daysToMaturity, cuts, oriXtReserve, debtTokenAmtIn); - feeAmt = (tokenAmtOut * (Constants.DECIMAL_BASE + uint256(feeConfig.borrowMakerFeeRatio))) / nif - tokenAmtOut; - tokenOut = ft; - } - - function _buyXtStep(uint256 daysToMaturity, uint256 oriXtReserve, uint256 debtTokenAmtIn, OrderConfig memory config) - internal - view - returns (uint256 tokenAmtOut, uint256 feeAmt, IERC20 tokenOut) - { - FeeConfig memory feeConfig = config.feeConfig; - CurveCut[] memory cuts = config.curveCuts.lendCurveCuts; - uint256 nif = Constants.DECIMAL_BASE + uint256(feeConfig.borrowTakerFeeRatio); - uint256 deltaFt; - (tokenAmtOut, deltaFt) = TermMaxCurve.buyXt(nif, daysToMaturity, cuts, oriXtReserve, debtTokenAmtIn); - feeAmt = deltaFt - (deltaFt * (Constants.DECIMAL_BASE - uint256(feeConfig.lendMakerFeeRatio))) / nif; - tokenOut = xt; - } - - function _sellToken( - address caller, - address recipient, - uint256 tokenAmtIn, - uint256 minDebtTokenOut, - OrderConfig memory config, - function(uint, uint, uint, OrderConfig memory) internal view returns (uint, uint, IERC20) func - ) internal returns (uint256, uint256) { - uint256 daysToMaturity = _daysToMaturity(); - uint256 oriXtReserve = getInitialXtReserve(); - - (uint256 netOut, uint256 feeAmt, IERC20 tokenIn) = func(daysToMaturity, oriXtReserve, tokenAmtIn, config); - if (netOut < minDebtTokenOut) revert UnexpectedAmount(minDebtTokenOut, netOut); - - tokenIn.safeTransferFrom(caller, address(this), tokenAmtIn); - if (tokenIn == xt) { - uint256 ftReserve = getInitialFtReserve(); - _issueFtToSelf(ftReserve, netOut + feeAmt, config); - } - market.burn(address(this), recipient, netOut); - return (netOut, feeAmt); - } - - function _sellFtStep(uint256 daysToMaturity, uint256 oriXtReserve, uint256 tokenAmtIn, OrderConfig memory config) - internal - view - returns (uint256 debtTokenAmtOut, uint256 feeAmt, IERC20 tokenIn) - { - FeeConfig memory feeConfig = config.feeConfig; - CurveCut[] memory cuts = config.curveCuts.lendCurveCuts; - uint256 nif = Constants.DECIMAL_BASE + uint256(feeConfig.borrowTakerFeeRatio); - uint256 deltaFt; - (debtTokenAmtOut, deltaFt) = TermMaxCurve.sellFt(nif, daysToMaturity, cuts, oriXtReserve, tokenAmtIn); - feeAmt = deltaFt - (deltaFt * (Constants.DECIMAL_BASE - uint256(feeConfig.lendMakerFeeRatio))) / nif; - tokenIn = ft; - } - - function _sellXtStep(uint256 daysToMaturity, uint256 oriXtReserve, uint256 tokenAmtIn, OrderConfig memory config) - internal - view - returns (uint256 debtTokenAmtOut, uint256 feeAmt, IERC20 tokenIn) - { - FeeConfig memory feeConfig = config.feeConfig; - CurveCut[] memory cuts = config.curveCuts.borrowCurveCuts; - uint256 nif = Constants.DECIMAL_BASE - uint256(feeConfig.lendTakerFeeRatio); - (, debtTokenAmtOut) = TermMaxCurve.sellXt(nif, daysToMaturity, cuts, oriXtReserve, tokenAmtIn); - feeAmt = (debtTokenAmtOut * (Constants.DECIMAL_BASE + uint256(feeConfig.borrowMakerFeeRatio))) / nif - - debtTokenAmtOut; - tokenIn = xt; - } - - /** - * @inheritdoc ITermMaxOrder - */ - function swapTokenToExactToken( - IERC20 tokenIn, - IERC20 tokenOut, - address recipient, - uint128 tokenAmtOut, - uint128 maxTokenIn, - uint256 deadline - ) external override nonReentrant isOpen returns (uint256 netTokenIn) { - if (block.timestamp > deadline) revert DeadlineExpired(); - if (tokenIn == tokenOut) revert CantSwapSameToken(); - OrderConfig memory config = _orderConfig; - uint256 feeAmt; - if (tokenAmtOut != 0 && maxTokenIn != 0) { - // Storage current ft and xt reserve - setInitialFtReserve(ft.balanceOf(address(this))); - setInitialXtReserve(xt.balanceOf(address(this))); - - if (tokenIn == debtToken && tokenOut == ft) { - (netTokenIn, feeAmt) = _buyExactFt(tokenAmtOut, maxTokenIn, msg.sender, recipient, config); - } else if (tokenIn == debtToken && tokenOut == xt) { - (netTokenIn, feeAmt) = _buyExactXt(tokenAmtOut, maxTokenIn, msg.sender, recipient, config); - } else if (tokenIn == ft && tokenOut == debtToken) { - (netTokenIn, feeAmt) = _sellFtForExactToken(tokenAmtOut, maxTokenIn, msg.sender, recipient, config); - } else if (tokenIn == xt && tokenOut == debtToken) { - (netTokenIn, feeAmt) = _sellXtForExactToken(tokenAmtOut, maxTokenIn, msg.sender, recipient, config); - } else { - revert CantNotSwapToken(tokenIn, tokenOut); - } - // transfer fee to treasurer - ft.safeTransfer(market.config().treasurer, feeAmt); - - /// @dev callback the changes of ft and xt reserve to trigger - if (address(_orderConfig.swapTrigger) != address(0)) { - uint256 ftReserve = ft.balanceOf(address(this)); - uint256 xtReserve = xt.balanceOf(address(this)); - int256 deltaFt = ftReserve.toInt256() - getInitialFtReserve().toInt256(); - int256 deltaXt = xtReserve.toInt256() - getInitialXtReserve().toInt256(); - _orderConfig.swapTrigger.afterSwap(ftReserve, xtReserve, deltaFt, deltaXt); - } - } else { - if (address(_orderConfig.swapTrigger) != address(0)) { - uint256 ftReserve = ft.balanceOf(address(this)); - uint256 xtReserve = xt.balanceOf(address(this)); - _orderConfig.swapTrigger.afterSwap(ftReserve, xtReserve, 0, 0); - } - } - - emit SwapTokenToExactToken( - tokenIn, tokenOut, msg.sender, recipient, tokenAmtOut, netTokenIn.toUint128(), feeAmt.toUint128() - ); - } - - function _buyExactFt( - uint256 tokenAmtOut, - uint256 maxTokenIn, - address caller, - address recipient, - OrderConfig memory config - ) internal isLendingAllowed(config) returns (uint256 netTokenIn, uint256 feeAmt) { - (netTokenIn, feeAmt) = _buyExactToken(caller, recipient, tokenAmtOut, maxTokenIn, config, _buyExactFtStep); - if (xt.balanceOf(address(this)) > config.maxXtReserve) { - revert XtReserveTooHigh(); - } - } - - function _buyExactXt( - uint256 tokenAmtOut, - uint256 maxTokenIn, - address caller, - address recipient, - OrderConfig memory config - ) internal isBorrowingAllowed(config) returns (uint256 netTokenIn, uint256 feeAmt) { - (netTokenIn, feeAmt) = _buyExactToken(caller, recipient, tokenAmtOut, maxTokenIn, config, _buyExactXtStep); - } - - function _buyExactToken( - address caller, - address recipient, - uint256 tokenAmtOut, - uint256 maxTokenIn, - OrderConfig memory config, - function(uint, uint, uint, OrderConfig memory) internal view returns (uint, uint, IERC20) func - ) internal returns (uint256, uint256) { - uint256 daysToMaturity = _daysToMaturity(); - uint256 oriXtReserve = getInitialXtReserve(); - - (uint256 netTokenIn, uint256 feeAmt, IERC20 tokenOut) = func(daysToMaturity, oriXtReserve, tokenAmtOut, config); - - if (netTokenIn > maxTokenIn) revert UnexpectedAmount(maxTokenIn, netTokenIn); - - debtToken.safeTransferFrom(caller, address(this), netTokenIn); - - debtToken.safeIncreaseAllowance(address(market), netTokenIn); - market.mint(address(this), netTokenIn); - if (tokenOut == ft) { - uint256 ftReserve = getInitialFtReserve(); - _issueFtToSelf(ftReserve + netTokenIn, tokenAmtOut + feeAmt, config); - } - - tokenOut.safeTransfer(recipient, tokenAmtOut); - - return (netTokenIn, feeAmt); - } - - function _buyExactFtStep(uint256 daysToMaturity, uint256 oriXtReserve, uint256 ftAmtOut, OrderConfig memory config) - internal - view - returns (uint256 debtTokenAmtIn, uint256 feeAmt, IERC20 tokenOut) - { - FeeConfig memory feeConfig = config.feeConfig; - CurveCut[] memory cuts = config.curveCuts.borrowCurveCuts; - uint256 nif = Constants.DECIMAL_BASE - uint256(feeConfig.lendTakerFeeRatio); - (uint256 deltaXt, uint256 negDeltaFt) = - TermMaxCurve.buyExactFt(nif, daysToMaturity, cuts, oriXtReserve, ftAmtOut); - debtTokenAmtIn = deltaXt; - feeAmt = (negDeltaFt * (Constants.DECIMAL_BASE + uint256(feeConfig.borrowMakerFeeRatio))) / nif - negDeltaFt; - tokenOut = ft; - } - - function _buyExactXtStep(uint256 daysToMaturity, uint256 oriXtReserve, uint256 xtAmtOut, OrderConfig memory config) - internal - view - returns (uint256 debtTokenAmtIn, uint256 feeAmt, IERC20 tokenOut) - { - FeeConfig memory feeConfig = config.feeConfig; - CurveCut[] memory cuts = config.curveCuts.lendCurveCuts; - uint256 nif = Constants.DECIMAL_BASE + uint256(feeConfig.borrowTakerFeeRatio); - (, uint256 deltaFt) = TermMaxCurve.buyExactXt(nif, daysToMaturity, cuts, oriXtReserve, xtAmtOut); - debtTokenAmtIn = deltaFt; - feeAmt = deltaFt - (deltaFt * (Constants.DECIMAL_BASE - uint256(feeConfig.lendMakerFeeRatio))) / nif; - tokenOut = xt; - } - - function _sellFtForExactToken( - uint256 debtTokenAmtOut, - uint256 maxFtIn, - address caller, - address recipient, - OrderConfig memory config - ) internal isBorrowingAllowed(config) returns (uint256 netIn, uint256 feeAmt) { - (netIn, feeAmt) = - _sellTokenForExactToken(caller, recipient, debtTokenAmtOut, maxFtIn, config, _sellFtForExactTokenStep); - } - - function _sellXtForExactToken( - uint256 debtTokenAmtOut, - uint256 maxXtIn, - address caller, - address recipient, - OrderConfig memory config - ) internal isLendingAllowed(config) returns (uint256 netIn, uint256 feeAmt) { - (netIn, feeAmt) = - _sellTokenForExactToken(caller, recipient, debtTokenAmtOut, maxXtIn, config, _sellXtForExactTokenStep); - if (xt.balanceOf(address(this)) > config.maxXtReserve) { - revert XtReserveTooHigh(); - } - } - - function _sellTokenForExactToken( - address caller, - address recipient, - uint256 debtTokenAmtOut, - uint256 maxTokenIn, - OrderConfig memory config, - function(uint, uint, uint, OrderConfig memory) internal view returns (uint, uint, IERC20) func - ) internal returns (uint256, uint256) { - uint256 daysToMaturity = _daysToMaturity(); - uint256 oriXtReserve = getInitialXtReserve(); - - (uint256 netTokenIn, uint256 feeAmt, IERC20 tokenIn) = - func(daysToMaturity, oriXtReserve, debtTokenAmtOut, config); - - if (netTokenIn > maxTokenIn) revert UnexpectedAmount(maxTokenIn, netTokenIn); - - tokenIn.safeTransferFrom(caller, address(this), netTokenIn); - if (tokenIn == xt) { - uint256 ftReserve = getInitialFtReserve(); - _issueFtToSelf(ftReserve, debtTokenAmtOut + feeAmt, config); - } - market.burn(address(this), recipient, debtTokenAmtOut); - return (netTokenIn, feeAmt); - } - - function _sellFtForExactTokenStep( - uint256 daysToMaturity, - uint256 oriXtReserve, - uint256 debtTokenOut, - OrderConfig memory config - ) internal view returns (uint256 ftAmtIn, uint256 feeAmt, IERC20 tokenIn) { - FeeConfig memory feeConfig = config.feeConfig; - CurveCut[] memory cuts = config.curveCuts.lendCurveCuts; - uint256 nif = Constants.DECIMAL_BASE + uint256(feeConfig.borrowTakerFeeRatio); - - (, uint256 deltaFt) = - TermMaxCurve.sellFtForExactDebtToken(nif, daysToMaturity, cuts, oriXtReserve, debtTokenOut); - ftAmtIn = deltaFt + debtTokenOut; - - feeAmt = deltaFt - (deltaFt * (Constants.DECIMAL_BASE - uint256(feeConfig.lendMakerFeeRatio))) / nif; - tokenIn = ft; - } - - function _sellXtForExactTokenStep( - uint256 daysToMaturity, - uint256 oriXtReserve, - uint256 debtTokenOut, - OrderConfig memory config - ) internal view returns (uint256 xtAmtIn, uint256 feeAmt, IERC20 tokenIn) { - FeeConfig memory feeConfig = config.feeConfig; - CurveCut[] memory cuts = config.curveCuts.borrowCurveCuts; - uint256 nif = Constants.DECIMAL_BASE - uint256(feeConfig.lendTakerFeeRatio); - (uint256 deltaXt, uint256 negDeltaFt) = - TermMaxCurve.sellXtForExactDebtToken(nif, daysToMaturity, cuts, oriXtReserve, debtTokenOut); - xtAmtIn = deltaXt + debtTokenOut; - - feeAmt = (negDeltaFt * (Constants.DECIMAL_BASE + uint256(feeConfig.borrowMakerFeeRatio))) / nif - negDeltaFt; - tokenIn = xt; - } - - /** - * @notice Issue ft by existed gt. - * @notice This fuction will be triggered when ft reserve can not cover the output amount. - */ - function _issueFtToSelf(uint256 ftReserve, uint256 targetFtReserve, OrderConfig memory config) internal { - if (ftReserve >= targetFtReserve) return; - if (config.gtId == 0) revert CantNotIssueFtWithoutGt(); - uint256 debtAmtToIssue = ((targetFtReserve - ftReserve) * Constants.DECIMAL_BASE) - / (Constants.DECIMAL_BASE - market.mintGtFeeRatio()); - market.issueFtByExistedGt(address(this), (debtAmtToIssue).toUint128(), config.gtId); - setInitialFtReserve(targetFtReserve); - } - - function withdrawAssets(IERC20 token, address recipient, uint256 amount) external onlyOwner { - if (token == debtToken) { - market.burn(address(this), recipient, amount); - } else { - token.safeTransfer(recipient, amount); - } - emit WithdrawAssets(token, _msgSender(), recipient, amount); - } - - /** - * @inheritdoc ITermMaxOrder - */ - function pause() external override onlyOwner { - _pause(); - } - - /** - * @inheritdoc ITermMaxOrder - */ - function unpause() external override onlyOwner { - _unpause(); - } -} diff --git a/contracts/access/AccessManager.sol b/contracts/access/AccessManager.sol deleted file mode 100644 index 7924657..0000000 --- a/contracts/access/AccessManager.sol +++ /dev/null @@ -1,201 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {AccessControlUpgradeable} from "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; -import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; -import {ITermMaxMarket} from "contracts/ITermMaxMarket.sol"; -import {ITermMaxFactory} from "contracts/factory/ITermMaxFactory.sol"; -import {ITermMaxRouter} from "contracts/router/ITermMaxRouter.sol"; -import {ITermMaxOrder} from "contracts/ITermMaxOrder.sol"; -import {IOracle} from "contracts/oracle/IOracle.sol"; -import {ITermMaxVault} from "contracts/vault/ITermMaxVault.sol"; -import {MarketConfig, FeeConfig, MarketInitialParams} from "contracts/storage/TermMaxStorage.sol"; - -interface IOwnable { - function transferOwnership(address newOwner) external; - - function acceptOwnership() external; -} - -interface IPausable { - function pause() external; - - function unpause() external; -} - -/** - * @title TermMax Access Manager - * @author Term Structure Labs - */ -contract AccessManager is AccessControlUpgradeable, UUPSUpgradeable { - error CannotRevokeDefaultAdminRole(); - - /// @notice Role to manage switch - bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); - /// @notice Role to manage configuration items - bytes32 public constant CONFIGURATOR_ROLE = keccak256("CONFIGURATOR_ROLE"); - /// @notice Role to manage vault - bytes32 public constant VAULT_ROLE = keccak256("VAULT_ROLE"); - /// @notice Role to manage oracle - bytes32 public constant ORACLE_ROLE = keccak256("ORACLE_ROLE"); - /// @notice Role to manage market - bytes32 public constant MARKET_ROLE = keccak256("MARKET_ROLE"); - - function initialize(address admin) public initializer { - __UUPSUpgradeable_init(); - __AccessControl_init(); - _grantRole(DEFAULT_ADMIN_ROLE, admin); - } - - /// @notice Set GT implementation to the factory - function setGtImplement(ITermMaxFactory factory, string memory gtImplementName, address gtImplement) - external - onlyRole(MARKET_ROLE) - { - factory.setGtImplement(gtImplementName, gtImplement); - } - - /// @notice Deploy a new market - function createMarket( - ITermMaxFactory factory, - bytes32 gtKey, - MarketInitialParams calldata deployParams, - uint256 salt - ) external onlyRole(MARKET_ROLE) returns (address market) { - market = factory.createMarket(gtKey, deployParams, salt); - } - - /// @notice Transfer ownable contract's ownership - function transferOwnership(IOwnable entity, address to) external onlyRole(DEFAULT_ADMIN_ROLE) { - entity.transferOwnership(to); - } - - function acceptOwnership(IOwnable entity) external onlyRole(DEFAULT_ADMIN_ROLE) { - entity.acceptOwnership(); - } - - /// @notice Upgrade the target contract using UUPS - function upgradeSubContract(UUPSUpgradeable proxy, address newImplementation, bytes memory data) - external - onlyRole(DEFAULT_ADMIN_ROLE) - { - proxy.upgradeToAndCall(newImplementation, data); - } - - /// @notice Set the adapter whitelist for router - function setAdapterWhitelist(ITermMaxRouter router, address adapter, bool isWhitelist) - external - onlyRole(MARKET_ROLE) - { - router.setAdapterWhitelist(adapter, isWhitelist); - } - - function submitPendingOracle(IOracle aggregator, address asset, IOracle.Oracle memory oracle) - external - onlyRole(ORACLE_ROLE) - { - aggregator.submitPendingOracle(asset, oracle); - } - - function acceptPendingOracle(IOracle aggregator, address asset) external onlyRole(ORACLE_ROLE) { - aggregator.acceptPendingOracle(asset); - } - - function revokePendingOracle(IOracle aggregator, address asset) external onlyRole(ORACLE_ROLE) { - aggregator.revokePendingOracle(asset); - } - - /// @notice Update the market configuration - function updateMarketConfig(ITermMaxMarket market, MarketConfig calldata newConfig) - external - onlyRole(CONFIGURATOR_ROLE) - { - market.updateMarketConfig(newConfig); - } - - /// @notice Set the configuration of Gearing Token - function updateGtConfig(ITermMaxMarket market, bytes memory configData) external onlyRole(CONFIGURATOR_ROLE) { - market.updateGtConfig(configData); - } - - /// @notice Set the fee rate of an order - function updateOrderFeeRate(ITermMaxMarket market, ITermMaxOrder order, FeeConfig memory feeConfig) - external - onlyRole(CONFIGURATOR_ROLE) - { - market.updateOrderFeeRate(order, feeConfig); - } - - /// @notice Set the switch of an entity - function setSwitch(IPausable entity, bool state) external onlyRole(PAUSER_ROLE) { - if (state) { - entity.unpause(); - } else { - entity.pause(); - } - } - - /// @notice Set the switch of multiple entities - function batchSetSwitch(IPausable[] calldata entities, bool state) external onlyRole(PAUSER_ROLE) { - for (uint256 i = 0; i < entities.length; i++) { - if (state) { - entities[i].unpause(); - } else { - entities[i].pause(); - } - } - } - - function submitVaultGuardian(ITermMaxVault vault, address newGuardian) external onlyRole(VAULT_ROLE) { - vault.submitGuardian(newGuardian); - } - - /// @notice Revoke a pending guardian for the vault - function revokeVaultPendingGuardian(ITermMaxVault vault) external onlyRole(VAULT_ROLE) { - vault.revokePendingGuardian(); - } - - /// @notice Revoke a pending timelock for the vault - function revokeVaultPendingTimelock(ITermMaxVault vault) external onlyRole(VAULT_ROLE) { - vault.revokePendingTimelock(); - } - - /// @notice Revoke a pending market for the vault - function revokeVaultPendingMarket(ITermMaxVault vault, address market) external onlyRole(VAULT_ROLE) { - vault.revokePendingMarket(market); - } - - /// @notice Set the curator for the vault, only admin role - function setCuratorForVault(ITermMaxVault vault, address newCurator) external onlyRole(VAULT_ROLE) { - vault.setCurator(newCurator); - } - - /// @notice Set the allocator for the vault - function setIsAllocatorForVault(ITermMaxVault vault, address allocator, bool isAllocator) - external - onlyRole(VAULT_ROLE) - { - vault.setIsAllocator(allocator, isAllocator); - } - - /// @notice Revoke role - /// @dev Can't revoke your own role - function revokeRole(bytes32 role, address account) public override onlyRole(getRoleAdmin(role)) { - if (msg.sender == account) { - revert AccessControlBadConfirmation(); - } - - _revokeRole(role, account); - } - - /// @notice Revoke role - /// @dev Can't revoke default admin role - function renounceRole(bytes32 role, address callerConfirmation) public override { - if (role == DEFAULT_ADMIN_ROLE) { - revert CannotRevokeDefaultAdminRole(); - } - _revokeRole(role, callerConfirmation); - } - - function _authorizeUpgrade(address newImplementation) internal virtual override onlyRole(DEFAULT_ADMIN_ROLE) {} -} diff --git a/contracts/errors/FactoryErrors.sol b/contracts/errors/FactoryErrors.sol deleted file mode 100644 index 94ace3a..0000000 --- a/contracts/errors/FactoryErrors.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title Factory Errors Interface - * @notice Custom errors for the TermMax factory operations - */ -interface FactoryErrors { - /** - * @notice Error thrown when attempting to initialize with an invalid implementation - */ - error InvalidImplementation(); - - /** - * @notice Error thrown when a requested Gearing Token implementation cannot be found - * @dev This occurs when trying to use a GT implementation that hasn't been registered - */ - error CantNotFindGtImplementation(); -} diff --git a/contracts/errors/GearingTokenErrors.sol b/contracts/errors/GearingTokenErrors.sol deleted file mode 100644 index 46ff504..0000000 --- a/contracts/errors/GearingTokenErrors.sol +++ /dev/null @@ -1,48 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -interface GearingTokenErrors { - /// @notice Error for merge loans have different owners - /// @param id The id of Gearing Token has different owner - /// @param diffOwner The different owner - error CanNotMergeLoanWithDiffOwner(uint256 id, address diffOwner); - /// @notice Error for liquidate loan when Gearing Token don't support liquidation - error GtDoNotSupportLiquidation(); - /// @notice Error for repay the loan after maturity day - /// @param id The id of Gearing Token - error GtIsExpired(uint256 id); - /// @notice Error for liquidate loan when its ltv less than liquidation threshhold - /// @param id The id of Gearing Token - error GtIsSafe(uint256 id); - /// @notice Error for the ltv of loan is bigger than maxium ltv - /// @param id The id of Gearing Token - /// @param owner The owner of Gearing Token - /// @param ltv The loan to value - error GtIsNotHealthy(uint256 id, address owner, uint128 ltv); - /// @notice Error for the ltv increase after liquidation - /// @param id The id of Gearing Token - /// @param ltvBefore Loan to value before liquidation - /// @param ltvAfter Loan to value after liquidation - error LtvIncreasedAfterLiquidation(uint256 id, uint128 ltvBefore, uint128 ltvAfter); - /// @notice Error for unauthorized operation - /// @param id The id of Gearing Token - error CallerIsNotTheOwner(uint256 id); - /// @notice Error for liquidate the loan with invalid repay amount - /// @param id The id of Gearing Token - /// @param repayAmt The id of Gearing Token - /// @param maxRepayAmt The maxium repay amount when liquidating or repaying - error RepayAmtExceedsMaxRepayAmt(uint256 id, uint128 repayAmt, uint128 maxRepayAmt); - /// @notice Error for liquidate the loan after liquidation window - error CanNotLiquidationAfterFinalDeadline(uint256 id, uint256 liquidationDeadline); - /// @notice Error for debt value less than minimal limit - /// @param debtValue The debtValue is USD, decimals 1e8 - error DebtValueIsTooSmall(uint256 debtValue); - /// @notice Error for unauthorized operation - /// @param id The id of Gearing Token - /// @param caller The caller - error AuthorizationFailed(uint256 id, address caller); - /** - * @notice Error thrown when the liquidation LTV is less than the max LTV - */ - error LiquidationLtvMustBeGreaterThanMaxLtv(); -} diff --git a/contracts/errors/MarketErrors.sol b/contracts/errors/MarketErrors.sol deleted file mode 100644 index c3a78e4..0000000 --- a/contracts/errors/MarketErrors.sol +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title Market Errors Interface - * @notice Custom errors for the TermMax market operations - */ -interface MarketErrors { - /** - * @notice Error thrown when a fee rate is set higher than the maximum allowed - */ - error FeeTooHigh(); - - /** - * @notice Error thrown when the maturity date is invalid - * @dev This could be due to maturity being in the past or too far in the future - */ - error InvalidMaturity(); - - /** - * @notice Error thrown when trying to use the same token as both collateral and underlying - * @dev Collateral and underlying must be different tokens for market safety - */ - error CollateralCanNotEqualUnderlyinng(); - - /** - * @notice Error thrown when trying to interact with a market before its trading period begins - */ - error TermIsNotOpen(); - - /** - * @notice Error thrown when attempting to redeem before the final liquidation deadline - * @param liquidationDeadline The timestamp after which redemption is allowed - */ - error CanNotRedeemBeforeFinalLiquidationDeadline(uint256 liquidationDeadline); -} diff --git a/contracts/errors/OrderErrors.sol b/contracts/errors/OrderErrors.sol deleted file mode 100644 index a89ff8e..0000000 --- a/contracts/errors/OrderErrors.sol +++ /dev/null @@ -1,90 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; - -/** - * @title Order Errors Interface - * @notice Custom errors for the TermMax order operations - */ -interface OrderErrors { - /** - * @notice Error thrown when attempting to interact with an order before its term is open - */ - error TermIsNotOpen(); - - /** - * @notice Error thrown when attempting to swap between unsupported token pairs - * @param tokenIn The input token - * @param tokenOut The output token - */ - error CantNotSwapToken(IERC20 tokenIn, IERC20 tokenOut); - - /** - * @notice Error thrown when attempting to swap a token for itself - */ - error CantSwapSameToken(); - - /** - * @notice Error thrown when attempting to issue FT without a corresponding GT - */ - error CantNotIssueFtWithoutGt(); - - /** - * @notice Error thrown when the curve cuts parameters are invalid - */ - error InvalidCurveCuts(); - - /** - * @notice Error thrown when borrowing is not allowed in the current state - */ - error BorrowIsNotAllowed(); - - /** - * @notice Error thrown when lending is not allowed in the current state - */ - error LendIsNotAllowed(); - - /** - * @notice Error thrown when a non-market attempts to perform a market-only action - */ - error OnlyMarket(); - - /** - * @notice Error thrown when a swap transaction is submitted after its deadline - */ - error DeadlineExpired(); - - /** - * @notice Error thrown when the XT reserve exceeds the maximum allowed - */ - error XtReserveTooHigh(); - - /** - * @notice Error thrown when the actual output amount doesn't match the expected amount - * @param expectedAmt The expected amount - * @param actualAmt The actual amount received - */ - error UnexpectedAmount(uint256 expectedAmt, uint256 actualAmt); - - /** - * @notice Error thrown when attempting to redeem before the final liquidation deadline - * @param liquidationDeadline The timestamp after which redemption is allowed - */ - error CanNotRedeemBeforeFinalLiquidationDeadline(uint256 liquidationDeadline); - - /** - * @notice Error thrown when attempting an operation that requires evacuation mode when it's not active - */ - error EvacuationIsNotActived(); - - /** - * @notice Error thrown when attempting an operation that's not allowed during evacuation mode - */ - error EvacuationIsActived(); - - /** - * @notice Error thrown when there isn't enough excess FT or XT to complete a withdrawal - */ - error NotEnoughFtOrXtToWithdraw(); -} diff --git a/contracts/errors/RouterErrors.sol b/contracts/errors/RouterErrors.sol deleted file mode 100644 index 577bbd8..0000000 --- a/contracts/errors/RouterErrors.sol +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -interface RouterErrors { - /// @notice Error for calling the orders and trading amts length not match - error OrdersAndAmtsLengthNotMatch(); - /// @notice Error for calling the market is not whitelisted - error MarketNotWhitelisted(address market); - /// @notice Error for calling the gt is not whitelisted - error GtNotWhitelisted(address gt); - /// @notice Error for calling the adapter is not whitelisted - error AdapterNotWhitelisted(address adapter); - /// @notice Error for the final loan to collateral is bigger than expected - error LtvBiggerThanExpected(uint128 expectedLtv, uint128 actualLtv); - /// @notice Error for approving token failed when swapping - error ApproveTokenFailWhenSwap(address token, bytes revertData); - /// @notice Error for failed swapping - error SwapFailed(address adapter, bytes revertData); - /// @notice Error for the token output is less than expected - error InsufficientTokenOut(address token, uint256 expectedTokenOut, uint256 actualTokenOut); - /// @notice Error for the token input is less than expected - error InsufficientTokenIn(address token, uint256 expectedTokenIn, uint256 actualTokenIn); - /// @notice Error for the gt is not owned by the sender - error GtNotOwnedBySender(); - /// @notice Error for the swap units is empty - error SwapUnitsIsEmpty(); -} diff --git a/contracts/errors/TermMaxTokenErrors.sol b/contracts/errors/TermMaxTokenErrors.sol deleted file mode 100644 index c197dc1..0000000 --- a/contracts/errors/TermMaxTokenErrors.sol +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -interface TermMaxTokenErrors { - error InvalidToken(); - error InsufficientIncomeAmount(uint256 availableAmount, uint256 requestedAmount); - error AaveWithdrawFailed(uint256 aTokenAmount, uint256 recieivedAmount); - - /// @notice Error thrown when trying to accept a change that has no pending value - error NoPendingValue(); - - /// @notice Error thrown when trying to accept a change before the timelock period has elapsed - error TimelockNotElapsed(); - - /// @notice Error thrown when attempting to submit a change that's already pending - error AlreadyPending(); - - /// @notice Error thrown when the implementation address is invalid - error InvalidImplementation(); -} diff --git a/contracts/errors/VaultErrors.sol b/contracts/errors/VaultErrors.sol deleted file mode 100644 index 25941e4..0000000 --- a/contracts/errors/VaultErrors.sol +++ /dev/null @@ -1,134 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title Vault Errors Interface - * @notice Custom errors for the TermMax vault operations - */ -interface VaultErrors { - error InvalidImplementation(); - /** - * @notice Error thrown when attempting to interact with a vault without its proxy - */ - error OnlyProxy(); - - /** - * @notice Error thrown when attempting to interact with a non-whitelisted market - */ - error MarketNotWhitelisted(); - - /** - * @notice Error thrown when trying to deal with bad debt that doesn't exist - * @param collateral The address of the collateral token - */ - error NoBadDebt(address collateral); - - /** - * @notice Error thrown when attempting to withdraw more funds than available - * @param maxWithdraw The maximum amount that can be withdrawn - * @param expectedWithdraw The amount attempted to withdraw - */ - error InsufficientFunds(uint256 maxWithdraw, uint256 expectedWithdraw); - - /** - * @notice Error thrown when the locked FT amount exceeds the total FT - */ - error LockedFtGreaterThanTotalFt(); - - /** - * @notice Error thrown when attempting to set a performance fee rate beyond the maximum allowed - */ - error PerformanceFeeRateExceeded(); - - /** - * @notice Error thrown when there's an asset mismatch in an operation - */ - error InconsistentAsset(); - - /** - * @notice Error thrown when trying to accept a change that has no pending value - */ - error NoPendingValue(); - - /** - * @notice Error thrown when trying to accept a change before the timelock period has elapsed - */ - error TimelockNotElapsed(); - - /** - * @notice Error thrown when attempting to set a timelock period above the maximum - */ - error AboveMaxTimelock(); - - /** - * @notice Error thrown when attempting to set a timelock period below the minimum - */ - error BelowMinTimelock(); - - /** - * @notice Error thrown when attempting to set a value that's already set - */ - error AlreadySet(); - - /** - * @notice Error thrown when attempting to submit a change that's already pending - */ - error AlreadyPending(); - - /** - * @notice Error thrown when attempting to exceed the maximum queue length - */ - error MaxQueueLengthExceeded(); - - /** - * @notice Error thrown when a non-curator attempts to perform a curator-only action - */ - error NotCuratorRole(); - - /** - * @notice Error thrown when a non-allocator attempts to perform an allocator-only action - */ - error NotAllocatorRole(); - - /** - * @notice Error thrown when a non-guardian attempts to perform a guardian-only action - */ - error NotGuardianRole(); - - /** - * @notice Error thrown when attempting to set the capacity to zero - */ - error CapacityCannotSetToZero(); - - /** - * @notice Error thrown when attempting to set capacity below the currently used amount - */ - error CapacityCannotLessThanUsed(); - - /** - * @notice Error thrown when an unauthorized order attempts to interact with the vault - * @param orderAddress The address of the unauthorized order - */ - error UnauthorizedOrder(address orderAddress); - - /** - * @notice Error thrown when the supply queue length doesn't match the expected length - */ - error SupplyQueueLengthMismatch(); - - /** - * @notice Error thrown when the withdraw queue length doesn't match the expected length - */ - error WithdrawQueueLengthMismatch(); - - /** - * @notice Error thrown when attempting to add a duplicate order to a queue - * @param orderAddress The address of the duplicate order - */ - error DuplicateOrder(address orderAddress); - - /** - * @notice Error thrown when an order has negative interest - */ - error OrderHasNegativeInterest(); -} diff --git a/contracts/events/FactoryEvents.sol b/contracts/events/FactoryEvents.sol deleted file mode 100644 index 33dc3d2..0000000 --- a/contracts/events/FactoryEvents.sol +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {VaultInitialParams} from "contracts/storage/TermMaxStorage.sol"; - -/** - * @title Factory Events Interface - * @notice Events emitted by the TermMax factory contracts - */ -interface FactoryEvents { - /** - * @notice Emitted when a new Gearing Token implementation is set - * @param key The unique identifier for the GT implementation - * @param gtImplement The address of the GT implementation contract - */ - event SetGtImplement(bytes32 key, address gtImplement); - - /** - * @notice Emitted when a new market is created - * @param market The address of the newly created market - * @param collateral The address of the collateral token - * @param debtToken The debt token interface - */ - event CreateMarket(address indexed market, address indexed collateral, IERC20 indexed debtToken); - - /** - * @notice Emitted when a new vault is created - * @param vault The address of the newly created vault - * @param creator The address of the vault creator - * @param initialParams The initial parameters used to configure the vault - */ - event CreateVault(address indexed vault, address indexed creator, VaultInitialParams indexed initialParams); -} diff --git a/contracts/events/GearingTokenEvents.sol b/contracts/events/GearingTokenEvents.sol deleted file mode 100644 index 352d57c..0000000 --- a/contracts/events/GearingTokenEvents.sol +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -interface GearingTokenEvents { - /// @notice Emitted when a new Gearing Token is initialized - event GearingTokenInitialized(address indexed market, string name, string symbol, bytes initialData); - - /// @notice Emitted when updating the configuration - event UpdateConfig(bytes configData); - - /// @notice Emitted when Debt is augmented - /// @param id The id of Gearing Token - /// @param ftAmt The amount of debt augmented - event AugmentDebt(uint256 indexed id, uint256 ftAmt); - - /// @notice Emitted when merging multiple Gearing Tokens into one - /// @param owner The owner of those tokens - /// @param newId The id of new Gearing Token - /// @param ids The array of Gearing Tokens id were merged - event MergeGts(address indexed owner, uint256 indexed newId, uint256[] ids); - - /// @notice Emitted when removing collateral from the loan - /// @param id The id of Gearing Token - /// @param newCollateralData Collateral data after removal - event RemoveCollateral(uint256 indexed id, bytes newCollateralData); - - /// @notice Emitted when adding collateral to the loan - /// @param id The id of Gearing Token - /// @param newCollateralData Collateral data after additional - event AddCollateral(uint256 indexed id, bytes newCollateralData); - - /// @notice Emitted when repaying the debt of Gearing Token - /// @param id The id of Gearing Token - /// @param repayAmt The amount of debt repaid - /// @param byDebtToken Repay using debtToken token or bonds token - /// @param repayAll Repay all the debt - event Repay(uint256 indexed id, uint256 repayAmt, bool byDebtToken, bool repayAll); - - event FlashRepay( - uint256 indexed id, - address indexed caller, - uint128 repayAmt, - bool byDebtToken, - bool repayAll, - bytes removedCollateral - ); - - /// @notice Emitted when liquidating Gearing Token - /// @param id The id of Gearing Token - /// @param liquidator The liquidator - /// @param repayAmt The amount of debt liquidated - /// @param cToLiquidator Collateral data assigned to liquidator - /// @param cToTreasurer Collateral data assigned to protocol - /// @param remainningC Remainning collateral data - event Liquidate( - uint256 indexed id, - address indexed liquidator, - uint128 repayAmt, - bool byDebtToken, - bytes cToLiquidator, - bytes cToTreasurer, - bytes remainningC - ); -} diff --git a/contracts/events/MarketEvents.sol b/contracts/events/MarketEvents.sol deleted file mode 100644 index 44f74b5..0000000 --- a/contracts/events/MarketEvents.sol +++ /dev/null @@ -1,131 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IMintableERC20, IERC20} from "../tokens/IMintableERC20.sol"; -import {IGearingToken} from "../tokens/IGearingToken.sol"; -import {ITermMaxOrder} from "../ITermMaxOrder.sol"; -import {MarketConfig} from "../storage/TermMaxStorage.sol"; - -/** - * @title Market Events Interface - * @notice Events emitted by the TermMax market operations - */ -interface MarketEvents { - /** - * @notice Emitted when a market is initialized - * @param collateral The collateral token address - * @param underlying The underlying token address - * @param maturity The unix timestamp of the maturity date - * @param ft The TermMax Market FT token - * @param xt The TermMax Market XT token - * @param gt The Gearing token - */ - event MarketInitialized( - address indexed collateral, - IERC20 indexed underlying, - uint64 maturity, - IMintableERC20 ft, - IMintableERC20 xt, - IGearingToken gt - ); - - /** - * @notice Emitted when the market configuration is updated - * @param config The new market configuration - */ - event UpdateMarketConfig(MarketConfig config); - - /** - * @notice Emitted when tokens are minted - * @param caller The address initiating the mint - * @param receiver The address receiving the minted tokens - * @param amount The amount of tokens minted - */ - event Mint(address indexed caller, address indexed receiver, uint256 amount); - - /** - * @notice Emitted when tokens are burned - * @param caller The address initiating the burn - * @param receiver The address whose tokens are burned - * @param amount The amount of tokens burned - */ - event Burn(address indexed caller, address indexed receiver, uint256 amount); - - /** - * @notice Emitted when a leveraged position is created - * @param loanReceiver The address receiving the loan - * @param gtReceiver The address receiving the Gearing Token - * @param gtId The ID of the Gearing Token - * @param debtAmt The amount of debt in underlying token - * @param xtAmt The amount of XT token - * @param fee The amount of minting gt fee, unit by FT token - * @param collateralData The encoded collateral data - */ - event LeverageByXt( - address indexed loanReceiver, - address indexed gtReceiver, - uint256 indexed gtId, - uint128 debtAmt, - uint256 xtAmt, - uint128 fee, - bytes collateralData - ); - - /** - * @notice Emitted when FT is issued using collateral - * @param caller The address initiating the issuance - * @param recipient The address receiving the FT - * @param gtId The ID of the Gearing Token - * @param debtAmt The amount of debt in underlying token - * @param ftAmt The amount of FT issued - * @param fee The amount of minting gt fee, unit by FT token - * @param collateralData The encoded collateral data - */ - event IssueFt( - address indexed caller, - address indexed recipient, - uint256 indexed gtId, - uint128 debtAmt, - uint128 ftAmt, - uint128 fee, - bytes collateralData - ); - - /** - * @notice Emitted when FT is issued using existed Gearing Token - * @param caller The address initiating the issuance - * @param recipient The address receiving the FT - * @param gtId The ID of the Gearing Token - * @param debtAmt The amount of debt in underlying token - * @param ftAmt The amount of FT issued - * @param issueFee The amount of issuing fee, unit by FT token - */ - event IssueFtByExistedGt( - address indexed caller, - address indexed recipient, - uint256 indexed gtId, - uint128 debtAmt, - uint128 ftAmt, - uint128 issueFee - ); - - /** - * @notice Emitted when tokens are redeemed - * @param caller The address initiating the redemption - * @param recipient The address receiving the redeemed tokens - * @param proportion The proportion of underlying token and collateral should be deliveried - * base 1e16 decimals - * @param underlyingAmt The amount of underlying received - * @param deliveryData The encoded data of collateral received - */ - event Redeem( - address indexed caller, address indexed recipient, uint128 proportion, uint128 underlyingAmt, bytes deliveryData - ); - - /** - * @notice Emitted when an order is created - * @param maker The maker of the order - * @param order The order - */ - event CreateOrder(address indexed maker, ITermMaxOrder indexed order); -} diff --git a/contracts/events/OrderEvents.sol b/contracts/events/OrderEvents.sol deleted file mode 100644 index 7db1f33..0000000 --- a/contracts/events/OrderEvents.sol +++ /dev/null @@ -1,108 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IERC20, ITermMaxMarket} from "../ITermMaxMarket.sol"; -import {CurveCuts, FeeConfig} from "../storage/TermMaxStorage.sol"; -import {ISwapCallback} from "../ISwapCallback.sol"; - -/** - * @title Order Events Interface - * @notice Events emitted by the TermMax order operations - */ -interface OrderEvents { - /** - * @notice Emitted when an order is initialized - * @param market The market address - * @param maker The maker address - * @param maxXtReserve The maximum XT reserve - * @param swapTrigger The swap callback contract - * @param curveCuts The curve parameters - */ - event OrderInitialized( - ITermMaxMarket indexed market, - address indexed maker, - uint256 maxXtReserve, - ISwapCallback swapTrigger, - CurveCuts curveCuts - ); - - /** - * @notice Emitted when the fee configuration is updated - * @param feeConfig The new fee configuration - */ - event UpdateFeeConfig(FeeConfig feeConfig); - - /** - * @notice Emitted when an order is updated - * @param curveCuts The new curve parameters - * @param ftChangeAmt The change in FT reserves - * @param xtChangeAmt The change in XT reserves - * @param gtId The global trade ID - * @param maxXtReserve The new maximum XT reserve - * @param swapTrigger The swap callback contract - */ - event UpdateOrder( - CurveCuts curveCuts, - int256 ftChangeAmt, - int256 xtChangeAmt, - uint256 gtId, - uint256 maxXtReserve, - ISwapCallback swapTrigger - ); - - /** - * @notice Emitted when a swap occurs - * @param tokenIn The token being swapped in - * @param tokenOut The token being swapped out - * @param caller The address initiating the swap - * @param recipient The address receiving the swapped tokens - * @param tokenAmtIn The amount of tokenIn being swapped - * @param netTokenOut The amount of tokenOut being received - * @param feeAmt The amount of fee being paid - */ - event SwapExactTokenToToken( - IERC20 indexed tokenIn, - IERC20 indexed tokenOut, - address caller, - address recipient, - uint128 tokenAmtIn, - uint128 netTokenOut, - uint128 feeAmt - ); - - /** - * @notice Emitted when a swap occurs - * @param tokenIn The token being swapped in - * @param tokenOut The token being swapped out - * @param caller The address initiating the swap - * @param recipient The address receiving the swapped tokens - * @param tokenAmtOut The amount of tokenOut being received - * @param netTokenIn The amount of tokenIn being swapped - * @param feeAmt The amount of fee being paid - */ - event SwapTokenToExactToken( - IERC20 indexed tokenIn, - IERC20 indexed tokenOut, - address caller, - address recipient, - uint128 tokenAmtOut, - uint128 netTokenIn, - uint128 feeAmt - ); - - /** - * @notice Emitted when assets are withdrawn - * @param token The token being withdrawn - * @param caller The address initiating the withdrawal - * @param recipient The address receiving the withdrawn tokens - * @param amount The amount of tokens being withdrawn - */ - event WithdrawAssets(IERC20 indexed token, address indexed caller, address indexed recipient, uint256 amount); - - /** - * @notice Emitted when maker ownership is transferred - * @param oldMaker The address of the previous maker - * @param newMaker The address of the new maker - */ - event MakerOwnershipTransferred(address oldMaker, address newMaker); -} diff --git a/contracts/events/RouterEvents.sol b/contracts/events/RouterEvents.sol deleted file mode 100644 index 7b1e85b..0000000 --- a/contracts/events/RouterEvents.sol +++ /dev/null @@ -1,181 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {ITermMaxMarket} from "../ITermMaxMarket.sol"; -import {ITermMaxOrder} from "../ITermMaxOrder.sol"; -import {CurveCuts} from "../storage/TermMaxStorage.sol"; - -/** - * @title Router Events Interface - * @notice Events emitted by the TermMax router operations - */ -interface RouterEvents { - /** - * @notice Emitted when a market's whitelist status is updated - * @param market The address of the market - * param isWhitelist Whether the market is whitelisted - */ - event UpdateMarketWhiteList(address market, bool isWhitelist); - - /** - * @notice Emitted when a swap adapter's whitelist status is updated - * @param adapter The address of the swap adapter - * @param isWhitelist Whether the adapter is whitelisted - */ - event UpdateSwapAdapterWhiteList(address adapter, bool isWhitelist); - - /** - * @notice Emitted when tokens are swapped for exact tokens - * @param tokenIn The input token - * @param tokenOut The output token - * @param caller The address initiating the swap - * @param recipient The address receiving the output tokens - * @param orders The array of orders used in the swap - * @param tradingAmts The array of trading amounts - * @param actualTokenOut The actual amount of output tokens - */ - event SwapExactTokenToToken( - IERC20 indexed tokenIn, - IERC20 indexed tokenOut, - address caller, - address recipient, - ITermMaxOrder[] orders, - uint128[] tradingAmts, - uint256 actualTokenOut - ); - - /** - * @notice Emitted when tokens are swapped for exact tokens - * @param tokenIn The input token - * @param tokenOut The output token - * @param caller The address initiating the swap - * @param recipient The address receiving the output tokens - * @param orders The array of orders used in the swap - * @param tradingAmts The array of trading amounts - * @param actualTokenIn The actual amount of input tokens - */ - event SwapTokenToExactToken( - IERC20 indexed tokenIn, - IERC20 indexed tokenOut, - address caller, - address recipient, - ITermMaxOrder[] orders, - uint128[] tradingAmts, - uint256 actualTokenIn - ); - - /** - * @notice Emitted when tokens are sold - * @param market The address of the market - * @param caller The address initiating the sale - * @param recipient The address receiving the output tokens - * @param ftInAmt The amount of ft tokens sold - * @param xtInAmt The amount of xt tokens sold - * @param orders The array of orders used in the sale - * @param amtsToSellTokens The array of amounts to sell tokens - * @param actualTokenOut The actual amount of output tokens - */ - event SellTokens( - ITermMaxMarket indexed market, - address caller, - address recipient, - uint128 ftInAmt, - uint128 xtInAmt, - ITermMaxOrder[] orders, - uint128[] amtsToSellTokens, - uint256 actualTokenOut - ); - - /** - * @notice Emitted when a new gt is issued - * @param market The address of the market - * @param gtId The id of the gt - * @param caller The address initiating the issue - * @param recipient The address receiving the gt - * @param debtTokenAmtIn The amount of debt tokens used to issue the gt - * @param xtAmtIn The amount of xt tokens used to issue the gt - * @param ltv The loan to value ratio - * @param collData The collateral data - */ - event IssueGt( - ITermMaxMarket indexed market, - uint256 indexed gtId, - address caller, - address recipient, - uint128 debtTokenAmtIn, - uint128 xtAmtIn, - uint128 ltv, - bytes collData - ); - - /** - * @notice Emitted when a borrow operation is performed - * @param market The address of the market - * @param gtId The id of the gt - * @param caller The address initiating the borrow - * @param recipient The address receiving the borrowed tokens - * @param collInAmt The amount of collateral tokens used - * @param actualDebtAmt The actual amount of debt tokens borrowed - * @param borrowAmt The amount of tokens borrowed - */ - event Borrow( - ITermMaxMarket indexed market, - uint256 indexed gtId, - address caller, - address recipient, - uint256 collInAmt, - uint128 actualDebtAmt, - uint128 borrowAmt - ); - - /** - * @notice Emitted when a repay operation is performed through ft - * @param market The address of the market - * @param gtId The id of the gt - * @param caller The address initiating the repay - * @param recipient The address receiving the repaid tokens - * @param repayAmt The amount of tokens repaid - * @param returnAmt The amount of tokens returned - */ - event RepayByTokenThroughFt( - ITermMaxMarket indexed market, - uint256 indexed gtId, - address caller, - address recipient, - uint256 repayAmt, - uint256 returnAmt - ); - - /** - * @notice Emitted when a redeem and swap operation is performed - * @param market The address of the market - * @param ftAmount The amount of ft tokens redeemed - * @param caller The address initiating the redeem and swap - * @param recipient The address receiving the output tokens - * @param actualTokenOut The actual amount of output tokens - */ - event RedeemAndSwap( - ITermMaxMarket indexed market, uint256 ftAmount, address caller, address recipient, uint256 actualTokenOut - ); - - /** - * @notice Emitted when an order is created and deposited - * @param market The address of the market - * @param order The order created - * @param maker The address of the maker - * @param debtTokenToDeposit The amount of debt tokens deposited - * @param ftToDeposit The amount of ft tokens deposited - * @param xtToDeposit The amount of xt tokens deposited - * @param curveCuts The curve cuts used - */ - event CreateOrderAndDeposit( - ITermMaxMarket indexed market, - ITermMaxOrder indexed order, - address maker, - uint256 debtTokenToDeposit, - uint128 ftToDeposit, - uint128 xtToDeposit, - CurveCuts curveCuts - ); -} diff --git a/contracts/events/TermMaxTokenEvents.sol b/contracts/events/TermMaxTokenEvents.sol deleted file mode 100644 index 793bb39..0000000 --- a/contracts/events/TermMaxTokenEvents.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -interface TermMaxTokenEvents { - event TermMaxTokenInitialized(address indexed admin, address indexed underlying); - event Mint(address indexed to, uint256 amount); - event Burn(address indexed to, uint256 amount); - event WithdrawIncome(address indexed to, uint256 amount); - event UpdateBufferConfig(uint256 minimumBuffer, uint256 maximumBuffer, uint256 buffer); - - /// @notice Event emitted when a new implementation upgrade is submitted with timelock - event SubmitUpgrade(address indexed newImplementation, uint64 validAt); - - /// @notice Event emitted when a pending upgrade is accepted - event AcceptUpgrade(address indexed caller, address indexed newImplementation); - - /// @notice Event emitted when a pending upgrade is revoked - event RevokeUpgrade(address indexed caller); -} diff --git a/contracts/events/VaultEvents.sol b/contracts/events/VaultEvents.sol deleted file mode 100644 index cb1f43f..0000000 --- a/contracts/events/VaultEvents.sol +++ /dev/null @@ -1,199 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {CurveCuts} from "../storage/TermMaxStorage.sol"; - -/** - * @title Vault Events Interface - * @notice Events emitted by the TermMax vault operations - */ -interface VaultEvents { - /** - * @notice Emitted when a new guardian is proposed - * @param newGuardian The address of the proposed guardian - * @param validAt The timestamp when the guardian change will take effect - */ - event SubmitGuardian(address newGuardian, uint64 validAt); - - /** - * @notice Emitted when the vault capacity is updated - * @param caller The address that initiated the capacity update - * @param newCapacity The new capacity value - */ - event SetCapacity(address indexed caller, uint256 newCapacity); - - /** - * @notice Emitted when a new curator is set - * @param newCurator The address of the new curator - */ - event SetCurator(address newCurator); - - /** - * @notice Emitted when a market's whitelist status is proposed - * @param market The address of the market - * @param validAt The timestamp when the market whitelist change will take effect - */ - event SubmitMarketToWhitelist(address indexed market, uint64 validAt); - - /** - * @notice Emitted when a pending market whitelist change is revoked - * @param caller The address that initiated the revocation - * @param market The address of the market - */ - event RevokePendingMarket(address indexed caller, address indexed market); - - /** - * @notice Emitted when the performance fee rate is updated - * @param caller The address that initiated the update - * @param newPerformanceFeeRate The new performance fee rate - */ - event SetPerformanceFeeRate(address indexed caller, uint256 newPerformanceFeeRate); - - /** - * @notice Emitted when a new performance fee rate is proposed - * @param newPerformanceFeeRate The proposed performance fee rate - * @param validAt The timestamp when the performance fee rate change will take effect - */ - event SubmitPerformanceFeeRate(uint256 newPerformanceFeeRate, uint64 validAt); - - /** - * @notice Emitted when a market's whitelist status is updated - * @param caller The address that initiated the update - * @param market The address of the market - * @param isWhitelisted The new whitelist status - */ - event SetMarketWhitelist(address indexed caller, address indexed market, bool isWhitelisted); - - /** - * @notice Emitted when a new order is created - * @param caller The address that created the order - * @param market The market address - * @param order The order address - * @param maxSupply The maximum supply for the order - * @param initialReserve The initial reserve amount - * @param curveCuts The curve parameters for the order - */ - event CreateOrder( - address indexed caller, - address indexed market, - address indexed order, - uint256 maxSupply, - uint256 initialReserve, - CurveCuts curveCuts - ); - - /** - * @notice Emitted when an order is updated - * @param caller The address that updated the order - * @param order The order address - * @param changes The changes made to the order - * @param maxSupply The new maximum supply for the order - * @param curveCuts The updated curve parameters for the order - */ - event UpdateOrder( - address indexed caller, address indexed order, int256 changes, uint256 maxSupply, CurveCuts curveCuts - ); - - /** - * @notice Emitted when bad debt is dealt with - * @param caller The address that initiated the bad debt deal - * @param recipient The address that received the bad debt - * @param collateral The collateral address - * @param badDebt The amount of bad debt - * @param shares The number of shares - * @param collateralOut The amount of collateral out - */ - event DealBadDebt( - address indexed caller, - address indexed recipient, - address indexed collateral, - uint256 badDebt, - uint256 shares, - uint256 collateralOut - ); - - /** - * @notice Emitted when an order is redeemed - * @param caller The address that redeemed the order - * @param order The order address - * @param ftAmt The amount of ft tokens - * @param redeemedAmt The amount redeemed - */ - event RedeemOrder(address indexed caller, address indexed order, uint128 ftAmt, uint128 redeemedAmt); - - /** - * @notice Emitted when performance fee is withdrawn - * @param caller The address that withdrew the performance fee - * @param recipient The address that received the performance fee - * @param amount The amount of performance fee withdrawn - */ - event WithdrawPerformanceFee(address indexed caller, address indexed recipient, uint256 amount); - - /** - * @notice Emitted when a new timelock is proposed - * @param newTimelock The proposed timelock value - * @param validAt The timestamp when the timelock change will take effect - */ - event SubmitTimelock(uint256 newTimelock, uint64 validAt); - - /** - * @notice Emitted when the timelock is updated - * @param caller The address that updated the timelock - * @param newTimelock The new timelock value - */ - event SetTimelock(address indexed caller, uint256 newTimelock); - - /** - * @notice Emitted when the guardian is updated - * @param caller The address that updated the guardian - * @param newGuardian The new guardian address - */ - event SetGuardian(address indexed caller, address newGuardian); - - /** - * @notice Emitted when a pending timelock change is revoked - * @param caller The address that initiated the revocation - */ - event RevokePendingTimelock(address indexed caller); - - /** - * @notice Emitted when a pending guardian change is revoked - * @param caller The address that initiated the revocation - */ - event RevokePendingGuardian(address indexed caller); - - /** - * @notice Emitted when the performance fee rate is proposed to be revoked - * @param caller The address that initiated the revocation - */ - event RevokePendingPerformanceFeeRate(address indexed caller); - - /** - * @notice Emitted when the cap for an order is updated - * @param caller The address that updated the cap - * @param order The order address - * @param newCap The new cap value - */ - event SetCap(address indexed caller, address indexed order, uint256 newCap); - - /** - * @notice Emitted when an allocator's status is updated - * @param allocator The allocator address - * @param newIsAllocator The new allocator status - */ - event SetIsAllocator(address indexed allocator, bool newIsAllocator); - - /** - * @notice Emitted when the supply queue is updated - * @param caller The address that updated the supply queue - * @param newSupplyQueue The new supply queue - */ - event UpdateSupplyQueue(address indexed caller, address[] newSupplyQueue); - - /** - * @notice Emitted when the withdraw queue is updated - * @param caller The address that updated the withdraw queue - * @param newWithdrawQueue The new withdraw queue - */ - event UpdateWithdrawQueue(address indexed caller, address[] newWithdrawQueue); -} diff --git a/contracts/extensions/aave/IAaveV3Minimal.sol b/contracts/extensions/aave/IAaveV3Minimal.sol deleted file mode 100644 index 56d979f..0000000 --- a/contracts/extensions/aave/IAaveV3Minimal.sol +++ /dev/null @@ -1,94 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -interface IAaveV3Minimal { - struct ReserveData { - //stores the reserve configuration - ReserveConfigurationMap configuration; - //the liquidity index. Expressed in ray - uint128 liquidityIndex; - //the current supply rate. Expressed in ray - uint128 currentLiquidityRate; - //variable borrow index. Expressed in ray - uint128 variableBorrowIndex; - //the current variable borrow rate. Expressed in ray - uint128 currentVariableBorrowRate; - //the current stable borrow rate. Expressed in ray - uint128 currentStableBorrowRate; - //timestamp of last update - uint40 lastUpdateTimestamp; - //the id of the reserve. Represents the position in the list of the active reserves - uint16 id; - //aToken address - address aTokenAddress; - //stableDebtToken address - address stableDebtTokenAddress; - //variableDebtToken address - address variableDebtTokenAddress; - //address of the interest rate strategy - address interestRateStrategyAddress; - //the current treasury balance, scaled - uint128 accruedToTreasury; - //the outstanding unbacked aTokens minted through the bridging feature - uint128 unbacked; - //the outstanding debt borrowed against this asset in isolation mode - uint128 isolationModeTotalDebt; - } - - struct ReserveConfigurationMap { - //bit 0-15: LTV - //bit 16-31: Liq. threshold - //bit 32-47: Liq. bonus - //bit 48-55: Decimals - //bit 56: reserve is active - //bit 57: reserve is frozen - //bit 58: borrowing is enabled - //bit 59: stable rate borrowing enabled - //bit 60: asset is paused - //bit 61: borrowing in isolation mode is enabled - //bit 62: siloed borrowing enabled - //bit 63: flashloaning enabled - //bit 64-79: reserve factor - //bit 80-115 borrow cap in whole tokens, borrowCap == 0 => no cap - //bit 116-151 supply cap in whole tokens, supplyCap == 0 => no cap - //bit 152-167 liquidation protocol fee - //bit 168-175 eMode category - //bit 176-211 unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled - //bit 212-251 debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals - //bit 252-255 unused - uint256 data; - } - - /** - * @notice Returns the state and configuration of the reserve - * @param asset The address of the underlying asset of the reserve - * @return The state and configuration data of the reserve - */ - function getReserveData(address asset) external view returns (ReserveData memory); - - /** - * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. - * - E.g. User supplies 100 USDC and gets in return 100 aUSDC - * @param asset The address of the underlying asset to supply - * @param amount The amount to be supplied - * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user - * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens - * is a different wallet - * @param referralCode Code used to register the integrator originating the operation, for potential rewards. - * 0 if the action is executed directly by the user, without any middle-man - */ - function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - - /** - * @notice Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned - * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC - * @param asset The address of the underlying asset to withdraw - * @param amount The underlying amount to be withdrawn - * - Send the value type(uint256).max in order to withdraw the whole aToken balance - * @param to The address that will receive the underlying, same as msg.sender if the user - * wants to receive it on his own wallet, or a different address if the beneficiary is a - * different wallet - * @return The final amount withdrawn - */ - function withdraw(address asset, uint256 amount, address to) external returns (uint256); -} diff --git a/contracts/extensions/pendle/PendleHelper.sol b/contracts/extensions/pendle/PendleHelper.sol deleted file mode 100644 index 0b4cd85..0000000 --- a/contracts/extensions/pendle/PendleHelper.sol +++ /dev/null @@ -1,40 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import "@pendle/core-v2/contracts/interfaces/IPAllActionV3.sol"; -import "@pendle/core-v2/contracts/interfaces/IPMarket.sol"; - -abstract contract PendleHelper { - // EmptySwap means no swap aggregator is involved - SwapData public emptySwap; - - // EmptyLimit means no limit order is involved - LimitOrderData public emptyLimit; - - // DefaultApprox means no off-chain preparation is involved, more gas consuming (~ 180k gas) - ApproxParams public defaultApprox = ApproxParams(0, type(uint256).max, 0, 256, 1e14); - - /// @notice create a simple TokenInput struct without using any aggregators. For more info please refer to - /// IPAllActionTypeV3.sol - function createTokenInputStruct(address tokenIn, uint256 netTokenIn) - internal - view - returns (TokenInput memory input) - { - input.tokenIn = tokenIn; - input.netTokenIn = netTokenIn; - input.tokenMintSy = tokenIn; - } - - /// @notice create a simple TokenOutput struct without using any aggregators. For more info please refer to - /// IPAllActionTypeV3.sol - function createTokenOutputStruct(address tokenOut, uint256 minTokenOut) - internal - view - returns (TokenOutput memory output) - { - output.tokenOut = tokenOut; - output.minTokenOut = minTokenOut; - output.tokenRedeemSy = tokenOut; - } -} diff --git a/contracts/factory/ITermMaxFactory.sol b/contracts/factory/ITermMaxFactory.sol deleted file mode 100644 index b20c359..0000000 --- a/contracts/factory/ITermMaxFactory.sol +++ /dev/null @@ -1,31 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {MarketInitialParams} from "../storage/TermMaxStorage.sol"; - -/** - * @title The TermMax factory interface - * @author Term Structure Labs - */ -interface ITermMaxFactory { - function TERMMAX_MARKET_IMPLEMENTATION() external view returns (address); - - function gtImplements(bytes32 gtKey) external view returns (address gtImplement); - - /// @notice Set the implementations of TermMax Gearing Token contract - function setGtImplement(string memory gtImplementName, address gtImplement) external; - - /// @notice Predict the address of token pair - function predictMarketAddress( - address deployer, - address collateral, - address debtToken, - uint64 maturity, - uint256 salt - ) external view returns (address market); - - /// @notice Deploy a new market - function createMarket(bytes32 gtKey, MarketInitialParams memory params, uint256 salt) - external - returns (address market); -} diff --git a/contracts/factory/IVaultFactory.sol b/contracts/factory/IVaultFactory.sol deleted file mode 100644 index d471035..0000000 --- a/contracts/factory/IVaultFactory.sol +++ /dev/null @@ -1,41 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {VaultInitialParams} from "contracts/storage/TermMaxStorage.sol"; - -/** - * @title TermMax Vault Factory Interface - * @author Term Structure Labs - * @notice Interface for creating new TermMax vaults - */ -interface IVaultFactory { - /** - * @notice The implementation of TermMax Vault contract - */ - function TERMMAX_VAULT_IMPLEMENTATION() external view returns (address); - - /** - * @notice Predict the address of a new TermMax vault - * @param deployer The address of the vault deployer - * @param asset The address of the asset - * @param name The name of the vault - * @param symbol The symbol of the vault - * @param salt The salt used to create the vault - * @return vault The predicted address of the vault - */ - function predictVaultAddress( - address deployer, - address asset, - string memory name, - string memory symbol, - uint256 salt - ) external view returns (address vault); - - /** - * @notice Creates a new TermMax vault with the specified parameters - * @param initialParams Initial parameters for vault configuration - * @param salt The salt used to create the vault - * @return address The address of the newly created vault - */ - function createVault(VaultInitialParams memory initialParams, uint256 salt) external returns (address); -} diff --git a/contracts/factory/TermMaxFactory.sol b/contracts/factory/TermMaxFactory.sol deleted file mode 100644 index 2d391b1..0000000 --- a/contracts/factory/TermMaxFactory.sol +++ /dev/null @@ -1,74 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {Ownable, Ownable2Step} from "@openzeppelin/contracts/access/Ownable2Step.sol"; -import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol"; -import {TermMaxMarket} from "../TermMaxMarket.sol"; -import {GearingTokenWithERC20} from "../tokens/GearingTokenWithERC20.sol"; -import {MarketInitialParams} from "../storage/TermMaxStorage.sol"; -import {FactoryErrors} from "../errors/FactoryErrors.sol"; -import {FactoryEvents} from "../events/FactoryEvents.sol"; -import {ITermMaxMarket} from "../ITermMaxMarket.sol"; -import {ITermMaxFactory} from "./ITermMaxFactory.sol"; - -/** - * @title The TermMax factory - * @author Term Structure Labs - */ -contract TermMaxFactory is Ownable2Step, FactoryErrors, FactoryEvents, ITermMaxFactory { - bytes32 constant GT_ERC20 = keccak256("GearingTokenWithERC20"); - - /// @notice The implementation of TermMax Market contract - address public immutable TERMMAX_MARKET_IMPLEMENTATION; - - /// @notice The implementations of TermMax Gearing Token contract - /// @dev Based on the abstract GearingToken contract, - /// different GearingTokens can be adapted to various collaterals, - /// such as ERC20 tokens and ERC721 tokens. - mapping(bytes32 => address) public gtImplements; - - constructor(address admin, address TERMMAX_MARKET_IMPLEMENTATION_) Ownable(admin) { - if (TERMMAX_MARKET_IMPLEMENTATION_ == address(0)) { - revert InvalidImplementation(); - } - TERMMAX_MARKET_IMPLEMENTATION = TERMMAX_MARKET_IMPLEMENTATION_; - - gtImplements[GT_ERC20] = address(new GearingTokenWithERC20()); - } - - function setGtImplement(string memory gtImplementName, address gtImplement) external onlyOwner { - bytes32 key = keccak256(abi.encodePacked(gtImplementName)); - gtImplements[key] = gtImplement; - emit SetGtImplement(key, gtImplement); - } - - function predictMarketAddress( - address deployer, - address collateral, - address debtToken, - uint64 maturity, - uint256 salt - ) external view returns (address market) { - return Clones.predictDeterministicAddress( - TERMMAX_MARKET_IMPLEMENTATION, keccak256(abi.encode(deployer, collateral, debtToken, maturity, salt)) - ); - } - - function createMarket(bytes32 gtKey, MarketInitialParams memory params, uint256 salt) - external - onlyOwner - returns (address market) - { - params.gtImplementation = gtImplements[gtKey]; - if (params.gtImplementation == address(0)) { - revert CantNotFindGtImplementation(); - } - market = Clones.cloneDeterministic( - TERMMAX_MARKET_IMPLEMENTATION, - keccak256(abi.encode(msg.sender, params.collateral, params.debtToken, params.marketConfig.maturity, salt)) - ); - ITermMaxMarket(market).initialize(params); - - emit CreateMarket(market, params.collateral, params.debtToken); - } -} diff --git a/contracts/factory/TermMaxPriceFeedFactory.sol b/contracts/factory/TermMaxPriceFeedFactory.sol deleted file mode 100644 index 6d1ad58..0000000 --- a/contracts/factory/TermMaxPriceFeedFactory.sol +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {TermMaxERC4626PriceFeed} from "../oracle/priceFeeds/TermMaxERC4626PriceFeed.sol"; -import {TermMaxPriceFeedConverter} from "../oracle/priceFeeds/TermMaxPriceFeedConverter.sol"; -import {TermMaxPTPriceFeed} from "../oracle/priceFeeds/TermMaxPTPriceFeed.sol"; - -contract TermMaxPriceFeedFactory { - event PriceFeedCreated(address indexed priceFeed); - - function createPriceFeedWithERC4626(address _assetPriceFeed, address _vault) external returns (address) { - address priceFeed = address(new TermMaxERC4626PriceFeed(_assetPriceFeed, _vault)); - emit PriceFeedCreated(priceFeed); - return priceFeed; - } - - function createPriceFeedConverter( - address _aTokenToBTokenPriceFeed, - address _bTokenToCTokenPriceFeed, - address _asset - ) external returns (address) { - address priceFeed = - address(new TermMaxPriceFeedConverter(_aTokenToBTokenPriceFeed, _bTokenToCTokenPriceFeed, _asset)); - emit PriceFeedCreated(priceFeed); - return priceFeed; - } - - function createPTWithPriceFeed(address _pendlePYLpOracle, address _market, uint32 _duration, address _priceFeed) - external - returns (address) - { - address priceFeed = address(new TermMaxPTPriceFeed(_pendlePYLpOracle, _market, _duration, _priceFeed)); - emit PriceFeedCreated(priceFeed); - return priceFeed; - } -} diff --git a/contracts/factory/VaultFactory.sol b/contracts/factory/VaultFactory.sol deleted file mode 100644 index cfb376d..0000000 --- a/contracts/factory/VaultFactory.sol +++ /dev/null @@ -1,54 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol"; -import {ITermMaxVault} from "contracts/vault/ITermMaxVault.sol"; -import {VaultInitialParams} from "contracts/storage/TermMaxStorage.sol"; -import {FactoryEvents} from "contracts/events/FactoryEvents.sol"; -import {FactoryErrors} from "contracts/errors/FactoryErrors.sol"; -import {IVaultFactory} from "./IVaultFactory.sol"; - -/** - * @title The TermMax vault factory - * @author Term Structure Labs - */ -contract VaultFactory is FactoryEvents, IVaultFactory, FactoryErrors { - /** - * @notice The implementation of TermMax Vault contract - */ - address public immutable TERMMAX_VAULT_IMPLEMENTATION; - - constructor(address TERMMAX_VAULT_IMPLEMENTATION_) { - if (TERMMAX_VAULT_IMPLEMENTATION_ == address(0)) { - revert InvalidImplementation(); - } - TERMMAX_VAULT_IMPLEMENTATION = TERMMAX_VAULT_IMPLEMENTATION_; - } - - /** - * @inheritdoc IVaultFactory - */ - function predictVaultAddress( - address deployer, - address asset, - string memory name, - string memory symbol, - uint256 salt - ) external view returns (address vault) { - return Clones.predictDeterministicAddress( - TERMMAX_VAULT_IMPLEMENTATION, keccak256(abi.encode(deployer, asset, name, symbol, salt)) - ); - } - - /** - * @inheritdoc IVaultFactory - */ - function createVault(VaultInitialParams memory initialParams, uint256 salt) public returns (address vault) { - vault = Clones.cloneDeterministic( - TERMMAX_VAULT_IMPLEMENTATION, - keccak256(abi.encode(msg.sender, initialParams.asset, initialParams.name, initialParams.symbol, salt)) - ); - ITermMaxVault(vault).initialize(initialParams); - emit CreateVault(vault, msg.sender, initialParams); - } -} diff --git a/contracts/lib/ArrayUtils.sol b/contracts/lib/ArrayUtils.sol deleted file mode 100644 index a93ba97..0000000 --- a/contracts/lib/ArrayUtils.sol +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library ArrayUtils { - error IndexOutOfBounds(); - - function indexOf(address[] storage arr, address value) internal view returns (uint256) { - for (uint256 i = 0; i < arr.length; i++) { - if (arr[i] == value) { - return i; - } - } - revert IndexOutOfBounds(); - } - - function remove(address[] storage arr, uint256 index) internal { - for (uint256 i = index; i < arr.length - 1; ++i) { - arr[i] = arr[i + 1]; - } - arr.pop(); - } -} diff --git a/contracts/lib/Constants.sol b/contracts/lib/Constants.sol deleted file mode 100644 index eb9ae7c..0000000 --- a/contracts/lib/Constants.sol +++ /dev/null @@ -1,21 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title The general constants of TermMax - * @author Term Structure Labs - */ -library Constants { - /// @notice The base decimals of ratio - uint256 constant DECIMAL_BASE = 1e8; - /// @notice The square of the base decimals - uint256 constant DECIMAL_BASE_SQ = 1e16; - /// @notice The days of one year - uint256 constant DAYS_IN_YEAR = 365; - /// @notice The seconds of one day - uint256 constant SECONDS_IN_DAY = 1 days; - /// @notice The window time left for the liquidation bot after the market expires - uint256 constant LIQUIDATION_WINDOW = 2 hours; - /// @notice The limit of fee ratio - uint32 constant MAX_FEE_RATIO = 0.2e8; -} diff --git a/contracts/lib/GearingTokenConstants.sol b/contracts/lib/GearingTokenConstants.sol deleted file mode 100644 index 1125a2b..0000000 --- a/contracts/lib/GearingTokenConstants.sol +++ /dev/null @@ -1,16 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @title The constants of GearingToken - * @author Term Structure Labs - */ -library GearingTokenConstants { - /// @notice The percentage of repay amount to liquidator while do liquidate, decimals 1e8 - uint256 constant REWARD_TO_LIQUIDATOR = 0.05e8; - /// @notice The percentage of repay amount to protocol while do liquidate, decimals 1e8 - uint256 constant REWARD_TO_PROTOCOL = 0.05e8; - /// @notice Semi-liquidation threshold: if the value of the collateral reaches this value, - /// only partial liquidation can be performed, decimals 1e8. - uint256 constant HALF_LIQUIDATION_THRESHOLD = 10000e8; -} diff --git a/contracts/lib/LinkedList.sol b/contracts/lib/LinkedList.sol deleted file mode 100644 index 3fa5dfc..0000000 --- a/contracts/lib/LinkedList.sol +++ /dev/null @@ -1,37 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/// @title LinkedList -/// @author Term Structure Labs -/// @notice A linked list library -library LinkedList { - function insertWhenZeroAsRoot(mapping(uint64 => uint64) storage s, uint64 value) internal { - uint64 prev = 0; - uint64 current = s[0]; - - // find insert position - while (current != 0 && current < value) { - prev = current; - current = s[current]; - } - - // ignore if value exists - if (current == value) { - return; - } - - // insert node - s[value] = current; - s[prev] = value; - } - - function popWhenZeroAsRoot(mapping(uint64 => uint64) storage s) internal { - uint64 first = s[0]; - if (first != 0) { - // update head - s[0] = s[first]; - // delete node - delete s[first]; - } - } -} diff --git a/contracts/lib/MarketConstants.sol b/contracts/lib/MarketConstants.sol deleted file mode 100644 index 75ab241..0000000 --- a/contracts/lib/MarketConstants.sol +++ /dev/null @@ -1,9 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library MarketConstants { - string constant PREFIX_FT = "FT:"; - string constant PREFIX_XT = "XT:"; - string constant PREFIX_GT = "GT:"; - string constant PREFIX_MARKET = "Termmax Market:"; -} diff --git a/contracts/lib/MathLib.sol b/contracts/lib/MathLib.sol deleted file mode 100644 index 25de497..0000000 --- a/contracts/lib/MathLib.sol +++ /dev/null @@ -1,152 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; - -/// @notice Arithmetic library with operations for fixed-point numbers. -/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/FixedPointMathLib.sol) -/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/FixedPointMathLib.sol) -library MathLib { - using SafeCast for uint256; - using SafeCast for int256; - /// @dev Returns the absolute value of `x`. - - function abs(int256 x) internal pure returns (uint256 z) { - /// @solidity memory-safe-assembly - assembly { - z := xor(sar(255, x), add(sar(255, x), x)) - } - } - - /** - * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded - * towards zero. - * - * This method is based on Newton's method for computing square roots; the algorithm is restricted to only - * using integer operations. - * - * Copy from openzepplin Math lib - */ - function sqrt(uint256 a) internal pure returns (uint256) { - unchecked { - // Take care of easy edge cases when a == 0 or a == 1 - if (a <= 1) { - return a; - } - - // In this function, we use Newton's method to get a root of `f(x) := x² - a`. It involves building a - // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between - // the current value as `ε_n = | x_n - sqrt(a) |`. - // - // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root - // of the target. (i.e. `2**(e-1) ≤ sqrt(a) < 2**e`). We know that `e ≤ 128` because `(2¹²⁸)² = 2²⁵⁶` is - // bigger than any uint256. - // - // By noticing that - // `2**(e-1) ≤ sqrt(a) < 2**e → (2**(e-1))² ≤ a < (2**e)² → 2**(2*e-2) ≤ a < 2**(2*e)` - // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar - // to the msb function. - uint256 aa = a; - uint256 xn = 1; - - if (aa >= (1 << 128)) { - aa >>= 128; - xn <<= 64; - } - if (aa >= (1 << 64)) { - aa >>= 64; - xn <<= 32; - } - if (aa >= (1 << 32)) { - aa >>= 32; - xn <<= 16; - } - if (aa >= (1 << 16)) { - aa >>= 16; - xn <<= 8; - } - if (aa >= (1 << 8)) { - aa >>= 8; - xn <<= 4; - } - if (aa >= (1 << 4)) { - aa >>= 4; - xn <<= 2; - } - if (aa >= (1 << 2)) { - xn <<= 1; - } - - // We now have x_n such that `x_n = 2**(e-1) ≤ sqrt(a) < 2**e = 2 * x_n`. This implies ε_n ≤ 2**(e-1). - // - // We can refine our estimation by noticing that the middle of that interval minimizes the error. - // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to ε_n ≤ 2**(e-2). - // This is going to be our x_0 (and ε_0) - xn = (3 * xn) >> 1; // ε_0 := | x_0 - sqrt(a) | ≤ 2**(e-2) - - // From here, Newton's method give us: - // x_{n+1} = (x_n + a / x_n) / 2 - // - // One should note that: - // x_{n+1}² - a = ((x_n + a / x_n) / 2)² - a - // = ((x_n² + a) / (2 * x_n))² - a - // = (x_n⁴ + 2 * a * x_n² + a²) / (4 * x_n²) - a - // = (x_n⁴ + 2 * a * x_n² + a² - 4 * a * x_n²) / (4 * x_n²) - // = (x_n⁴ - 2 * a * x_n² + a²) / (4 * x_n²) - // = (x_n² - a)² / (2 * x_n)² - // = ((x_n² - a) / (2 * x_n))² - // ≥ 0 - // Which proves that for all n ≥ 1, sqrt(a) ≤ x_n - // - // This gives us the proof of quadratic convergence of the sequence: - // ε_{n+1} = | x_{n+1} - sqrt(a) | - // = | (x_n + a / x_n) / 2 - sqrt(a) | - // = | (x_n² + a - 2*x_n*sqrt(a)) / (2 * x_n) | - // = | (x_n - sqrt(a))² / (2 * x_n) | - // = | ε_n² / (2 * x_n) | - // = ε_n² / | (2 * x_n) | - // - // For the first iteration, we have a special case where x_0 is known: - // ε_1 = ε_0² / | (2 * x_0) | - // ≤ (2**(e-2))² / (2 * (2**(e-1) + 2**(e-2))) - // ≤ 2**(2*e-4) / (3 * 2**(e-1)) - // ≤ 2**(e-3) / 3 - // ≤ 2**(e-3-log2(3)) - // ≤ 2**(e-4.5) - // - // For the following iterations, we use the fact that, 2**(e-1) ≤ sqrt(a) ≤ x_n: - // ε_{n+1} = ε_n² / | (2 * x_n) | - // ≤ (2**(e-k))² / (2 * 2**(e-1)) - // ≤ 2**(2*e-2*k) / 2**e - // ≤ 2**(e-2*k) - xn = (xn + a / xn) >> 1; // ε_1 := | x_1 - sqrt(a) | ≤ 2**(e-4.5) -- special case, see above - xn = (xn + a / xn) >> 1; // ε_2 := | x_2 - sqrt(a) | ≤ 2**(e-9) -- general case with k = 4.5 - xn = (xn + a / xn) >> 1; // ε_3 := | x_3 - sqrt(a) | ≤ 2**(e-18) -- general case with k = 9 - xn = (xn + a / xn) >> 1; // ε_4 := | x_4 - sqrt(a) | ≤ 2**(e-36) -- general case with k = 18 - xn = (xn + a / xn) >> 1; // ε_5 := | x_5 - sqrt(a) | ≤ 2**(e-72) -- general case with k = 36 - xn = (xn + a / xn) >> 1; // ε_6 := | x_6 - sqrt(a) | ≤ 2**(e-144) -- general case with k = 72 - - // Because e ≤ 128 (as discussed during the first estimation phase), we know have reached a precision - // ε_6 ≤ 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either - // sqrt(a) or sqrt(a) + 1. - return xn - SafeCast.toUint(xn > a / xn); - } - } - - /// @dev Return the maximum value - function max(uint256 a, uint256 b) internal pure returns (uint256) { - return a > b ? a : b; - } - - /// @notice Returns the smaller of two values - function min(uint256 a, uint256 b) internal pure returns (uint256) { - return a < b ? a : b; - } - - function plusInt256(uint256 a, int256 b) internal pure returns (uint256) { - if (b < 0) { - return a - uint256(-b); - } - return a + uint256(b); - } -} diff --git a/contracts/lib/PendingLib.sol b/contracts/lib/PendingLib.sol deleted file mode 100644 index e06f944..0000000 --- a/contracts/lib/PendingLib.sol +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity ^0.8.0; - -struct PendingUint192 { - /// @notice The pending value to set. - uint192 value; - /// @notice The timestamp at which the pending value becomes valid. - uint64 validAt; -} - -struct PendingAddress { - /// @notice The pending value to set. - address value; - /// @notice The timestamp at which the pending value becomes valid. - uint64 validAt; -} - -/// @title PendingLib -/// @author Morpho Labs -/// @custom:contact security@morpho.org -/// @notice Library to manage pending values and their validity timestamp. -library PendingLib { - /// @dev Updates `pending`'s value to `newValue` and its corresponding `validAt` timestamp. - /// @dev Assumes `timelock` <= `MAX_TIMELOCK`. - function update(PendingUint192 storage pending, uint184 newValue, uint256 timelock) internal { - pending.value = newValue; - // Safe "unchecked" cast because timelock <= MAX_TIMELOCK. - pending.validAt = uint64(block.timestamp + timelock); - } - - /// @dev Updates `pending`'s value to `newValue` and its corresponding `validAt` timestamp. - /// @dev Assumes `timelock` <= `MAX_TIMELOCK`. - function update(PendingAddress storage pending, address newValue, uint256 timelock) internal { - pending.value = newValue; - // Safe "unchecked" cast because timelock <= MAX_TIMELOCK. - pending.validAt = uint64(block.timestamp + timelock); - } -} diff --git a/contracts/lib/StringUtil.sol b/contracts/lib/StringUtil.sol deleted file mode 100644 index 271a231..0000000 --- a/contracts/lib/StringUtil.sol +++ /dev/null @@ -1,8 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library StringUtil { - function contact(string memory a, string memory b) internal pure returns (string memory) { - return string(abi.encodePacked(a, b)); - } -} diff --git a/contracts/lib/TermMaxCurve.sol b/contracts/lib/TermMaxCurve.sol deleted file mode 100644 index 0b46462..0000000 --- a/contracts/lib/TermMaxCurve.sol +++ /dev/null @@ -1,391 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; - -import {Constants} from "./Constants.sol"; -import {MathLib, SafeCast} from "./MathLib.sol"; -import {CurveCut} from "../storage/TermMaxStorage.sol"; - -/** - * @title The TermMax curve library - * @author Term Structure Labs - */ -library TermMaxCurve { - using SafeCast for uint256; - using SafeCast for int256; - using MathLib for *; - - error InsufficientLiquidity(); - - /// @notice Calculate Curve cut id - /// @param cuts Curve cut array - /// @param xtReserve XT reserve - /// @return cutId Curve cut id - function calcCutId(CurveCut[] memory cuts, uint256 xtReserve) internal pure returns (uint256 cutId) { - cutId = cuts.length; - while (cutId > 0) { - cutId--; - if (xtReserve >= cuts[cutId].xtReserve) break; - } - } - - /// @notice Calculate interval properties - /// @param daysToMaturity Days to maturity - /// @param cut Curve cut - /// @param xtReserve XT reserve - /// @return liqSquare square of liquidity factor - /// @return vXtReserve virtual XT reserve - /// @return vFtReserve virtual FT reserve - function calcIntervalProps( - uint256 netInterestFactor, - uint256 daysToMaturity, - CurveCut memory cut, - uint256 xtReserve - ) internal pure returns (uint256 liqSquare, uint256 vXtReserve, uint256 vFtReserve) { - // reference: Eq.(8) in TermMax White Paper - liqSquare = - (cut.liqSquare * daysToMaturity * netInterestFactor) / (Constants.DAYS_IN_YEAR * Constants.DECIMAL_BASE); - vXtReserve = xtReserve.plusInt256(cut.offset); - vFtReserve = liqSquare / vXtReserve; - } - - /// @notice Forward iteration over curve cuts - /// @param daysToMaturity Days to maturity - /// @param cuts Curve cut array - /// @param oriXtReserve Original XT reserve - /// @param acc Input amount - /// @param func Function to calculate delta values - /// @return deltaXt Delta XT - /// @return negDeltaFt Negative delta FT - function cutsForwardIter( - uint256 netInterestFactor, - uint256 daysToMaturity, - CurveCut[] memory cuts, - uint256 oriXtReserve, - uint256 acc, - function(int, int, int, int, int, int) internal pure returns (int, int) func - ) internal pure returns (uint256 deltaXt, uint256 negDeltaFt) { - uint256 cutId = calcCutId(cuts, oriXtReserve); - for (uint256 i = cutId; i < cuts.length; ++i) { - uint256 xtReserve = oriXtReserve + deltaXt; - (uint256 liqSquare, uint256 vXtReserve, uint256 vFtReserve) = - calcIntervalProps(netInterestFactor, daysToMaturity, cuts[i], xtReserve); - { - (int256 dX, int256 nF) = func( - liqSquare.toInt256(), - vXtReserve.toInt256(), - vFtReserve.toInt256(), - deltaXt.toInt256(), - -negDeltaFt.toInt256(), - acc.toInt256() - ); - - if (i != cuts.length - 1) { - if ( - (dX < deltaXt.toInt256() || nF < negDeltaFt.toInt256()) - || oriXtReserve + uint256(dX) > cuts[i + 1].xtReserve - ) { - deltaXt = cuts[i + 1].xtReserve - oriXtReserve; - negDeltaFt += vFtReserve - liqSquare / (vXtReserve + (cuts[i + 1].xtReserve - xtReserve)); - continue; - } else { - return (uint256(dX), uint256(nF)); - } - } else if (dX >= deltaXt.toInt256() && nF >= negDeltaFt.toInt256()) { - return (uint256(dX), uint256(nF)); - } - } - } - revert InsufficientLiquidity(); - } - - /// @notice Reverse iteration over curve cuts - /// @param daysToMaturity Days to maturity - /// @param cuts Curve cut array - /// @param oriXtReserve Original XT reserve - /// @param acc Input amount - /// @param func Function to calculate delta values - /// @return negDeltaXt Negative delta XT - /// @return deltaFt Delta FT - function cutsReverseIter( - uint256 netInterestFactor, - uint256 daysToMaturity, - CurveCut[] memory cuts, - uint256 oriXtReserve, - uint256 acc, - function(int, int, int, int, int, int) internal pure returns (int, int) func - ) internal pure returns (uint256 negDeltaXt, uint256 deltaFt) { - uint256 cutId = calcCutId(cuts, oriXtReserve); - for (uint256 i = cutId + 1; i > 0; i--) { - uint256 idx = i - 1; - uint256 xtReserve = oriXtReserve - negDeltaXt; - (uint256 liqSquare, uint256 vXtReserve, uint256 vFtReserve) = - calcIntervalProps(netInterestFactor, daysToMaturity, cuts[idx], xtReserve); - { - (int256 nX, int256 dF) = func( - liqSquare.toInt256(), - vXtReserve.toInt256(), - vFtReserve.toInt256(), - -negDeltaXt.toInt256(), - deltaFt.toInt256(), - acc.toInt256() - ); - - if ( - (nX < negDeltaXt.toInt256() || dF < deltaFt.toInt256()) - || oriXtReserve < uint256(nX) + cuts[idx].xtReserve - ) { - negDeltaXt = oriXtReserve - cuts[idx].xtReserve; - deltaFt += liqSquare / (vXtReserve - (xtReserve - cuts[idx].xtReserve)) - vFtReserve; - continue; - } else { - return (uint256(nX), uint256(dF)); - } - } - } - revert InsufficientLiquidity(); - } - - function buyExactXt( - uint256 netInterestFactor, - uint256 daysToMaturity, - CurveCut[] memory cuts, - uint256 oriXtReserve, - uint256 outputAmount - ) internal pure returns (uint256 negDeltaXt, uint256 deltaFt) { - (negDeltaXt, deltaFt) = - cutsReverseIter(netInterestFactor, daysToMaturity, cuts, oriXtReserve, outputAmount, buyExactXtStep); - } - - function buyExactFt( - uint256 netInterestFactor, - uint256 daysToMaturity, - CurveCut[] memory cuts, - uint256 oriXtReserve, - uint256 outputAmount - ) internal pure returns (uint256 deltaXt, uint256 negDeltaFt) { - (deltaXt, negDeltaFt) = - cutsForwardIter(netInterestFactor, daysToMaturity, cuts, oriXtReserve, outputAmount, buyExactFtStep); - } - - /// @notice Buy XT - /// @param daysToMaturity Days to maturity - /// @param cuts Curve cut array - /// @param oriXtReserve Original XT reserve - /// @param inputAmount Input amount - /// @return negDeltaXt Negative delta XT - /// @return deltaFt Delta FT - function buyXt( - uint256 netInterestFactor, - uint256 daysToMaturity, - CurveCut[] memory cuts, - uint256 oriXtReserve, - uint256 inputAmount - ) internal pure returns (uint256 negDeltaXt, uint256 deltaFt) { - (negDeltaXt, deltaFt) = - cutsReverseIter(netInterestFactor, daysToMaturity, cuts, oriXtReserve, inputAmount, buyXtStep); - } - - /// @notice Buy FT - /// @param daysToMaturity Days to maturity - /// @param cuts Curve cut array - /// @param oriXtReserve Original XT reserve - /// @param inputAmount Input amount - /// @return deltaXt Delta XT - /// @return negDeltaFt Negative delta FT - function buyFt( - uint256 netInterestFactor, - uint256 daysToMaturity, - CurveCut[] memory cuts, - uint256 oriXtReserve, - uint256 inputAmount - ) internal pure returns (uint256 deltaXt, uint256 negDeltaFt) { - (deltaXt, negDeltaFt) = - cutsForwardIter(netInterestFactor, daysToMaturity, cuts, oriXtReserve, inputAmount, buyFtStep); - } - - /// @notice Sell XT - /// @param daysToMaturity Days to maturity - /// @param cuts Curve cut array - /// @param oriXtReserve Original XT reserve - /// @param inputAmount Input amount - /// @return deltaXt Delta XT - /// @return negDeltaFt Negative delta FT - function sellXt( - uint256 netInterestFactor, - uint256 daysToMaturity, - CurveCut[] memory cuts, - uint256 oriXtReserve, - uint256 inputAmount - ) internal pure returns (uint256 deltaXt, uint256 negDeltaFt) { - (deltaXt, negDeltaFt) = - cutsForwardIter(netInterestFactor, daysToMaturity, cuts, oriXtReserve, inputAmount, sellXtStep); - } - - /// @notice Sell FT - /// @param daysToMaturity Days to maturity - /// @param cuts Curve cut array - /// @param oriXtReserve Original XT reserve - /// @param inputAmount Input amount - /// @return negDeltaXt Negative delta XT - /// @return deltaFt Delta FT - function sellFt( - uint256 netInterestFactor, - uint256 daysToMaturity, - CurveCut[] memory cuts, - uint256 oriXtReserve, - uint256 inputAmount - ) internal pure returns (uint256 negDeltaXt, uint256 deltaFt) { - (negDeltaXt, deltaFt) = - cutsReverseIter(netInterestFactor, daysToMaturity, cuts, oriXtReserve, inputAmount, sellFtStep); - } - - function sellFtForExactDebtToken( - uint256 netInterestFactor, - uint256 daysToMaturity, - CurveCut[] memory cuts, - uint256 oriXtReserve, - uint256 outputAmount - ) internal pure returns (uint256 negDeltaXt, uint256 deltaFt) { - (negDeltaXt, deltaFt) = cutsReverseIter( - netInterestFactor, daysToMaturity, cuts, oriXtReserve, outputAmount, sellFtForExactDebtTokenStep - ); - } - - function sellXtForExactDebtToken( - uint256 netInterestFactor, - uint256 daysToMaturity, - CurveCut[] memory cuts, - uint256 oriXtReserve, - uint256 outputAmount - ) internal pure returns (uint256 deltaXt, uint256 negDeltaFt) { - (deltaXt, negDeltaFt) = cutsForwardIter( - netInterestFactor, daysToMaturity, cuts, oriXtReserve, outputAmount, sellXtForExactDebtTokenStep - ); - } - - function sellTokenStepBase( - int256, - int256 vLhsReserve, - int256 vRhsReserve, - int256 oriDeltaLhs, - int256 oriDeltaRhs, - int256 inputAmt - ) internal pure returns (int256 deltaLhs, int256 negDeltaRhs) { - // reference: Section 4.2.3, Section 4.2.4 in TermMax White Paper - int256 acc = (oriDeltaLhs - oriDeltaRhs) - inputAmt; - int256 b = vLhsReserve + vRhsReserve + acc; - int256 c = vLhsReserve * acc; - - int256 segDeltaLhs = (MathLib.sqrt((b * b - 4 * c).toUint256()).toInt256() - b) / 2; - deltaLhs = oriDeltaLhs + segDeltaLhs; - negDeltaRhs = -oriDeltaRhs - acc - segDeltaLhs; - } - - function buyTokenStepBase( - int256 liqSquare, - int256 vlhsReserve, - int256 vRhsReserve, - int256 oriDeltalhs, - int256 oriDeltaRhs, - int256 inputAmt - ) internal pure returns (int256 negDeltalhs, int256 deltaRhs) { - // reference: Eq.(9), Eq.(10) in TermMax White Paper - int256 remainingInputAmt = inputAmt - oriDeltaRhs; - negDeltalhs = -oriDeltalhs + vlhsReserve - liqSquare / (vRhsReserve + remainingInputAmt); - deltaRhs = inputAmt; - } - - function buyXtStep( - int256 liqSquare, - int256 vXtReserve, - int256 vFtReserve, - int256 oriDeltaXt, - int256 oriDeltaFt, - int256 inputAmt - ) internal pure returns (int256 negDeltaXt, int256 deltaFt) { - (negDeltaXt, deltaFt) = buyTokenStepBase(liqSquare, vXtReserve, vFtReserve, oriDeltaXt, oriDeltaFt, inputAmt); - } - - function buyFtStep( - int256 liqSquare, - int256 vXtReserve, - int256 vFtReserve, - int256 oriDeltaXt, - int256 oriDeltaFt, - int256 inputAmt - ) internal pure returns (int256 deltaXt, int256 negDeltaFt) { - (negDeltaFt, deltaXt) = buyTokenStepBase(liqSquare, vFtReserve, vXtReserve, oriDeltaFt, oriDeltaXt, inputAmt); - } - - function sellXtStep( - int256, - int256 vXtReserve, - int256 vFtReserve, - int256 oriDeltaXt, - int256 oriDeltaFt, - int256 inputAmt - ) internal pure returns (int256 deltaXt, int256 negDeltaFt) { - (deltaXt, negDeltaFt) = sellTokenStepBase(0, vXtReserve, vFtReserve, oriDeltaXt, oriDeltaFt, inputAmt); - } - - function sellFtStep( - int256, - int256 vXtReserve, - int256 vFtReserve, - int256 oriDeltaXt, - int256 oriDeltaFt, - int256 inputAmt - ) internal pure returns (int256 negDeltaXt, int256 deltaFt) { - (deltaFt, negDeltaXt) = sellTokenStepBase(0, vFtReserve, vXtReserve, oriDeltaFt, oriDeltaXt, inputAmt); - } - - function buyExactXtStep( - int256, - int256 vXtReserve, - int256 vFtReserve, - int256 oriDeltaXt, - int256 oriDeltaFt, - int256 outputAmt - ) internal pure returns (int256, int256) { - (int256 deltaXt, int256 negDeltaFt) = sellXtStep(0, vXtReserve, vFtReserve, oriDeltaXt, oriDeltaFt, -outputAmt); - return (-deltaXt, -negDeltaFt); - } - - function buyExactFtStep( - int256, - int256 vXtReserve, - int256 vFtReserve, - int256 oriDeltaXt, - int256 oriDeltaFt, - int256 outputAmt - ) internal pure returns (int256, int256) { - (int256 negDeltaXt, int256 deltaFt) = sellFtStep(0, vXtReserve, vFtReserve, oriDeltaXt, oriDeltaFt, -outputAmt); - return (-negDeltaXt, -deltaFt); - } - - function sellFtForExactDebtTokenStep( - int256 liqSquare, - int256 vXtReserve, - int256 vFtReserve, - int256 oriDeltaXt, - int256 oriDeltaFt, - int256 outputAmt - ) internal pure returns (int256, int256) { - (int256 deltaXt, int256 negDeltaFt) = - buyFtStep(liqSquare, vXtReserve, vFtReserve, oriDeltaXt, oriDeltaFt, -outputAmt); - return (-deltaXt, -negDeltaFt); - } - - function sellXtForExactDebtTokenStep( - int256 liqSquare, - int256 vXtReserve, - int256 vFtReserve, - int256 oriDeltaXt, - int256 oriDeltaFt, - int256 outputAmt - ) internal pure returns (int256, int256) { - (int256 negDeltaXt, int256 deltaFt) = - buyXtStep(liqSquare, vXtReserve, vFtReserve, oriDeltaXt, oriDeltaFt, -outputAmt); - return (-negDeltaXt, -deltaFt); - } -} diff --git a/contracts/lib/TransferUtils.sol b/contracts/lib/TransferUtils.sol deleted file mode 100644 index 0abbe1f..0000000 --- a/contracts/lib/TransferUtils.sol +++ /dev/null @@ -1,45 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; - -library TransferUtils { - using SafeERC20 for IERC20; - - error CanNotTransferUintMax(); - - function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { - if (value == type(uint256).max) { - revert CanNotTransferUintMax(); - } - if (from == to || value == 0) { - return; - } - token.safeTransferFrom(from, to, value); - } - - function safeTransfer(IERC20 token, address to, uint256 value) internal { - if (value == type(uint256).max) { - revert CanNotTransferUintMax(); - } - if (to == address(this) || value == 0) { - return; - } - token.safeTransfer(to, value); - } - - function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { - if (value == 0 || spender == address(this)) { - return; - } - token.safeIncreaseAllowance(spender, value); - } - - function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { - if (value == 0 || spender == address(this)) { - return; - } - token.safeDecreaseAllowance(spender, value); - } -} diff --git a/contracts/lib/VaultConstants.sol b/contracts/lib/VaultConstants.sol deleted file mode 100644 index 5a135e4..0000000 --- a/contracts/lib/VaultConstants.sol +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -library VaultConstants { - /// @dev The maximum delay of a timelock. - uint256 internal constant MAX_TIMELOCK = 2 weeks; - - /// @dev The minimum delay of a timelock post initialization. - uint256 internal constant POST_INITIALIZATION_MIN_TIMELOCK = 1 days; - - /// @dev The maximum number of markets in the supply/withdraw queue. - uint256 internal constant MAX_QUEUE_LENGTH = 30; - - /// @dev The maximum fee the vault can have (50%). - uint256 internal constant MAX_FEE = 0.5e18; - - /// @dev The maximum term the vault can have. - uint256 internal constant MAX_TERM = 365 days; - - /// @dev The maximum performance fee rate the vault can have. - uint256 internal constant MAX_PERFORMANCE_FEE_RATE = 0.5e8; -} diff --git a/contracts/oracle/IOracle.sol b/contracts/oracle/IOracle.sol deleted file mode 100644 index 4a5c578..0000000 --- a/contracts/oracle/IOracle.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; - -/** - * @title IOracle - * @author Term Structure Labs - */ -interface IOracle { - struct Oracle { - AggregatorV3Interface aggregator; - AggregatorV3Interface backupAggregator; - int256 maxPrice; - uint32 heartbeat; - uint32 backupHeartbeat; - } - - /// @notice Error thrown when the oracle is not working - error OracleIsNotWorking(address asset); - - /// @notice Get the price of an asset - function getPrice(address asset) external view returns (uint256 price, uint8 decimals); - - function submitPendingOracle(address asset, Oracle memory oracle) external; - - function acceptPendingOracle(address asset) external; - - function revokePendingOracle(address asset) external; -} diff --git a/contracts/oracle/IOracleV1.sol b/contracts/oracle/IOracleV1.sol deleted file mode 100644 index 6228777..0000000 --- a/contracts/oracle/IOracleV1.sol +++ /dev/null @@ -1,26 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; - -/** - * @title IOracle - * @author Term Structure Labs - */ -interface IOracle { - struct Oracle { - AggregatorV3Interface aggregator; - AggregatorV3Interface backupAggregator; - uint32 heartbeat; - } - - /// @notice Error thrown when the oracle is not working - error OracleIsNotWorking(address asset); - - /// @notice Get the price of an asset - function getPrice(address asset) external view returns (uint256 price, uint8 decimals); - - function submitPendingOracle(address asset, Oracle memory oracle) external; - - function acceptPendingOracle(address asset) external; -} diff --git a/contracts/oracle/OracleAggregator.sol b/contracts/oracle/OracleAggregator.sol deleted file mode 100644 index e955175..0000000 --- a/contracts/oracle/OracleAggregator.sol +++ /dev/null @@ -1,158 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -/** - * @title OracleAggregator - * @notice This contract references design concepts from AAVE's oracle system - * @dev Implements price feed aggregation with primary and backup oracles, - * staleness checks via heartbeats, and governance-controlled updates with timelocks - * similar to AAVE's oracle architecture - */ -import {Ownable2Step, Ownable} from "@openzeppelin/contracts/access/Ownable2Step.sol"; -import {AggregatorV3Interface, IOracle} from "./IOracle.sol"; - -contract OracleAggregator is IOracle, Ownable2Step { - uint256 internal immutable _timeLock; - - struct PendingOracle { - Oracle oracle; - uint64 validAt; - } - - /// @notice Error thrown when the asset or oracle address is invalid - error InvalidAssetOrOracle(); - - /** - * @notice Error thrown when attempting to set a value that's already set - */ - error AlreadySet(); - - /** - * @notice Error thrown when attempting to submit a change that's already pending - */ - error AlreadyPending(); - - /** - * @notice Error thrown when trying to accept a change that has no pending value - */ - error NoPendingValue(); - - /** - * @notice Error thrown when trying to accept a change before the timelock period has elapsed - */ - error TimelockNotElapsed(); - - /// @notice Event emitted when the oracle of asset is updated - /// @param asset The address of the asset - /// @param aggregator The address of the aggregator - /// @param backupAggregator The address of the backup aggregator - /// @param heartbeat The heartbeat of the oracle - event UpdateOracle( - address indexed asset, - AggregatorV3Interface indexed aggregator, - AggregatorV3Interface indexed backupAggregator, - int256 maxPrice, - uint32 heartbeat, - uint32 backupHeartbeat - ); - - event SubmitPendingOracle( - address indexed asset, - AggregatorV3Interface indexed aggregator, - AggregatorV3Interface indexed backupAggregator, - int256 maxPrice, - uint32 heartbeat, - uint32 backupHeartbeat, - uint64 validAt - ); - - event RevokePendingOracle(address indexed asset); - - /// @notice Oracles - mapping(address => Oracle) public oracles; - - mapping(address => PendingOracle) public pendingOracles; - - constructor(address _owner, uint256 timeLock) Ownable(_owner) { - _timeLock = timeLock; - } - - function submitPendingOracle(address asset, Oracle memory oracle) external onlyOwner { - if (address(oracle.aggregator) == address(0) && address(oracle.backupAggregator) == address(0)) { - delete oracles[asset]; - emit UpdateOracle(asset, AggregatorV3Interface(address(0)), AggregatorV3Interface(address(0)), 0, 0, 0); - return; - } - if (asset == address(0) || oracle.aggregator == AggregatorV3Interface(address(0))) { - revert InvalidAssetOrOracle(); - } - if (address(oracle.backupAggregator) != address(0)) { - if (oracle.aggregator.decimals() != oracle.backupAggregator.decimals()) { - revert InvalidAssetOrOracle(); - } - } - pendingOracles[asset].oracle = oracle; - uint64 validAt = uint64(block.timestamp + _timeLock); - pendingOracles[asset].validAt = validAt; - emit SubmitPendingOracle( - asset, - oracle.aggregator, - oracle.backupAggregator, - oracle.maxPrice, - oracle.heartbeat, - oracle.backupHeartbeat, - validAt - ); - } - - function acceptPendingOracle(address asset) external { - if (pendingOracles[asset].validAt == 0) { - revert NoPendingValue(); - } - if (block.timestamp < pendingOracles[asset].validAt) { - revert TimelockNotElapsed(); - } - Oracle memory oracle = pendingOracles[asset].oracle; - oracles[asset] = oracle; - delete pendingOracles[asset]; - emit UpdateOracle( - asset, oracle.aggregator, oracle.backupAggregator, oracle.maxPrice, oracle.heartbeat, oracle.backupHeartbeat - ); - } - - function revokePendingOracle(address asset) external onlyOwner { - if (pendingOracles[asset].validAt == 0) { - revert NoPendingValue(); - } - delete pendingOracles[asset]; - emit RevokePendingOracle(asset); - } - - /** - * @inheritdoc IOracle - */ - function getPrice(address asset) external view override returns (uint256, uint8) { - Oracle memory oracle = oracles[asset]; - { - (, int256 answer,, uint256 updatedAt,) = oracle.aggregator.latestRoundData(); - if ((oracle.heartbeat == 0 || oracle.heartbeat + updatedAt >= block.timestamp) && answer > 0) { - if (oracle.maxPrice == 0 || answer <= oracle.maxPrice) { - return (uint256(answer), oracle.aggregator.decimals()); - } else if (address(oracle.backupAggregator) == address(0)) { - return (uint256(oracle.maxPrice), oracle.aggregator.decimals()); - } - } - } - if (address(oracle.backupAggregator) != address(0)) { - (, int256 answer,, uint256 updatedAt,) = oracle.backupAggregator.latestRoundData(); - if ((oracle.backupHeartbeat == 0 || oracle.backupHeartbeat + updatedAt >= block.timestamp) && answer > 0) { - if (oracle.maxPrice == 0 || answer <= oracle.maxPrice) { - return (uint256(answer), oracle.backupAggregator.decimals()); - } else { - return (uint256(oracle.maxPrice), oracle.backupAggregator.decimals()); - } - } - } - revert OracleIsNotWorking(asset); - } -} diff --git a/contracts/oracle/priceFeeds/ITermMaxPriceFeed.sol b/contracts/oracle/priceFeeds/ITermMaxPriceFeed.sol deleted file mode 100644 index fa24904..0000000 --- a/contracts/oracle/priceFeeds/ITermMaxPriceFeed.sol +++ /dev/null @@ -1,14 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.20; - -import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; - -/** - * @title The customized price feed interface mutated from Chainlink AggregatorV3Interface - * @author Term Structure Labs - * @notice Use the customized price feed interface to normalize price feed interface for TermMax Protocol - */ -interface ITermMaxPriceFeed is AggregatorV3Interface { - function description() external view returns (string memory); - function asset() external view returns (address); -} diff --git a/contracts/oracle/priceFeeds/TermMaxERC4626PriceFeed.sol b/contracts/oracle/priceFeeds/TermMaxERC4626PriceFeed.sol deleted file mode 100644 index 97a99ac..0000000 --- a/contracts/oracle/priceFeeds/TermMaxERC4626PriceFeed.sol +++ /dev/null @@ -1,63 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {IERC4626} from "@openzeppelin/contracts/interfaces/IERC4626.sol"; -import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; -import {ITermMaxPriceFeed, AggregatorV3Interface} from "./ITermMaxPriceFeed.sol"; -import {MathLib} from "contracts/lib/MathLib.sol"; - -contract TermMaxERC4626PriceFeed is ITermMaxPriceFeed { - using MathLib for *; - - error GetRoundDataNotSupported(); - - AggregatorV3Interface public immutable assetPriceFeed; - address public immutable asset; - int256 immutable priceDemonitor; - uint256 immutable vaultDemonitor; - - constructor(address _assetPriceFeed, address _asset) { - (, int256 answer,,,) = AggregatorV3Interface(_assetPriceFeed).latestRoundData(); - assetPriceFeed = AggregatorV3Interface(_assetPriceFeed); - asset = _asset; - vaultDemonitor = 10 ** IERC4626(asset).decimals(); - priceDemonitor = int256(10 ** assetPriceFeed.decimals()) * int256(vaultDemonitor); - } - - function decimals() public view returns (uint8) { - return 8; - } - - function description() external view returns (string memory) { - string memory symbol = IERC20Metadata(asset).symbol(); - return string(abi.encodePacked("TermMax price feed: ", symbol, "/USD")); - } - - function version() external view returns (uint256) { - return assetPriceFeed.version(); - } - - function getRoundData(uint80 /* _roundId */ ) - external - view - returns ( - uint80, /* roundId */ - int256, /* answer */ - uint256, /* startedAt */ - uint256, /* updatedAt */ - uint80 /* answeredInRound */ - ) - { - // error to call this function because cannot get the chi (rate accumulator) at a specific round - revert GetRoundDataNotSupported(); - } - - function latestRoundData() external view returns (uint80, int256, uint256, uint256, uint80) { - (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) = - assetPriceFeed.latestRoundData(); - uint256 vaultAnswer = - IERC4626(asset).previewRedeem(vaultDemonitor).min(IERC4626(asset).convertToAssets(vaultDemonitor)); - answer = answer * int256(vaultAnswer) * int256((10 ** decimals())) / priceDemonitor; - return (roundId, answer, startedAt, updatedAt, answeredInRound); - } -} diff --git a/contracts/oracle/priceFeeds/TermMaxPTPriceFeed.sol b/contracts/oracle/priceFeeds/TermMaxPTPriceFeed.sol deleted file mode 100644 index f6c55d5..0000000 --- a/contracts/oracle/priceFeeds/TermMaxPTPriceFeed.sol +++ /dev/null @@ -1,135 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {PendlePYLpOracle} from "@pendle/core-v2/contracts/oracles/PtYtLpOracle/PendlePYLpOracle.sol"; -import {PendlePYOracleLib} from "@pendle/core-v2/contracts/oracles/PtYtLpOracle/PendlePYOracleLib.sol"; -import {PMath} from "@pendle/core-v2/contracts/core/libraries/math/PMath.sol"; -import {IPMarket, IPPrincipalToken, IStandardizedYield} from "@pendle/core-v2/contracts/interfaces/IPMarket.sol"; -import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; -import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; -import {Math} from "@openzeppelin/contracts/utils/math/Math.sol"; -import {ITermMaxPriceFeed, AggregatorV3Interface} from "./ITermMaxPriceFeed.sol"; - -/** - * @title The customized Pendle PT price feed contract mutated from Chainlink AggregatorV3Interface - * @author Term Structure Labs - * @notice Use the customized price feed contract to normalized price feed interface for TermMax Protocol - */ -contract TermMaxPTPriceFeed is ITermMaxPriceFeed { - using Math for uint256; - using SafeCast for *; - using PendlePYOracleLib for IPMarket; - - // Pendle PY LP oracle, refer to `https://docs.pendle.finance/Developers/Oracles/HowToIntegratePtAndLpOracle` - PendlePYLpOracle public immutable PY_LP_ORACLE; - // Pendle market - IPMarket public immutable MARKET; - // TWAP duration - uint32 public immutable DURATION; - // Price feed interface - AggregatorV3Interface public immutable PRICE_FEED; - address public immutable asset; - - uint256 private immutable PT_TO_SY_RATE_BASE; - - // error to call `getRoundData` function - error GetRoundDataNotSupported(); - // error when Pendle PY LP oracle is not ready - error OracleIsNotReady(); - // error when price is zero - error PriceIsZero(); - - /** - * @notice Construct the PT price feed contract - * @param pendlePYLpOracle The Pendle PY LP oracle contract - * @param market The Pendle market contract - * @param duration The TWAP duration - * @param priceFeed The price feed interface - */ - constructor(address pendlePYLpOracle, address market, uint32 duration, address priceFeed) { - (, int256 answer,,,) = AggregatorV3Interface(priceFeed).latestRoundData(); - if (answer == 0) revert PriceIsZero(); - - PY_LP_ORACLE = PendlePYLpOracle(pendlePYLpOracle); - MARKET = IPMarket(market); - DURATION = duration; - PRICE_FEED = AggregatorV3Interface(priceFeed); - (IStandardizedYield _SY, IPPrincipalToken _PT,) = MARKET.readTokens(); - uint8 syDecimals = _SY.decimals(); - uint8 ptDecimals = _PT.decimals(); - if (syDecimals < ptDecimals) { - PT_TO_SY_RATE_BASE = PMath.ONE / (10 ** (ptDecimals - syDecimals)); - } else { - PT_TO_SY_RATE_BASE = PMath.ONE * (10 ** (syDecimals - ptDecimals)); - } - asset = address(_PT); - if (!_oracleIsReady()) revert OracleIsNotReady(); - } - - /** - * @notice Revert this function because cannot get the chi (rate accumulator) at a specific round - */ - function getRoundData(uint80 /* _roundId */ ) - external - pure - returns ( - uint80, /* roundId */ - int256, /* answer */ - uint256, /* startedAt */ - uint256, /* updatedAt */ - uint80 /* answeredInRound */ - ) - { - // error to call this function because cannot get the chi (rate accumulator) at a specific round - revert GetRoundDataNotSupported(); - } - - /** - * @notice Get the latest round data from chainlink and calculate the PT price by multiplying PT rate in SY and SY price - * @return roundId The round ID - * @return answer The calculated PT price - * @return startedAt Timestamp of when the round started - * @return updatedAt Timestamp of when the round was updated - * @return answeredInRound The round ID of the round in which the answer was computed - */ - function latestRoundData() - external - view - returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) - { - // PT price = PT rate in SY * SY price / PT to asset rate base - uint256 ptRateInSy = MARKET.getPtToSyRate(DURATION); // PT -> SY - - (roundId, answer, startedAt, updatedAt, answeredInRound) = PRICE_FEED.latestRoundData(); - answer = ptRateInSy.mulDiv(answer.toUint256(), PT_TO_SY_RATE_BASE).toInt256(); - - return (roundId, answer, startedAt, updatedAt, answeredInRound); - } - - /** - * @notice Check if the Pendle PY LP oracle is ready - * @return True if the oracle is ready, otherwise false - */ - function _oracleIsReady() internal view returns (bool) { - (bool increaseCardinalityRequired,, bool oldestObservationSatisfied) = - PY_LP_ORACLE.getOracleState(address(MARKET), DURATION); - - return !increaseCardinalityRequired && oldestObservationSatisfied; - } - - /** - * ========== Return original price feed data ========== - */ - function decimals() external view returns (uint8) { - return PRICE_FEED.decimals(); - } - - function description() external view returns (string memory) { - string memory symbol = IERC20Metadata(asset).symbol(); - return string(abi.encodePacked("TermMax price feed: ", symbol, "/USD")); - } - - function version() external view returns (uint256) { - return PRICE_FEED.version(); - } -} diff --git a/contracts/oracle/priceFeeds/TermMaxPriceFeedConverter.sol b/contracts/oracle/priceFeeds/TermMaxPriceFeedConverter.sol deleted file mode 100644 index 60d9754..0000000 --- a/contracts/oracle/priceFeeds/TermMaxPriceFeedConverter.sol +++ /dev/null @@ -1,63 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; -import {ITermMaxPriceFeed, AggregatorV3Interface} from "./ITermMaxPriceFeed.sol"; -import {MathLib} from "contracts/lib/MathLib.sol"; - -contract TermMaxPriceFeedConverter is ITermMaxPriceFeed { - using MathLib for *; - - error GetRoundDataNotSupported(); - - AggregatorV3Interface public immutable aTokenToBTokenPriceFeed; - AggregatorV3Interface public immutable bTokenToCTokenPriceFeed; - - int256 immutable priceDemonitor; - address public immutable asset; - - constructor(address _aTokenToBTokenPriceFeed, address _bTokenToCTokenPriceFeed, address _asset) { - asset = _asset; - aTokenToBTokenPriceFeed = AggregatorV3Interface(_aTokenToBTokenPriceFeed); - bTokenToCTokenPriceFeed = AggregatorV3Interface(_bTokenToCTokenPriceFeed); - priceDemonitor = - int256(10 ** aTokenToBTokenPriceFeed.decimals()) * int256(10 ** bTokenToCTokenPriceFeed.decimals()); - } - - function decimals() public view returns (uint8) { - return 8; - } - - function description() external view returns (string memory) { - string memory symbol = IERC20Metadata(asset).symbol(); - return string(abi.encodePacked("TermMax price feed: ", symbol, "/USD")); - } - - function version() external view returns (uint256) { - return aTokenToBTokenPriceFeed.version().min(bTokenToCTokenPriceFeed.version()); - } - - function getRoundData(uint80 /* _roundId */ ) - external - view - returns ( - uint80, /* roundId */ - int256, /* answer */ - uint256, /* startedAt */ - uint256, /* updatedAt */ - uint80 /* answeredInRound */ - ) - { - // error to call this function because cannot get the chi (rate accumulator) at a specific round - revert GetRoundDataNotSupported(); - } - - function latestRoundData() external view returns (uint80, int256, uint256, uint256, uint80) { - (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) = - aTokenToBTokenPriceFeed.latestRoundData(); - (, int256 answer2, uint256 startedAt2, uint256 updatedAt2,) = bTokenToCTokenPriceFeed.latestRoundData(); - // tokenPrice = answer * answer2 - answer = answer * answer2 * int256((10 ** decimals())) / priceDemonitor; - return (roundId, answer, startedAt.min(startedAt2), updatedAt.min(updatedAt2), answeredInRound); - } -} diff --git a/contracts/router/ISwapAdapter.sol b/contracts/router/ISwapAdapter.sol deleted file mode 100644 index 52e25b8..0000000 --- a/contracts/router/ISwapAdapter.sol +++ /dev/null @@ -1,49 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; -/// @notice Swap unit - -struct SwapUnit { - /// @notice Adapter's address - address adapter; - /// @notice Input token address - address tokenIn; - /// @notice Output token address - address tokenOut; - /// @notice Encoded swap data - bytes swapData; -} - -/** - * @title TermMax SwapAdapter interface - * @author Term Structure Labs - */ -interface ISwapAdapter { - /// @notice Swap tokenIn to tokenOut - /// @param tokenIn Input token address - /// @param tokenOut Output token address - /// @param tokenInData Encoded token input data - /// @param swapData Encoded swap data - /// @param tokenOutData Encoded token output data - function swap(address tokenIn, address tokenOut, bytes memory tokenInData, bytes memory swapData) - external - returns (bytes memory tokenOutData); - - /// @notice Approve output token - /// @param token Token address - /// @param spender Who spend tokens - /// @param tokenData Encoded token approving data - function approveOutputToken(address token, address spender, bytes memory tokenData) external; - - /// @notice Transfer output token - /// @param token Token address - /// @param to Who receive tokens - /// @param tokenData Encoded token tranfering data - function transferOutputToken(address token, address to, bytes memory tokenData) external; - - /// @notice Transfer input token from an address - /// @param token Token address - /// @param from Who provide tokens - /// @param to Who receive tokens - /// @param tokenData Encoded token tranfering data - function transferInputTokenFrom(address token, address from, address to, bytes memory tokenData) external; -} diff --git a/contracts/router/ITermMaxRouter.sol b/contracts/router/ITermMaxRouter.sol deleted file mode 100644 index 762afd6..0000000 --- a/contracts/router/ITermMaxRouter.sol +++ /dev/null @@ -1,333 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {ITermMaxMarket} from "../ITermMaxMarket.sol"; -import {ITermMaxOrder} from "../ITermMaxOrder.sol"; -import {SwapUnit} from "./ISwapAdapter.sol"; -import {CurveCuts} from "../storage/TermMaxStorage.sol"; -import {ISwapCallback} from "../ISwapCallback.sol"; - -/** - * @title TermMax Router interface - * @author Term Structure Labs - * @notice Interface for the main router contract that handles all user interactions with TermMax protocol - * @dev This interface defines all external functions for swapping, leveraging, and managing positions - */ -interface ITermMaxRouter { - struct TermMaxSwapData { - address tokenIn; - address tokenOut; - ITermMaxOrder[] orders; - uint128[] tradingAmts; - uint128 netTokenAmt; - uint256 deadline; - } - - /** - * @notice Pauses all protocol operations - * @dev Can only be called by authorized addresses - */ - function pause() external; - - /** - * @notice Unpauses protocol operations - * @dev Can only be called by authorized addresses - */ - function unpause() external; - - /** - * @notice View the adapter whitelist status - * @dev Used for controlling which swap adapters can be used - * @param adapter The adapter's address to check whitelist status for - * @return True if whitelisted, false otherwise - */ - function adapterWhitelist(address adapter) external view returns (bool); - - /** - * @notice Set the adapter whitelist status - * @dev Used for controlling which swap adapters can be used - * @param adapter The adapter's address to set whitelist status for - * @param isWhitelist True to whitelist, false to remove from whitelist - */ - function setAdapterWhitelist(address adapter, bool isWhitelist) external; - - /** - * @notice Retrieves all assets owned by an address in a specific market - * @dev Returns both ERC20 tokens and GT (Governance Token) positions - * @param market The market to query assets from - * @param owner The address to check assets for - * @return tokens Array of ERC20 token addresses - * @return balances Corresponding balances for each token - * @return gt The GT token contract address - * @return gtIds Array of GT token IDs owned by the address - */ - function assetsWithERC20Collateral(ITermMaxMarket market, address owner) - external - view - returns (IERC20[4] memory tokens, uint256[4] memory balances, address gt, uint256[] memory gtIds); - - /** - * @notice Swaps an exact amount of input token for output token - * @dev Uses specified orders for the swap path - * @param tokenIn Input token to swap from - * @param tokenOut Output token to swap to - * @param recipient Address to receive the output tokens - * @param orders Array of orders to use for the swap path - * @param tradingAmts Array of amounts to trade for each order - * @param minTokenOut Minimum amount of output tokens to receive - * @param deadline The deadline timestamp for the transaction - * @return netTokenOut Actual amount of output tokens received - */ - function swapExactTokenToToken( - IERC20 tokenIn, - IERC20 tokenOut, - address recipient, - ITermMaxOrder[] memory orders, - uint128[] memory tradingAmts, - uint128 minTokenOut, - uint256 deadline - ) external returns (uint256 netTokenOut); - - /** - * @notice Swaps tokens to receive an exact amount of output token - * @dev Uses specified orders for the swap path - * @param tokenIn Input token to swap from - * @param tokenOut Output token to swap to - * @param recipient Address to receive the output tokens - * @param orders Array of orders to use for the swap path - * @param tradingAmts Array of amounts to trade for each order - * @param maxTokenIn Maximum amount of input tokens to spend - * @param deadline The deadline timestamp for the transaction - * @return netTokenIn Actual amount of input tokens spent - */ - function swapTokenToExactToken( - IERC20 tokenIn, - IERC20 tokenOut, - address recipient, - ITermMaxOrder[] memory orders, - uint128[] memory tradingAmts, - uint128 maxTokenIn, - uint256 deadline - ) external returns (uint256 netTokenIn); - - /** - * @notice Sells FT and XT tokens for underlying tokens - * @dev Executes multiple orders to sell tokens - * @param recipient Address to receive the output tokens - * @param market The market to sell tokens in - * @param ftInAmt Amount of FT tokens to sell - * @param xtInAmt Amount of XT tokens to sell - * @param orders Array of orders to execute - * @param amtsToSellTokens Array of amounts to sell for each order - * @param minTokenOut Minimum amount of output tokens to receive - * @param deadline The deadline timestamp for the transaction - * @return netTokenOut Actual amount of output tokens received - */ - function sellTokens( - address recipient, - ITermMaxMarket market, - uint128 ftInAmt, - uint128 xtInAmt, - ITermMaxOrder[] memory orders, - uint128[] memory amtsToSellTokens, - uint128 minTokenOut, - uint256 deadline - ) external returns (uint256 netTokenOut); - - /** - * @notice Creates a leveraged position from input tokens - * @dev Swaps tokens for XT and creates a leveraged position - * @param recipient Address to receive the position - * @param market The market to create position in - * @param orders Array of orders to execute - * @param amtsToBuyXt Array of amounts of XT to buy for each order - * @param minXtOut Minimum amount of XT to establish the position - * @param tokenToSwap Amount of tokens to swap - * @param maxLtv Maximum loan-to-value ratio - * @param units Array of swap units defining the swap path - * @param deadline The deadline timestamp for the transaction - * @return gtId ID of the generated GT token - * @return netXtOut Amount of XT tokens received - */ - function leverageFromToken( - address recipient, - ITermMaxMarket market, - ITermMaxOrder[] memory orders, - uint128[] memory amtsToBuyXt, - uint128 minXtOut, - uint128 tokenToSwap, - uint128 maxLtv, - SwapUnit[] memory units, - uint256 deadline - ) external returns (uint256 gtId, uint256 netXtOut); - - /** - * @notice Creates a leveraged position from XT tokens - * @dev Uses existing XT tokens to create a leveraged position - * @param recipient Address to receive the position - * @param market The market to create position in - * @param xtInAmt Amount of XT tokens to use - * @param tokenInAmt Amount of additional tokens to use - * @param maxLtv Maximum loan-to-value ratio - * @param units Array of swap units defining the swap path - * @return gtId ID of the generated GT token - */ - function leverageFromXt( - address recipient, - ITermMaxMarket market, - uint128 xtInAmt, - uint128 tokenInAmt, - uint128 maxLtv, - SwapUnit[] memory units - ) external returns (uint256 gtId); - - function leverageFromXtAndCollateral( - address recipient, - ITermMaxMarket market, - uint128 xtInAmt, - uint128 collateralInAmt, - uint128 maxLtv, - SwapUnit[] memory units - ) external returns (uint256 gtId); - - /** - * @notice Borrows tokens using collateral - * @dev Creates a collateralized debt position - * @param recipient Address to receive the borrowed tokens - * @param market The market to borrow from - * @param collInAmt Amount of collateral to deposit - * @param orders Array of orders to execute - * @param tokenAmtsWantBuy Array of token amounts to buy - * @param maxDebtAmt Maximum amount of debt to take on - * @param deadline The deadline timestamp for the transaction - * @return gtId ID of the generated GT token - */ - function borrowTokenFromCollateral( - address recipient, - ITermMaxMarket market, - uint256 collInAmt, - ITermMaxOrder[] memory orders, - uint128[] memory tokenAmtsWantBuy, - uint128 maxDebtAmt, - uint256 deadline - ) external returns (uint256 gtId); - - /** - * @notice Borrows tokens using collateral and XT - * @dev Creates a collateralized debt position - * @param recipient Address to receive the borrowed tokens - * @param market The market to borrow from - * @param collInAmt Amount of collateral to deposit - * @param borrowAmt Amount of tokens to borrow - * @return gtId ID of the generated GT token - */ - function borrowTokenFromCollateral(address recipient, ITermMaxMarket market, uint256 collInAmt, uint256 borrowAmt) - external - returns (uint256 gtId); - - /** - * @notice Borrows tokens from an existing GT position - * @dev Increases the debt of an existing position - * @param recipient Address to receive the borrowed tokens - * @param market The market to borrow from - * @param gtId ID of the GT token to borrow from - * @param borrowAmt Amount of tokens to borrow - */ - function borrowTokenFromGt(address recipient, ITermMaxMarket market, uint256 gtId, uint256 borrowAmt) external; - - /** - * @notice Repays debt from collateral - * @dev Repays debt and closes a position - * @param recipient Address to receive any remaining collateral - * @param market The market to repay debt in - * @param gtId ID of the GT token to repay debt from - * @param byDebtToken True if repaying with debt token, false if using FT token - * @param units Array of swap units defining the external swap path - * @param swapData Data for the termmax swap operation - * @return netTokenOut Actual amount of tokens received - */ - function flashRepayFromColl( - address recipient, - ITermMaxMarket market, - uint256 gtId, - bool byDebtToken, - SwapUnit[] memory units, - TermMaxSwapData memory swapData - ) external returns (uint256 netTokenOut); - - function flashRepayFromCollV2( - address recipient, - ITermMaxMarket market, - uint256 gtId, - uint128 repayAmt, - bool byDebtToken, - bytes memory removedCollateral, - SwapUnit[] memory units, - TermMaxSwapData memory swapData - ) external returns (uint256 netTokenOut); - - /** - * @notice Repays debt using FT tokens - * @dev Repays debt and closes a position - * @param recipient Address to receive any remaining tokens - * @param market The market to repay debt in - * @param gtId ID of the GT token to repay debt from - * @param orders Array of orders to execute - * @param ftAmtsWantBuy Array of FT amounts to buy for each order - * @param maxTokenIn Maximum amount of tokens to spend - * @param deadline The deadline timestamp for the transaction - * @return returnAmt Actual amount of tokens returned - */ - function repayByTokenThroughFt( - address recipient, - ITermMaxMarket market, - uint256 gtId, - ITermMaxOrder[] memory orders, - uint128[] memory ftAmtsWantBuy, - uint128 maxTokenIn, - uint256 deadline - ) external returns (uint256 returnAmt); - - /** - * @notice Redeems FT tokens and swaps for underlying tokens - * @dev Executes a swap to redeem FT tokens - * @param recipient Address to receive the output tokens - * @param market The market to redeem FT tokens in - * @param ftAmount Amount of FT tokens to redeem - * @param units Array of swap units defining the swap path - * @param minTokenOut Minimum amount of output tokens to receive - * @return redeemedAmt Actual amount of output tokens received - */ - function redeemAndSwap( - address recipient, - ITermMaxMarket market, - uint256 ftAmount, - SwapUnit[] memory units, - uint256 minTokenOut - ) external returns (uint256 redeemedAmt); - - /** - * @notice Creates an order and deposits tokens - * @dev Creates a new order and deposits tokens to the market - * @param market The market to create order in - * @param maker Address of the order maker - * @param maxXtReserve Maximum amount of XT to reserve - * @param swapTrigger Swap trigger callback - * @param debtTokenToDeposit Amount of debt tokens to deposit - * @param ftToDeposit Amount of FT tokens to deposit - * @param xtToDeposit Amount of XT tokens to deposit - * @param curveCuts Curve cuts for the order - * @return order The created order - */ - function createOrderAndDeposit( - ITermMaxMarket market, - address maker, - uint256 maxXtReserve, - ISwapCallback swapTrigger, - uint256 debtTokenToDeposit, - uint128 ftToDeposit, - uint128 xtToDeposit, - CurveCuts memory curveCuts - ) external returns (ITermMaxOrder order); -} diff --git a/contracts/router/MarketViewer.sol b/contracts/router/MarketViewer.sol deleted file mode 100644 index 1da0d74..0000000 --- a/contracts/router/MarketViewer.sol +++ /dev/null @@ -1,337 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; -import {IERC721Enumerable} from "@openzeppelin/contracts/interfaces/IERC721Enumerable.sol"; -import {Math} from "@openzeppelin/contracts/utils/math/Math.sol"; -import {ITermMaxMarket} from "contracts/ITermMaxMarket.sol"; -import {ITermMaxOrder} from "contracts/ITermMaxOrder.sol"; -import {IMintableERC20} from "contracts/tokens/IMintableERC20.sol"; -import {IGearingToken} from "contracts/tokens/IGearingToken.sol"; -import {OrderConfig, CurveCuts, FeeConfig, GtConfig} from "contracts/storage/TermMaxStorage.sol"; -import {ITermMaxVault} from "contracts/vault/ITermMaxVault.sol"; -import {OrderInfo} from "contracts/vault/VaultStorage.sol"; -import {PendingAddress, PendingUint192} from "contracts/lib/PendingLib.sol"; -import {OracleAggregator} from "contracts/oracle/OracleAggregator.sol"; - -interface IPausable { - function paused() external view returns (bool); -} - -contract MarketViewer { - using Math for uint256; - - struct LoanPosition { - uint256 loanId; - uint256 collateralAmt; - uint256 debtAmt; - } - - struct LoanPositionV2 { - address owner; - uint256 loanId; - uint256 collateralAmt; - uint256 debtAmt; - uint128 ltv; - bool isHealthy; - bool isLiquidable; - uint128 maxRepayAmt; - } - - struct Position { - uint256 underlyingBalance; - uint256 collateralBalance; - uint256 ftBalance; - uint256 xtBalance; - LoanPosition[] gtInfo; - } - - struct VaultPosition { - uint256 balance; - uint256 toAssetBalance; - uint256 usdValue; - } - - struct OrderState { - uint256 collateralReserve; - uint256 debtReserve; - uint256 ftReserve; - uint256 xtReserve; - uint256 maxXtReserve; - uint256 gtId; - CurveCuts curveCuts; - FeeConfig feeConfig; - } - - struct VaultInfo { - string name; - string symbol; - address assetAddress; - // Basic vault metrics - uint256 totalAssets; - uint256 totalSupply; - uint256 apr; - // Governance settings - address guardian; - address curator; - uint256 timelock; - uint256 maxDeposit; - uint64 performanceFeeRate; - uint256 idleFunds; // asset.balanceOf(address(this)) - // Financial metrics - uint256 totalFt; - uint256 accretingPrincipal; - uint256 annualizedInterest; - uint256 performanceFee; - // Queue information - address[] supplyQueue; - address[] withdrawQueue; - // Pending governance updates - PendingAddress pendingGuardian; - PendingUint192 pendingTimelock; - PendingUint192 pendingPerformanceFeeRate; - uint256 maxMint; // maxMint(address(0)) - uint256 convertToSharesPrice; // convertToShares(One) - bool isPaused; - } - - function getPositionDetail(ITermMaxMarket market, address owner) public view returns (Position memory position) { - (IMintableERC20 ft, IMintableERC20 xt, IGearingToken gt, address collateral, IERC20 underlying) = - market.tokens(); - position.underlyingBalance = underlying.balanceOf(owner); - position.collateralBalance = IERC20(collateral).balanceOf(owner); - position.ftBalance = ft.balanceOf(owner); - position.xtBalance = xt.balanceOf(owner); - - IERC721Enumerable gtNft = IERC721Enumerable(address(gt)); - uint256 balance = gtNft.balanceOf(owner); - LoanPosition[] memory gtInfos = new LoanPosition[](balance); - - uint256 validPositions = 0; - for (uint256 i = 0; i < balance; ++i) { - uint256 loanId = gtNft.tokenOfOwnerByIndex(owner, i); - try gt.loanInfo(loanId) returns (address, uint128 debtAmt, bytes memory collateralData) { - gtInfos[validPositions].loanId = loanId; - gtInfos[validPositions].debtAmt = debtAmt; - gtInfos[validPositions].collateralAmt = _decodeAmount(collateralData); - validPositions++; - } catch { - // Skip this loan ID if loanInfo call fails - } - } - position.gtInfo = new LoanPosition[](validPositions); - for (uint256 i = 0; i < validPositions; i++) { - position.gtInfo[i] = gtInfos[i]; - } - } - - function getPositionDetails(ITermMaxMarket[] memory market, address owner) - external - view - returns (Position[] memory) - { - Position[] memory positions = new Position[](market.length); - for (uint256 i = 0; i < market.length; ++i) { - positions[i] = getPositionDetail(market[i], owner); - } - return positions; - } - - function getAllLoanPosition(ITermMaxMarket market, address owner) external view returns (LoanPosition[] memory) { - (,, IGearingToken gt,,) = market.tokens(); - uint256 balance = gt.balanceOf(owner); - LoanPosition[] memory loanPositionsTmp = new LoanPosition[](balance); - - uint256 validPositions = 0; - for (uint256 i = 0; i < balance; ++i) { - uint256 loanId = gt.tokenOfOwnerByIndex(owner, i); - try gt.loanInfo(loanId) returns (address, uint128 debtAmt, bytes memory collateralData) { - loanPositionsTmp[validPositions].loanId = loanId; - loanPositionsTmp[validPositions].debtAmt = debtAmt; - loanPositionsTmp[validPositions].collateralAmt = _decodeAmount(collateralData); - validPositions++; - } catch { - // Skip this loan ID if loanInfo call fails - } - } - - LoanPosition[] memory loanPositions = new LoanPosition[](validPositions); - for (uint256 i = 0; i < validPositions; i++) { - loanPositions[i] = loanPositionsTmp[i]; - } - return loanPositions; - } - - function getAllLoanPositionV2(ITermMaxMarket market) external view returns (LoanPositionV2[] memory) { - (,, IGearingToken gtNft,,) = market.tokens(); - GtConfig memory config = gtNft.getGtConfig(); - uint256 supply = gtNft.totalSupply(); - LoanPositionV2[] memory loanPositionsTmp = new LoanPositionV2[](supply); - - uint256 validPositions = 0; - for (uint256 i = 0; i < supply; ++i) { - uint256 loanId = gtNft.tokenByIndex(i); - try gtNft.loanInfo(loanId) returns (address owner, uint128 debtAmt, bytes memory collateralData) { - loanPositionsTmp[validPositions].loanId = loanId; - loanPositionsTmp[validPositions].debtAmt = debtAmt; - loanPositionsTmp[validPositions].collateralAmt = _decodeAmount(collateralData); - loanPositionsTmp[validPositions].owner = owner; - try gtNft.getLiquidationInfo(loanId) returns (bool isLiquidable, uint128 ltv, uint128 maxRepayAmt) { - loanPositionsTmp[validPositions].ltv = ltv; - loanPositionsTmp[validPositions].isHealthy = ltv >= config.loanConfig.liquidationLtv; - loanPositionsTmp[validPositions].isLiquidable = isLiquidable; - loanPositionsTmp[validPositions].maxRepayAmt = maxRepayAmt; - } catch { - // Skip this loan ID if getLiquidationInfo call fails - } - validPositions++; - } catch { - // Skip this loan ID if loanInfo call fails - continue; - } - } - - LoanPositionV2[] memory loanPositions = new LoanPositionV2[](validPositions); - for (uint256 i = 0; i < validPositions; i++) { - loanPositions[i] = loanPositionsTmp[i]; - } - return loanPositions; - } - - function getVaultBalance(address user, ITermMaxVault[] memory vaults, OracleAggregator oracleAggregator) - external - view - returns (VaultPosition[] memory) - { - VaultPosition[] memory vaultPositions = new VaultPosition[](vaults.length); - for (uint256 i = 0; i < vaults.length; i++) { - address asset = vaults[i].asset(); - uint256 balance = vaults[i].balanceOf(user); - vaultPositions[i].balance = balance; - vaultPositions[i].toAssetBalance = vaults[i].convertToAssets(balance); - try oracleAggregator.getPrice(asset) returns (uint256 price, uint8) { - uint8 assetDecimals = IERC20Metadata(asset).decimals(); - vaultPositions[i].usdValue = vaultPositions[i].toAssetBalance.mulDiv(price, 10 ** assetDecimals); - } catch { - vaultPositions[i].usdValue = 0; - } - } - return vaultPositions; - } - - function getOrderState(ITermMaxOrder order) external view returns (OrderState memory orderState) { - ITermMaxMarket market = order.market(); - (,, IGearingToken gt,,) = market.tokens(); - - (OrderConfig memory orderConfig) = order.orderConfig(); - (uint256 ftReserve, uint256 xtReserve) = order.tokenReserves(); - if (orderConfig.gtId != 0) { - try gt.loanInfo(orderConfig.gtId) returns (address, uint128 debtAmt, bytes memory collateralData) { - orderState.collateralReserve = _decodeAmount(collateralData); - orderState.debtReserve = debtAmt; - } catch { - // If loan info is unavailable, set defaults - orderState.collateralReserve = 0; - orderState.debtReserve = 0; - } - } - - orderState.ftReserve = ftReserve; - orderState.xtReserve = xtReserve; - orderState.maxXtReserve = orderConfig.maxXtReserve; - orderState.gtId = orderConfig.gtId; - orderState.curveCuts = orderConfig.curveCuts; - orderState.feeConfig = orderConfig.feeConfig; - return orderState; - } - - /** - * @notice Get comprehensive information about a TermMaxVault - * @param vault The TermMaxVault to query - * @return vaultInfo The vault information - */ - function getVaultInfo(ITermMaxVault vault) external view returns (VaultInfo memory vaultInfo) { - IERC20 asset = IERC20(vault.asset()); - - // Basic vault metrics - vaultInfo.name = vault.name(); - vaultInfo.symbol = vault.symbol(); - vaultInfo.assetAddress = address(asset); - vaultInfo.totalAssets = vault.totalAssets(); - vaultInfo.totalSupply = vault.totalSupply(); - vaultInfo.apr = vault.apr(); - - // Governance settings - vaultInfo.guardian = vault.guardian(); - vaultInfo.curator = vault.curator(); - vaultInfo.timelock = vault.timelock(); - vaultInfo.maxDeposit = vault.maxDeposit(address(0)); - - vaultInfo.idleFunds = asset.balanceOf(address(vault)); - - // Financial metrics - vaultInfo.totalFt = vault.totalFt(); - vaultInfo.accretingPrincipal = vault.accretingPrincipal(); - vaultInfo.annualizedInterest = vault.annualizedInterest(); - vaultInfo.performanceFeeRate = vault.performanceFeeRate(); - vaultInfo.performanceFee = vault.performanceFee(); - - // Queue information - uint256 supplyQueueLength = vault.supplyQueueLength(); - vaultInfo.supplyQueue = new address[](supplyQueueLength); - for (uint256 i = 0; i < supplyQueueLength; i++) { - vaultInfo.supplyQueue[i] = vault.supplyQueue(i); - } - - uint256 withdrawQueueLength = vault.withdrawQueueLength(); - vaultInfo.withdrawQueue = new address[](withdrawQueueLength); - for (uint256 i = 0; i < withdrawQueueLength; i++) { - vaultInfo.withdrawQueue[i] = vault.withdrawQueue(i); - } - - // Pending governance updates - vaultInfo.pendingGuardian = vault.pendingGuardian(); - vaultInfo.pendingTimelock = vault.pendingTimelock(); - vaultInfo.pendingPerformanceFeeRate = vault.pendingPerformanceFeeRate(); - - vaultInfo.maxMint = vault.maxMint(address(0)); - uint256 one = 10 ** vault.decimals(); - vaultInfo.convertToSharesPrice = vault.convertToShares(one); - vaultInfo.isPaused = IPausable(address(vault)).paused(); - } - - /** - * @notice Get information about all orders in a vault - * @param vault The TermMaxVault to query - * @return orderInfos Array of information about each order in the vault - */ - function getVaultOrdersInfo(ITermMaxVault vault) external view returns (OrderState[] memory) { - uint256 supplyQueueLength = vault.supplyQueueLength(); - OrderState[] memory orderInfos = new OrderState[](supplyQueueLength); - - for (uint256 i = 0; i < supplyQueueLength; i++) { - address orderAddress = vault.supplyQueue(i); - ITermMaxOrder order = ITermMaxOrder(orderAddress); - orderInfos[i] = this.getOrderState(order); - } - - return orderInfos; - } - - function getVaultPendingMarkets(ITermMaxVault vault, address[] calldata markets) - external - view - returns (PendingUint192[] memory) - { - PendingUint192[] memory pendingMarkets = new PendingUint192[](markets.length); - for (uint256 i = 0; i < markets.length; i++) { - pendingMarkets[i] = vault.pendingMarkets(markets[i]); - } - return pendingMarkets; - } - - function _decodeAmount(bytes memory collateralData) internal pure returns (uint256) { - return abi.decode(collateralData, (uint256)); - } -} diff --git a/contracts/router/TermMaxRouter.sol b/contracts/router/TermMaxRouter.sol deleted file mode 100644 index 2f7d271..0000000 --- a/contracts/router/TermMaxRouter.sol +++ /dev/null @@ -1,742 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {IERC4626} from "@openzeppelin/contracts/interfaces/IERC4626.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {IERC721Enumerable} from "@openzeppelin/contracts/interfaces/IERC721Enumerable.sol"; -import {IERC721Receiver} from "@openzeppelin/contracts/interfaces/IERC721Receiver.sol"; -import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; -import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; -import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; -import { - Ownable2StepUpgradeable, - OwnableUpgradeable -} from "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; -import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; - -import {ITermMaxMarket} from "contracts/ITermMaxMarket.sol"; -import {ITermMaxOrder} from "contracts/ITermMaxOrder.sol"; -import {SwapUnit, ISwapAdapter} from "./ISwapAdapter.sol"; -import {RouterErrors} from "contracts/errors/RouterErrors.sol"; -import {RouterEvents} from "contracts/events/RouterEvents.sol"; -import {TransferUtils} from "contracts/lib/TransferUtils.sol"; -import {IFlashLoanReceiver} from "contracts/IFlashLoanReceiver.sol"; -import {IFlashRepayer} from "contracts/tokens/IFlashRepayer.sol"; -import {ITermMaxRouter} from "./ITermMaxRouter.sol"; -import {IGearingToken} from "contracts/tokens/IGearingToken.sol"; -import {CurveCuts} from "contracts/storage/TermMaxStorage.sol"; -import {ISwapCallback} from "contracts/ISwapCallback.sol"; -import {Constants} from "contracts/lib/Constants.sol"; -import {MathLib} from "contracts/lib/MathLib.sol"; - -/** - * @title TermMax Router - * @author Term Structure Labs - */ -contract TermMaxRouter is - UUPSUpgradeable, - Ownable2StepUpgradeable, - PausableUpgradeable, - IFlashLoanReceiver, - IFlashRepayer, - IERC721Receiver, - ITermMaxRouter, - RouterErrors, - RouterEvents -{ - using SafeCast for *; - using TransferUtils for IERC20; - using MathLib for uint256; - - enum FlashLoanType { - COLLATERAL, - DEBT - } - - enum FlashRepayOptions { - REPAY, - ROLLOVER - } - - /// @notice whitelist mapping of adapter - mapping(address => bool) public adapterWhitelist; - - uint256 private constant T_ROLLOVER_GT_RESERVE_STORE = 0; - - function _authorizeUpgrade(address newImplementation) internal virtual override onlyOwner {} - - function initialize(address admin) public initializer { - __UUPSUpgradeable_init(); - __Pausable_init(); - __Ownable_init(admin); - } - - function depositAndMint(ITermMaxMarket market, address recipient, uint256 amount) external whenNotPaused { - (,,,, IERC20 underlying) = market.tokens(); - IERC4626 vault = IERC4626(address(underlying)); - IERC20(vault.asset()).safeTransferFrom(msg.sender, address(this), amount); - underlying.safeIncreaseAllowance(address(market), amount); - market.mint(recipient, amount); - } - - function burnAndWithdraw(ITermMaxMarket market, address recipient, uint256 amount) external whenNotPaused { - (IERC20 ft, IERC20 xt,,, IERC20 underlying) = market.tokens(); - ft.safeTransferFrom(msg.sender, address(this), amount); - xt.safeTransferFrom(msg.sender, address(this), amount); - market.burn(address(this), address(this), amount); - IERC4626(address(underlying)).redeem(amount, recipient, address(this)); - } - - /** - * @inheritdoc ITermMaxRouter - */ - function setAdapterWhitelist(address adapter, bool isWhitelist) external onlyOwner { - adapterWhitelist[adapter] = isWhitelist; - emit UpdateSwapAdapterWhiteList(adapter, isWhitelist); - } - - /** - * @inheritdoc ITermMaxRouter - */ - function assetsWithERC20Collateral(ITermMaxMarket market, address owner) - external - view - override - returns (IERC20[4] memory tokens, uint256[4] memory balances, address gtAddr, uint256[] memory gtIds) - { - (IERC20 ft, IERC20 xt, IGearingToken gt, address collateral, IERC20 underlying) = market.tokens(); - tokens[0] = ft; - tokens[1] = xt; - tokens[2] = IERC20(collateral); - tokens[3] = underlying; - for (uint256 i = 0; i < 4; ++i) { - balances[i] = tokens[i].balanceOf(owner); - } - gtAddr = address(gt); - uint256 balance = IERC721Enumerable(gtAddr).balanceOf(owner); - gtIds = new uint256[](balance); - for (uint256 i = 0; i < balance; ++i) { - gtIds[i] = IERC721Enumerable(gtAddr).tokenOfOwnerByIndex(owner, i); - } - } - - function swapExactTokenToToken( - IERC20 tokenIn, - IERC20 tokenOut, - address recipient, - ITermMaxOrder[] memory orders, - uint128[] memory tradingAmts, - uint128 minTokenOut, - uint256 deadline - ) external whenNotPaused returns (uint256 netTokenOut) { - uint256 totalAmtIn = sum(tradingAmts); - tokenIn.safeTransferFrom(msg.sender, address(this), totalAmtIn); - netTokenOut = _swapExactTokenToToken(tokenIn, tokenOut, recipient, orders, tradingAmts, minTokenOut, deadline); - emit SwapExactTokenToToken(tokenIn, tokenOut, msg.sender, recipient, orders, tradingAmts, netTokenOut); - } - - function _swapExactTokenToToken( - IERC20 tokenIn, - IERC20 tokenOut, - address recipient, - ITermMaxOrder[] memory orders, - uint128[] memory tradingAmts, - uint128 minTokenOut, - uint256 deadline - ) internal returns (uint256 netTokenOut) { - if (orders.length != tradingAmts.length) revert OrdersAndAmtsLengthNotMatch(); - for (uint256 i = 0; i < orders.length; ++i) { - ITermMaxOrder order = orders[i]; - tokenIn.safeIncreaseAllowance(address(order), tradingAmts[i]); - netTokenOut += order.swapExactTokenToToken(tokenIn, tokenOut, recipient, tradingAmts[i], 0, deadline); - } - if (netTokenOut < minTokenOut) revert InsufficientTokenOut(address(tokenOut), netTokenOut, minTokenOut); - } - - function swapTokenToExactToken( - IERC20 tokenIn, - IERC20 tokenOut, - address recipient, - ITermMaxOrder[] memory orders, - uint128[] memory tradingAmts, - uint128 maxTokenIn, - uint256 deadline - ) external whenNotPaused returns (uint256 netTokenIn) { - tokenIn.safeTransferFrom(msg.sender, address(this), maxTokenIn); - netTokenIn = _swapTokenToExactToken(tokenIn, tokenOut, recipient, orders, tradingAmts, maxTokenIn, deadline); - tokenIn.safeTransfer(msg.sender, maxTokenIn - netTokenIn); - emit SwapTokenToExactToken(tokenIn, tokenOut, msg.sender, recipient, orders, tradingAmts, netTokenIn); - } - - function _swapTokenToExactToken( - IERC20 tokenIn, - IERC20 tokenOut, - address recipient, - ITermMaxOrder[] memory orders, - uint128[] memory tradingAmts, - uint128 maxTokenIn, - uint256 deadline - ) internal returns (uint256 netTokenIn) { - if (orders.length != tradingAmts.length) revert OrdersAndAmtsLengthNotMatch(); - for (uint256 i = 0; i < orders.length; ++i) { - ITermMaxOrder order = orders[i]; - tokenIn.safeIncreaseAllowance(address(order), maxTokenIn); - netTokenIn += - order.swapTokenToExactToken(tokenIn, tokenOut, recipient, tradingAmts[i], maxTokenIn, deadline); - } - if (netTokenIn > maxTokenIn) revert InsufficientTokenIn(address(tokenIn), netTokenIn, maxTokenIn); - } - - function sum(uint128[] memory values) internal pure returns (uint256 total) { - for (uint256 i = 0; i < values.length; ++i) { - total += values[i]; - } - } - - function sellTokens( - address recipient, - ITermMaxMarket market, - uint128 ftInAmt, - uint128 xtInAmt, - ITermMaxOrder[] memory orders, - uint128[] memory amtsToSellTokens, - uint128 minTokenOut, - uint256 deadline - ) external whenNotPaused returns (uint256 netTokenOut) { - (IERC20 ft, IERC20 xt,,, IERC20 debtToken) = market.tokens(); - (uint256 maxBurn, IERC20 toenToSell) = ftInAmt > xtInAmt ? (xtInAmt, ft) : (ftInAmt, xt); - ft.transferFrom(msg.sender, address(this), ftInAmt); - xt.transferFrom(msg.sender, address(this), xtInAmt); - market.burn(address(this), recipient, maxBurn); - - netTokenOut = _swapExactTokenToToken(toenToSell, debtToken, recipient, orders, amtsToSellTokens, 0, deadline); - netTokenOut += maxBurn; - if (netTokenOut < minTokenOut) revert InsufficientTokenOut(address(debtToken), netTokenOut, minTokenOut); - emit SellTokens(market, msg.sender, recipient, ftInAmt, xtInAmt, orders, amtsToSellTokens, netTokenOut); - } - - function leverageFromToken( - address recipient, - ITermMaxMarket market, - ITermMaxOrder[] memory orders, - uint128[] memory amtsToBuyXt, - uint128 minXtOut, - uint128 tokenToSwap, - uint128 maxLtv, - SwapUnit[] memory units, - uint256 deadline - ) external whenNotPaused returns (uint256 gtId, uint256 netXtOut) { - (, IERC20 xt, IGearingToken gt,, IERC20 debtToken) = market.tokens(); - uint256 totalAmtToBuyXt = sum(amtsToBuyXt); - debtToken.safeTransferFrom(msg.sender, address(this), tokenToSwap + totalAmtToBuyXt); - netXtOut = _swapExactTokenToToken(debtToken, xt, address(this), orders, amtsToBuyXt, minXtOut, deadline); - - bytes memory callbackData = abi.encode(address(gt), tokenToSwap, units, FlashLoanType.DEBT); - gtId = market.leverageByXt(address(this), recipient, netXtOut.toUint128(), callbackData); - (,, bytes memory collateralData) = gt.loanInfo(gtId); - (, uint128 ltv,) = gt.getLiquidationInfo(gtId); - if (ltv > maxLtv) { - revert LtvBiggerThanExpected(maxLtv, ltv); - } - emit IssueGt(market, gtId, msg.sender, recipient, tokenToSwap, netXtOut.toUint128(), ltv, collateralData); - } - - /** - * @inheritdoc ITermMaxRouter - */ - function leverageFromXt( - address recipient, - ITermMaxMarket market, - uint128 xtInAmt, - uint128 tokenInAmt, - uint128 maxLtv, - SwapUnit[] memory units - ) external whenNotPaused returns (uint256 gtId) { - (, IERC20 xt, IGearingToken gt,, IERC20 debtToken) = market.tokens(); - debtToken.safeTransferFrom(msg.sender, address(this), tokenInAmt); - - bytes memory callbackData = abi.encode(address(gt), tokenInAmt, units, FlashLoanType.DEBT); - gtId = market.leverageByXt(msg.sender, recipient, xtInAmt.toUint128(), callbackData); - - (,, bytes memory collateralData) = gt.loanInfo(gtId); - (, uint128 ltv,) = gt.getLiquidationInfo(gtId); - if (ltv > maxLtv) { - revert LtvBiggerThanExpected(maxLtv, ltv); - } - emit IssueGt(market, gtId, msg.sender, recipient, tokenInAmt, xtInAmt, ltv, collateralData); - } - - /** - * @inheritdoc ITermMaxRouter - */ - function leverageFromXtAndCollateral( - address recipient, - ITermMaxMarket market, - uint128 xtInAmt, - uint128 collateralInAmt, - uint128 maxLtv, - SwapUnit[] memory units - ) external whenNotPaused returns (uint256 gtId) { - (, IERC20 xt, IGearingToken gt, address collAddr,) = market.tokens(); - IERC20 collateral = IERC20(collAddr); - - collateral.safeTransferFrom(msg.sender, address(this), collateralInAmt); - - bytes memory callbackData = abi.encode(address(gt), 0, units, FlashLoanType.COLLATERAL); - gtId = market.leverageByXt(msg.sender, recipient, xtInAmt.toUint128(), callbackData); - - (,, bytes memory collateralData) = gt.loanInfo(gtId); - (, uint128 ltv,) = gt.getLiquidationInfo(gtId); - if (ltv > maxLtv) { - revert LtvBiggerThanExpected(maxLtv, ltv); - } - emit IssueGt(market, gtId, msg.sender, recipient, 0, xtInAmt, ltv, collateralData); - } - - /** - * @inheritdoc ITermMaxRouter - */ - function borrowTokenFromCollateral( - address recipient, - ITermMaxMarket market, - uint256 collInAmt, - ITermMaxOrder[] memory orders, - uint128[] memory tokenAmtsWantBuy, - uint128 maxDebtAmt, - uint256 deadline - ) external whenNotPaused returns (uint256) { - (IERC20 ft,, IGearingToken gt, address collateralAddr, IERC20 debtToken) = market.tokens(); - IERC20(collateralAddr).safeTransferFrom(msg.sender, address(this), collInAmt); - IERC20(collateralAddr).safeIncreaseAllowance(address(gt), collInAmt); - - (uint256 gtId, uint128 ftOutAmt) = market.issueFt(address(this), maxDebtAmt, _encodeAmount(collInAmt)); - uint256 netTokenIn = - _swapTokenToExactToken(ft, debtToken, recipient, orders, tokenAmtsWantBuy, ftOutAmt, deadline); - uint256 repayAmt = ftOutAmt - netTokenIn; - if (repayAmt > 0) { - ft.safeIncreaseAllowance(address(gt), repayAmt); - gt.repay(gtId, repayAmt.toUint128(), false); - } - - gt.safeTransferFrom(address(this), recipient, gtId); - emit Borrow(market, gtId, msg.sender, recipient, collInAmt, ftOutAmt, netTokenIn.toUint128()); - return gtId; - } - - function borrowTokenFromCollateral(address recipient, ITermMaxMarket market, uint256 collInAmt, uint256 borrowAmt) - external - whenNotPaused - returns (uint256) - { - (IERC20 ft, IERC20 xt, IGearingToken gt, address collateralAddr,) = market.tokens(); - - IERC20(collateralAddr).safeTransferFrom(msg.sender, address(this), collInAmt); - IERC20(collateralAddr).safeIncreaseAllowance(address(gt), collInAmt); - - uint256 mintGtFeeRatio = market.mintGtFeeRatio(); - uint128 debtAmt = ((borrowAmt * Constants.DECIMAL_BASE) / (Constants.DECIMAL_BASE - mintGtFeeRatio)).toUint128(); - - (uint256 gtId, uint128 ftOutAmt) = market.issueFt(address(this), debtAmt, _encodeAmount(collInAmt)); - borrowAmt = borrowAmt.min(ftOutAmt); - xt.safeTransferFrom(msg.sender, address(this), borrowAmt); - - market.burn(address(this), recipient, borrowAmt); - - gt.safeTransferFrom(address(this), recipient, gtId); - emit Borrow(market, gtId, msg.sender, recipient, collInAmt, debtAmt, borrowAmt.toUint128()); - return gtId; - } - - function borrowTokenFromGt(address recipient, ITermMaxMarket market, uint256 gtId, uint256 borrowAmt) - external - whenNotPaused - { - (IERC20 ft, IERC20 xt, IGearingToken gt,,) = market.tokens(); - - if (gt.ownerOf(gtId) != msg.sender) { - revert GtNotOwnedBySender(); - } - - uint256 mintGtFeeRatio = market.mintGtFeeRatio(); - uint128 debtAmt = ((borrowAmt * Constants.DECIMAL_BASE) / (Constants.DECIMAL_BASE - mintGtFeeRatio)).toUint128(); - - uint256 ftOutAmt = market.issueFtByExistedGt(address(this), debtAmt, gtId); - borrowAmt = borrowAmt.min(ftOutAmt); - xt.safeTransferFrom(msg.sender, address(this), borrowAmt); - - market.burn(address(this), recipient, borrowAmt); - - emit Borrow(market, gtId, msg.sender, recipient, 0, debtAmt, borrowAmt.toUint128()); - } - - /** - * Deprecated function - * @dev use `flashRepayFromCollV2` instead - */ - function flashRepayFromColl( - address recipient, - ITermMaxMarket market, - uint256 gtId, - bool byDebtToken, - SwapUnit[] memory units, - TermMaxSwapData memory swapData - ) external whenNotPaused returns (uint256 netTokenOut) { - (,, IGearingToken gt,, IERC20 debtToken) = market.tokens(); - gt.safeTransferFrom(msg.sender, address(this), gtId, ""); - bytes memory callbackData = abi.encode(units, swapData); - callbackData = abi.encode(FlashRepayOptions.REPAY, callbackData); - gt.flashRepay(gtId, byDebtToken, callbackData); - netTokenOut = debtToken.balanceOf(address(this)); - debtToken.safeTransfer(recipient, netTokenOut); - } - - function flashRepayFromCollV2( - address recipient, - ITermMaxMarket market, - uint256 gtId, - uint128 repayAmt, - bool byDebtToken, - bytes memory removedCollateral, - SwapUnit[] memory units, - TermMaxSwapData memory swapData - ) external whenNotPaused returns (uint256 netTokenOut) { - (,, IGearingToken gt,, IERC20 debtToken) = market.tokens(); - gt.safeTransferFrom(msg.sender, address(this), gtId, ""); - bytes memory callbackData = abi.encode(units, swapData); - callbackData = abi.encode(FlashRepayOptions.REPAY, callbackData); - bool repayAll = gt.flashRepay(gtId, repayAmt, byDebtToken, removedCollateral, callbackData); - if (!repayAll) { - gt.safeTransferFrom(address(this), msg.sender, gtId); - } - netTokenOut = debtToken.balanceOf(address(this)); - debtToken.safeTransfer(recipient, netTokenOut); - } - - /** - * @inheritdoc ITermMaxRouter - */ - function repayByTokenThroughFt( - address recipient, - ITermMaxMarket market, - uint256 gtId, - ITermMaxOrder[] memory orders, - uint128[] memory ftAmtsWantBuy, - uint128 maxTokenIn, - uint256 deadline - ) external whenNotPaused returns (uint256 returnAmt) { - (IERC20 ft,, IGearingToken gt,, IERC20 debtToken) = market.tokens(); - - debtToken.safeTransferFrom(msg.sender, address(this), maxTokenIn); - uint256 netCost = - _swapTokenToExactToken(debtToken, ft, address(this), orders, ftAmtsWantBuy, maxTokenIn, deadline); - uint256 totalFtAmt = sum(ftAmtsWantBuy); - (, uint128 repayAmt,) = gt.loanInfo(gtId); - - if (totalFtAmt < repayAmt) { - repayAmt = totalFtAmt.toUint128(); - } - ft.safeIncreaseAllowance(address(gt), repayAmt); - gt.repay(gtId, repayAmt, false); - - returnAmt = maxTokenIn - netCost; - debtToken.safeTransfer(recipient, returnAmt); - if (totalFtAmt > repayAmt) { - ft.safeTransfer(recipient, totalFtAmt - repayAmt); - } - - emit RepayByTokenThroughFt(market, gtId, msg.sender, recipient, repayAmt, returnAmt); - } - - function redeemAndSwap( - address recipient, - ITermMaxMarket market, - uint256 ftAmount, - SwapUnit[] memory units, - uint256 minTokenOut - ) external whenNotPaused returns (uint256) { - (,,,, IERC20 debtToken) = market.tokens(); - (uint256 redeemedAmt, bytes memory collateralData) = market.redeem(msg.sender, address(this), ftAmount); - redeemedAmt += _decodeAmount(_doSwap(collateralData, units)); - if (redeemedAmt < minTokenOut) { - revert InsufficientTokenOut(address(debtToken), redeemedAmt, minTokenOut); - } - debtToken.safeTransfer(recipient, redeemedAmt); - emit RedeemAndSwap(market, ftAmount, msg.sender, recipient, redeemedAmt); - return redeemedAmt; - } - - function createOrderAndDeposit( - ITermMaxMarket market, - address maker, - uint256 maxXtReserve, - ISwapCallback swapTrigger, - uint256 debtTokenToDeposit, - uint128 ftToDeposit, - uint128 xtToDeposit, - CurveCuts memory curveCuts - ) external whenNotPaused returns (ITermMaxOrder order) { - (IERC20 ft, IERC20 xt,,, IERC20 debtToken) = market.tokens(); - order = market.createOrder(maker, maxXtReserve, swapTrigger, curveCuts); - if (debtTokenToDeposit > 0) { - debtToken.safeTransferFrom(msg.sender, address(this), debtTokenToDeposit); - debtToken.safeIncreaseAllowance(address(market), debtTokenToDeposit); - market.mint(address(order), debtTokenToDeposit); - } - if (ftToDeposit > 0) { - ft.safeTransferFrom(msg.sender, address(order), ftToDeposit); - } - if (xtToDeposit > 0) { - xt.safeTransferFrom(msg.sender, address(order), xtToDeposit); - } - - emit CreateOrderAndDeposit(market, order, maker, debtTokenToDeposit, ftToDeposit, xtToDeposit, curveCuts); - } - - function rolloverGt( - address recipient, - IGearingToken gt, - uint256 gtId, - uint128 additionalAssets, - SwapUnit[] memory units, - ITermMaxMarket nextMarket, - uint256 additionnalNextCollateral, - TermMaxSwapData memory swapData, - uint128 maxLtv - ) external whenNotPaused returns (uint256 newGtId) { - // clear ts stograge - assembly { - tstore(T_ROLLOVER_GT_RESERVE_STORE, 0) - } - // additional debt token to reduce the ltv - if (additionalAssets != 0) { - IERC20(swapData.tokenOut).safeTransferFrom(msg.sender, address(this), additionalAssets); - } - // additional collateral to reduce the ltv - if (additionnalNextCollateral != 0) { - IERC20(units[units.length - 1].tokenOut).safeTransferFrom( - msg.sender, address(this), additionnalNextCollateral - ); - } - gt.safeTransferFrom(msg.sender, address(this), gtId, ""); - bytes memory callbackData = - abi.encode(recipient, maxLtv, additionalAssets, nextMarket, additionnalNextCollateral, units, swapData); - callbackData = abi.encode(FlashRepayOptions.ROLLOVER, callbackData); - gt.flashRepay(gtId, true, callbackData); - assembly { - newGtId := tload(T_ROLLOVER_GT_RESERVE_STORE) - } - } - - function rolloverGtV2( - address recipient, - IGearingToken gt, - uint256 gtId, - uint128 repayAmt, - uint128 additionalAssets, - uint256 removedCollateral, - SwapUnit[] memory units, - ITermMaxMarket nextMarket, - uint256 additionnalNextCollateral, - TermMaxSwapData memory swapData, - uint128 maxLtv - ) external whenNotPaused returns (uint256 newGtId) { - // clear ts stograge - assembly { - tstore(T_ROLLOVER_GT_RESERVE_STORE, 0) - } - // additional debt token to reduce the ltv - if (additionalAssets != 0) { - IERC20(swapData.tokenOut).safeTransferFrom(msg.sender, address(this), additionalAssets); - } - // additional collateral to reduce the ltv - if (additionnalNextCollateral != 0) { - IERC20(units[units.length - 1].tokenOut).safeTransferFrom( - msg.sender, address(this), additionnalNextCollateral - ); - } - gt.safeTransferFrom(msg.sender, address(this), gtId, ""); - bytes memory callbackData = - abi.encode(recipient, maxLtv, additionalAssets, nextMarket, additionnalNextCollateral, units, swapData); - callbackData = abi.encode(FlashRepayOptions.ROLLOVER, callbackData); - if (!gt.flashRepay(gtId, repayAmt, true, abi.encode(removedCollateral), callbackData)) { - gt.safeTransferFrom(address(this), recipient, gtId); - } - assembly { - newGtId := tload(T_ROLLOVER_GT_RESERVE_STORE) - } - } - - /// @dev Market flash leverage flashloan callback - function executeOperation(address, IERC20, uint256 amount, bytes memory data) - external - returns (bytes memory collateralData) - { - (address gt, uint256 tokenInAmt, SwapUnit[] memory units, FlashLoanType flashLoanType) = - abi.decode(data, (address, uint256, SwapUnit[], FlashLoanType)); - uint256 totalAmount = amount + tokenInAmt; - collateralData = _doSwap(abi.encode(totalAmount), units); - SwapUnit memory lastUnit = units[units.length - 1]; - if (!adapterWhitelist[lastUnit.adapter]) { - revert AdapterNotWhitelisted(lastUnit.adapter); - } - - if (flashLoanType == FlashLoanType.COLLATERAL) { - IERC20 collateral = IERC20(lastUnit.tokenOut); - uint256 collateralBalance = collateral.balanceOf(address(this)); - collateralData = _encodeAmount(collateralBalance); - // approve all collateral if fashloan type is collateral - collateral.safeIncreaseAllowance(gt, collateralBalance); - } else if (flashLoanType == FlashLoanType.DEBT) { - bytes memory approvalData = - abi.encodeCall(ISwapAdapter.approveOutputToken, (lastUnit.tokenOut, gt, collateralData)); - (bool success, bytes memory returnData) = lastUnit.adapter.delegatecall(approvalData); - if (!success) { - revert ApproveTokenFailWhenSwap(lastUnit.tokenOut, returnData); - } - } - } - - function _balanceOf(IERC20 token, address account) internal view returns (uint256) { - return token.balanceOf(account); - } - - function _encodeAmount(uint256 amount) internal pure returns (bytes memory) { - return abi.encode(amount); - } - - function _decodeAmount(bytes memory collateralData) internal pure returns (uint256) { - return abi.decode(collateralData, (uint256)); - } - - /// @dev Gt flash repay flashloan callback - function executeOperation( - IERC20 repayToken, - uint128 debtAmt, - address, - bytes memory collateralData, - bytes memory callbackData - ) external override { - (FlashRepayOptions option, bytes memory data) = abi.decode(callbackData, (FlashRepayOptions, bytes)); - if (option == FlashRepayOptions.REPAY) { - _flashRepay(repayToken, collateralData, data); - } else if (option == FlashRepayOptions.ROLLOVER) { - _rollover(repayToken, debtAmt, collateralData, data); - } - repayToken.safeIncreaseAllowance(msg.sender, debtAmt); - } - - function _flashRepay(IERC20 repayToken, bytes memory collateralData, bytes memory callbackData) internal { - (SwapUnit[] memory units, TermMaxSwapData memory swapData) = - abi.decode(callbackData, (SwapUnit[], TermMaxSwapData)); - bytes memory outData = _doSwap(collateralData, units); - - if (swapData.orders.length > 0) { - // swap token to exact token - uint256 amount = abi.decode(outData, (uint256)); - _swapTokenToExactToken( - IERC20(swapData.tokenIn), - IERC20(swapData.tokenOut), - address(this), - swapData.orders, - swapData.tradingAmts, - amount.toUint128(), - swapData.deadline - ); - } - } - - function _rollover(IERC20 debtToken, uint256 debtAmt, bytes memory collateralData, bytes memory callbackData) - internal - { - ( - address recipient, - uint128 maxLtv, - uint128 additionalAssets, - ITermMaxMarket market, - uint256 additionnalNextCollateral, - SwapUnit[] memory units, - TermMaxSwapData memory swapData - ) = abi.decode(callbackData, (address, uint128, uint128, ITermMaxMarket, uint256, SwapUnit[], TermMaxSwapData)); - { - // swap collateral - collateralData = units.length == 0 ? collateralData : _doSwap(collateralData, units); - } - (IERC20 ft,, IGearingToken gt, address collateral,) = market.tokens(); - uint256 gtId; - { - // issue new gt - uint256 mintGtFeeRatio = market.mintGtFeeRatio(); - uint128 newDebtAmt = ( - (swapData.netTokenAmt * Constants.DECIMAL_BASE) / (Constants.DECIMAL_BASE - mintGtFeeRatio) - ).toUint128(); - uint256 newCollateralAmt = _decodeAmount(collateralData) + additionnalNextCollateral; - IERC20(collateral).safeIncreaseAllowance(address(gt), newCollateralAmt); - (gtId,) = market.issueFt(address(this), newDebtAmt, abi.encode(newCollateralAmt)); - } - { - uint256 netFtIn = _swapTokenToExactToken( - ft, - debtToken, - address(this), - swapData.orders, - swapData.tradingAmts, - swapData.netTokenAmt, - swapData.deadline - ); - // check remaining ft amount - if (swapData.netTokenAmt > netFtIn) { - uint256 repaidFtAmt = swapData.netTokenAmt - netFtIn; - ft.safeIncreaseAllowance(address(gt), repaidFtAmt); - gt.repay(gtId, repaidFtAmt.toUint128(), false); - } - // check remaining debt token amount - uint256 totalDebtTokenAmt = sum(swapData.tradingAmts) + additionalAssets; - if (totalDebtTokenAmt > debtAmt) { - uint256 repaidDebtAmt = totalDebtTokenAmt - debtAmt; - debtToken.safeIncreaseAllowance(address(gt), repaidDebtAmt); - gt.repay(gtId, repaidDebtAmt.toUint128(), true); - } - (, uint128 ltv,) = gt.getLiquidationInfo(gtId); - if (ltv > maxLtv) { - revert LtvBiggerThanExpected(maxLtv, ltv); - } - } - // transfer new gt to recipient - gt.safeTransferFrom(address(this), recipient, gtId); - assembly { - tstore(T_ROLLOVER_GT_RESERVE_STORE, gtId) - } - } - - function _doSwap(bytes memory inputData, SwapUnit[] memory units) internal returns (bytes memory outData) { - if (units.length == 0) { - revert SwapUnitsIsEmpty(); - } - for (uint256 i = 0; i < units.length; ++i) { - if (!adapterWhitelist[units[i].adapter]) { - revert AdapterNotWhitelisted(units[i].adapter); - } - bytes memory dataToSwap = - abi.encodeCall(ISwapAdapter.swap, (units[i].tokenIn, units[i].tokenOut, inputData, units[i].swapData)); - - (bool success, bytes memory returnData) = units[i].adapter.delegatecall(dataToSwap); - if (!success) { - revert SwapFailed(units[i].adapter, returnData); - } - inputData = abi.decode(returnData, (bytes)); - } - outData = inputData; - } - - function onERC721Received(address, address, uint256, bytes memory) external pure override returns (bytes4) { - return this.onERC721Received.selector; - } - - function pause() external onlyOwner { - _pause(); - } - - function unpause() external onlyOwner { - _unpause(); - } -} diff --git a/contracts/router/swapAdapters/ERC20SwapAdapter.sol b/contracts/router/swapAdapters/ERC20SwapAdapter.sol deleted file mode 100644 index 4120778..0000000 --- a/contracts/router/swapAdapters/ERC20SwapAdapter.sol +++ /dev/null @@ -1,80 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {TransferUtils} from "contracts/lib/TransferUtils.sol"; -import {ISwapAdapter} from "../ISwapAdapter.sol"; - -/** - * @title TermMax ERC20SwapAdapter - * @author Term Structure Labs - */ -abstract contract ERC20SwapAdapter is ISwapAdapter { - using TransferUtils for IERC20; - - /// @notice Error for partial swap - error ERC20InvalidPartialSwap(uint256 expectedTradeAmt, uint256 actualTradeAmt); - - /// @notice Error for less than min token out - error LessThanMinTokenOut(uint256 actual, uint256 expected); - - /** - * @inheritdoc ISwapAdapter - */ - function swap(address tokenIn, address tokenOut, bytes memory tokenInData, bytes memory swapData) - external - override - returns (bytes memory tokenOutData) - { - uint256 tokenInAmt = _decodeAmount(tokenInData); - - uint256 tokenInAmtBefore = IERC20(tokenIn).balanceOf(address(this)); - uint256 tokenOutAmt = _swap(IERC20(tokenIn), IERC20(tokenOut), tokenInAmt, swapData); - uint256 tokenInAmtAfter = IERC20(tokenIn).balanceOf(address(this)); - - // Check partial swap - if (tokenInAmtAfter + tokenInAmt != tokenInAmtBefore) { - revert ERC20InvalidPartialSwap(tokenInAmt, tokenInAmtBefore - tokenInAmtAfter); - } - tokenOutData = _encodeAmount(tokenOutAmt); - } - - function _swap(IERC20 tokenIn, IERC20 tokenOut, uint256 tokenInAmt, bytes memory swapData) - internal - virtual - returns (uint256 tokenOutAmt); - - /** - * @inheritdoc ISwapAdapter - */ - function approveOutputToken(address token, address spender, bytes memory tokenData) external override { - IERC20(token).safeIncreaseAllowance(spender, _decodeAmount(tokenData)); - } - - /** - * @inheritdoc ISwapAdapter - */ - function transferOutputToken(address token, address to, bytes memory tokenData) external override { - IERC20(token).safeTransfer(to, _decodeAmount(tokenData)); - } - - /** - * @inheritdoc ISwapAdapter - */ - function transferInputTokenFrom(address token, address from, address to, bytes memory tokenData) - external - override - { - IERC20(token).safeTransferFrom(from, to, _decodeAmount(tokenData)); - } - - /// @notice Encode uin256 to bytes - function _encodeAmount(uint256 amount) internal pure returns (bytes memory data) { - data = abi.encode(amount); - } - - /// @notice Decode uin256 from bytes - function _decodeAmount(bytes memory data) internal pure returns (uint256 amount) { - amount = abi.decode(data, (uint256)); - } -} diff --git a/contracts/router/swapAdapters/ERC4626VaultAdapter.sol b/contracts/router/swapAdapters/ERC4626VaultAdapter.sol deleted file mode 100644 index e901294..0000000 --- a/contracts/router/swapAdapters/ERC4626VaultAdapter.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {ERC20SwapAdapter, TransferUtils} from "../../router/swapAdapters/ERC20SwapAdapter.sol"; -import {IERC4626} from "@openzeppelin/contracts/interfaces/IERC4626.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; - -/** - * @title TermMax ERC4626VaultAdapter - * @author Term Structure Labs - */ -contract ERC4626VaultAdapter is ERC20SwapAdapter { - using TransferUtils for IERC20; - - enum Action { - Deposit, - Redeem - } - - error InvalidAction(); - - constructor() {} - - function _swap(IERC20 tokenIn, IERC20 tokenOut, uint256 amount, bytes memory swapData) - internal - virtual - override - returns (uint256 tokenOutAmt) - { - (Action action, uint256 inAmount, uint256 minTokenOut) = abi.decode(swapData, (Action, uint256, uint256)); - /** - * Note: Scaling Input/Output amount - */ - minTokenOut = (minTokenOut * amount) / inAmount; - - if (action == Action.Deposit) { - tokenIn.safeIncreaseAllowance(address(tokenOut), amount); - tokenOutAmt = IERC4626(address(tokenOut)).deposit(amount, address(this)); - if (tokenOutAmt < minTokenOut) { - revert LessThanMinTokenOut(tokenOutAmt, minTokenOut); - } - } else if (action == Action.Redeem) { - tokenIn.safeIncreaseAllowance(address(tokenIn), amount); - tokenOutAmt = IERC4626(address(tokenIn)).redeem(amount, address(this), address(this)); - if (tokenOutAmt < minTokenOut) { - revert LessThanMinTokenOut(tokenOutAmt, minTokenOut); - } - } else { - revert InvalidAction(); - } - } -} diff --git a/contracts/router/swapAdapters/KyberswapV2Adapter.sol b/contracts/router/swapAdapters/KyberswapV2Adapter.sol deleted file mode 100644 index 70b8308..0000000 --- a/contracts/router/swapAdapters/KyberswapV2Adapter.sol +++ /dev/null @@ -1,48 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {Address} from "@openzeppelin/contracts/utils/Address.sol"; -import {ERC20SwapAdapter, TransferUtils, IERC20} from "../../router/swapAdapters/ERC20SwapAdapter.sol"; - -interface IKyberScalingHelper { - function getScaledInputData(bytes calldata inputData, uint256 newAmount) - external - view - returns (bool isSuccess, bytes memory data); -} - -/** - * @title TermMax KyberswapV2Adapter - * @author Term Structure Labs - */ -contract KyberswapV2Adapter is ERC20SwapAdapter { - using Address for address; - using TransferUtils for IERC20; - - error KyberScalingFailed(); - - address public immutable router; - address public immutable KYBER_SCALING_HELPER; - - constructor(address router_, address scalingHelper_) { - router = router_; - KYBER_SCALING_HELPER = scalingHelper_; // 0x2f577A41BeC1BE1152AeEA12e73b7391d15f655D - } - - function _swap(IERC20 tokenIn, IERC20, uint256 amountIn, bytes memory swapData) - internal - virtual - override - returns (uint256) - { - IERC20(tokenIn).safeIncreaseAllowance(address(router), amountIn); - (bool isSuccess, bytes memory newSwapData) = - IKyberScalingHelper(KYBER_SCALING_HELPER).getScaledInputData(swapData, amountIn); - - require(isSuccess, KyberScalingFailed()); - - bytes memory returnData = router.functionCall(newSwapData); - (uint256 tokenOutAmt,) = abi.decode(returnData, (uint256, uint256)); - return tokenOutAmt; - } -} diff --git a/contracts/router/swapAdapters/OdosV2Adapter.sol b/contracts/router/swapAdapters/OdosV2Adapter.sol deleted file mode 100644 index 99438ea..0000000 --- a/contracts/router/swapAdapters/OdosV2Adapter.sol +++ /dev/null @@ -1,66 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import "./ERC20SwapAdapter.sol"; - -interface IOdosRouterV2 { - struct swapTokenInfo { - address inputToken; - uint256 inputAmount; - address inputReceiver; - address outputToken; - uint256 outputQuote; - uint256 outputMin; - address outputReceiver; - } - - function swap(swapTokenInfo memory tokenInfo, bytes calldata pathDefinition, address executor, uint32 referralCode) - external - payable - returns (uint256 amountOut); -} - -/** - * @title TermMax OdosAdapterV2Adapter - * @author Term Structure Labs - */ -contract OdosV2Adapter is ERC20SwapAdapter { - using TransferUtils for IERC20; - - error InvalidOutputToken(); - - IOdosRouterV2 public immutable router; - - constructor(address router_) { - router = IOdosRouterV2(router_); - } - - function _swap(IERC20 tokenIn, IERC20 tokenOut, uint256 amountIn, bytes memory swapData) - internal - virtual - override - returns (uint256 tokenOutAmt) - { - tokenIn.safeIncreaseAllowance(address(router), amountIn); - - ( - IOdosRouterV2.swapTokenInfo memory tokenInfo, - bytes memory pathDefinition, - address executor, - uint32 referralCode - ) = abi.decode(swapData, (IOdosRouterV2.swapTokenInfo, bytes, address, uint32)); - - if (tokenInfo.outputToken != address(tokenOut)) { - revert InvalidOutputToken(); - } - /** - * Note: Scaling Input/Output amount - */ - tokenInfo.outputQuote = (tokenInfo.outputQuote * amountIn) / tokenInfo.inputAmount; - tokenInfo.outputMin = (tokenInfo.outputMin * amountIn) / tokenInfo.inputAmount; - tokenInfo.inputAmount = amountIn; - tokenInfo.outputReceiver = address(this); - - tokenOutAmt = router.swap(tokenInfo, pathDefinition, executor, referralCode); - } -} diff --git a/contracts/router/swapAdapters/PendleSwapV3Adapter.sol b/contracts/router/swapAdapters/PendleSwapV3Adapter.sol deleted file mode 100644 index 55fc6fc..0000000 --- a/contracts/router/swapAdapters/PendleSwapV3Adapter.sol +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {PendleHelper} from "contracts/extensions/pendle/PendleHelper.sol"; -import {IPAllActionV3} from "@pendle/core-v2/contracts/interfaces/IPAllActionV3.sol"; -import {IPMarket, IPPrincipalToken} from "@pendle/core-v2/contracts/interfaces/IPMarket.sol"; -import "./ERC20SwapAdapter.sol"; -/** - * @title TermMax PendleSwapV3Adapter - * @author Term Structure Labs - */ - -contract PendleSwapV3Adapter is ERC20SwapAdapter, PendleHelper { - using TransferUtils for IERC20; - - IPAllActionV3 public immutable router; - - constructor(address router_) { - router = IPAllActionV3(router_); - } - - function _swap(IERC20 tokenIn, IERC20 tokenOut, uint256 amount, bytes memory swapData) - internal - virtual - override - returns (uint256 tokenOutAmt) - { - (address ptMarketAddr, uint256 inAmount, uint256 minTokenOut) = - abi.decode(swapData, (address, uint256, uint256)); - IPMarket market = IPMarket(ptMarketAddr); - - (, IPPrincipalToken PT,) = market.readTokens(); - IERC20(tokenIn).safeIncreaseAllowance(address(router), amount); - - /** - * Note: Scaling Input/Output amount - */ - minTokenOut = (minTokenOut * amount) / inAmount; - if (tokenOut == PT) { - (tokenOutAmt,,) = router.swapExactTokenForPt( - address(this), - address(market), - minTokenOut, - defaultApprox, - createTokenInputStruct(address(tokenIn), amount), - emptyLimit - ); - } else { - if (PT.isExpired()) { - (tokenOutAmt,) = router.redeemPyToToken( - address(this), PT.YT(), amount, createTokenOutputStruct(address(tokenOut), minTokenOut) - ); - } else { - (tokenOutAmt,,) = router.swapExactPtForToken( - address(this), - address(market), - amount, - createTokenOutputStruct(address(tokenOut), minTokenOut), - emptyLimit - ); - } - } - } -} diff --git a/contracts/router/swapAdapters/UniswapV3Adapter.sol b/contracts/router/swapAdapters/UniswapV3Adapter.sol deleted file mode 100644 index cddd085..0000000 --- a/contracts/router/swapAdapters/UniswapV3Adapter.sol +++ /dev/null @@ -1,45 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {TransferHelper} from "@uniswap/v3-periphery/contracts/libraries/TransferHelper.sol"; -import {ISwapRouter} from "@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol"; -import "./ERC20SwapAdapter.sol"; - -/** - * @title TermMax UniswapV3Adapter - * @author Term Structure Labs - */ -contract UniswapV3Adapter is ERC20SwapAdapter { - using TransferUtils for IERC20; - - ISwapRouter public immutable router; - - constructor(address router_) { - router = ISwapRouter(router_); - } - - function _swap(IERC20 tokenIn, IERC20, uint256 amount, bytes memory swapData) - internal - virtual - override - returns (uint256 tokenOutAmt) - { - IERC20(tokenIn).safeIncreaseAllowance(address(router), amount); - (bytes memory path, uint256 deadline, uint256 inAmount, uint256 amountOutMinimum) = - abi.decode(swapData, (bytes, uint256, uint256, uint256)); - /** - * Note: Scaling Input/Output amount - */ - amountOutMinimum = (amountOutMinimum * amount) / inAmount; - - tokenOutAmt = router.exactInput( - ISwapRouter.ExactInputParams({ - path: path, - recipient: address(this), - deadline: deadline, - amountIn: amount, - amountOutMinimum: amountOutMinimum - }) - ); - } -} diff --git a/contracts/storage/TermMaxStorage.sol b/contracts/storage/TermMaxStorage.sol deleted file mode 100644 index 6e67126..0000000 --- a/contracts/storage/TermMaxStorage.sol +++ /dev/null @@ -1,124 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {IOracle} from "../oracle/IOracle.sol"; -import {ISwapCallback} from "../ISwapCallback.sol"; - -/** - * @title The data struct of token pair - * @author Term Structure Labs - */ -struct CurveCut { - uint256 xtReserve; - uint256 liqSquare; - int256 offset; -} - -struct FeeConfig { - /// @notice The lending fee ratio taker - /// i.e. 0.01e8 means 1% - uint32 lendTakerFeeRatio; - /// @notice The lending fee ratio for maker - /// i.e. 0.01e8 means 1% - uint32 lendMakerFeeRatio; - /// @notice The borrowing fee ratio for taker - /// i.e. 0.01e8 means 1% - uint32 borrowTakerFeeRatio; - /// @notice The borrowing fee ratio for maker - /// i.e. 0.01e8 means 1% - uint32 borrowMakerFeeRatio; - /// @notice The fee ratio when minting GT tokens by collateral - /// i.e. 0.01e8 means 1% - uint32 mintGtFeeRatio; - /// @notice The fee ref when minting GT tokens by collateral - /// i.e. 0.01e8 means 1% - uint32 mintGtFeeRef; -} - -struct CurveCuts { - /// @notice The curve cuts of the market to lend - CurveCut[] lendCurveCuts; - /// @notice The curve cuts of the market to borrow - CurveCut[] borrowCurveCuts; -} - -struct MarketConfig { - /// @notice The treasurer's address, which will receive protocol fee - address treasurer; - /// @notice The unix time of maturity date - uint64 maturity; - /// @notice The fee ratio when tradings with the market and orders - FeeConfig feeConfig; -} - -struct LoanConfig { - /// @notice The oracle aggregator - IOracle oracle; - /// @notice The debt liquidation threshold - /// If the loan to collateral is greater than or equal to this value, - /// it will be liquidated - /// i.e. 0.9e8 means debt value is the 90% of collateral value - uint32 liquidationLtv; - /// @notice Maximum loan to collateral when borrowing - /// i.e. 0.85e8 means debt value is the 85% of collateral value - uint32 maxLtv; - /// @notice The flag to indicate debt is liquidatable or not - /// @dev If liquidatable is false, the collateral can only be delivered after maturity - bool liquidatable; -} - -/// @notice Data of Gearing Token's configuturation -struct GtConfig { - /// @notice The address of collateral token - address collateral; - /// @notice The debtToken(debt) token - IERC20Metadata debtToken; - /// @notice The bond token - IERC20 ft; - /// @notice The treasurer's address, which will receive protocol reward while liquidation - address treasurer; - /// @notice The unix time of maturity date - uint64 maturity; - /// @notice The configuration of oracle, ltv and liquidation - LoanConfig loanConfig; -} - -struct OrderConfig { - CurveCuts curveCuts; - uint256 gtId; - uint256 maxXtReserve; - ISwapCallback swapTrigger; - FeeConfig feeConfig; -} - -struct MarketInitialParams { - /// @notice The address of collateral token - address collateral; - /// @notice The debtToken(debt) token - IERC20Metadata debtToken; - /// @notice The admin address - address admin; - /// @notice The implementation of TermMax Gearing Token contract - address gtImplementation; - /// @notice The configuration of market - MarketConfig marketConfig; - /// @notice The configuration of loan - LoanConfig loanConfig; - /// @notice The encoded parameters to initialize GT implementation contract - bytes gtInitalParams; - string tokenName; - string tokenSymbol; -} - -struct VaultInitialParams { - address admin; - address curator; - uint256 timelock; - IERC20 asset; - uint256 maxCapacity; - string name; - string symbol; - uint64 performanceFeeRate; -} diff --git a/contracts/test/MockAave.sol b/contracts/test/MockAave.sol deleted file mode 100644 index f9fabc6..0000000 --- a/contracts/test/MockAave.sol +++ /dev/null @@ -1,58 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; -import {IAaveV3Minimal} from "contracts/extensions/aave/IAaveV3Minimal.sol"; -import {IMintableERC20, IERC20} from "contracts/tokens/IMintableERC20.sol"; - -contract MockAave is ERC20, IAaveV3Minimal { - IERC20 public immutable underlying; - - constructor(address underlying_) ERC20("MockAave", "mAAVE") { - underlying = IERC20(underlying_); - } - - function getReserveData(address) external view override returns (ReserveData memory) { - return ReserveData({ - configuration: ReserveConfigurationMap({data: 0}), - liquidityIndex: 1e27, - currentLiquidityRate: 0, - variableBorrowIndex: 1e27, - currentVariableBorrowRate: 0, - currentStableBorrowRate: 0, - lastUpdateTimestamp: uint40(block.timestamp), - id: 0, - aTokenAddress: address(this), - stableDebtTokenAddress: address(0), - variableDebtTokenAddress: address(0), - interestRateStrategyAddress: address(0), - accruedToTreasury: 0, - unbacked: 0, - isolationModeTotalDebt: 0 - }); - } - - function supply(address asset, uint256 amount, address onBehalfOf, uint16 /* referralCode */ ) external override { - // Transfer tokens from sender to this contract - IERC20(asset).transferFrom(msg.sender, address(this), amount); - // Mint aTokens to the onBehalfOf address - _mint(onBehalfOf, amount); - } - - function withdraw(address asset, uint256 amount, address to) external override returns (uint256) { - // Burn aTokens from sender - _burn(msg.sender, amount); - uint256 balance = IERC20(asset).balanceOf(address(this)); - if (balance < amount) { - IMintableERC20(asset).mint(address(this), amount - balance); - } - // Transfer underlying tokens to the recipient - IERC20(asset).transfer(to, amount); - return amount; - } - - function simulateInterestAccrual(address to, uint256 amount) external { - // Simulate interest accrual by minting aTokens - _mint(to, amount); - } -} diff --git a/contracts/test/MockERC20.sol b/contracts/test/MockERC20.sol deleted file mode 100644 index cd7aad2..0000000 --- a/contracts/test/MockERC20.sol +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; - -contract MockERC20 is ERC20 { - uint8 private immutable _decimals; - - constructor(string memory name, string memory symbol, uint8 _dec) ERC20(name, symbol) { - _decimals = _dec; - } - - function decimals() public view virtual override returns (uint8) { - return _decimals; - } - - function mint(address to, uint256 amount) external { - _mint(to, amount); - } -} diff --git a/contracts/test/MockFlashLoanReceiver.sol b/contracts/test/MockFlashLoanReceiver.sol deleted file mode 100644 index 2f420b0..0000000 --- a/contracts/test/MockFlashLoanReceiver.sol +++ /dev/null @@ -1,37 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {ITermMaxMarket, IFlashLoanReceiver, IGearingToken, IERC20} from "contracts/TermMaxMarket.sol"; - -contract MockFlashLoanReceiver is IFlashLoanReceiver { - ITermMaxMarket market; - IGearingToken gt; - address collateral; - IERC20 underlying; - IERC20 xt; - - constructor(ITermMaxMarket market_) { - market = market_; - - (, xt, gt, collateral, underlying) = market.tokens(); - } - - function executeOperation(address gtReceiver, IERC20 asset, uint256 amount, bytes calldata data) - external - override - returns (bytes memory collateralData) - { - (address caller, uint256 collateralAmt) = abi.decode(data, (address, uint256)); - IERC20(collateral).approve(address(gt), collateralAmt); - - assert(gtReceiver == caller); - assert(asset == underlying); - assert(asset.balanceOf(address(this)) == amount); - - collateralData = abi.encode(collateralAmt); - } - - function leverageByXt(uint128 xtAmt, bytes calldata callbackData) external returns (uint256 gtId) { - gtId = market.leverageByXt(msg.sender, msg.sender, xtAmt, callbackData); - } -} diff --git a/contracts/test/MockFlashRepayer.sol b/contracts/test/MockFlashRepayer.sol deleted file mode 100644 index 4294c24..0000000 --- a/contracts/test/MockFlashRepayer.sol +++ /dev/null @@ -1,32 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {IGearingToken, IERC20, IFlashRepayer} from "contracts/tokens/AbstractGearingToken.sol"; -import {IERC721Receiver} from "@openzeppelin/contracts/interfaces/IERC721Receiver.sol"; - -contract MockFlashRepayer is IFlashRepayer, IERC721Receiver { - IGearingToken gt; - - constructor(IGearingToken gt_) { - gt = gt_; - } - - function flashRepay(uint256 id, uint128 repayAmt, bool byUnderlying, bytes calldata removedCollateral) external { - gt.safeTransferFrom(msg.sender, address(this), id, ""); - bool repayAll = gt.flashRepay(id, repayAmt, byUnderlying, removedCollateral, ""); - if (!repayAll) { - gt.safeTransferFrom(address(this), msg.sender, id, ""); - } - } - - function executeOperation(IERC20 repayToken, uint128 debtAmt, address, bytes memory, bytes calldata) - external - override - { - repayToken.approve(address(gt), debtAmt); - } - - function onERC721Received(address, address, uint256, bytes calldata) external pure override returns (bytes4) { - return this.onERC721Received.selector; - } -} diff --git a/contracts/test/MockOrder.sol b/contracts/test/MockOrder.sol deleted file mode 100644 index 8d755a5..0000000 --- a/contracts/test/MockOrder.sol +++ /dev/null @@ -1,317 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; -import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; -import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; -import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; -import {ITermMaxOrder, IERC20} from "contracts/ITermMaxOrder.sol"; -import {ITermMaxMarket} from "contracts/ITermMaxMarket.sol"; -import {IGearingToken} from "contracts/tokens/IGearingToken.sol"; -import {IFlashLoanReceiver} from "contracts/IFlashLoanReceiver.sol"; -import {Constants} from "contracts/lib/Constants.sol"; -import {TermMaxCurve, MathLib} from "contracts/lib/TermMaxCurve.sol"; -import {OrderErrors} from "contracts/errors/OrderErrors.sol"; -import {OrderEvents} from "contracts/events/OrderEvents.sol"; -import {OrderConfig, MarketConfig, CurveCuts, CurveCut, FeeConfig} from "contracts/storage/TermMaxStorage.sol"; -import {ISwapCallback} from "contracts/ISwapCallback.sol"; -import {TransferUtils} from "contracts/lib/TransferUtils.sol"; - -/** - * @title TermMax Order - * @author Term Structure Labs - */ -contract MockOrder is - ITermMaxOrder, - ReentrancyGuardUpgradeable, - OwnableUpgradeable, - PausableUpgradeable, - OrderErrors, - OrderEvents -{ - using SafeCast for uint256; - using SafeCast for int256; - using TransferUtils for IERC20; - - ITermMaxMarket public market; - - IERC20 private ft; - IERC20 private xt; - IERC20 private debtToken; - IGearingToken private gt; - - OrderConfig private _orderConfig; - - address public maker; - - uint64 private maturity; - - /// @notice Check if the market is borrowing allowed - modifier isBorrowingAllowed(OrderConfig memory config) { - if (config.curveCuts.borrowCurveCuts.length == 0) { - revert BorrowIsNotAllowed(); - } - _; - } - - /// @notice Check if the market is lending allowed - modifier isLendingAllowed(OrderConfig memory config) { - if (config.curveCuts.lendCurveCuts.length == 0) { - revert LendIsNotAllowed(); - } - _; - } - - /// @notice Check if the order is tradable - modifier isOpen() { - _requireNotPaused(); - if (block.timestamp >= maturity) { - revert TermIsNotOpen(); - } - _; - } - - modifier onlyMarket() { - if (msg.sender != address(market)) revert OnlyMarket(); - _; - } - - constructor() { - _disableInitializers(); - } - - /** - * @inheritdoc ITermMaxOrder - */ - function initialize( - address maker_, - IERC20[3] memory tokens, - IGearingToken gt_, - uint256 maxXtReserve_, - ISwapCallback swapTrigger, - CurveCuts memory curveCuts_, - MarketConfig memory marketConfig - ) external override initializer { - __Ownable_init(maker_); - __ReentrancyGuard_init(); - __Pausable_init(); - market = ITermMaxMarket(_msgSender()); - maker = maker_; - _orderConfig.curveCuts = curveCuts_; - _orderConfig.feeConfig = marketConfig.feeConfig; - _orderConfig.maxXtReserve = maxXtReserve_; - _orderConfig.swapTrigger = swapTrigger; - maturity = marketConfig.maturity; - - ft = tokens[0]; - xt = tokens[1]; - debtToken = tokens[2]; - gt = gt_; - emit OrderInitialized(market, maker_, maxXtReserve_, swapTrigger, curveCuts_); - } - - /** - * @inheritdoc ITermMaxOrder - */ - function orderConfig() external view returns (OrderConfig memory) { - return _orderConfig; - } - - /** - * @inheritdoc ITermMaxOrder - */ - function tokenReserves() public view override returns (uint256, uint256) { - return (ft.balanceOf(address(this)), xt.balanceOf(address(this))); - } - - /** - * @inheritdoc ITermMaxOrder - */ - function apr() external view override returns (uint256 lendApr_, uint256 borrowApr_) { - uint256 daysToMaturity = _daysToMaturity(); - uint256 oriXtReserve = xt.balanceOf(address(this)); - - CurveCuts memory curveCuts = _orderConfig.curveCuts; - - uint256 lendCutId = TermMaxCurve.calcCutId(curveCuts.lendCurveCuts, oriXtReserve); - (, uint256 lendVXtReserve, uint256 lendVFtReserve) = TermMaxCurve.calcIntervalProps( - Constants.DECIMAL_BASE, daysToMaturity, curveCuts.lendCurveCuts[lendCutId], oriXtReserve - ); - lendApr_ = - ((lendVFtReserve * Constants.DECIMAL_BASE * Constants.DAYS_IN_YEAR) / lendVXtReserve) * daysToMaturity; - - uint256 borrowCutId = TermMaxCurve.calcCutId(curveCuts.borrowCurveCuts, oriXtReserve); - (, uint256 borrowVXtReserve, uint256 borrowVFtReserve) = TermMaxCurve.calcIntervalProps( - Constants.DECIMAL_BASE, daysToMaturity, curveCuts.borrowCurveCuts[borrowCutId], oriXtReserve - ); - borrowApr_ = - ((borrowVFtReserve * Constants.DECIMAL_BASE * Constants.DAYS_IN_YEAR) / borrowVXtReserve) * daysToMaturity; - } - - /** - * @inheritdoc ITermMaxOrder - */ - function updateOrder(OrderConfig memory newOrderConfig, int256 ftChangeAmt, int256 xtChangeAmt) - external - override - onlyOwner - { - _updateCurve(newOrderConfig.curveCuts); - if (ftChangeAmt > 0) { - ft.safeTransferFrom(msg.sender, address(this), ftChangeAmt.toUint256()); - } else if (ftChangeAmt < 0) { - ft.safeTransfer(msg.sender, (-ftChangeAmt).toUint256()); - } - if (xtChangeAmt > 0) { - xt.safeTransferFrom(msg.sender, address(this), xtChangeAmt.toUint256()); - } else if (xtChangeAmt < 0) { - xt.safeTransfer(msg.sender, (-xtChangeAmt).toUint256()); - } - _orderConfig.maxXtReserve = newOrderConfig.maxXtReserve; - _orderConfig.gtId = newOrderConfig.gtId; - _orderConfig.swapTrigger = newOrderConfig.swapTrigger; - emit UpdateOrder( - newOrderConfig.curveCuts, - ftChangeAmt, - xtChangeAmt, - newOrderConfig.gtId, - newOrderConfig.maxXtReserve, - newOrderConfig.swapTrigger - ); - } - - function _updateCurve(CurveCuts memory newCurveCuts) internal { - bytes32 newCurveCutsHash = keccak256(abi.encode(newCurveCuts)); - CurveCuts memory oldCurveCuts = _orderConfig.curveCuts; - if (keccak256(abi.encode(oldCurveCuts)) != newCurveCutsHash) { - if (newCurveCuts.lendCurveCuts.length > 0) { - if (newCurveCuts.lendCurveCuts[0].xtReserve != 0) revert InvalidCurveCuts(); - } - for (uint256 i = 1; i < newCurveCuts.lendCurveCuts.length; i++) { - if (newCurveCuts.lendCurveCuts[i].xtReserve <= newCurveCuts.lendCurveCuts[i - 1].xtReserve) { - revert InvalidCurveCuts(); - } - } - if (newCurveCuts.borrowCurveCuts.length > 0) { - if (newCurveCuts.borrowCurveCuts[0].xtReserve != 0) revert InvalidCurveCuts(); - } - for (uint256 i = 1; i < newCurveCuts.borrowCurveCuts.length; i++) { - if (newCurveCuts.borrowCurveCuts[i].xtReserve <= newCurveCuts.borrowCurveCuts[i - 1].xtReserve) { - revert InvalidCurveCuts(); - } - } - _orderConfig.curveCuts = newCurveCuts; - } - } - - function updateFeeConfig(FeeConfig memory newFeeConfig) external override onlyMarket { - _orderConfig.feeConfig = newFeeConfig; - emit UpdateFeeConfig(newFeeConfig); - } - - /// @notice Calculate how many days until expiration - function _daysToMaturity() internal view returns (uint256 daysToMaturity) { - daysToMaturity = (maturity - block.timestamp + Constants.SECONDS_IN_DAY - 1) / Constants.SECONDS_IN_DAY; - } - - /** - * @inheritdoc ITermMaxOrder - */ - function swapExactTokenToToken( - IERC20 tokenIn, - IERC20 tokenOut, - address recipient, - uint128 tokenAmtIn, - uint128 minTokenOut, - uint256 - ) external override nonReentrant isOpen returns (uint256 netTokenOut) { - if (tokenIn == tokenOut) revert CantSwapSameToken(); - uint256 feeAmt = 0; - uint256 ftBlanceBefore = ft.balanceOf(address(this)); - uint256 xtBlanceBefore = xt.balanceOf(address(this)); - - tokenIn.safeTransferFrom(msg.sender, address(this), tokenAmtIn); - if (tokenIn == debtToken) { - tokenIn.safeIncreaseAllowance(address(market), tokenAmtIn); - market.mint(address(this), tokenAmtIn); - } - if (tokenOut == debtToken) { - market.burn(address(this), recipient, minTokenOut); - } else { - tokenOut.safeTransfer(recipient, minTokenOut); - } - - netTokenOut = minTokenOut; - - if (address(_orderConfig.swapTrigger) != address(0)) { - uint256 ftReserve = ft.balanceOf(address(this)); - uint256 xtReserve = xt.balanceOf(address(this)); - int256 deltaFt = ftReserve.toInt256() - ftBlanceBefore.toInt256(); - int256 deltaXt = xtReserve.toInt256() - xtBlanceBefore.toInt256(); - _orderConfig.swapTrigger.afterSwap(ftReserve, xtReserve, deltaFt, deltaXt); - } - emit SwapExactTokenToToken( - tokenIn, tokenOut, msg.sender, recipient, tokenAmtIn, netTokenOut.toUint128(), feeAmt.toUint128() - ); - } - - function swapTokenToExactToken( - IERC20 tokenIn, - IERC20 tokenOut, - address recipient, - uint128 tokenAmtOut, - uint128 maxTokenIn, - uint256 - ) external nonReentrant isOpen returns (uint256 netTokenIn) { - if (tokenIn == tokenOut) revert CantSwapSameToken(); - uint256 feeAmt = 0; - uint256 ftBlanceBefore = ft.balanceOf(address(this)); - uint256 xtBlanceBefore = xt.balanceOf(address(this)); - - tokenIn.safeTransferFrom(msg.sender, address(this), maxTokenIn); - if (tokenIn == debtToken) { - tokenIn.safeIncreaseAllowance(address(market), maxTokenIn); - market.mint(address(this), maxTokenIn); - } - if (tokenOut == debtToken) { - market.burn(address(this), recipient, tokenAmtOut); - } else { - tokenOut.safeTransfer(recipient, tokenAmtOut); - } - netTokenIn = maxTokenIn; - - if (address(_orderConfig.swapTrigger) != address(0)) { - uint256 ftReserve = ft.balanceOf(address(this)); - uint256 xtReserve = xt.balanceOf(address(this)); - int256 deltaFt = ftReserve.toInt256() - ftBlanceBefore.toInt256(); - int256 deltaXt = xtReserve.toInt256() - xtBlanceBefore.toInt256(); - _orderConfig.swapTrigger.afterSwap(ftReserve, xtReserve, deltaFt, deltaXt); - } - emit SwapTokenToExactToken( - tokenIn, tokenOut, msg.sender, recipient, tokenAmtOut, netTokenIn.toUint128(), feeAmt.toUint128() - ); - } - - function withdrawAssets(IERC20 token, address recipient, uint256 amount) external onlyOwner { - if (token == debtToken) { - market.burn(address(this), recipient, amount); - } else { - token.safeTransfer(recipient, amount); - } - emit WithdrawAssets(token, _msgSender(), recipient, amount); - } - - /** - * @inheritdoc ITermMaxOrder - */ - function pause() external override onlyOwner { - _pause(); - } - - /** - * @inheritdoc ITermMaxOrder - */ - function unpause() external override onlyOwner { - _unpause(); - } -} diff --git a/contracts/test/MockPriceFeed.sol b/contracts/test/MockPriceFeed.sol deleted file mode 100644 index 0be0e69..0000000 --- a/contracts/test/MockPriceFeed.sol +++ /dev/null @@ -1,75 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; -import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; - -contract MockPriceFeed is AggregatorV3Interface, Ownable { - struct RoundData { - uint80 roundId; - int256 answer; - uint256 startedAt; - uint256 updatedAt; - uint80 answeredInRound; - } - - event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 updatedAt); - - RoundData private _latestRoundData; - uint8 private _decimals; - - constructor(address admin) Ownable(admin) { - _decimals = 8; - } - - function decimals() external view override returns (uint8) { - return _decimals; - } - - function setDecimals(uint8 decimals_) external onlyOwner { - _decimals = decimals_; - } - - function description() external pure override returns (string memory) { - return "Test Oracle"; - } - - function version() external pure override returns (uint256) { - return 1; - } - - function getRoundData(uint80) - external - view - override - returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) - { - return ( - _latestRoundData.roundId, - _latestRoundData.answer, - _latestRoundData.startedAt, - _latestRoundData.updatedAt, - _latestRoundData.answeredInRound - ); - } - - function latestRoundData() - external - view - override - returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) - { - return ( - _latestRoundData.roundId, - _latestRoundData.answer, - _latestRoundData.startedAt, - _latestRoundData.updatedAt, - _latestRoundData.answeredInRound - ); - } - - function updateRoundData(RoundData memory roundData) external onlyOwner { - _latestRoundData = roundData; - emit AnswerUpdated(roundData.answer, roundData.roundId, roundData.updatedAt); - } -} diff --git a/contracts/test/MockSwapAdapter.sol b/contracts/test/MockSwapAdapter.sol deleted file mode 100644 index 931aa71..0000000 --- a/contracts/test/MockSwapAdapter.sol +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {IMintableERC20, IERC20} from "contracts/tokens/IMintableERC20.sol"; -import "contracts/router/swapAdapters/ERC20SwapAdapter.sol"; - -contract MockSwapAdapter is ERC20SwapAdapter { - address public immutable pool; - - constructor(address pool_) { - pool = pool_; - } - - function _swap(IERC20 tokenIn, IERC20 tokenOut, uint256 amount, bytes memory swapData) - internal - virtual - override - returns (uint256 tokenOutAmt) - { - uint256 minTokenOut = abi.decode(swapData, (uint256)); - - IERC20(tokenIn).transfer(pool, amount); - - tokenOutAmt = minTokenOut; - IMintableERC20(address(tokenOut)).mint(address(this), tokenOutAmt); - } -} diff --git a/contracts/test/testnet/Faucet.sol b/contracts/test/testnet/Faucet.sol deleted file mode 100644 index dd513e0..0000000 --- a/contracts/test/testnet/Faucet.sol +++ /dev/null @@ -1,109 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; -import {FaucetERC20} from "./FaucetERC20.sol"; -import {MockPriceFeed} from "../MockPriceFeed.sol"; - -contract Faucet is Ownable { - error OnlyMintOnce(); - error TokenExisted(string name, string symbol, uint8 decimals); - - struct TokenConfig { - address tokenAddr; - address priceFeedAddr; - } - - uint256 public tokenNum; - mapping(address => uint256) public getTokenId; - mapping(uint256 => TokenConfig) public tokenConfigs; - mapping(address => bool) public isMinted; - mapping(bytes32 => uint256) public getTokenIdByKey; - bool public canOnlyMintOnce; - uint256 public mintUsdValue; - - constructor(address adminAddr) Ownable(adminAddr) { - mintUsdValue = 10000; - } - - function getTokenConfig(uint256 index) public view returns (TokenConfig memory) { - return tokenConfigs[index]; - } - - function addToken(string memory name, string memory symbol, uint8 decimals) - public - onlyOwner - returns (FaucetERC20 token, MockPriceFeed priceFeed) - { - if (getTokenIdByKey[calcTokenKey(name, symbol, decimals)] != 0) { - revert TokenExisted(name, symbol, decimals); - } else { - token = new FaucetERC20(address(this), name, symbol, decimals); - priceFeed = new MockPriceFeed(owner()); - tokenNum++; - tokenConfigs[tokenNum] = TokenConfig(address(token), address(priceFeed)); - getTokenId[address(token)] = tokenNum; - getTokenIdByKey[calcTokenKey(name, symbol, decimals)] = tokenNum; - } - } - - function setMintUsdValue(uint256 _mintUsdValue) public onlyOwner { - mintUsdValue = _mintUsdValue; - } - - function setPriceFeed(uint256 index, address priceFeedAddr) public onlyOwner { - tokenConfigs[index].priceFeedAddr = priceFeedAddr; - } - - function setCanOnlyMintOnce(bool _canOnlyMintOnce) public onlyOwner { - canOnlyMintOnce = _canOnlyMintOnce; - } - - function batchMint() public { - if (canOnlyMintOnce && isMinted[msg.sender]) revert OnlyMintOnce(); - isMinted[msg.sender] = true; - for (uint256 i = 1; i < tokenNum + 1; i++) { - TokenConfig memory tokenConfig = tokenConfigs[i]; - MockPriceFeed priceFeed = MockPriceFeed(tokenConfig.priceFeedAddr); - (, int256 answer,,,) = priceFeed.latestRoundData(); - uint8 tokenDecimals = FaucetERC20(tokenConfig.tokenAddr).decimals(); - uint8 priceFeedDecimals = priceFeed.decimals(); - uint256 mintAmt = (mintUsdValue * 10 ** (priceFeedDecimals + tokenDecimals)) / uint256(answer); - FaucetERC20(tokenConfig.tokenAddr).mint(msg.sender, mintAmt); - } - } - - function batchMintWithValue(uint256 mintValue) public { - if (canOnlyMintOnce && isMinted[msg.sender]) revert OnlyMintOnce(); - isMinted[msg.sender] = true; - for (uint256 i = 1; i < tokenNum + 1; i++) { - TokenConfig memory tokenConfig = tokenConfigs[i]; - MockPriceFeed priceFeed = MockPriceFeed(tokenConfig.priceFeedAddr); - (, int256 answer,,,) = priceFeed.latestRoundData(); - uint8 tokenDecimals = FaucetERC20(tokenConfig.tokenAddr).decimals(); - uint8 priceFeedDecimals = priceFeed.decimals(); - uint256 mintAmt = (mintValue * 10 ** (priceFeedDecimals + tokenDecimals)) / uint256(answer); - FaucetERC20(tokenConfig.tokenAddr).mint(msg.sender, mintAmt); - } - } - - function devBatchMint(address to) public onlyOwner { - for (uint256 i = 1; i < tokenNum + 1; i++) { - TokenConfig memory tokenConfig = tokenConfigs[i]; - MockPriceFeed priceFeed = MockPriceFeed(tokenConfig.priceFeedAddr); - (, int256 answer,,,) = priceFeed.latestRoundData(); - uint8 tokenDecimals = FaucetERC20(tokenConfig.tokenAddr).decimals(); - uint8 priceFeedDecimals = priceFeed.decimals(); - uint256 mintAmt = (mintUsdValue * 10 ** (priceFeedDecimals + tokenDecimals)) / uint256(answer); - FaucetERC20(tokenConfig.tokenAddr).mint(to, mintAmt); - } - } - - function devMint(address to, address tokenAddr, uint256 mintAmt) public onlyOwner { - FaucetERC20(tokenAddr).mint(to, mintAmt); - } - - function calcTokenKey(string memory name, string memory symbol, uint8 decimals) public pure returns (bytes32) { - return keccak256(abi.encodePacked(name, symbol, decimals)); - } -} diff --git a/contracts/test/testnet/FaucetERC20.sol b/contracts/test/testnet/FaucetERC20.sol deleted file mode 100644 index cb0749a..0000000 --- a/contracts/test/testnet/FaucetERC20.sol +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; -import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; - -contract FaucetERC20 is ERC20, Ownable { - uint8 private immutable _decimals; - - constructor(address adminAddr, string memory name, string memory symbol, uint8 _dec) - ERC20(name, symbol) - Ownable(adminAddr) - { - _decimals = _dec; - } - - function decimals() public view virtual override returns (uint8) { - return _decimals; - } - - function mint(address to, uint256 amount) external { - _mint(to, amount); - } -} diff --git a/contracts/test/testnet/SwapAdapter.sol b/contracts/test/testnet/SwapAdapter.sol deleted file mode 100644 index d75bd08..0000000 --- a/contracts/test/testnet/SwapAdapter.sol +++ /dev/null @@ -1,41 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {console} from "forge-std/console.sol"; -import {IMintableERC20, IERC20} from "contracts/tokens/IMintableERC20.sol"; -import "contracts/router/swapAdapters/ERC20SwapAdapter.sol"; -import {MockPriceFeed} from "contracts/test/MockPriceFeed.sol"; - -contract SwapAdapter is ERC20SwapAdapter { - address public immutable pool; - - constructor(address pool_) { - pool = pool_; - } - - function _swap(IERC20 tokenIn, IERC20 tokenOut, uint256 amount, bytes memory swapData) - internal - virtual - override - returns (uint256 tokenOutAmt) - { - (address tokenInPriceFeedAddr, address tokenOutPriceFeedAddr) = abi.decode(swapData, (address, address)); - - uint8 tokenInDecimals = IMintableERC20(address(tokenIn)).decimals(); - uint8 tokenOutDecimals = IMintableERC20(address(tokenOut)).decimals(); - - MockPriceFeed tokenInPriceFeed = MockPriceFeed(tokenInPriceFeedAddr); - MockPriceFeed tokenOutPriceFeed = MockPriceFeed(address(tokenOutPriceFeedAddr)); - (, int256 tokenInPrice,,,) = tokenInPriceFeed.latestRoundData(); - uint8 tokenInPriceDecimals = tokenInPriceFeed.decimals(); - (, int256 tokenOutPrice,,,) = tokenOutPriceFeed.latestRoundData(); - uint8 tokenOutPriceDecimals = tokenOutPriceFeed.decimals(); - - tokenOutAmt = (amount * uint256(tokenInPrice) * 10 ** tokenOutPriceDecimals * 10 ** tokenOutDecimals) - / (uint256(tokenOutPrice) * 10 ** tokenInPriceDecimals * 10 ** tokenInDecimals); - console.log("tokenInAmt: %d", amount); - console.log("tokenOutAmt: %d", tokenOutAmt); - IERC20(tokenIn).transfer(pool, amount); - IMintableERC20(address(tokenOut)).mint(address(this), tokenOutAmt); - } -} diff --git a/contracts/tokenomics/PreTMX.sol b/contracts/tokenomics/PreTMX.sol deleted file mode 100644 index 4ef590f..0000000 --- a/contracts/tokenomics/PreTMX.sol +++ /dev/null @@ -1,84 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; -import {Ownable2Step, Ownable} from "@openzeppelin/contracts/access/Ownable2Step.sol"; - -contract PreTMX is ERC20, Ownable2Step { - bool public transferRestricted; - - mapping(address => bool) public isTransferredFromWhitelisted; - mapping(address => bool) public isTransferredToWhitelisted; - - error TransferFromNotWhitelisted(address from); - error TransferToNotWhitelisted(address to); - - event TransferRestricted(bool restricted); - event TransferFromWhitelisted(address from, bool isWhitelisted); - event TransferToWhitelisted(address to, bool isWhitelisted); - - constructor(address admin) ERC20("Pre TermMax Token", "pTMX") Ownable(admin) { - _mint(admin, 1e9 ether); - _setTransferRestricted(true); - _setTransferFromWhitelisted(admin, true); - _setTransferToWhitelisted(admin, true); - } - - function enableTransfer() external onlyOwner { - _setTransferRestricted(false); - } - - function disableTransfer() external onlyOwner { - _setTransferRestricted(true); - } - - function whitelistTransferFrom(address from, bool isWhitelisted) external onlyOwner { - _setTransferFromWhitelisted(from, isWhitelisted); - } - - function whitelistTransferTo(address to, bool isWhitelisted) external onlyOwner { - _setTransferToWhitelisted(to, isWhitelisted); - } - - function transfer(address to, uint256 amount) public override returns (bool) { - _beforeTokenTransfer(msg.sender, to); - return super.transfer(to, amount); - } - - function transferFrom(address from, address to, uint256 amount) public override returns (bool) { - _beforeTokenTransfer(from, to); - return super.transferFrom(from, to, amount); - } - - function mint(address to, uint256 amount) external onlyOwner { - _mint(to, amount); - } - - function burn(uint256 amount) external { - _burn(msg.sender, amount); - } - - function _beforeTokenTransfer(address from, address to) internal view { - if (transferRestricted && !isTransferredFromWhitelisted[from]) { - revert TransferFromNotWhitelisted(from); - } - if (transferRestricted && !isTransferredToWhitelisted[to]) { - revert TransferToNotWhitelisted(to); - } - } - - function _setTransferRestricted(bool restricted) internal { - transferRestricted = restricted; - emit TransferRestricted(restricted); - } - - function _setTransferFromWhitelisted(address from, bool isWhitelisted) internal { - isTransferredFromWhitelisted[from] = isWhitelisted; - emit TransferFromWhitelisted(from, isWhitelisted); - } - - function _setTransferToWhitelisted(address to, bool isWhitelisted) internal { - isTransferredToWhitelisted[to] = isWhitelisted; - emit TransferToWhitelisted(to, isWhitelisted); - } -} diff --git a/contracts/tokens/AbstractGearingToken.sol b/contracts/tokens/AbstractGearingToken.sol deleted file mode 100644 index 5d2666a..0000000 --- a/contracts/tokens/AbstractGearingToken.sol +++ /dev/null @@ -1,586 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.27; - -import {ERC721EnumerableUpgradeable} from - "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol"; -import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; -import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; -import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; -import {Constants} from "../lib/Constants.sol"; -import {GearingTokenConstants} from "../lib/GearingTokenConstants.sol"; -import {TransferUtils} from "../lib/TransferUtils.sol"; -import {IFlashRepayer} from "./IFlashRepayer.sol"; -import {IGearingToken, IERC20Metadata, IERC20} from "./IGearingToken.sol"; -import {GearingTokenErrors} from "../errors/GearingTokenErrors.sol"; -import {GearingTokenEvents} from "../events/GearingTokenEvents.sol"; -import {GtConfig, IOracle} from "../storage/TermMaxStorage.sol"; - -/** - * @title TermMax Gearing Token - * @author Term Structure Labs - */ -abstract contract AbstractGearingToken is - OwnableUpgradeable, - ERC721EnumerableUpgradeable, - ReentrancyGuardUpgradeable, - IGearingToken, - GearingTokenErrors, - GearingTokenEvents -{ - using SafeCast for uint256; - using SafeCast for int256; - using TransferUtils for IERC20; - using TransferUtils for IERC20Metadata; - - struct LoanInfo { - /// @notice Debt amount in debtToken token - uint128 debtAmt; - /// @notice Encoded collateral data - bytes collateralData; - } - - struct ValueAndPrice { - /// @notice USD value of collateral - uint256 collateralValue; - /// @notice USD value of debt with price and token decimals - uint256 debtValueWithDecimals; - /// @notice USD price of debt token - uint256 debtPrice; - /// @notice Denominator of USD price - uint256 priceDenominator; - /// @notice Denominator of debt token - uint256 debtDenominator; - /// @notice Encoded USD price of collateral token - bytes collateralPriceData; - } - - /// @notice Configuturation of Gearing Token - GtConfig _config; - /// @notice Total supply of Gearing Token - uint256 total; - /// @notice Mapping relationship between Gearing Token id and loan - mapping(uint256 => LoanInfo) loanMapping; - - uint8 debtDecimals; - - /** - * @inheritdoc IGearingToken - */ - function initialize(string memory name, string memory symbol, GtConfig memory config_, bytes memory initalParams) - external - override - initializer - { - __AbstractGearingToken_init(name, symbol, config_); - __GearingToken_Implement_init(initalParams); - emit GearingTokenInitialized(msg.sender, name, symbol, initalParams); - } - - function __AbstractGearingToken_init(string memory name, string memory symbol, GtConfig memory config_) - internal - onlyInitializing - { - if (config_.loanConfig.liquidationLtv <= config_.loanConfig.maxLtv) { - revert LiquidationLtvMustBeGreaterThanMaxLtv(); - } - __ERC721_init(name, symbol); - __Ownable_init(msg.sender); - _config = config_; - debtDecimals = _config.debtToken.decimals(); - } - - function __GearingToken_Implement_init(bytes memory initalParams) internal virtual; - - /** - * @inheritdoc IGearingToken - */ - function setTreasurer(address treasurer) external onlyOwner { - _config.treasurer = treasurer; - } - - /** - * @inheritdoc IGearingToken - */ - function updateConfig(bytes memory configData) external onlyOwner { - _updateConfig(configData); - emit UpdateConfig(configData); - } - - function _updateConfig(bytes memory configData) internal virtual; - - /** - * @inheritdoc IGearingToken - */ - function getGtConfig() external view override returns (GtConfig memory) { - return _config; - } - - /** - * @inheritdoc IGearingToken - */ - function marketAddr() public view override returns (address) { - return owner(); - } - - /** - * @inheritdoc IGearingToken - */ - function liquidatable() external view returns (bool) { - return _config.loanConfig.liquidatable; - } - - /** - * @inheritdoc IGearingToken - */ - function mint(address collateralProvider, address to, uint128 debtAmt, bytes memory collateralData) - external - override - nonReentrant - onlyOwner - returns (uint256 id) - { - _checkBeforeMint(debtAmt, collateralData); - _transferCollateralFrom(collateralProvider, address(this), collateralData); - id = _mintInternal(to, debtAmt, collateralData, _config); - } - - /// @notice Check if the loan can be minted - function _checkBeforeMint(uint128 debtAmt, bytes memory collateralData) internal virtual; - - function _mintInternal(address to, uint128 debtAmt, bytes memory collateralData, GtConfig memory config) - internal - returns (uint256 id) - { - LoanInfo memory loan = LoanInfo(debtAmt, collateralData); - ValueAndPrice memory valueAndPrice = _getValueAndPrice(config, loan); - uint128 ltv = _calculateLtv(valueAndPrice); - if (ltv > config.loanConfig.maxLtv) { - revert GtIsNotHealthy(0, to, ltv); - } - id = ++total; - loanMapping[id] = loan; - _safeMint(to, id); - } - - /** - * @inheritdoc IGearingToken - */ - function augmentDebt(address caller, uint256 id, uint256 ftAmt) external override nonReentrant onlyOwner { - if (caller != ownerOf(id) && caller != getApproved(id)) { - revert AuthorizationFailed(id, caller); - } - GtConfig memory config = _config; - if (config.maturity <= block.timestamp) { - revert GtIsExpired(id); - } - - LoanInfo memory loan = loanMapping[id]; - loan.debtAmt += ftAmt.toUint128(); - - ValueAndPrice memory valueAndPrice = _getValueAndPrice(config, loan); - uint128 ltv = _calculateLtv(valueAndPrice); - if (ltv > config.loanConfig.maxLtv) { - revert GtIsNotHealthy(id, msg.sender, ltv); - } - loanMapping[id] = loan; - - emit AugmentDebt(id, ftAmt); - } - - /** - * @inheritdoc IGearingToken - */ - function loanInfo(uint256 id) - external - view - override - returns (address owner, uint128 debtAmt, bytes memory collateralData) - { - owner = ownerOf(id); - LoanInfo memory loan = loanMapping[id]; - debtAmt = loan.debtAmt; - collateralData = loan.collateralData; - } - - function _burnInternal(uint256 id) internal { - _burn(id); - delete loanMapping[id]; - } - - /** - * @inheritdoc IGearingToken - */ - function merge(uint256[] memory ids) external nonReentrant returns (uint256 newId) { - uint128 totalDebtAmt; - bytes memory mergedCollateralData; - for (uint256 i = 0; i < ids.length; ++i) { - uint256 id = ids[i]; - LoanInfo memory loan = loanMapping[id]; - address owner = ownerOf(id); - if (msg.sender != owner) { - revert CanNotMergeLoanWithDiffOwner(id, owner); - } - totalDebtAmt += loan.debtAmt; - mergedCollateralData = - i == 0 ? loan.collateralData : _mergeCollateral(mergedCollateralData, loan.collateralData); - _burnInternal(id); - } - newId = _mintInternal(msg.sender, totalDebtAmt, mergedCollateralData, _config); - emit MergeGts(msg.sender, newId, ids); - } - - /** - * @inheritdoc IGearingToken - */ - function repay(uint256 id, uint128 repayAmt, bool byDebtToken) external override nonReentrant { - GtConfig memory config = _config; - if (config.maturity <= block.timestamp) { - revert GtIsExpired(id); - } - - if (byDebtToken) { - config.debtToken.safeTransferFrom(msg.sender, marketAddr(), repayAmt); - } else { - // Those ft tokens have been approved to market and will be burn after maturity - config.ft.safeTransferFrom(msg.sender, marketAddr(), repayAmt); - } - (, bool repayAll) = _repay(id, repayAmt); - emit Repay(id, repayAmt, byDebtToken, repayAll); - } - - /// @inheritdoc IGearingToken - /// @notice This function is deprecated, please use `flashRepay( - // uint256 id, - // uint128 repayAmt, - // bool byDebtToken, - // bytes memory removedCollateral, - // bytes calldata callbackData - // )` instead - function flashRepay(uint256 id, bool byDebtToken, bytes calldata callbackData) external override nonReentrant { - LoanInfo memory loan = loanMapping[id]; - _flashRepay(id, loan.debtAmt, byDebtToken, loan.collateralData, callbackData); - } - - function flashRepay( - uint256 id, - uint128 repayAmt, - bool byDebtToken, - bytes memory removedCollateral, - bytes calldata callbackData - ) external override nonReentrant returns (bool) { - return _flashRepay(id, repayAmt, byDebtToken, removedCollateral, callbackData); - } - - function _flashRepay( - uint256 id, - uint128 repayAmt, - bool byDebtToken, - bytes memory removedCollateral, - bytes calldata callbackData - ) internal returns (bool) { - GtConfig memory config = _config; - if (config.maturity <= block.timestamp) { - revert GtIsExpired(id); - } - if (ownerOf(id) != msg.sender) { - revert CallerIsNotTheOwner(id); - } - (LoanInfo memory loan, bool repayAll) = _repay(id, repayAmt); - // Check ltv after partial repayment - if (!repayAll) { - loan.collateralData = _removeCollateral(loan, removedCollateral); - ValueAndPrice memory valueAndPrice = _getValueAndPrice(config, loan); - uint128 ltv = _calculateLtv(valueAndPrice); - require(ltv <= config.loanConfig.maxLtv, GtIsNotHealthy(id, msg.sender, ltv)); - loanMapping[id] = loan; - // Transfer collateral to the owner - _transferCollateral(msg.sender, removedCollateral); - } - - IERC20 repayToken = byDebtToken ? config.debtToken : config.ft; - - IFlashRepayer(msg.sender).executeOperation( - repayToken, repayAmt, config.collateral, removedCollateral, callbackData - ); - repayToken.safeTransferFrom(msg.sender, owner(), repayAmt); - emit FlashRepay(id, msg.sender, repayAmt, byDebtToken, repayAll, removedCollateral); - return repayAll; - } - - function _repay(uint256 id, uint128 repayAmt) internal returns (LoanInfo memory loan, bool repayAll) { - loan = loanMapping[id]; - if (repayAmt > loan.debtAmt) { - revert RepayAmtExceedsMaxRepayAmt(id, repayAmt, loan.debtAmt); - } - loan.debtAmt = loan.debtAmt - repayAmt; - if (loan.debtAmt == 0) { - address gtOwner = ownerOf(id); - // Burn this nft - _burnInternal(id); - _transferCollateral(gtOwner, loan.collateralData); - repayAll = true; - } else { - loanMapping[id].debtAmt = loan.debtAmt; - } - } - - /** - * @inheritdoc IGearingToken - */ - function removeCollateral(uint256 id, bytes memory collateralData) external override nonReentrant { - if (msg.sender != ownerOf(id)) { - revert CallerIsNotTheOwner(id); - } - - GtConfig memory config = _config; - if (config.maturity <= block.timestamp) { - revert GtIsExpired(id); - } - - LoanInfo memory loan = loanMapping[id]; - loan.collateralData = _removeCollateral(loan, collateralData); - - ValueAndPrice memory valueAndPrice = _getValueAndPrice(config, loan); - uint128 ltv = _calculateLtv(valueAndPrice); - if (ltv > config.loanConfig.maxLtv) { - revert GtIsNotHealthy(id, msg.sender, ltv); - } - loanMapping[id] = loan; - - // Transfer collateral to the owner - _transferCollateral(msg.sender, collateralData); - - emit RemoveCollateral(id, loan.collateralData); - } - - function _removeCollateral(LoanInfo memory loan, bytes memory collateralData) - internal - virtual - returns (bytes memory); - - /** - * @inheritdoc IGearingToken - */ - function addCollateral(uint256 id, bytes memory collateralData) external override nonReentrant { - if (_config.maturity <= block.timestamp) { - revert GtIsExpired(id); - } - LoanInfo memory loan = loanMapping[id]; - - _transferCollateralFrom(msg.sender, address(this), collateralData); - loan.collateralData = _addCollateral(loan, collateralData); - loanMapping[id] = loan; - emit AddCollateral(id, loan.collateralData); - } - - function _addCollateral(LoanInfo memory loan, bytes memory collateralData) - internal - virtual - returns (bytes memory); - - /** - * @inheritdoc IGearingToken - */ - function getLiquidationInfo(uint256 id) - external - view - returns (bool isLiquidable, uint128 ltv, uint128 maxRepayAmt) - { - LoanInfo memory loan = loanMapping[id]; - GtConfig memory config = _config; - (isLiquidable, maxRepayAmt, ltv,) = _getLiquidationInfo(loan, config); - } - - function _getLiquidationInfo(LoanInfo memory loan, GtConfig memory config) - internal - view - returns (bool isLiquidable, uint128 maxRepayAmt, uint128 ltv, ValueAndPrice memory valueAndPrice) - { - valueAndPrice = _getValueAndPrice(config, loan); - ltv = _calculateLtv(valueAndPrice); - - if (config.loanConfig.liquidatable) { - // Liquidation cases: - // t >= m + w => F, "No liquidation after maturity plus liquidation window - // t >= m && t < m + w => T, "Liquidation allowed during liquidation window" - // t < m => ltv >= lltv => T, "Liquidation only allowed before maturity if ltv >= lltv" - - if (block.timestamp >= config.maturity + Constants.LIQUIDATION_WINDOW) { - isLiquidable = false; - } else if (block.timestamp >= config.maturity) { - isLiquidable = true; - maxRepayAmt = loan.debtAmt; - } else if (ltv >= config.loanConfig.liquidationLtv) { - isLiquidable = true; - // collateralValue(price decimals) and HALF_LIQUIDATION_THRESHOLD(base decimals 1e8) - maxRepayAmt = (valueAndPrice.collateralValue * Constants.DECIMAL_BASE) / valueAndPrice.priceDenominator - < GearingTokenConstants.HALF_LIQUIDATION_THRESHOLD ? loan.debtAmt : loan.debtAmt / 2; - } - } - } - - /** - * @inheritdoc IGearingToken - */ - function liquidate(uint256 id, uint128 repayAmt, bool byDebtToken) external override nonReentrant { - LoanInfo memory loan = loanMapping[id]; - GtConfig memory config = _config; - if (!config.loanConfig.liquidatable) { - revert GtDoNotSupportLiquidation(); - } - (bool isLiquidable, uint128 maxRepayAmt, uint128 ltvBefore, ValueAndPrice memory valueAndPrice) = - _getLiquidationInfo(loan, config); - - if (!isLiquidable) { - uint256 liquidationDeadline = config.maturity + Constants.LIQUIDATION_WINDOW; - if (block.timestamp >= liquidationDeadline) { - revert CanNotLiquidationAfterFinalDeadline(id, liquidationDeadline); - } - revert GtIsSafe(id); - } - if (repayAmt > maxRepayAmt) { - revert RepayAmtExceedsMaxRepayAmt(id, repayAmt, maxRepayAmt); - } - // Transfer token - if (byDebtToken) { - config.debtToken.safeTransferFrom(msg.sender, marketAddr(), repayAmt); - } else { - config.ft.safeTransferFrom(msg.sender, marketAddr(), repayAmt); - } - - // Do liquidate - (bytes memory cToLiquidator, bytes memory cToTreasurer, bytes memory remainningC) = - _calcLiquidationResult(loan, repayAmt, valueAndPrice); - - if (repayAmt == loan.debtAmt) { - if (remainningC.length > 0) { - _transferCollateral(ownerOf(id), remainningC); - } - // update storage - _burnInternal(id); - } else { - loan.debtAmt -= repayAmt; - loan.collateralData = remainningC; - - // Check ltv after partial liquidation - { - valueAndPrice.collateralValue = _getCollateralValue(remainningC, valueAndPrice.collateralPriceData); - valueAndPrice.debtValueWithDecimals = - (loan.debtAmt * valueAndPrice.debtPrice) / valueAndPrice.debtDenominator; - uint128 ltvAfter = _calculateLtv(valueAndPrice); - if (ltvBefore < ltvAfter) { - revert LtvIncreasedAfterLiquidation(id, ltvBefore, ltvAfter); - } - } - // update storage - loanMapping[id] = loan; - } - // Transfer collateral - if (cToTreasurer.length > 0) { - _transferCollateral(config.treasurer, cToTreasurer); - } - _transferCollateral(msg.sender, cToLiquidator); - - emit Liquidate(id, msg.sender, repayAmt, byDebtToken, cToLiquidator, cToTreasurer, remainningC); - } - - /// @notice Return the collateral distribution plan after liquidation - /// @param loan The loan data, contains debt amount and collateral data - /// @param repayAmt The amount of the debt to be liquidate - /// @param valueAndPrice Debt and collateral prices, values - /// @return cToLiquidator Collateral data assigned to liquidator - /// @return cToTreasurer Collateral data assigned to protocol - /// @return remainningC Remainning collateral data, will assigned to debt's owner - /// if the debt is fully liquidated. - function _calcLiquidationResult(LoanInfo memory loan, uint128 repayAmt, ValueAndPrice memory valueAndPrice) - internal - virtual - returns (bytes memory cToLiquidator, bytes memory cToTreasurer, bytes memory remainningC); - - /** - * @inheritdoc IGearingToken - */ - function getCollateralValue(bytes memory collateralData) external view override returns (uint256 collateralValue) { - bytes memory priceData = _getCollateralPriceData(_config); - return _getCollateralValue(collateralData, priceData); - } - - /** - * @inheritdoc IGearingToken - */ - function previewDelivery(uint256 proportion) external view override returns (bytes memory deliveryData) { - deliveryData = _delivery(proportion); - } - - /** - * @inheritdoc IGearingToken - */ - function delivery(uint256 proportion, address to) - external - override - nonReentrant - onlyOwner - returns (bytes memory deliveryData) - { - deliveryData = _delivery(proportion); - _transferCollateral(to, deliveryData); - } - - function _delivery(uint256 proportion) internal view virtual returns (bytes memory deliveryData); - - function _getValueAndPrice(GtConfig memory config, LoanInfo memory loan) - internal - view - returns (ValueAndPrice memory valueAndPrice) - { - valueAndPrice.collateralPriceData = _getCollateralPriceData(config); - valueAndPrice.collateralValue = _getCollateralValue(loan.collateralData, valueAndPrice.collateralPriceData); - - uint8 priceDecimals; - (valueAndPrice.debtPrice, priceDecimals) = config.loanConfig.oracle.getPrice(address(config.debtToken)); - valueAndPrice.priceDenominator = 10 ** priceDecimals; - - valueAndPrice.debtDenominator = 10 ** debtDecimals; - - valueAndPrice.debtValueWithDecimals = (loan.debtAmt * valueAndPrice.debtPrice) / valueAndPrice.debtDenominator; - } - - /// @notice Return the loan to value of this loan - /// @param valueAndPrice Debt and collateral prices, values - /// @return ltv The loan to value of this loan - function _calculateLtv(ValueAndPrice memory valueAndPrice) internal pure returns (uint128 ltv) { - if (valueAndPrice.collateralValue == 0) { - return type(uint128).max; - } - // debtValueWithDecimals(price decimals) collateralValue(base decimals) - ltv = ( - (valueAndPrice.debtValueWithDecimals * Constants.DECIMAL_BASE_SQ) - / (valueAndPrice.collateralValue * valueAndPrice.priceDenominator) - ).toUint128(); - } - - /// @notice Merge collateral data - function _mergeCollateral(bytes memory collateralDataA, bytes memory collateralDataB) - internal - virtual - returns (bytes memory collateralData); - - /// @notice Transfer collateral from 'from' to 'to' - function _transferCollateralFrom(address from, address to, bytes memory collateralData) internal virtual; - - /// @notice Transfer collateral from this contracct to 'to' - function _transferCollateral(address to, bytes memory collateralData) internal virtual; - - /// @notice Return the value of collateral in USD with base decimals - /// @param collateralData encoded collateral data - /// @param priceData encoded price data of the collateral - /// @return collateralValue collateral's value in USD - function _getCollateralValue(bytes memory collateralData, bytes memory priceData) - internal - view - virtual - returns (uint256 collateralValue); - - /// @notice Return the encoded price of collateral in USD - function _getCollateralPriceData(GtConfig memory config) internal view virtual returns (bytes memory priceData); -} diff --git a/contracts/tokens/GearingTokenWithERC20.sol b/contracts/tokens/GearingTokenWithERC20.sol deleted file mode 100644 index 268174d..0000000 --- a/contracts/tokens/GearingTokenWithERC20.sol +++ /dev/null @@ -1,228 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.27; - -import {MathLib} from "../lib/MathLib.sol"; -import "./AbstractGearingToken.sol"; - -/** - * @title TermMax Gearing Token, using ERC20 token as collateral - * @author Term Structure Labs - */ -contract GearingTokenWithERC20 is AbstractGearingToken { - using SafeCast for uint256; - using SafeCast for int256; - using TransferUtils for IERC20; - using TransferUtils for IERC20Metadata; - using MathLib for *; - - /// @notice The operation failed because the collateral capacity is exceeded - error CollateralCapacityExceeded(); - - /// @notice The operation failed because the amount can not be uint256 max - error AmountCanNotBeUint256Max(); - - /// @notice Emitted when the collateral capacity is updated - event CollateralCapacityUpdated(uint256 newCapacity); - - /// @notice The max capacity of collateral token - uint256 public collateralCapacity; - - uint8 collateralDecimals; - - constructor() { - _disableInitializers(); - } - - function __GearingToken_Implement_init(bytes memory initalParams) internal override onlyInitializing { - _updateConfig(initalParams); - collateralDecimals = IERC20Metadata(_config.collateral).decimals(); - } - - function _updateConfig(bytes memory configData) internal virtual override { - collateralCapacity = abi.decode(configData, (uint256)); - emit CollateralCapacityUpdated(collateralCapacity); - } - - function _checkBeforeMint(uint128, bytes memory collateralData) internal virtual override { - if (IERC20(_config.collateral).balanceOf(address(this)) + _decodeAmount(collateralData) > collateralCapacity) { - revert CollateralCapacityExceeded(); - } - } - - function _delivery(uint256 proportion) internal view virtual override returns (bytes memory deliveryData) { - uint256 collateralReserve = IERC20(_config.collateral).balanceOf(address(this)); - uint256 amount = (collateralReserve * proportion) / Constants.DECIMAL_BASE_SQ; - deliveryData = abi.encode(amount); - } - - /** - * @inheritdoc AbstractGearingToken - */ - function _mergeCollateral(bytes memory collateralDataA, bytes memory collateralDataB) - internal - virtual - override - returns (bytes memory collateralData) - { - uint256 total = _decodeAmount(collateralDataA) + _decodeAmount(collateralDataB); - collateralData = abi.encode(total); - } - - /** - * @inheritdoc AbstractGearingToken - */ - function _transferCollateralFrom(address from, address to, bytes memory collateralData) internal virtual override { - uint256 amount = _decodeAmount(collateralData); - IERC20(_config.collateral).safeTransferFrom(from, to, amount); - } - - /** - * @inheritdoc AbstractGearingToken - */ - function _transferCollateral(address to, bytes memory collateralData) internal virtual override { - uint256 amount = _decodeAmount(collateralData); - IERC20(_config.collateral).safeTransfer(to, amount); - } - - /** - * @inheritdoc AbstractGearingToken - */ - function _getCollateralValue(bytes memory collateralData, bytes memory priceData) - internal - view - virtual - override - returns (uint256) - { - uint256 collateralAmt = _decodeAmount(collateralData); - (uint256 price, uint256 priceDenominator, uint256 collateralDemonimator) = - abi.decode(priceData, (uint256, uint256, uint256)); - return (collateralAmt * price * Constants.DECIMAL_BASE) / (priceDenominator * collateralDemonimator); - } - - /** - * @inheritdoc AbstractGearingToken - */ - function _getCollateralPriceData(GtConfig memory config) - internal - view - virtual - override - returns (bytes memory priceData) - { - (uint256 price, uint8 decimals) = config.loanConfig.oracle.getPrice(config.collateral); - uint256 priceDenominator = 10 ** decimals; - - uint256 cTokenDenominator = 10 ** collateralDecimals; - priceData = abi.encode(price, priceDenominator, cTokenDenominator); - } - - /// @notice Encode amount to collateral data - function _decodeAmount(bytes memory collateralData) internal pure returns (uint256 amount) { - amount = abi.decode(collateralData, (uint256)); - if (amount == type(uint256).max) { - revert AmountCanNotBeUint256Max(); - } - } - - /// @notice Decode amount from collateral data - function _encodeAmount(uint256 amount) internal pure returns (bytes memory) { - return abi.encode(amount); - } - - /** - * @inheritdoc AbstractGearingToken - */ - function _removeCollateral(LoanInfo memory loan, bytes memory collateralData) - internal - virtual - override - returns (bytes memory) - { - uint256 amount = _decodeAmount(loan.collateralData) - _decodeAmount(collateralData); - return _encodeAmount(amount); - } - - /** - * @inheritdoc AbstractGearingToken - */ - function _addCollateral(LoanInfo memory loan, bytes memory collateralData) - internal - virtual - override - returns (bytes memory) - { - uint256 amount = _decodeAmount(loan.collateralData) + _decodeAmount(collateralData); - return _encodeAmount(amount); - } - - /** - * @inheritdoc AbstractGearingToken - */ - function _calcLiquidationResult(LoanInfo memory loan, uint128 repayAmt, ValueAndPrice memory valueAndPrice) - internal - virtual - override - returns (bytes memory cToLiquidator, bytes memory cToTreasurer, bytes memory remainningC) - { - uint256 collateralAmt = _decodeAmount(loan.collateralData); - - (uint256 collateralPrice, uint256 cPriceDenominator, uint256 cTokenDenominator) = - abi.decode(valueAndPrice.collateralPriceData, (uint256, uint256, uint256)); - - // maxRomvedCollateral = min( - // (repayAmt * (1 + REWARD_TO_LIQUIDATOR + REWARD_TO_PROTOCOL)) * debtTokenPrice / collateralTokenPrice , - // collateralAmt *(repayAmt / debtAmt) - // ) - - /* DP := debt token price (valueAndPrice.debtPrice) - * DPD := debt token price decimal (valueAndPrice.priceDenominator) - * CP := collateral token price (collateralPrice) - * CPD := collateral token price decimal (cPriceDenominator) - * SD := scaling decimal = DPD * CPD * 10 - * The value of 1(decimal) debt token / The value of 1(decimal) collateral token - * ddPriceToCdPrice = roundUp((DP/DPD) / (CP/CPD) = (DP*CPD*SD) / (CP*DPD)) - * = roundUp((DP*CPD*CPD*10) / CP) - */ - uint256 ddPriceToCdPrice = ( - valueAndPrice.debtPrice * cPriceDenominator * cPriceDenominator * 10 + collateralPrice - 1 - ) / collateralPrice; - - // calculate the amount of collateral that is equivalent to repayAmt - // with debt to collateral price - uint256 cEqualRepayAmt = (repayAmt * ddPriceToCdPrice * cTokenDenominator) - / (valueAndPrice.debtDenominator * cPriceDenominator * valueAndPrice.priceDenominator * 10); - - uint256 rewardToLiquidator = - (cEqualRepayAmt * GearingTokenConstants.REWARD_TO_LIQUIDATOR) / Constants.DECIMAL_BASE; - uint256 rewardToProtocol = (cEqualRepayAmt * GearingTokenConstants.REWARD_TO_PROTOCOL) / Constants.DECIMAL_BASE; - - uint256 removedCollateralAmt = cEqualRepayAmt + rewardToLiquidator + rewardToProtocol; - - if (loan.debtAmt == 0) { - removedCollateralAmt = 0; - } else { - removedCollateralAmt = removedCollateralAmt.min((collateralAmt * repayAmt) / loan.debtAmt); - } - - // Case 1: removed collateral can not cover repayAmt + rewardToLiquidator - if (removedCollateralAmt <= cEqualRepayAmt + rewardToLiquidator) { - cToLiquidator = _encodeAmount(removedCollateralAmt); - cToTreasurer = _encodeAmount(0); - remainningC = _encodeAmount(0); - } - // Case 2: removed collateral can cover repayAmt + rewardToLiquidator but not rewardToProtocol - else if (removedCollateralAmt < cEqualRepayAmt + rewardToLiquidator + rewardToProtocol) { - cToLiquidator = _encodeAmount(cEqualRepayAmt + rewardToLiquidator); - cToTreasurer = _encodeAmount(removedCollateralAmt - cEqualRepayAmt - rewardToLiquidator); - remainningC = _encodeAmount(0); - } - // Case 3: removed collateral equal repayAmt + rewardToLiquidator + rewardToProtocol - else { - cToLiquidator = _encodeAmount(cEqualRepayAmt + rewardToLiquidator); - cToTreasurer = _encodeAmount(rewardToProtocol); - } - // Calculate remainning collateral - remainningC = _encodeAmount(collateralAmt - removedCollateralAmt); - } -} diff --git a/contracts/tokens/IFlashRepayer.sol b/contracts/tokens/IFlashRepayer.sol deleted file mode 100644 index 898fa6a..0000000 --- a/contracts/tokens/IFlashRepayer.sol +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; - -/** - * @title The interface of flash repayer - * @author Term Structure Labs - */ -interface IFlashRepayer { - /// @notice Execute operation to be called in flash repay function - /// @dev Add your operations logic here - /// @param repayToken DebtToken or FT token - /// @param debtAmt Amount of debt - /// @param collateralToken Collateral token - /// @param collateralData Encoded collateral data - /// @param callbackData The data of flash repay callback - function executeOperation( - IERC20 repayToken, - uint128 debtAmt, - address collateralToken, - bytes memory collateralData, - bytes calldata callbackData - ) external; -} diff --git a/contracts/tokens/IGearingToken.sol b/contracts/tokens/IGearingToken.sol deleted file mode 100644 index e82a71a..0000000 --- a/contracts/tokens/IGearingToken.sol +++ /dev/null @@ -1,141 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {IERC20Metadata, IERC20} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; -import {IERC721Enumerable} from "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol"; -import {GtConfig} from "../storage/TermMaxStorage.sol"; - -/** - * @title TermMax Gearing token interface - * @author Term Structure Labs - */ -interface IGearingToken is IERC721Enumerable { - // @notice Initial function - /// @param name The token's name - /// @param symbol The token's symbol - /// @param config Configuration of GT - /// @param initalParams The initilization parameters of implementation - function initialize(string memory name, string memory symbol, GtConfig memory config, bytes memory initalParams) - external; - - /// @notice Set the treasurer address - /// @param treasurer New address of treasurer - /// @dev Only the market can call this function - function setTreasurer(address treasurer) external; - - /// @notice Set the configuration of Gearing Token - function updateConfig(bytes memory configData) external; - - /// @notice Return the configuration of Gearing Token - function getGtConfig() external view returns (GtConfig memory); - - /// @notice Return the flag to indicate debt is liquidatable or not - function liquidatable() external view returns (bool); - - /// @notice Return the market address - function marketAddr() external view returns (address); - - /// @notice Mint this token to an address - /// @param collateralProvider Who provide collateral token - /// @param to The address receiving token - /// @param debtAmt The amount of debt, unit by debtToken token - /// @param collateralData The encoded data of collateral - /// @return id The id of Gearing Token - /// @dev Only the market can mint Gearing Token - function mint(address collateralProvider, address to, uint128 debtAmt, bytes memory collateralData) - external - returns (uint256 id); - - /// @notice Augment the debt of Gearing Token - /// @param id The id of Gearing Token - /// @param ftAmt The amount of debt, unit by debtToken token - function augmentDebt(address caller, uint256 id, uint256 ftAmt) external; - - /// @notice Return the loan information of Gearing Token - /// @param id The id of Gearing Token - /// @return owner The owner of Gearing Token - /// @return debtAmt The amount of debt, unit by debtToken token - /// @return collateralData The encoded data of collateral - function loanInfo(uint256 id) external view returns (address owner, uint128 debtAmt, bytes memory collateralData); - - /// @notice Merge multiple Gearing Tokens into one - /// @param ids The array of Gearing Tokens to be merged - /// @return newId The id of new Gearing Token - function merge(uint256[] memory ids) external returns (uint256 newId); - - /// @notice Repay the debt of Gearing Token. - /// If repay amount equals the debt amount, Gearing Token's owner will get his collateral. - /// @param id The id of Gearing Token - /// @param repayAmt The amount of debt you want to repay - /// @param byDebtToken Repay using debtToken token or bonds token - function repay(uint256 id, uint128 repayAmt, bool byDebtToken) external; - - /// @notice Repay the debt of Gearing Token, - /// the collateral will send by flashloan first. - /// @param id The id of Gearing Token - /// @param byDebtToken Repay using debtToken token or bonds token - function flashRepay(uint256 id, bool byDebtToken, bytes calldata callbackData) external; - - /// @notice Repay the debt of Gearing Token, - /// the collateral will send by flashloan first. - /// @param id The id of Gearing Token - /// @param byDebtToken Repay using debtToken token or bonds token - /// @param repayAmt The amount of debt you want to repay - /// @param removedCollateral The collateral data to be removed - /// @param callbackData The data to be passed to the callback function - /// @return repayAll Whether the repayment is complete - function flashRepay( - uint256 id, - uint128 repayAmt, - bool byDebtToken, - bytes memory removedCollateral, - bytes calldata callbackData - ) external returns (bool repayAll); - - /// @notice Remove collateral from the loan. - /// Require the loan to value bigger than maxLtv after this action. - /// @param id The id of Gearing Token - /// @param collateralData Collateral data to be removed - function removeCollateral(uint256 id, bytes memory collateralData) external; - - /// @notice Add collateral to the loan - /// @param id The id of Gearing Token - /// @param collateralData Collateral data to be added - function addCollateral(uint256 id, bytes memory collateralData) external; - - /// @notice Return the liquidation info of the loan - /// @param id The id of the G-token - /// @return isLiquidable Whether the loan is liquidable - /// @return ltv The loan to collateral - /// @return maxRepayAmt The maximum amount of the debt to be repaid - function getLiquidationInfo(uint256 id) - external - view - returns (bool isLiquidable, uint128 ltv, uint128 maxRepayAmt); - - /// @notice Liquidate the loan when its ltv bigger than liquidationLtv or expired. - /// The ltv can not inscrease after liquidation. - /// A maximum of 10% of the repayment amount of collateral is given as a - /// reward to the protocol and liquidator, - /// The proportion of collateral liquidated will not exceed the debt liquidation ratio. - /// @param id The id of the G-token - /// @param repayAmt The amount of the debt to be liquidate - /// @param byDebtToken Repay using debtToken token or bonds token - function liquidate(uint256 id, uint128 repayAmt, bool byDebtToken) external; - - /// @notice Preview the delivery data - /// @param proportion The proportion of collateral that should be obtained - /// @return deliveryData The delivery data - function previewDelivery(uint256 proportion) external view returns (bytes memory deliveryData); - - /// @notice Deilivery outstanding debts after maturity - /// @param proportion The proportion of collateral that should be obtained - /// @param to The address receiving collateral token - /// @dev Only the market can delivery collateral - function delivery(uint256 proportion, address to) external returns (bytes memory deliveryData); - - /// @notice Return the value of collateral in USD with base decimals - /// @param collateralData encoded collateral data - /// @return collateralValue collateral's value in USD - function getCollateralValue(bytes memory collateralData) external view returns (uint256 collateralValue); -} diff --git a/contracts/tokens/IMintableERC20.sol b/contracts/tokens/IMintableERC20.sol deleted file mode 100644 index 3fedd30..0000000 --- a/contracts/tokens/IMintableERC20.sol +++ /dev/null @@ -1,40 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; - -/** - * @title TermMax ERC20 token interface - * @author Term Structure Labs - */ -interface IMintableERC20 is IERC20 { - /// @notice Error when using offline signature but spender is not the maerket - error SpenderIsNotMarket(address spender); - - // @notice Initial function - /// @param name The token's name - /// @param symbol The token's symbol - /// @param _decimals The token's decimals - function initialize(string memory name, string memory symbol, uint8 _decimals) external; - - /// @notice Mint this token to an address - /// @param to The address receiving token - /// @param amount The amount of token minted - /// @dev Only the market can mint TermMax tokens - function mint(address to, uint256 amount) external; - - /// @notice Return the market's address - function marketAddr() external view returns (address); - - /// @notice Burn tokens from sender - /// @param owner The address of the token holder - /// @param spender The address of the token spender - /// @param amount The number of tokens to be burned - /// @dev Only the market can burn TermMax tokens - function burn(address owner, address spender, uint256 amount) external; - - /** - * @dev Returns the decimals places of the token. - */ - function decimals() external view returns (uint8); -} diff --git a/contracts/tokens/MintableERC20.sol b/contracts/tokens/MintableERC20.sol deleted file mode 100644 index ed2d600..0000000 --- a/contracts/tokens/MintableERC20.sol +++ /dev/null @@ -1,59 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {ERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; -import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; -import {IMintableERC20} from "./IMintableERC20.sol"; - -/** - * @title TermMax ERC20 token - * @author Term Structure Labs - */ -contract MintableERC20 is ERC20Upgradeable, OwnableUpgradeable, IMintableERC20 { - /// @notice The token's decimals - uint8 _decimals; - - constructor() { - _disableInitializers(); - } - - /** - * @inheritdoc IMintableERC20 - */ - function initialize(string memory name, string memory symbol, uint8 decimals_) public override initializer { - __ERC20_init(name, symbol); - __Ownable_init(_msgSender()); - _decimals = decimals_; - } - - /** - * @inheritdoc IMintableERC20 - */ - function mint(address to, uint256 amount) external override onlyOwner { - _mint(to, amount); - } - - /** - * @inheritdoc IMintableERC20 - */ - function marketAddr() public view override returns (address) { - return owner(); - } - - /** - * @inheritdoc IMintableERC20 - */ - function burn(address owner, address spender, uint256 amount) external override onlyOwner { - if (owner != spender) { - _spendAllowance(owner, spender, amount); - } - _burn(owner, amount); - } - - /** - * @inheritdoc IMintableERC20 - */ - function decimals() public view override(ERC20Upgradeable, IMintableERC20) returns (uint8) { - return _decimals; - } -} diff --git a/contracts/tokens/StakingBuffer.sol b/contracts/tokens/StakingBuffer.sol deleted file mode 100644 index f4d4084..0000000 --- a/contracts/tokens/StakingBuffer.sol +++ /dev/null @@ -1,62 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {TransferUtils, IERC20} from "contracts/lib/TransferUtils.sol"; - -abstract contract StakingBuffer { - using TransferUtils for IERC20; - - error InvalidBuffer(uint256 minimumBuffer, uint256 maximumBuffer, uint256 buffer); - - struct BufferConfig { - uint256 minimumBuffer; - uint256 maximumBuffer; - uint256 buffer; - } - - function _depositWithBuffer(address assetAddr) internal { - uint256 assetBalance = IERC20(assetAddr).balanceOf(address(this)); - BufferConfig memory bufferConfig = _bufferConfig(assetAddr); - if (assetBalance > bufferConfig.maximumBuffer) { - _depositToPool(assetAddr, assetBalance - bufferConfig.buffer); - } - } - - function _withdrawWithBuffer(address assetAddr, address to, uint256 amount) internal { - uint256 assetBalance = IERC20(assetAddr).balanceOf(address(this)); - BufferConfig memory bufferConfig = _bufferConfig(assetAddr); - - if (assetBalance >= amount && assetBalance - amount >= bufferConfig.minimumBuffer) { - // Sufficient buffer, transfer directly from contract balance - IERC20(assetAddr).safeTransfer(to, amount); - return; - } - // Not enough buffer, withdraw from pool - uint256 targetBalance = bufferConfig.buffer + amount; - uint256 amountFromPool = targetBalance - assetBalance; - uint256 aTokenBalance = _aTokenBalance(assetAddr); - if (amountFromPool > aTokenBalance) { - amountFromPool = aTokenBalance; - } - if (amountFromPool == amount) { - _withdrawFromPool(assetAddr, to, amountFromPool); - } else { - _withdrawFromPool(assetAddr, address(this), amountFromPool); - IERC20(assetAddr).safeTransfer(to, amount); - } - } - - function _bufferConfig(address assetAddr) internal view virtual returns (BufferConfig memory); - - function _depositToPool(address assetAddr, uint256 amount) internal virtual; - - function _withdrawFromPool(address assetAddr, address to, uint256 amount) internal virtual; - - function _aTokenBalance(address assetAddr) internal view virtual returns (uint256 amount); - - function _checkBufferConfig(uint256 minimumBuffer, uint256 maximumBuffer, uint256 buffer) internal pure { - if (minimumBuffer > maximumBuffer || buffer < minimumBuffer || buffer > maximumBuffer) { - revert InvalidBuffer(minimumBuffer, maximumBuffer, buffer); - } - } -} diff --git a/contracts/tokens/TermMaxToken.sol b/contracts/tokens/TermMaxToken.sol deleted file mode 100644 index be07e24..0000000 --- a/contracts/tokens/TermMaxToken.sol +++ /dev/null @@ -1,180 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {ERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; -import { - OwnableUpgradeable, - Ownable2StepUpgradeable -} from "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; -import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; -import {IERC20Metadata, IERC20} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; -import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; -import {IAaveV3Minimal} from "contracts/extensions/aave/IAaveV3Minimal.sol"; -import {TransferUtils} from "contracts/lib/TransferUtils.sol"; -import {StakingBuffer} from "contracts/tokens/StakingBuffer.sol"; -import {TermMaxTokenEvents} from "contracts/events/TermMaxTokenEvents.sol"; -import {TermMaxTokenErrors} from "contracts/errors/TermMaxTokenErrors.sol"; -import {PendingLib, PendingAddress} from "contracts/lib/PendingLib.sol"; - -contract TermMaxToken is - StakingBuffer, - ERC20Upgradeable, - Ownable2StepUpgradeable, - UUPSUpgradeable, - ReentrancyGuardUpgradeable, - TermMaxTokenEvents, - TermMaxTokenErrors -{ - using TransferUtils for IERC20; - using PendingLib for PendingAddress; - - IAaveV3Minimal public immutable aavePool; - uint16 public immutable referralCode; - - IERC20 public aToken; - IERC20 public underlying; - BufferConfig public bufferConfig; - /// @notice The token's decimals - uint8 _decimals; - uint256 internal withdawedIncomeAssets; - - /// @notice The timelock period for upgrade operations (in seconds) - uint256 public constant UPGRADE_TIMELOCK = 1 days; - - /// @notice Pending upgrade implementation address with timelock - PendingAddress internal _pendingImplementation; - - constructor(address aavePool_, uint16 referralCode_) { - aavePool = IAaveV3Minimal(aavePool_); - referralCode = referralCode_; - _disableInitializers(); - } - - function initialize(address admin, address underlying_, BufferConfig memory bufferConfig_) public initializer { - underlying = IERC20(underlying_); - string memory name = string(abi.encodePacked("TermMax ", IERC20Metadata(underlying_).name())); - string memory symbol = string(abi.encodePacked("tmx", IERC20Metadata(underlying_).symbol())); - _decimals = IERC20Metadata(underlying_).decimals(); - __ERC20_init(name, symbol); - __Ownable_init(admin); - __ReentrancyGuard_init(); - _updateBufferConfig(bufferConfig_); - aToken = IERC20(aavePool.getReserveData(underlying_).aTokenAddress); - - emit TermMaxTokenInitialized(admin, underlying_); - } - - function mint(address to, uint256 amount) external nonReentrant { - _mint(to, amount); - underlying.safeTransferFrom(msg.sender, address(this), amount); - _depositWithBuffer(address(underlying)); - } - - function burn(address to, uint256 amount) external nonReentrant { - _burn(msg.sender, amount); - _withdrawWithBuffer(address(underlying), to, amount); - } - - function burnToAToken(address to, uint256 amount) external nonReentrant { - _burn(msg.sender, amount); - aToken.safeTransfer(to, amount); - } - - function totalIncomeAssets() external view returns (uint256) { - uint256 aTokenBalance = aToken.balanceOf(address(this)); - uint256 underlyingBalance = underlying.balanceOf(address(this)); - return aTokenBalance + underlyingBalance - totalSupply() + withdawedIncomeAssets; - } - - function withdrawIncomeAssets(address asset, address to, uint256 amount) external nonReentrant onlyOwner { - uint256 aTokenBalance = aToken.balanceOf(address(this)); - uint256 underlyingBalance = underlying.balanceOf(address(this)); - uint256 avaliableAmount = aTokenBalance + underlyingBalance - totalSupply(); - require(avaliableAmount >= amount, InsufficientIncomeAmount(avaliableAmount, amount)); - withdawedIncomeAssets += amount; - if (asset == address(underlying)) { - _withdrawWithBuffer(address(underlying), to, amount); - } else if (asset == address(aToken)) { - aToken.safeTransfer(to, amount); - } else { - revert InvalidToken(); - } - emit WithdrawIncome(to, amount); - } - - function updateBufferConfigAndAddReserves(uint256 additionalReserves, BufferConfig memory bufferConfig_) - external - onlyOwner - { - // Admin may add additional reserves when liquidity is low - // to avoid the situation that the underlying liquidity is too low to withdraw - underlying.safeTransferFrom(msg.sender, address(this), additionalReserves); - _updateBufferConfig(bufferConfig_); - } - - function _updateBufferConfig(BufferConfig memory bufferConfig_) internal { - _checkBufferConfig(bufferConfig_.minimumBuffer, bufferConfig_.maximumBuffer, bufferConfig_.buffer); - bufferConfig = BufferConfig(bufferConfig_.minimumBuffer, bufferConfig_.maximumBuffer, bufferConfig_.buffer); - emit UpdateBufferConfig(bufferConfig_.minimumBuffer, bufferConfig_.maximumBuffer, bufferConfig_.buffer); - } - - function decimals() public view override(ERC20Upgradeable) returns (uint8) { - return _decimals; - } - - function _bufferConfig(address) internal view virtual override returns (BufferConfig memory) { - return bufferConfig; - } - - function _depositToPool(address assetAddr, uint256 amount) internal virtual override { - IERC20(assetAddr).safeIncreaseAllowance(address(aavePool), amount); - aavePool.supply(assetAddr, amount, address(this), referralCode); - } - - function _withdrawFromPool(address assetAddr, address to, uint256 amount) internal virtual override { - aToken.safeIncreaseAllowance(address(aavePool), amount); - uint256 receivedAmount = aavePool.withdraw(assetAddr, amount, to); - require(receivedAmount == amount, AaveWithdrawFailed(amount, receivedAmount)); - } - - function _aTokenBalance(address) internal view virtual override returns (uint256 amount) { - amount = aToken.balanceOf(address(this)); - } - - /// @notice Submit a new implementation for upgrade with timelock - /// @param newImplementation The address of the new implementation contract - function submitPendingUpgrade(address newImplementation) external onlyOwner { - if (newImplementation == address(0)) revert InvalidImplementation(); - if (_pendingImplementation.validAt != 0) revert AlreadyPending(); - - _pendingImplementation.update(newImplementation, UPGRADE_TIMELOCK); - - emit SubmitUpgrade(newImplementation, _pendingImplementation.validAt); - } - - /// @notice Revoke the pending implementation upgrade - function revokeUpgrade() external onlyOwner { - if (_pendingImplementation.validAt == 0) revert NoPendingValue(); - - delete _pendingImplementation; - - emit RevokeUpgrade(msg.sender); - } - - /// @notice Get the pending implementation upgrade details - /// @return implementation The pending implementation address - /// @return validAt The timestamp when the upgrade becomes valid - function pendingImplementation() external view returns (address implementation, uint64 validAt) { - return (_pendingImplementation.value, _pendingImplementation.validAt); - } - - /// @notice Override _authorizeUpgrade to prevent direct upgrades without timelock - /// @dev This function should never allow upgrades as they must go through the timelock process - function _authorizeUpgrade(address newImplementation) internal virtual override onlyOwner { - if (_pendingImplementation.validAt == 0) revert NoPendingValue(); - if (newImplementation != _pendingImplementation.value) revert InvalidImplementation(); - if (block.timestamp < _pendingImplementation.validAt) revert TimelockNotElapsed(); - delete _pendingImplementation; - emit AcceptUpgrade(msg.sender, newImplementation); - } -} diff --git a/contracts/vault/IOrderManager.sol b/contracts/vault/IOrderManager.sol deleted file mode 100644 index 62dc349..0000000 --- a/contracts/vault/IOrderManager.sol +++ /dev/null @@ -1,98 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {ITermMaxMarket} from "contracts/ITermMaxMarket.sol"; -import {ITermMaxOrder} from "contracts/ITermMaxOrder.sol"; -import {CurveCuts} from "contracts/storage/TermMaxStorage.sol"; - -/** - * @title Order Manager Interface - * @author Term Structure Labs - */ -interface IOrderManager { - /** - * @notice Creates a new order - * @param asset The asset token address - * @param market The market address - * @param maxSupply The maximum xt supply of the order - * @param initialReserve The initial reserve of the order - * @param curveCuts The curve cuts for the order - * @return order The order address - */ - function createOrder( - IERC20 asset, - ITermMaxMarket market, - uint256 maxSupply, - uint256 initialReserve, - CurveCuts memory curveCuts - ) external returns (ITermMaxOrder order); - - /** - * @notice Deals bad debt - * @param recipient The recipient of the collateral token - * @param collateral The collateral token address - * @param amount The amount of bad debt to deal - */ - function dealBadDebt(address recipient, address collateral, uint256 amount) - external - returns (uint256 collateralOut); - - /** - * @notice Updates multiple orders - * @param asset The asset token address - * @param orders The orders to update - * @param changes The changes to apply to each order - * @param maxSupplies The maximum xt supplies to update for each order - * @param curveCuts The curve cuts to update for each order - */ - function updateOrders( - IERC20 asset, - ITermMaxOrder[] memory orders, - int256[] memory changes, - uint256[] memory maxSupplies, - CurveCuts[] memory curveCuts - ) external; - - /** - * @notice Withdraws performance fee - * @param asset The asset token address - * @param recipient The recipient of the performance fee - * @param amount The amount of performance fee to withdraw - */ - function withdrawPerformanceFee(IERC20 asset, address recipient, uint256 amount) external; - - /** - * @notice Deposits assets - * @param asset The asset token address - * @param amount The amount of assets to deposit - */ - function depositAssets(IERC20 asset, uint256 amount) external; - - /** - * @notice Withdraws assets - * @param asset The asset token address - * @param recipient The recipient of the assets - * @param amount The amount of assets to withdraw - */ - function withdrawAssets(IERC20 asset, address recipient, uint256 amount) external; - - /** - * @notice Accrues interest - */ - function accruedInterest() external; - - /** - * @notice Redeems an order - * @param order The order to redeem - */ - function redeemOrder(ITermMaxOrder order) external; - - /** - * @notice Swaps callback to calculate interest - * @param ftReserve The reserve of the FT token - * @param xtReserve The reserve of the XT token - * @param deltaFt The deltaFt of the swap - */ - function afterSwap(uint256 ftReserve, uint256 xtReserve, int256 deltaFt) external; -} diff --git a/contracts/vault/ITermMaxVault.sol b/contracts/vault/ITermMaxVault.sol deleted file mode 100644 index d90c035..0000000 --- a/contracts/vault/ITermMaxVault.sol +++ /dev/null @@ -1,296 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {IERC4626} from "@openzeppelin/contracts/interfaces/IERC4626.sol"; -import {IERC20} from "@openzeppelin/contracts/interfaces/IERC20.sol"; -import {ITermMaxMarket} from "contracts/ITermMaxMarket.sol"; -import {CurveCuts, VaultInitialParams} from "contracts/storage/TermMaxStorage.sol"; -import {ITermMaxOrder} from "contracts/ITermMaxOrder.sol"; -import {PendingAddress, PendingUint192} from "contracts/lib/PendingLib.sol"; -import {OrderInfo} from "./VaultStorage.sol"; - -/** - * @title TermMax Vault Interface - * @author Term Structure Labs - * @notice Interface for TermMax vaults that extends the ERC4626 standard - * @dev Implements ERC4626 tokenized vault standard with additional TermMax-specific functionality - */ -interface ITermMaxVault is IERC4626 { - /** - * @notice Initializes the vault - * @param params The initial parameters of the vault - */ - function initialize(VaultInitialParams memory params) external; - - /** - * @notice Handles bad debt by exchanging shares for collateral - * @param collaretal The collateral token address - * @param badDebtAmt The amount of bad debt to handle - * @param recipient The recipient of the collateral - * @param owner The owner of the shares - * @return shares The amount of shares burned - * @return collaretalOut The amount of collateral released - */ - function dealBadDebt(address collaretal, uint256 badDebtAmt, address recipient, address owner) - external - returns (uint256 shares, uint256 collaretalOut); - - /** - * @notice Returns the current Annual Percentage Rate (APR) - * @return The current APR as a percentage with 8 decimals - */ - function apr() external view returns (uint256); - - /** - * @notice Returns the guardian address - * @return The address of the guardian - */ - function guardian() external view returns (address); - - /** - * @notice Returns the curator address - * @return The address of the curator - */ - function curator() external view returns (address); - - /** - * @notice Checks if an address is an allocator - * @param allocator The address to check - * @return True if the address is an allocator, false otherwise - */ - function isAllocator(address allocator) external view returns (bool); - - /** - * @notice Checks if a market is whitelisted - * @param market The market address to check - * @return True if the market is whitelisted, false otherwise - */ - function marketWhitelist(address market) external view returns (bool); - - /** - * @notice Returns the timelock duration - * @return The timelock duration in seconds - */ - function timelock() external view returns (uint256); - - /** - * @notice Returns the pending market information - * @param market The market address to check - */ - function pendingMarkets(address market) external view returns (PendingUint192 memory); - - /** - * @notice Returns the pending timelock information - */ - function pendingTimelock() external view returns (PendingUint192 memory); - - /** - * @notice Returns the pending performance fee rate information - */ - function pendingPerformanceFeeRate() external view returns (PendingUint192 memory); - - /** - * @notice Returns the pending guardian information - */ - function pendingGuardian() external view returns (PendingAddress memory); - - /** - * @notice Returns the performance fee rate - * @return The performance fee rate as a percentage with 18 decimals - */ - function performanceFeeRate() external view returns (uint64); - - /** - * @notice Returns the total amount of ft tokens - * @return The total amount of ft tokens - */ - function totalFt() external view returns (uint256); - - /** - * @notice Returns the accreting principal amount - * @return The accreting principal amount - */ - function accretingPrincipal() external view returns (uint256); - - /** - * @notice Returns the annualized interest - * @return The annualized interest - */ - function annualizedInterest() external view returns (uint256); - - /** - * @notice Returns the performance fee amount - * @return The performance fee amount - */ - function performanceFee() external view returns (uint256); - - /** - * @notice Returns the supply queue information - * @param index The index of the supply queue to retrieve - * @return The address of the supply queue at the specified index - */ - function supplyQueue(uint256 index) external view returns (address); - - /** - * @notice Returns the withdraw queue information - * @param index The index of the withdraw queue to retrieve - * @return The address of the withdraw queue at the specified index - */ - function withdrawQueue(uint256 index) external view returns (address); - - /// @notice Return the length of the supply queue - function supplyQueueLength() external view returns (uint256); - - /// @notice Return the length of the withdraw queue - function withdrawQueueLength() external view returns (uint256); - - /** - * @notice Returns the order mapping information - * @param order The order address to retrieve - */ - function orderMapping(address order) external view returns (OrderInfo memory); - - /** - * @notice Returns the bad debt mapping information - * @param collateral The collateral address to retrieve - * @return The bad debt amount associated with the collateral - */ - function badDebtMapping(address collateral) external view returns (uint256); - - /** - * @notice Creates a new order - * @param market The market address to create the order for - * @param maxSupply The maximum supply of the order - * @param initialReserve The initial reserve amount of the order - * @param curveCuts The curve cuts to use for the order - * @return order The newly created order - */ - function createOrder(ITermMaxMarket market, uint256 maxSupply, uint256 initialReserve, CurveCuts calldata curveCuts) - external - returns (ITermMaxOrder order); - - /** - * @notice Updates multiple orders - * @param orders The orders to update - * @param changes The changes to apply to each order - * @param maxSupplies The maximum supplies to update for each order - * @param curveCuts The curve cuts to update for each order - */ - function updateOrders( - ITermMaxOrder[] calldata orders, - int256[] calldata changes, - uint256[] calldata maxSupplies, - CurveCuts[] calldata curveCuts - ) external; - - /** - * @notice Updates the supply queue - * @param indexes The indexes to update in the supply queue - */ - function updateSupplyQueue(uint256[] calldata indexes) external; - - /** - * @notice Updates the withdraw queue - * @param indexes The indexes to update in the withdraw queue - */ - function updateWithdrawQueue(uint256[] calldata indexes) external; - - /** - * @notice Redeems an order - * @param order The order to redeem - */ - function redeemOrder(ITermMaxOrder order) external; - - /** - * @notice Withdraws performance fee - * @param recipient The recipient of the performance fee - * @param amount The amount of performance fee to withdraw - */ - function withdrawPerformanceFee(address recipient, uint256 amount) external; - - /** - * @notice Submits a new guardian address - * @param newGuardian The new guardian address - */ - function submitGuardian(address newGuardian) external; - - /** - * @notice Sets a new curator address - * @param newCurator The new curator address - */ - function setCurator(address newCurator) external; - - /** - * @notice Submits a new timelock duration - * @param newTimelock The new timelock duration - */ - function submitTimelock(uint256 newTimelock) external; - - /** - * @notice Sets a new capacity - * @param newCapacity The new capacity - */ - function setCapacity(uint256 newCapacity) external; - - /** - * @notice Sets whether an address is an allocator - * @param newAllocator The address to set as an allocator - * @param newIsAllocator Whether the address is an allocator - */ - function setIsAllocator(address newAllocator, bool newIsAllocator) external; - - /** - * @notice Submits a new performance fee rate - * @param newPerformanceFeeRate The new performance fee rate - */ - function submitPerformanceFeeRate(uint184 newPerformanceFeeRate) external; - - /** - * @notice Submits a new market for whitelisting - * @param market The market address to whitelist - * @param isWhitelisted Whether the market is whitelisted - */ - function submitMarket(address market, bool isWhitelisted) external; - - /** - * @notice Revokes the pending timelock - */ - function revokePendingTimelock() external; - - /** - * @notice Revokes the pending guardian - */ - function revokePendingGuardian() external; - - /** - * @notice Revokes the pending market - * @param market The market address to revoke - */ - function revokePendingMarket(address market) external; - - /** - * @notice Revokes the pending performance fee rate - */ - function revokePendingPerformanceFeeRate() external; - - /** - * @notice Accepts the pending timelock - */ - function acceptTimelock() external; - - /** - * @notice Accepts the pending guardian - */ - function acceptGuardian() external; - - /** - * @notice Accepts the pending market - * @param market The market address to accept - */ - function acceptMarket(address market) external; - - /** - * @notice Accepts the pending performance fee rate - */ - function acceptPerformanceFeeRate() external; -} diff --git a/contracts/vault/OrderManager.sol b/contracts/vault/OrderManager.sol deleted file mode 100644 index 8901787..0000000 --- a/contracts/vault/OrderManager.sol +++ /dev/null @@ -1,381 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.27; - -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; -import {PendingLib, PendingAddress, PendingUint192} from "contracts/lib/PendingLib.sol"; -import {ITermMaxMarket} from "contracts/ITermMaxMarket.sol"; -import {CurveCuts, OrderConfig} from "contracts/storage/TermMaxStorage.sol"; -import {VaultErrors} from "contracts/errors/VaultErrors.sol"; -import {VaultEvents} from "contracts/events/VaultEvents.sol"; -import {ITermMaxRouter} from "contracts/router/ITermMaxRouter.sol"; -import {ITermMaxOrder} from "contracts/ITermMaxOrder.sol"; -import {VaultConstants} from "contracts/lib/VaultConstants.sol"; -import {TransferUtils} from "contracts/lib/TransferUtils.sol"; -import {Constants} from "contracts/lib/Constants.sol"; -import {ArrayUtils} from "contracts/lib/ArrayUtils.sol"; -import {MathLib} from "contracts/lib/MathLib.sol"; -import {LinkedList} from "contracts/lib/LinkedList.sol"; -import {IOrderManager} from "./IOrderManager.sol"; -import {ISwapCallback} from "contracts/ISwapCallback.sol"; -import {OrderInfo, VaultStorage} from "./VaultStorage.sol"; -/** - * @title Order Manager - * @author Term Structure Labs - * @notice The extension of the TermMaxVault that manages orders and calculates interest - */ - -contract OrderManager is VaultStorage, VaultErrors, VaultEvents, IOrderManager { - using SafeCast for uint256; - using SafeCast for int256; - using TransferUtils for IERC20; - using ArrayUtils for address[]; - using MathLib for uint256; - using LinkedList for mapping(uint64 => uint64); - - address private immutable ORDER_MANAGER_SINGLETON; - - /** - * @notice Reverts if the caller is not the proxy - */ - modifier onlyProxy() { - if (address(this) == ORDER_MANAGER_SINGLETON) revert OnlyProxy(); - _; - } - - constructor() { - ORDER_MANAGER_SINGLETON = address(this); - } - - /** - * @inheritdoc IOrderManager - */ - function updateOrders( - IERC20 asset, - ITermMaxOrder[] memory orders, - int256[] memory changes, - uint256[] memory maxSupplies, - CurveCuts[] memory curveCuts - ) external override onlyProxy { - _accruedInterest(); - for (uint256 i = 0; i < orders.length; ++i) { - _updateOrder(asset, ITermMaxOrder(orders[i]), changes[i], maxSupplies[i], curveCuts[i]); - } - } - - /** - * @inheritdoc IOrderManager - */ - function withdrawPerformanceFee(IERC20 asset, address recipient, uint256 amount) external override onlyProxy { - _accruedInterest(); - _withdrawPerformanceFee(asset, recipient, amount); - } - - /** - * @inheritdoc IOrderManager - */ - function redeemOrder(ITermMaxOrder order) external override onlyProxy { - _redeemFromMarket(address(order), _orderMapping[address(order)]); - } - - /** - * @inheritdoc IOrderManager - */ - function createOrder( - IERC20 asset, - ITermMaxMarket market, - uint256 maxSupply, - uint256 initialReserve, - CurveCuts memory curveCuts - ) external onlyProxy returns (ITermMaxOrder order) { - if ( - _supplyQueue.length + 1 >= VaultConstants.MAX_QUEUE_LENGTH - || _withdrawQueue.length + 1 >= VaultConstants.MAX_QUEUE_LENGTH - ) revert MaxQueueLengthExceeded(); - - (IERC20 ft, IERC20 xt,,, IERC20 debtToken) = market.tokens(); - if (asset != debtToken) revert InconsistentAsset(); - - order = market.createOrder(address(this), maxSupply, ISwapCallback(address(this)), curveCuts); - if (initialReserve > 0) { - asset.safeIncreaseAllowance(address(market), initialReserve); - market.mint(address(order), initialReserve); - } - _supplyQueue.push(address(order)); - _withdrawQueue.push(address(order)); - - uint64 orderMaturity = market.config().maturity; - _orderMapping[address(order)] = - OrderInfo({market: market, ft: ft, xt: xt, maxSupply: maxSupply.toUint128(), maturity: orderMaturity}); - _maturityMapping.insertWhenZeroAsRoot(orderMaturity); - emit CreateOrder(msg.sender, address(market), address(order), maxSupply, initialReserve, curveCuts); - } - - function _updateOrder( - IERC20 asset, - ITermMaxOrder order, - int256 changes, - uint256 maxSupply, - CurveCuts memory curveCuts - ) internal { - _checkOrder(address(order)); - OrderInfo memory orderInfo = _orderMapping[address(order)]; - orderInfo.maxSupply = maxSupply.toUint128(); - OrderConfig memory newOrderConfig; - newOrderConfig.curveCuts = curveCuts; - newOrderConfig.maxXtReserve = maxSupply; - newOrderConfig.swapTrigger = ISwapCallback(address(this)); - if (changes < 0) { - // withdraw assets from order and burn to assets - order.updateOrder(newOrderConfig, changes, changes); - uint256 withdrawChanges = (-changes).toUint256(); - orderInfo.market.burn(address(this), address(this), withdrawChanges); - } else { - // deposit assets to order - uint256 depositChanges = uint256(changes); - asset.safeIncreaseAllowance(address(orderInfo.market), depositChanges); - orderInfo.market.mint(address(order), depositChanges); - // update curve cuts - order.updateOrder(newOrderConfig, 0, 0); - } - _orderMapping[address(order)] = orderInfo; - emit UpdateOrder(msg.sender, address(order), changes, maxSupply, curveCuts); - } - - /** - * @inheritdoc IOrderManager - */ - function depositAssets(IERC20 asset, uint256 amount) external override onlyProxy { - _accruedInterest(); - uint256 amountLeft = amount; - for (uint256 i = 0; i < _supplyQueue.length; ++i) { - address order = _supplyQueue[i]; - - //check maturity - OrderInfo memory orderInfo = _orderMapping[order]; - if (block.timestamp > orderInfo.maturity) continue; - - //check supply - uint256 xtReserve = orderInfo.xt.balanceOf(order); - if (xtReserve >= orderInfo.maxSupply) continue; - - uint256 depositAmt = (orderInfo.maxSupply - xtReserve).min(amountLeft); - - asset.safeIncreaseAllowance(address(orderInfo.market), depositAmt); - orderInfo.market.mint(order, depositAmt); - amountLeft -= depositAmt; - if (amountLeft == 0) break; - } - // deposit to lpers - uint256 amplifiedAmt = amount * Constants.DECIMAL_BASE_SQ; - _totalFt += amplifiedAmt; - _accretingPrincipal += amplifiedAmt; - } - - /** - * @inheritdoc IOrderManager - */ - function withdrawAssets(IERC20 asset, address recipient, uint256 amount) external override onlyProxy { - _accruedInterest(); - uint256 amountLeft = amount; - uint256 assetBalance = asset.balanceOf(address(this)); - if (assetBalance >= amount) { - asset.safeTransfer(recipient, amount); - } else { - amountLeft -= assetBalance; - uint256 length = _withdrawQueue.length; - // withdraw from orders - uint256 i; - while (length > 0 && i < length) { - address order = _withdrawQueue[i]; - OrderInfo memory orderInfo = _orderMapping[order]; - if (block.timestamp >= orderInfo.maturity + Constants.LIQUIDATION_WINDOW) { - // redeem assets from expired order - uint256 totalRedeem = _redeemFromMarket(order, orderInfo); - length--; - if (totalRedeem < amountLeft) { - amountLeft -= totalRedeem; - continue; - } else { - // transfer all assets to recipient - asset.safeTransfer(recipient, amount); - amountLeft = 0; - break; - } - } else if (block.timestamp < orderInfo.maturity) { - // withdraw ft and xt from order to burn - uint256 maxWithdraw = orderInfo.xt.balanceOf(order).min(orderInfo.ft.balanceOf(order)); - - if (maxWithdraw < amountLeft) { - amountLeft -= maxWithdraw; - ITermMaxOrder(order).withdrawAssets(asset, recipient, maxWithdraw); - ++i; - } else { - ITermMaxOrder(order).withdrawAssets(asset, recipient, amountLeft); - amountLeft = 0; - break; - } - } else { - // ignore orders that are in liquidation window - ++i; - } - } - if (amountLeft > 0) { - uint256 maxWithdraw = amount - amountLeft; - revert InsufficientFunds(maxWithdraw, amount); - } - } - uint256 amplifiedAmt = amount * Constants.DECIMAL_BASE_SQ; - _totalFt -= amplifiedAmt; - _accretingPrincipal -= amplifiedAmt; - } - - function _withdrawPerformanceFee(IERC20 asset, address recipient, uint256 amount) internal { - uint256 amplifiedAmt = amount * Constants.DECIMAL_BASE_SQ; - if (amplifiedAmt > _performanceFee) { - revert InsufficientFunds(_performanceFee / Constants.DECIMAL_BASE_SQ, amount); - } - asset.safeTransfer(recipient, amount); - _performanceFee -= amplifiedAmt; - _totalFt -= amplifiedAmt; - - emit WithdrawPerformanceFee(msg.sender, recipient, amount); - } - - /** - * @inheritdoc IOrderManager - */ - function dealBadDebt(address recipient, address collateral, uint256 amount) - external - onlyProxy - returns (uint256 collateralOut) - { - _accruedInterest(); - uint256 badDebtAmt = _badDebtMapping[collateral]; - if (badDebtAmt == 0) revert NoBadDebt(collateral); - if (amount > badDebtAmt) revert InsufficientFunds(badDebtAmt, amount); - uint256 collateralBalance = IERC20(collateral).balanceOf(address(this)); - collateralOut = (amount * collateralBalance) / badDebtAmt; - IERC20(collateral).safeTransfer(recipient, collateralOut); - - _badDebtMapping[collateral] -= amount; - uint256 amplifiedAmt = amount * Constants.DECIMAL_BASE_SQ; - _accretingPrincipal -= amplifiedAmt; - _totalFt -= amplifiedAmt; - } - - function _redeemFromMarket(address order, OrderInfo memory orderInfo) internal returns (uint256 totalRedeem) { - uint256 ftReserve = orderInfo.ft.balanceOf(order); - if (ftReserve != 0) { - ITermMaxOrder(order).withdrawAssets(orderInfo.ft, address(this), ftReserve); - (totalRedeem,) = orderInfo.market.redeem(address(this), address(this), ftReserve); - if (totalRedeem < ftReserve) { - // storage bad debt - (,,, address collateral,) = orderInfo.market.tokens(); - _badDebtMapping[collateral] += ftReserve - totalRedeem; - } - } - emit RedeemOrder(msg.sender, order, ftReserve.toUint128(), totalRedeem.toUint128()); - - delete _orderMapping[order]; - _supplyQueue.remove(_supplyQueue.indexOf(order)); - _withdrawQueue.remove(_withdrawQueue.indexOf(order)); - } - - /// @notice Calculate and distribute accrued the interest from start to end time - function _accruedPeriodInterest(uint256 startTime, uint256 endTime) internal { - uint256 interest = (_annualizedInterest * (endTime - startTime)) / 365 days; - uint256 _performanceFeeToCurator = (interest * _performanceFeeRate) / Constants.DECIMAL_BASE; - // accrue interest - _performanceFee += _performanceFeeToCurator; - _accretingPrincipal += (interest - _performanceFeeToCurator); - } - - /** - * @inheritdoc IOrderManager - */ - function accruedInterest() external onlyProxy { - _accruedInterest(); - } - - /// @notice Distribute interest - function _accruedInterest() internal { - uint64 currentTime = block.timestamp.toUint64(); - uint256 lastTime = _lastUpdateTime; - if (currentTime == lastTime) return; - uint64 recentMaturity = _maturityMapping[0]; - if (recentMaturity == 0) return; - while (recentMaturity != 0 && recentMaturity <= currentTime) { - // pop first maturity - _maturityMapping.popWhenZeroAsRoot(); - _accruedPeriodInterest(lastTime, recentMaturity); - // update last time - lastTime = recentMaturity; - // update annualized interest - _annualizedInterest -= _maturityToInterest[recentMaturity]; - delete _maturityToInterest[recentMaturity]; - // get next maturity - recentMaturity = _maturityMapping[0]; - } - // accrued interest for the remaining maturity - if (recentMaturity > 0) { - _accruedPeriodInterest(lastTime, currentTime); - } else { - // all orders are expired - _annualizedInterest = 0; - } - _lastUpdateTime = currentTime; - } - - function _checkLockedFt() internal view { - if (_accretingPrincipal + _performanceFee > _totalFt) revert LockedFtGreaterThanTotalFt(); - } - - function _checkOrder(address orderAddress) internal view { - if (address(_orderMapping[orderAddress].market) == address(0)) { - revert UnauthorizedOrder(orderAddress); - } - } - - /// @notice Callback function for the swap - /// @param deltaFt The change in the ft balance of the order - function afterSwap(uint256 ftReserve, uint256 xtReserve, int256 deltaFt) external onlyProxy { - if (ftReserve < xtReserve) { - revert OrderHasNegativeInterest(); - } - address orderAddress = msg.sender; - /// @dev Check if the order is valid - _checkOrder(orderAddress); - uint64 maturity = _orderMapping[orderAddress].maturity; - /// @dev Calculate interest from last update time to now - _accruedInterest(); - - /// @dev If ft increases, interest increases, and if ft decreases, - /// interest decreases. Update the expected annualized return based on the change - uint256 ftChanges; - - if (deltaFt > 0) { - ftChanges = uint256(deltaFt) * Constants.DECIMAL_BASE_SQ; - _totalFt += ftChanges; - uint256 deltaAnnualizedInterest = ftChanges * 365 days / uint256(maturity - block.timestamp); - - _maturityToInterest[maturity] += deltaAnnualizedInterest; - - _annualizedInterest += deltaAnnualizedInterest; - } else { - ftChanges = uint256(-deltaFt) * Constants.DECIMAL_BASE_SQ; - _totalFt -= ftChanges; - uint256 deltaAnnualizedInterest = (ftChanges * 365 days) / uint256(maturity - block.timestamp); - if ( - _maturityToInterest[maturity] < deltaAnnualizedInterest || _annualizedInterest < deltaAnnualizedInterest - ) { - revert LockedFtGreaterThanTotalFt(); - } - _maturityToInterest[maturity] -= deltaAnnualizedInterest; - _annualizedInterest -= deltaAnnualizedInterest; - } - /// @dev Ensure that the total assets after the transaction are - ///greater than or equal to the principal and the allocated interest - _checkLockedFt(); - } -} diff --git a/contracts/vault/TermMaxVault.sol b/contracts/vault/TermMaxVault.sol deleted file mode 100644 index 2e3f400..0000000 --- a/contracts/vault/TermMaxVault.sol +++ /dev/null @@ -1,753 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity ^0.8.27; - -/** - * @title TermMaxVault - * @notice This contract is inspired by MetaMorphoV1_1 (https://github.com/morpho-org/metamorpho-v1.1/blob/main/src/MetaMorphoV1_1.sol) - * @dev The role management structure is based on Morpho's role system (https://docs.morpho.org/curation/concepts/roles/) - * with similar separation of curator, guardian, and allocator roles for enhanced governance and risk management. - */ -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; -import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; -import { - IERC4626, - ERC4626Upgradeable, - ERC20Upgradeable -} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC4626Upgradeable.sol"; -import {Ownable2StepUpgradeable} from "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; -import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; -import {PendingLib, PendingAddress, PendingUint192} from "contracts/lib/PendingLib.sol"; -import {ITermMaxMarket} from "contracts/ITermMaxMarket.sol"; -import {CurveCuts, VaultInitialParams} from "contracts/storage/TermMaxStorage.sol"; -import {ITermMaxRouter} from "contracts/router/ITermMaxRouter.sol"; -import {ITermMaxOrder} from "contracts/ITermMaxOrder.sol"; -import {VaultConstants} from "contracts/lib/VaultConstants.sol"; -import {TransferUtils} from "contracts/lib/TransferUtils.sol"; -import {ISwapCallback} from "contracts/ISwapCallback.sol"; -import {VaultErrors} from "contracts/errors/VaultErrors.sol"; -import {VaultEvents} from "contracts/events/VaultEvents.sol"; -import {IOrderManager} from "./IOrderManager.sol"; -import {VaultStorage, OrderInfo} from "./VaultStorage.sol"; -import {Constants} from "contracts/lib/Constants.sol"; -import {ITermMaxVault} from "./ITermMaxVault.sol"; - -contract TermMaxVault is - VaultStorage, - ITermMaxVault, - Ownable2StepUpgradeable, - ReentrancyGuardUpgradeable, - ERC4626Upgradeable, - PausableUpgradeable, - VaultErrors, - VaultEvents, - ISwapCallback -{ - using SafeCast for uint256; - using TransferUtils for IERC20; - using PendingLib for *; - - address public immutable ORDER_MANAGER_SINGLETON; - - modifier onlyCuratorRole() { - address sender = _msgSender(); - if (sender != _curator && sender != owner()) revert NotCuratorRole(); - _; - } - - /// @dev Reverts if the caller doesn't have the guardian role. - modifier onlyGuardianRole() { - address sender = _msgSender(); - if (sender != _guardian && sender != owner()) revert NotGuardianRole(); - - _; - } - - /// @dev Reverts if the caller doesn't have the allocator role. - modifier onlyAllocatorRole() { - address sender = _msgSender(); - if (!_isAllocator[sender] && sender != _curator && sender != owner()) { - revert NotAllocatorRole(); - } - _; - } - - modifier marketIsWhitelisted(address market) { - if (_pendingMarkets[market].validAt != 0 && block.timestamp > _pendingMarkets[market].validAt) { - _marketWhitelist[market] = true; - } - if (!_marketWhitelist[market]) revert MarketNotWhitelisted(); - _; - } - - /// @dev Makes sure conditions are met to accept a pending value. - /// @dev Reverts if: - /// - there's no pending value; - /// - the timelock has not elapsed since the pending value has been submitted. - modifier afterTimelock(uint256 validAt) { - if (validAt == 0) revert NoPendingValue(); - if (block.timestamp < validAt) revert TimelockNotElapsed(); - _; - } - - constructor(address ORDER_MANAGER_SINGLETON_) { - if (ORDER_MANAGER_SINGLETON_ == address(0)) revert InvalidImplementation(); - ORDER_MANAGER_SINGLETON = ORDER_MANAGER_SINGLETON_; - _disableInitializers(); - } - - function initialize(VaultInitialParams memory params) external initializer { - __ERC20_init(params.name, params.symbol); - __Ownable_init(params.admin); - __ERC4626_init(params.asset); - __ReentrancyGuard_init(); - __Pausable_init(); - - _setPerformanceFeeRate(params.performanceFeeRate); - _checkTimelockBounds(params.timelock); - _timelock = params.timelock; - _maxCapacity = params.maxCapacity; - _curator = params.curator; - } - - function _setPerformanceFeeRate(uint64 newPerformanceFeeRate) internal { - _delegateCall(abi.encodeCall(IOrderManager.accruedInterest, ())); - _performanceFeeRate = newPerformanceFeeRate; - } - - /// @notice View functions - - /** - * @inheritdoc ITermMaxVault - */ - function guardian() external view returns (address) { - return _guardian; - } - - /** - * @inheritdoc ITermMaxVault - */ - function curator() external view returns (address) { - return _curator; - } - - /** - * @inheritdoc ITermMaxVault - */ - function isAllocator(address allocator) external view returns (bool) { - return _isAllocator[allocator]; - } - - /** - * @inheritdoc ITermMaxVault - */ - function marketWhitelist(address market) external view returns (bool) { - return _marketWhitelist[market]; - } - - /** - * @inheritdoc ITermMaxVault - */ - function timelock() external view returns (uint256) { - return _timelock; - } - - /** - * @inheritdoc ITermMaxVault - */ - function pendingMarkets(address market) external view returns (PendingUint192 memory) { - return _pendingMarkets[market]; - } - - /** - * @inheritdoc ITermMaxVault - */ - function pendingTimelock() external view returns (PendingUint192 memory) { - return _pendingTimelock; - } - - /** - * @inheritdoc ITermMaxVault - */ - function pendingPerformanceFeeRate() external view returns (PendingUint192 memory) { - return _pendingPerformanceFeeRate; - } - - /** - * @inheritdoc ITermMaxVault - */ - function pendingGuardian() external view returns (PendingAddress memory) { - return _pendingGuardian; - } - - /** - * @inheritdoc ITermMaxVault - */ - function performanceFeeRate() external view returns (uint64) { - return _performanceFeeRate; - } - - /** - * @inheritdoc ITermMaxVault - */ - function totalFt() external view returns (uint256) { - return _totalFt / Constants.DECIMAL_BASE_SQ; - } - - /** - * @inheritdoc ITermMaxVault - */ - function accretingPrincipal() external view returns (uint256) { - (uint256 ap,) = _previewAccruedInterest(); - return ap / Constants.DECIMAL_BASE_SQ; - } - - /** - * @inheritdoc ITermMaxVault - */ - function annualizedInterest() external view returns (uint256) { - return _annualizedInterest / Constants.DECIMAL_BASE_SQ; - } - - /** - * @inheritdoc ITermMaxVault - */ - function performanceFee() external view returns (uint256) { - (, uint256 pf) = _previewAccruedInterest(); - return pf / Constants.DECIMAL_BASE_SQ; - } - - /** - * @inheritdoc ITermMaxVault - */ - function supplyQueue(uint256 index) external view returns (address) { - return _supplyQueue[index]; - } - - /** - * @inheritdoc ITermMaxVault - */ - function withdrawQueue(uint256 index) external view returns (address) { - return _withdrawQueue[index]; - } - - /** - * @inheritdoc ITermMaxVault - */ - function orderMapping(address order) external view returns (OrderInfo memory) { - return _orderMapping[order]; - } - - /** - * @inheritdoc ITermMaxVault - */ - function badDebtMapping(address collateral) external view returns (uint256) { - return _badDebtMapping[collateral]; - } - - /** - * @inheritdoc ITermMaxVault - */ - function apr() external view returns (uint256) { - if (_accretingPrincipal == 0) return 0; - return (_annualizedInterest * (Constants.DECIMAL_BASE - _performanceFeeRate)) / (_accretingPrincipal); - } - - /** - * @inheritdoc ITermMaxVault - */ - function supplyQueueLength() external view returns (uint256) { - return _supplyQueue.length; - } - - /** - * @inheritdoc ITermMaxVault - */ - function withdrawQueueLength() external view returns (uint256) { - return _withdrawQueue.length; - } - - // Ordermanager functions - /** - * @inheritdoc ITermMaxVault - */ - function createOrder(ITermMaxMarket market, uint256 maxSupply, uint256 initialReserve, CurveCuts memory curveCuts) - external - onlyCuratorRole - marketIsWhitelisted(address(market)) - whenNotPaused - returns (ITermMaxOrder order) - { - order = abi.decode( - _delegateCall( - abi.encodeCall( - IOrderManager.createOrder, (IERC20(asset()), market, maxSupply, initialReserve, curveCuts) - ) - ), - (ITermMaxOrder) - ); - } - - /** - * @inheritdoc ITermMaxVault - */ - function updateOrders( - ITermMaxOrder[] memory orders, - int256[] memory changes, - uint256[] memory maxSupplies, - CurveCuts[] memory curveCuts - ) external onlyCuratorRole whenNotPaused { - _delegateCall( - abi.encodeCall(IOrderManager.updateOrders, (IERC20(asset()), orders, changes, maxSupplies, curveCuts)) - ); - } - - /** - * @inheritdoc ITermMaxVault - */ - function redeemOrder(ITermMaxOrder order) external onlyCuratorRole { - _delegateCall(abi.encodeCall(IOrderManager.redeemOrder, (order))); - } - - /** - * @inheritdoc ITermMaxVault - */ - function withdrawPerformanceFee(address recipient, uint256 amount) - external - nonReentrant - whenNotPaused - onlyCuratorRole - { - _delegateCall(abi.encodeCall(IOrderManager.withdrawPerformanceFee, (IERC20(asset()), recipient, amount))); - } - - // ERC4626 functions - - /** - * @dev See {IERC4626-maxDeposit}. - */ - function maxDeposit(address) public view override(IERC4626, ERC4626Upgradeable) returns (uint256) { - if (paused()) return 0; - if (totalAssets() >= _maxCapacity) return 0; - return _maxCapacity - totalAssets(); - } - - /** - * @dev See {IERC4626-maxMint}. - */ - function maxMint(address) public view override(IERC4626, ERC4626Upgradeable) returns (uint256) { - if (paused()) return 0; - return convertToShares(maxDeposit(address(0))); - } - - /** - * @dev Get total assets, falling back to real assets if virtual assets exceed limit - */ - function totalAssets() public view override(IERC4626, ERC4626Upgradeable) returns (uint256) { - (uint256 previewPrincipal,) = _previewAccruedInterest(); - return previewPrincipal / Constants.DECIMAL_BASE_SQ; - } - - /** - * @dev Deposit/mint common workflow. - */ - function _deposit(address caller, address recipient, uint256 assets, uint256 shares) - internal - override - nonReentrant - whenNotPaused - { - IERC20(asset()).safeTransferFrom(caller, address(this), assets); - - _delegateCall(abi.encodeCall(IOrderManager.depositAssets, (IERC20(asset()), assets))); - _mint(recipient, shares); - - emit Deposit(caller, recipient, assets, shares); - } - - /** - * @dev Withdraw/redeem common workflow. - */ - function _withdraw(address caller, address receiver, address owner, uint256 assets, uint256 shares) - internal - override - nonReentrant - { - if (caller != owner) { - _spendAllowance(owner, caller, shares); - } - - _delegateCall(abi.encodeCall(IOrderManager.withdrawAssets, (IERC20(asset()), receiver, assets))); - _burn(owner, shares); - - emit Withdraw(caller, receiver, owner, assets, shares); - } - - function _delegateCall(bytes memory data) internal returns (bytes memory) { - (bool success, bytes memory returnData) = ORDER_MANAGER_SINGLETON.delegatecall(data); - if (!success) { - assembly { - let ptr := add(returnData, 0x20) - let len := mload(returnData) - revert(ptr, len) - } - } - return returnData; - } - - /** - * @inheritdoc ITermMaxVault - */ - function dealBadDebt(address collateral, uint256 badDebtAmt, address recipient, address owner) - external - nonReentrant - returns (uint256 shares, uint256 collateralOut) - { - address caller = msg.sender; - shares = previewWithdraw(badDebtAmt); - uint256 maxShares = maxRedeem(owner); - if (shares > maxShares) { - revert ERC4626ExceededMaxMint(recipient, shares, maxShares); - } - - if (caller != owner) { - _spendAllowance(owner, caller, shares); - } - - _burn(owner, shares); - - collateralOut = abi.decode( - _delegateCall(abi.encodeCall(IOrderManager.dealBadDebt, (recipient, collateral, badDebtAmt))), (uint256) - ); - - emit DealBadDebt(caller, recipient, collateral, badDebtAmt, shares, collateralOut); - } - - // Guardian functions - function _setTimelock(uint256 newTimelock) internal { - _timelock = newTimelock; - - emit SetTimelock(msg.sender, newTimelock); - - delete _pendingTimelock; - } - - /** - * @inheritdoc ITermMaxVault - */ - function submitTimelock(uint256 newTimelock) external onlyCuratorRole { - if (newTimelock == _timelock) revert AlreadySet(); - if (_pendingTimelock.validAt != 0) revert AlreadyPending(); - _checkTimelockBounds(newTimelock); - - if (newTimelock > _timelock) { - _setTimelock(newTimelock); - } else { - // Safe "unchecked" cast because newTimelock <= MAX_TIMELOCK. - _pendingTimelock.update(uint184(newTimelock), _timelock); - - emit SubmitTimelock(newTimelock, _pendingTimelock.validAt); - } - } - - /** - * @inheritdoc ITermMaxVault - */ - function setCapacity(uint256 newCapacity) external onlyCuratorRole { - if (newCapacity == _maxCapacity) revert AlreadySet(); - _maxCapacity = newCapacity; - emit SetCapacity(_msgSender(), newCapacity); - } - - function _checkTimelockBounds(uint256 newTimelock) internal pure { - if (newTimelock > VaultConstants.MAX_TIMELOCK) revert AboveMaxTimelock(); - if (newTimelock < VaultConstants.POST_INITIALIZATION_MIN_TIMELOCK) revert BelowMinTimelock(); - } - - /** - * @inheritdoc ITermMaxVault - */ - function submitPerformanceFeeRate(uint184 newPerformanceFeeRate) external onlyCuratorRole { - if (newPerformanceFeeRate == _performanceFeeRate) revert AlreadySet(); - if (_pendingPerformanceFeeRate.validAt != 0) revert AlreadyPending(); - if (newPerformanceFeeRate > VaultConstants.MAX_PERFORMANCE_FEE_RATE) revert PerformanceFeeRateExceeded(); - if (newPerformanceFeeRate < _performanceFeeRate) { - _setPerformanceFeeRate(uint256(newPerformanceFeeRate).toUint64()); - emit SetPerformanceFeeRate(_msgSender(), newPerformanceFeeRate); - return; - } else { - _pendingPerformanceFeeRate.update(newPerformanceFeeRate, _timelock); - emit SubmitPerformanceFeeRate(newPerformanceFeeRate, _pendingPerformanceFeeRate.validAt); - } - } - - /** - * @inheritdoc ITermMaxVault - */ - function submitGuardian(address newGuardian) external onlyOwner { - if (newGuardian == _guardian) revert AlreadySet(); - if (_pendingGuardian.validAt != 0) revert AlreadyPending(); - - if (_guardian == address(0)) { - _setGuardian(newGuardian); - } else { - _pendingGuardian.update(newGuardian, _timelock); - emit SubmitGuardian(newGuardian, _pendingGuardian.validAt); - } - } - - /// @dev Sets `guardian` to `newGuardian`. - function _setGuardian(address newGuardian) internal { - _guardian = newGuardian; - emit SetGuardian(_msgSender(), newGuardian); - - delete _pendingGuardian; - } - - /** - * @inheritdoc ITermMaxVault - */ - function submitMarket(address market, bool isWhitelisted) external onlyCuratorRole { - if (_marketWhitelist[market] && isWhitelisted) revert AlreadySet(); - if (_pendingMarkets[market].validAt != 0) revert AlreadyPending(); - if (!isWhitelisted) { - _setMarketWhitelist(market, isWhitelisted); - } else { - _pendingMarkets[market].update(0, _timelock); - emit SubmitMarketToWhitelist(market, _pendingMarkets[market].validAt); - } - } - - function _setMarketWhitelist(address market, bool isWhitelisted) internal { - _marketWhitelist[market] = isWhitelisted; - emit SetMarketWhitelist(_msgSender(), market, isWhitelisted); - delete _pendingMarkets[market]; - } - - /** - * @inheritdoc ITermMaxVault - */ - function setIsAllocator(address newAllocator, bool newIsAllocator) external onlyOwner { - if (_isAllocator[newAllocator] == newIsAllocator) revert AlreadySet(); - - _isAllocator[newAllocator] = newIsAllocator; - - emit SetIsAllocator(newAllocator, newIsAllocator); - } - - /** - * @inheritdoc ITermMaxVault - */ - function setCurator(address newCurator) external onlyOwner { - if (newCurator == _curator) revert AlreadySet(); - - _curator = newCurator; - - emit SetCurator(newCurator); - } - - /** - * @inheritdoc ITermMaxVault - */ - function updateSupplyQueue(uint256[] memory indexes) external onlyAllocatorRole { - _updateSupplyQueue(indexes); - } - - /** - * @inheritdoc ITermMaxVault - */ - function updateWithdrawQueue(uint256[] memory indexes) external onlyAllocatorRole { - _updateWithdrawQueue(indexes); - } - - function _updateWithdrawQueue(uint256[] memory indexes) internal { - uint256 length = _withdrawQueue.length; - if (indexes.length != length) { - revert WithdrawQueueLengthMismatch(); - } - bool[] memory seen = new bool[](length); - address[] memory newWithdrawQueue = new address[](length); - - for (uint256 i; i < length; ++i) { - uint256 prevIndex = indexes[i]; - - // If prevIndex >= currLength, it will revert with native "Index out of bounds". - address order = _withdrawQueue[prevIndex]; - if (seen[prevIndex]) revert DuplicateOrder(order); - seen[prevIndex] = true; - - newWithdrawQueue[i] = order; - } - _withdrawQueue = newWithdrawQueue; - - emit UpdateWithdrawQueue(msg.sender, newWithdrawQueue); - } - - function _updateSupplyQueue(uint256[] memory indexes) internal { - uint256 length = _supplyQueue.length; - if (indexes.length != length) { - revert SupplyQueueLengthMismatch(); - } - bool[] memory seen = new bool[](length); - address[] memory newSupplyQueue = new address[](length); - - for (uint256 i; i < length; ++i) { - uint256 prevIndex = indexes[i]; - - // If prevIndex >= currLength, it will revert with native "Index out of bounds". - address order = _supplyQueue[prevIndex]; - if (seen[prevIndex]) revert DuplicateOrder(order); - seen[prevIndex] = true; - - newSupplyQueue[i] = order; - } - _supplyQueue = newSupplyQueue; - - emit UpdateSupplyQueue(msg.sender, newSupplyQueue); - } - - /** - * Revoke functions - */ - - /** - * @inheritdoc ITermMaxVault - */ - function revokePendingTimelock() external onlyGuardianRole { - delete _pendingTimelock; - - emit RevokePendingTimelock(_msgSender()); - } - - /** - * @inheritdoc ITermMaxVault - */ - function revokePendingGuardian() external onlyGuardianRole { - delete _pendingGuardian; - - emit RevokePendingGuardian(_msgSender()); - } - - /** - * @inheritdoc ITermMaxVault - */ - function revokePendingMarket(address market) external onlyGuardianRole { - delete _pendingMarkets[market]; - - emit RevokePendingMarket(_msgSender(), market); - } - - /** - * @inheritdoc ITermMaxVault - */ - function revokePendingPerformanceFeeRate() external onlyGuardianRole { - delete _pendingPerformanceFeeRate; - - emit RevokePendingPerformanceFeeRate(_msgSender()); - } - - /** - * @inheritdoc ITermMaxVault - */ - function acceptTimelock() external afterTimelock(_pendingTimelock.validAt) { - _setTimelock(_pendingTimelock.value); - } - - /** - * @inheritdoc ITermMaxVault - */ - function acceptGuardian() external afterTimelock(_pendingGuardian.validAt) { - _setGuardian(_pendingGuardian.value); - } - - /** - * @inheritdoc ITermMaxVault - */ - function acceptMarket(address market) external afterTimelock(_pendingMarkets[market].validAt) { - _setMarketWhitelist(market, true); - } - - /** - * @inheritdoc ITermMaxVault - */ - function acceptPerformanceFeeRate() external afterTimelock(_pendingPerformanceFeeRate.validAt) { - _setPerformanceFeeRate(uint256(_pendingPerformanceFeeRate.value).toUint64()); - delete _pendingPerformanceFeeRate; - emit SetPerformanceFeeRate(_msgSender(), _performanceFeeRate); - } - - /** - * @notice Pauses the contract - */ - function pause() external onlyOwner { - _pause(); - // pause orders - for (uint256 i = 0; i < _supplyQueue.length; ++i) { - ITermMaxOrder(_supplyQueue[i]).pause(); - } - } - - /** - * @notice Unpauses the contract - */ - function unpause() external onlyOwner { - _unpause(); - // unpause orders - for (uint256 i = 0; i < _supplyQueue.length; ++i) { - ITermMaxOrder(_supplyQueue[i]).unpause(); - } - } - - function _previewAccruedInterest() - internal - view - returns (uint256 previewPrincipal, uint256 previewPerformanceFee) - { - uint64 currentTime = block.timestamp.toUint64(); - - uint256 lastTime = _lastUpdateTime; - if (lastTime == 0) { - return (_accretingPrincipal, _performanceFee); - } - uint64 recentMaturity = _maturityMapping[0]; - uint256 previewAnnualizedInterest = _annualizedInterest; - previewPrincipal = _accretingPrincipal; - previewPerformanceFee = _performanceFee; - - while (currentTime >= recentMaturity && recentMaturity != 0) { - (uint256 previewInterest, uint256 previewPerformanceFeeToCurator) = - _previewAccruedPeriodInterest(lastTime, recentMaturity, previewAnnualizedInterest); - lastTime = recentMaturity; - uint64 nextMaturity = _maturityMapping[recentMaturity]; - // update annualized interest - previewAnnualizedInterest -= _maturityToInterest[recentMaturity]; - - previewPerformanceFee += previewPerformanceFeeToCurator; - previewPrincipal += previewInterest; - - recentMaturity = nextMaturity; - } - if (recentMaturity > 0) { - (uint256 previewInterest, uint256 previewPerformanceFeeToCurator) = - _previewAccruedPeriodInterest(lastTime, currentTime, previewAnnualizedInterest); - previewPerformanceFee += previewPerformanceFeeToCurator; - previewPrincipal += previewInterest; - } - } - - function _previewAccruedPeriodInterest(uint256 startTime, uint256 endTime, uint256 previewAnnualizedInterest) - internal - view - returns (uint256, uint256) - { - uint256 interest = (previewAnnualizedInterest * (endTime - startTime)) / 365 days; - uint256 performanceFeeToCurator = (interest * _performanceFeeRate) / Constants.DECIMAL_BASE; - return (interest - performanceFeeToCurator, performanceFeeToCurator); - } - - /// @notice Callback function for the swap - /// @param deltaFt The change in the ft balance of the order - function afterSwap(uint256 ftReserve, uint256 xtReserve, int256 deltaFt, int256) external override { - _delegateCall(abi.encodeCall(IOrderManager.afterSwap, (ftReserve, xtReserve, deltaFt))); - } -} diff --git a/contracts/vault/VaultStorage.sol b/contracts/vault/VaultStorage.sol deleted file mode 100644 index a130821..0000000 --- a/contracts/vault/VaultStorage.sol +++ /dev/null @@ -1,58 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {ITermMaxMarket} from "contracts/ITermMaxMarket.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {PendingAddress, PendingUint192} from "contracts/lib/PendingLib.sol"; - -struct OrderInfo { - ITermMaxMarket market; - IERC20 ft; - IERC20 xt; - uint128 maxSupply; - uint64 maturity; -} - -contract VaultStorage { - // State variables - address internal _guardian; - address internal _curator; - - mapping(address => bool) internal _isAllocator; - mapping(address => bool) internal _marketWhitelist; - mapping(address => PendingUint192) internal _pendingMarkets; - - PendingUint192 internal _pendingTimelock; - PendingUint192 internal _pendingPerformanceFeeRate; - PendingAddress internal _pendingGuardian; - - uint256 internal _timelock; - uint256 internal _maxCapacity; - - /// @dev The total ft in the vault - uint256 internal _totalFt; - /// @notice The locked ft = accretingPrincipal + performanceFee; - uint256 internal _accretingPrincipal; - /// @notice The performance fee is paid to the curators - uint256 internal _performanceFee; - /// @notice Annualize the interest income - uint256 internal _annualizedInterest; - - uint64 internal _performanceFeeRate; - - address[] internal _supplyQueue; - address[] internal _withdrawQueue; - - /// @dev A mapping from collateral address to bad debt - mapping(address => uint256) internal _badDebtMapping; - mapping(address => OrderInfo) internal _orderMapping; - - /// @dev The last time the interest was accurately calculated - uint64 internal _lastUpdateTime; - /// @dev A one-way linked list presented using a mapping structure, recorded in order according to matiruty - /// @dev The key is the maturity, and the value is the next maturity - /// Etc. day 0 => day 1 => day 2 => day 3 => ... - mapping(uint64 => uint64) internal _maturityMapping; - /// @dev A mapping from maturity to its annualized interest - mapping(uint64 => uint256) internal _maturityToInterest; -} From c01e0350d62e3358920bd3019f0f3f4a4c068e72 Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 3 Jun 2025 12:20:01 +0800 Subject: [PATCH 058/194] fix changes --- script/utils/JsonLoader.sol | 2 +- test/v2/TermMaxToken.t.sol | 2 +- test/v2/utils/LoanUtils.sol | 2 +- test/v2/utils/SwapUtils.sol | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/script/utils/JsonLoader.sol b/script/utils/JsonLoader.sol index 24c165d..6a9413e 100644 --- a/script/utils/JsonLoader.sol +++ b/script/utils/JsonLoader.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.27; import "forge-std/Test.sol"; import {stdJson} from "forge-std/StdJson.sol"; -import {MarketConfig, FeeConfig, LoanConfig} from "../../contracts/storage/TermMaxStorage.sol"; +import {MarketConfig, FeeConfig, LoanConfig} from "contracts/v1/storage/TermMaxStorage.sol"; library JsonLoader { using stdJson for string; diff --git a/test/v2/TermMaxToken.t.sol b/test/v2/TermMaxToken.t.sol index d5c3de9..7b2a488 100644 --- a/test/v2/TermMaxToken.t.sol +++ b/test/v2/TermMaxToken.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.27; -import {TermMaxToken, StakingBuffer} from "contracts/tokens/TermMaxToken.sol"; +import {TermMaxToken, StakingBuffer} from "contracts/v2/tokens/TermMaxToken.sol"; import {Test} from "forge-std/Test.sol"; import {MockAave} from "contracts/v2/test/MockAave.sol"; import {MockERC20} from "contracts/v1/test/MockERC20.sol"; diff --git a/test/v2/utils/LoanUtils.sol b/test/v2/utils/LoanUtils.sol index f7578c4..649fb2d 100644 --- a/test/v2/utils/LoanUtils.sol +++ b/test/v2/utils/LoanUtils.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.27; import {console} from "forge-std/Script.sol"; import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; -import {Constants} from "contracts/lib/Constants.sol"; +import {Constants} from "contracts/v1/lib/Constants.sol"; import {DeployUtils} from "./DeployUtils.sol"; library LoanUtils { diff --git a/test/v2/utils/SwapUtils.sol b/test/v2/utils/SwapUtils.sol index 54a2a6b..80e6ef4 100644 --- a/test/v2/utils/SwapUtils.sol +++ b/test/v2/utils/SwapUtils.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.27; import {console} from "forge-std/Script.sol"; import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; -import {Constants} from "contracts/lib/Constants.sol"; +import {Constants} from "contracts/v1/lib/Constants.sol"; import {DeployUtils} from "./DeployUtils.sol"; library SwapUtils { From 46d3619a0f1081f86a1dc3749cdaa67156d997b7 Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 3 Jun 2025 12:21:16 +0800 Subject: [PATCH 059/194] fix changes --- contracts/v1/extensions/PriceFeedConverter.sol | 2 +- contracts/v1/extensions/PriceFeedWithERC4626.sol | 2 +- contracts/v2/oracle/priceFeeds/TermMaxERC4626PriceFeed.sol | 2 +- contracts/v2/oracle/priceFeeds/TermMaxPriceFeedConverter.sol | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/v1/extensions/PriceFeedConverter.sol b/contracts/v1/extensions/PriceFeedConverter.sol index 4dab08e..9e6bd69 100644 --- a/contracts/v1/extensions/PriceFeedConverter.sol +++ b/contracts/v1/extensions/PriceFeedConverter.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.27; import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; -import {MathLib} from "contracts/lib/MathLib.sol"; +import {MathLib} from "contracts/v1/lib/MathLib.sol"; contract PriceFeedConverter is AggregatorV3Interface { using MathLib for *; diff --git a/contracts/v1/extensions/PriceFeedWithERC4626.sol b/contracts/v1/extensions/PriceFeedWithERC4626.sol index 0f3c13e..b9e379a 100644 --- a/contracts/v1/extensions/PriceFeedWithERC4626.sol +++ b/contracts/v1/extensions/PriceFeedWithERC4626.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.27; import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; import {IERC4626} from "@openzeppelin/contracts/interfaces/IERC4626.sol"; import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; -import {MathLib} from "contracts/lib/MathLib.sol"; +import {MathLib} from "contracts/v1/lib/MathLib.sol"; contract PriceFeedWithERC4626 is AggregatorV3Interface { using MathLib for *; diff --git a/contracts/v2/oracle/priceFeeds/TermMaxERC4626PriceFeed.sol b/contracts/v2/oracle/priceFeeds/TermMaxERC4626PriceFeed.sol index 97a99ac..d1836aa 100644 --- a/contracts/v2/oracle/priceFeeds/TermMaxERC4626PriceFeed.sol +++ b/contracts/v2/oracle/priceFeeds/TermMaxERC4626PriceFeed.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.27; import {IERC4626} from "@openzeppelin/contracts/interfaces/IERC4626.sol"; import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; import {ITermMaxPriceFeed, AggregatorV3Interface} from "./ITermMaxPriceFeed.sol"; -import {MathLib} from "contracts/lib/MathLib.sol"; +import {MathLib} from "contracts/v1/lib/MathLib.sol"; contract TermMaxERC4626PriceFeed is ITermMaxPriceFeed { using MathLib for *; diff --git a/contracts/v2/oracle/priceFeeds/TermMaxPriceFeedConverter.sol b/contracts/v2/oracle/priceFeeds/TermMaxPriceFeedConverter.sol index 60d9754..78f3924 100644 --- a/contracts/v2/oracle/priceFeeds/TermMaxPriceFeedConverter.sol +++ b/contracts/v2/oracle/priceFeeds/TermMaxPriceFeedConverter.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.27; import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; import {ITermMaxPriceFeed, AggregatorV3Interface} from "./ITermMaxPriceFeed.sol"; -import {MathLib} from "contracts/lib/MathLib.sol"; +import {MathLib} from "contracts/v1/lib/MathLib.sol"; contract TermMaxPriceFeedConverter is ITermMaxPriceFeed { using MathLib for *; From 0e4963473899244a70ffaba0dc6e68e8a8959a00 Mon Sep 17 00:00:00 2001 From: Evan Date: Wed, 4 Jun 2025 09:56:41 +0800 Subject: [PATCH 060/194] termmax v1 unit tests --- test/v1/AccessManager.t.sol | 553 +++++++ test/v1/Factory.t.sol | 217 +++ test/v1/Faucet.t.sol | 172 ++ test/v1/FuzzActions.t.sol | 224 +++ test/v1/FuzzSwap.t.sol | 256 +++ test/v1/Gt.t.sol | 1411 +++++++++++++++++ test/v1/LinkedList.t.sol | 69 + test/v1/Market.t.sol | 415 +++++ test/v1/OracleAggregator.t.sol | 227 +++ test/v1/Order.t.sol | 847 ++++++++++ test/v1/Router.t.sol | 694 ++++++++ test/v1/TermMaxTestBase.t.sol | 124 ++ test/v1/Vault.t.sol | 1085 +++++++++++++ test/v1/VaultDust.t.sol | 251 +++ test/v1/mainnet-fork/.DS_Store | Bin 0 -> 6148 bytes test/v1/mainnet-fork/ForkBaseTest.sol | 173 ++ test/v1/mainnet-fork/GtBaseTest.t.sol | 381 +++++ test/v1/mainnet-fork/MarketBaseTest.t.sol | 231 +++ test/v1/mainnet-fork/VaultBaseTest.t.sol | 246 +++ test/v1/mainnet-fork/mainnet/ForkGt.t.sol | 154 ++ test/v1/mainnet-fork/mainnet/ForkMarket.t.sol | 45 + .../mainnet-fork/mainnet/ForkPriceFeed.t.sol | 124 ++ test/v1/mainnet-fork/mainnet/ForkVault.t.sol | 43 + test/v1/utils/DeployUtils.sol | 306 ++++ test/v1/utils/JSONLoader.sol | 113 ++ test/v1/utils/LoanUtils.sol | 81 + test/v1/utils/StateChecker.sol | 51 + test/v1/utils/SwapUtils.sol | 26 + 28 files changed, 8519 insertions(+) create mode 100644 test/v1/AccessManager.t.sol create mode 100644 test/v1/Factory.t.sol create mode 100644 test/v1/Faucet.t.sol create mode 100644 test/v1/FuzzActions.t.sol create mode 100644 test/v1/FuzzSwap.t.sol create mode 100644 test/v1/Gt.t.sol create mode 100644 test/v1/LinkedList.t.sol create mode 100644 test/v1/Market.t.sol create mode 100644 test/v1/OracleAggregator.t.sol create mode 100644 test/v1/Order.t.sol create mode 100644 test/v1/Router.t.sol create mode 100644 test/v1/TermMaxTestBase.t.sol create mode 100644 test/v1/Vault.t.sol create mode 100644 test/v1/VaultDust.t.sol create mode 100644 test/v1/mainnet-fork/.DS_Store create mode 100644 test/v1/mainnet-fork/ForkBaseTest.sol create mode 100644 test/v1/mainnet-fork/GtBaseTest.t.sol create mode 100644 test/v1/mainnet-fork/MarketBaseTest.t.sol create mode 100644 test/v1/mainnet-fork/VaultBaseTest.t.sol create mode 100644 test/v1/mainnet-fork/mainnet/ForkGt.t.sol create mode 100644 test/v1/mainnet-fork/mainnet/ForkMarket.t.sol create mode 100644 test/v1/mainnet-fork/mainnet/ForkPriceFeed.t.sol create mode 100644 test/v1/mainnet-fork/mainnet/ForkVault.t.sol create mode 100644 test/v1/utils/DeployUtils.sol create mode 100644 test/v1/utils/JSONLoader.sol create mode 100644 test/v1/utils/LoanUtils.sol create mode 100644 test/v1/utils/StateChecker.sol create mode 100644 test/v1/utils/SwapUtils.sol diff --git a/test/v1/AccessManager.t.sol b/test/v1/AccessManager.t.sol new file mode 100644 index 0000000..ec13c8c --- /dev/null +++ b/test/v1/AccessManager.t.sol @@ -0,0 +1,553 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "forge-std/Test.sol"; +import {console} from "forge-std/console.sol"; +import {DeployUtils} from "./utils/DeployUtils.sol"; +import {JSONLoader} from "./utils/JSONLoader.sol"; +import {IAccessControl} from "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import {IERC1967} from "@openzeppelin/contracts/interfaces/IERC1967.sol"; +import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; +import {Ownable2StepUpgradeable} from "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; +import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; +import {GearingTokenWithERC20} from "contracts/v1/tokens/GearingTokenWithERC20.sol"; +import {ITermMaxMarket} from "contracts/v1/ITermMaxMarket.sol"; +import {MockERC20} from "contracts/v1/test/MockERC20.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {ITermMaxFactory} from "contracts/v1/factory/ITermMaxFactory.sol"; +import {MarketConfig, FeeConfig, MarketInitialParams} from "contracts/v1/storage/TermMaxStorage.sol"; +import {IOwnable, IPausable, AccessManager} from "contracts/v1/access/AccessManager.sol"; +import {ITermMaxRouter, TermMaxRouter} from "contracts/v1/router/TermMaxRouter.sol"; +import {IOracle} from "contracts/v1/oracle/IOracle.sol"; +import {ITermMaxVault, TermMaxVault} from "contracts/v1/vault/TermMaxVault.sol"; +import {Constants} from "contracts/v1/lib/Constants.sol"; +import "contracts/v1/storage/TermMaxStorage.sol"; + +contract AccessManagerTest is Test { + using JSONLoader for *; + + DeployUtils.Res res; + + OrderConfig orderConfig; + MarketConfig marketConfig; + + address deployer = vm.randomAddress(); + address maker = vm.randomAddress(); + address sender = vm.randomAddress(); + address treasurer = vm.randomAddress(); + string testdata; + AccessManager manager; + + function setUp() public { + vm.startPrank(deployer); + testdata = vm.readFile(string.concat(vm.projectRoot(), "/test/testdata/testdata.json")); + + uint32 maxLtv = 0.89e8; + uint32 liquidationLtv = 0.9e8; + + marketConfig = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); + orderConfig = JSONLoader.getOrderConfigFromJson(testdata, ".orderConfig"); + + res = DeployUtils.deployMarket(deployer, marketConfig, maxLtv, liquidationLtv); + + res.order = + res.market.createOrder(maker, orderConfig.maxXtReserve, ISwapCallback(address(0)), orderConfig.curveCuts); + + vm.warp(vm.parseUint(vm.parseJsonString(testdata, ".currentTime"))); + + // update oracle + res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.eth")); + res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.dai")); + + uint256 amount = 150e8; + res.debt.mint(deployer, amount); + res.debt.approve(address(res.market), amount); + res.market.mint(deployer, amount); + res.ft.transfer(address(res.order), amount); + res.xt.transfer(address(res.order), amount); + + res.router = DeployUtils.deployRouter(deployer); + + AccessManager implementation = new AccessManager(); + bytes memory data = abi.encodeCall(AccessManager.initialize, deployer); + address proxy = address(new ERC1967Proxy(address(implementation), data)); + + manager = AccessManager(proxy); + + IOwnable(address(res.factory)).transferOwnership(address(manager)); + IOwnable(address(res.market)).transferOwnership(address(manager)); + IOwnable(address(res.router)).transferOwnership(address(manager)); + IOwnable(address(res.oracle)).transferOwnership(address(manager)); + + manager.acceptOwnership(IOwnable(address(res.factory))); + + manager.acceptOwnership(IOwnable(address(res.market))); + + manager.acceptOwnership(IOwnable(address(res.router))); + + manager.acceptOwnership(IOwnable(address(res.oracle))); + + manager.grantRole(manager.CONFIGURATOR_ROLE(), deployer); + manager.grantRole(manager.PAUSER_ROLE(), deployer); + manager.grantRole(manager.VAULT_ROLE(), deployer); + manager.grantRole(manager.MARKET_ROLE(), deployer); + manager.grantRole(manager.ORACLE_ROLE(), deployer); + + vm.stopPrank(); + } + + function testTransferOwnership() public { + vm.prank(deployer); + manager.transferOwnership(IOwnable(address(res.router)), sender); + vm.prank(sender); + IOwnable(address(res.router)).acceptOwnership(); + assert(res.router.owner() == sender); + } + + function testTransferOwnershipWithoutAuth() public { + vm.prank(sender); + + vm.expectRevert( + abi.encodeWithSelector(IAccessControl.AccessControlUnauthorizedAccount.selector, sender, uint256(0)) + ); + manager.transferOwnership(IOwnable(address(res.router)), sender); + } + + function testRoleManagement() public { + address newUser = vm.randomAddress(); + + // Test granting roles + vm.startPrank(deployer); + manager.grantRole(manager.PAUSER_ROLE(), newUser); + manager.grantRole(manager.CONFIGURATOR_ROLE(), newUser); + manager.grantRole(manager.VAULT_ROLE(), newUser); + + assertTrue(manager.hasRole(manager.PAUSER_ROLE(), newUser)); + assertTrue(manager.hasRole(manager.CONFIGURATOR_ROLE(), newUser)); + assertTrue(manager.hasRole(manager.VAULT_ROLE(), newUser)); + + // Test revoking roles + manager.revokeRole(manager.PAUSER_ROLE(), newUser); + manager.revokeRole(manager.CONFIGURATOR_ROLE(), newUser); + manager.revokeRole(manager.VAULT_ROLE(), newUser); + + assertFalse(manager.hasRole(manager.PAUSER_ROLE(), newUser)); + assertFalse(manager.hasRole(manager.CONFIGURATOR_ROLE(), newUser)); + assertFalse(manager.hasRole(manager.VAULT_ROLE(), newUser)); + + vm.stopPrank(); + } + + function testRevokeRole() public { + bytes32 pauserRole = manager.PAUSER_ROLE(); + address user = vm.randomAddress(); + + // Grant role first + vm.prank(deployer); + manager.grantRole(pauserRole, user); + + // Revoke role + vm.prank(deployer); + manager.revokeRole(pauserRole, user); + + assertFalse(manager.hasRole(pauserRole, user)); + } + + function testCannotRevokeSelfRole() public { + bytes32 pauserRole = manager.PAUSER_ROLE(); + + // Try to revoke own role + vm.prank(deployer); + vm.expectRevert(abi.encodeWithSignature("AccessControlBadConfirmation()")); + manager.revokeRole(pauserRole, deployer); + } + + function testRenounceRole() public { + bytes32 pauserRole = manager.PAUSER_ROLE(); + address user = vm.randomAddress(); + + // Grant role first + vm.prank(deployer); + manager.grantRole(pauserRole, user); + + // Renounce role + vm.prank(user); + manager.renounceRole(pauserRole, user); + + assertFalse(manager.hasRole(pauserRole, user)); + } + + function testCannotRenounceDefaultAdminRole() public { + bytes32 defaultAdminRole = 0x00; + + vm.prank(deployer); + vm.expectRevert(AccessManager.CannotRevokeDefaultAdminRole.selector); + manager.renounceRole(defaultAdminRole, deployer); + } + + function testPausingFunctionality() public { + address pauser = vm.randomAddress(); + bytes32 pauserRole = manager.PAUSER_ROLE(); + // Grant PAUSER_ROLE to the pauser + vm.prank(deployer); + manager.grantRole(pauserRole, pauser); + + // Test pausing with PAUSER_ROLE + vm.startPrank(pauser); + manager.setSwitch(IPausable(address(res.router)), false); + assertTrue(PausableUpgradeable(address(res.router)).paused()); + + // Test unpausing with PAUSER_ROLE + manager.setSwitch(IPausable(address(res.router)), true); + assertFalse(PausableUpgradeable(address(res.router)).paused()); + vm.stopPrank(); + + // Test pausing without PAUSER_ROLE + address nonPauser = vm.randomAddress(); + vm.startPrank(nonPauser); + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, nonPauser, manager.PAUSER_ROLE() + ) + ); + manager.setSwitch(IPausable(address(res.router)), false); + vm.stopPrank(); + } + + function testVaultManagement() public { + address vaultManager = vm.randomAddress(); + address newCurator = vm.randomAddress(); + + // Create vault initialization parameters + VaultInitialParams memory params = VaultInitialParams({ + admin: address(manager), + curator: address(0), // Will be set through AccessManager + timelock: 1 days, + asset: IERC20(address(res.debt)), + maxCapacity: 1000000e18, + name: "Test Vault", + symbol: "tVAULT", + performanceFeeRate: 0.2e8 // 20% + }); + + // Deploy vault + ITermMaxVault vault = DeployUtils.deployVault(params); + + // Grant VAULT_ROLE to the vault manager + vm.startPrank(deployer); + manager.grantRole(manager.VAULT_ROLE(), vaultManager); + vm.stopPrank(); + + vm.startPrank(vaultManager); + + // Test setting curator + manager.setCuratorForVault(ITermMaxVault(address(vault)), newCurator); + assertEq(ITermMaxVault(address(vault)).curator(), newCurator); + + vm.stopPrank(); + + // Test without VAULT_ROLE + address nonVaultManager = vm.randomAddress(); + vm.startPrank(nonVaultManager); + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, nonVaultManager, manager.VAULT_ROLE() + ) + ); + manager.setCuratorForVault(ITermMaxVault(address(vault)), newCurator); + vm.stopPrank(); + + // Test that non-vault role cannot set allocator + address allocator = vm.randomAddress(); + vm.startPrank(allocator); + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, allocator, manager.VAULT_ROLE() + ) + ); + manager.setIsAllocatorForVault(ITermMaxVault(address(vault)), allocator, true); + vm.stopPrank(); + + // Test that vault role can set allocator + vm.prank(deployer); + manager.setIsAllocatorForVault(ITermMaxVault(address(vault)), allocator, true); + assertTrue(vault.isAllocator(allocator)); + } + + function testRevokeVaultPendingValues() public { + address vaultManager = vm.randomAddress(); + address newMarket = vm.randomAddress(); + address newGuardian = vm.randomAddress(); + address curator = vm.randomAddress(); + + // Create vault initialization parameters + VaultInitialParams memory params = VaultInitialParams({ + admin: address(manager), + curator: curator, + timelock: 1 days, + asset: IERC20(address(res.debt)), + maxCapacity: 1000000e18, + name: "Test Vault", + symbol: "tVAULT", + performanceFeeRate: 0.2e8 + }); + + // Deploy vault + ITermMaxVault vault = DeployUtils.deployVault(params); + + // Grant VAULT_ROLE to the vault manager and set curator + vm.startPrank(deployer); + manager.grantRole(manager.VAULT_ROLE(), vaultManager); + vm.stopPrank(); + + vm.startPrank(curator); + vault.submitTimelock(2 days); + vault.submitTimelock(1 days); + vault.submitMarket(newMarket, true); + vm.stopPrank(); + + vm.startPrank(vaultManager); + manager.setCuratorForVault(ITermMaxVault(address(vault)), vaultManager); + + // Test revoking pending timelock + manager.revokeVaultPendingTimelock(ITermMaxVault(address(vault))); + assertEq(vault.timelock(), 2 days); // Original timelock + + // Test revoking pending market + manager.revokeVaultPendingMarket(ITermMaxVault(address(vault)), newMarket); + assertTrue(!vault.marketWhitelist(newMarket)); // Market not whitelisted + + // Test revoking pending guardian + manager.submitVaultGuardian(vault, curator); + manager.submitVaultGuardian(vault, newGuardian); + manager.revokeVaultPendingGuardian(ITermMaxVault(address(vault))); + assertEq(vault.guardian(), curator); // Original guardian + + vm.stopPrank(); + + // Test without VAULT_ROLE + address nonVaultManager = vm.randomAddress(); + vm.startPrank(nonVaultManager); + + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, nonVaultManager, manager.VAULT_ROLE() + ) + ); + manager.revokeVaultPendingTimelock(ITermMaxVault(address(vault))); + + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, nonVaultManager, manager.VAULT_ROLE() + ) + ); + manager.revokeVaultPendingMarket(ITermMaxVault(address(vault)), newMarket); + + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, nonVaultManager, manager.VAULT_ROLE() + ) + ); + manager.revokeVaultPendingGuardian(ITermMaxVault(address(vault))); + + vm.stopPrank(); + } + + function testUpgradeSubContract() public { + vm.startPrank(deployer); + + // Deploy a new router implementation + TermMaxRouter routerV2 = new TermMaxRouter(); + + // Test upgrade with DEFAULT_ADMIN_ROLE + manager.upgradeSubContract(UUPSUpgradeable(address(res.router)), address(routerV2), ""); + + // Test upgrade without DEFAULT_ADMIN_ROLE + address nonAdmin = vm.randomAddress(); + vm.stopPrank(); + + vm.startPrank(nonAdmin); + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, nonAdmin, manager.DEFAULT_ADMIN_ROLE() + ) + ); + manager.upgradeSubContract(UUPSUpgradeable(address(res.router)), address(routerV2), ""); + vm.stopPrank(); + } + + function testSetGtImplement() public { + address newImplement = vm.randomAddress(); + string memory gtImplementName = "TestGT"; + + // Test that non-market role cannot set GT implement + vm.startPrank(sender); + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, sender, manager.MARKET_ROLE() + ) + ); + manager.setGtImplement(ITermMaxFactory(address(res.factory)), gtImplementName, newImplement); + vm.stopPrank(); + + // Test that market role can set GT implement + vm.startPrank(deployer); + manager.setGtImplement(ITermMaxFactory(address(res.factory)), gtImplementName, newImplement); + assertEq(res.factory.gtImplements(keccak256(abi.encodePacked(gtImplementName))), newImplement); + vm.stopPrank(); + } + + function testCreateMarket() public { + bytes32 gtKey = keccak256("TestGT"); + MarketInitialParams memory params = MarketInitialParams({ + collateral: address(res.collateral), + debtToken: IERC20Metadata(address(res.debt)), + admin: address(manager), + gtImplementation: address(0), + marketConfig: marketConfig, + loanConfig: LoanConfig({oracle: IOracle(address(0)), liquidatable: true, liquidationLtv: 0.9e8, maxLtv: 0.85e8}), + gtInitalParams: abi.encode(1e18), + tokenName: "Test Market", + tokenSymbol: "Test" + }); + uint256 salt = 123; + + // Test that non-market role cannot create market + vm.startPrank(sender); + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, sender, manager.MARKET_ROLE() + ) + ); + manager.createMarket(ITermMaxFactory(address(res.factory)), gtKey, params, salt); + vm.stopPrank(); + + // Test that market role can create market + vm.startPrank(deployer); + address newMarket = manager.createMarket( + ITermMaxFactory(address(res.factory)), keccak256("GearingTokenWithERC20"), params, salt + ); + assertTrue(newMarket != address(0)); + vm.stopPrank(); + } + + function testSetAdapterWhitelist() public { + address adapter = vm.randomAddress(); + + // Test that non-market role cannot set adapter whitelist + vm.startPrank(sender); + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, sender, manager.MARKET_ROLE() + ) + ); + manager.setAdapterWhitelist(ITermMaxRouter(address(res.router)), adapter, true); + vm.stopPrank(); + + // Test that market role can set adapter whitelist + vm.startPrank(deployer); + manager.setAdapterWhitelist(ITermMaxRouter(address(res.router)), adapter, true); + assertTrue(res.router.adapterWhitelist(adapter)); + + // Test setting adapter whitelist to false + manager.setAdapterWhitelist(ITermMaxRouter(address(res.router)), adapter, false); + assertFalse(res.router.adapterWhitelist(adapter)); + vm.stopPrank(); + } + + function testSubmitAndAcceptPendingOracle() public { + address asset = address(res.collateral); + IOracle.Oracle memory oracle = IOracle.Oracle({ + aggregator: AggregatorV3Interface(address(new MockPriceFeed(sender))), + backupAggregator: AggregatorV3Interface(address(new MockPriceFeed(sender))), + heartbeat: 3600 + }); + + // Test that non-oracle role cannot submit pending oracle + vm.startPrank(sender); + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, sender, manager.ORACLE_ROLE() + ) + ); + manager.submitPendingOracle(IOracle(address(res.oracle)), asset, oracle); + vm.stopPrank(); + + // Test that oracle role can submit pending oracle + vm.startPrank(deployer); + manager.submitPendingOracle(IOracle(address(res.oracle)), asset, oracle); + + // Test that non-oracle role cannot accept pending oracle + vm.stopPrank(); + vm.startPrank(sender); + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, sender, manager.ORACLE_ROLE() + ) + ); + manager.acceptPendingOracle(IOracle(address(res.oracle)), asset); + vm.stopPrank(); + + // Test that oracle role can accept pending oracle + vm.startPrank(deployer); + manager.acceptPendingOracle(IOracle(address(res.oracle)), asset); + vm.stopPrank(); + } + + function testUpdateGtConfig() public { + bytes memory configData = abi.encode(1234); + + // Test that non-configurator role cannot update GT config + vm.startPrank(sender); + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, sender, manager.CONFIGURATOR_ROLE() + ) + ); + manager.updateGtConfig(ITermMaxMarket(address(res.market)), configData); + vm.stopPrank(); + + // Test that configurator role can update GT config + vm.startPrank(deployer); + manager.updateGtConfig(ITermMaxMarket(address(res.market)), configData); + vm.stopPrank(); + } + + function testUpdateOrderFeeRate() public { + // Get new fee config from testdata + FeeConfig memory newFeeConfig = res.order.orderConfig().feeConfig; + + // Test that non-admin cannot update fee rate + vm.startPrank(sender); + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, sender, manager.CONFIGURATOR_ROLE() + ) + ); + manager.updateOrderFeeRate(res.market, res.order, newFeeConfig); + vm.stopPrank(); + // Test that admin can update fee rate + vm.prank(deployer); + manager.updateOrderFeeRate(res.market, res.order, newFeeConfig); + + // Verify fee config was updated + OrderConfig memory updatedConfig = res.order.orderConfig(); + assertEq(updatedConfig.feeConfig.lendTakerFeeRatio, newFeeConfig.lendTakerFeeRatio); + assertEq(updatedConfig.feeConfig.borrowTakerFeeRatio, newFeeConfig.borrowTakerFeeRatio); + } + + function testUpdateMarketConfig() public { + // Get new market config from testdata + MarketConfig memory newMarketConfig = marketConfig; + newMarketConfig.treasurer = address(0x123); + // Test that configurator role can update market config + vm.prank(deployer); + manager.updateMarketConfig(res.market, newMarketConfig); + + // Verify market config was updated + MarketConfig memory updatedConfig = res.market.config(); + assertEq(updatedConfig.treasurer, newMarketConfig.treasurer); + } +} diff --git a/test/v1/Factory.t.sol b/test/v1/Factory.t.sol new file mode 100644 index 0000000..e467f08 --- /dev/null +++ b/test/v1/Factory.t.sol @@ -0,0 +1,217 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "forge-std/Test.sol"; +import {console} from "forge-std/console.sol"; +import {DeployUtils} from "./utils/DeployUtils.sol"; +import {JSONLoader} from "./utils/JSONLoader.sol"; + +import {ITermMaxMarket, TermMaxMarket, Constants, MarketErrors} from "contracts/v1/TermMaxMarket.sol"; +import {MockERC20, ERC20} from "contracts/v1/test/MockERC20.sol"; + +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {IMintableERC20} from "contracts/v1/tokens/MintableERC20.sol"; +import {IGearingToken} from "contracts/v1/tokens/IGearingToken.sol"; +import {GearingTokenWithERC20} from "contracts/v1/tokens/GearingTokenWithERC20.sol"; +import {ITermMaxFactory, TermMaxFactory, FactoryErrors, FactoryEvents} from "contracts/v1/factory/TermMaxFactory.sol"; +import {IOracle, OracleAggregator, AggregatorV3Interface} from "contracts/v1/oracle/OracleAggregator.sol"; +import "contracts/v1/storage/TermMaxStorage.sol"; + +contract FactoryTest is Test { + address deployer = vm.randomAddress(); + + address treasurer = vm.randomAddress(); + uint32 maxLtv = 0.89e8; + uint32 liquidationLtv = 0.9e8; + MarketConfig marketConfig; + + function setUp() public { + string memory testdata = vm.readFile(string.concat(vm.projectRoot(), "/test/testdata/testdata.json")); + + marketConfig = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); + } + + function testDeploy() public { + vm.startPrank(deployer); + DeployUtils.Res memory res = DeployUtils.deployMarket(deployer, marketConfig, maxLtv, liquidationLtv); + + address predictedMarketAddress = res.factory.predictMarketAddress( + deployer, address(res.collateral), address(res.debt), marketConfig.maturity, 0 + ); + assert(address(res.market) == predictedMarketAddress); + + assert(keccak256(abi.encode(res.market.config())) == keccak256(abi.encode(marketConfig))); + GtConfig memory gtConfig = res.gt.getGtConfig(); + assert(gtConfig.maturity == marketConfig.maturity); + assert(gtConfig.loanConfig.maxLtv == maxLtv); + assert(gtConfig.loanConfig.liquidationLtv == liquidationLtv); + assert(gtConfig.loanConfig.liquidatable == true); + assert(gtConfig.collateral == address(res.collateral)); + assert(gtConfig.debtToken == res.debt); + assert(gtConfig.ft == res.ft); + assert(GearingTokenWithERC20(address(res.gt)).collateralCapacity() == type(uint256).max); + vm.stopPrank(); + } + + function testDeployRepeatedly() public { + vm.startPrank(deployer); + DeployUtils.Res memory res = DeployUtils.deployMarket(deployer, marketConfig, maxLtv, liquidationLtv); + + LoanConfig memory loanConfig = res.gt.getGtConfig().loanConfig; + vm.expectRevert(abi.encodeWithSignature("FailedDeployment()")); + res.factory.createMarket( + DeployUtils.GT_ERC20, + MarketInitialParams({ + collateral: address(res.collateral), + debtToken: res.debt, + admin: deployer, + gtImplementation: address(0), + marketConfig: marketConfig, + loanConfig: loanConfig, + gtInitalParams: abi.encode(type(uint256).max), + tokenName: "test", + tokenSymbol: "test" + }), + 0 + ); + vm.stopPrank(); + } + + function testDeployMarketWithInvalidParams() public { + vm.startPrank(deployer); + TermMaxFactory factory = DeployUtils.deployFactory(deployer); + + MockERC20 collateral = new MockERC20("ETH", "ETH", 18); + MockERC20 debt = new MockERC20("DAI", "DAI", 8); + + MarketInitialParams memory params = MarketInitialParams({ + collateral: address(collateral), + debtToken: debt, + admin: deployer, + gtImplementation: address(0), + marketConfig: marketConfig, + loanConfig: LoanConfig({ + maxLtv: maxLtv, + liquidationLtv: liquidationLtv, + liquidatable: true, + oracle: IOracle(vm.randomAddress()) + }), + gtInitalParams: abi.encode(type(uint256).max), + tokenName: "test", + tokenSymbol: "test" + }); + uint64 maturity = marketConfig.maturity; + vm.warp(maturity + 1 days); + vm.expectRevert(abi.encodeWithSelector(MarketErrors.InvalidMaturity.selector)); + factory.createMarket(DeployUtils.GT_ERC20, params, 0); + + vm.warp(maturity - 1 days); + params.marketConfig.feeConfig.borrowTakerFeeRatio = Constants.MAX_FEE_RATIO; + vm.expectRevert(abi.encodeWithSelector(MarketErrors.FeeTooHigh.selector)); + factory.createMarket(DeployUtils.GT_ERC20, params, 0); + + params.marketConfig.feeConfig.borrowTakerFeeRatio = 0; + params.marketConfig.feeConfig.mintGtFeeRef = uint32(Constants.DECIMAL_BASE * 5 + 1); + vm.expectRevert(abi.encodeWithSelector(MarketErrors.FeeTooHigh.selector)); + factory.createMarket(DeployUtils.GT_ERC20, params, 0); + + params.marketConfig.feeConfig.mintGtFeeRef = 0; + factory.createMarket(DeployUtils.GT_ERC20, params, 0); + vm.stopPrank(); + } + + function testLiquidationLtvMustBeGreaterThanMaxLtv() public { + vm.startPrank(deployer); + TermMaxFactory factory = DeployUtils.deployFactory(deployer); + + MockERC20 collateral = new MockERC20("ETH", "ETH", 18); + MockERC20 debt = new MockERC20("DAI", "DAI", 8); + + maxLtv = 3; + liquidationLtv = 2; + + MarketInitialParams memory params = MarketInitialParams({ + collateral: address(collateral), + debtToken: debt, + admin: deployer, + gtImplementation: address(0), + marketConfig: marketConfig, + loanConfig: LoanConfig({ + maxLtv: maxLtv, + liquidationLtv: liquidationLtv, + liquidatable: true, + oracle: IOracle(vm.randomAddress()) + }), + gtInitalParams: abi.encode(type(uint256).max), + tokenName: "test", + tokenSymbol: "test" + }); + + vm.expectRevert(abi.encodeWithSignature("LiquidationLtvMustBeGreaterThanMaxLtv()")); + factory.createMarket(DeployUtils.GT_ERC20, params, 0); + + vm.stopPrank(); + } + + function testRevertByCantNotFindGtImplementation() public { + vm.startPrank(deployer); + TermMaxFactory factory = DeployUtils.deployFactory(deployer); + + MockERC20 collateral = new MockERC20("ETH", "ETH", 18); + MockERC20 debt = new MockERC20("DAI", "DAI", 8); + + vm.expectRevert(abi.encodeWithSelector(FactoryErrors.CantNotFindGtImplementation.selector)); + factory.createMarket( + bytes32(0), + MarketInitialParams({ + collateral: address(collateral), + debtToken: debt, + admin: deployer, + gtImplementation: address(0), + marketConfig: marketConfig, + loanConfig: LoanConfig({ + maxLtv: maxLtv, + liquidationLtv: liquidationLtv, + liquidatable: true, + oracle: IOracle(vm.randomAddress()) + }), + gtInitalParams: abi.encode(type(uint256).max), + tokenName: "test", + tokenSymbol: "test" + }), + 0 + ); + vm.stopPrank(); + } + + function testSetGtImplement() public { + vm.startPrank(deployer); + TermMaxFactory factory = DeployUtils.deployFactory(deployer); + GearingTokenWithERC20 gt = new GearingTokenWithERC20(); + string memory gtImplemtName = "gt-test"; + bytes32 key = keccak256(abi.encodePacked(gtImplemtName)); + vm.expectEmit(); + emit FactoryEvents.SetGtImplement(key, address(gt)); + factory.setGtImplement(gtImplemtName, address(gt)); + assert(factory.gtImplements(key) == address(gt)); + vm.stopPrank(); + } + + function testSetGtImplementWithoutAuth() public { + address sender = vm.randomAddress(); + vm.startPrank(sender); + TermMaxFactory factory = DeployUtils.deployFactory(deployer); + GearingTokenWithERC20 gt = new GearingTokenWithERC20(); + string memory key = "gt-test"; + + vm.expectRevert(abi.encodePacked(bytes4(keccak256("OwnableUnauthorizedAccount(address)")), abi.encode(sender))); + factory.setGtImplement(key, address(gt)); + + vm.stopPrank(); + } + + function testInvalidMarketImplementation() public { + vm.expectRevert(abi.encodeWithSelector(FactoryErrors.InvalidImplementation.selector)); + new TermMaxFactory(deployer, address(0)); + } +} diff --git a/test/v1/Faucet.t.sol b/test/v1/Faucet.t.sol new file mode 100644 index 0000000..cc2ac26 --- /dev/null +++ b/test/v1/Faucet.t.sol @@ -0,0 +1,172 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "forge-std/Test.sol"; +import {Faucet} from "contracts/v1/test/testnet/Faucet.sol"; +import {FaucetERC20} from "contracts/v1/test/testnet/FaucetERC20.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; + +contract FaucetTest is Test { + address deployer = vm.randomAddress(); + address user = vm.randomAddress(); + Faucet faucet; + FaucetERC20 token; + MockPriceFeed priceFeed; + + function setUp() public { + vm.startPrank(deployer); + faucet = new Faucet(deployer); + // faucet.setMintUsdValue(10000); + string memory name = "TestToken"; + string memory symbol = "TT"; + uint8 decimals = 18; + (token, priceFeed) = faucet.addToken(name, symbol, decimals); + priceFeed.updateRoundData( + MockPriceFeed.RoundData({ + roundId: 1, + answer: 200000000, + startedAt: block.timestamp, + updatedAt: block.timestamp, + answeredInRound: 1 + }) + ); + assertEq(token.owner(), address(faucet)); + assertEq(token.name(), name); + assertEq(token.symbol(), symbol); + assertEq(token.decimals(), decimals); + assertEq(faucet.getTokenId(address(token)), 1); + assertEq(faucet.getTokenConfig(1).tokenAddr, address(token)); + assertEq(faucet.getTokenConfig(1).priceFeedAddr, address(priceFeed)); + assertEq(faucet.owner(), deployer); + vm.stopPrank(); + } + + function testSetPriceFeed() public { + vm.startPrank(deployer); + uint256 tokenId = faucet.getTokenId(address(token)); + MockPriceFeed newPriceFeed = new MockPriceFeed(deployer); + faucet.setPriceFeed(tokenId, address(newPriceFeed)); + assertEq(faucet.getTokenConfig(tokenId).priceFeedAddr, address(newPriceFeed)); + vm.stopPrank(); + } + + function testAddToken() public { + vm.startPrank(deployer); + string memory name = "Test Token"; + string memory symbol = "TEST"; + uint8 decimals = 18; + + (token, priceFeed) = faucet.addToken(name, symbol, decimals); + + assertEq(token.name(), name); + assertEq(token.symbol(), symbol); + assertEq(token.decimals(), decimals); + assertEq(token.owner(), address(faucet)); + assertEq(priceFeed.owner(), deployer); + assertEq(faucet.tokenNum(), 2); + assertEq(faucet.getTokenId(address(token)), 2); + vm.stopPrank(); + } + + function testSetCanOnlyMintOnce() public { + vm.startPrank(deployer); + assertEq(faucet.canOnlyMintOnce(), false); + faucet.setCanOnlyMintOnce(true); + assertEq(faucet.canOnlyMintOnce(), true); + vm.stopPrank(); + } + + function testBatchMint() public { + Faucet.TokenConfig memory tokenConfig = faucet.getTokenConfig(1); + uint256 oriBalance = FaucetERC20(tokenConfig.tokenAddr).balanceOf(user); + + priceFeed = MockPriceFeed(tokenConfig.priceFeedAddr); + (, int256 answer,,,) = priceFeed.latestRoundData(); + uint8 tokenDecimals = FaucetERC20(tokenConfig.tokenAddr).decimals(); + uint8 priceFeedDecimals = priceFeed.decimals(); + uint256 mintAmt = (faucet.mintUsdValue() * 10 ** (priceFeedDecimals + tokenDecimals)) / uint256(answer); + + vm.startPrank(user); + faucet.batchMint(); + vm.stopPrank(); + + uint256 newBalance = FaucetERC20(tokenConfig.tokenAddr).balanceOf(user); + assertEq(newBalance, oriBalance + mintAmt); + } + + function testDevBatchMint() public { + address to = vm.randomAddress(); + Faucet.TokenConfig memory tokenConfig = faucet.getTokenConfig(1); + uint256 oriBalance = FaucetERC20(tokenConfig.tokenAddr).balanceOf(to); + + priceFeed = MockPriceFeed(tokenConfig.priceFeedAddr); + (, int256 answer,,,) = priceFeed.latestRoundData(); + uint8 tokenDecimals = FaucetERC20(tokenConfig.tokenAddr).decimals(); + uint8 priceFeedDecimals = priceFeed.decimals(); + uint256 mintAmt = (faucet.mintUsdValue() * 10 ** (priceFeedDecimals + tokenDecimals)) / uint256(answer); + + vm.startPrank(deployer); + faucet.devBatchMint(to); + vm.stopPrank(); + + uint256 newBalance = FaucetERC20(tokenConfig.tokenAddr).balanceOf(to); + assertEq(newBalance, oriBalance + mintAmt); + } + + // function testDevMint() public { + // vm.startPrank(deployer); + // address to = vm.randomAddress(); + // vm.stopPrank(); + // } + + // function testRevertAddTokenExisted() public { + // vm.startPrank(deployer); + // string memory name = "TestToken"; + // string memory symbol = "TT"; + // uint8 decimals = 18; + // uint256 mintAmt = 1000; + // vm.expectRevert(abi.encodeWithSelector(Faucet.TokenExisted.selector, name, symbol, decimals)); + // faucet.addToken(name, symbol, decimals, mintAmt); + // vm.stopPrank(); + // } + + // function testBatchMintTwice() public { + // vm.startPrank(user); + // uint256 mintAmt = faucet.getTokenConfig(faucet.getTokenId(address(token))).mintAmt; + // faucet.batchMint(); + // assertEq(faucet.isMinted(user), true); + // assertEq(token.balanceOf(user), mintAmt); + // faucet.batchMint(); + // assertEq(token.balanceOf(user), mintAmt * 2); + // vm.stopPrank(); + // } + + function testRevertBatchMintOnlyOnce() public { + vm.startPrank(deployer); + faucet.setCanOnlyMintOnce(true); + vm.stopPrank(); + + vm.startPrank(user); + faucet.batchMint(); + assertEq(faucet.isMinted(user), true); + vm.expectRevert(abi.encodeWithSelector(Faucet.OnlyMintOnce.selector)); + faucet.batchMint(); + vm.stopPrank(); + } + + function testRevertDevBatchMintNotByOwner() public { + vm.startPrank(user); + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, user)); + faucet.devBatchMint(user); + vm.stopPrank(); + } + + // function testRevertDevMintNotByOwner() public { + // vm.startPrank(user); + // uint256 mintAmt = faucet.getTokenConfig(faucet.getTokenId(address(token))).mintAmt; + // vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, user)); + // faucet.devMint(user, address(token), mintAmt); + // vm.stopPrank(); + // } +} diff --git a/test/v1/FuzzActions.t.sol b/test/v1/FuzzActions.t.sol new file mode 100644 index 0000000..0ff8547 --- /dev/null +++ b/test/v1/FuzzActions.t.sol @@ -0,0 +1,224 @@ +pragma solidity ^0.8.27; + +import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import {TermMaxFactory} from "contracts/v1/factory/TermMaxFactory.sol"; +import {ITermMaxFactory} from "contracts/v1/factory/ITermMaxFactory.sol"; +import {TermMaxRouter} from "contracts/v1/router/TermMaxRouter.sol"; +import {ITermMaxRouter} from "contracts/v1/router/ITermMaxRouter.sol"; +import {TermMaxMarket, Constants, SafeCast} from "contracts/v1/TermMaxMarket.sol"; +import {TermMaxOrder, OrderConfig, ISwapCallback} from "contracts/v1/TermMaxOrder.sol"; +import {MockERC20} from "contracts/v1/test/MockERC20.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {MockOrder} from "contracts/v1/test/MockOrder.sol"; +import {IMintableERC20, MintableERC20} from "contracts/v1/tokens/MintableERC20.sol"; +import {SwapAdapter} from "contracts/v1/test/testnet/SwapAdapter.sol"; +import {IOracle, OracleAggregator} from "contracts/v1/oracle/OracleAggregator.sol"; +import {IOrderManager, OrderManager} from "contracts/v1/vault/OrderManager.sol"; +import {ITermMaxVault, TermMaxVault} from "contracts/v1/vault/TermMaxVault.sol"; +import {VaultFactory, IVaultFactory} from "contracts/v1/factory/VaultFactory.sol"; +import { + MarketConfig, + FeeConfig, + MarketInitialParams, + LoanConfig, + VaultInitialParams +} from "contracts/v1/storage/TermMaxStorage.sol"; +import {DeployUtils} from "./utils/DeployUtils.sol"; +import {JSONLoader} from "./utils/JSONLoader.sol"; +import "forge-std/Test.sol"; + +contract FuzzActionsTest is Test { + using JSONLoader for *; + using SafeCast for *; + using DeployUtils for *; + + enum OpType { + BUY_FT, + BUY_XT, + SELL_FT, + SELL_XT, + BUY_EXACT_FT, + BUY_EXACT_XT, + SELL_FT_FOR_EXACT_TOKEN, + SELL_XT_FOR_EXACT_TOKEN + } + + struct Action { + uint256 opType; + uint256 firstAmt; + uint256 ftReserve; + uint256 xtReserve; + uint256 secondAmt; + uint256 fee; + } + + address admin = vm.randomAddress(); + address maker = vm.randomAddress(); + address taker = vm.randomAddress(); + address treasurer = vm.randomAddress(); + + string path = string.concat(vm.projectRoot(), "/test/testdata/fuzzSwap/v2.json"); + + function setUp() public {} + + function _initResources() internal returns (DeployUtils.Res memory res) { + uint32 maxLtv = 0.89e8; + uint32 liquidationLtv = 0.9e8; + string memory entityPath = path; + string memory testdata = vm.readFile(entityPath); + uint256 currentTime = vm.parseJsonUint(testdata, ".currentTime"); + vm.warp(currentTime); + + MarketConfig memory marketConfig = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); + + vm.startPrank(admin); + + res = DeployUtils.deployMarket(admin, marketConfig, maxLtv, liquidationLtv); + + res.orderConfig = JSONLoader.getOrderConfigFromJson(testdata, ".orderConfig"); + + MockSwapCallback afterSwap = new MockSwapCallback(res.ft, res.xt); + res.order = res.market.createOrder(maker, res.orderConfig.maxXtReserve, afterSwap, res.orderConfig.curveCuts); + + uint256 ftReserve = vm.parseJsonUint(testdata, ".orderConfig.ftReserve"); + uint256 xtReserve = vm.parseJsonUint(testdata, ".orderConfig.xtReserve"); + res.debt.mint(admin, ftReserve + xtReserve); + res.debt.approve(address(res.market), ftReserve + xtReserve); + res.market.mint(admin, ftReserve + xtReserve); + res.ft.transfer(address(res.order), ftReserve); + res.xt.transfer(address(res.order), xtReserve); + + vm.stopPrank(); + } + + function _parseActions() internal returns (Action[] memory actions) { + string memory json = vm.readFile(path); + uint256 length = vm.parseJsonUint(json, ".actions.length"); + actions = new Action[](length); + for (uint256 i = 0; i < length; i++) { + string memory key = string.concat(".actions.", vm.toString(i)); + actions[i].opType = vm.parseJsonUint(json, string.concat(key, ".opType")); + actions[i].firstAmt = vm.parseJsonUint(json, string.concat(key, ".firstAmt")); + actions[i].secondAmt = vm.parseJsonUint(json, string.concat(key, ".secondAmt")); + actions[i].ftReserve = vm.parseJsonUint(json, string.concat(key, ".contractState.ftReserve")); + actions[i].xtReserve = vm.parseJsonUint(json, string.concat(key, ".contractState.xtReserve")); + actions[i].fee = vm.parseJsonUint(json, string.concat(key, ".fee")); + } + } + + function testActions() public { + DeployUtils.Res memory res = _initResources(); + Action[] memory actions = _parseActions(); + vm.startPrank(taker); + uint256 max128 = type(uint128).max; + res.debt.mint(taker, max128); + res.debt.approve(address(res.market), max128); + res.market.mint(taker, max128 / 2); + res.debt.approve(address(res.order), max128); + res.ft.approve(address(res.order), max128); + res.xt.approve(address(res.order), max128); + vm.stopPrank(); + + for (uint256 i = 0; i < actions.length; i++) { + _swapToken(res, actions[i]); + } + } + + function _swapToken(DeployUtils.Res memory res, Action memory action) internal { + IERC20 tokenIn; + IERC20 tokenOut; + bool isExact; + if (action.opType == uint256(OpType.BUY_FT)) { + tokenIn = res.debt; + tokenOut = res.ft; + isExact = false; + console.log("buy ft"); + } else if (action.opType == uint256(OpType.BUY_XT)) { + tokenIn = res.debt; + tokenOut = res.xt; + isExact = false; + console.log("buy xt"); + } else if (action.opType == uint256(OpType.SELL_FT)) { + tokenIn = res.ft; + tokenOut = res.debt; + isExact = false; + console.log("sell ft"); + } else if (action.opType == uint256(OpType.SELL_XT)) { + tokenIn = res.xt; + tokenOut = res.debt; + isExact = false; + console.log("sell xt"); + } else if (action.opType == uint256(OpType.BUY_EXACT_FT)) { + tokenIn = res.debt; + tokenOut = res.ft; + isExact = true; + console.log("buy exact ft"); + } else if (action.opType == uint256(OpType.BUY_EXACT_XT)) { + tokenIn = res.debt; + tokenOut = res.xt; + isExact = true; + console.log("buy exact xt"); + } else if (action.opType == uint256(OpType.SELL_FT_FOR_EXACT_TOKEN)) { + tokenIn = res.ft; + tokenOut = res.debt; + isExact = true; + console.log("sell ft for exact token"); + } else if (action.opType == uint256(OpType.SELL_XT_FOR_EXACT_TOKEN)) { + tokenIn = res.xt; + tokenOut = res.debt; + isExact = true; + console.log("sell xt for exact token"); + } + + vm.startPrank(taker); + + uint256 netAmt; + if (isExact) { + netAmt = res.order.swapTokenToExactToken( + tokenIn, tokenOut, taker, uint128(action.firstAmt), type(uint128).max, block.timestamp + 1 hours + ); + } else { + netAmt = res.order.swapExactTokenToToken( + tokenIn, tokenOut, taker, uint128(action.firstAmt), 0, block.timestamp + 1 hours + ); + } + assertEq(netAmt, action.secondAmt, "net amt not as expected"); + assertEq(res.ft.balanceOf(address(res.order)), action.ftReserve); + assertEq(res.xt.balanceOf(address(res.order)), action.xtReserve); + vm.stopPrank(); + } +} + +// Mock contracts for testing +contract MockSwapCallback is ISwapCallback { + using SafeCast for *; + + int256 public deltaFt; + int256 public deltaXt; + int256 ftReserve; + int256 xtReserve; + IERC20 public ft; + IERC20 public xt; + + constructor(IERC20 ft_, IERC20 xt_) { + ft = ft_; + xt = xt_; + } + + function afterSwap(uint256 ftReserve_, uint256 xtReserve_, int256 deltaFt_, int256 deltaXt_) external override { + deltaFt = deltaFt_; + deltaXt = deltaXt_; + if (ftReserve == 0 || xtReserve == 0) { + ftReserve = int256(ftReserve_); + xtReserve = int256(xtReserve_); + return; + } else { + ftReserve += deltaFt; + xtReserve += deltaXt; + require(uint256(ftReserve) == ftReserve_, "ft reserve not as expected"); + require(uint256(xtReserve) == xtReserve_, "xt reserve not as expected"); + } + } +} diff --git a/test/v1/FuzzSwap.t.sol b/test/v1/FuzzSwap.t.sol new file mode 100644 index 0000000..ab3a292 --- /dev/null +++ b/test/v1/FuzzSwap.t.sol @@ -0,0 +1,256 @@ +pragma solidity ^0.8.27; + +import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import {TermMaxFactory} from "contracts/v1/factory/TermMaxFactory.sol"; +import {ITermMaxFactory} from "contracts/v1/factory/ITermMaxFactory.sol"; +import {TermMaxRouter} from "contracts/v1/router/TermMaxRouter.sol"; +import {ITermMaxRouter} from "contracts/v1/router/ITermMaxRouter.sol"; +import {TermMaxMarket, Constants, SafeCast} from "contracts/v1/TermMaxMarket.sol"; +import {TermMaxOrder, OrderConfig, ISwapCallback} from "contracts/v1/TermMaxOrder.sol"; +import {MockERC20} from "contracts/v1/test/MockERC20.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {MockOrder} from "contracts/v1/test/MockOrder.sol"; +import {IMintableERC20, MintableERC20} from "contracts/v1/tokens/MintableERC20.sol"; +import {SwapAdapter} from "contracts/v1/test/testnet/SwapAdapter.sol"; +import {IOracle, OracleAggregator} from "contracts/v1/oracle/OracleAggregator.sol"; +import {IOrderManager, OrderManager} from "contracts/v1/vault/OrderManager.sol"; +import {ITermMaxVault, TermMaxVault} from "contracts/v1/vault/TermMaxVault.sol"; +import {VaultFactory, IVaultFactory} from "contracts/v1/factory/VaultFactory.sol"; +import { + MarketConfig, + FeeConfig, + MarketInitialParams, + LoanConfig, + VaultInitialParams +} from "contracts/v1/storage/TermMaxStorage.sol"; +import {DeployUtils} from "./utils/DeployUtils.sol"; +import {JSONLoader} from "./utils/JSONLoader.sol"; +import "forge-std/Test.sol"; + +contract FuzzSwapTest is Test { + using JSONLoader for *; + using SafeCast for *; + using DeployUtils for *; + + uint256 entities; + + address admin = vm.randomAddress(); + address maker = vm.randomAddress(); + address taker = vm.randomAddress(); + address treasurer = vm.randomAddress(); + + string[] indexs = ["0", "1", "2", "3", "4", "5"]; + + function setUp() public { + string memory entitiesData = string.concat(vm.projectRoot(), "/test/testdata/fuzzSwap/entities.json"); + entities = vm.parseJsonUint(vm.readFile(entitiesData), ".entities"); + } + + function _initResources(string memory index) internal returns (DeployUtils.Res memory res) { + uint32 maxLtv = 0.89e8; + uint32 liquidationLtv = 0.9e8; + string memory entityPath = string.concat(vm.projectRoot(), "/test/testdata/fuzzSwap/", index, ".json"); + string memory testdata = vm.readFile(entityPath); + uint256 currentTime = vm.parseJsonUint(testdata, ".currentTime"); + vm.warp(currentTime); + + MarketConfig memory marketConfig = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); + + vm.startPrank(admin); + + res = DeployUtils.deployMarket(admin, marketConfig, maxLtv, liquidationLtv); + + res.orderConfig = JSONLoader.getOrderConfigFromJson(testdata, ".orderConfig"); + + MockSwapCallback afterSwap = new MockSwapCallback(res.ft, res.xt); + + res.order = res.market.createOrder(maker, res.orderConfig.maxXtReserve, afterSwap, res.orderConfig.curveCuts); + + uint256 orderInitialAmount = vm.parseJsonUint(testdata, ".orderInitialAmount"); + res.debt.mint(admin, orderInitialAmount); + res.debt.approve(address(res.market), orderInitialAmount); + res.market.mint(address(res.order), orderInitialAmount); + + res.swapRange = JSONLoader.getSwapRangeFromJson(testdata, ".maxInput"); + + vm.stopPrank(); + } + + function testBuyFt(uint256 index, uint128 tokenAmtIn) public { + console.log("buy ft", index, tokenAmtIn); + vm.assume(index < entities); + DeployUtils.Res memory res = _initResources(indexs[index]); + vm.assume(tokenAmtIn > 0 && tokenAmtIn <= res.swapRange.buyFtMax); + _buyFt(res, tokenAmtIn, 0); + } + + function testBuyXt(uint256 index, uint128 tokenAmtIn) public { + console.log("buy xt", index, tokenAmtIn); + vm.assume(index < entities); + DeployUtils.Res memory res = _initResources(indexs[index]); + vm.assume(tokenAmtIn > 0 && tokenAmtIn <= res.swapRange.buyXtMax); + _buyXt(res, tokenAmtIn, 0); + } + + function testSellFt(uint256 index, uint128 ftAmtIn) public { + console.log("sell ft", index, ftAmtIn); + vm.assume(index < entities); + DeployUtils.Res memory res = _initResources(indexs[index]); + vm.assume(ftAmtIn > 0 && ftAmtIn <= res.swapRange.sellFtMax); + _sellFt(res, ftAmtIn, 0); + } + + function testSellXt(uint256 index, uint128 xtAmtIn) public { + console.log("sell xt", index, xtAmtIn); + vm.assume(index < entities); + DeployUtils.Res memory res = _initResources(indexs[index]); + vm.assume(xtAmtIn > 0 && xtAmtIn <= res.swapRange.sellXtMax); + _sellXt(res, xtAmtIn, 0); + } + + function testBuyExactFt(uint256 index, uint128 ftAmtOut) public { + console.log("buy exact ft", index, ftAmtOut); + vm.assume(index < entities); + DeployUtils.Res memory res = _initResources(indexs[index]); + vm.assume(ftAmtOut > 0 && ftAmtOut <= res.swapRange.buyExactFtMax); + _buyExactFt(res, ftAmtOut, ftAmtOut); + } + + function testBuyExactXt(uint256 index, uint128 xtAmtOut) public { + console.log("buy exact xt", index, xtAmtOut); + vm.assume(index < entities); + DeployUtils.Res memory res = _initResources(indexs[index]); + vm.assume(xtAmtOut > 0 && xtAmtOut <= res.swapRange.buyExactXtMax); + _buyExactXt(res, xtAmtOut, xtAmtOut); + } + + function testSellFtForExactToken(uint256 index, uint128 tokenAmtOut) public { + console.log("sell ft for exact token", index, tokenAmtOut); + vm.assume(index < entities); + DeployUtils.Res memory res = _initResources(indexs[index]); + vm.assume(tokenAmtOut > 0 && tokenAmtOut <= res.swapRange.sellFtForExactTokenMax); + _sellFtForExactToken(res, tokenAmtOut, tokenAmtOut * 10); + } + + function testSellXtForExactToken(uint256 index, uint128 tokenAmtOut) public { + console.log("sell xt for exact token", index, tokenAmtOut); + vm.assume(index < entities); + DeployUtils.Res memory res = _initResources(indexs[index]); + vm.assume(tokenAmtOut > 0 && tokenAmtOut <= res.swapRange.sellXtForExactTokenMax); + _sellXtForExactToken(res, tokenAmtOut, tokenAmtOut * 10000); + } + + function _buyFt(DeployUtils.Res memory res, uint128 tokenAmtIn, uint128 minFtAmtOut) internal { + vm.startPrank(taker); + + res.debt.mint(taker, tokenAmtIn); + res.debt.approve(address(res.order), tokenAmtIn); + + res.order.swapExactTokenToToken(res.debt, res.ft, taker, tokenAmtIn, minFtAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function _buyXt(DeployUtils.Res memory res, uint128 tokenAmtIn, uint128 minXtAmtOut) internal { + vm.startPrank(taker); + + res.debt.mint(taker, tokenAmtIn); + res.debt.approve(address(res.order), tokenAmtIn); + + res.order.swapExactTokenToToken(res.debt, res.xt, taker, tokenAmtIn, minXtAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function _sellFt(DeployUtils.Res memory res, uint128 ftAmtIn, uint128 minTokenAmtOut) internal { + vm.startPrank(taker); + res.debt.mint(taker, ftAmtIn); + res.debt.approve(address(res.market), ftAmtIn); + res.market.mint(taker, ftAmtIn); + + res.ft.approve(address(res.order), ftAmtIn); + res.order.swapExactTokenToToken(res.ft, res.debt, taker, ftAmtIn, minTokenAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function _sellXt(DeployUtils.Res memory res, uint128 xtAmtIn, uint128 minTokenAmtOut) internal { + vm.startPrank(taker); + res.debt.mint(taker, xtAmtIn); + res.debt.approve(address(res.market), xtAmtIn); + res.market.mint(taker, xtAmtIn); + + res.xt.approve(address(res.order), xtAmtIn); + res.order.swapExactTokenToToken(res.xt, res.debt, taker, xtAmtIn, minTokenAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function _buyExactFt(DeployUtils.Res memory res, uint128 ftAmtOut, uint128 maxTokenAmtIn) internal { + vm.startPrank(taker); + res.debt.mint(taker, maxTokenAmtIn); + res.debt.approve(address(res.order), maxTokenAmtIn); + res.order.swapTokenToExactToken(res.debt, res.ft, taker, ftAmtOut, maxTokenAmtIn, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function _buyExactXt(DeployUtils.Res memory res, uint128 xtAmtOut, uint128 maxTokenAmtIn) internal { + vm.startPrank(taker); + res.debt.mint(taker, maxTokenAmtIn); + res.debt.approve(address(res.order), maxTokenAmtIn); + res.order.swapTokenToExactToken(res.debt, res.xt, taker, xtAmtOut, maxTokenAmtIn, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function _sellFtForExactToken(DeployUtils.Res memory res, uint128 tokenAmtOut, uint128 maxFtAmtIn) internal { + vm.startPrank(taker); + res.debt.mint(taker, maxFtAmtIn); + res.debt.approve(address(res.market), maxFtAmtIn); + res.market.mint(taker, maxFtAmtIn); + + res.ft.approve(address(res.order), maxFtAmtIn); + res.order.swapTokenToExactToken(res.ft, res.debt, taker, tokenAmtOut, maxFtAmtIn, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function _sellXtForExactToken(DeployUtils.Res memory res, uint128 tokenAmtOut, uint128 maxXtAmtIn) internal { + vm.startPrank(taker); + res.debt.mint(taker, maxXtAmtIn); + res.debt.approve(address(res.market), maxXtAmtIn); + res.market.mint(taker, maxXtAmtIn); + + res.xt.approve(address(res.order), maxXtAmtIn); + res.order.swapTokenToExactToken(res.xt, res.debt, taker, tokenAmtOut, maxXtAmtIn, block.timestamp + 1 hours); + vm.stopPrank(); + } +} + +// Mock contracts for testing +contract MockSwapCallback is ISwapCallback { + using SafeCast for *; + + int256 public deltaFt; + int256 public deltaXt; + int256 ftReserve; + int256 xtReserve; + IERC20 public ft; + IERC20 public xt; + + constructor(IERC20 ft_, IERC20 xt_) { + ft = ft_; + xt = xt_; + } + + function afterSwap(uint256 ftReserve_, uint256 xtReserve_, int256 deltaFt_, int256 deltaXt_) external override { + deltaFt = deltaFt_; + deltaXt = deltaXt_; + if (ftReserve == 0 || xtReserve == 0) { + ftReserve = int256(ftReserve_); + xtReserve = int256(xtReserve_); + return; + } else { + ftReserve += deltaFt; + xtReserve += deltaXt; + require(uint256(ftReserve) == ftReserve_, "ft reserve not as expected"); + require(uint256(xtReserve) == xtReserve_, "xt reserve not as expected"); + } + } +} diff --git a/test/v1/Gt.t.sol b/test/v1/Gt.t.sol new file mode 100644 index 0000000..31127af --- /dev/null +++ b/test/v1/Gt.t.sol @@ -0,0 +1,1411 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "forge-std/Test.sol"; +import {console} from "forge-std/console.sol"; +import {DeployUtils} from "./utils/DeployUtils.sol"; +import {JSONLoader} from "./utils/JSONLoader.sol"; +import {StateChecker} from "./utils/StateChecker.sol"; +import {SwapUtils} from "./utils/SwapUtils.sol"; +import {LoanUtils} from "./utils/LoanUtils.sol"; + +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {Constants} from "contracts/v1/lib/Constants.sol"; +import {ITermMaxMarket, TermMaxMarket, MarketEvents, MarketErrors} from "contracts/v1/TermMaxMarket.sol"; +import {MockFlashLoanReceiver} from "contracts/v1/test/MockFlashLoanReceiver.sol"; +import {MockFlashRepayer} from "contracts/v1/test/MockFlashRepayer.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import { + IGearingToken, + AbstractGearingToken, + GearingTokenErrors, + GearingTokenEvents +} from "contracts/v1/tokens/AbstractGearingToken.sol"; +import {IMintableERC20} from "contracts/v1/tokens/MintableERC20.sol"; +import {ITermMaxFactory, TermMaxFactory} from "contracts/v1/factory/TermMaxFactory.sol"; +import {IOracle, OracleAggregator, AggregatorV3Interface} from "contracts/v1/oracle/OracleAggregator.sol"; +import "contracts/v1/storage/TermMaxStorage.sol"; + +contract GtTest is Test { + using JSONLoader for *; + using SafeCast for uint256; + using SafeCast for int256; + + DeployUtils.Res res; + + OrderConfig orderConfig; + MarketConfig marketConfig; + + address deployer = vm.randomAddress(); + address sender = vm.randomAddress(); + address treasurer = vm.randomAddress(); + address maker = vm.randomAddress(); + string testdata; + + MockFlashLoanReceiver flashLoanReceiver; + + MockFlashRepayer flashRepayer; + + uint32 maxLtv = 0.89e8; + uint32 liquidationLtv = 0.9e8; + + function setUp() public { + vm.startPrank(deployer); + testdata = vm.readFile(string.concat(vm.projectRoot(), "/test/testdata/testdata.json")); + + marketConfig = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); + orderConfig = JSONLoader.getOrderConfigFromJson(testdata, ".orderConfig"); + orderConfig.maxXtReserve = type(uint128).max; + res = DeployUtils.deployMarket(deployer, marketConfig, maxLtv, liquidationLtv); + + res.order = + res.market.createOrder(maker, orderConfig.maxXtReserve, ISwapCallback(address(0)), orderConfig.curveCuts); + + vm.warp(vm.parseUint(vm.parseJsonString(testdata, ".currentTime"))); + + // update oracle + res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.eth")); + res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.dai")); + + uint256 amount = 15000e8; + res.debt.mint(deployer, amount); + res.debt.approve(address(res.market), amount); + res.market.mint(deployer, amount); + res.ft.transfer(address(res.order), amount); + res.xt.transfer(address(res.order), amount); + + flashLoanReceiver = new MockFlashLoanReceiver(res.market); + flashRepayer = new MockFlashRepayer(res.gt); + + vm.stopPrank(); + } + + function testMintGtByIssueFt() public { + uint128 debtAmt = 100e8; + uint256 collateralAmt = 1e18; + res.collateral.mint(sender, collateralAmt); + + vm.startPrank(sender); + + res.collateral.approve(address(res.gt), collateralAmt); + bytes memory collateralData = abi.encode(collateralAmt); + + StateChecker.MarketState memory state = StateChecker.getMarketState(res); + + uint256 issueFee = (debtAmt * res.market.mintGtFeeRatio()) / Constants.DECIMAL_BASE; + vm.expectEmit(); + emit MarketEvents.IssueFt( + sender, sender, 1, debtAmt, uint128(debtAmt - issueFee), uint128(issueFee), collateralData + ); + + (uint256 gtId, uint128 ftOutAmt) = res.market.issueFt(sender, debtAmt, collateralData); + + assert(ftOutAmt == (debtAmt - issueFee)); + assert(gtId == 1); + + state.collateralReserve += collateralAmt; + StateChecker.checkMarketState(res, state); + + assert(res.ft.balanceOf(marketConfig.treasurer) == issueFee); + assert(res.ft.balanceOf(sender) == ftOutAmt); + + (address owner, uint128 d, bytes memory cd) = res.gt.loanInfo(gtId); + assert(owner == sender); + assert(d == debtAmt); + assert(collateralAmt == abi.decode(cd, (uint256))); + (, uint128 ltv,) = res.gt.getLiquidationInfo(gtId); + assert(LoanUtils.calcLtv(res, debtAmt, collateralAmt) == ltv); + + vm.stopPrank(); + } + + function testMintGtByLeverage() public { + vm.startPrank(sender); + uint256 collateralAmt = 1e18; + bytes memory callbackData = abi.encode(sender, collateralAmt); + res.collateral.mint(address(flashLoanReceiver), collateralAmt); + + uint128 xtAmt = 90e8; + uint256 debtAmt = xtAmt * Constants.DECIMAL_BASE / (Constants.DECIMAL_BASE - res.market.mintGtFeeRatio()); + + uint128 debtAmtInForBuyXt = 5e8; + uint128 minXTOut = 0e8; + res.debt.mint(sender, debtAmtInForBuyXt); + res.debt.approve(address(res.order), debtAmtInForBuyXt); + res.order.swapExactTokenToToken( + res.debt, res.xt, sender, debtAmtInForBuyXt, minXTOut, block.timestamp + 1 hours + ); + StateChecker.MarketState memory state = StateChecker.getMarketState(res); + uint256 xtBefore = res.xt.balanceOf(address(sender)); + + res.xt.approve(address(flashLoanReceiver), xtAmt); + + vm.expectEmit(); + emit MarketEvents.LeverageByXt( + address(flashLoanReceiver), + sender, + 1, + uint128(debtAmt), + xtAmt, + uint128(debtAmt - xtAmt), + abi.encode(collateralAmt) + ); + uint256 gtId = flashLoanReceiver.leverageByXt(xtAmt, callbackData); + + assert(gtId == 1); + state.collateralReserve += collateralAmt; + state.debtReserve -= xtAmt; + StateChecker.checkMarketState(res, state); + + uint256 xtAfter = res.xt.balanceOf(address(sender)); + assert(xtBefore - xtAfter == xtAmt); + + (address owner, uint128 d, bytes memory cd) = res.gt.loanInfo(gtId); + assert(owner == sender); + assert(d == debtAmt); + assert(collateralAmt == abi.decode(cd, (uint256))); + + vm.stopPrank(); + } + + function testMintGtWhenOracleOutdated() public { + uint128 debtAmt = 1000e8; + uint256 collateralAmt = 1e18; + res.collateral.mint(sender, collateralAmt); + + vm.prank(deployer); + res.oracle.submitPendingOracle( + address(res.collateral), IOracle.Oracle(res.collateralOracle, res.collateralOracle, 3600) + ); + res.oracle.acceptPendingOracle(address(res.collateral)); + vm.warp(block.timestamp + 3600); + + vm.startPrank(sender); + res.collateral.approve(address(res.gt), collateralAmt); + bytes memory collateralData = abi.encode(collateralAmt); + + vm.expectRevert(abi.encodeWithSelector(IOracle.OracleIsNotWorking.selector, address(res.collateral))); + res.market.issueFt(sender, debtAmt, collateralData); + + vm.stopPrank(); + + vm.startPrank(deployer); + res.oracle.submitPendingOracle( + address(res.collateral), IOracle.Oracle(res.collateralOracle, res.collateralOracle, 365 days) + ); + res.oracle.acceptPendingOracle(address(res.collateral)); + vm.stopPrank(); + + vm.startPrank(sender); + res.collateral.approve(address(res.gt), collateralAmt); + res.market.issueFt(sender, debtAmt, collateralData); + + vm.stopPrank(); + } + + function testRevertByGtIsNotHealthyWhenIssueFt() public { + // debt 1790 USD collaretal 2000USD ltv 0.891 + uint128 debtAmt = 1790e8; + uint256 collateralAmt = 1e18; + res.collateral.mint(sender, collateralAmt); + + vm.startPrank(sender); + + res.collateral.approve(address(res.gt), collateralAmt); + bytes memory collateralData = abi.encode(collateralAmt); + + vm.expectRevert( + abi.encodeWithSelector( + GearingTokenErrors.GtIsNotHealthy.selector, 0, sender, LoanUtils.calcLtv(res, debtAmt, collateralAmt) + ) + ); + res.market.issueFt(sender, debtAmt, collateralData); + + vm.stopPrank(); + } + + function testRevertByGtIsNotHealthyWhenCollateralCloseZero() public { + // debt 5 USD collaretal 2e-7 USD + uint128 debtAmt = 5e8; + uint256 collateralAmt = 1; + res.collateral.mint(sender, collateralAmt); + + vm.startPrank(sender); + + res.collateral.approve(address(res.gt), collateralAmt); + bytes memory collateralData = abi.encode(collateralAmt); + + vm.expectRevert( + abi.encodeWithSelector( + GearingTokenErrors.GtIsNotHealthy.selector, 0, sender, LoanUtils.calcLtv(res, debtAmt, collateralAmt) + ) + ); + res.market.issueFt(sender, debtAmt, collateralData); + + vm.stopPrank(); + } + + function testRevertByGtIsNotHealthyWhenLeverage() public { + vm.startPrank(sender); + uint256 collateralAmt = 0.001e18; + bytes memory callbackData = abi.encode(sender, collateralAmt); + res.collateral.mint(address(flashLoanReceiver), collateralAmt); + + uint128 xtAmt = 90e8; + uint256 debtAmt = xtAmt * Constants.DECIMAL_BASE / (Constants.DECIMAL_BASE - res.market.mintGtFeeRatio()); + + uint128 debtAmtInForBuyXt = 5e8; + uint128 minXTOut = 0e8; + res.debt.mint(sender, debtAmtInForBuyXt); + res.debt.approve(address(res.order), debtAmtInForBuyXt); + res.order.swapExactTokenToToken( + res.debt, res.xt, sender, debtAmtInForBuyXt, minXTOut, block.timestamp + 1 hours + ); + + res.xt.approve(address(flashLoanReceiver), xtAmt); + + vm.expectRevert( + abi.encodeWithSelector( + GearingTokenErrors.GtIsNotHealthy.selector, 0, sender, LoanUtils.calcLtv(res, debtAmt, collateralAmt) + ) + ); + flashLoanReceiver.leverageByXt(xtAmt, callbackData); + + vm.stopPrank(); + } + + function testReapyByDebtToken() public { + uint128 debtAmt = 100e8; + uint256 collateralAmt = 1e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + + res.debt.mint(sender, debtAmt); + + res.debt.approve(address(res.gt), debtAmt); + uint256 collateralBalanceBefore = res.collateral.balanceOf(sender); + uint256 debtBalanceBefore = res.debt.balanceOf(sender); + StateChecker.MarketState memory state = StateChecker.getMarketState(res); + bool byDebtToken = true; + vm.expectEmit(); + emit GearingTokenEvents.Repay(gtId, debtAmt, byDebtToken); + res.gt.repay(gtId, debtAmt, byDebtToken); + + uint256 collateralBalanceAfter = res.collateral.balanceOf(sender); + uint256 debtBalanceAfter = res.debt.balanceOf(sender); + state.debtReserve += debtAmt; + state.collateralReserve -= collateralAmt; + StateChecker.checkMarketState(res, state); + + assert(collateralBalanceAfter - collateralBalanceBefore == collateralAmt); + assert(debtBalanceAfter + debtAmt == debtBalanceBefore); + vm.expectRevert(abi.encodePacked(bytes4(keccak256("ERC721NonexistentToken(uint256)")), gtId)); + res.gt.loanInfo(gtId); + + vm.stopPrank(); + } + + function testReapyByFt() public { + uint128 debtAmt = 100e8; + uint256 collateralAmt = 1e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + + // get FT token + uint128 debtAmtInForBuyFt = 100e8; + uint128 minFTOut = 0e8; + res.debt.mint(sender, debtAmtInForBuyFt); + res.debt.approve(address(res.order), debtAmtInForBuyFt); + res.order.swapExactTokenToToken( + res.debt, res.ft, sender, debtAmtInForBuyFt, minFTOut, block.timestamp + 1 hours + ); + + uint256 collateralBalanceBefore = res.collateral.balanceOf(sender); + uint256 ftBalanceBefore = res.ft.balanceOf(sender); + uint256 ftInMarketBefore = res.ft.balanceOf(address(res.market)); + StateChecker.MarketState memory state = StateChecker.getMarketState(res); + + res.ft.approve(address(res.gt), debtAmt); + + bool byDebtToken = false; + vm.expectEmit(); + emit GearingTokenEvents.Repay(gtId, debtAmt, byDebtToken); + res.gt.repay(gtId, debtAmt, byDebtToken); + + uint256 collateralBalanceAfter = res.collateral.balanceOf(sender); + uint256 ftBalanceAfter = res.ft.balanceOf(sender); + uint256 ftInMarketAfter = res.ft.balanceOf(address(res.market)); + state.collateralReserve -= collateralAmt; + StateChecker.checkMarketState(res, state); + assert(ftInMarketAfter - debtAmt == ftInMarketBefore); + assert(collateralBalanceAfter - collateralBalanceBefore == collateralAmt); + assert(ftBalanceAfter + debtAmt == ftBalanceBefore); + vm.expectRevert(abi.encodePacked(bytes4(keccak256("ERC721NonexistentToken(uint256)")), gtId)); + res.gt.loanInfo(gtId); + + vm.stopPrank(); + } + + function testPatriallyReapy() public { + uint128 debtAmt = 100e8; + uint128 repayAmt = 10e8; + uint256 collateralAmt = 1e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.stopPrank(); + // Repay repayAmt + address thirdPeople = vm.randomAddress(); + res.debt.mint(thirdPeople, debtAmt); + // Repay repayAmt + vm.startPrank(thirdPeople); + res.debt.approve(address(res.gt), debtAmt); + StateChecker.MarketState memory state = StateChecker.getMarketState(res); + + bool byDebtToken = true; + vm.expectEmit(); + emit GearingTokenEvents.Repay(gtId, repayAmt, byDebtToken); + res.gt.repay(gtId, repayAmt, byDebtToken); + state.debtReserve += repayAmt; + StateChecker.checkMarketState(res, state); + assert(res.debt.balanceOf(thirdPeople) == debtAmt - repayAmt); + assert(res.collateral.balanceOf(thirdPeople) == 0); + + (address owner, uint128 d, bytes memory cd) = res.gt.loanInfo(gtId); + assert(owner == sender); + assert(d == debtAmt - repayAmt); + assert(collateralAmt == abi.decode(cd, (uint256))); + + // Repay all + uint256 debtBalanceBefore = res.debt.balanceOf(sender); + uint256 collateralBalanceBefore = res.collateral.balanceOf(sender); + + vm.expectEmit(); + emit GearingTokenEvents.Repay(gtId, debtAmt - repayAmt, byDebtToken); + res.gt.repay(gtId, debtAmt - repayAmt, byDebtToken); + + state.debtReserve += (debtAmt - repayAmt); + state.collateralReserve -= collateralAmt; + uint256 collateralBalanceAfter = res.collateral.balanceOf(sender); + uint256 debtBalanceAfter = res.debt.balanceOf(sender); + StateChecker.checkMarketState(res, state); + + assert(collateralBalanceAfter - collateralBalanceBefore == collateralAmt); + assert(debtBalanceAfter == debtBalanceBefore); + assert(res.debt.balanceOf(thirdPeople) == 0); + assert(res.collateral.balanceOf(thirdPeople) == 0); + + vm.expectRevert(abi.encodePacked(bytes4(keccak256("ERC721NonexistentToken(uint256)")), gtId)); + res.gt.loanInfo(gtId); + + vm.stopPrank(); + } + + function testFlashRepay() public { + uint128 debtAmt = 100e8; + uint256 collateralAmt = 1e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + + res.debt.mint(address(flashRepayer), debtAmt); + res.gt.approve(address(flashRepayer), gtId); + + uint256 collateralBalanceBefore = res.collateral.balanceOf(sender); + uint256 debtBalanceBefore = res.debt.balanceOf(sender); + StateChecker.MarketState memory state = StateChecker.getMarketState(res); + bool byDebtToken = true; + vm.expectEmit(); + emit GearingTokenEvents.Repay(gtId, debtAmt, byDebtToken); + flashRepayer.flashRepay(gtId, byDebtToken); + + uint256 collateralBalanceAfter = res.collateral.balanceOf(sender); + uint256 debtBalanceAfter = res.debt.balanceOf(sender); + state.debtReserve += debtAmt; + state.collateralReserve -= collateralAmt; + StateChecker.checkMarketState(res, state); + + assert(res.collateral.balanceOf(address(flashRepayer)) == collateralAmt); + assert(res.debt.balanceOf(address(flashRepayer)) == 0); + assert(collateralBalanceAfter == collateralBalanceBefore); + assert(debtBalanceAfter == debtBalanceBefore); + vm.expectRevert(abi.encodePacked(bytes4(keccak256("ERC721NonexistentToken(uint256)")), gtId)); + res.gt.loanInfo(gtId); + + vm.stopPrank(); + } + + // function testFlashRepayThroughFt() public { + // uint128 debtAmt = 100e8; + // uint256 collateralAmt = 1e18; + + // vm.startPrank(sender); + + // (uint256 gtId, ) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + // deal(address(res.ft), address(flashRepayer), debtAmt); + + // res.gt.approve(address(flashRepayer), gtId); + + // uint collateralBalanceBefore = res.collateral.balanceOf(sender); + // uint ftBalanceBefore = res.ft.balanceOf(sender); + // StateChecker.MarketState memory state = StateChecker.getMarketState(res); + // bool byDebtToken = false; + // vm.expectEmit(); + // emit GearingTokenEvents.Repay(gtId, debtAmt, byDebtToken); + // flashRepayer.flashRepay(gtId, byDebtToken); + + // uint collateralBalanceAfter = res.collateral.balanceOf(sender); + // uint ftBalanceAfter = res.ft.balanceOf(sender); + // state.ftReserve += debtAmt; + // state.collateralReserve -= collateralAmt; + // StateChecker.checkMarketState(res, state); + + // assert(res.collateral.balanceOf(address(flashRepayer)) == collateralAmt); + // assert(res.debt.balanceOf(address(flashRepayer)) == 0); + // assert(collateralBalanceAfter == collateralBalanceBefore); + // assert(ftBalanceAfter == ftBalanceBefore); + // vm.expectRevert(abi.encodePacked(bytes4(keccak256("ERC721NonexistentToken(uint256)")), gtId)); + // res.gt.loanInfo(gtId); + + // vm.stopPrank(); + // } + + function testRevertByGtIsExpiredWhenRepay() public { + uint128 debtAmt = 100e8; + uint256 collateralAmt = 1e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.warp(marketConfig.maturity); + res.debt.mint(sender, debtAmt); + + res.debt.approve(address(res.gt), debtAmt); + + vm.expectRevert(abi.encodeWithSelector(GearingTokenErrors.GtIsExpired.selector, gtId)); + res.gt.repay(gtId, debtAmt, true); + + vm.stopPrank(); + } + + function testRevertByGtIsExpiredWhenFlashRepay() public { + uint128 debtAmt = 100e8; + uint256 collateralAmt = 1e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.warp(marketConfig.maturity); + res.debt.mint(address(flashRepayer), debtAmt); + res.gt.approve(address(flashRepayer), gtId); + + vm.expectRevert(abi.encodeWithSelector(GearingTokenErrors.GtIsExpired.selector, gtId)); + flashRepayer.flashRepay(gtId, true); + } + + function testMerge() public { + uint40[3] memory debts = [100e8, 30e8, 5e8]; + uint64[3] memory collaterals = [1e18, 0.5e18, 0.05e18]; + + vm.startPrank(sender); + + uint256[] memory ids = new uint256[](3); + for (uint256 i = 0; i < ids.length; ++i) { + (ids[i],) = LoanUtils.fastMintGt(res, sender, debts[i], collaterals[i]); + } + StateChecker.MarketState memory state = StateChecker.getMarketState(res); + + vm.expectEmit(); + uint256 newId = 4; + emit GearingTokenEvents.MergeGts(sender, newId, ids); + newId = res.gt.merge(ids); + StateChecker.checkMarketState(res, state); + + (address owner, uint128 d, bytes memory cd) = res.gt.loanInfo(newId); + assert(owner == sender); + assert(d == debts[0] + debts[1] + debts[2]); + assert(collaterals[0] + collaterals[1] + collaterals[2] == abi.decode(cd, (uint256))); + for (uint256 i = 0; i < ids.length; i++) { + vm.expectRevert(abi.encodePacked(bytes4(keccak256("ERC721NonexistentToken(uint256)")), ids[i])); + res.gt.loanInfo(ids[i]); + } + + vm.stopPrank(); + } + + function testRevertByCanNotMergeLoanWithDiffOwnerWhenMerge() public { + uint40[3] memory debts = [100e8, 30e8, 5e8]; + uint64[3] memory collaterals = [1e18, 0.5e18, 0.005e18]; + + vm.startPrank(sender); + + uint256[] memory ids = new uint256[](3); + for (uint256 i = 0; i < ids.length; ++i) { + (ids[i],) = LoanUtils.fastMintGt(res, sender, debts[i], collaterals[i]); + } + vm.stopPrank(); + vm.prank(vm.randomAddress()); + vm.expectRevert( + abi.encodeWithSelector(GearingTokenErrors.CanNotMergeLoanWithDiffOwner.selector, ids[0], sender) + ); + res.gt.merge(ids); + } + + function testAddCollateral() public { + uint128 debtAmt = 1700e8; + uint256 collateralAmt = 1e18; + uint256 addedCollateral = 0.1e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.stopPrank(); + // Add collateral by third address + address thirdPeople = vm.randomAddress(); + res.collateral.mint(thirdPeople, addedCollateral); + vm.startPrank(thirdPeople); + + res.collateral.approve(address(res.gt), addedCollateral); + + StateChecker.MarketState memory state = StateChecker.getMarketState(res); + + vm.expectEmit(); + emit GearingTokenEvents.AddCollateral(gtId, abi.encode(collateralAmt + addedCollateral)); + res.gt.addCollateral(gtId, abi.encode(addedCollateral)); + + state.collateralReserve += addedCollateral; + StateChecker.checkMarketState(res, state); + assert(res.debt.balanceOf(thirdPeople) == 0); + assert(res.collateral.balanceOf(thirdPeople) == 0); + + (address owner, uint128 d, bytes memory cd) = res.gt.loanInfo(gtId); + assert(owner == sender); + assert(d == debtAmt); + assert(collateralAmt + addedCollateral == abi.decode(cd, (uint256))); + + // Add collateral by self + vm.startPrank(sender); + + res.collateral.mint(sender, addedCollateral); + res.collateral.approve(address(res.gt), addedCollateral); + + res.gt.addCollateral(gtId, abi.encode(addedCollateral)); + vm.stopPrank(); + } + + function testRevertByGtIsExpiredWhenAddCollateral() public { + uint128 debtAmt = 100e8; + uint256 collateralAmt = 1e18; + uint256 addedCollateral = 0.1e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + + vm.stopPrank(); + + address thirdPeople = vm.randomAddress(); + vm.warp(marketConfig.maturity); + res.collateral.mint(thirdPeople, addedCollateral); + + vm.startPrank(thirdPeople); + res.collateral.approve(address(res.gt), addedCollateral); + + vm.expectRevert(abi.encodeWithSelector(GearingTokenErrors.GtIsExpired.selector, gtId)); + + res.gt.addCollateral(gtId, abi.encode(addedCollateral)); + vm.stopPrank(); + } + + function testRemoveCollateral() public { + uint128 debtAmt = 100e8; + uint256 collateralAmt = 1e18; + uint256 removedCollateral = 0.1e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + + StateChecker.MarketState memory state = StateChecker.getMarketState(res); + uint256 collateralBlanceBefore = res.collateral.balanceOf(sender); + + vm.expectEmit(); + emit GearingTokenEvents.RemoveCollateral(gtId, abi.encode(collateralAmt - removedCollateral)); + res.gt.removeCollateral(gtId, abi.encode(removedCollateral)); + + state.collateralReserve -= removedCollateral; + StateChecker.checkMarketState(res, state); + + uint256 collateralBlanceAfter = res.collateral.balanceOf(sender); + + assert(collateralBlanceAfter - collateralBlanceBefore == removedCollateral); + + (address owner, uint128 d, bytes memory cd) = res.gt.loanInfo(gtId); + assert(owner == sender); + assert(d == debtAmt); + assert(collateralAmt - removedCollateral == abi.decode(cd, (uint256))); + + vm.stopPrank(); + } + + function testRemoveCollateralWhenOracleOutdated() public { + // debt 100 USD collaretal 2200USD + uint128 debtAmt = 100e8; + uint256 collateralAmt = 1.1e18; + uint256 removedCollateral = 0.1e18; + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.stopPrank(); + + vm.prank(deployer); + res.oracle.submitPendingOracle( + address(res.collateral), IOracle.Oracle(res.collateralOracle, res.collateralOracle, 3600) + ); + vm.prank(deployer); + res.oracle.acceptPendingOracle(address(res.collateral)); + vm.warp(block.timestamp + 3600); + + vm.expectRevert(abi.encodeWithSelector(IOracle.OracleIsNotWorking.selector, address(res.collateral))); + vm.prank(sender); + res.gt.removeCollateral(gtId, abi.encode(removedCollateral)); + + vm.prank(deployer); + res.oracle.submitPendingOracle( + address(res.collateral), IOracle.Oracle(res.collateralOracle, res.collateralOracle, 365 days) + ); + vm.prank(deployer); + res.oracle.acceptPendingOracle(address(res.collateral)); + + vm.prank(sender); + res.gt.removeCollateral(gtId, abi.encode(removedCollateral)); + } + + function testRevertByGtIsNotHealthyWhenRemoveCollateral() public { + // debt 1780 USD collaretal 2200USD + uint128 debtAmt = 1790e8; + uint256 collateralAmt = 1.1e18; + uint256 removedCollateral = 0.1e18; + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + + vm.expectRevert( + abi.encodeWithSelector( + GearingTokenErrors.GtIsNotHealthy.selector, + gtId, + sender, + LoanUtils.calcLtv(res, debtAmt, collateralAmt - removedCollateral) + ) + ); + res.gt.removeCollateral(gtId, abi.encode(removedCollateral)); + + vm.stopPrank(); + } + + function testRevertByCallerIsNotTheOwnerWhenRemoveCollateral() public { + // debt 1780 USD collaretal 2200USD + uint128 debtAmt = 1780e8; + uint256 collateralAmt = 1.1e18; + uint256 removedCollateral = 0.1e18; + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.stopPrank(); + + address thirdPeople = vm.randomAddress(); + vm.expectRevert(abi.encodeWithSelector(GearingTokenErrors.CallerIsNotTheOwner.selector, gtId)); + vm.prank(thirdPeople); + res.gt.removeCollateral(gtId, abi.encode(removedCollateral)); + } + + function testRevertByGtIsExpiredWhenRemoveCollateral() public { + // debt 200 USD collaretal 2200USD + uint128 debtAmt = 200e8; + uint256 collateralAmt = 1.1e18; + uint256 removedCollateral = 0.1e18; + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + + vm.stopPrank(); + + vm.warp(marketConfig.maturity); + + vm.expectRevert(abi.encodeWithSelector(GearingTokenErrors.GtIsExpired.selector, gtId)); + vm.prank(sender); + res.gt.removeCollateral(gtId, abi.encode(removedCollateral)); + } + + // Case 1: removed collateral can not cover repayAmt + rewardToLiquidator + function testLiquidateCase1() public { + uint128 debtAmt = 1000e8; + uint256 collateralAmt = 1e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.stopPrank(); + vm.startPrank(deployer); + // update oracle + res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth")); + res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.dai")); + vm.stopPrank(); + address liquidator = vm.randomAddress(); + vm.startPrank(liquidator); + + res.debt.mint(liquidator, debtAmt); + res.debt.approve(address(res.gt), debtAmt); + + uint256 senderCBalanceBefore = res.collateral.balanceOf(sender); + StateChecker.MarketState memory state = StateChecker.getMarketState(res); + + vm.expectEmit(); + uint256 cToLiquidator = collateralAmt; + uint256 cToTreasurer = 0; + uint256 remainningC = 0; + emit GearingTokenEvents.Liquidate( + gtId, + liquidator, + debtAmt, + true, + abi.encode(cToLiquidator), + abi.encode(cToTreasurer), + abi.encode(remainningC) + ); + + res.gt.liquidate(gtId, debtAmt, true); + state.collateralReserve -= collateralAmt; + state.debtReserve += debtAmt; + StateChecker.checkMarketState(res, state); + + assert(res.collateral.balanceOf(marketConfig.treasurer) == cToTreasurer); + assert(res.collateral.balanceOf(liquidator) == cToLiquidator); + assert(res.collateral.balanceOf(sender) == remainningC + senderCBalanceBefore); + vm.stopPrank(); + } + + // Case 2: removed collateral can cover repayAmt + rewardToLiquidator but not rewardToProtocol + function testLiquidateCase2() public { + uint128 debtAmt = 950e8; + uint256 collateralAmt = 1e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.stopPrank(); + vm.startPrank(deployer); + // update oracle + res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth")); + res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.dai")); + vm.stopPrank(); + address liquidator = vm.randomAddress(); + vm.startPrank(liquidator); + + res.debt.mint(liquidator, debtAmt); + res.debt.approve(address(res.gt), debtAmt); + + uint256 senderCBalanceBefore = res.collateral.balanceOf(sender); + StateChecker.MarketState memory state = StateChecker.getMarketState(res); + + vm.expectEmit(); + // uint cToLiquidator = 0.9975e18; + // uint cToTreasurer = 0.0025e18; + // uint remainningC = 0; + (uint256 cToLiquidator, uint256 cToTreasurer, uint256 remainningC) = + LoanUtils.calcLiquidationResult(res, debtAmt, collateralAmt, debtAmt); + emit GearingTokenEvents.Liquidate( + gtId, + liquidator, + debtAmt, + true, + abi.encode(cToLiquidator), + abi.encode(cToTreasurer), + abi.encode(remainningC) + ); + + res.gt.liquidate(gtId, debtAmt, true); + state.collateralReserve -= collateralAmt; + state.debtReserve += debtAmt; + StateChecker.checkMarketState(res, state); + + assert(res.collateral.balanceOf(marketConfig.treasurer) == cToTreasurer); + assert(res.collateral.balanceOf(liquidator) == cToLiquidator); + assert(res.collateral.balanceOf(sender) == remainningC + senderCBalanceBefore); + vm.stopPrank(); + } + + // Case 3: removed collateral equal repayAmt + rewardToLiquidator + rewardToProtocol + function testLiquidateCase3() public { + uint128 debtAmt = 900e8; + uint256 collateralAmt = 1e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.stopPrank(); + vm.startPrank(deployer); + // update oracle + res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth")); + res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.dai")); + vm.stopPrank(); + address liquidator = vm.randomAddress(); + vm.startPrank(liquidator); + + res.debt.mint(liquidator, debtAmt); + res.debt.approve(address(res.gt), debtAmt); + + uint256 senderCBalanceBefore = res.collateral.balanceOf(sender); + StateChecker.MarketState memory state = StateChecker.getMarketState(res); + + vm.expectEmit(); + // uint cToLiquidator = 0.945e18; + // uint cToTreasurer = 0.045e18; + // uint remainningC = 0.01e18; + (uint256 cToLiquidator, uint256 cToTreasurer, uint256 remainningC) = + LoanUtils.calcLiquidationResult(res, debtAmt, collateralAmt, debtAmt); + emit GearingTokenEvents.Liquidate( + gtId, + liquidator, + debtAmt, + true, + abi.encode(cToLiquidator), + abi.encode(cToTreasurer), + abi.encode(remainningC) + ); + + res.gt.liquidate(gtId, debtAmt, true); + state.collateralReserve -= collateralAmt; + state.debtReserve += debtAmt; + StateChecker.checkMarketState(res, state); + + assert(res.collateral.balanceOf(marketConfig.treasurer) == cToTreasurer); + assert(res.collateral.balanceOf(liquidator) == cToLiquidator); + assert(res.collateral.balanceOf(sender) == remainningC + senderCBalanceBefore); + vm.stopPrank(); + } + + function testLiquidateByFt() public { + uint128 debtAmt = 1000e8; + uint256 collateralAmt = 1e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.stopPrank(); + vm.startPrank(deployer); + // update oracle + res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth")); + res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.dai")); + vm.stopPrank(); + address liquidator = vm.randomAddress(); + vm.startPrank(liquidator); + + res.debt.mint(liquidator, debtAmt); + res.debt.approve(address(res.market), debtAmt); + res.market.mint(liquidator, debtAmt); + res.ft.approve(address(res.gt), debtAmt); + + uint256 senderCBalanceBefore = res.collateral.balanceOf(sender); + StateChecker.MarketState memory state = StateChecker.getMarketState(res); + + vm.expectEmit(); + uint256 cToLiquidator = collateralAmt; + uint256 cToTreasurer = 0; + uint256 remainningC = 0; + emit GearingTokenEvents.Liquidate( + gtId, + liquidator, + debtAmt, + false, + abi.encode(cToLiquidator), + abi.encode(cToTreasurer), + abi.encode(remainningC) + ); + + res.gt.liquidate(gtId, debtAmt, false); + state.collateralReserve -= collateralAmt; + StateChecker.checkMarketState(res, state); + + assert(res.ft.balanceOf(address(res.market)) == debtAmt); + assert(res.collateral.balanceOf(marketConfig.treasurer) == cToTreasurer); + assert(res.collateral.balanceOf(liquidator) == cToLiquidator); + assert(res.collateral.balanceOf(sender) == remainningC + senderCBalanceBefore); + vm.stopPrank(); + } + + function testRemovedCollateralLessThanRepayAmt() public { + uint128 debtAmt = 900e8; + uint256 collateralAmt = 0.93e18; + uint128 repayAmt = 300e8; + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.stopPrank(); + vm.startPrank(deployer); + // update oracle + res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth")); + res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.dai")); + vm.stopPrank(); + address liquidator = vm.randomAddress(); + vm.startPrank(liquidator); + + res.debt.mint(liquidator, repayAmt); + res.debt.approve(address(res.gt), repayAmt); + + uint256 senderCBalanceBefore = res.collateral.balanceOf(sender); + StateChecker.MarketState memory state = StateChecker.getMarketState(res); + + vm.expectEmit(); + // uint cToLiquidator = 0.31e18; + // uint cToTreasurer = 0; + // uint remainningC = 0.62e18; + (uint256 cToLiquidator, uint256 cToTreasurer, uint256 remainningC) = + LoanUtils.calcLiquidationResult(res, debtAmt, collateralAmt, repayAmt); + emit GearingTokenEvents.Liquidate( + gtId, + liquidator, + repayAmt, + true, + abi.encode(cToLiquidator), + abi.encode(cToTreasurer), + abi.encode(remainningC) + ); + + res.gt.liquidate(gtId, repayAmt, true); + state.collateralReserve -= (cToLiquidator + cToTreasurer); + state.debtReserve += repayAmt; + StateChecker.checkMarketState(res, state); + + assert(res.collateral.balanceOf(marketConfig.treasurer) == cToTreasurer); + assert(res.collateral.balanceOf(liquidator) == cToLiquidator); + assert(res.collateral.balanceOf(sender) == senderCBalanceBefore); + vm.stopPrank(); + } + + function testHalfLiquidate() public { + uint128 debtAmt = 9000e8; + uint256 collateralAmt = 10e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.stopPrank(); + vm.startPrank(deployer); + // update oracle + res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth")); + res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.dai")); + vm.stopPrank(); + (bool isLiquidable,, uint128 maxRepayAmt) = res.gt.getLiquidationInfo(gtId); + assert(isLiquidable); + assert(maxRepayAmt == debtAmt / 2); + address liquidator = vm.randomAddress(); + vm.startPrank(liquidator); + + res.debt.mint(liquidator, maxRepayAmt); + res.debt.approve(address(res.gt), maxRepayAmt); + + uint256 senderCBalanceBefore = res.collateral.balanceOf(sender); + StateChecker.MarketState memory state = StateChecker.getMarketState(res); + + vm.expectEmit(); + // uint cToLiquidator = 4.725e18; + // uint cToTreasurer = 0.225e18; + // uint remainningC = 5.05e18; + (uint256 cToLiquidator, uint256 cToTreasurer, uint256 remainningC) = + LoanUtils.calcLiquidationResult(res, debtAmt, collateralAmt, maxRepayAmt); + emit GearingTokenEvents.Liquidate( + gtId, + liquidator, + maxRepayAmt, + true, + abi.encode(cToLiquidator), + abi.encode(cToTreasurer), + abi.encode(remainningC) + ); + + res.gt.liquidate(gtId, maxRepayAmt, true); + state.collateralReserve -= (cToLiquidator + cToTreasurer); + state.debtReserve += maxRepayAmt; + StateChecker.checkMarketState(res, state); + + assert(res.collateral.balanceOf(marketConfig.treasurer) == cToTreasurer); + assert(res.collateral.balanceOf(liquidator) == cToLiquidator); + assert(res.collateral.balanceOf(sender) == senderCBalanceBefore); + vm.stopPrank(); + + (address owner, uint128 newDebtAmt, bytes memory collateralData) = res.gt.loanInfo(gtId); + assert(owner == sender); + assert(newDebtAmt == debtAmt - maxRepayAmt); + + assert(remainningC == abi.decode(collateralData, (uint256))); + uint128 ltv; + (isLiquidable, ltv, maxRepayAmt) = res.gt.getLiquidationInfo(gtId); + assert(ltv < liquidationLtv); + assert(!isLiquidable); + assert(maxRepayAmt == 0); + } + + function testLiquidateInWindowTime(uint16 exceedTime) public { + vm.assume(exceedTime < Constants.LIQUIDATION_WINDOW); + uint256 liquidateTime = marketConfig.maturity + exceedTime; + uint128 debtAmt = 1000e8; + uint256 collateralAmt = 1e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.stopPrank(); + vm.startPrank(deployer); + // update oracle + res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth")); + res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.dai")); + vm.stopPrank(); + + vm.warp(liquidateTime); + address liquidator = vm.randomAddress(); + vm.startPrank(liquidator); + + res.debt.mint(liquidator, debtAmt); + res.debt.approve(address(res.gt), debtAmt); + + uint256 senderCBalanceBefore = res.collateral.balanceOf(sender); + StateChecker.MarketState memory state = StateChecker.getMarketState(res); + + vm.expectEmit(); + uint256 cToLiquidator = collateralAmt; + uint256 cToTreasurer = 0; + uint256 remainningC = 0; + emit GearingTokenEvents.Liquidate( + gtId, + liquidator, + debtAmt, + true, + abi.encode(cToLiquidator), + abi.encode(cToTreasurer), + abi.encode(remainningC) + ); + + res.gt.liquidate(gtId, debtAmt, true); + state.collateralReserve -= collateralAmt; + state.debtReserve += debtAmt; + StateChecker.checkMarketState(res, state); + + assert(res.collateral.balanceOf(marketConfig.treasurer) == cToTreasurer); + assert(res.collateral.balanceOf(liquidator) == cToLiquidator); + assert(res.collateral.balanceOf(sender) == remainningC + senderCBalanceBefore); + vm.stopPrank(); + } + + function testLiquidatable() public { + uint128 debtAmt = 10000e8; + uint256 collateralAmt = 10e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.stopPrank(); + vm.startPrank(deployer); + // update oracle + res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth")); + res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.dai")); + vm.stopPrank(); + + vm.warp(marketConfig.maturity - 1); + (bool isLiquidable,, uint128 maxRepayAmt) = res.gt.getLiquidationInfo(gtId); + assert(isLiquidable); + assert(maxRepayAmt == debtAmt / 2); + + vm.warp(marketConfig.maturity); + (isLiquidable,, maxRepayAmt) = res.gt.getLiquidationInfo(gtId); + assert(isLiquidable); + assert(maxRepayAmt == debtAmt); + + vm.warp(marketConfig.maturity + Constants.LIQUIDATION_WINDOW); + (isLiquidable,, maxRepayAmt) = res.gt.getLiquidationInfo(gtId); + assert(!isLiquidable); + assert(maxRepayAmt == 0); + } + + function testLiquidateWithDecimalsExceed8() public { + uint128 debtAmt = 1e8; + uint256 collateralAmt = 1.01e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.stopPrank(); + vm.startPrank(deployer); + // update oracle + MockPriceFeed.RoundData memory data = JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth"); + data.answer = 1e18; // eth price 1e8 + res.collateralOracle.updateRoundData(data); + data.answer = 1e8; // dai price 1e18 + res.debtOracle.updateRoundData(data); + vm.stopPrank(); + + vm.warp(marketConfig.maturity + 1); + + address liquidator = vm.randomAddress(); + vm.startPrank(liquidator); + + res.debt.mint(liquidator, debtAmt); + res.debt.approve(address(res.gt), debtAmt); + + uint256 senderCBalanceBefore = res.collateral.balanceOf(sender); + StateChecker.MarketState memory state = StateChecker.getMarketState(res); + + vm.expectEmit(); + (uint256 cToLiquidator, uint256 cToTreasurer, uint256 remainningC) = + LoanUtils.calcLiquidationResult(res, debtAmt, collateralAmt, debtAmt); + emit GearingTokenEvents.Liquidate( + gtId, + liquidator, + debtAmt, + true, + abi.encode(cToLiquidator), + abi.encode(cToTreasurer), + abi.encode(remainningC) + ); + + res.gt.liquidate(gtId, debtAmt, true); + state.collateralReserve -= collateralAmt; + state.debtReserve += debtAmt; + StateChecker.checkMarketState(res, state); + + assert(res.collateral.balanceOf(marketConfig.treasurer) == cToTreasurer); + assert(res.collateral.balanceOf(liquidator) == cToLiquidator); + assert(res.collateral.balanceOf(sender) == remainningC + senderCBalanceBefore); + vm.stopPrank(); + } + + function testLiquidateWhenOracleOutdated() public { + uint128 debtAmt = 1000e8; + uint256 collateralAmt = 1e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.stopPrank(); + vm.startPrank(deployer); + MockPriceFeed.RoundData memory peth = JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth"); + MockPriceFeed.RoundData memory pdai = JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.dai"); + peth.updatedAt = block.timestamp - 1; + pdai.updatedAt = block.timestamp - 1; + res.collateralOracle.updateRoundData(peth); + res.debtOracle.updateRoundData(pdai); + + vm.stopPrank(); + + vm.prank(deployer); + res.oracle.submitPendingOracle( + address(res.collateral), IOracle.Oracle(res.collateralOracle, res.collateralOracle, 3600) + ); + res.oracle.acceptPendingOracle(address(res.collateral)); + + vm.warp(block.timestamp + 3600); + address liquidator = vm.randomAddress(); + vm.startPrank(liquidator); + + res.debt.mint(liquidator, debtAmt); + res.debt.approve(address(res.gt), debtAmt); + + vm.expectRevert(abi.encodeWithSelector(IOracle.OracleIsNotWorking.selector, address(res.collateral))); + res.gt.liquidate(gtId, debtAmt, true); + + vm.stopPrank(); + vm.warp(block.timestamp - 1); + vm.prank(liquidator); + res.gt.liquidate(gtId, debtAmt, true); + } + + function testRevertByGtIsSafeWhenLiquidate() public { + uint128 debtAmt = 1000e8; + uint256 collateralAmt = 1e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.stopPrank(); + + address liquidator = vm.randomAddress(); + vm.startPrank(liquidator); + + res.debt.mint(liquidator, debtAmt); + res.debt.approve(address(res.gt), debtAmt); + + vm.expectRevert(abi.encodeWithSelector(GearingTokenErrors.GtIsSafe.selector, gtId)); + res.gt.liquidate(gtId, debtAmt, true); + + vm.stopPrank(); + } + + function testRevertByCanNotLiquidationAfterFinalDeadline() public { + uint256 liquidateTime = marketConfig.maturity + Constants.LIQUIDATION_WINDOW; + uint128 debtAmt = 1000e8; + uint256 collateralAmt = 1e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.stopPrank(); + vm.startPrank(deployer); + // update oracle + res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth")); + res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.dai")); + vm.stopPrank(); + + vm.warp(liquidateTime); + address liquidator = vm.randomAddress(); + vm.startPrank(liquidator); + + res.debt.mint(liquidator, debtAmt); + res.debt.approve(address(res.gt), debtAmt); + + vm.expectRevert( + abi.encodeWithSelector( + GearingTokenErrors.CanNotLiquidationAfterFinalDeadline.selector, + gtId, + marketConfig.maturity + Constants.LIQUIDATION_WINDOW + ) + ); + res.gt.liquidate(gtId, debtAmt, true); + } + + function testRevertByRepayAmtExceedsMaxRepayAmt() public { + uint128 debtAmt = 9000e8; + uint256 collateralAmt = 10e18; + + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.stopPrank(); + vm.startPrank(deployer); + // update oracle + res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth")); + res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.dai")); + vm.stopPrank(); + (bool isLiquidable,, uint128 maxRepayAmt) = res.gt.getLiquidationInfo(gtId); + assert(isLiquidable); + assert(maxRepayAmt == debtAmt / 2); + address liquidator = vm.randomAddress(); + vm.startPrank(liquidator); + + uint128 repayAmt = maxRepayAmt + 1; + res.debt.mint(liquidator, repayAmt); + res.debt.approve(address(res.gt), repayAmt); + + vm.expectRevert( + abi.encodeWithSelector(GearingTokenErrors.RepayAmtExceedsMaxRepayAmt.selector, gtId, repayAmt, maxRepayAmt) + ); + res.gt.liquidate(gtId, repayAmt, true); + + vm.stopPrank(); + } + + function testNoRevertByLtvIncreasedAfterLiquidation(uint128 repayAmt) public { + uint128 debtAmt = 900e8; + vm.assume(repayAmt >= 5e8 && repayAmt <= debtAmt - 5e8); + uint256 collateralAmt = 0.6e18; + vm.startPrank(sender); + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + vm.stopPrank(); + vm.startPrank(deployer); + // update oracle + res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.eth")); + res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_1000_DAI_1.dai")); + vm.stopPrank(); + address liquidator = vm.randomAddress(); + vm.startPrank(liquidator); + + res.debt.mint(liquidator, repayAmt); + res.debt.approve(address(res.gt), repayAmt); + + StateChecker.MarketState memory state = StateChecker.getMarketState(res); + (uint256 cToLiquidator, uint256 cToTreasurer, uint256 remainningC) = + LoanUtils.calcLiquidationResult(res, debtAmt, collateralAmt, repayAmt); + emit GearingTokenEvents.Liquidate( + gtId, + liquidator, + repayAmt, + true, + abi.encode(cToLiquidator), + abi.encode(cToTreasurer), + abi.encode(remainningC) + ); + res.gt.liquidate(gtId, repayAmt, true); + if (repayAmt < debtAmt) { + state.collateralReserve -= (cToLiquidator + cToTreasurer); + } else { + state.collateralReserve -= collateralAmt; + } + state.debtReserve += repayAmt; + StateChecker.checkMarketState(res, state); + + assert(res.collateral.balanceOf(marketConfig.treasurer) == cToTreasurer); + assert(res.collateral.balanceOf(liquidator) == cToLiquidator); + + vm.stopPrank(); + } + + function testFuzzMintGt(uint128 debtAmt, uint128 debtAmt2) public { + uint256 collateralAmt = 1e18; + vm.assume(debtAmt <= 1000e8); + vm.assume(debtAmt2 <= 600e8); + vm.startPrank(sender); + res.collateral.mint(sender, collateralAmt); + bytes memory collateralData = abi.encode(collateralAmt); + res.collateral.approve(address(res.gt), collateralAmt); + (uint256 gtId,) = res.market.issueFt(sender, debtAmt, collateralData); + + res.market.issueFtByExistedGt(sender, debtAmt2, gtId); + vm.stopPrank(); + } + + function testLiquidateZeroDebt() public { + uint256 collateralAmt = 1e18; + uint128 debtAmt = 0; + vm.startPrank(sender); + res.collateral.mint(sender, collateralAmt); + bytes memory collateralData = abi.encode(collateralAmt); + res.collateral.approve(address(res.gt), collateralAmt); + (uint256 gtId,) = res.market.issueFt(sender, debtAmt, collateralData); + vm.stopPrank(); + + address liquidator = vm.randomAddress(); + uint128 repayAmt = 0; + vm.startPrank(liquidator); + vm.expectRevert(abi.encodeWithSelector(GearingTokenErrors.GtIsSafe.selector, gtId)); + res.gt.liquidate(gtId, repayAmt, true); + + vm.warp(marketConfig.maturity); + res.gt.liquidate(gtId, repayAmt, true); + + assertEq(res.collateral.balanceOf(liquidator), 0); + assertEq(res.collateral.balanceOf(marketConfig.treasurer), 0); + assertEq(res.debt.balanceOf(sender), debtAmt); + vm.stopPrank(); + } + + function testRepayZeroDebt() public { + uint256 collateralAmt = 1e18; + uint128 debtAmt = 0; + vm.startPrank(sender); + res.collateral.mint(sender, collateralAmt); + bytes memory collateralData = abi.encode(collateralAmt); + res.collateral.approve(address(res.gt), collateralAmt); + (uint256 gtId,) = res.market.issueFt(sender, debtAmt, collateralData); + + res.gt.repay(gtId, 0, true); + assertEq(res.collateral.balanceOf(sender), collateralAmt); + vm.stopPrank(); + } +} diff --git a/test/v1/LinkedList.t.sol b/test/v1/LinkedList.t.sol new file mode 100644 index 0000000..c3f4e01 --- /dev/null +++ b/test/v1/LinkedList.t.sol @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "forge-std/Test.sol"; +import "contracts/v1/lib/LinkedList.sol"; + +contract LinkedListTest is Test { + using LinkedList for mapping(uint64 => uint64); + + mapping(uint64 => uint64) list; + + function setUp() public { + // Reset list before each test + list[0] = 0; + } + + function testInsertIntoEmptyList() public { + list.insertWhenZeroAsRoot(5); + assertEq(list[0], 5, "First element should be 5"); + assertEq(list[5], 0, "Next element should be 0"); + } + + function testInsertMultipleOrdered() public { + list.insertWhenZeroAsRoot(5); + list.insertWhenZeroAsRoot(3); + list.insertWhenZeroAsRoot(7); + + // Check order: 3 -> 5 -> 7 + assertEq(list[0], 3, "First element should be 3"); + assertEq(list[3], 5, "Second element should be 5"); + assertEq(list[5], 7, "Third element should be 7"); + assertEq(list[7], 0, "Last element should point to 0"); + } + + function testInsertDuplicate() public { + list.insertWhenZeroAsRoot(5); + list.insertWhenZeroAsRoot(5); // Should be ignored + + assertEq(list[0], 5, "First element should still be 5"); + assertEq(list[5], 0, "Should still point to 0"); + } + + function testPopFromEmptyList() public { + list.popWhenZeroAsRoot(); + assertEq(list[0], 0, "Empty list should remain empty"); + } + + function testPopSingleElement() public { + list.insertWhenZeroAsRoot(5); + list.popWhenZeroAsRoot(); + + assertEq(list[0], 0, "List should be empty after pop"); + assertTrue(list[5] == 0, "Popped element should be cleared"); + } + + function testPopFromMultipleElements() public { + list.insertWhenZeroAsRoot(5); + list.insertWhenZeroAsRoot(3); + list.insertWhenZeroAsRoot(7); + + list.popWhenZeroAsRoot(); + + // After popping 3, should be: 5 -> 7 + assertEq(list[0], 5, "New first element should be 5"); + assertEq(list[5], 7, "Second element should be 7"); + assertEq(list[7], 0, "Last element should point to 0"); + assertTrue(list[3] == 0, "Popped element should be cleared"); + } +} diff --git a/test/v1/Market.t.sol b/test/v1/Market.t.sol new file mode 100644 index 0000000..d1d7291 --- /dev/null +++ b/test/v1/Market.t.sol @@ -0,0 +1,415 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "forge-std/Test.sol"; +import {console} from "forge-std/console.sol"; +import {DeployUtils} from "./utils/DeployUtils.sol"; +import {JSONLoader} from "./utils/JSONLoader.sol"; +import {StateChecker} from "./utils/StateChecker.sol"; +import {SwapUtils} from "./utils/SwapUtils.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; +import {IFlashLoanReceiver} from "contracts/v1/IFlashLoanReceiver.sol"; +import {ITermMaxMarket, TermMaxMarket, Constants, MarketEvents, MarketErrors} from "contracts/v1/TermMaxMarket.sol"; +import {ITermMaxOrder, TermMaxOrder, ISwapCallback, OrderEvents} from "contracts/v1/TermMaxOrder.sol"; +import {MockERC20, ERC20} from "contracts/v1/test/MockERC20.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {MockFlashLoanReceiver} from "contracts/v1/test/MockFlashLoanReceiver.sol"; +import {IGearingToken} from "contracts/v1/tokens/IGearingToken.sol"; +import "contracts/v1/storage/TermMaxStorage.sol"; + +contract MarketTest is Test { + using JSONLoader for *; + + DeployUtils.Res res; + + OrderConfig orderConfig; + MarketConfig marketConfig; + + address deployer = vm.randomAddress(); + address maker = vm.randomAddress(); + address sender = vm.randomAddress(); + address treasurer = vm.randomAddress(); + string testdata; + + function setUp() public { + vm.startPrank(deployer); + testdata = vm.readFile(string.concat(vm.projectRoot(), "/test/testdata/testdata.json")); + + uint32 maxLtv = 0.89e8; + uint32 liquidationLtv = 0.9e8; + + marketConfig = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); + orderConfig = JSONLoader.getOrderConfigFromJson(testdata, ".orderConfig"); + res = DeployUtils.deployMarket(deployer, marketConfig, maxLtv, liquidationLtv); + + res.order = + res.market.createOrder(maker, orderConfig.maxXtReserve, ISwapCallback(address(0)), orderConfig.curveCuts); + + vm.warp(vm.parseUint(vm.parseJsonString(testdata, ".currentTime"))); + + // update oracle + res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.eth")); + res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.dai")); + + vm.stopPrank(); + } + + function testUpdateMarketConfig() public { + vm.startPrank(deployer); + marketConfig.treasurer = vm.randomAddress(); + marketConfig.feeConfig.mintGtFeeRatio = 0.02e8; + marketConfig.feeConfig.borrowTakerFeeRatio = 0.03e8; + marketConfig.feeConfig.borrowMakerFeeRatio = 0.04e8; + marketConfig.feeConfig.lendTakerFeeRatio = 0.05e8; + marketConfig.feeConfig.lendMakerFeeRatio = 0.06e8; + + vm.expectEmit(); + emit MarketEvents.UpdateMarketConfig(marketConfig); + res.market.updateMarketConfig(marketConfig); + + assertEq(res.market.config().treasurer, marketConfig.treasurer); + assertEq(res.gt.getGtConfig().treasurer, marketConfig.treasurer); + assertEq(res.market.config().feeConfig.mintGtFeeRatio, marketConfig.feeConfig.mintGtFeeRatio); + assertEq(res.market.config().feeConfig.borrowTakerFeeRatio, marketConfig.feeConfig.borrowTakerFeeRatio); + assertEq(res.market.config().feeConfig.borrowMakerFeeRatio, marketConfig.feeConfig.borrowMakerFeeRatio); + assertEq(res.market.config().feeConfig.lendTakerFeeRatio, marketConfig.feeConfig.lendTakerFeeRatio); + assertEq(res.market.config().feeConfig.lendMakerFeeRatio, marketConfig.feeConfig.lendMakerFeeRatio); + + vm.stopPrank(); + } + + function testUpdateMarketConfigWhenNotOwner() public { + vm.startPrank(sender); + marketConfig.treasurer = vm.randomAddress(); + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, address(sender))); + res.market.updateMarketConfig(marketConfig); + vm.stopPrank(); + } + + function testUpdateOrderConfigInvalidParams() public { + vm.startPrank(deployer); + + MarketConfig memory newConfig = res.market.config(); + newConfig.feeConfig.mintGtFeeRef = uint32(Constants.DECIMAL_BASE * 5 + 1); + vm.expectRevert(abi.encodeWithSelector(MarketErrors.FeeTooHigh.selector)); + res.market.updateMarketConfig(newConfig); + + newConfig.feeConfig.mintGtFeeRef = 0; + newConfig.feeConfig.borrowMakerFeeRatio = uint32(Constants.MAX_FEE_RATIO); + vm.expectRevert(abi.encodeWithSelector(MarketErrors.FeeTooHigh.selector)); + res.market.updateMarketConfig(newConfig); + vm.stopPrank(); + } + + function testMint() public { + vm.startPrank(sender); + uint256 amount = 150e8; + res.debt.mint(sender, amount); + res.debt.approve(address(res.market), amount); + + emit MarketEvents.Mint(sender, sender, amount); + res.market.mint(sender, amount); + + assertEq(res.debt.balanceOf(sender), 0); + assertEq(res.ft.balanceOf(sender), amount); + assertEq(res.xt.balanceOf(sender), amount); + assertEq(res.debt.balanceOf(address(res.market)), amount); + + vm.stopPrank(); + } + + function testMintWhenTermIsNotOpen() public { + vm.startPrank(sender); + uint256 amount = 150e8; + res.debt.mint(sender, amount); + res.debt.approve(address(res.market), amount); + + vm.warp(marketConfig.maturity); + vm.expectRevert(abi.encodeWithSelector(MarketErrors.TermIsNotOpen.selector)); + res.market.mint(sender, amount); + + vm.stopPrank(); + } + + function testBurn() public { + vm.startPrank(sender); + uint256 amount = 150e8; + res.debt.mint(sender, amount); + res.debt.approve(address(res.market), amount); + res.market.mint(sender, amount); + + res.ft.approve(address(res.market), amount); + res.xt.approve(address(res.market), amount); + emit MarketEvents.Burn(sender, sender, amount); + res.market.burn(sender, amount); + assertEq(res.debt.balanceOf(sender), amount); + assertEq(res.ft.balanceOf(sender), 0); + assertEq(res.xt.balanceOf(sender), 0); + assertEq(res.debt.balanceOf(address(res.market)), 0); + vm.stopPrank(); + } + + function testBurnWhenTermIsNotOpen() public { + vm.startPrank(sender); + uint256 amount = 150e8; + res.debt.mint(sender, amount); + res.debt.approve(address(res.market), amount); + vm.warp(marketConfig.maturity); + vm.expectRevert(abi.encodeWithSelector(MarketErrors.TermIsNotOpen.selector)); + res.market.burn(sender, amount); + vm.stopPrank(); + } + + function testIssueFt() public { + vm.startPrank(sender); + uint128 debtAmt = 1000e8; + res.debt.mint(sender, debtAmt); + res.debt.approve(address(res.market), debtAmt); + res.market.mint(sender, debtAmt); + + uint256 fee = (res.market.mintGtFeeRatio() * debtAmt) / Constants.DECIMAL_BASE; + uint256 collateralAmt = 1e18; + res.collateral.mint(sender, collateralAmt); + res.collateral.approve(address(res.gt), collateralAmt); + vm.expectEmit(); + emit MarketEvents.IssueFt( + sender, sender, 1, debtAmt, uint128(debtAmt - fee), uint128(fee), abi.encode(collateralAmt) + ); + (uint256 gtId, uint128 ftOutAmt) = res.market.issueFt(sender, debtAmt, abi.encode(collateralAmt)); + + assertEq(gtId, 1); + assertEq(res.debt.balanceOf(sender), 0); + assertEq(debtAmt - fee, ftOutAmt); + assertEq(res.ft.balanceOf(sender), ftOutAmt + debtAmt); + assertEq(res.collateral.balanceOf(address(res.gt)), collateralAmt); + assertEq(res.debt.balanceOf(address(res.market)), debtAmt); + + (address owner, uint128 dAmt, bytes memory collateralData) = res.gt.loanInfo(gtId); + assertEq(owner, sender); + assertEq(dAmt, debtAmt); + + assertEq(abi.decode(collateralData, (uint256)), collateralAmt); + + vm.stopPrank(); + } + + function testIssueFtByExistGt() public { + vm.startPrank(sender); + uint128 debtAmt = 1000e8; + + uint256 collateralAmt = 1e18; + res.collateral.mint(sender, collateralAmt); + res.collateral.approve(address(res.gt), collateralAmt); + (uint256 gtId, uint128 ftOutAmt) = res.market.issueFt(sender, debtAmt, abi.encode(collateralAmt)); + + uint128 debtAmt2 = debtAmt / 2; + uint256 fee = (res.market.mintGtFeeRatio() * debtAmt2) / Constants.DECIMAL_BASE; + vm.expectEmit(); + emit MarketEvents.IssueFtByExistedGt(sender, sender, gtId, debtAmt2, uint128(debtAmt2 - fee), uint128(fee)); + uint256 ftOutAmt2 = res.market.issueFtByExistedGt(sender, debtAmt2, gtId); + + assertEq(res.ft.balanceOf(sender), ftOutAmt + ftOutAmt2); + (address owner, uint128 dAmt, bytes memory collateralData) = res.gt.loanInfo(gtId); + assertEq(owner, sender); + assertEq(dAmt, debtAmt + debtAmt2); + assertEq(abi.decode(collateralData, (uint256)), collateralAmt); + vm.stopPrank(); + } + + function testIssueFtByExistedGtWhenTermIsNotOpen() public { + vm.startPrank(sender); + uint128 debtAmt = 1000e8; + + vm.warp(marketConfig.maturity); + vm.expectRevert(abi.encodeWithSelector(MarketErrors.TermIsNotOpen.selector)); + res.market.issueFtByExistedGt(sender, debtAmt, 1); + vm.stopPrank(); + } + + function testIssueFtWhenTermIsNotOpen() public { + vm.startPrank(sender); + uint128 debtAmt = 1000e8; + + vm.warp(marketConfig.maturity); + vm.expectRevert(abi.encodeWithSelector(MarketErrors.TermIsNotOpen.selector)); + res.market.issueFt(sender, debtAmt, abi.encode(1e18)); + vm.stopPrank(); + } + + function testLeverage() public { + uint128 xtAmt = 1000e8; + uint256 collateralAmt = 1e18; + vm.startPrank(deployer); + res.debt.mint(deployer, xtAmt); + res.debt.approve(address(res.market), xtAmt); + res.market.mint(deployer, xtAmt); + res.xt.transfer(sender, xtAmt); + vm.stopPrank(); + + vm.startPrank(sender); + MockFlashLoanReceiver receiver = new MockFlashLoanReceiver(res.market); + res.xt.approve(address(receiver), xtAmt); + + res.collateral.mint(address(receiver), collateralAmt); + + uint256 debtAmt = xtAmt * Constants.DECIMAL_BASE / (Constants.DECIMAL_BASE - res.market.mintGtFeeRatio()); + + vm.expectEmit(); + emit MarketEvents.LeverageByXt( + address(receiver), sender, 1, uint128(debtAmt), xtAmt, uint128(debtAmt - xtAmt), abi.encode(collateralAmt) + ); + receiver.leverageByXt(xtAmt, abi.encode(sender, collateralAmt)); + + assertEq(res.debt.balanceOf(sender), 0); + assertEq(res.debt.balanceOf(address(res.market)), 0); + assertEq(res.debt.balanceOf(address(receiver)), xtAmt); + assertEq(res.xt.balanceOf(sender), 0); + + (address owner, uint128 dAmt, bytes memory collateralData) = res.gt.loanInfo(1); + assertEq(owner, sender); + + assertEq(dAmt, uint128(debtAmt)); + + assertEq(abi.decode(collateralData, (uint256)), collateralAmt); + + vm.stopPrank(); + } + + function testLeverageWhenTermIsNotOpen() public { + uint128 debtAmt = 1000e8; + uint256 collateralAmt = 1e18; + vm.startPrank(deployer); + res.debt.mint(deployer, debtAmt); + res.debt.approve(address(res.market), debtAmt); + res.market.mint(deployer, debtAmt); + res.xt.transfer(sender, debtAmt); + vm.stopPrank(); + + vm.startPrank(sender); + MockFlashLoanReceiver receiver = new MockFlashLoanReceiver(res.market); + res.xt.approve(address(receiver), debtAmt); + + vm.warp(marketConfig.maturity); + vm.expectRevert(abi.encodeWithSelector(MarketErrors.TermIsNotOpen.selector)); + receiver.leverageByXt(debtAmt, abi.encode(sender, collateralAmt)); + vm.stopPrank(); + } + + function testCreateOrder() public { + vm.startPrank(sender); + + vm.expectEmit(); + emit OrderEvents.OrderInitialized( + res.market, sender, orderConfig.maxXtReserve, ISwapCallback(address(0)), orderConfig.curveCuts + ); + ITermMaxOrder order = + res.market.createOrder(sender, orderConfig.maxXtReserve, ISwapCallback(address(0)), orderConfig.curveCuts); + assertEq(address(order.market()), address(res.market)); + assertEq(Ownable(address(order)).owner(), sender); + assertEq(order.orderConfig().maxXtReserve, orderConfig.maxXtReserve); + assertEq(order.maker(), sender); + + vm.stopPrank(); + } + + function testCreateOrderWhenTermIsNotOpen() public { + vm.startPrank(sender); + vm.warp(marketConfig.maturity); + vm.expectRevert(abi.encodeWithSelector(MarketErrors.TermIsNotOpen.selector)); + res.market.createOrder(sender, orderConfig.maxXtReserve, ISwapCallback(address(0)), orderConfig.curveCuts); + vm.stopPrank(); + } + + function testRedeem() public { + address bob = vm.randomAddress(); + address alice = vm.randomAddress(); + + uint128 depositAmt = 1000e8; + uint128 debtAmt = 100e8; + uint256 collateralAmt = 1e18; + + vm.startPrank(bob); + res.debt.mint(bob, depositAmt); + res.debt.approve(address(res.market), depositAmt); + res.market.mint(bob, depositAmt); + + res.xt.transfer(alice, debtAmt); + vm.stopPrank(); + + vm.startPrank(alice); + + MockFlashLoanReceiver receiver = new MockFlashLoanReceiver(res.market); + res.collateral.mint(address(receiver), collateralAmt); + + res.xt.approve(address(receiver), debtAmt); + receiver.leverageByXt(debtAmt, abi.encode(alice, collateralAmt)); + uint128 leverageFee = + uint128(debtAmt * Constants.DECIMAL_BASE / (Constants.DECIMAL_BASE - res.market.mintGtFeeRatio())) - debtAmt; + vm.stopPrank(); + + vm.warp(marketConfig.maturity + Constants.LIQUIDATION_WINDOW); + + vm.startPrank(bob); + res.ft.approve(address(res.market), depositAmt); + + (uint256 expectDebt, bytes memory collateralData) = res.market.previewRedeem(depositAmt); + vm.expectEmit(); + uint128 proportion = uint128(Constants.DECIMAL_BASE_SQ) * depositAmt / (depositAmt + leverageFee); + emit MarketEvents.Redeem(bob, bob, proportion, uint128(expectDebt), collateralData); + res.market.redeem(depositAmt, bob); + uint256 expectCollateral = abi.decode(collateralData, (uint256)); + + assertEq(res.debt.balanceOf(bob), expectDebt); + assertEq(res.collateral.balanceOf(bob), expectCollateral); + assertEq(res.debt.balanceOf(address(res.market)), (depositAmt - debtAmt) - expectDebt); + assertEq(res.collateral.balanceOf(address(res.gt)), collateralAmt - expectCollateral); + assertEq(res.ft.balanceOf(bob), 0); + vm.stopPrank(); + } + + function testRedeemBeforeDeadline() public { + uint128 depositAmt = 1000e8; + + vm.startPrank(sender); + res.debt.mint(sender, depositAmt); + res.debt.approve(address(res.market), depositAmt); + res.market.mint(sender, depositAmt); + + res.ft.approve(address(res.market), depositAmt); + uint256 deadline = marketConfig.maturity + Constants.LIQUIDATION_WINDOW; + vm.warp(deadline - 1); + vm.expectRevert( + abi.encodeWithSelector(MarketErrors.CanNotRedeemBeforeFinalLiquidationDeadline.selector, deadline) + ); + res.market.redeem(depositAmt, sender); + + vm.warp(marketConfig.maturity - 1); + vm.expectRevert( + abi.encodeWithSelector(MarketErrors.CanNotRedeemBeforeFinalLiquidationDeadline.selector, deadline) + ); + res.market.redeem(depositAmt, sender); + + vm.stopPrank(); + } + + function testFuzzIssueFtByExistedGtDebtAmount(uint128 issueAmount) public { + vm.assume(issueAmount >= 1); + vm.assume(issueAmount <= type(uint64).max); + + uint128 debt = + uint128((issueAmount * Constants.DECIMAL_BASE) / (Constants.DECIMAL_BASE - res.market.mintGtFeeRatio())); + + vm.startPrank(sender); + + uint256 collateralAmt = type(uint128).max; + bytes memory collateralData = abi.encode(collateralAmt); + res.collateral.mint(sender, collateralAmt); + res.collateral.approve(address(res.gt), collateralAmt); + res.market.issueFt(sender, issueAmount, collateralData); + + uint128 ftOutAmt = res.market.issueFtByExistedGt(sender, debt, 1); + assertTrue(ftOutAmt == issueAmount); + vm.stopPrank(); + } +} diff --git a/test/v1/OracleAggregator.t.sol b/test/v1/OracleAggregator.t.sol new file mode 100644 index 0000000..c19d0c6 --- /dev/null +++ b/test/v1/OracleAggregator.t.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {Test} from "forge-std/Test.sol"; +import {OracleAggregator} from "contracts/v1/oracle/OracleAggregator.sol"; +import {AggregatorV3Interface, IOracle} from "contracts/v1/oracle/IOracle.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; + +contract OracleAggregatorTest is Test { + OracleAggregator public oracleAggregator; + MockPriceFeed public primaryFeed; + MockPriceFeed public backupFeed; + + address public constant OWNER = address(0x1); + address public constant ASSET = address(0x2); + uint256 public constant TIMELOCK = 1 days; + uint32 public constant HEARTBEAT = 1 hours; + + // Price feed configuration + uint8 public constant DECIMALS = 8; + int256 public constant INITIAL_PRICE = 3000e8; + + function setUp() public { + // Deploy mock price feeds + primaryFeed = new MockPriceFeed(OWNER); + backupFeed = new MockPriceFeed(OWNER); + + // Set initial price data + MockPriceFeed.RoundData memory roundData = MockPriceFeed.RoundData({ + roundId: 1, + answer: INITIAL_PRICE, + startedAt: block.timestamp, + updatedAt: block.timestamp, + answeredInRound: 1 + }); + + vm.startPrank(OWNER); + primaryFeed.updateRoundData(roundData); + backupFeed.updateRoundData(roundData); + vm.stopPrank(); + + // Deploy OracleAggregator with owner and timelock + vm.prank(OWNER); + oracleAggregator = new OracleAggregator(OWNER, TIMELOCK); + } + + function test_SubmitPendingOracle() public { + IOracle.Oracle memory oracle = + IOracle.Oracle({aggregator: primaryFeed, backupAggregator: backupFeed, heartbeat: HEARTBEAT}); + + vm.prank(OWNER); + oracleAggregator.submitPendingOracle(ASSET, oracle); + + (AggregatorV3Interface aggregator, AggregatorV3Interface backupAgg, uint32 heartbeat) = + oracleAggregator.oracles(ASSET); + assertEq(address(aggregator), address(0), "Oracle should not be set yet"); + assertEq(address(backupAgg), address(0), "Backup oracle should not be set yet"); + assertEq(heartbeat, 0, "Heartbeat should not be set yet"); + + (IOracle.Oracle memory pendingOracle, uint64 validAt) = oracleAggregator.pendingOracles(ASSET); + assertEq(address(pendingOracle.aggregator), address(primaryFeed)); + assertEq(address(pendingOracle.backupAggregator), address(backupFeed)); + assertEq(pendingOracle.heartbeat, HEARTBEAT); + assertEq(validAt, block.timestamp + TIMELOCK); + } + + function test_AcceptPendingOracle() public { + // Submit pending oracle + IOracle.Oracle memory oracle = + IOracle.Oracle({aggregator: primaryFeed, backupAggregator: backupFeed, heartbeat: HEARTBEAT}); + + vm.prank(OWNER); + oracleAggregator.submitPendingOracle(ASSET, oracle); + + // Warp time past timelock + vm.warp(block.timestamp + TIMELOCK + 1); + + oracleAggregator.acceptPendingOracle(ASSET); + + (AggregatorV3Interface aggregator, AggregatorV3Interface backupAgg, uint32 heartbeat) = + oracleAggregator.oracles(ASSET); + assertEq(address(aggregator), address(primaryFeed)); + assertEq(address(backupAgg), address(backupFeed)); + assertEq(heartbeat, HEARTBEAT); + + // Verify pending oracle is cleared + (IOracle.Oracle memory pendingOracle, uint64 validAt) = oracleAggregator.pendingOracles(ASSET); + assertEq(address(pendingOracle.aggregator), address(0)); + assertEq(address(pendingOracle.backupAggregator), address(0)); + assertEq(pendingOracle.heartbeat, 0); + assertEq(validAt, 0); + } + + function test_GetPrice_PrimaryOracle() public { + // Setup oracle + IOracle.Oracle memory oracle = + IOracle.Oracle({aggregator: primaryFeed, backupAggregator: backupFeed, heartbeat: HEARTBEAT}); + + vm.startPrank(OWNER); + oracleAggregator.submitPendingOracle(ASSET, oracle); + vm.warp(block.timestamp + TIMELOCK + 1); + vm.stopPrank(); + + oracleAggregator.acceptPendingOracle(ASSET); + + // Update primary oracle timestamp to match current time + MockPriceFeed.RoundData memory roundData = MockPriceFeed.RoundData({ + roundId: 1, + answer: INITIAL_PRICE, + startedAt: block.timestamp, + updatedAt: block.timestamp, + answeredInRound: 1 + }); + vm.prank(OWNER); + primaryFeed.updateRoundData(roundData); + + // Get price + (uint256 price, uint8 decimals) = oracleAggregator.getPrice(ASSET); + assertEq(price, uint256(INITIAL_PRICE)); + assertEq(decimals, DECIMALS); + } + + function test_GetPrice_FallbackToBackup() public { + // Setup oracle + IOracle.Oracle memory oracle = + IOracle.Oracle({aggregator: primaryFeed, backupAggregator: backupFeed, heartbeat: HEARTBEAT}); + + vm.startPrank(OWNER); + oracleAggregator.submitPendingOracle(ASSET, oracle); + vm.warp(block.timestamp + TIMELOCK + 1); + vm.stopPrank(); + + oracleAggregator.acceptPendingOracle(ASSET); + + // Make primary oracle stale + vm.warp(block.timestamp + HEARTBEAT + 1); + + // Update backup price + int256 backupPrice = 3100e8; + MockPriceFeed.RoundData memory roundData = MockPriceFeed.RoundData({ + roundId: 2, + answer: backupPrice, + startedAt: block.timestamp, + updatedAt: block.timestamp, + answeredInRound: 2 + }); + vm.prank(OWNER); + backupFeed.updateRoundData(roundData); + + // Get price - should use backup + (uint256 price, uint8 decimals) = oracleAggregator.getPrice(ASSET); + assertEq(price, uint256(backupPrice)); + assertEq(decimals, DECIMALS); + } + + function test_RevertGetPrice_BothOraclesStale() public { + // Setup oracle + IOracle.Oracle memory oracle = + IOracle.Oracle({aggregator: primaryFeed, backupAggregator: backupFeed, heartbeat: HEARTBEAT}); + + vm.startPrank(OWNER); + oracleAggregator.submitPendingOracle(ASSET, oracle); + vm.warp(block.timestamp + TIMELOCK + 1); + vm.stopPrank(); + + oracleAggregator.acceptPendingOracle(ASSET); + + // Make both oracles stale + vm.warp(block.timestamp + HEARTBEAT + 1); + + vm.expectRevert(abi.encodeWithSignature("OracleIsNotWorking(address)", ASSET)); + // Should revert + oracleAggregator.getPrice(ASSET); + } + + function test_RevertSubmitPendingOracle_NotOwner() public { + IOracle.Oracle memory oracle = + IOracle.Oracle({aggregator: primaryFeed, backupAggregator: backupFeed, heartbeat: HEARTBEAT}); + + vm.prank(address(0x3)); + vm.expectRevert(abi.encodeWithSignature("OwnableUnauthorizedAccount(address)", address(0x3))); + oracleAggregator.submitPendingOracle(ASSET, oracle); + } + + function test_RevertAcceptPendingOracle_BeforeTimelock() public { + // Submit pending oracle + IOracle.Oracle memory oracle = + IOracle.Oracle({aggregator: primaryFeed, backupAggregator: backupFeed, heartbeat: HEARTBEAT}); + + vm.prank(OWNER); + oracleAggregator.submitPendingOracle(ASSET, oracle); + vm.expectRevert(abi.encodeWithSignature("TimelockNotElapsed()")); + // Try to accept before timelock expires + oracleAggregator.acceptPendingOracle(ASSET); + } + + function test_RemoveOracle() public { + // First add an oracle + IOracle.Oracle memory oracle = + IOracle.Oracle({aggregator: primaryFeed, backupAggregator: backupFeed, heartbeat: HEARTBEAT}); + + vm.startPrank(OWNER); + oracleAggregator.submitPendingOracle(ASSET, oracle); + vm.warp(block.timestamp + TIMELOCK + 1); + vm.stopPrank(); + + oracleAggregator.acceptPendingOracle(ASSET); + + // Now remove it by submitting empty oracle + vm.prank(OWNER); + oracleAggregator.submitPendingOracle( + ASSET, + IOracle.Oracle({ + aggregator: AggregatorV3Interface(address(0)), + backupAggregator: AggregatorV3Interface(address(0)), + heartbeat: 0 + }) + ); + + // Verify oracle is removed + (AggregatorV3Interface aggregator, AggregatorV3Interface backupAgg, uint32 heartbeat) = + oracleAggregator.oracles(ASSET); + assertEq(address(aggregator), address(0)); + assertEq(address(backupAgg), address(0)); + assertEq(heartbeat, 0); + } +} diff --git a/test/v1/Order.t.sol b/test/v1/Order.t.sol new file mode 100644 index 0000000..72e87b1 --- /dev/null +++ b/test/v1/Order.t.sol @@ -0,0 +1,847 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "forge-std/Test.sol"; +import {console} from "forge-std/console.sol"; +import {DeployUtils} from "./utils/DeployUtils.sol"; +import {LoanUtils} from "./utils/LoanUtils.sol"; +import {JSONLoader} from "./utils/JSONLoader.sol"; +import {StateChecker} from "./utils/StateChecker.sol"; +import {SwapUtils} from "./utils/SwapUtils.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; +import {IFlashLoanReceiver} from "contracts/v1/IFlashLoanReceiver.sol"; +import {ITermMaxMarket, TermMaxMarket, Constants, MarketEvents, MarketErrors} from "contracts/v1/TermMaxMarket.sol"; +import {ITermMaxOrder, TermMaxOrder, ISwapCallback, OrderEvents, OrderErrors} from "contracts/v1/TermMaxOrder.sol"; +import {MockERC20, ERC20} from "contracts/v1/test/MockERC20.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {MockFlashLoanReceiver} from "contracts/v1/test/MockFlashLoanReceiver.sol"; +import {IGearingToken} from "contracts/v1/tokens/IGearingToken.sol"; +import "contracts/v1/storage/TermMaxStorage.sol"; + +contract OrderTest is Test { + using JSONLoader for *; + using SafeCast for *; + + DeployUtils.Res res; + + OrderConfig orderConfig; + MarketConfig marketConfig; + + address deployer = vm.randomAddress(); + address maker = vm.randomAddress(); + address sender = vm.randomAddress(); + address treasurer = vm.randomAddress(); + string testdata; + + function setUp() public { + vm.startPrank(deployer); + testdata = vm.readFile(string.concat(vm.projectRoot(), "/test/testdata/testdata.json")); + + uint32 maxLtv = 0.89e8; + uint32 liquidationLtv = 0.9e8; + + marketConfig = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); + orderConfig = JSONLoader.getOrderConfigFromJson(testdata, ".orderConfig"); + + res = DeployUtils.deployMarket(deployer, marketConfig, maxLtv, liquidationLtv); + + res.order = + res.market.createOrder(maker, orderConfig.maxXtReserve, ISwapCallback(address(0)), orderConfig.curveCuts); + + vm.warp(vm.parseUint(vm.parseJsonString(testdata, ".currentTime"))); + + // update oracle + res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.eth")); + res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.dai")); + + uint256 amount = 150e8; + res.debt.mint(deployer, amount); + res.debt.approve(address(res.market), amount); + res.market.mint(deployer, amount); + res.ft.transfer(address(res.order), amount); + res.xt.transfer(address(res.order), amount); + + vm.stopPrank(); + } + + function testInvalidCurveCuts() public { + vm.startPrank(maker); + { + OrderConfig memory newOrderConfig = orderConfig; + newOrderConfig.curveCuts.lendCurveCuts[0].offset = 0; + vm.expectRevert(abi.encodeWithSelector(OrderErrors.InvalidCurveCuts.selector)); + res.order.updateOrder(newOrderConfig, 0, 0); + } + + { + OrderConfig memory newOrderConfig = orderConfig; + newOrderConfig.curveCuts.borrowCurveCuts[0].offset = 0; + vm.expectRevert(abi.encodeWithSelector(OrderErrors.InvalidCurveCuts.selector)); + res.order.updateOrder(newOrderConfig, 0, 0); + } + + { + OrderConfig memory newOrderConfig = orderConfig; + newOrderConfig.curveCuts.borrowCurveCuts[1].offset = 0; + vm.expectRevert(abi.encodeWithSelector(OrderErrors.InvalidCurveCuts.selector)); + res.order.updateOrder(newOrderConfig, 0, 0); + } + + vm.stopPrank(); + } + + function testBuyFt() public { + vm.startPrank(sender); + + uint128 underlyingAmtIn = 100e8; + uint128 minTokenOut = 0e8; + res.debt.mint(sender, underlyingAmtIn); + res.debt.approve(address(res.order), underlyingAmtIn); + + uint256 actualOut = vm.parseUint(vm.parseJsonString(testdata, ".expected.testBuyFt.output.netOut")); + uint256 fee = vm.parseUint(vm.parseJsonString(testdata, ".expected.testBuyFt.output.fee")); + StateChecker.OrderState memory expectedState = + JSONLoader.getOrderStateFromJson(testdata, ".expected.testBuyFt.contractState"); + vm.expectEmit(); + emit OrderEvents.SwapExactTokenToToken( + res.debt, res.ft, sender, sender, underlyingAmtIn, uint128(actualOut), uint128(fee) + ); + uint256 netOut = res.order.swapExactTokenToToken( + res.debt, res.ft, sender, underlyingAmtIn, minTokenOut, block.timestamp + 1 hours + ); + + StateChecker.checkOrderState(res, expectedState); + + assert(netOut == actualOut); + assert(res.ft.balanceOf(sender) == netOut); + + vm.stopPrank(); + } + + function testBuyFtMinTokenOut() public { + vm.startPrank(sender); + + uint128 expectedNetOut = + uint128(vm.parseUint(vm.parseJsonString(testdata, ".expected.testBuyFt.output.netOut"))); + uint128 underlyingAmtIn = 100e8; + uint128 minTokenOut = expectedNetOut + 1; + + res.debt.mint(sender, underlyingAmtIn); + res.debt.approve(address(res.order), underlyingAmtIn); + vm.expectRevert(abi.encodeWithSelector(OrderErrors.UnexpectedAmount.selector, minTokenOut, expectedNetOut)); + res.order.swapExactTokenToToken( + res.debt, res.ft, sender, underlyingAmtIn, minTokenOut, block.timestamp + 1 hours + ); + + vm.stopPrank(); + } + + function testSwapTokenWhenTermIsNotOpen() public { + vm.startPrank(sender); + + uint128 underlyingAmtIn = 100e8; + uint128 minTokenOut = 0e8; + + res.debt.mint(sender, underlyingAmtIn); + res.debt.approve(address(res.order), underlyingAmtIn); + + vm.warp(res.market.config().maturity); + vm.expectRevert(abi.encodeWithSelector(OrderErrors.TermIsNotOpen.selector)); + res.order.swapExactTokenToToken( + res.debt, res.ft, sender, underlyingAmtIn, minTokenOut, block.timestamp + 1 hours + ); + + vm.stopPrank(); + } + + function testBuyXt() public { + vm.startPrank(sender); + + uint128 underlyingAmtIn = 5e8; + uint128 minTokenOut = 0e8; + res.debt.mint(sender, underlyingAmtIn); + res.debt.approve(address(res.order), underlyingAmtIn); + + uint256 actualOut = vm.parseUint(vm.parseJsonString(testdata, ".expected.testBuyXt.output.netOut")); + uint256 fee = vm.parseUint(vm.parseJsonString(testdata, ".expected.testBuyXt.output.fee")); + StateChecker.OrderState memory expectedState = + JSONLoader.getOrderStateFromJson(testdata, ".expected.testBuyXt.contractState"); + vm.expectEmit(); + emit OrderEvents.SwapExactTokenToToken( + res.debt, res.xt, sender, sender, underlyingAmtIn, uint128(actualOut), uint128(fee) + ); + uint256 netOut = res.order.swapExactTokenToToken( + res.debt, res.xt, sender, underlyingAmtIn, minTokenOut, block.timestamp + 1 hours + ); + + StateChecker.checkOrderState(res, expectedState); + + assert(netOut == actualOut); + assert(res.xt.balanceOf(sender) == netOut); + + vm.stopPrank(); + } + + function testBuyXtMinTokenOut() public { + vm.startPrank(sender); + + uint128 expectedNetOut = + uint128(vm.parseUint(vm.parseJsonString(testdata, ".expected.testBuyXt.output.netOut"))); + uint128 underlyingAmtIn = 5e8; + uint128 minTokenOut = expectedNetOut + 1; + + res.debt.mint(sender, underlyingAmtIn); + res.debt.approve(address(res.order), underlyingAmtIn); + vm.expectRevert(abi.encodeWithSelector(OrderErrors.UnexpectedAmount.selector, minTokenOut, expectedNetOut)); + res.order.swapExactTokenToToken( + res.debt, res.xt, sender, underlyingAmtIn, minTokenOut, block.timestamp + 1 hours + ); + + vm.stopPrank(); + } + + function testSellFt() public { + vm.startPrank(sender); + + uint128 underlyingAmtInForBuyFt = 100e8; + uint128 minFtOut = 0e8; + res.debt.mint(sender, underlyingAmtInForBuyFt); + res.debt.approve(address(res.order), underlyingAmtInForBuyFt); + uint128 ftAmtIn = uint128( + res.order.swapExactTokenToToken( + res.debt, res.ft, sender, underlyingAmtInForBuyFt, minFtOut, block.timestamp + 1 hours + ) + ); + uint128 minTokenOut = 0e8; + res.ft.approve(address(res.order), ftAmtIn); + + uint256 actualOut = vm.parseUint(vm.parseJsonString(testdata, ".expected.testSellFt.output.netOut")); + uint256 fee = vm.parseUint(vm.parseJsonString(testdata, ".expected.testSellFt.output.fee")); + StateChecker.OrderState memory expectedState = + JSONLoader.getOrderStateFromJson(testdata, ".expected.testSellFt.contractState"); + vm.expectEmit(); + emit OrderEvents.SwapExactTokenToToken( + res.ft, res.debt, sender, sender, ftAmtIn, uint128(actualOut), uint128(fee) + ); + uint256 netOut = + res.order.swapExactTokenToToken(res.ft, res.debt, sender, ftAmtIn, minTokenOut, block.timestamp + 1 hours); + + StateChecker.checkOrderState(res, expectedState); + + assert(netOut == actualOut); + assert(res.ft.balanceOf(sender) == 0); + assert(res.debt.balanceOf(sender) == netOut); + + vm.stopPrank(); + } + + function testSellFtMinTokenOut() public { + vm.startPrank(sender); + + uint128 expectedNetOut = + uint128(vm.parseUint(vm.parseJsonString(testdata, ".expected.testSellFt.output.netOut"))); + uint128 underlyingAmtInForBuyFt = 100e8; + uint128 minFtOut = 0e8; + res.debt.mint(sender, underlyingAmtInForBuyFt); + res.debt.approve(address(res.order), underlyingAmtInForBuyFt); + uint128 ftAmtIn = uint128( + res.order.swapExactTokenToToken( + res.debt, res.ft, sender, underlyingAmtInForBuyFt, minFtOut, block.timestamp + 1 hours + ) + ); + uint128 minTokenOut = expectedNetOut + 1; + + res.ft.approve(address(res.order), ftAmtIn); + vm.expectRevert(abi.encodeWithSelector(OrderErrors.UnexpectedAmount.selector, minTokenOut, expectedNetOut)); + res.order.swapExactTokenToToken(res.ft, res.debt, sender, ftAmtIn, minTokenOut, block.timestamp + 1 hours); + + vm.stopPrank(); + } + + function testSellXt() public { + vm.startPrank(sender); + + uint128 underlyingAmtInForBuyXt = 5e8; + uint128 minXTOut = 0e8; + res.debt.mint(sender, underlyingAmtInForBuyXt); + res.debt.approve(address(res.order), underlyingAmtInForBuyXt); + uint128 xtAmtIn = uint128( + res.order.swapExactTokenToToken( + res.debt, res.xt, sender, underlyingAmtInForBuyXt, minXTOut, block.timestamp + 1 hours + ) + ); + uint128 minTokenOut = 0e8; + res.xt.approve(address(res.order), xtAmtIn); + + uint256 actualOut = vm.parseUint(vm.parseJsonString(testdata, ".expected.testSellXt.output.netOut")); + uint256 fee = vm.parseUint(vm.parseJsonString(testdata, ".expected.testSellXt.output.fee")); + StateChecker.OrderState memory expectedState = + JSONLoader.getOrderStateFromJson(testdata, ".expected.testSellXt.contractState"); + vm.expectEmit(); + emit OrderEvents.SwapExactTokenToToken( + res.xt, res.debt, sender, sender, xtAmtIn, uint128(actualOut), uint128(fee) + ); + uint256 netOut = + res.order.swapExactTokenToToken(res.xt, res.debt, sender, xtAmtIn, minTokenOut, block.timestamp + 1 hours); + + StateChecker.checkOrderState(res, expectedState); + + assert(netOut == actualOut); + assert(res.xt.balanceOf(sender) == 0); + assert(res.debt.balanceOf(sender) == netOut); + + vm.stopPrank(); + } + + function testSellXtMinTokenOut() public { + vm.startPrank(sender); + + uint128 expectedNetOut = + uint128(vm.parseUint(vm.parseJsonString(testdata, ".expected.testSellXt.output.netOut"))); + uint128 underlyingAmtInForBuyXt = 5e8; + uint128 minXtOut = 0e8; + res.debt.mint(sender, underlyingAmtInForBuyXt); + res.debt.approve(address(res.order), underlyingAmtInForBuyXt); + uint128 xtAmtIn = uint128( + res.order.swapExactTokenToToken( + res.debt, res.xt, sender, underlyingAmtInForBuyXt, minXtOut, block.timestamp + 1 hours + ) + ); + uint128 minTokenOut = expectedNetOut + 1; + + res.xt.approve(address(res.order), xtAmtIn); + vm.expectRevert(abi.encodeWithSelector(OrderErrors.UnexpectedAmount.selector, minTokenOut, expectedNetOut)); + res.order.swapExactTokenToToken(res.xt, res.debt, sender, xtAmtIn, minTokenOut, block.timestamp + 1 hours); + + vm.stopPrank(); + } + + function testBuyExactFt() public { + vm.startPrank(sender); + uint128 ftOutAmt = 100e8; + uint128 maxTokenIn = 100e8; + res.debt.mint(sender, maxTokenIn); + res.debt.approve(address(res.order), maxTokenIn); + + uint256 actualIn = vm.parseUint(vm.parseJsonString(testdata, ".expected.testBuyExactFt.output.netOut")); + uint256 fee = vm.parseUint(vm.parseJsonString(testdata, ".expected.testBuyExactFt.output.fee")); + StateChecker.OrderState memory expectedState = + JSONLoader.getOrderStateFromJson(testdata, ".expected.testBuyExactFt.contractState"); + vm.expectEmit(); + emit OrderEvents.SwapTokenToExactToken( + res.debt, res.ft, sender, sender, ftOutAmt, uint128(actualIn), uint128(fee) + ); + uint256 netIn = + res.order.swapTokenToExactToken(res.debt, res.ft, sender, ftOutAmt, maxTokenIn, block.timestamp + 1 hours); + + StateChecker.checkOrderState(res, expectedState); + + assert(netIn < maxTokenIn); + assert(res.ft.balanceOf(sender) == ftOutAmt); + assert(res.debt.balanceOf(sender) == maxTokenIn - netIn); + + vm.stopPrank(); + } + + function testBuyExactXt() public { + vm.startPrank(sender); + uint128 xtOutAmt = 100e8; + uint128 maxTokenIn = 100e8; + res.debt.mint(sender, maxTokenIn); + res.debt.approve(address(res.order), maxTokenIn); + + uint256 actualIn = vm.parseUint(vm.parseJsonString(testdata, ".expected.testBuyExactXt.output.netOut")); + uint256 fee = vm.parseUint(vm.parseJsonString(testdata, ".expected.testBuyExactXt.output.fee")); + StateChecker.OrderState memory expectedState = + JSONLoader.getOrderStateFromJson(testdata, ".expected.testBuyExactXt.contractState"); + vm.expectEmit(); + emit OrderEvents.SwapTokenToExactToken( + res.debt, res.xt, sender, sender, xtOutAmt, uint128(actualIn), uint128(fee) + ); + uint256 netIn = + res.order.swapTokenToExactToken(res.debt, res.xt, sender, xtOutAmt, maxTokenIn, block.timestamp + 1 hours); + + StateChecker.checkOrderState(res, expectedState); + + assert(netIn < maxTokenIn); + assert(res.xt.balanceOf(sender) == xtOutAmt); + assert(res.debt.balanceOf(sender) == maxTokenIn - netIn); + vm.stopPrank(); + } + + function testSellFtForExactToken() public { + vm.startPrank(sender); + + uint128 underlyingAmtInForBuyFt = 100e8; + uint128 minFtOut = 0e8; + res.debt.mint(sender, underlyingAmtInForBuyFt); + res.debt.approve(address(res.order), underlyingAmtInForBuyFt); + uint128 maxTokenIn = uint128( + res.order.swapExactTokenToToken( + res.debt, res.ft, sender, underlyingAmtInForBuyFt, minFtOut, block.timestamp + 1 hours + ) + ); + uint128 debtOutAmt = 80e8; + res.ft.approve(address(res.order), maxTokenIn); + + uint256 actualIn = vm.parseUint(vm.parseJsonString(testdata, ".expected.testSellFtForExactToken.output.netOut")); + uint256 fee = vm.parseUint(vm.parseJsonString(testdata, ".expected.testSellFtForExactToken.output.fee")); + StateChecker.OrderState memory expectedState = + JSONLoader.getOrderStateFromJson(testdata, ".expected.testSellFtForExactToken.contractState"); + vm.expectEmit(); + emit OrderEvents.SwapTokenToExactToken( + res.ft, res.debt, sender, sender, debtOutAmt, uint128(actualIn), uint128(fee) + ); + uint256 netIn = + res.order.swapTokenToExactToken(res.ft, res.debt, sender, debtOutAmt, maxTokenIn, block.timestamp + 1 hours); + + StateChecker.checkOrderState(res, expectedState); + + assert(netIn < maxTokenIn); + assert(res.debt.balanceOf(sender) == debtOutAmt); + assert(res.ft.balanceOf(sender) == maxTokenIn - netIn); + + vm.stopPrank(); + } + + function testSellXtForExactToken() public { + vm.startPrank(sender); + + uint128 underlyingAmtInForBuyXt = 5e8; + uint128 minFtOut = 0e8; + res.debt.mint(sender, underlyingAmtInForBuyXt); + res.debt.approve(address(res.order), underlyingAmtInForBuyXt); + uint128 maxTokenIn = uint128( + res.order.swapExactTokenToToken( + res.debt, res.xt, sender, underlyingAmtInForBuyXt, minFtOut, block.timestamp + 1 hours + ) + ); + uint128 debtOutAmt = 3e8; + res.xt.approve(address(res.order), maxTokenIn); + + uint256 actualIn = vm.parseUint(vm.parseJsonString(testdata, ".expected.testSellXtForExactToken.output.netOut")); + uint256 fee = vm.parseUint(vm.parseJsonString(testdata, ".expected.testSellXtForExactToken.output.fee")); + StateChecker.OrderState memory expectedState = + JSONLoader.getOrderStateFromJson(testdata, ".expected.testSellXtForExactToken.contractState"); + vm.expectEmit(); + emit OrderEvents.SwapTokenToExactToken( + res.xt, res.debt, sender, sender, debtOutAmt, uint128(actualIn), uint128(fee) + ); + uint256 netIn = + res.order.swapTokenToExactToken(res.xt, res.debt, sender, debtOutAmt, maxTokenIn, block.timestamp + 1 hours); + + StateChecker.checkOrderState(res, expectedState); + + assert(netIn < maxTokenIn); + assert(res.debt.balanceOf(sender) == debtOutAmt); + assert(res.xt.balanceOf(sender) == maxTokenIn - netIn); + + vm.stopPrank(); + } + + function testByExactFtWhenTermIsNotOpen() public { + uint128 ftInAmt = 100e8; + uint128 maxTokenOut = 100e8; + res.debt.mint(sender, ftInAmt); + res.debt.approve(address(res.market), ftInAmt); + + vm.warp(res.market.config().maturity); + vm.expectRevert(abi.encodeWithSignature("TermIsNotOpen()")); + res.order.swapTokenToExactToken(res.debt, res.ft, sender, maxTokenOut, ftInAmt, block.timestamp + 1 hours); + } + + function testIssueFtWhenSwap() public { + vm.startPrank(maker); + // Mint a GT + (uint256 gtId,) = LoanUtils.fastMintGt(res, maker, 100e8, 1e18); + res.gt.approve(address(res.order), gtId); + orderConfig.gtId = gtId; + res.order.updateOrder(orderConfig, -150e8, 0); + vm.stopPrank(); + + uint128 ftOutAmt = 151e8; + uint128 maxTokenIn = 150e8; + vm.startPrank(sender); + res.debt.mint(sender, maxTokenIn); + res.debt.approve(address(res.order), maxTokenIn); + res.order.swapTokenToExactToken(res.debt, res.ft, sender, ftOutAmt, maxTokenIn, block.timestamp + 1 hours); + assertEq(res.ft.balanceOf(sender), ftOutAmt); + (, uint128 debtAmt,) = res.gt.loanInfo(gtId); + assertGt(debtAmt, 100e8); + vm.stopPrank(); + } + + function testIssueFtWhenNoAssets() public { + vm.startPrank(maker); + // Mint a GT + (uint256 gtId,) = LoanUtils.fastMintGt(res, maker, 100e8, 1e18); + res.gt.approve(address(res.order), gtId); + orderConfig.gtId = gtId; + res.order.updateOrder(orderConfig, -150e8, -150e8); + assert(res.ft.balanceOf(address(res.order)) == 0); + assert(res.xt.balanceOf(address(res.order)) == 0); + vm.stopPrank(); + + uint128 ftOutAmt = 151e8; + uint128 maxTokenIn = 150e8; + vm.startPrank(sender); + res.debt.mint(sender, maxTokenIn); + res.debt.approve(address(res.order), maxTokenIn); + res.order.swapTokenToExactToken(res.debt, res.ft, sender, ftOutAmt, maxTokenIn, block.timestamp + 1 hours); + assertEq(res.ft.balanceOf(sender), ftOutAmt); + (, uint128 debtAmt,) = res.gt.loanInfo(gtId); + assertGt(debtAmt, 100e8); + vm.stopPrank(); + } + + function testRevertWhenIssueFt() public { + vm.prank(maker); + res.order.updateOrder(orderConfig, -150e8, 0); + + uint128 ftOutAmt = 151e8; + uint128 maxTokenIn = 150e8; + vm.startPrank(sender); + + res.debt.mint(sender, maxTokenIn); + res.debt.approve(address(res.order), maxTokenIn); + vm.expectRevert(abi.encodeWithSelector(OrderErrors.CantNotIssueFtWithoutGt.selector)); + res.order.swapTokenToExactToken(res.debt, res.ft, sender, ftOutAmt, maxTokenIn, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function testUpdateOrderConfig() public { + vm.startPrank(maker); + + // Prepare new curve cuts + OrderConfig memory newOrderConfig = JSONLoader.getOrderConfigFromJson(testdata, ".newOrderConfig"); + int256 ftChangeAmt = 1e8; + int256 xtChangeAmt = -1e8; + + deal(address(res.ft), maker, ftChangeAmt.toUint256()); + res.ft.approve(address(res.order), ftChangeAmt.toUint256()); + + // vm.expectEmit(); + // emit OrderEvents.UpdateOrder( + // newOrderConfig.curveCuts, + // ftChangeAmt, + // xtChangeAmt, + // orderConfig.gtId, + // orderConfig.maxXtReserve, + // ISwapCallback(address(0)) + // ); + res.order.updateOrder(newOrderConfig, ftChangeAmt, xtChangeAmt); + + // Verify curve was updated + OrderConfig memory updatedConfig = res.order.orderConfig(); + for (uint256 i = 0; i < updatedConfig.curveCuts.lendCurveCuts.length; i++) { + assertEq( + updatedConfig.curveCuts.lendCurveCuts[i].xtReserve, newOrderConfig.curveCuts.lendCurveCuts[i].xtReserve + ); + assertEq( + updatedConfig.curveCuts.lendCurveCuts[i].liqSquare, newOrderConfig.curveCuts.lendCurveCuts[i].liqSquare + ); + assertEq(updatedConfig.curveCuts.lendCurveCuts[i].offset, newOrderConfig.curveCuts.lendCurveCuts[i].offset); + } + for (uint256 i = 0; i < updatedConfig.curveCuts.borrowCurveCuts.length; i++) { + assertEq( + updatedConfig.curveCuts.borrowCurveCuts[i].xtReserve, + newOrderConfig.curveCuts.borrowCurveCuts[i].xtReserve + ); + assertEq( + updatedConfig.curveCuts.borrowCurveCuts[i].liqSquare, + newOrderConfig.curveCuts.borrowCurveCuts[i].liqSquare + ); + assertEq( + updatedConfig.curveCuts.borrowCurveCuts[i].offset, newOrderConfig.curveCuts.borrowCurveCuts[i].offset + ); + } + assertEq(res.xt.balanceOf(maker), (-xtChangeAmt).toUint256()); + assertEq(res.ft.balanceOf(maker), 0); + + vm.stopPrank(); + } + + function testOnlyMakerCanUpdateOrder() public { + vm.startPrank(sender); + + vm.expectRevert(abi.encodeWithSignature("OwnableUnauthorizedAccount(address)", sender)); + res.order.updateOrder(orderConfig, 0, 0); + + vm.stopPrank(); + } + + function testPauseAndUnpause() public { + vm.startPrank(maker); + + // Test pause + res.order.pause(); + assertTrue(TermMaxOrder(address(res.order)).paused()); + + // Verify swaps are blocked when paused + vm.expectRevert(abi.encodeWithSignature("EnforcedPause()")); + res.order.swapExactTokenToToken(res.ft, res.debt, sender, 1e8, 0, block.timestamp + 1 hours); + + // Test unpause + res.order.unpause(); + assertFalse(TermMaxOrder(address(res.order)).paused()); + + vm.stopPrank(); + } + + function testOnlyMakerCanPause() public { + vm.startPrank(sender); + + vm.expectRevert(abi.encodeWithSignature("OwnableUnauthorizedAccount(address)", sender)); + res.order.pause(); + + vm.stopPrank(); + } + + function testSwapReverts() public { + vm.startPrank(sender); + + // Test same token swap + vm.expectRevert(OrderErrors.CantSwapSameToken.selector); + res.order.swapExactTokenToToken(res.ft, res.ft, sender, 1e8, 0, block.timestamp + 1 hours); + + IERC20 token0 = IERC20(vm.randomAddress()); + IERC20 token1 = IERC20(vm.randomAddress()); + // Test invalid token combination + vm.expectRevert(abi.encodeWithSelector(OrderErrors.CantNotSwapToken.selector, token0, token1)); + res.order.swapExactTokenToToken(token0, token1, sender, 1e8, 0, block.timestamp + 1 hours); + + vm.stopPrank(); + } + + function testSwapWithCallback(uint128 swapAmt, bool isBuy, bool isFt) public { + vm.assume(swapAmt > 0 && swapAmt < 0.1e8); + + // Deploy mock callback contract + MockSwapCallback callback = new MockSwapCallback(); + + orderConfig.swapTrigger = callback; + vm.startPrank(maker); + res.order.updateOrder(orderConfig, 0, 0); + + res.debt.mint(maker, 150e8); + res.debt.approve(address(res.market), 150e8); + res.market.mint(address(res.order), 150e8); + vm.stopPrank(); + + vm.startPrank(sender); + + res.debt.mint(sender, swapAmt * 2); + + res.debt.approve(address(res.order), swapAmt); + res.debt.approve(address(res.market), swapAmt); + res.market.mint(sender, swapAmt); + + IERC20 tokenIn; + IERC20 tokenOut; + + if (isBuy && isFt) { + tokenIn = res.debt; + tokenOut = res.ft; + } + + if (isBuy && !isFt) { + tokenIn = res.debt; + tokenOut = res.xt; + } + + if (!isBuy && isFt) { + tokenIn = res.ft; + tokenOut = res.debt; + } + + if (!isBuy && !isFt) { + tokenIn = res.xt; + tokenOut = res.debt; + } + uint256 ftBalanceBefore = res.ft.balanceOf(address(res.order)); + uint256 xtBalanceBefore = res.xt.balanceOf(address(res.order)); + tokenIn.approve(address(res.order), swapAmt); + res.order.swapExactTokenToToken(tokenIn, tokenOut, sender, swapAmt, 0, block.timestamp + 1 hours); + + uint256 ftBalanceAfter = res.ft.balanceOf(address(res.order)); + uint256 xtBalanceAfter = res.xt.balanceOf(address(res.order)); + + assertEq(ftBalanceBefore.toInt256() + callback.deltaFt(), ftBalanceAfter.toInt256()); + assertEq(xtBalanceBefore.toInt256() + callback.deltaXt(), xtBalanceAfter.toInt256()); + + vm.stopPrank(); + } + + function testUpdateOrderFeeRate() public { + // Create new fee config + FeeConfig memory newFeeConfig = marketConfig.feeConfig; + newFeeConfig.lendTakerFeeRatio++; + newFeeConfig.borrowTakerFeeRatio++; + + // Test that non-owner cannot update fee rate + vm.expectRevert(abi.encodeWithSelector(OrderErrors.OnlyMarket.selector)); + vm.prank(sender); + res.order.updateFeeConfig(newFeeConfig); + + // Test that owner can update fee rate + vm.startPrank(deployer); + res.market.updateOrderFeeRate(res.order, newFeeConfig); + assertEq(res.order.orderConfig().feeConfig.lendTakerFeeRatio, newFeeConfig.lendTakerFeeRatio); + assertEq(res.order.orderConfig().feeConfig.borrowTakerFeeRatio, newFeeConfig.borrowTakerFeeRatio); + + // Test invalid fee rates (over 100%) + FeeConfig memory invalidFeeConfig = marketConfig.feeConfig; + invalidFeeConfig.lendTakerFeeRatio = Constants.MAX_FEE_RATIO; + vm.expectRevert(abi.encodeWithSelector(MarketErrors.FeeTooHigh.selector)); + res.market.updateOrderFeeRate(res.order, invalidFeeConfig); + vm.stopPrank(); + } + + function testRevertLendIsNotAllowed() public { + vm.startPrank(maker); + OrderConfig memory testOrderConfig = res.order.orderConfig(); + testOrderConfig.curveCuts.borrowCurveCuts = new CurveCut[](0); + + vm.expectEmit(); + emit OrderEvents.UpdateOrder( + testOrderConfig.curveCuts, + 0, + 0, + testOrderConfig.gtId, + testOrderConfig.maxXtReserve, + ISwapCallback(address(0)) + ); + res.order.updateOrder(testOrderConfig, 0, 0); + vm.stopPrank(); + + vm.startPrank(sender); + + uint128 underlyingAmtIn = 100e8; + uint128 minTokenOut = 0e8; + res.debt.mint(sender, underlyingAmtIn); + res.debt.approve(address(res.order), underlyingAmtIn); + + vm.expectRevert(abi.encodeWithSelector(OrderErrors.LendIsNotAllowed.selector)); + res.order.swapExactTokenToToken( + res.debt, res.ft, sender, underlyingAmtIn, minTokenOut, block.timestamp + 1 hours + ); + + vm.stopPrank(); + } + + function testRevertBorrowIsNotAllowed() public { + vm.startPrank(maker); + OrderConfig memory testOrderConfig = res.order.orderConfig(); + testOrderConfig.curveCuts.lendCurveCuts = new CurveCut[](0); + + vm.expectEmit(); + emit OrderEvents.UpdateOrder( + testOrderConfig.curveCuts, + 0, + 0, + testOrderConfig.gtId, + testOrderConfig.maxXtReserve, + ISwapCallback(address(0)) + ); + res.order.updateOrder(testOrderConfig, 0, 0); + vm.stopPrank(); + + vm.startPrank(sender); + + uint128 underlyingAmtIn = 100e8; + uint128 minTokenOut = 0e8; + res.debt.mint(sender, underlyingAmtIn); + res.debt.approve(address(res.order), underlyingAmtIn); + + vm.expectRevert(abi.encodeWithSelector(OrderErrors.BorrowIsNotAllowed.selector)); + res.order.swapExactTokenToToken( + res.debt, res.xt, sender, underlyingAmtIn, minTokenOut, block.timestamp + 1 hours + ); + + vm.stopPrank(); + } + + function testUtWhenDeadlineLessThanBlockTime() public { + vm.startPrank(sender); + + uint128 swapAmt = 5e8; + IERC20 tokenIn = IERC20(address(res.debt)); + IERC20 tokenOut = IERC20(address(res.xt)); + + // Set block timestamp + uint256 currentTime = 1000; + vm.warp(currentTime); + + // Try to swap with deadline less than block time + uint256 pastDeadline = currentTime - 1; + + tokenIn.approve(address(res.order), swapAmt); + + vm.expectRevert(OrderErrors.DeadlineExpired.selector); + res.order.swapExactTokenToToken(tokenIn, tokenOut, sender, swapAmt, 0, pastDeadline); + + vm.expectRevert(OrderErrors.DeadlineExpired.selector); + res.order.swapTokenToExactToken(tokenIn, tokenOut, sender, 1, swapAmt, pastDeadline); + + vm.stopPrank(); + } + + function testAprWithoutCurve() public { + vm.startPrank(maker); + OrderConfig memory testOrderConfig = res.order.orderConfig(); + testOrderConfig.curveCuts.lendCurveCuts = new CurveCut[](0); + testOrderConfig.curveCuts.borrowCurveCuts = new CurveCut[](0); + + vm.expectEmit(); + emit OrderEvents.UpdateOrder( + testOrderConfig.curveCuts, + 0, + 0, + testOrderConfig.gtId, + testOrderConfig.maxXtReserve, + ISwapCallback(address(0)) + ); + res.order.updateOrder(testOrderConfig, 0, 0); + vm.stopPrank(); + + (uint256 lendApr, uint256 borrowApr) = res.order.apr(); + + assert(lendApr == 0); + assert(borrowApr == type(uint256).max); + } + + function testAprWithCurve() public { + vm.startPrank(maker); + OrderConfig memory testOrderConfig = res.order.orderConfig(); + testOrderConfig.curveCuts.lendCurveCuts = new CurveCut[](0); + + res.order.updateOrder(testOrderConfig, 0, 0); + + (uint256 lendApr, uint256 borrowApr) = res.order.apr(); + + assert(lendApr == 0); + + testOrderConfig = res.order.orderConfig(); + testOrderConfig.curveCuts.borrowCurveCuts = new CurveCut[](0); + res.order.updateOrder(testOrderConfig, 0, 0); + + (lendApr, borrowApr) = res.order.apr(); + + assert(borrowApr == type(uint256).max); + + vm.stopPrank(); + } +} + +// Mock contracts for testing +contract MockSwapCallback is ISwapCallback { + int256 public deltaFt; + int256 public deltaXt; + + function afterSwap(uint256, uint256, int256 deltaFt_, int256 deltaXt_) external override { + deltaFt = deltaFt_; + deltaXt = deltaXt_; + } +} diff --git a/test/v1/Router.t.sol b/test/v1/Router.t.sol new file mode 100644 index 0000000..0ab0876 --- /dev/null +++ b/test/v1/Router.t.sol @@ -0,0 +1,694 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "forge-std/Test.sol"; +import {console} from "forge-std/console.sol"; +import {DeployUtils} from "./utils/DeployUtils.sol"; +import {JSONLoader} from "./utils/JSONLoader.sol"; +import {StateChecker} from "./utils/StateChecker.sol"; +import {SwapUtils} from "./utils/SwapUtils.sol"; +import {LoanUtils} from "./utils/LoanUtils.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; +import {IFlashLoanReceiver} from "contracts/v1/IFlashLoanReceiver.sol"; +import {ITermMaxMarket, TermMaxMarket, Constants, MarketEvents, MarketErrors} from "contracts/v1/TermMaxMarket.sol"; +import {ITermMaxOrder, TermMaxOrder, ISwapCallback, OrderEvents, OrderErrors} from "contracts/v1/TermMaxOrder.sol"; +import {MockERC20, ERC20} from "contracts/v1/test/MockERC20.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {MockFlashLoanReceiver} from "contracts/v1/test/MockFlashLoanReceiver.sol"; +import {IGearingToken} from "contracts/v1/tokens/IGearingToken.sol"; +import {MockSwapAdapter} from "contracts/v1/test/MockSwapAdapter.sol"; +import {SwapUnit, ISwapAdapter} from "contracts/v1/router/ISwapAdapter.sol"; +import {RouterErrors, RouterEvents, TermMaxRouter} from "contracts/v1/router/TermMaxRouter.sol"; +import "contracts/v1/storage/TermMaxStorage.sol"; + +contract RouterTest is Test { + using JSONLoader for *; + using SafeCast for *; + + DeployUtils.Res res; + + OrderConfig orderConfig; + MarketConfig marketConfig; + + address deployer = vm.randomAddress(); + address maker = vm.randomAddress(); + address sender = vm.randomAddress(); + address treasurer = vm.randomAddress(); + string testdata; + + address pool = vm.randomAddress(); + + MockSwapAdapter adapter; + + function setUp() public { + vm.startPrank(deployer); + testdata = vm.readFile(string.concat(vm.projectRoot(), "/test/testdata/testdata.json")); + + uint32 maxLtv = 0.89e8; + uint32 liquidationLtv = 0.9e8; + + marketConfig = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); + orderConfig = JSONLoader.getOrderConfigFromJson(testdata, ".orderConfig"); + + res = DeployUtils.deployMarket(deployer, marketConfig, maxLtv, liquidationLtv); + + res.order = + res.market.createOrder(maker, orderConfig.maxXtReserve, ISwapCallback(address(0)), orderConfig.curveCuts); + + vm.warp(vm.parseUint(vm.parseJsonString(testdata, ".currentTime"))); + + // update oracle + res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.eth")); + res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.dai")); + + uint256 amount = 150e8; + res.debt.mint(deployer, amount); + res.debt.approve(address(res.market), amount); + res.market.mint(deployer, amount); + res.ft.transfer(address(res.order), amount); + res.xt.transfer(address(res.order), amount); + + res.router = DeployUtils.deployRouter(deployer); + adapter = new MockSwapAdapter(pool); + res.router.setAdapterWhitelist(address(adapter), true); + + vm.stopPrank(); + } + + function testSetAdapterWhitelist() public { + vm.startPrank(deployer); + + address randomAdapter = vm.randomAddress(); + res.router.setAdapterWhitelist(randomAdapter, true); + assertTrue(res.router.adapterWhitelist(randomAdapter)); + + res.router.setAdapterWhitelist(randomAdapter, false); + assertFalse(res.router.adapterWhitelist(randomAdapter)); + + vm.stopPrank(); + } + + function testSetAdapterWhitelistUnauthorized() public { + vm.startPrank(sender); + + address randomAdapter = vm.randomAddress(); + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, address(sender))); + res.router.setAdapterWhitelist(randomAdapter, true); + + vm.stopPrank(); + } + + function testPause() public { + vm.startPrank(deployer); + + res.router.pause(); + assertTrue(res.router.paused()); + + res.router.unpause(); + assertFalse(res.router.paused()); + + vm.stopPrank(); + } + + function testPauseUnauthorized() public { + vm.startPrank(sender); + + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, address(sender))); + res.router.pause(); + + vm.stopPrank(); + } + + function testSwapExactTokenToToken() public { + vm.startPrank(sender); + + uint128 amountIn = 100e8; + uint128[] memory tradingAmts = new uint128[](2); + tradingAmts[0] = 50e8; + tradingAmts[1] = 50e8; + uint128 mintTokenOut = 80e8; + + ITermMaxOrder[] memory orders = new ITermMaxOrder[](2); + orders[0] = res.order; + orders[1] = res.order; + + res.debt.mint(sender, amountIn); + res.debt.approve(address(res.router), amountIn); + uint256 netOut = res.router.swapExactTokenToToken( + res.debt, res.ft, sender, orders, tradingAmts, mintTokenOut, block.timestamp + 1 hours + ); + assertEq(netOut, res.ft.balanceOf(sender)); + + assertEq(res.debt.balanceOf(sender), 0); + + vm.stopPrank(); + } + + function testSwapTokenToExactToken() public { + vm.startPrank(sender); + + uint128 amountOut = 90e8; + uint128[] memory tradingAmts = new uint128[](2); + tradingAmts[0] = 45e8; + tradingAmts[1] = 45e8; + uint128 maxAmountIn = 100e8; + + ITermMaxOrder[] memory orders = new ITermMaxOrder[](2); + orders[0] = res.order; + orders[1] = res.order; + + res.debt.mint(sender, maxAmountIn); + res.debt.approve(address(res.router), maxAmountIn); + + uint256 balanceBefore = res.ft.balanceOf(sender); + uint256 amountIn = res.router.swapTokenToExactToken( + res.debt, res.ft, sender, orders, tradingAmts, maxAmountIn, block.timestamp + 1 hours + ); + uint256 balanceAfter = res.ft.balanceOf(sender); + + assertEq(maxAmountIn - amountIn, res.debt.balanceOf(sender)); + assertEq(balanceAfter - balanceBefore, amountOut); + + vm.stopPrank(); + } + + function testSellTokens(uint128 ftAmount, uint128 xtAmount) public { + //TODO check output + vm.assume(ftAmount <= 150e8 && xtAmount <= 150e8); + vm.startPrank(sender); + deal(address(res.ft), sender, ftAmount); + deal(address(res.xt), sender, xtAmount); + + ITermMaxOrder[] memory orders = new ITermMaxOrder[](2); + orders[0] = res.order; + orders[1] = res.order; + + (uint128 maxBurn, uint128 sellAmt) = + ftAmount > xtAmount ? (xtAmount, ftAmount - xtAmount) : (ftAmount, xtAmount - ftAmount); + uint128[] memory tradingAmts = new uint128[](2); + tradingAmts[0] = sellAmt / 2; + tradingAmts[1] = sellAmt / 2; + uint128 mintTokenOut = 0; + + res.ft.approve(address(res.router), ftAmount); + res.xt.approve(address(res.router), xtAmount); + + // vm.expectEmit(); + // emit ITermMaxRouter.SellTokens(res.market, tokenToSell, sender, orders, tradingAmts, mintTokenOut); + uint256 netOut = res.router.sellTokens( + sender, res.market, ftAmount, xtAmount, orders, tradingAmts, mintTokenOut, block.timestamp + ); + assertEq(netOut, res.debt.balanceOf(sender)); + assertEq(res.ft.balanceOf(sender), 0); + assertEq(res.xt.balanceOf(sender), 0); + assert(maxBurn <= netOut); + + vm.stopPrank(); + } + + function testLeaveFromToken() public { + vm.startPrank(sender); + + uint128 minXtOut = 0; + uint128 tokenToSwap = 100e8; + uint128 maxLtv = 0.8e8; + uint256 minCollAmt = 1e18; + res.debt.mint(sender, tokenToSwap + 2e8 * 2); + + ITermMaxOrder[] memory orders = new ITermMaxOrder[](2); + orders[0] = res.order; + orders[1] = res.order; + + uint128[] memory amtsToBuyXt = new uint128[](2); + amtsToBuyXt[0] = 2e8; + amtsToBuyXt[1] = 2e8; + + SwapUnit[] memory units = new SwapUnit[](1); + units[0] = SwapUnit(address(adapter), address(res.debt), address(res.collateral), abi.encode(minCollAmt)); + + res.debt.approve(address(res.router), tokenToSwap + 2e8 * 2); + (uint256 gtId, uint256 netXtOut) = res.router.leverageFromToken( + sender, res.market, orders, amtsToBuyXt, minXtOut, tokenToSwap, maxLtv, units, block.timestamp + ); + (address owner, uint128 debtAmt, bytes memory collateralData) = res.gt.loanInfo(gtId); + assertEq(owner, sender); + assertEq(minCollAmt, abi.decode(collateralData, (uint256))); + assertEq(netXtOut * Constants.DECIMAL_BASE / (Constants.DECIMAL_BASE - res.market.mintGtFeeRatio()), debtAmt); + vm.stopPrank(); + } + + function testLeverageFromXt() public { + vm.startPrank(sender); + + uint128 xtAmt = 10e8; + uint128 tokenToSwap = 100e8; + uint128 maxLtv = 0.8e8; + uint256 minCollAmt = 1e18; + + deal(address(res.xt), sender, xtAmt); + + SwapUnit[] memory units = new SwapUnit[](1); + units[0] = SwapUnit(address(adapter), address(res.debt), address(res.collateral), abi.encode(minCollAmt)); + + res.xt.approve(address(res.router), xtAmt); + res.debt.mint(sender, tokenToSwap); + res.debt.approve(address(res.router), tokenToSwap); + + uint256 gtId = res.router.leverageFromXt(sender, res.market, xtAmt, tokenToSwap, maxLtv, units); + (address owner, uint128 debtAmt, bytes memory collateralData) = res.gt.loanInfo(gtId); + assertEq(owner, sender); + assertEq(minCollAmt, abi.decode(collateralData, (uint256))); + assertEq( + uint128(xtAmt * Constants.DECIMAL_BASE / (Constants.DECIMAL_BASE - res.market.mintGtFeeRatio())), debtAmt + ); + vm.stopPrank(); + } + + function testLeverageFromCollateral() public { + vm.startPrank(sender); + + uint128 xtAmt = 10e8; + uint128 collateralAmt = 0.5e18; + uint128 maxLtv = 0.8e8; + uint256 minCollAmt = 0.5e18; + + deal(address(res.xt), sender, xtAmt); + + SwapUnit[] memory units = new SwapUnit[](1); + units[0] = SwapUnit(address(adapter), address(res.debt), address(res.collateral), abi.encode(minCollAmt)); + + res.xt.approve(address(res.router), xtAmt); + res.collateral.mint(sender, collateralAmt); + res.collateral.approve(address(res.router), collateralAmt); + + uint256 gtId = res.router.leverageFromXtAndCollateral(sender, res.market, xtAmt, collateralAmt, maxLtv, units); + (address owner, uint128 debtAmt, bytes memory collateralData) = res.gt.loanInfo(gtId); + assertEq(owner, sender); + assertEq(minCollAmt + collateralAmt, abi.decode(collateralData, (uint256))); + assertEq( + uint128(xtAmt * Constants.DECIMAL_BASE / (Constants.DECIMAL_BASE - res.market.mintGtFeeRatio())), debtAmt + ); + vm.stopPrank(); + } + + function testLeverage_LtvTooBigger() public { + vm.startPrank(sender); + + uint128 xtAmt = 100e8; + uint128 tokenToSwap = 100e8; + uint128 maxLtv = 0.1e2; + uint256 minCollAmt = 1e18; + + uint256 ltv = (xtAmt * Constants.DECIMAL_BASE / (Constants.DECIMAL_BASE - res.market.mintGtFeeRatio())) / 2000; + + deal(address(res.xt), sender, xtAmt); + + SwapUnit[] memory units = new SwapUnit[](1); + units[0] = SwapUnit(address(adapter), address(res.debt), address(res.collateral), abi.encode(minCollAmt)); + + res.xt.approve(address(res.router), xtAmt); + res.debt.mint(sender, tokenToSwap); + res.debt.approve(address(res.router), tokenToSwap); + + vm.expectRevert( + abi.encodeWithSelector(RouterErrors.LtvBiggerThanExpected.selector, uint128(maxLtv), uint128(ltv)) + ); + res.router.leverageFromXt(sender, res.market, xtAmt, tokenToSwap, maxLtv, units); + + vm.stopPrank(); + } + + function testBorrowTokenFromCollateral() public { + vm.startPrank(sender); + + uint256 collInAmt = 1e18; + uint128 borrowAmt = 80e8; + uint128 maxDebtAmt = 100e8; + + // uint fee = (res.market.mintGtFeeRatio() * maxDebtAmt) / Constants.DECIMAL_BASE; + // uint ftAmt = maxDebtAmt - fee; + + ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); + orders[0] = res.order; + uint128[] memory tokenAmtsWantBuy = new uint128[](1); + tokenAmtsWantBuy[0] = borrowAmt; + + res.collateral.mint(sender, collInAmt); + res.collateral.approve(address(res.router), collInAmt); + + // vm.expectEmit(); + // emit RouterEvents.Borrow(res.market, gtId, sender, sender, collInAmt, maxDebtAmt.toUint128(), borrowAmt); + uint256 gtId = res.router.borrowTokenFromCollateral( + sender, res.market, collInAmt, orders, tokenAmtsWantBuy, maxDebtAmt, block.timestamp + 1 hours + ); + + (address owner, uint128 debtAmt, bytes memory collateralData) = res.gt.loanInfo(gtId); + assertEq(owner, sender); + assertEq(collInAmt, abi.decode(collateralData, (uint256))); + assert(debtAmt <= maxDebtAmt); + assertEq(res.debt.balanceOf(sender), borrowAmt); + + vm.stopPrank(); + } + + function testBorrowTokenFromCollateralCase2() public { + vm.startPrank(sender); + + uint256 collInAmt = 1e18; + uint128 borrowAmt = 80e8; + + res.collateral.mint(sender, collInAmt); + res.collateral.approve(address(res.router), collInAmt); + + res.debt.mint(sender, borrowAmt); + res.debt.approve(address(res.market), borrowAmt); + res.market.mint(sender, borrowAmt); + + res.xt.approve(address(res.router), borrowAmt); + + uint256 mintGtFeeRatio = res.market.mintGtFeeRatio(); + uint128 previewDebtAmt = + ((borrowAmt * Constants.DECIMAL_BASE) / (Constants.DECIMAL_BASE - mintGtFeeRatio)).toUint128(); + + vm.expectEmit(); + emit RouterEvents.Borrow(res.market, 1, sender, sender, collInAmt, previewDebtAmt, borrowAmt); + + uint256 gtId = res.router.borrowTokenFromCollateral(sender, res.market, collInAmt, borrowAmt); + (address owner, uint128 debtAmt, bytes memory collateralData) = res.gt.loanInfo(gtId); + assertEq(owner, sender); + assertEq(collInAmt, abi.decode(collateralData, (uint256))); + assert(previewDebtAmt == debtAmt); + assertEq(res.debt.balanceOf(sender), borrowAmt); + + vm.stopPrank(); + } + + function testBorrowTokenFromGt() public { + vm.startPrank(sender); + uint256 collInAmt = 1e18; + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, 100e8, collInAmt); + + uint128 borrowAmt = 80e8; + + res.debt.mint(sender, borrowAmt); + res.debt.approve(address(res.market), borrowAmt); + res.market.mint(sender, borrowAmt); + + res.xt.approve(address(res.router), borrowAmt); + res.gt.approve(address(res.router), gtId); + + uint256 mintGtFeeRatio = res.market.mintGtFeeRatio(); + uint128 previewDebtAmt = + ((borrowAmt * Constants.DECIMAL_BASE) / (Constants.DECIMAL_BASE - mintGtFeeRatio)).toUint128(); + + vm.expectEmit(); + emit RouterEvents.Borrow(res.market, 1, sender, sender, 0, previewDebtAmt, borrowAmt); + + res.router.borrowTokenFromGt(sender, res.market, gtId, borrowAmt); + + (, uint128 dAmt,) = res.gt.loanInfo(gtId); + assert(dAmt == 100e8 + previewDebtAmt); + assertEq(res.debt.balanceOf(sender), borrowAmt); + + vm.stopPrank(); + } + + function testBorrowTokenFromGtInvalidSender() public { + vm.startPrank(sender); + uint256 collInAmt = 1e18; + + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, 100e8, collInAmt); + + uint128 borrowAmt = 80e8; + + res.debt.mint(sender, borrowAmt); + res.debt.approve(address(res.market), borrowAmt); + res.market.mint(sender, borrowAmt); + + res.xt.approve(address(res.router), borrowAmt); + res.gt.approve(address(res.router), gtId); + + uint256 mintGtFeeRatio = res.market.mintGtFeeRatio(); + ((borrowAmt * Constants.DECIMAL_BASE) / (Constants.DECIMAL_BASE - mintGtFeeRatio)).toUint128(); + vm.stopPrank(); + + vm.expectRevert(abi.encodeWithSelector(RouterErrors.GtNotOwnedBySender.selector)); + vm.prank(deployer); + res.router.borrowTokenFromGt(sender, res.market, gtId, borrowAmt); + + vm.stopPrank(); + } + + function testFlashRepayFromCollateral() public { + vm.startPrank(sender); + uint128 debtAmt = 100e8; + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, 1e18); + + ITermMaxOrder[] memory orders = new ITermMaxOrder[](0); + uint128[] memory amtsToBuyFt = new uint128[](0); + bool byDebtToken = true; + + uint256 mintTokenOut = 2000e8; + SwapUnit[] memory units = new SwapUnit[](1); + units[0] = SwapUnit(address(adapter), address(res.collateral), address(res.debt), abi.encode(mintTokenOut)); + + res.gt.approve(address(res.router), gtId); + res.router.flashRepayFromColl( + sender, res.market, gtId, orders, amtsToBuyFt, byDebtToken, units, block.timestamp + 1 hours + ); + + assertEq(res.collateral.balanceOf(sender), 0); + assertEq(res.debt.balanceOf(sender), mintTokenOut - debtAmt); + + vm.expectRevert(abi.encodePacked(bytes4(keccak256("ERC721NonexistentToken(uint256)")), gtId)); + res.gt.loanInfo(gtId); + + vm.stopPrank(); + } + + function testFlashRepayFromCollateral_ByFt() public { + vm.startPrank(sender); + uint128 debtAmt = 100e8; + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, 1e18); + + ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); + orders[0] = res.order; + uint128[] memory amtsToBuyFt = new uint128[](1); + amtsToBuyFt[0] = debtAmt; + + bool byDebtToken = false; + + uint256 mintTokenOut = 2000e8; + SwapUnit[] memory units = new SwapUnit[](1); + units[0] = SwapUnit(address(adapter), address(res.collateral), address(res.debt), abi.encode(mintTokenOut)); + + res.gt.approve(address(res.router), gtId); + res.router.flashRepayFromColl( + sender, res.market, gtId, orders, amtsToBuyFt, byDebtToken, units, block.timestamp + ); + + assertEq(res.collateral.balanceOf(sender), 0); + assert(res.debt.balanceOf(sender) > mintTokenOut - debtAmt); + + vm.expectRevert(abi.encodePacked(bytes4(keccak256("ERC721NonexistentToken(uint256)")), gtId)); + res.gt.loanInfo(gtId); + + vm.stopPrank(); + } + + function testRepayByTokenThroughFt() public { + vm.startPrank(sender); + uint128 debtAmt = 100e8; + uint256 collateralAmt = 1e18; + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + + ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); + orders[0] = res.order; + uint128[] memory amtsToBuyFt = new uint128[](1); + amtsToBuyFt[0] = debtAmt; + uint128 maxTokenIn = debtAmt; + + res.debt.mint(sender, maxTokenIn); + res.debt.approve(address(res.router), maxTokenIn); + + uint256 returnAmt = + res.router.repayByTokenThroughFt(sender, res.market, gtId, orders, amtsToBuyFt, maxTokenIn, block.timestamp); + assertEq(res.debt.balanceOf(sender), returnAmt); + assertEq(res.collateral.balanceOf(sender), collateralAmt); + + vm.expectRevert(abi.encodePacked(bytes4(keccak256("ERC721NonexistentToken(uint256)")), gtId)); + res.gt.loanInfo(gtId); + + vm.stopPrank(); + } + + function testPartialRepayByTokenThroughFt() public { + vm.startPrank(sender); + uint128 debtAmt = 100e8; + uint256 collateralAmt = 1e18; + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + + ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); + orders[0] = res.order; + uint128[] memory amtsToBuyFt = new uint128[](1); + amtsToBuyFt[0] = debtAmt / 2; + uint128 maxTokenIn = debtAmt; + + res.debt.mint(sender, maxTokenIn); + res.debt.approve(address(res.router), maxTokenIn); + + uint256 returnAmt = + res.router.repayByTokenThroughFt(sender, res.market, gtId, orders, amtsToBuyFt, maxTokenIn, block.timestamp); + assertEq(res.debt.balanceOf(sender), returnAmt); + assertEq(res.collateral.balanceOf(sender), 0); + + (address owner, uint128 dAmt, bytes memory collateralData) = res.gt.loanInfo(gtId); + assertEq(owner, sender); + assertEq(collateralAmt, abi.decode(collateralData, (uint256))); + assertEq(dAmt, debtAmt / 2); + + vm.stopPrank(); + } + + function testRedeemAndSwap() public { + address bob = vm.randomAddress(); + address alice = vm.randomAddress(); + + uint128 depositAmt = 1000e8; + uint128 debtAmt = 100e8; + uint256 collateralAmt = 1e18; + + vm.startPrank(bob); + res.debt.mint(bob, depositAmt); + res.debt.approve(address(res.market), depositAmt); + res.market.mint(bob, depositAmt); + + res.xt.transfer(alice, debtAmt); + vm.stopPrank(); + + vm.startPrank(alice); + + MockFlashLoanReceiver receiver = new MockFlashLoanReceiver(res.market); + res.collateral.mint(address(receiver), collateralAmt); + + res.xt.approve(address(receiver), debtAmt); + receiver.leverageByXt(debtAmt, abi.encode(alice, collateralAmt)); + vm.stopPrank(); + + vm.warp(marketConfig.maturity + Constants.LIQUIDATION_WINDOW); + + vm.startPrank(bob); + + uint256 minDebtOutAmt = 1000e8; + SwapUnit[] memory units = new SwapUnit[](1); + units[0] = SwapUnit(address(adapter), address(res.collateral), address(res.debt), abi.encode(minDebtOutAmt)); + + res.ft.approve(address(res.router), depositAmt); + uint256 ftTotalSupply = res.ft.totalSupply(); + uint256 redeemedDebtToken = (res.debt.balanceOf(address(res.market)) * depositAmt) / ftTotalSupply; + + uint256 expectedOutput = redeemedDebtToken + minDebtOutAmt; + + vm.expectEmit(); + emit RouterEvents.RedeemAndSwap(res.market, depositAmt, bob, bob, expectedOutput); + uint256 netOutput = res.router.redeemAndSwap(bob, res.market, depositAmt, units, expectedOutput); + + assertEq(netOutput, expectedOutput); + assertEq(res.debt.balanceOf(bob), netOutput); + + vm.stopPrank(); + } + + function testSwapUnitsIsEmpty() public { + address bob = vm.randomAddress(); + address alice = vm.randomAddress(); + + uint128 depositAmt = 1000e8; + uint128 debtAmt = 100e8; + uint256 collateralAmt = 1e18; + + vm.startPrank(bob); + res.debt.mint(bob, depositAmt); + res.debt.approve(address(res.market), depositAmt); + res.market.mint(bob, depositAmt); + + res.xt.transfer(alice, debtAmt); + vm.stopPrank(); + + vm.startPrank(alice); + + MockFlashLoanReceiver receiver = new MockFlashLoanReceiver(res.market); + res.collateral.mint(address(receiver), collateralAmt); + + res.xt.approve(address(receiver), debtAmt); + receiver.leverageByXt(debtAmt, abi.encode(alice, collateralAmt)); + vm.stopPrank(); + + vm.warp(marketConfig.maturity + Constants.LIQUIDATION_WINDOW); + + vm.startPrank(bob); + + uint256 minDebtOutAmt = 1000e8; + SwapUnit[] memory units = new SwapUnit[](0); + res.ft.approve(address(res.router), depositAmt); + + vm.expectRevert(abi.encodeWithSelector(RouterErrors.SwapUnitsIsEmpty.selector)); + res.router.redeemAndSwap(bob, res.market, depositAmt, units, minDebtOutAmt); + + vm.stopPrank(); + } + + function testCreateOrderAndDeposit() public { + vm.startPrank(sender); + + uint256 maxXtReserve = 1000e8; + + ISwapCallback swapTrigger = ISwapCallback(address(0)); + uint256 debtTokenToDeposit = 1e8; + uint128 ftToDeposit = 2e8; + uint128 xtToDeposit = 10e8; + CurveCuts memory curveCuts = orderConfig.curveCuts; + deal(address(res.ft), sender, ftToDeposit); + deal(address(res.xt), sender, xtToDeposit); + res.debt.mint(sender, debtTokenToDeposit); + res.debt.approve(address(res.router), debtTokenToDeposit); + res.ft.approve(address(res.router), ftToDeposit); + res.xt.approve(address(res.router), xtToDeposit); + ITermMaxOrder order = res.router.createOrderAndDeposit( + res.market, maker, maxXtReserve, swapTrigger, debtTokenToDeposit, ftToDeposit, xtToDeposit, curveCuts + ); + + assertEq(order.maker(), maker); + assertEq(res.ft.balanceOf(address(order)), ftToDeposit + debtTokenToDeposit); + assertEq(res.xt.balanceOf(address(order)), xtToDeposit + debtTokenToDeposit); + } + + function testOrdersAndAmtsLengthNotMatch() public { + vm.startPrank(sender); + + uint128[] memory tradingAmts = new uint128[](2); + tradingAmts[0] = 45e8; + tradingAmts[1] = 45e8; + uint128 maxAmountIn = 100e8; + + ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); + orders[0] = res.order; + + res.debt.mint(sender, maxAmountIn); + res.debt.approve(address(res.router), maxAmountIn); + + vm.expectRevert(RouterErrors.OrdersAndAmtsLengthNotMatch.selector); + res.router.swapTokenToExactToken( + res.debt, res.ft, sender, orders, tradingAmts, maxAmountIn, block.timestamp + 1 hours + ); + + vm.expectRevert(RouterErrors.OrdersAndAmtsLengthNotMatch.selector); + res.router.swapExactTokenToToken( + res.debt, res.ft, sender, orders, tradingAmts, maxAmountIn, block.timestamp + 1 hours + ); + vm.stopPrank(); + } +} diff --git a/test/v1/TermMaxTestBase.t.sol b/test/v1/TermMaxTestBase.t.sol new file mode 100644 index 0000000..99fb5bc --- /dev/null +++ b/test/v1/TermMaxTestBase.t.sol @@ -0,0 +1,124 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "forge-std/Test.sol"; +import {console} from "forge-std/console.sol"; +import {DeployUtils} from "./utils/DeployUtils.sol"; +import {JSONLoader} from "./utils/JSONLoader.sol"; +import {StateChecker} from "./utils/StateChecker.sol"; +import {SwapUtils} from "./utils/SwapUtils.sol"; +import {LoanUtils} from "./utils/LoanUtils.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; +import {IFlashLoanReceiver} from "contracts/v1/IFlashLoanReceiver.sol"; +import {ITermMaxMarket, TermMaxMarket, Constants, MarketEvents, MarketErrors} from "contracts/v1/TermMaxMarket.sol"; +import {ITermMaxOrder, TermMaxOrder, ISwapCallback, OrderEvents, OrderErrors} from "contracts/v1/TermMaxOrder.sol"; +import {MockERC20, ERC20} from "contracts/v1/test/MockERC20.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {TermMaxVault} from "contracts/v1/vault/TermMaxVault.sol"; +import {VaultErrors, VaultEvents, ITermMaxVault} from "contracts/v1/vault/TermMaxVault.sol"; +import {OrderManager} from "contracts/v1/vault/OrderManager.sol"; +import {VaultConstants} from "contracts/v1/lib/VaultConstants.sol"; +import {PendingAddress, PendingUint192} from "contracts/v1/lib/PendingLib.sol"; +import {MockSwapAdapter} from "contracts/v1/test/MockSwapAdapter.sol"; +import {SwapUnit, ISwapAdapter} from "contracts/v1/router/ISwapAdapter.sol"; +import {RouterErrors, RouterEvents, TermMaxRouter} from "contracts/v1/router/TermMaxRouter.sol"; +import "contracts/v1/storage/TermMaxStorage.sol"; + +abstract contract TermMaxTestBase is Test { + using JSONLoader for *; + using SafeCast for *; + + DeployUtils.Res res; + + OrderConfig orderConfig; + MarketConfig marketConfig; + + address admin = vm.randomAddress(); + address curator = vm.randomAddress(); + address allocator = vm.randomAddress(); + address guardian = vm.randomAddress(); + address treasurer = vm.randomAddress(); + string testdata; + + ITermMaxVault vault; + + uint256 timelock = 86400; + uint256 maxCapacity = 1000000e18; + uint64 performanceFeeRate = 0.5e8; + + ITermMaxMarket market2; + + uint256 currentTime; + uint32 maxLtv = 0.89e8; + uint32 liquidationLtv = 0.9e8; + VaultInitialParams initialParams; + + address pool = vm.randomAddress(); + + MockSwapAdapter adapter; + + function setUp() public { + vm.startPrank(admin); + testdata = vm.readFile(string.concat(vm.projectRoot(), "/test/testdata/testdata.json")); + + currentTime = vm.parseUint(vm.parseJsonString(testdata, ".currentTime")); + vm.warp(currentTime); + + marketConfig = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); + orderConfig = JSONLoader.getOrderConfigFromJson(testdata, ".orderConfig"); + marketConfig.maturity = uint64(currentTime + 90 days); + res = DeployUtils.deployMockMarket(admin, marketConfig, maxLtv, liquidationLtv); + MarketConfig memory marketConfig2 = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); + marketConfig2.maturity = uint64(currentTime + 180 days); + + market2 = ITermMaxMarket( + res.factory.createMarket( + DeployUtils.GT_ERC20, + MarketInitialParams({ + collateral: address(res.collateral), + debtToken: res.debt, + admin: admin, + gtImplementation: address(0), + marketConfig: marketConfig2, + loanConfig: LoanConfig({ + maxLtv: maxLtv, + liquidationLtv: liquidationLtv, + liquidatable: true, + oracle: res.oracle + }), + gtInitalParams: abi.encode(type(uint256).max), + tokenName: "test", + tokenSymbol: "test" + }), + 0 + ) + ); + + // update oracle + res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.eth")); + res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.dai")); + + initialParams = VaultInitialParams( + admin, curator, timelock, res.debt, maxCapacity, "Vault-DAI", "Vault-DAI", performanceFeeRate + ); + + res.vault = DeployUtils.deployVault(initialParams); + + res.vault.submitGuardian(guardian); + res.vault.setIsAllocator(allocator, true); + + res.vault.submitMarket(address(res.market), true); + vm.warp(currentTime + timelock + 1); + res.vault.acceptMarket(address(res.market)); + vm.warp(currentTime); + + res.order = res.vault.createOrder(res.market, maxCapacity, 0, orderConfig.curveCuts); + + res.router = DeployUtils.deployRouter(admin); + adapter = new MockSwapAdapter(pool); + res.router.setAdapterWhitelist(address(adapter), true); + vm.stopPrank(); + } +} diff --git a/test/v1/Vault.t.sol b/test/v1/Vault.t.sol new file mode 100644 index 0000000..86615b6 --- /dev/null +++ b/test/v1/Vault.t.sol @@ -0,0 +1,1085 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "forge-std/Test.sol"; +import {console} from "forge-std/console.sol"; +import {DeployUtils} from "./utils/DeployUtils.sol"; +import {JSONLoader} from "./utils/JSONLoader.sol"; +import {StateChecker} from "./utils/StateChecker.sol"; +import {SwapUtils} from "./utils/SwapUtils.sol"; +import {LoanUtils} from "./utils/LoanUtils.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; +import {IFlashLoanReceiver} from "contracts/v1/IFlashLoanReceiver.sol"; +import {ITermMaxMarket, TermMaxMarket, Constants, MarketEvents, MarketErrors} from "contracts/v1/TermMaxMarket.sol"; +import {ITermMaxOrder, TermMaxOrder, ISwapCallback, OrderEvents, OrderErrors} from "contracts/v1/TermMaxOrder.sol"; +import {MockERC20, ERC20} from "contracts/v1/test/MockERC20.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {TermMaxVault} from "contracts/v1/vault/TermMaxVault.sol"; +import {VaultErrors, VaultEvents, ITermMaxVault} from "contracts/v1/vault/TermMaxVault.sol"; +import {OrderManager, OrderInfo} from "contracts/v1/vault/OrderManager.sol"; +import {VaultConstants} from "contracts/v1/lib/VaultConstants.sol"; +import {PendingAddress, PendingUint192} from "contracts/v1/lib/PendingLib.sol"; +import "contracts/v1/storage/TermMaxStorage.sol"; + +contract VaultTest is Test { + using JSONLoader for *; + using SafeCast for *; + + DeployUtils.Res res; + + OrderConfig orderConfig; + MarketConfig marketConfig; + + address deployer = vm.randomAddress(); + address curator = vm.randomAddress(); + address allocator = vm.randomAddress(); + address guardian = vm.randomAddress(); + address lper = vm.randomAddress(); + address treasurer = vm.randomAddress(); + string testdata; + + ITermMaxVault vault; + + uint256 timelock = 86400; + uint256 maxCapacity = 1000000e18; + uint64 performanceFeeRate = 0.5e8; + + ITermMaxMarket market2; + + uint256 currentTime; + uint32 maxLtv = 0.89e8; + uint32 liquidationLtv = 0.9e8; + VaultInitialParams initialParams; + + function setUp() public { + vm.startPrank(deployer); + testdata = vm.readFile(string.concat(vm.projectRoot(), "/test/testdata/testdata.json")); + + currentTime = vm.parseUint(vm.parseJsonString(testdata, ".currentTime")); + vm.warp(currentTime); + + marketConfig = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); + orderConfig = JSONLoader.getOrderConfigFromJson(testdata, ".orderConfig"); + marketConfig.maturity = uint64(currentTime + 90 days); + res = DeployUtils.deployMockMarket(deployer, marketConfig, maxLtv, liquidationLtv); + MarketConfig memory marketConfig2 = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); + marketConfig2.maturity = uint64(currentTime + 180 days); + + market2 = ITermMaxMarket( + res.factory.createMarket( + DeployUtils.GT_ERC20, + MarketInitialParams({ + collateral: address(res.collateral), + debtToken: res.debt, + admin: deployer, + gtImplementation: address(0), + marketConfig: marketConfig2, + loanConfig: LoanConfig({ + maxLtv: maxLtv, + liquidationLtv: liquidationLtv, + liquidatable: true, + oracle: res.oracle + }), + gtInitalParams: abi.encode(type(uint256).max), + tokenName: "test", + tokenSymbol: "test" + }), + 0 + ) + ); + + // update oracle + res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.eth")); + res.debtOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.dai")); + + uint256 amount = 10000e8; + + initialParams = VaultInitialParams( + deployer, curator, timelock, res.debt, maxCapacity, "Vault-DAI", "Vault-DAI", performanceFeeRate + ); + + vault = DeployUtils.deployVault(initialParams); + + vault.submitGuardian(guardian); + vault.setIsAllocator(allocator, true); + + vault.submitMarket(address(res.market), true); + vault.submitMarket(address(market2), true); + vm.warp(currentTime + timelock + 1); + vault.acceptMarket(address(res.market)); + vault.acceptMarket(address(market2)); + vm.warp(currentTime); + + res.debt.mint(deployer, amount); + res.debt.approve(address(vault), amount); + vault.deposit(amount, deployer); + + res.order = vault.createOrder(res.market, maxCapacity, amount, orderConfig.curveCuts); + + res.debt.mint(deployer, 10000e18); + res.debt.approve(address(res.market), 10000e18); + res.market.mint(deployer, 10000e18); + vm.stopPrank(); + } + + function testRoleManagement() public { + // Test initial roles + assertEq(vault.guardian(), guardian); + assertEq(vault.curator(), curator); + assertTrue(vault.isAllocator(allocator)); + + // Test guardian role checks + vm.startPrank(deployer); + address newGuardian = address(0x123); + vault.submitGuardian(newGuardian); + + // Should not be set immediately due to timelock + assertEq(vault.guardian(), guardian); + + // Move forward past timelock + vm.warp(block.timestamp + timelock + 1); + vault.acceptGuardian(); + assertEq(vault.guardian(), newGuardian); + vm.stopPrank(); + + // Test revoke guardian + address nextGuardian = address(0x456); + vm.prank(deployer); + vault.submitGuardian(nextGuardian); + + vm.prank(newGuardian); + vault.revokePendingGuardian(); + assertEq(vault.pendingGuardian().value, address(0)); + + // Test curator role + vm.prank(deployer); + address newCurator = address(0x456); + vault.setCurator(newCurator); + assertEq(vault.curator(), newCurator); + + // Test allocator management + vm.prank(deployer); + address newAllocator = address(0x789); + vault.setIsAllocator(newAllocator, true); + assertTrue(vault.isAllocator(newAllocator)); + } + + function test_RevertSetGuardian() public { + address newGuardian = address(0x123); + vm.prank(allocator); + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, allocator)); + vault.submitGuardian(newGuardian); + + vm.startPrank(deployer); + vault.submitGuardian(newGuardian); + + vm.expectRevert(VaultErrors.AlreadyPending.selector); + vault.submitGuardian(newGuardian); + + vm.expectRevert(VaultErrors.TimelockNotElapsed.selector); + vault.acceptGuardian(); + + vm.warp(block.timestamp + 1 days + 1); + vault.acceptGuardian(); + + vm.expectRevert(VaultErrors.AlreadySet.selector); + vault.submitGuardian(address(0x123)); + + vm.stopPrank(); + } + + function testMarketWhitelist() public { + // check current timelock value + assertEq(vault.timelock(), 86400); + + // submit market + vm.startPrank(curator); + address market = address(0x123); + vault.submitMarket(market, false); + + assertEq(vault.marketWhitelist(market), false); + vault.submitMarket(market, true); + + assertEq(vault.marketWhitelist(market), false); + + // The validAt of the newly submitted market is the current time, without timelock + PendingUint192 memory pendingMarket = vault.pendingMarkets(market); + assertEq(pendingMarket.validAt, block.timestamp + 86400); + + vm.warp(block.timestamp + 86400 + 1); + vault.acceptMarket(market); + assertEq(vault.marketWhitelist(market), true); + + vault.submitMarket(market, false); + assertEq(vault.marketWhitelist(market), false); + vm.stopPrank(); + + // Test revoke market + address newMarket = address(0x456); + vm.prank(curator); + vault.submitMarket(newMarket, true); + + vm.prank(guardian); + vault.revokePendingMarket(newMarket); + assertEq(vault.pendingMarkets(newMarket).validAt, 0); + } + + function test_RevertSetMarketWhitelist() public { + address market = address(0x123); + + vm.prank(vm.randomAddress()); + vm.expectRevert(VaultErrors.NotCuratorRole.selector); + vault.submitMarket(market, true); + + vm.startPrank(curator); + vault.submitMarket(market, true); + + vm.expectRevert(VaultErrors.AlreadyPending.selector); + vault.submitMarket(market, true); + + vm.expectRevert(VaultErrors.TimelockNotElapsed.selector); + vault.acceptMarket(market); + + vm.warp(block.timestamp + 86400 + 1); + vault.acceptMarket(market); + + vm.expectRevert(VaultErrors.AlreadySet.selector); + vault.submitMarket(market, true); + + vm.stopPrank(); + } + + function test_RevertCreateOrder() public { + ITermMaxMarket market = ITermMaxMarket(address(0x123)); + address bob = lper; + vm.startPrank(bob); + + vm.expectRevert(VaultErrors.NotCuratorRole.selector); + vault.createOrder(market, maxCapacity, 0, orderConfig.curveCuts); + + vm.stopPrank(); + + vm.startPrank(curator); + vm.expectRevert(VaultErrors.MarketNotWhitelisted.selector); + vault.createOrder(market, maxCapacity, 0, orderConfig.curveCuts); + vm.stopPrank(); + } + + function testTimelockManagement() public { + uint256 newTimelock = 2 days; + + vm.prank(curator); + vault.submitTimelock(newTimelock); + assertEq(vault.timelock(), newTimelock); + + newTimelock = 1.5 days; + vm.prank(curator); + vault.submitTimelock(newTimelock); + assertEq(vault.timelock(), 2 days); + + PendingUint192 memory pendingTimelock = vault.pendingTimelock(); + assertEq(uint256(pendingTimelock.value), newTimelock); + assertEq(vault.timelock(), 2 days); + + // Can accept after timelock period + vm.warp(currentTime + 2 days); + vm.prank(vm.randomAddress()); + vault.acceptTimelock(); + assertEq(vault.timelock(), newTimelock); + + // revoke + vm.warp(currentTime + 3 days); + vm.prank(curator); + vault.submitTimelock(1 days); + vm.prank(guardian); + vault.revokePendingTimelock(); + pendingTimelock = vault.pendingTimelock(); + assertEq(uint256(pendingTimelock.value), 0); + } + + function test_RevertSetTimelock() public { + uint256 newTimelock = 2 days; + vm.startPrank(curator); + + vault.submitTimelock(newTimelock); + + vm.expectRevert(VaultErrors.AlreadySet.selector); + vault.submitTimelock(newTimelock); + + newTimelock = 1.5 days; + vault.submitTimelock(newTimelock); + + vm.expectRevert(VaultErrors.AlreadyPending.selector); + vault.submitTimelock(newTimelock); + + vm.warp(currentTime + 2 days); + vault.acceptTimelock(); + + vm.expectRevert(VaultErrors.BelowMinTimelock.selector); + vault.submitTimelock(1 days - 1); + + vm.expectRevert(VaultErrors.AboveMaxTimelock.selector); + vault.submitTimelock(VaultConstants.MAX_TIMELOCK + 1); + + vm.expectRevert(VaultErrors.NoPendingValue.selector); + vault.acceptTimelock(); + + vault.submitTimelock(1 days); + vm.warp(currentTime + 0.9 days); + vm.expectRevert(VaultErrors.TimelockNotElapsed.selector); + vault.acceptTimelock(); + + vm.stopPrank(); + + vm.expectRevert(VaultErrors.NotCuratorRole.selector); + vault.submitTimelock(1 days); + } + + function testPerformanceFeeRate() public { + uint184 newPercentage = 0.4e8; + + vm.prank(curator); + vault.submitPerformanceFeeRate(newPercentage); + + uint256 percentage = vault.performanceFeeRate(); + assertEq(percentage, newPercentage); + + newPercentage = 0.5e8; + vm.prank(curator); + vault.submitPerformanceFeeRate(newPercentage); + + vm.prank(guardian); + vault.revokePendingPerformanceFeeRate(); + + vm.prank(curator); + vault.submitPerformanceFeeRate(newPercentage); + + PendingUint192 memory pendingFeeRate = vault.pendingPerformanceFeeRate(); + assertEq(uint256(pendingFeeRate.value), newPercentage); + + vm.warp(pendingFeeRate.validAt); + vm.prank(vm.randomAddress()); + vault.acceptPerformanceFeeRate(); + percentage = vault.performanceFeeRate(); + assertEq(percentage, newPercentage); + } + + function test_RevertSetPerformanceFeeRate() public { + uint184 newPercentage = 0.5e8; + + vm.prank(curator); + vm.expectRevert(VaultErrors.AlreadySet.selector); + vault.submitPerformanceFeeRate(newPercentage); + + newPercentage = 0.6e8; + vm.prank(curator); + vm.expectRevert(VaultErrors.PerformanceFeeRateExceeded.selector); + vault.submitPerformanceFeeRate(newPercentage); + + vm.prank(vm.randomAddress()); + vm.expectRevert(VaultErrors.NotCuratorRole.selector); + vault.submitPerformanceFeeRate(newPercentage); + + newPercentage = 0.4e8; + vm.startPrank(curator); + vault.submitPerformanceFeeRate(newPercentage); + + newPercentage = 0.41e8; + vault.submitPerformanceFeeRate(newPercentage); + + newPercentage = 0.42e8; + vm.expectRevert(VaultErrors.AlreadyPending.selector); + vault.submitPerformanceFeeRate(newPercentage); + + vm.stopPrank(); + } + + function testSupplyQueue(uint256 orderCount, uint256 seed) public { + vm.assume(orderCount < VaultConstants.MAX_QUEUE_LENGTH && orderCount > 0); + address[] memory supplyQueue = new address[](orderCount); + supplyQueue[0] = vault.supplyQueue(0); + vm.startPrank(curator); + for (uint256 i = 1; i < orderCount; i++) { + address order = address(vault.createOrder(res.market, maxCapacity, 0, orderConfig.curveCuts)); + OrderInfo memory orderInfo = vault.orderMapping(order); + assertEq(address(orderInfo.market), address(res.market)); + assertEq(orderInfo.maturity, res.market.config().maturity); + assertEq(address(orderInfo.ft), address(res.ft)); + assertEq(address(orderInfo.xt), address(res.xt)); + supplyQueue[i] = order; + assertEq(vault.supplyQueue(i), order); + } + + uint256[] memory indexes = new uint256[](orderCount); + for (uint256 i = 0; i < orderCount; i++) { + indexes[i] = i; + } + indexes = shuffle(indexes, seed); + vault.updateSupplyQueue(indexes); + + for (uint256 i = 0; i < orderCount; i++) { + assertEq(vault.supplyQueue(i), supplyQueue[indexes[i]]); + } + + vm.stopPrank(); + } + + function testWithdrawQueue(uint256 orderCount, uint256 seed) public { + vm.assume(orderCount < VaultConstants.MAX_QUEUE_LENGTH && orderCount > 0); + address[] memory withdrawQueue = new address[](orderCount); + withdrawQueue[0] = vault.withdrawQueue(0); + vm.startPrank(curator); + for (uint256 i = 1; i < orderCount; i++) { + address order = address(vault.createOrder(res.market, maxCapacity, 0, orderConfig.curveCuts)); + withdrawQueue[i] = order; + assertEq(vault.withdrawQueue(i), order); + } + + uint256[] memory indexes = new uint256[](orderCount); + for (uint256 i = 0; i < orderCount; i++) { + indexes[i] = i; + } + indexes = shuffle(indexes, seed); + vault.updateWithdrawQueue(indexes); + + for (uint256 i = 0; i < orderCount; i++) { + assertEq(vault.withdrawQueue(i), withdrawQueue[indexes[i]]); + } + + vm.stopPrank(); + } + + function shuffle(uint256[] memory arr, uint256 seed) public pure returns (uint256[] memory) { + uint256 length = arr.length; + + for (uint256 i = length - 1; i > 0; i--) { + uint256 j = seed % (i + 1); + + uint256 temp = arr[i]; + arr[i] = arr[j]; + arr[j] = temp; + } + + return arr; + } + + function test_RevertSupplyQueue() public { + vm.prank(lper); + vm.expectRevert(VaultErrors.NotAllocatorRole.selector); + vault.updateSupplyQueue(new uint256[](0)); + + vm.startPrank(curator); + vm.expectRevert(VaultErrors.SupplyQueueLengthMismatch.selector); + vault.updateSupplyQueue(new uint256[](0)); + + address order2 = address(vault.createOrder(res.market, maxCapacity, 0, orderConfig.curveCuts)); + uint256[] memory indexes = new uint256[](2); + indexes[0] = 1; + indexes[1] = 1; + vm.expectRevert(abi.encodeWithSelector(VaultErrors.DuplicateOrder.selector, order2)); + vault.updateSupplyQueue(indexes); + + vm.stopPrank(); + } + + function test_RevertWithdrawQueue() public { + vm.prank(lper); + vm.expectRevert(VaultErrors.NotAllocatorRole.selector); + vault.updateWithdrawQueue(new uint256[](0)); + + vm.startPrank(curator); + vm.expectRevert(VaultErrors.WithdrawQueueLengthMismatch.selector); + vault.updateWithdrawQueue(new uint256[](0)); + + address order2 = address(vault.createOrder(res.market, maxCapacity, 0, orderConfig.curveCuts)); + uint256[] memory indexes = new uint256[](2); + indexes[0] = 1; + indexes[1] = 1; + vm.expectRevert(abi.encodeWithSelector(VaultErrors.DuplicateOrder.selector, order2)); + vault.updateWithdrawQueue(indexes); + + vm.stopPrank(); + } + + function testUpdateOrder() public { + vm.startPrank(curator); + ITermMaxOrder[] memory orders = new ITermMaxOrder[](3); + orders[0] = res.order; + orders[1] = vault.createOrder(res.market, maxCapacity, 0, orderConfig.curveCuts); + orders[2] = vault.createOrder(res.market, maxCapacity, 0, orderConfig.curveCuts); + + int256[] memory changes = new int256[](3); + changes[0] = -3000; + changes[1] = 2000; + changes[2] = 1000; + + uint256[] memory maxSupplies = new uint256[](3); + maxSupplies[0] = maxCapacity - 1; + maxSupplies[1] = maxCapacity + 1; + maxSupplies[2] = maxCapacity; + + CurveCuts[] memory curveCuts = new CurveCuts[](3); + CurveCuts memory newCurveCuts = orderConfig.curveCuts; + newCurveCuts.lendCurveCuts[0].liqSquare++; + curveCuts[0] = newCurveCuts; + newCurveCuts.lendCurveCuts[0].liqSquare++; + curveCuts[1] = newCurveCuts; + newCurveCuts.lendCurveCuts[0].liqSquare++; + curveCuts[2] = newCurveCuts; + + uint256[] memory balancesBefore = new uint256[](3); + balancesBefore[0] = res.ft.balanceOf(address(orders[0])); + balancesBefore[1] = res.ft.balanceOf(address(orders[1])); + balancesBefore[2] = res.ft.balanceOf(address(orders[2])); + vault.updateOrders(orders, changes, maxSupplies, curveCuts); + + for (uint256 i = 0; i < orders.length; i++) { + assertEq(orders[i].orderConfig().maxXtReserve, maxSupplies[i]); + if (changes[i] < 0) { + assertEq(res.ft.balanceOf(address(orders[i])), balancesBefore[i] - (-changes[i]).toUint256()); + } else { + assertEq(res.ft.balanceOf(address(orders[i])), balancesBefore[i] + changes[i].toUint256()); + } + assertEq( + orders[i].orderConfig().curveCuts.lendCurveCuts[0].liqSquare, curveCuts[i].lendCurveCuts[0].liqSquare + ); + } + + vm.stopPrank(); + } + + function testDeposit() public { + vm.warp(currentTime + 2 days); + buyXt(48.219178e8, 1000e8); + + vm.warp(currentTime + 2 days); + address lper2 = vm.randomAddress(); + uint256 amount2 = 20000e8; + res.debt.mint(lper2, amount2); + vm.startPrank(lper2); + res.debt.approve(address(vault), amount2); + uint256 share = vault.previewDeposit(amount2); + vault.deposit(amount2, lper2); + assertEq(vault.balanceOf(lper2), share); + + vm.stopPrank(); + } + + function testDepositWhenNoOrders() public { + initialParams.name = "Vault-DAI2"; + initialParams.symbol = "Vault-DAI2"; + ITermMaxVault vault2 = DeployUtils.deployVault(initialParams); + vm.startPrank(deployer); + uint256 amount = 10000e8; + res.debt.mint(deployer, amount); + res.debt.approve(address(vault2), amount); + uint256 share = vault2.previewDeposit(amount); + vault2.deposit(amount, deployer); + assertEq(vault2.balanceOf(deployer), share); + assertEq(vault2.totalFt(), amount); + assertEq(vault2.totalAssets(), amount); + assertEq(vault2.totalSupply(), share); + vm.stopPrank(); + + vm.startPrank(lper); + res.debt.mint(lper, amount); + res.debt.approve(address(vault2), amount); + uint256 share2 = vault2.previewDeposit(amount); + vault2.deposit(amount, lper); + assertEq(vault2.balanceOf(lper), share2); + assertEq(vault2.totalFt(), amount + amount); + assertEq(vault2.totalAssets(), amount + amount); + assertEq(vault2.totalSupply(), share + share2); + vm.stopPrank(); + } + + function testRedeem() public { + vm.warp(currentTime + 2 days); + buyXt(48.219178e8, 1000e8); + vm.warp(currentTime + 4 days); + address lper2 = vm.randomAddress(); + uint256 amount2 = 10000e8; + res.debt.mint(lper2, amount2); + vm.startPrank(lper2); + res.debt.approve(address(vault), amount2); + vault.deposit(amount2, lper2); + vm.stopPrank(); + + vm.startPrank(deployer); + uint256 totalFt = vault.totalFt(); + uint256 lockedFr = vault.totalAssets(); + + uint256 share = vault.balanceOf(deployer); + uint256 redeemmedAmt = vault.previewRedeem(share); + assertEq(redeemmedAmt, vault.redeem(share, deployer, deployer)); + assert(redeemmedAmt > 10000e8); + assertEq(vault.totalFt(), totalFt - redeemmedAmt); + assertEq(vault.totalAssets(), lockedFr - redeemmedAmt); + + vm.stopPrank(); + } + + // redeem when balance bigger tha redeemed + function testRedeemCase2() public { + vm.warp(currentTime + 2 days); + buyXt(48.219178e8, 1000e8); + + vm.warp(currentTime + 4 days); + address lper2 = vm.randomAddress(); + uint256 amount2 = 10000e8; + res.debt.mint(lper2, amount2); + vm.startPrank(lper2); + res.debt.approve(address(vault), amount2); + vault.deposit(amount2, lper2); + vm.stopPrank(); + + vm.startPrank(curator); + ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); + orders[0] = res.order; + + int256[] memory changes = new int256[](1); + changes[0] = -1000e8; + + uint256[] memory maxSupplies = new uint256[](1); + maxSupplies[0] = maxCapacity; + + CurveCuts[] memory curveCuts = new CurveCuts[](1); + curveCuts[0] = orderConfig.curveCuts; + + vault.updateOrders(orders, changes, maxSupplies, curveCuts); + vm.stopPrank(); + + vm.startPrank(deployer); + uint256 totalFt = vault.totalFt(); + uint256 lockedFr = vault.totalAssets(); + + uint256 share = 100e8; + uint256 redeemmedAmt = vault.previewRedeem(share); + assertEq(redeemmedAmt, vault.redeem(share, deployer, deployer)); + assert(redeemmedAmt > share); + assertEq(vault.totalFt(), totalFt - redeemmedAmt); + assertEq(vault.totalAssets(), lockedFr - redeemmedAmt); + + vm.stopPrank(); + } + + function testActions() public { + console.log("----day 2----"); + vm.warp(currentTime + 2 days); + buyXt(48.219178e8, 1000e8); + console.log("anulizedInterest:", vault.annualizedInterest()); + console.log("apr:", vault.apr()); + + console.log("----day 3----"); + vm.warp(currentTime + 3 days); + console.log("new principal:", vault.totalAssets()); + address lper2 = vm.randomAddress(); + uint256 amount2 = 10000e8; + res.debt.mint(lper2, amount2); + vm.startPrank(lper2); + res.debt.approve(address(vault), amount2); + vault.deposit(amount2, lper2); + vm.stopPrank(); + console.log("principal after deposit:", vault.totalAssets()); + console.log("total supply:", vault.totalSupply()); + console.log("anulizedInterest:", vault.annualizedInterest()); + console.log("apr:", vault.apr()); + + console.log("----day 4----"); + vm.warp(currentTime + 4 days); + swapFtToXt(94.247e8, 2000e8); + console.log("1-principal after swap:", vault.totalAssets()); + console.log("1-anulizedInterest:", vault.annualizedInterest()); + console.log("1-apr:", vault.apr()); + swapFtToXt(94.247e8, 2000e8); + console.log("2-principal after swap:", vault.totalAssets()); + console.log("2-anulizedInterest:", vault.annualizedInterest()); + console.log("2-apr:", vault.apr()); + + console.log("----day 6----"); + vm.warp(currentTime + 6 days); + console.log("new principal:", vault.totalAssets()); + vm.startPrank(lper2); + console.log("previewRedeem: ", vault.previewRedeem(1000e8)); + assertEq(vault.previewRedeem(1000e8), vault.redeem(1000e8, lper2, lper2)); + console.log("principal after redeem:", vault.totalAssets()); + console.log("total supply:", vault.totalSupply()); + console.log("anulizedInterest:", vault.annualizedInterest()); + console.log("apr:", vault.apr()); + vm.stopPrank(); + + console.log("----day 91----"); + vm.warp(currentTime + 91 days); + console.log("new principal:", vault.totalAssets()); + console.log("previewRedeem: ", vault.previewRedeem(1000e8)); + + console.log("----day 92----"); + vm.warp(currentTime + 92 days); + console.log("new principal:", vault.totalAssets()); + vm.startPrank(lper2); + console.log("previewRedeem: ", vault.previewRedeem(1000e8)); + assertEq(vault.previewRedeem(1000e8), vault.redeem(1000e8, lper2, lper2)); + console.log("principal after redeem:", vault.totalAssets()); + console.log("total supply:", vault.totalSupply()); + console.log("anulizedInterest:", vault.annualizedInterest()); + console.log("apr:", vault.apr()); + vm.stopPrank(); + } + + function testAnulizedInterestLessThanZero() public { + uint128 tokenAmtIn = 100e8; + uint128 ftAmtOut = 100e8; + address taker = vm.randomAddress(); + res.debt.mint(taker, tokenAmtIn); + vm.startPrank(taker); + res.debt.approve(address(res.order), tokenAmtIn); + vm.expectRevert(VaultErrors.OrderHasNegativeInterest.selector); + res.order.swapExactTokenToToken(res.debt, res.ft, taker, tokenAmtIn, ftAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function testLockedFtGreaterThanTotalFt() public { + vm.warp(currentTime + 2 days); + buyXt(50e8, 1000e8); + + vm.warp(currentTime + 4 days); + uint128 tokenAmtIn = 80e8; + uint128 ftAmtOut = 130e8; + + address taker = vm.randomAddress(); + res.debt.mint(taker, tokenAmtIn); + vm.startPrank(taker); + res.debt.approve(address(res.order), tokenAmtIn); + + vm.expectRevert(VaultErrors.LockedFtGreaterThanTotalFt.selector); + res.order.swapExactTokenToToken(res.debt, res.ft, taker, tokenAmtIn, ftAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function testOrderHasNegativeInterest() public { + vm.warp(currentTime + 2 days); + uint128 tokenAmtIn = 90e8; + uint128 ftAmtOut = 100e8; + address taker = vm.randomAddress(); + res.debt.mint(taker, tokenAmtIn); + vm.startPrank(taker); + res.debt.approve(address(res.order), tokenAmtIn); + vm.expectRevert(VaultErrors.OrderHasNegativeInterest.selector); + res.order.swapExactTokenToToken(res.debt, res.ft, taker, tokenAmtIn, ftAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function testRedeemFromMarket() public { + vm.warp(currentTime + 2 days); + buyXt(48.219178e8, 1000e8); + + vm.warp(currentTime + 3 days); + address lper2 = vm.randomAddress(); + uint256 amount2 = 10000e8; + res.debt.mint(lper2, amount2); + vm.startPrank(lper2); + res.debt.approve(address(vault), amount2); + vault.deposit(amount2, lper2); + vm.stopPrank(); + + vm.startPrank(curator); + address order2 = address(vault.createOrder(market2, maxCapacity, 0, orderConfig.curveCuts)); + uint256[] memory indexes = new uint256[](2); + indexes[0] = 1; + indexes[1] = 0; + vault.updateSupplyQueue(indexes); + + res.debt.mint(curator, 10000e8); + res.debt.approve(address(vault), 10000e8); + vault.deposit(10000e8, curator); + + vm.stopPrank(); + + vm.warp(currentTime + 92 days); + + vm.startPrank(lper2); + + vault.redeem(1000e8, lper2, lper2); + vm.stopPrank(); + + uint256 performanceFee = vault.performanceFee(); + vm.prank(curator); + vault.withdrawPerformanceFee(curator, performanceFee); + + assertEq(vault.performanceFee(), 0); + assertEq(vault.annualizedInterest(), 0); + assertEq(vault.supplyQueueLength(), 1); + assertEq(vault.supplyQueue(0), order2); + assertEq(vault.withdrawQueueLength(), 1); + assertEq(vault.withdrawQueue(0), order2); + + vm.warp(currentTime + 182 days); + vm.prank(lper2); + vault.redeem(1000e8, lper2, lper2); + + vm.prank(curator); + vault.redeemOrder(ITermMaxOrder(order2)); + + assertEq(vault.performanceFee(), 0); + assertEq(vault.annualizedInterest(), 0); + assertEq(vault.supplyQueueLength(), 0); + assertEq(vault.withdrawQueueLength(), 0); + } + + function testRedeemFromMarket2() public { + vm.warp(currentTime + 2 days); + buyXt(48.219178e8, 1000e8); + + vm.warp(currentTime + 3 days); + address lper2 = vm.randomAddress(); + uint256 amount2 = 10000e8; + res.debt.mint(lper2, amount2); + vm.startPrank(lper2); + res.debt.approve(address(vault), amount2); + vault.deposit(amount2, lper2); + vm.stopPrank(); + + vm.startPrank(curator); + address order2 = address(vault.createOrder(market2, maxCapacity, 0, orderConfig.curveCuts)); + uint256[] memory indexes = new uint256[](2); + indexes[0] = 1; + indexes[1] = 0; + vault.updateSupplyQueue(indexes); + + res.debt.mint(curator, 10000e8); + res.debt.approve(address(vault), 10000e8); + vault.deposit(10000e8, curator); + + vm.stopPrank(); + + (, IERC20 xt,,,) = market2.tokens(); + + vm.warp(currentTime + 4 days); + { + address taker = vm.randomAddress(); + uint128 tokenAmtIn = 50e8; + res.debt.mint(taker, tokenAmtIn); + vm.startPrank(taker); + res.debt.approve(address(order2), tokenAmtIn); + ITermMaxOrder(order2).swapExactTokenToToken( + res.debt, xt, taker, tokenAmtIn, 1000e8, block.timestamp + 1 hours + ); + vm.stopPrank(); + } + + vm.warp(currentTime + 92 days); + + { + address taker = vm.randomAddress(); + uint128 tokenAmtIn = 50e8; + res.debt.mint(taker, tokenAmtIn); + vm.startPrank(taker); + res.debt.approve(address(order2), tokenAmtIn); + ITermMaxOrder(order2).swapExactTokenToToken( + res.debt, xt, taker, tokenAmtIn, 1000e8, block.timestamp + 1 hours + ); + vm.stopPrank(); + } + + vm.prank(lper2); + vault.redeem(100e8, lper2, lper2); + + uint256 performanceFee = vault.performanceFee(); + vm.prank(curator); + vault.withdrawPerformanceFee(curator, performanceFee); + + assertEq(vault.performanceFee(), 0); + assertGt(vault.annualizedInterest(), 0); + assertEq(vault.supplyQueueLength(), 1); + assertEq(vault.supplyQueue(0), order2); + assertEq(vault.withdrawQueueLength(), 1); + assertEq(vault.withdrawQueue(0), order2); + + vm.warp(currentTime + 182 days); + vm.prank(lper2); + vault.redeem(100e8, lper2, lper2); + + vm.prank(curator); + vault.redeemOrder(ITermMaxOrder(order2)); + + assertGt(vault.performanceFee(), 0); + assertEq(vault.annualizedInterest(), 0); + assertEq(vault.supplyQueueLength(), 0); + assertEq(vault.withdrawQueueLength(), 0); + } + + function testBadDebt() public { + vm.warp(currentTime + 2 days); + buyXt(48.219178e8, 1000e8); + + vm.warp(currentTime + 3 days); + address lper2 = vm.randomAddress(); + uint256 amount2 = 10000e8; + res.debt.mint(lper2, amount2); + vm.startPrank(lper2); + res.debt.approve(address(vault), amount2); + vault.deposit(amount2, lper2); + vm.stopPrank(); + + address borrower = vm.randomAddress(); + vm.startPrank(borrower); + LoanUtils.fastMintGt(res, borrower, 1000e8, 1e18); + vm.stopPrank(); + + vm.warp(marketConfig.maturity + 1 days); + + uint256 propotion = (res.ft.balanceOf(address(res.order)) * Constants.DECIMAL_BASE_SQ) + / (res.ft.totalSupply() - res.ft.balanceOf(address(res.market))); + + uint256 tokenOut = (res.debt.balanceOf(address(res.market)) * propotion) / Constants.DECIMAL_BASE_SQ; + uint256 badDebt = res.ft.balanceOf(address(res.order)) - tokenOut; + uint256 delivered = (propotion * 1e18) / Constants.DECIMAL_BASE_SQ; + + vm.startPrank(lper2); + vault.redeem(1000e8, lper2, lper2); + vm.stopPrank(); + + assertEq(vault.badDebtMapping(address(res.collateral)), badDebt); + assertEq(res.collateral.balanceOf(address(vault)), delivered); + + uint256 shareToDealBadDebt = vault.previewWithdraw(badDebt / 2); + vm.startPrank(lper2); + (uint256 shares, uint256 collateralOut) = vault.dealBadDebt(address(res.collateral), badDebt / 2, lper2, lper2); + assertEq(shares, shareToDealBadDebt); + assertEq(collateralOut, ((badDebt / 2) * delivered) / badDebt); + assertEq(vault.badDebtMapping(address(res.collateral)), badDebt - badDebt / 2); + assertEq(res.collateral.balanceOf(address(vault)), delivered - collateralOut); + vm.stopPrank(); + + vm.startPrank(lper2); + shareToDealBadDebt = vault.previewWithdraw(badDebt - badDebt / 2); + uint256 remainningCollateral = res.collateral.balanceOf(address(vault)); + vm.expectEmit(); + emit VaultEvents.DealBadDebt( + lper2, lper2, address(res.collateral), badDebt - badDebt / 2, shareToDealBadDebt, remainningCollateral + ); + (shares, collateralOut) = vault.dealBadDebt(address(res.collateral), badDebt - badDebt / 2, lper2, lper2); + assertEq(shares, shareToDealBadDebt); + assertEq(collateralOut, remainningCollateral); + assertEq(vault.badDebtMapping(address(res.collateral)), 0); + assertEq(res.collateral.balanceOf(address(vault)), 0); + vm.stopPrank(); + } + + function testDealBadDebtRevert() public { + vm.warp(currentTime + 2 days); + buyXt(48.219178e8, 1000e8); + + vm.warp(currentTime + 3 days); + address lper2 = vm.randomAddress(); + uint256 amount2 = 10000e8; + res.debt.mint(lper2, amount2); + vm.startPrank(lper2); + res.debt.approve(address(vault), amount2); + vault.deposit(amount2, lper2); + vm.stopPrank(); + + address borrower = vm.randomAddress(); + vm.startPrank(borrower); + LoanUtils.fastMintGt(res, borrower, 1000e8, 1e18); + vm.stopPrank(); + + vm.warp(currentTime + 92 days); + vm.startPrank(lper2); + vault.redeem(1000e8, lper2, lper2); + + uint256 badDebt = vault.badDebtMapping(address(res.collateral)); + vm.expectRevert(abi.encodeWithSelector(VaultErrors.InsufficientFunds.selector, badDebt, 2000e8)); + vault.dealBadDebt(address(res.collateral), 2000e8, lper2, lper2); + + vault.dealBadDebt(address(res.collateral), badDebt, lper2, lper2); + + vm.expectRevert(abi.encodeWithSelector(VaultErrors.NoBadDebt.selector, address(res.collateral))); + vault.dealBadDebt(address(res.collateral), 10e8, lper2, lper2); + + vm.stopPrank(); + } + + function buyFt(uint128 tokenAmtIn, uint128 ftAmtOut) internal { + address taker = vm.randomAddress(); + res.debt.mint(taker, tokenAmtIn); + vm.startPrank(taker); + res.debt.approve(address(res.order), tokenAmtIn); + res.order.swapExactTokenToToken(res.debt, res.ft, taker, tokenAmtIn, ftAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function buyXt(uint128 tokenAmtIn, uint128 xtAmtOut) internal { + address taker = vm.randomAddress(); + res.debt.mint(taker, tokenAmtIn); + vm.startPrank(taker); + res.debt.approve(address(res.order), tokenAmtIn); + res.order.swapExactTokenToToken(res.debt, res.xt, taker, tokenAmtIn, xtAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function sellFt(uint128 ftAmtIn, uint128 tokenAmtOut) internal { + address taker = vm.randomAddress(); + vm.prank(deployer); + res.ft.transfer(taker, ftAmtIn); + vm.startPrank(taker); + res.ft.approve(address(res.order), ftAmtIn); + res.order.swapExactTokenToToken(res.ft, res.debt, taker, ftAmtIn, tokenAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function sellXt(uint128 xtAmtIn, uint128 tokenAmtOut) internal { + address taker = vm.randomAddress(); + vm.prank(deployer); + res.xt.transfer(taker, xtAmtIn); + vm.startPrank(taker); + res.xt.approve(address(res.order), xtAmtIn); + res.order.swapExactTokenToToken(res.xt, res.debt, taker, xtAmtIn, tokenAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function swapFtToXt(uint128 ftAmtIn, uint128 xtAmtOut) internal { + address taker = vm.randomAddress(); + vm.prank(deployer); + res.ft.transfer(taker, ftAmtIn); + vm.startPrank(taker); + res.ft.approve(address(res.order), ftAmtIn); + res.order.swapExactTokenToToken(res.ft, res.xt, taker, ftAmtIn, xtAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function swapXtToFt(uint128 xtAmtIn, uint128 ftAmtOut) internal { + address taker = vm.randomAddress(); + vm.prank(deployer); + res.xt.transfer(taker, xtAmtIn); + vm.startPrank(taker); + res.xt.approve(address(res.order), xtAmtIn); + res.order.swapExactTokenToToken(res.xt, res.ft, taker, xtAmtIn, ftAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function testFixFindings101() public { + vm.prank(curator); + vault.createOrder(res.market, maxCapacity, 0, orderConfig.curveCuts); + address lper = vm.randomAddress(); + + res.debt.mint(lper, 100 ether); + + // depositing funds for lp1 + vm.startPrank(lper); + res.debt.approve(address(vault), 100 ether); + vault.deposit(100 ether, lper); + vm.stopPrank(); + + vm.warp(currentTime + 110 days); + + vm.startPrank(lper); + vault.withdraw(100 ether, lper, lper); + } + + function _daysToMaturity(uint256 _now) internal view returns (uint256 daysToMaturity) { + daysToMaturity = (res.market.config().maturity - _now + Constants.SECONDS_IN_DAY - 1) / Constants.SECONDS_IN_DAY; + } +} diff --git a/test/v1/VaultDust.t.sol b/test/v1/VaultDust.t.sol new file mode 100644 index 0000000..4524d04 --- /dev/null +++ b/test/v1/VaultDust.t.sol @@ -0,0 +1,251 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "forge-std/Test.sol"; +import {console} from "forge-std/console.sol"; +import {DeployUtils} from "./utils/DeployUtils.sol"; +import {JSONLoader} from "./utils/JSONLoader.sol"; +import {StateChecker} from "./utils/StateChecker.sol"; +import {SwapUtils} from "./utils/SwapUtils.sol"; +import {LoanUtils} from "./utils/LoanUtils.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; +import {IFlashLoanReceiver} from "contracts/v1/IFlashLoanReceiver.sol"; +import {ITermMaxMarket, TermMaxMarket, Constants, MarketEvents, MarketErrors} from "contracts/v1/TermMaxMarket.sol"; +import {ITermMaxOrder, TermMaxOrder, ISwapCallback, OrderEvents, OrderErrors} from "contracts/v1/TermMaxOrder.sol"; +import {MockERC20, ERC20} from "contracts/v1/test/MockERC20.sol"; +import {IMintableERC20} from "contracts/v1/tokens/IMintableERC20.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {TermMaxVault} from "contracts/v1/vault/TermMaxVault.sol"; +import {VaultErrors, VaultEvents, ITermMaxVault} from "contracts/v1/vault/TermMaxVault.sol"; +import {OrderManager, OrderInfo} from "contracts/v1/vault/OrderManager.sol"; +import {VaultConstants} from "contracts/v1/lib/VaultConstants.sol"; +import {PendingAddress, PendingUint192} from "contracts/v1/lib/PendingLib.sol"; +import "contracts/v1/storage/TermMaxStorage.sol"; + +contract VaultDustTest is Test { + using JSONLoader for *; + using SafeCast for *; + + OrderConfig orderConfig; + MarketConfig marketConfig; + + address deployer = vm.randomAddress(); + address curator = vm.randomAddress(); + address allocator = vm.randomAddress(); + address guardian = vm.randomAddress(); + address lper = vm.randomAddress(); + address treasurer = vm.randomAddress(); + string testdata; + + ITermMaxVault vault; + + uint256 timelock = 86400; + uint256 maxCapacity = 1000000e18; + uint64 performanceFeeRate = 0.1e8; + + ITermMaxMarket market2; + + uint256 currentTime; + uint32 maxLtv = 0.89e8; + uint32 liquidationLtv = 0.9e8; + VaultInitialParams initialParams; + + DeployUtils.Res[] resources; + + address bob = vm.addr(0x123); + address alice = vm.addr(0x456); + address charlie = vm.addr(0x789); + + address[] users = [bob, alice, charlie]; + + uint256[] durations = [3, 4, 10, 20, 5, 5, 3, 15, 20, 12]; + + function setUp() public { + vm.startPrank(deployer); + testdata = vm.readFile(string.concat(vm.projectRoot(), "/test/testdata/testdata.json")); + + currentTime = vm.parseUint(vm.parseJsonString(testdata, ".currentTime")); + vm.warp(currentTime); + + marketConfig = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); + orderConfig = JSONLoader.getOrderConfigFromJson(testdata, ".orderConfig"); + + MockERC20 debt = new MockERC20("DAI", "DAI", 6); + for (uint256 i = 0; i < 10; i++) { + resources.push( + DeployUtils.deployMockMarket2(deployer, debt, durations[i], marketConfig, maxLtv, liquidationLtv) + ); + } + + initialParams = VaultInitialParams( + deployer, curator, timelock, debt, maxCapacity, "Vault-DAI", "Vault-DAI", performanceFeeRate + ); + + vault = DeployUtils.deployVault(initialParams); + + vault.submitGuardian(guardian); + vault.setIsAllocator(allocator, true); + + for (uint256 i = 0; i < resources.length; i++) { + address market = address(resources[i].market); + vault.submitMarket(market, true); + vm.warp(currentTime + timelock + 1); + vault.acceptMarket(market); + vm.warp(currentTime); + } + + vm.stopPrank(); + + debt.mint(bob, 10000e16); + vm.startPrank(bob); + debt.approve(address(vault), maxCapacity); + vault.deposit(10000e16 / 2, bob); + vm.stopPrank(); + + vm.startPrank(alice); + debt.mint(alice, 5000e18); + debt.approve(address(vault), maxCapacity); + vault.deposit(5000e18 / 2, alice); + vm.stopPrank(); + + vm.startPrank(charlie); + debt.mint(charlie, 20e15); + debt.approve(address(vault), maxCapacity); + vault.deposit(20e15 / 2, charlie); + vm.stopPrank(); + + for (uint256 i = 0; i < resources.length; i++) { + vm.startPrank(deployer); + ITermMaxMarket market = resources[i].market; + resources[i].order = vault.createOrder(market, maxCapacity, i * 1e15, orderConfig.curveCuts); + vm.stopPrank(); + } + } + + function testDust() public { + uint256 count = 0; + while (block.timestamp < currentTime + 30 days) { + uint256 k = vm.randomUint(2 ** 128 - 1, 2 ** 256 - 1); + uint256 period = vm.randomUint(2000, 3600); + count++; + vm.warp(block.timestamp); + uint256 i = k % 10; + // ITermMaxMarket market = resources[i].market; + ITermMaxOrder order = resources[i].order; + uint256 amount = k % 1e4; + // (, uint256 borrowApr) = order.apr(); + // uint256 virturalApr = borrowApr * (block.timestamp - currentTime) / 365 days; + uint256 ftBalance = resources[i].ft.balanceOf(address(order)); + uint256 xtBalance = resources[i].xt.balanceOf(address(order)); + + if (xtBalance < ftBalance * 8 / 10 && amount * 2 < ftBalance) { + console.log("buy ft:", amount); + buyFt(order, uint128(amount), uint128(amount * 2)); + } else if (amount * 2 < xtBalance) { + console.log("buy xt:", amount); + buyXt(order, uint128(amount), uint128(amount * 2)); + } + + if (i < 3) { + vm.prank(users[i]); + if (block.timestamp % 2 == 0) { + console.log("redeem:", i); + vault.redeem(1e5, users[i], users[i]); + } else { + console.log("deposit:", i); + vault.deposit(1e5, users[i]); + } + } + + vm.warp(block.timestamp + period); + } + vm.warp(block.timestamp + 60 days); + console.log("---- do redeem ---"); + for (uint256 i = 0; i < resources.length; i++) { + vm.prank(curator); + vault.redeemOrder(resources[i].order); + } + uint256 performanceFee = vault.performanceFee(); + console.log("performanceFee:", performanceFee); + vm.prank(curator); + vault.withdrawPerformanceFee(curator, performanceFee); + + vm.warp(block.timestamp + 10); + console.log("---- status ---"); + console.log("run count:", count); + console.log("total assets:", vault.totalAssets()); + console.log("total supply:", vault.totalSupply()); + console.log("annualizedInterest:", vault.annualizedInterest()); + console.log("apr:", vault.apr()); + console.log("total ft:", vault.totalFt()); + console.log("actual balance:", resources[0].debt.balanceOf(address(vault))); + console.log("accretingPrincipal:", vault.accretingPrincipal()); + + console.log("---- do redeem ---"); + console.log("asset:", address(resources[0].debt)); + console.log("vault:", address(vault)); + for (uint256 i = 0; i < resources.length; i++) { + address collateral = address(resources[i].collateral); + if (vault.badDebtMapping(collateral) > 0) { + console.log("badDebt:", vault.badDebtMapping(collateral)); + console.log("collateral:", collateral); + } + } + for (uint256 i = 0; i < users.length; i++) { + console.log("user i:", i); + console.log("balance:", vault.balanceOf(users[i])); + vm.startPrank(users[i]); + uint256 redeemed = vault.redeem(vault.balanceOf(users[i]), users[i], users[i]); + console.log("redeemed:", redeemed); + console.log("remainning total assets:", vault.totalAssets()); + vm.stopPrank(); + } + uint256 dustAmt = resources[0].debt.balanceOf(address(vault)); + console.log("remaining balance:", dustAmt); + assertLe(dustAmt, 3); + } + + function buyFt(ITermMaxOrder order, uint128 tokenAmtIn, uint128 ftAmtOut) internal { + address taker = vm.randomAddress(); + (IMintableERC20 ft, IMintableERC20 xt,,, IERC20 debt) = order.market().tokens(); + IMintableERC20(address(debt)).mint(taker, tokenAmtIn); + vm.startPrank(taker); + debt.approve(address(order), tokenAmtIn); + order.swapExactTokenToToken(debt, ft, taker, tokenAmtIn, ftAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function buyXt(ITermMaxOrder order, uint128 tokenAmtIn, uint128 xtAmtOut) internal { + address taker = vm.randomAddress(); + (IMintableERC20 ft, IMintableERC20 xt,,, IERC20 debt) = order.market().tokens(); + IMintableERC20(address(debt)).mint(taker, tokenAmtIn); + vm.startPrank(taker); + debt.approve(address(order), tokenAmtIn); + order.swapExactTokenToToken(debt, xt, taker, tokenAmtIn, xtAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function sellFt(ITermMaxOrder order, uint128 ftAmtIn, uint128 tokenAmtOut) internal { + address taker = vm.randomAddress(); + (IMintableERC20 ft, IMintableERC20 xt,,, IERC20 debt) = order.market().tokens(); + vm.prank(deployer); + ft.transfer(taker, ftAmtIn); + vm.startPrank(taker); + ft.approve(address(order), ftAmtIn); + order.swapExactTokenToToken(ft, debt, taker, ftAmtIn, tokenAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } + + function sellXt(ITermMaxOrder order, uint128 xtAmtIn, uint128 tokenAmtOut) internal { + address taker = vm.randomAddress(); + (IMintableERC20 ft, IMintableERC20 xt,,, IERC20 debt) = order.market().tokens(); + vm.prank(deployer); + xt.transfer(taker, xtAmtIn); + vm.startPrank(taker); + xt.approve(address(order), xtAmtIn); + order.swapExactTokenToToken(xt, debt, taker, xtAmtIn, tokenAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } +} diff --git a/test/v1/mainnet-fork/.DS_Store b/test/v1/mainnet-fork/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..87a6f5551ee08557e67375c5ef70108e9b17ddf2 GIT binary patch literal 6148 zcmeHKOKQVF43*MA1KoI;N!K9rhCH-T=#6G(4H zqc_HHVOb)g>(k3hq!W<^+)yqSTC;QW#%7sOARKoLvX{?u|1rEBo9gQc<37r}?BoFU zFaGcvw_c|)O9iL^6`%rCfC}8Gfc0M3;wg}k3Qz$m@S}iz9}3*CCXRvr=|J!i060h5 z4QrnzfW;EPnm7g`1Jj@agQ_`VXwZ=_SyvOsz@Urf@S*u+%?U;Q>A1gmxo8b!qyki6 zs=z~RJL~_?@IU7NDTzBOKn3nf0iAF9%^I(iy|sBc>$L^Gg badDebt) { + withdrawAmt = badDebt; + } + + vm.startPrank(lper2); + (uint256 shares, uint256 collateralOut) = + res.vault.dealBadDebt(address(res.collateral), withdrawAmt, lper2, lper2); + assertEq(shares, shareToDealBadDebt); + assertEq(collateralOut, (withdrawAmt * delivered) / badDebt); + assertEq(res.vault.badDebtMapping(address(res.collateral)), badDebt - withdrawAmt); + assertEq(res.collateral.balanceOf(address(res.vault)), delivered - collateralOut); + vm.stopPrank(); + } + + function _buyXt(VaultTestRes memory res, uint128 tokenAmtIn, uint128 xtAmtOut) internal { + address taker = vm.randomAddress(); + deal(taker, 1e18); + deal(address(res.debtToken), taker, tokenAmtIn); + vm.startPrank(taker); + res.debtToken.approve(address(res.order), tokenAmtIn); + res.order.swapExactTokenToToken(res.debtToken, res.xt, taker, tokenAmtIn, xtAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } +} diff --git a/test/v1/mainnet-fork/mainnet/ForkGt.t.sol b/test/v1/mainnet-fork/mainnet/ForkGt.t.sol new file mode 100644 index 0000000..9d4bf06 --- /dev/null +++ b/test/v1/mainnet-fork/mainnet/ForkGt.t.sol @@ -0,0 +1,154 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "../GtBaseTest.t.sol"; + +contract ForkGt is GtBaseTest { + string MAINNET_RPC_URL = vm.envString("MAINNET_RPC_URL"); + string DATA_PATH = string.concat(vm.projectRoot(), "/test/testdata/fork/mainnet.json"); + + function _getForkRpcUrl() internal view override returns (string memory) { + return MAINNET_RPC_URL; + } + + function _getDataPath() internal view override returns (string memory) { + return DATA_PATH; + } + + function _finishSetup() internal override {} + + function testBorrow() public { + for (uint256 i = 0; i < tokenPairs.length; i++) { + string memory tokenPair = tokenPairs[i]; + GtTestRes memory res = _initializeGtTestRes(tokenPair); + uint256 collateralAmt = res.orderInitialAmount / 10; + uint128 borrowAmt = uint128(res.orderInitialAmount / 30); + uint128 maxDebtAmt = uint128(res.orderInitialAmount / 20); + _testBorrow(res, collateralAmt, borrowAmt, maxDebtAmt); + } + } + + function testLeverageFromXt() public { + for (uint256 i = 0; i < tokenPairs.length; i++) { + string memory tokenPair = tokenPairs[i]; + GtTestRes memory res = _initializeGtTestRes(tokenPair); + if (res.swapData.tokenType == TokenType.General) { + res.swapData.leverageUnits[0].adapter = res.swapAdapters.odosAdapter; + } else if (res.swapData.tokenType == TokenType.Pendle) { + if (res.swapData.leverageUnits.length == 1) { + res.swapData.leverageUnits[0].adapter = res.swapAdapters.pendleAdapter; + } else { + res.swapData.leverageUnits[1].adapter = res.swapAdapters.pendleAdapter; + res.swapData.leverageUnits[0].adapter = res.swapAdapters.odosAdapter; + } + } else if (res.swapData.tokenType == TokenType.Morpho) { + if (res.swapData.leverageUnits.length == 1) { + res.swapData.leverageUnits[0].adapter = res.swapAdapters.vaultAdapter; + } else { + res.swapData.leverageUnits[1].adapter = res.swapAdapters.vaultAdapter; + res.swapData.leverageUnits[0].adapter = res.swapAdapters.odosAdapter; + } + } + + address taker = vm.randomAddress(); + + _testLeverageFromXt(res, taker, res.swapData.debtAmt, res.swapData.swapAmtIn, res.swapData.leverageUnits); + } + } + + function testFlashRepay() public { + for (uint256 i = 0; i < tokenPairs.length; i++) { + string memory tokenPair = tokenPairs[i]; + GtTestRes memory res = _initializeGtTestRes(tokenPair); + if (res.swapData.tokenType == TokenType.General) { + res.swapData.leverageUnits[0].adapter = res.swapAdapters.odosAdapter; + res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.odosAdapter; + } else if (res.swapData.tokenType == TokenType.Pendle) { + if (res.swapData.leverageUnits.length == 1) { + res.swapData.leverageUnits[0].adapter = res.swapAdapters.pendleAdapter; + res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.pendleAdapter; + } else { + res.swapData.leverageUnits[1].adapter = res.swapAdapters.pendleAdapter; + res.swapData.leverageUnits[0].adapter = res.swapAdapters.odosAdapter; + + res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.pendleAdapter; + res.swapData.flashRepayUnits[1].adapter = res.swapAdapters.odosAdapter; + } + } else if (res.swapData.tokenType == TokenType.Morpho) { + if (res.swapData.leverageUnits.length == 1) { + res.swapData.leverageUnits[0].adapter = res.swapAdapters.vaultAdapter; + res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.vaultAdapter; + } else { + res.swapData.leverageUnits[1].adapter = res.swapAdapters.vaultAdapter; + res.swapData.leverageUnits[0].adapter = res.swapAdapters.odosAdapter; + + res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.vaultAdapter; + res.swapData.flashRepayUnits[1].adapter = res.swapAdapters.odosAdapter; + } + } + + address taker = vm.randomAddress(); + uint256 gtId = _testLeverageFromXt( + res, taker, res.swapData.debtAmt, res.swapData.swapAmtIn, res.swapData.leverageUnits + ); + _testFlashRepay(res, gtId, taker, res.swapData.flashRepayUnits); + } + } + + function testFlashRepayByFt() public { + for (uint256 i = 0; i < tokenPairs.length; i++) { + string memory tokenPair = tokenPairs[i]; + GtTestRes memory res = _initializeGtTestRes(tokenPair); + if (res.swapData.tokenType == TokenType.General) { + res.swapData.leverageUnits[0].adapter = res.swapAdapters.odosAdapter; + res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.odosAdapter; + } else if (res.swapData.tokenType == TokenType.Pendle) { + if (res.swapData.leverageUnits.length == 1) { + res.swapData.leverageUnits[0].adapter = res.swapAdapters.pendleAdapter; + res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.pendleAdapter; + } else { + res.swapData.leverageUnits[1].adapter = res.swapAdapters.pendleAdapter; + res.swapData.leverageUnits[0].adapter = res.swapAdapters.odosAdapter; + + res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.pendleAdapter; + res.swapData.flashRepayUnits[1].adapter = res.swapAdapters.odosAdapter; + } + } else if (res.swapData.tokenType == TokenType.Morpho) { + if (res.swapData.leverageUnits.length == 1) { + res.swapData.leverageUnits[0].adapter = res.swapAdapters.vaultAdapter; + res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.vaultAdapter; + } else { + res.swapData.leverageUnits[1].adapter = res.swapAdapters.vaultAdapter; + res.swapData.leverageUnits[0].adapter = res.swapAdapters.odosAdapter; + + res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.vaultAdapter; + res.swapData.flashRepayUnits[1].adapter = res.swapAdapters.odosAdapter; + } + } + + address taker = vm.randomAddress(); + uint256 gtId = _testLeverageFromXt( + res, taker, res.swapData.debtAmt, res.swapData.swapAmtIn, res.swapData.leverageUnits + ); + _testFlashRepayByFt(res, gtId, taker, res.swapData.flashRepayUnits); + } + } + + function testLiquidate() public { + for (uint256 i = 0; i < tokenPairs.length; i++) { + string memory tokenPair = tokenPairs[i]; + GtTestRes memory res = _initializeGtTestRes(tokenPair); + + address liquidator = vm.randomAddress(); + address borrower = vm.randomAddress(); + + uint256 collateralAmt = res.orderInitialAmount / 10; + uint128 borrowAmt = uint128(res.orderInitialAmount / 20); + + uint256 gtId = _fastLoan(res, borrower, borrowAmt, collateralAmt); + _updateCollateralPrice(res, 0.5e8); + + _testLiquidate(res, liquidator, gtId); + } + } +} diff --git a/test/v1/mainnet-fork/mainnet/ForkMarket.t.sol b/test/v1/mainnet-fork/mainnet/ForkMarket.t.sol new file mode 100644 index 0000000..d24d1fb --- /dev/null +++ b/test/v1/mainnet-fork/mainnet/ForkMarket.t.sol @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "../MarketBaseTest.t.sol"; + +contract ForkMarket is MarketBaseTest { + string MAINNET_RPC_URL = vm.envString("MAINNET_RPC_URL"); + string DATA_PATH = string.concat(vm.projectRoot(), "/test/testdata/fork/mainnet.json"); + + function _getForkRpcUrl() internal view override returns (string memory) { + return MAINNET_RPC_URL; + } + + function _getDataPath() internal view override returns (string memory) { + return DATA_PATH; + } + + function _finishSetup() internal override {} + + function testMint() public { + for (uint256 i = 0; i < tokenPairs.length; i++) { + string memory tokenPair = tokenPairs[i]; + MarketTestRes memory res = _initializeMarketTestRes(tokenPair); + _testMint(res); + } + } + + function testRedeem() public { + for (uint256 i = 0; i < tokenPairs.length; i++) { + string memory tokenPair = tokenPairs[i]; + MarketTestRes memory res = _initializeMarketTestRes(tokenPair); + _testRedeem(res); + } + } + + function testIssueFtByGtWhenSwap() public { + for (uint256 i = 0; i < tokenPairs.length; i++) { + string memory tokenPair = tokenPairs[i]; + MarketTestRes memory res = _initializeMarketTestRes(tokenPair); + uint256 collateralAmt = res.orderInitialAmount / 10; + uint128 debtAmt = uint128(res.orderInitialAmount / 100); + _testIssueFtByGtWhenSwap(res, collateralAmt, debtAmt); + } + } +} diff --git a/test/v1/mainnet-fork/mainnet/ForkPriceFeed.t.sol b/test/v1/mainnet-fork/mainnet/ForkPriceFeed.t.sol new file mode 100644 index 0000000..613e570 --- /dev/null +++ b/test/v1/mainnet-fork/mainnet/ForkPriceFeed.t.sol @@ -0,0 +1,124 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; +import "../ForkBaseTest.sol"; +import {PriceFeedFactory} from "contracts/v1/extensions/PriceFeedFactory.sol"; + +contract ForkPriceFeed is ForkBaseTest { + string MAINNET_RPC_URL = vm.envString("MAINNET_RPC_URL"); + string DATA_PATH = string.concat(vm.projectRoot(), "/test/testdata/fork/mainnet.json"); + + function _getForkRpcUrl() internal view override returns (string memory) { + return MAINNET_RPC_URL; + } + + function _getDataPath() internal view override returns (string memory) { + return DATA_PATH; + } + + function _finishSetup() internal override {} + + function testPriceFeed() public { + PriceFeedFactory priceFeedFactory = new PriceFeedFactory(); + address pendlePYLpOracle = 0x9a9Fa8338dd5E5B2188006f1Cd2Ef26d921650C2; + address pufferEthOracle; + { + address pufferEthToEth = 0x76A495b0bFfb53ef3F0E94ef0763e03cE410835C; + address ethToUsd = 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419; + AggregatorV3Interface pufferEthFeed = + AggregatorV3Interface(priceFeedFactory.createPriceFeedConverter(pufferEthToEth, ethToUsd)); + (, int256 answer,,,) = pufferEthFeed.latestRoundData(); + console.log("pufferEth price feed address", address(pufferEthFeed)); + console.log("pufferEth last answer", answer); + pufferEthOracle = address(pufferEthFeed); + } + + { + address pt_market = 0xB162B764044697cf03617C2EFbcB1f42e31E4766; + address susdeToUsd = 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099; + + AggregatorV3Interface ptFeed = AggregatorV3Interface( + priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, pt_market, 900, susdeToUsd) + ); + (, int256 answer,,,) = ptFeed.latestRoundData(); + console.log("pt_sUsde_29MAY2025 price feed address", address(ptFeed)); + console.log("pt_sUsde_29MAY2025 last answer", answer); + } + + { + address USUALUSDCPlusVault = 0xd63070114470f685b75B74D60EEc7c1113d33a3D; + address usdcToUsd = 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6; + AggregatorV3Interface usdcPlusFeed = + AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usdcToUsd, USUALUSDCPlusVault)); + (, int256 answer,,,) = usdcPlusFeed.latestRoundData(); + console.log("USUALUSDC+ price feed address", address(usdcPlusFeed)); + console.log("USUALUSDC+ last answer", answer); + } + + { + address MCwETHVault = 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8; + address wethToUsd = 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419; + AggregatorV3Interface wethFeed = + AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(wethToUsd, MCwETHVault)); + (, int256 answer,,,) = wethFeed.latestRoundData(); + console.log("MCwETH price feed address", address(wethFeed)); + console.log("MCwETH last answer", answer); + } + + { + address PT_pufETH_26JUN2025_market = 0x58612beB0e8a126735b19BB222cbC7fC2C162D2a; + AggregatorV3Interface ptFeed = AggregatorV3Interface( + priceFeedFactory.createPTWithPriceFeed( + pendlePYLpOracle, PT_pufETH_26JUN2025_market, 900, pufferEthOracle + ) + ); + (, int256 answer,,,) = ptFeed.latestRoundData(); + console.log("pt_pufETH_26JUN2025 price feed address", address(ptFeed)); + console.log("pt_pufETH_26JUN2025 last answer", answer); + } + + { + address eUSDeVault = 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F; + address usdeToUsd = 0xa569d910839Ae8865Da8F8e70FfFb0cBA869F961; + AggregatorV3Interface usdeFeed = + AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usdeToUsd, eUSDeVault)); + (, int256 answer,,,) = usdeFeed.latestRoundData(); + console.log("eUSDe price feed address", address(usdeFeed)); + console.log("eUSDe last answer", answer); + } + + { + address PT_USD0PlusPlus_26JUN2025_market = 0x048680F64d6DFf1748ba6D9a01F578433787e24B; + address usd0PlusPlusToUsd = 0xFC9e30Cf89f8A00dba3D34edf8b65BCDAdeCC1cB; + AggregatorV3Interface usd0PlusPlusFeed = AggregatorV3Interface( + priceFeedFactory.createPTWithPriceFeed( + pendlePYLpOracle, PT_USD0PlusPlus_26JUN2025_market, 900, usd0PlusPlusToUsd + ) + ); + (, int256 answer,,,) = usd0PlusPlusFeed.latestRoundData(); + console.log("PT_USD0PlusPlus_26JUN2025_market price feed address", address(usd0PlusPlusFeed)); + console.log("PT_USD0PlusPlus_26JUN2025_market last answer", answer); + } + + { + address upUSDCVault = 0x80E1048eDE66ec4c364b4F22C8768fc657FF6A42; + address usdcToUsd = 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6; + AggregatorV3Interface usdcFeed = + AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usdcToUsd, upUSDCVault)); + (, int256 answer,,,) = usdcFeed.latestRoundData(); + console.log("upUSDC price feed address", address(usdcFeed)); + console.log("upUSDC last answer", answer); + } + + { + address usualxVault = 0x06B964d96f5dCF7Eae9d7C559B09EDCe244d4B8E; + address usualToUsd = 0x2240AE461B34CC56D654ba5FA5830A243Ca54840; + AggregatorV3Interface usualFeed = + AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usualToUsd, usualxVault)); + (, int256 answer,,,) = usualFeed.latestRoundData(); + console.log("usualx price feed address", address(usualFeed)); + console.log("usualx last answer", answer); + } + } +} diff --git a/test/v1/mainnet-fork/mainnet/ForkVault.t.sol b/test/v1/mainnet-fork/mainnet/ForkVault.t.sol new file mode 100644 index 0000000..0f073dd --- /dev/null +++ b/test/v1/mainnet-fork/mainnet/ForkVault.t.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "../VaultBaseTest.t.sol"; + +contract ForkVault is VaultBaseTest { + string MAINNET_RPC_URL = vm.envString("MAINNET_RPC_URL"); + string DATA_PATH = string.concat(vm.projectRoot(), "/test/testdata/fork/mainnet.json"); + + function _getForkRpcUrl() internal view override returns (string memory) { + return MAINNET_RPC_URL; + } + + function _getDataPath() internal view override returns (string memory) { + return DATA_PATH; + } + + function _finishSetup() internal override {} + + function testDeposit() public { + for (uint256 i = 0; i < tokenPairs.length; i++) { + string memory tokenPair = tokenPairs[i]; + VaultTestRes memory res = _initializeVaultTestRes(tokenPair); + _testDeposit(res); + } + } + + function testRedeem() public { + for (uint256 i = 0; i < tokenPairs.length; i++) { + string memory tokenPair = tokenPairs[i]; + VaultTestRes memory res = _initializeVaultTestRes(tokenPair); + _testRedeem(res); + } + } + + function testBadDebt() public { + for (uint256 i = 0; i < tokenPairs.length; i++) { + string memory tokenPair = tokenPairs[i]; + VaultTestRes memory res = _initializeVaultTestRes(tokenPair); + _testBadDebt(res); + } + } +} diff --git a/test/v1/utils/DeployUtils.sol b/test/v1/utils/DeployUtils.sol new file mode 100644 index 0000000..548eba6 --- /dev/null +++ b/test/v1/utils/DeployUtils.sol @@ -0,0 +1,306 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {console} from "forge-std/Script.sol"; +import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +import {ITermMaxMarket, TermMaxMarket} from "contracts/v1/TermMaxMarket.sol"; +import {ITermMaxOrder, ISwapCallback, TermMaxOrder} from "contracts/v1/TermMaxOrder.sol"; +import {MockERC20, ERC20} from "contracts/v1/test/MockERC20.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {IMintableERC20, MintableERC20} from "contracts/v1/tokens/MintableERC20.sol"; +import {IGearingToken} from "contracts/v1/tokens/IGearingToken.sol"; +import {ITermMaxFactory, TermMaxFactory} from "contracts/v1/factory/TermMaxFactory.sol"; +import {TermMaxRouter} from "contracts/v1/router/TermMaxRouter.sol"; +import {IOracle, OracleAggregator, AggregatorV3Interface} from "contracts/v1/oracle/OracleAggregator.sol"; +import {MockOrder} from "contracts/v1/test/MockOrder.sol"; +import {VaultFactory, IVaultFactory} from "contracts/v1/factory/VaultFactory.sol"; +import {OrderManager} from "contracts/v1/vault/OrderManager.sol"; +import {TermMaxVault, ITermMaxVault} from "contracts/v1/vault/TermMaxVault.sol"; +import {AccessManager} from "contracts/v1/access/AccessManager.sol"; +import "contracts/v1/storage/TermMaxStorage.sol"; + +library DeployUtils { + bytes32 constant GT_ERC20 = keccak256("GearingTokenWithERC20"); + + struct SwapRange { + uint256 buyFtMax; + uint256 buyXtMax; + uint256 sellFtMax; + uint256 sellXtMax; + uint256 buyExactFtMax; + uint256 buyExactXtMax; + uint256 sellFtForExactTokenMax; + uint256 sellXtForExactTokenMax; + } + + struct Res { + ITermMaxVault vault; + IVaultFactory vaultFactory; + TermMaxFactory factory; + ITermMaxOrder order; + TermMaxRouter router; + MarketConfig marketConfig; + OrderConfig orderConfig; + ITermMaxMarket market; + IMintableERC20 ft; + IMintableERC20 xt; + IGearingToken gt; + MockPriceFeed debtOracle; + MockPriceFeed collateralOracle; + OracleAggregator oracle; + MockERC20 collateral; + MockERC20 debt; + SwapRange swapRange; + } + + function deployMarket(address admin, MarketConfig memory marketConfig, uint32 maxLtv, uint32 liquidationLtv) + internal + returns (Res memory res) + { + res.factory = deployFactory(admin); + + res.collateral = new MockERC20("ETH", "ETH", 18); + res.debt = new MockERC20("DAI", "DAI", 8); + + res.debtOracle = new MockPriceFeed(admin); + res.collateralOracle = new MockPriceFeed(admin); + res.oracle = deployOracle(admin, 0); + + res.oracle.submitPendingOracle(address(res.debt), IOracle.Oracle(res.debtOracle, res.debtOracle, 365 days)); + res.oracle.submitPendingOracle( + address(res.collateral), IOracle.Oracle(res.collateralOracle, res.collateralOracle, 365 days) + ); + + res.oracle.acceptPendingOracle(address(res.debt)); + res.oracle.acceptPendingOracle(address(res.collateral)); + + MockPriceFeed.RoundData memory roundData = MockPriceFeed.RoundData({ + roundId: 1, + answer: int256(1e1 ** res.collateralOracle.decimals()), + startedAt: 0, + updatedAt: 0, + answeredInRound: 0 + }); + res.collateralOracle.updateRoundData(roundData); + + MarketInitialParams memory initialParams = MarketInitialParams({ + collateral: address(res.collateral), + debtToken: res.debt, + admin: admin, + gtImplementation: address(0), + marketConfig: marketConfig, + loanConfig: LoanConfig({oracle: res.oracle, liquidationLtv: liquidationLtv, maxLtv: maxLtv, liquidatable: true}), + gtInitalParams: abi.encode(type(uint256).max), + tokenName: "DAI-ETH", + tokenSymbol: "DAI-ETH" + }); + + res.marketConfig = marketConfig; + res.market = ITermMaxMarket(res.factory.createMarket(GT_ERC20, initialParams, 0)); + + (res.ft, res.xt, res.gt,,) = res.market.tokens(); + } + + function deployMarket( + address admin, + MarketConfig memory marketConfig, + uint32 maxLtv, + uint32 liquidationLtv, + address collateral, + address debt + ) internal returns (Res memory res) { + res.factory = deployFactory(admin); + + res.collateral = MockERC20(collateral); + res.debt = MockERC20(debt); + + res.debtOracle = new MockPriceFeed(admin); + res.collateralOracle = new MockPriceFeed(admin); + res.oracle = deployOracle(admin, 0); + + res.oracle.submitPendingOracle(address(res.debt), IOracle.Oracle(res.debtOracle, res.debtOracle, 365 days)); + res.oracle.submitPendingOracle( + address(res.collateral), IOracle.Oracle(res.collateralOracle, res.collateralOracle, 365 days) + ); + res.oracle.acceptPendingOracle(address(res.debt)); + res.oracle.acceptPendingOracle(address(res.collateral)); + + MockPriceFeed.RoundData memory roundData = MockPriceFeed.RoundData({ + roundId: 1, + answer: int256(1e1 ** res.collateralOracle.decimals()), + startedAt: 0, + updatedAt: 0, + answeredInRound: 0 + }); + res.collateralOracle.updateRoundData(roundData); + + MarketInitialParams memory initialParams = MarketInitialParams({ + collateral: address(res.collateral), + debtToken: res.debt, + admin: admin, + gtImplementation: address(0), + marketConfig: marketConfig, + loanConfig: LoanConfig({oracle: res.oracle, liquidationLtv: liquidationLtv, maxLtv: maxLtv, liquidatable: true}), + gtInitalParams: abi.encode(type(uint256).max), + tokenName: "DAI-ETH", + tokenSymbol: "DAI-ETH" + }); + + res.marketConfig = marketConfig; + res.market = ITermMaxMarket(res.factory.createMarket(GT_ERC20, initialParams, 0)); + + (res.ft, res.xt, res.gt,,) = res.market.tokens(); + } + + function deployMockMarket2( + address admin, + IERC20 debt, + uint256 duration, + MarketConfig memory mc, + uint32 maxLtv, + uint32 liquidationLtv + ) internal returns (Res memory res) { + res.factory = deployFactoryWithMockOrder(admin); + res.debt = MockERC20(address(debt)); + MarketConfig memory marketConfig = mc; + marketConfig.maturity += uint64(duration * 1 days); + + res.collateral = new MockERC20("ETH", "ETH", 18); + + res.debtOracle = new MockPriceFeed(admin); + res.collateralOracle = new MockPriceFeed(admin); + res.oracle = deployOracle(admin, 0); + + res.oracle.submitPendingOracle(address(res.debt), IOracle.Oracle(res.debtOracle, res.debtOracle, 365 days)); + res.oracle.submitPendingOracle( + address(res.collateral), IOracle.Oracle(res.collateralOracle, res.collateralOracle, 365 days) + ); + res.oracle.acceptPendingOracle(address(res.debt)); + res.oracle.acceptPendingOracle(address(res.collateral)); + + MockPriceFeed.RoundData memory roundData = MockPriceFeed.RoundData({ + roundId: 1, + answer: int256(1e1 ** res.collateralOracle.decimals()), + startedAt: 0, + updatedAt: 0, + answeredInRound: 0 + }); + res.collateralOracle.updateRoundData(roundData); + + MarketInitialParams memory initialParams = MarketInitialParams({ + collateral: address(res.collateral), + debtToken: res.debt, + admin: admin, + gtImplementation: address(0), + marketConfig: marketConfig, + loanConfig: LoanConfig({oracle: res.oracle, liquidationLtv: liquidationLtv, maxLtv: maxLtv, liquidatable: true}), + gtInitalParams: abi.encode(type(uint256).max), + tokenName: "DAI-ETH", + tokenSymbol: "DAI-ETH" + }); + + res.marketConfig = marketConfig; + res.market = ITermMaxMarket(res.factory.createMarket(GT_ERC20, initialParams, 0)); + + (res.ft, res.xt, res.gt,,) = res.market.tokens(); + } + + function deployMockMarket(address admin, MarketConfig memory marketConfig, uint32 maxLtv, uint32 liquidationLtv) + internal + returns (Res memory res) + { + res.factory = deployFactoryWithMockOrder(admin); + + res.collateral = new MockERC20("ETH", "ETH", 18); + res.debt = new MockERC20("DAI", "DAI", 8); + + res.debtOracle = new MockPriceFeed(admin); + res.collateralOracle = new MockPriceFeed(admin); + res.oracle = deployOracle(admin, 0); + + res.oracle.submitPendingOracle(address(res.debt), IOracle.Oracle(res.debtOracle, res.debtOracle, 365 days)); + res.oracle.submitPendingOracle( + address(res.collateral), IOracle.Oracle(res.collateralOracle, res.collateralOracle, 365 days) + ); + res.oracle.acceptPendingOracle(address(res.debt)); + res.oracle.acceptPendingOracle(address(res.collateral)); + + MockPriceFeed.RoundData memory roundData = MockPriceFeed.RoundData({ + roundId: 1, + answer: int256(1e1 ** res.collateralOracle.decimals()), + startedAt: 0, + updatedAt: 0, + answeredInRound: 0 + }); + res.collateralOracle.updateRoundData(roundData); + + MarketInitialParams memory initialParams = MarketInitialParams({ + collateral: address(res.collateral), + debtToken: res.debt, + admin: admin, + gtImplementation: address(0), + marketConfig: marketConfig, + loanConfig: LoanConfig({oracle: res.oracle, liquidationLtv: liquidationLtv, maxLtv: maxLtv, liquidatable: true}), + gtInitalParams: abi.encode(type(uint256).max), + tokenName: "DAI-ETH", + tokenSymbol: "DAI-ETH" + }); + + res.marketConfig = marketConfig; + res.market = ITermMaxMarket(res.factory.createMarket(GT_ERC20, initialParams, 0)); + + (res.ft, res.xt, res.gt,,) = res.market.tokens(); + } + + function deployOrder( + ITermMaxMarket market, + address maker, + uint256 maxXtReserve, + ISwapCallback swapTrigger, + CurveCuts memory curveCuts + ) public returns (ITermMaxOrder order) { + order = market.createOrder(maker, maxXtReserve, swapTrigger, curveCuts); + } + + function deployFactory(address admin) public returns (TermMaxFactory factory) { + address tokenImplementation = address(new MintableERC20()); + address orderImplementation = address(new TermMaxOrder()); + TermMaxMarket m = new TermMaxMarket(tokenImplementation, orderImplementation); + factory = new TermMaxFactory(admin, address(m)); + } + + function deployFactoryWithMockOrder(address admin) public returns (TermMaxFactory factory) { + address tokenImplementation = address(new MintableERC20()); + address orderImplementation = address(new MockOrder()); + TermMaxMarket m = new TermMaxMarket(tokenImplementation, orderImplementation); + factory = new TermMaxFactory(admin, address(m)); + } + + function deployOracle(address admin, uint256 timeLock) public returns (OracleAggregator oracle) { + oracle = new OracleAggregator(admin, timeLock); + } + + function deployRouter(address admin) public returns (TermMaxRouter router) { + TermMaxRouter implementation = new TermMaxRouter(); + bytes memory data = abi.encodeCall(TermMaxRouter.initialize, admin); + ERC1967Proxy proxy = new ERC1967Proxy(address(implementation), data); + router = TermMaxRouter(address(proxy)); + } + + function deployVault(VaultInitialParams memory initialParams) public returns (ITermMaxVault vault) { + OrderManager orderManager = new OrderManager(); + TermMaxVault implementation = new TermMaxVault(address(orderManager)); + VaultFactory vaultFactory = new VaultFactory(address(implementation)); + + vault = ITermMaxVault(vaultFactory.createVault(initialParams, 0)); + } + + function deployAccessManager(address admin) internal returns (AccessManager accessManager) { + AccessManager implementation = new AccessManager(); + bytes memory data = abi.encodeCall(AccessManager.initialize, admin); + ERC1967Proxy proxy = new ERC1967Proxy(address(implementation), data); + accessManager = AccessManager(address(proxy)); + } +} diff --git a/test/v1/utils/JSONLoader.sol b/test/v1/utils/JSONLoader.sol new file mode 100644 index 0000000..8692ca5 --- /dev/null +++ b/test/v1/utils/JSONLoader.sol @@ -0,0 +1,113 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "forge-std/Test.sol"; +import {StateChecker} from "./StateChecker.sol"; +import "contracts/v1/storage/TermMaxStorage.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {DeployUtils} from "./DeployUtils.sol"; + +library JSONLoader { + Vm constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); + + function getOrderStateFromJson(string memory testdataJSON, string memory key) + internal + pure + returns (StateChecker.OrderState memory state) + { + state.ftReserve = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".ftReserve"))); + state.xtReserve = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".xtReserve"))); + } + + function getMarketConfigFromJson(address treasurer, string memory testdataJSON, string memory key) + internal + pure + returns (MarketConfig memory marketConfig) + { + marketConfig.treasurer = treasurer; + marketConfig.maturity = uint64(vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".maturity")))); + marketConfig.feeConfig.mintGtFeeRatio = + uint32(vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".mintGtFeeRatio")))); + marketConfig.feeConfig.mintGtFeeRef = + uint32(vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".mintGtFeeRef")))); + marketConfig.feeConfig.lendTakerFeeRatio = + uint32(vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".lendTakerFeeRatio")))); + marketConfig.feeConfig.borrowTakerFeeRatio = + uint32(vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".borrowTakerFeeRatio")))); + marketConfig.feeConfig.lendMakerFeeRatio = + uint32(vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".lendMakerFeeRatio")))); + marketConfig.feeConfig.borrowMakerFeeRatio = + uint32(vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".borrowMakerFeeRatio")))); + } + + function getOrderConfigFromJson(string memory testdataJSON, string memory key) + internal + pure + returns (OrderConfig memory orderConfig) + { + orderConfig.maxXtReserve = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".maxXtReserve"))); + orderConfig.gtId = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".gtId"))); + + { + string memory curveCutsPath = string.concat(key, ".borrowCurveCuts"); + uint256 length = + vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".borrowCurveCuts.length"))); + orderConfig.curveCuts.borrowCurveCuts = new CurveCut[](length); + + for (uint256 i = 0; i < length; i++) { + string memory indexPath = string.concat(curveCutsPath, ".", vm.toString(i)); + orderConfig.curveCuts.borrowCurveCuts[i].xtReserve = + vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(indexPath, ".xtReserve"))); + orderConfig.curveCuts.borrowCurveCuts[i].liqSquare = + vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(indexPath, ".liqSquare"))); + orderConfig.curveCuts.borrowCurveCuts[i].offset = + vm.parseInt(vm.parseJsonString(testdataJSON, string.concat(indexPath, ".offset"))); + } + } + { + string memory curveCutsPath = string.concat(key, ".lendCurveCuts"); + uint256 length = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".lendCurveCuts.length"))); + orderConfig.curveCuts.lendCurveCuts = new CurveCut[](length); + + for (uint256 i = 0; i < length; i++) { + string memory indexPath = string.concat(curveCutsPath, ".", vm.toString(i)); + orderConfig.curveCuts.lendCurveCuts[i].xtReserve = + vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(indexPath, ".xtReserve"))); + orderConfig.curveCuts.lendCurveCuts[i].liqSquare = + vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(indexPath, ".liqSquare"))); + orderConfig.curveCuts.lendCurveCuts[i].offset = + vm.parseInt(vm.parseJsonString(testdataJSON, string.concat(indexPath, ".offset"))); + } + } + } + + function getSwapRangeFromJson(string memory testdataJSON, string memory key) + internal + pure + returns (DeployUtils.SwapRange memory swapRange) + { + swapRange.buyFtMax = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".buyFtMax"))); + swapRange.buyXtMax = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".buyXtMax"))); + swapRange.sellFtMax = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".sellFtMax"))); + swapRange.sellXtMax = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".sellXtMax"))); + swapRange.buyExactFtMax = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".buyExactFtMax"))); + swapRange.buyExactXtMax = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".buyExactXtMax"))); + swapRange.sellFtForExactTokenMax = + vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".sellFtForExactTokenMax"))); + swapRange.sellXtForExactTokenMax = + vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".sellXtForExactTokenMax"))); + } + + function getRoundDataFromJson(string memory testdataJSON, string memory key) + internal + pure + returns (MockPriceFeed.RoundData memory priceData) + { + priceData.roundId = uint80(vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".roundId")))); + priceData.answer = vm.parseInt(vm.parseJsonString(testdataJSON, string.concat(key, ".answer"))); + priceData.startedAt = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".startedAt"))); + priceData.updatedAt = vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".updatedAt"))); + priceData.answeredInRound = + uint80(vm.parseUint(vm.parseJsonString(testdataJSON, string.concat(key, ".answeredInRound")))); + } +} diff --git a/test/v1/utils/LoanUtils.sol b/test/v1/utils/LoanUtils.sol new file mode 100644 index 0000000..649fb2d --- /dev/null +++ b/test/v1/utils/LoanUtils.sol @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {console} from "forge-std/Script.sol"; +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; +import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import {Constants} from "contracts/v1/lib/Constants.sol"; +import {DeployUtils} from "./DeployUtils.sol"; + +library LoanUtils { + using SafeCast for uint256; + using SafeCast for int256; + + function calcLtv(DeployUtils.Res memory res, uint256 debtAmt, uint256 collateralAmt) + internal + view + returns (uint256 ltv) + { + (, int256 cPrice,,,) = res.collateralOracle.latestRoundData(); + (, int256 uPrice,,,) = res.debtOracle.latestRoundData(); + uint256 cpDecimals = 10 ** res.collateralOracle.decimals(); + uint256 upDecimals = 10 ** res.debtOracle.decimals(); + uint256 cDecimals = 10 ** res.collateral.decimals(); + uint256 uDecimals = 10 ** res.debt.decimals(); + uint256 debtValue = (debtAmt * uPrice.toUint256()) / uDecimals; + uint256 collateralValue = (collateralAmt * cPrice.toUint256()) / (cpDecimals * cDecimals); + if (collateralValue == 0) { + return 2 ** 128 - 1; + } + ltv = (debtValue * Constants.DECIMAL_BASE) / (collateralValue * upDecimals); + } + + function calcLiquidationResult(DeployUtils.Res memory res, uint256 debtAmt, uint256 collateralAmt, uint256 repayAmt) + internal + view + returns (uint256 cToLiquidator, uint256 cToTreasurer, uint256 remainningC) + { + uint256 REWARD_TO_LIQUIDATOR = 0.05e8; + uint256 REWARD_TO_PROTOCOL = 0.05e8; + (, int256 cPrice,,,) = res.collateralOracle.latestRoundData(); + (, int256 uPrice,,,) = res.debtOracle.latestRoundData(); + uint256 cpDecimals = 10 ** res.collateralOracle.decimals(); + uint256 upDecimals = 10 ** res.debtOracle.decimals(); + uint256 cDecimals = 10 ** res.collateral.decimals(); + uint256 uDecimals = 10 ** res.debt.decimals(); + + uint256 udPriceToCdPrice = + (uPrice.toUint256() * cpDecimals * cpDecimals * 10 + cPrice.toUint256() - 1) / (cPrice.toUint256()); + + uint256 cEqualRepayAmt = (repayAmt * udPriceToCdPrice * cDecimals) / (uDecimals * cpDecimals * upDecimals * 10); + + uint256 rewardToLiquidator = (cEqualRepayAmt * REWARD_TO_LIQUIDATOR) / Constants.DECIMAL_BASE; + uint256 rewardToProtocol = (cEqualRepayAmt * REWARD_TO_PROTOCOL) / Constants.DECIMAL_BASE; + + uint256 removedCollateralAmt = cEqualRepayAmt + rewardToLiquidator + rewardToProtocol; + if (removedCollateralAmt > (collateralAmt * repayAmt) / debtAmt) { + removedCollateralAmt = (collateralAmt * repayAmt) / debtAmt; + } + if (cEqualRepayAmt + rewardToLiquidator >= removedCollateralAmt) { + cToLiquidator = removedCollateralAmt; + } else if (cEqualRepayAmt + rewardToLiquidator + rewardToProtocol >= removedCollateralAmt) { + cToLiquidator = cEqualRepayAmt + rewardToLiquidator; + cToTreasurer = removedCollateralAmt - cToLiquidator; + } else { + cToLiquidator = cEqualRepayAmt + rewardToLiquidator; + cToTreasurer = rewardToProtocol; + } + remainningC = collateralAmt - removedCollateralAmt; + } + + function fastMintGt(DeployUtils.Res memory res, address to, uint128 debtAmt, uint256 collateralAmt) + internal + returns (uint256 gtId, uint128 ftOutAmt) + { + res.collateral.mint(to, collateralAmt); + res.collateral.approve(address(res.gt), collateralAmt); + bytes memory collateralData = abi.encode(collateralAmt); + + (gtId, ftOutAmt) = res.market.issueFt(to, debtAmt, collateralData); + } +} diff --git a/test/v1/utils/StateChecker.sol b/test/v1/utils/StateChecker.sol new file mode 100644 index 0000000..d04ec9d --- /dev/null +++ b/test/v1/utils/StateChecker.sol @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {console} from "forge-std/console.sol"; +import {DeployUtils} from "./DeployUtils.sol"; +import "contracts/v1/storage/TermMaxStorage.sol"; + +library StateChecker { + struct MarketState { + uint256 collateralReserve; + uint256 debtReserve; + } + + struct OrderState { + uint256 ftReserve; + uint256 xtReserve; + } + + function checkMarketState(DeployUtils.Res memory res, MarketState memory expect) internal view { + require(res.collateral.balanceOf(address(res.gt)) == expect.collateralReserve, "collateralReserve unexpect"); + require(res.debt.balanceOf(address(res.market)) == expect.debtReserve, "debtReserve unexpect"); + } + + function getMarketState(DeployUtils.Res memory res) internal view returns (MarketState memory state) { + state.collateralReserve = res.collateral.balanceOf(address(res.gt)); + state.debtReserve = res.debt.balanceOf(address(res.market)); + } + + function checkOrderState(DeployUtils.Res memory res, OrderState memory expect) internal view { + address order = address(res.order); + require(res.ft.balanceOf(order) == expect.ftReserve, "ftReserve unexpect"); + require(res.xt.balanceOf(order) == expect.xtReserve, "xtReserve unexpect"); + } + + function getOrderState(DeployUtils.Res memory res) internal view returns (OrderState memory state) { + address order = address(res.order); + state.ftReserve = res.ft.balanceOf(order); + state.xtReserve = res.xt.balanceOf(order); + } + + function getUserBalances(DeployUtils.Res memory res, address user) + internal + view + returns (uint256[6] memory balances) + { + balances[0] = res.ft.balanceOf(user); + balances[1] = res.xt.balanceOf(user); + balances[2] = res.debt.balanceOf(user); + balances[3] = res.collateral.balanceOf(user); + } +} diff --git a/test/v1/utils/SwapUtils.sol b/test/v1/utils/SwapUtils.sol new file mode 100644 index 0000000..80e6ef4 --- /dev/null +++ b/test/v1/utils/SwapUtils.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {console} from "forge-std/Script.sol"; +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; +import {Constants} from "contracts/v1/lib/Constants.sol"; +import {DeployUtils} from "./DeployUtils.sol"; + +library SwapUtils { + using SafeCast for uint256; + using SafeCast for int256; + + function getPrice(DeployUtils.Res memory res) internal view returns (uint256 pFt, uint256 pXt) { + (uint256 lendApr_, uint256 borrowApr_) = res.order.apr(); + + uint256 dtm = daysToMaturity(res.market.config().maturity); + pFt = Constants.DECIMAL_BASE_SQ / (Constants.DECIMAL_BASE + (lendApr_ * dtm) / Constants.DAYS_IN_YEAR); + uint256 pFtBorrow = + Constants.DECIMAL_BASE_SQ / (Constants.DECIMAL_BASE + (borrowApr_ * dtm) / Constants.DAYS_IN_YEAR); + pXt = Constants.DECIMAL_BASE - pFtBorrow / Constants.DECIMAL_BASE; + } + + function daysToMaturity(uint256 maturity) internal view returns (uint256) { + return (maturity - block.timestamp + Constants.SECONDS_IN_DAY - 1) / Constants.SECONDS_IN_DAY; + } +} From ac2b0035ba7f009a24649c8fe7013c9ae245582d Mon Sep 17 00:00:00 2001 From: Evan Date: Wed, 4 Jun 2025 11:52:16 +0800 Subject: [PATCH 061/194] add comments --- contracts/v2/ITermMaxMarketV2.sol | 32 +++++ contracts/v2/access/AccessManagerV2.sol | 29 +++- contracts/v2/errors/TermMaxTokenErrors.sol | 19 +++ contracts/v2/events/GearingTokenEventsV2.sol | 37 +++++- contracts/v2/events/TermMaxTokenEvents.sol | 61 ++++++++- contracts/v2/factory/TermMaxFactoryV2.sol | 61 ++++++++- .../v2/factory/TermMaxPriceFeedFactoryV2.sol | 41 ++++++ contracts/v2/lib/MarketConstantsV2.sol | 19 +++ contracts/v2/oracle/IOracleV2.sol | 53 +++++++- contracts/v2/oracle/OracleAggregatorV2.sol | 89 +++++++++++-- iamges/termmax_token_docs.md | 124 ------------------ iamges/tmxUSDC_burn.md | 49 ------- iamges/tmxUSDC_mint.md | 50 ------- iamges/tmx_initialize.md | 58 -------- .../tmx_updateBufferConfigAndAddReserves.md | 25 ---- iamges/tmx_withdrawIncomeAssets.md | 67 ---------- 16 files changed, 413 insertions(+), 401 deletions(-) delete mode 100644 iamges/termmax_token_docs.md delete mode 100644 iamges/tmxUSDC_burn.md delete mode 100644 iamges/tmxUSDC_mint.md delete mode 100644 iamges/tmx_initialize.md delete mode 100644 iamges/tmx_updateBufferConfigAndAddReserves.md delete mode 100644 iamges/tmx_withdrawIncomeAssets.md diff --git a/contracts/v2/ITermMaxMarketV2.sol b/contracts/v2/ITermMaxMarketV2.sol index 5104606..d8869c5 100644 --- a/contracts/v2/ITermMaxMarketV2.sol +++ b/contracts/v2/ITermMaxMarketV2.sol @@ -4,15 +4,47 @@ pragma solidity ^0.8.0; /** * @title TermMax Market V2 interface * @author Term Structure Labs + * @notice Interface for TermMax V2 markets with enhanced functionality over V1 + * @dev Extends the base market functionality with additional features for better user experience */ interface ITermMaxMarketV2 { + /** + * @notice Returns the human-readable name of the market + * @dev Used for identification and display purposes in V2 markets + * @return The name string of the market (e.g., "Termmax Market:USDC-24-Dec") + */ function name() external view returns (string memory); + /** + * @notice Burns FT and XT tokens on behalf of an owner to redeem underlying tokens + * @dev V2 enhancement allowing third-party burning with proper authorization + * @param owner The address that owns the tokens to be burned + * @param recipient The address that will receive the redeemed underlying tokens + * @param debtTokenAmt The amount of debt tokens (FT/XT pairs) to burn + */ function burn(address owner, address recipient, uint256 debtTokenAmt) external; + /** + * @notice Creates a leveraged position using XT tokens from a specified owner + * @dev V2 enhancement allowing leverage creation on behalf of another address + * @param xtOwner The address that owns the XT tokens to be used for leverage + * @param recipient The address that will receive the generated GT (Gearing Token) + * @param xtAmt The amount of XT tokens to use for creating the leveraged position + * @param callbackData Encoded data passed to the flash loan callback for collateral handling + * @return gtId The ID of the newly minted Gearing Token representing the leveraged position + */ function leverageByXt(address xtOwner, address recipient, uint128 xtAmt, bytes calldata callbackData) external returns (uint256 gtId); + /** + * @notice Redeems FT tokens on behalf of an owner after market maturity + * @dev V2 enhancement allowing third-party redemption with proper authorization + * @param ftOwner The address that owns the FT tokens to be redeemed + * @param recipient The address that will receive the redeemed assets + * @param ftAmount The amount of FT tokens to redeem + * @return debtTokenAmt The amount of underlying debt tokens received + * @return deliveryData Encoded data containing collateral delivery information + */ function redeem(address ftOwner, address recipient, uint256 ftAmount) external returns (uint256, bytes memory); } diff --git a/contracts/v2/access/AccessManagerV2.sol b/contracts/v2/access/AccessManagerV2.sol index a32c455..4924afa 100644 --- a/contracts/v2/access/AccessManagerV2.sol +++ b/contracts/v2/access/AccessManagerV2.sol @@ -7,9 +7,19 @@ import {IOracleV2} from "../oracle/IOracleV2.sol"; /** * @title TermMax Access Manager V2 * @author Term Structure Labs + * @notice Extended access manager for TermMax V2 protocol with additional oracle and batch operations + * @dev Inherits from AccessManager V1 and adds V2-specific functionality for managing oracles and batch operations */ contract AccessManagerV2 is AccessManager { - /// @notice Set the switch of multiple entities + + /** + * @notice Batch pause/unpause multiple entities in a single transaction + * @dev Allows efficient management of multiple pausable contracts simultaneously + * @param entities Array of IPausable contracts to pause/unpause + * @param state True to unpause entities, false to pause them + * @custom:access Requires PAUSER_ROLE + * @custom:gas-optimization Uses a simple loop for batch operations + */ function batchSetSwitch(IPausable[] calldata entities, bool state) external onlyRole(PAUSER_ROLE) { for (uint256 i = 0; i < entities.length; i++) { if (state) { @@ -20,6 +30,15 @@ contract AccessManagerV2 is AccessManager { } } + /** + * @notice Submit a pending oracle configuration for a specific asset + * @dev Allows oracle managers to propose new oracle configurations that can be activated later + * @param aggregator The oracle aggregator contract to submit the pending oracle to + * @param asset The asset address for which the oracle is being configured + * @param oracle The oracle configuration structure containing price feed details + * @custom:access Requires ORACLE_ROLE + * @custom:security Oracle updates go through a pending mechanism for security + */ function submitPendingOracle(IOracleV2 aggregator, address asset, IOracleV2.Oracle memory oracle) external onlyRole(ORACLE_ROLE) @@ -27,6 +46,14 @@ contract AccessManagerV2 is AccessManager { aggregator.submitPendingOracle(asset, oracle); } + /** + * @notice Revoke a pending oracle configuration for a specific asset + * @dev Allows oracle managers to cancel pending oracle updates before they are activated + * @param aggregator The oracle aggregator contract to revoke the pending oracle from + * @param asset The asset address for which the pending oracle should be revoked + * @custom:access Requires ORACLE_ROLE + * @custom:security Provides a way to cancel erroneous oracle submissions + */ function revokePendingOracle(IOracleV2 aggregator, address asset) external onlyRole(ORACLE_ROLE) { aggregator.revokePendingOracle(asset); } diff --git a/contracts/v2/errors/TermMaxTokenErrors.sol b/contracts/v2/errors/TermMaxTokenErrors.sol index c197dc1..d0f5a1f 100644 --- a/contracts/v2/errors/TermMaxTokenErrors.sol +++ b/contracts/v2/errors/TermMaxTokenErrors.sol @@ -1,9 +1,28 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; +/** + * @title TermMax Token Errors + * @author Term Structure Labs + */ interface TermMaxTokenErrors { + /// @notice Error thrown when an invalid or unsupported token is used error InvalidToken(); + + /** + * @notice Error thrown when there's insufficient income available for a requested operation + * @dev Used in income withdrawal scenarios where requested amount exceeds available balance + * @param availableAmount The current available income amount + * @param requestedAmount The amount that was requested but cannot be fulfilled + */ error InsufficientIncomeAmount(uint256 availableAmount, uint256 requestedAmount); + + /** + * @notice Error thrown when an Aave withdrawal operation fails or returns unexpected amounts + * @dev Indicates a mismatch between expected and actual amounts received from Aave protocol + * @param aTokenAmount The amount of aTokens that were attempted to be withdrawn + * @param recieivedAmount The actual amount received from the withdrawal (likely misspelled 'received') + */ error AaveWithdrawFailed(uint256 aTokenAmount, uint256 recieivedAmount); /// @notice Error thrown when trying to accept a change that has no pending value diff --git a/contracts/v2/events/GearingTokenEventsV2.sol b/contracts/v2/events/GearingTokenEventsV2.sol index 19b87b3..e2fc723 100644 --- a/contracts/v2/events/GearingTokenEventsV2.sol +++ b/contracts/v2/events/GearingTokenEventsV2.sol @@ -1,17 +1,42 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; +/** + * @title Gearing Token Events V2 + * @author Term Structure Labs + * @notice Interface defining events for Gearing Token operations in TermMax V2 protocol + */ interface GearingTokenEventsV2 { - /// @notice Emitted when a new Gearing Token is initialized + /** + * @notice Emitted when a new Gearing Token is initialized + * @dev Fired during the setup of a new gearing token with its market association and metadata + * @param market The address of the TermMax market associated with this gearing token + * @param name The human-readable name of the gearing token + * @param symbol The trading symbol of the gearing token + * @param initialData Additional initialization data specific to the token setup + */ event GearingTokenInitialized(address indexed market, string name, string symbol, bytes initialData); - /// @notice Emitted when repaying the debt of Gearing Token - /// @param id The id of Gearing Token - /// @param repayAmt The amount of debt repaid - /// @param byDebtToken Repay using debtToken token or bonds token - /// @param repayAll Repay all the debt + /** + * @notice Emitted when repaying the debt of a Gearing Token + * @dev Tracks standard debt repayment operations for accounting and monitoring purposes + * @param id The unique identifier of the Gearing Token position + * @param repayAmt The amount of debt being repaid (in the debt token denomination) + * @param byDebtToken True if repaying using debt tokens, false if using bond tokens + * @param repayAll True if this repayment closes the entire debt position, false for partial repayment + */ event Repay(uint256 indexed id, uint256 repayAmt, bool byDebtToken, bool repayAll); + /** + * @notice Emitted when executing a flash repayment operation + * @dev Flash repay allows atomic debt repayment with collateral removal in a single transaction + * @param id The unique identifier of the Gearing Token position being repaid + * @param caller The address that initiated the flash repayment transaction + * @param repayAmt The amount of debt being repaid (uint128 for gas optimization) + * @param byDebtToken True if repaying using debt tokens, false if using bond tokens + * @param repayAll True if this repayment closes the entire debt position, false for partial repayment + * @param removedCollateral Encoded data about collateral that was removed during the flash repay operation + */ event FlashRepay( uint256 indexed id, address indexed caller, diff --git a/contracts/v2/events/TermMaxTokenEvents.sol b/contracts/v2/events/TermMaxTokenEvents.sol index 793bb39..f2af610 100644 --- a/contracts/v2/events/TermMaxTokenEvents.sol +++ b/contracts/v2/events/TermMaxTokenEvents.sol @@ -1,19 +1,74 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; +/** + * @title TermMax Token Events + * @author Term Structure Labs + * @notice Interface defining events for TermMax token operations and lifecycle management + * @dev Contains events for token initialization, minting/burning, income withdrawal, buffer management, and upgrade processes + */ interface TermMaxTokenEvents { + /** + * @notice Emitted when a TermMax token is initialized + * @dev Fired during the initial setup of a TermMax token contract + * @param admin The address of the administrator managing the token + * @param underlying The address of the underlying asset (e.g., USDC for tmxUSDC) + */ event TermMaxTokenInitialized(address indexed admin, address indexed underlying); + + /** + * @notice Emitted when tokens are minted to an address + * @dev Tracks token creation events for accounting and monitoring purposes + * @param to The recipient address receiving the newly minted tokens + * @param amount The amount of tokens minted (in token's native decimals) + */ event Mint(address indexed to, uint256 amount); + + /** + * @notice Emitted when tokens are burned from an address + * @dev Tracks token destruction events for accounting and monitoring purposes + * @param to The address from which tokens are being burned + * @param amount The amount of tokens burned (in token's native decimals) + */ event Burn(address indexed to, uint256 amount); + + /** + * @notice Emitted when income is withdrawn from the token contract + * @dev Tracks income distribution events, typically from yield-generating activities + * @param to The recipient address receiving the income withdrawal + * @param amount The amount of income withdrawn (in underlying asset denomination) + */ event WithdrawIncome(address indexed to, uint256 amount); + + /** + * @notice Emitted when buffer configuration parameters are updated + * @dev Buffer configuration manages reserve levels for operational stability + * @param minimumBuffer The minimum buffer threshold required + * @param maximumBuffer The maximum buffer threshold allowed + * @param buffer The current buffer amount after the update + */ event UpdateBufferConfig(uint256 minimumBuffer, uint256 maximumBuffer, uint256 buffer); - /// @notice Event emitted when a new implementation upgrade is submitted with timelock + /** + * @notice Event emitted when a new implementation upgrade is submitted with timelock + * @dev Part of the upgrade mechanism that requires timelock for security + * @param newImplementation The address of the new implementation contract + * @param validAt The timestamp when the upgrade can be executed (after timelock period) + */ event SubmitUpgrade(address indexed newImplementation, uint64 validAt); - /// @notice Event emitted when a pending upgrade is accepted + /** + * @notice Event emitted when a pending upgrade is accepted + * @dev Confirms successful execution of a previously submitted upgrade + * @param caller The address that executed the upgrade acceptance + * @param newImplementation The address of the implementation that was activated + */ event AcceptUpgrade(address indexed caller, address indexed newImplementation); - /// @notice Event emitted when a pending upgrade is revoked + /** + * @notice Event emitted when a pending upgrade is revoked + * @dev Allows cancellation of a pending upgrade before execution + * @param caller The address that revoked the pending upgrade + */ event RevokeUpgrade(address indexed caller); } diff --git a/contracts/v2/factory/TermMaxFactoryV2.sol b/contracts/v2/factory/TermMaxFactoryV2.sol index c9f1d44..4c24852 100644 --- a/contracts/v2/factory/TermMaxFactoryV2.sol +++ b/contracts/v2/factory/TermMaxFactoryV2.sol @@ -12,36 +12,68 @@ import {ITermMaxFactory} from "../../v1/factory/ITermMaxFactory.sol"; import {FactoryEventsV2} from "../events/FactoryEventsV2.sol"; /** - * @title The TermMax factory + * @title TermMax Factory V2 * @author Term Structure Labs + * @notice Factory contract for creating TermMax V2 markets with enhanced functionality + * @dev Manages market deployment, gearing token implementations, and market configuration validation + * Inherits from V1 factory interface while adding V2-specific features for improved market creation */ contract TermMaxFactoryV2 is Ownable2Step, FactoryErrors, FactoryEvents, ITermMaxFactory, FactoryEventsV2 { + /// @notice Constant key for the default ERC20 gearing token implementation bytes32 constant GT_ERC20 = keccak256("GearingTokenWithERC20"); - /// @notice The implementation of TermMax Market contract + /// @notice The implementation of TermMax Market contract used as template for cloning + /// @dev This is set once during construction and cannot be changed address public immutable TERMMAX_MARKET_IMPLEMENTATION; - /// @notice The implementations of TermMax Gearing Token contract - /// @dev Based on the abstract GearingToken contract, - /// different GearingTokens can be adapted to various collaterals, - /// such as ERC20 tokens and ERC721 tokens. + /// @notice Mapping of gearing token implementation names to their contract addresses + /// @dev Based on the abstract GearingToken contract, different GearingTokens can be adapted + /// to various collaterals, such as ERC20 tokens and ERC721 tokens + /// @dev Keys are keccak256 hashes of implementation names for gas efficiency mapping(bytes32 => address) public gtImplements; + /** + * @notice Constructs the TermMax Factory V2 with initial configurations + * @dev Sets up the factory with a market implementation and deploys the default ERC20 gearing token + * @param admin The address that will have administrative privileges over the factory + * @param TERMMAX_MARKET_IMPLEMENTATION_ The address of the TermMax market implementation contract + * @custom:security Only the admin can create markets and manage gearing token implementations + */ constructor(address admin, address TERMMAX_MARKET_IMPLEMENTATION_) Ownable(admin) { if (TERMMAX_MARKET_IMPLEMENTATION_ == address(0)) { revert InvalidImplementation(); } TERMMAX_MARKET_IMPLEMENTATION = TERMMAX_MARKET_IMPLEMENTATION_; + // Deploy and register the default ERC20 gearing token implementation gtImplements[GT_ERC20] = address(new GearingTokenWithERC20V2()); } + /** + * @notice Registers a new gearing token implementation with a given name + * @dev Allows the factory to support different types of gearing tokens for various collateral types + * @param gtImplementName The string name of the gearing token implementation + * @param gtImplement The contract address of the gearing token implementation + * @custom:access Only the factory owner can register new implementations + * @custom:events Emits SetGtImplement event for tracking implementation changes + */ function setGtImplement(string memory gtImplementName, address gtImplement) external onlyOwner { bytes32 key = keccak256(abi.encodePacked(gtImplementName)); gtImplements[key] = gtImplement; emit SetGtImplement(key, gtImplement); } + /** + * @notice Predicts the address where a market will be deployed before actual creation + * @dev Uses CREATE2 deterministic deployment to calculate the future market address + * @param deployer The address that will deploy the market (msg.sender during createMarket) + * @param collateral The address of the collateral token for the market + * @param debtToken The address of the debt token for the market + * @param maturity The maturity timestamp of the market + * @param salt Additional salt value for address generation uniqueness + * @return market The predicted address where the market will be deployed + * @custom:view This is a view function that doesn't modify state + */ function predictMarketAddress( address deployer, address collateral, @@ -54,21 +86,38 @@ contract TermMaxFactoryV2 is Ownable2Step, FactoryErrors, FactoryEvents, ITermMa ); } + /** + * @notice Creates a new TermMax market with specified parameters + * @dev Clones the market implementation and initializes it with the provided parameters + * @param gtKey The key identifying which gearing token implementation to use + * @param params The initial parameters for market configuration including collateral, debt token, and settings + * @param salt Additional entropy for deterministic address generation + * @return market The address of the newly created market contract + * @custom:access Only the factory owner can create new markets + * @custom:validation Validates that the requested gearing token implementation exists + * @custom:events Emits CreateMarket event with market details for indexing and monitoring + */ function createMarket(bytes32 gtKey, MarketInitialParams memory params, uint256 salt) external onlyOwner returns (address market) { + // Retrieve the gearing token implementation for the requested key params.gtImplementation = gtImplements[gtKey]; if (params.gtImplementation == address(0)) { revert CantNotFindGtImplementation(); } + + // Deploy market using CREATE2 for deterministic addressing market = Clones.cloneDeterministic( TERMMAX_MARKET_IMPLEMENTATION, keccak256(abi.encode(msg.sender, params.collateral, params.debtToken, params.marketConfig.maturity, salt)) ); + + // Initialize the newly deployed market with provided parameters ITermMaxMarket(market).initialize(params); + // Emit event for market creation tracking emit CreateMarket(market, params.collateral, params.debtToken, params); } } diff --git a/contracts/v2/factory/TermMaxPriceFeedFactoryV2.sol b/contracts/v2/factory/TermMaxPriceFeedFactoryV2.sol index 0c1c1a5..def4063 100644 --- a/contracts/v2/factory/TermMaxPriceFeedFactoryV2.sol +++ b/contracts/v2/factory/TermMaxPriceFeedFactoryV2.sol @@ -5,15 +5,44 @@ import {TermMaxERC4626PriceFeed} from "../oracle/priceFeeds/TermMaxERC4626PriceF import {TermMaxPriceFeedConverter} from "../oracle/priceFeeds/TermMaxPriceFeedConverter.sol"; import {TermMaxPTPriceFeed} from "../oracle/priceFeeds/TermMaxPTPriceFeed.sol"; +/** + * @title TermMax Price Feed Factory V2 + * @author Term Structure Labs + * @notice Factory contract for creating various types of price feeds in the TermMax V2 protocol + * @dev Provides standardized creation methods for ERC4626 vault price feeds, price feed converters, and Pendle PT price feeds + * All price feeds implement the ITermMaxPriceFeed interface for consistency + */ contract TermMaxPriceFeedFactoryV2 { + /** + * @notice Emitted when a new price feed is created + * @param priceFeed The address of the newly created price feed contract + */ event PriceFeedCreated(address indexed priceFeed); + /** + * @notice Creates a price feed for ERC4626 vaults + * @dev Deploys a TermMaxERC4626PriceFeed that calculates vault token prices based on the underlying asset price and vault exchange rate + * @param _assetPriceFeed The address of the underlying asset's price feed (e.g., USDC/USD feed) + * @param _vault The address of the ERC4626 vault contract + * @return The address of the newly deployed ERC4626 price feed + * @custom:usage Used for vault tokens like stETH, rETH, or other yield-bearing assets that implement ERC4626 + */ function createPriceFeedWithERC4626(address _assetPriceFeed, address _vault) external returns (address) { address priceFeed = address(new TermMaxERC4626PriceFeed(_assetPriceFeed, _vault)); emit PriceFeedCreated(priceFeed); return priceFeed; } + /** + * @notice Creates a price feed converter that chains two price feeds together + * @dev Deploys a TermMaxPriceFeedConverter that multiplies prices from two feeds (A->B and B->C to get A->C) + * @param _aTokenToBTokenPriceFeed The first price feed in the chain (token A to token B) + * @param _bTokenToCTokenPriceFeed The second price feed in the chain (token B to token C) + * @param _asset The address of the asset being priced (token A) + * @return The address of the newly deployed price feed converter + * @custom:example Converting stETH to USD: stETH->ETH feed × ETH->USD feed = stETH->USD price + * @custom:precision Final price maintains 8 decimal precision regardless of input feed decimals + */ function createPriceFeedConverter( address _aTokenToBTokenPriceFeed, address _bTokenToCTokenPriceFeed, @@ -25,6 +54,18 @@ contract TermMaxPriceFeedFactoryV2 { return priceFeed; } + /** + * @notice Creates a price feed for Pendle Principal Tokens (PT) + * @dev Deploys a TermMaxPTPriceFeed that calculates PT prices using Pendle's oracle system and underlying asset prices + * @param _pendlePYLpOracle The address of the Pendle PY LP oracle contract + * @param _market The address of the Pendle market contract for the specific PT + * @param _duration The TWAP duration in seconds for price calculation stability + * @param _priceFeed The price feed for the underlying asset that the PT represents + * @return The address of the newly deployed PT price feed + * @custom:usage Used for Pendle Principal Tokens like PT-stETH, PT-USDC, etc. + * @custom:security Includes oracle readiness checks to ensure price feed reliability + * @custom:formula PT Price = PT Rate in SY × SY Price / PT to Asset Rate Base + */ function createPTWithPriceFeed(address _pendlePYLpOracle, address _market, uint32 _duration, address _priceFeed) external returns (address) diff --git a/contracts/v2/lib/MarketConstantsV2.sol b/contracts/v2/lib/MarketConstantsV2.sol index ac631eb..82b21ed 100644 --- a/contracts/v2/lib/MarketConstantsV2.sol +++ b/contracts/v2/lib/MarketConstantsV2.sol @@ -1,9 +1,28 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; +/** + * @title TermMax Market Constants V2 + * @author Term Structure Labs + * @notice Library containing string constants for token naming conventions in TermMax V2 markets + * @dev Provides standardized prefixes for token names and symbols to ensure consistent naming across the protocol + * Used during token initialization to create human-readable identifiers for market tokens + */ library MarketConstantsV2 { + /// @notice Prefix for Fixed Term token names and symbols (e.g., "FT:USDC-24-Dec") + /// @dev Fixed Term tokens represent the fixed-rate lending position in a market string constant PREFIX_FT = "FT:"; + + /// @notice Prefix for Variable Term token names and symbols (e.g., "XT:USDC-24-Dec") + /// @dev Variable Term tokens represent the variable-rate lending position in a market string constant PREFIX_XT = "XT:"; + + /// @notice Prefix for Gearing Token names and symbols (e.g., "GT:USDC-24-Dec") + /// @dev Gearing Tokens are NFTs representing leveraged positions with collateral backing string constant PREFIX_GT = "GT:"; + + /// @notice Prefix for TermMax Market contract names (e.g., "Termmax Market:USDC-24-Dec") + /// @dev Used to create human-readable market identifiers for easier recognition and debugging + /// @dev V2-specific addition for enhanced market identification string constant PREFIX_MARKET = "Termmax Market:"; } diff --git a/contracts/v2/oracle/IOracleV2.sol b/contracts/v2/oracle/IOracleV2.sol index 0b7afc1..684d06f 100644 --- a/contracts/v2/oracle/IOracleV2.sol +++ b/contracts/v2/oracle/IOracleV2.sol @@ -6,8 +6,20 @@ import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interf /** * @title IOracleV2 * @author Term Structure Labs + * @notice Enhanced oracle interface for TermMax V2 protocol with improved price feed management + * @dev Extends the V1 oracle interface with additional features including price caps, separate backup heartbeats, + * and oracle revocation capabilities for enhanced security and flexibility */ interface IOracleV2 { + /** + * @notice Oracle configuration structure for price feed management + * @dev Contains primary and backup aggregators with independent heartbeat configurations + * @param aggregator Primary price feed aggregator (required) + * @param backupAggregator Secondary price feed aggregator for fallback (optional) + * @param maxPrice Maximum allowed price value for this asset (0 = no limit) + * @param heartbeat Maximum allowed staleness for primary aggregator in seconds (0 = no staleness check) + * @param backupHeartbeat Maximum allowed staleness for backup aggregator in seconds (0 = no staleness check) + */ struct Oracle { AggregatorV3Interface aggregator; AggregatorV3Interface backupAggregator; @@ -16,15 +28,52 @@ interface IOracleV2 { uint32 backupHeartbeat; } - /// @notice Error thrown when the oracle is not working + /** + * @notice Error thrown when the oracle system cannot provide a reliable price + * @dev Occurs when both primary and backup oracles are stale, returning invalid data, or when no oracle is configured + * @param asset The address of the asset for which the oracle is not working + */ error OracleIsNotWorking(address asset); - /// @notice Get the price of an asset + /** + * @notice Retrieves the current price of an asset from the oracle system + * @dev Uses primary oracle first, falls back to backup if primary is stale or invalid + * Applies maxPrice cap if configured. Returns price with the aggregator's native decimals + * @param asset The address of the asset to get the price for + * @return price The current price of the asset (may be capped by maxPrice) + * @return decimals The number of decimal places in the returned price + * @custom:reverts OracleIsNotWorking if no valid price can be obtained + */ function getPrice(address asset) external view returns (uint256 price, uint8 decimals); + /** + * @notice Submits a new oracle configuration for an asset with timelock protection + * @dev Creates a pending oracle update that must wait for the timelock period before activation + * Used for adding new oracles or updating existing ones with enhanced security + * @param asset The address of the asset to configure the oracle for + * @param oracle The oracle configuration structure with primary/backup feeds and settings + * @custom:access Typically restricted to oracle managers or governance + * @custom:security Subject to timelock delay for security + */ function submitPendingOracle(address asset, Oracle memory oracle) external; + /** + * @notice Activates a previously submitted pending oracle configuration + * @dev Can only be called after the timelock period has elapsed since submission + * Replaces the current oracle configuration with the pending one + * @param asset The address of the asset to accept the pending oracle for + * @custom:access Usually callable by anyone after timelock expires + * @custom:validation Requires valid pending oracle and elapsed timelock + */ function acceptPendingOracle(address asset) external; + /** + * @notice Cancels a pending oracle configuration before it can be accepted + * @dev Allows oracle managers to revoke pending updates if errors are discovered + * Can only revoke pending oracles that haven't been accepted yet + * @param asset The address of the asset to revoke the pending oracle for + * @custom:access Typically restricted to oracle managers or governance + * @custom:security Provides emergency mechanism to cancel erroneous oracle updates + */ function revokePendingOracle(address asset) external; } diff --git a/contracts/v2/oracle/OracleAggregatorV2.sol b/contracts/v2/oracle/OracleAggregatorV2.sol index 95023ce..c2ec458 100644 --- a/contracts/v2/oracle/OracleAggregatorV2.sol +++ b/contracts/v2/oracle/OracleAggregatorV2.sol @@ -3,17 +3,32 @@ pragma solidity ^0.8.27; /** * @title OracleAggregatorV2 - * @notice This contract references design concepts from AAVE's oracle system - * @dev Implements price feed aggregation with primary and backup oracles, - * staleness checks via heartbeats, and governance-controlled updates with timelocks - * similar to AAVE's oracle architecture + * @author Term Structure Labs + * @notice Enhanced oracle aggregator for TermMax V2 protocol with improved price feed management + * @dev This contract references design concepts from AAVE's oracle system + * Implements price feed aggregation with primary and backup oracles, + * staleness checks via heartbeats, and governance-controlled updates with timelocks + * similar to AAVE's oracle architecture + * + * Key V2 improvements over V1: + * - Independent heartbeat configuration for backup oracles + * - Price capping mechanism with maxPrice parameter + * - Oracle revocation capability for enhanced security + * - Separate backup heartbeat for more flexible oracle management */ import {Ownable2Step, Ownable} from "@openzeppelin/contracts/access/Ownable2Step.sol"; import {AggregatorV3Interface, IOracleV2} from "./IOracleV2.sol"; contract OracleAggregatorV2 is IOracleV2, Ownable2Step { + /// @notice The timelock period in seconds that must elapse before pending oracles can be accepted + /// @dev Immutable value set during contract construction for security uint256 internal immutable _timeLock; + /** + * @notice Structure for storing pending oracle updates with timelock protection + * @param oracle The oracle configuration waiting to be activated + * @param validAt The timestamp when this pending oracle can be accepted + */ struct PendingOracle { Oracle oracle; uint64 validAt; @@ -42,11 +57,15 @@ contract OracleAggregatorV2 is IOracleV2, Ownable2Step { */ error TimelockNotElapsed(); - /// @notice Event emitted when the oracle of asset is updated - /// @param asset The address of the asset - /// @param aggregator The address of the aggregator - /// @param backupAggregator The address of the backup aggregator - /// @param heartbeat The heartbeat of the oracle + /** + * @notice Event emitted when an oracle configuration is updated + * @param asset The address of the asset whose oracle was updated + * @param aggregator The address of the primary aggregator + * @param backupAggregator The address of the backup aggregator + * @param maxPrice The maximum price cap for this asset (0 = no cap) + * @param heartbeat The staleness threshold for the primary aggregator + * @param backupHeartbeat The staleness threshold for the backup aggregator + */ event UpdateOracle( address indexed asset, AggregatorV3Interface indexed aggregator, @@ -56,6 +75,16 @@ contract OracleAggregatorV2 is IOracleV2, Ownable2Step { uint32 backupHeartbeat ); + /** + * @notice Event emitted when a pending oracle is submitted + * @param asset The address of the asset for the pending oracle + * @param aggregator The address of the primary aggregator + * @param backupAggregator The address of the backup aggregator + * @param maxPrice The maximum price cap for this asset + * @param heartbeat The staleness threshold for the primary aggregator + * @param backupHeartbeat The staleness threshold for the backup aggregator + * @param validAt The timestamp when this pending oracle can be accepted + */ event SubmitPendingOracle( address indexed asset, AggregatorV3Interface indexed aggregator, @@ -66,34 +95,52 @@ contract OracleAggregatorV2 is IOracleV2, Ownable2Step { uint64 validAt ); + /** + * @notice Event emitted when a pending oracle is revoked + * @param asset The address of the asset whose pending oracle was revoked + */ event RevokePendingOracle(address indexed asset); - /// @notice Oracles + /// @notice Mapping of asset addresses to their active oracle configurations + /// @dev Contains the currently live oracle settings for each asset mapping(address => Oracle) public oracles; + /// @notice Mapping of asset addresses to their pending oracle configurations + /// @dev Contains oracle updates waiting for timelock expiration mapping(address => PendingOracle) public pendingOracles; constructor(address _owner, uint256 timeLock) Ownable(_owner) { _timeLock = timeLock; } + /** + * @inheritdoc IOracleV2 + */ function submitPendingOracle(address asset, Oracle memory oracle) external onlyOwner { + // Handle oracle removal case if (address(oracle.aggregator) == address(0) && address(oracle.backupAggregator) == address(0)) { delete oracles[asset]; emit UpdateOracle(asset, AggregatorV3Interface(address(0)), AggregatorV3Interface(address(0)), 0, 0, 0); return; } + + // Validate inputs for oracle addition/update if (asset == address(0) || oracle.aggregator == AggregatorV3Interface(address(0))) { revert InvalidAssetOrOracle(); } + + // Ensure backup aggregator has same decimals as primary if both are present if (address(oracle.backupAggregator) != address(0)) { if (oracle.aggregator.decimals() != oracle.backupAggregator.decimals()) { revert InvalidAssetOrOracle(); } } + + // Store pending oracle with timelock pendingOracles[asset].oracle = oracle; uint64 validAt = uint64(block.timestamp + _timeLock); pendingOracles[asset].validAt = validAt; + emit SubmitPendingOracle( asset, oracle.aggregator, @@ -105,6 +152,9 @@ contract OracleAggregatorV2 is IOracleV2, Ownable2Step { ); } + /** + * @inheritdoc IOracleV2 + */ function acceptPendingOracle(address asset) external { if (pendingOracles[asset].validAt == 0) { revert NoPendingValue(); @@ -112,14 +162,20 @@ contract OracleAggregatorV2 is IOracleV2, Ownable2Step { if (block.timestamp < pendingOracles[asset].validAt) { revert TimelockNotElapsed(); } + + // Activate the pending oracle Oracle memory oracle = pendingOracles[asset].oracle; oracles[asset] = oracle; delete pendingOracles[asset]; + emit UpdateOracle( asset, oracle.aggregator, oracle.backupAggregator, oracle.maxPrice, oracle.heartbeat, oracle.backupHeartbeat ); } + /** + * @inheritdoc IOracleV2 + */ function revokePendingOracle(address asset) external onlyOwner { if (pendingOracles[asset].validAt == 0) { revert NoPendingValue(); @@ -133,26 +189,39 @@ contract OracleAggregatorV2 is IOracleV2, Ownable2Step { */ function getPrice(address asset) external view override returns (uint256, uint8) { Oracle memory oracle = oracles[asset]; + + // Try primary oracle first { (, int256 answer,, uint256 updatedAt,) = oracle.aggregator.latestRoundData(); + // Check if primary oracle is fresh and has positive price if ((oracle.heartbeat == 0 || oracle.heartbeat + updatedAt >= block.timestamp) && answer > 0) { + // Apply price cap if configured if (oracle.maxPrice == 0 || answer <= oracle.maxPrice) { return (uint256(answer), oracle.aggregator.decimals()); } else if (address(oracle.backupAggregator) == address(0)) { + // No backup available, return capped price return (uint256(oracle.maxPrice), oracle.aggregator.decimals()); } + // Primary exceeds cap but backup exists, continue to backup check } } + + // Try backup oracle if available if (address(oracle.backupAggregator) != address(0)) { (, int256 answer,, uint256 updatedAt,) = oracle.backupAggregator.latestRoundData(); + // Check if backup oracle is fresh and has positive price if ((oracle.backupHeartbeat == 0 || oracle.backupHeartbeat + updatedAt >= block.timestamp) && answer > 0) { + // Apply price cap if configured if (oracle.maxPrice == 0 || answer <= oracle.maxPrice) { return (uint256(answer), oracle.backupAggregator.decimals()); } else { + // Return capped price using backup decimals return (uint256(oracle.maxPrice), oracle.backupAggregator.decimals()); } } } + + // Both oracles failed or are stale revert OracleIsNotWorking(asset); } } diff --git a/iamges/termmax_token_docs.md b/iamges/termmax_token_docs.md deleted file mode 100644 index 31d8dc6..0000000 --- a/iamges/termmax_token_docs.md +++ /dev/null @@ -1,124 +0,0 @@ -``` -┌─────────────────────────────────────────────────────────────────────────────────────┐ -│ │ -│ TermMaxToken Contract │ -│ │ -├─────────────────────────────────────────────────────────────────────────────────────┤ -│ │ -│ Roles: │ -│ ┌────────────────────────┐ ┌────────────┐ ┌──────────────┐ │ -│ │ Owner/Proxy Admin │ │ Users │ │ Aave Protocol│ │ -│ └───────────┬────────────┘ └──────┬─────┘ └───────┬──────┘ │ -│ │ │ │ │ -│ │ │ │ │ -└─────────────┼────────────────────────┼──────────────────┼───────────────────────────┘ - │ │ │ - │ │ │ -┌─────────────┼────────────────────────┼──────────────────┼───────────────────────────┐ -│ │ │ │ │ -│ ┌───────────▼────────────────────────▼──────────────────▼─────────────────────┐ │ -│ │ Functions │ │ -│ └───────────────────────────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────┐ ┌─────────────────────────────┐ │ -│ │ Initialization │ │ User Operations │ │ -│ ├──────────────────────────────┤ ├─────────────────────────────┤ │ -│ │ constructor │ │ mint │ │ -│ │ initialize │ │ burn │ │ -│ └──────────────────────────────┘ │ burnToAToken │ │ -│ │ totalIncomeAssets │ │ -│ ┌──────────────────────────────┐ └─────────────────────────────┘ │ -│ │ Owner Functions │ │ -│ │ (including Proxy Admin) │ ┌─────────────────────────────┐ │ -│ ├──────────────────────────────┤ │ Overridden Functions │ │ -│ │ withdrawIncomeAssets │ ├─────────────────────────────┤ │ -│ │ updateBufferConfigAndAdd │ │ decimals │ │ -│ │ Reserves │ │ _bufferConfig │ │ -│ │ _authorizeUpgrade │ │ _depositToPool │ │ -│ └──────────────────────────────┘ │ _withdrawFromPool │ │ -│ └─────────────────────────────┘ │ -│ ┌──────────────────────────────┐ │ -│ │ Internal Functions │ │ -│ ├──────────────────────────────┤ │ -│ │ _updateBufferConfig │ │ -│ └──────────────────────────────┘ │ -│ │ -└─────────────────────────────────────────────────────────────────────────────────────┘ - -┌─────────────────────────────────────────────────────────────────────────────────────┐ -│ Function Flow Diagram │ -└─────────────────────────────────────────────────────────────────────────────────────┘ - - User TermMaxToken Aave - │ │ │ - │ ─────────► mint() ───────────► │ │ - │ │ ─────► _depositWithBuffer() ────► │ - │ │ │ - │ ─────────► burn() ───────────► │ │ - │ │ ─────► _withdrawWithBuffer() ───► │ - │ │ │ - │ ─────────► burnToAToken() ───► │ │ - │ │ │ - │ ─────────► totalIncomeAssets()►│ │ - │ │ │ - - Owner TermMaxToken Aave - (Proxy Admin) │ │ - │ │ │ - │ ─► withdrawIncomeAssets() ───► │ │ - │ │ ─────► _withdrawWithBuffer() ───► │ - │ │ │ - │ ─► updateBufferConfigAndAdd ─► │ │ - │ Reserves() │ │ - │ │ │ - │ ─► upgrade (via _authorize ──► │ │ - │ Upgrade) │ │ - │ │ │ -``` - -## Role Descriptions - -### Owner/Proxy Admin -- Has privileged access to admin functions -- Can withdraw income generated from yield farming -- Can update buffer configuration settings -- Controls contract upgrades via the UUPS upgrade pattern -- Is the only role that can authorize implementation upgrades - -### Users -- Can mint new TermMaxTokens by providing underlying assets -- Can burn their tokens to receive underlying assets or aTokens -- Can check total income assets generated - -### Aave Protocol -- External protocol used for yield generation -- Receives/provides assets during deposit/withdraw operations -- Issues aTokens that accrue yield - -## Function Categories - -### Initialization Functions -- **constructor**: Sets up immutable variables like Aave pool address and referral code -- **initialize**: Sets up token name, symbol, decimals, and initial buffer configuration - -### User Operations -- **mint**: Creates new TermMaxTokens and deposits underlying assets with buffering -- **burn**: Burns tokens and withdraws underlying assets to the specified address -- **burnToAToken**: Burns tokens and transfers aTokens directly to the user -- **totalIncomeAssets**: Calculates total yield generated by the protocol - -### Admin Functions -- **withdrawIncomeAssets**: Allows owner to withdraw generated yield -- **updateBufferConfigAndAddReserves**: Updates buffer settings and adds additional reserves -- **_authorizeUpgrade**: Authorizes contract implementation upgrades (only owner) - -### Internal Buffer Management -- **_updateBufferConfig**: Updates buffer configuration parameters -- **_bufferConfig**: Returns current buffer configuration -- **_depositToPool**: Handles depositing assets to Aave -- **_withdrawFromPool**: Handles withdrawing assets from Aave - -### Other Overridden Functions -- **decimals**: Returns token decimals matching the underlying asset - -The TermMaxToken contract is designed as an upgradeable ERC20 token that wraps an underlying asset, automatically deposits it in Aave for yield generation, and manages liquidity buffers to optimize gas costs and availability. \ No newline at end of file diff --git a/iamges/tmxUSDC_burn.md b/iamges/tmxUSDC_burn.md deleted file mode 100644 index 377db2a..0000000 --- a/iamges/tmxUSDC_burn.md +++ /dev/null @@ -1,49 +0,0 @@ -```mermaid -sequenceDiagram - title TermMaxToken - burn() - actor User - participant TMT as TermMaxToken - participant ERC20 as ERC20Upgradeable - participant UnderlyingToken as IERC20 (underlying) - participant AavePool as IAaveV3Minimal (aavePool) - - User->>TMT: burn(to, amount) - activate TMT - - TMT->>ERC20: _burn(User, amount) - activate ERC20 - ERC20-->>TMT: (updates TMT balances) - deactivate ERC20 - - TMT->>TMT: _withdrawWithBuffer(underlying, to, amount) - activate TMT #LightBlue - Note right of TMT: Inherited from StakingBuffer - TMT->>TMT: _bufferConfig(underlying) - TMT-->>TMT: bufferConfig - - TMT->>TMT: (determines withdraw amount from pool vs buffer) - Note right of TMT: amountFromPool, amountFromBuffer - - alt amountFromBuffer > 0 - TMT->>UnderlyingToken: safeTransfer(to, amountFromBuffer) - activate UnderlyingToken - UnderlyingToken-->>TMT: // Return signal from safeTransfer - deactivate UnderlyingToken - end - - alt amountFromPool > 0 - TMT->>TMT: _withdrawFromPool(underlying, to, amountFromPool) - activate TMT #CornflowerBlue - Note right of TMT: Overridden method - TMT->>AavePool: withdraw(underlying, amountFromPool, to) - activate AavePool - AavePool-->>TMT: receivedAmount - deactivate AavePool - TMT->>TMT: require(receivedAmount == amountFromPool, "AaveWithdrawFailed") - deactivate TMT #CornflowerBlue - end - deactivate TMT #LightBlue - - TMT-->>User: (success) - deactivate TMT -``` \ No newline at end of file diff --git a/iamges/tmxUSDC_mint.md b/iamges/tmxUSDC_mint.md deleted file mode 100644 index db00ade..0000000 --- a/iamges/tmxUSDC_mint.md +++ /dev/null @@ -1,50 +0,0 @@ -```mermaid -sequenceDiagram - title TermMaxToken - mint() - actor User - participant TMT as TermMaxToken - participant ERC20 as ERC20Upgradeable - participant UnderlyingToken as IERC20 (underlying) - participant AavePool as IAaveV3Minimal (aavePool) - - User->>TMT: mint(to, amount) - activate TMT - - TMT->>ERC20: _mint(to, amount) - activate ERC20 - ERC20-->>TMT: (updates TMT balances) - deactivate ERC20 - - TMT->>UnderlyingToken: safeTransferFrom(User, TMT, amount) - activate UnderlyingToken - UnderlyingToken-->>TMT: (transfers underlying to TMT) - deactivate UnderlyingToken - - TMT->>TMT: _depositWithBuffer(underlying, amount) - activate TMT #LightBlue - Note right of TMT: Inherited from StakingBuffer - TMT->>TMT: _bufferConfig(underlying) - TMT-->>TMT: bufferConfig - - TMT->>TMT: (determines deposit amount to pool vs buffer based on bufferConfig) - Note right of TMT: amountToPool, amountToBuffer - - alt amountToBuffer > 0 - TMT->>TMT: (updates internal buffer balance for underlying) - end - - alt amountToPool > 0 - TMT->>TMT: _depositToPool(underlying, amountToPool) - activate TMT #CornflowerBlue - Note right of TMT: Overridden method - TMT->>AavePool: supply(underlying, amountToPool, TMT, referralCode) - activate AavePool - AavePool-->>TMT: (Aave supplies liquidity, mints aTokens to TMT) - deactivate AavePool - deactivate TMT #CornflowerBlue - end - deactivate TMT #LightBlue - - TMT-->>User: (success) - deactivate TMT -``` \ No newline at end of file diff --git a/iamges/tmx_initialize.md b/iamges/tmx_initialize.md deleted file mode 100644 index 4614e73..0000000 --- a/iamges/tmx_initialize.md +++ /dev/null @@ -1,58 +0,0 @@ -```mermaid -sequenceDiagram - title TermMaxToken - initialize() - actor Deployer - participant TMT as TermMaxToken - participant ERC20 as ERC20Upgradeable - participant Ownable as OwnableUpgradeable - participant ReentrancyGuard as ReentrancyGuardUpgradeable - participant UnderlyingMeta as IERC20Metadata (underlying) - participant AavePool as IAaveV3Minimal (aavePool) - - Deployer->>TMT: initialize(admin, underlying, bufferConfig) - activate TMT - - TMT->>UnderlyingMeta: name() - activate UnderlyingMeta - UnderlyingMeta-->>TMT: tokenName - deactivate UnderlyingMeta - - TMT->>UnderlyingMeta: symbol() - activate UnderlyingMeta - UnderlyingMeta-->>TMT: tokenSymbol - deactivate UnderlyingMeta - - TMT->>UnderlyingMeta: decimals() - activate UnderlyingMeta - UnderlyingMeta-->>TMT: tokenDecimals - deactivate UnderlyingMeta - - TMT->>ERC20: __ERC20_init("TermMax " + tokenName, "tmx" + tokenSymbol) - activate ERC20 - ERC20-->>TMT: // Return signal from ERC20 initialization - deactivate ERC20 - - TMT->>Ownable: __Ownable_init(admin) - activate Ownable - Ownable-->>TMT: // Return signal from Ownable initialization - deactivate Ownable - - TMT->>ReentrancyGuard: __ReentrancyGuard_init() - activate ReentrancyGuard - ReentrancyGuard-->>TMT: // Return signal from ReentrancyGuard initialization - deactivate ReentrancyGuard - - TMT->>TMT: _updateBufferConfig(bufferConfig) - Note right of TMT: Sets bufferConfig and emits event - - TMT->>AavePool: getReserveData(underlying) - activate AavePool - AavePool-->>TMT: reserveData (contains aTokenAddress) - deactivate AavePool - - TMT->>TMT: (sets aToken = IERC20(reserveData.aTokenAddress)) - TMT->>TMT: emit TermMaxTokenInitialized(admin, underlying) - - TMT-->>Deployer: (success) - deactivate TMT -``` \ No newline at end of file diff --git a/iamges/tmx_updateBufferConfigAndAddReserves.md b/iamges/tmx_updateBufferConfigAndAddReserves.md deleted file mode 100644 index 273fc9e..0000000 --- a/iamges/tmx_updateBufferConfigAndAddReserves.md +++ /dev/null @@ -1,25 +0,0 @@ -```mermaid -sequenceDiagram - title TermMaxToken - updateBufferConfigAndAddReserves() - actor Owner - participant TMT as TermMaxToken - participant uTkn as IERC20 (underlying) - - Owner->>TMT: updateBufferConfigAndAddReserves(additionalReserves, newBufferConfig) - activate TMT - - TMT->>uTkn: safeTransferFrom(Owner, TMT, additionalReserves) - activate uTkn - uTkn-->>TMT: // Return signal from safeTransferFrom - deactivate uTkn - - TMT->>TMT: _updateBufferConfig(newBufferConfig) - activate TMT #LightSkyBlue - TMT->>TMT: _checkBufferConfig(newBufferConfig.minimumBuffer, newBufferConfig.maximumBuffer, newBufferConfig.buffer) - TMT->>TMT: (updates storage: this.bufferConfig = newBufferConfig) - TMT->>TMT: emit UpdateBufferConfig(newBufferConfig.minimumBuffer, newBufferConfig.maximumBuffer, newBufferConfig.buffer) - deactivate TMT #LightSkyBlue - - TMT-->>Owner: (success) - deactivate TMT -``` \ No newline at end of file diff --git a/iamges/tmx_withdrawIncomeAssets.md b/iamges/tmx_withdrawIncomeAssets.md deleted file mode 100644 index 492b3f4..0000000 --- a/iamges/tmx_withdrawIncomeAssets.md +++ /dev/null @@ -1,67 +0,0 @@ -```mermaid -sequenceDiagram - title TermMaxToken - withdrawIncomeAssets() - actor Owner - participant TMT as TermMaxToken - participant aTkn as IERC20 (aToken) - participant uTkn as IERC20 (underlying) - participant AavePool as IAaveV3Minimal (aavePool) - - Owner->>TMT: withdrawIncomeAssets(asset, to, amount) - activate TMT - - TMT->>aTkn: balanceOf(address(this)) - activate aTkn - aTkn-->>TMT: aTokenBalance - deactivate aTkn - - TMT->>uTkn: balanceOf(address(this)) - activate uTkn - uTkn-->>TMT: underlyingBalance - deactivate uTkn - - TMT->>TMT: (calculates availableAmount) - TMT->>TMT: require(availableAmount >= amount) - TMT->>TMT: withdawedIncomeAssets += amount - - alt asset == address(underlying) - TMT->>TMT: _withdrawWithBuffer(address(underlying), to, amount) - activate TMT #LightBlue - Note right of TMT: Internal StakingBuffer logic - TMT->>TMT: _bufferConfig(address(underlying)) - TMT-->>TMT: currentBufferConfig - - TMT->>TMT: (determines amountFromPool, amountFromBuffer) - - alt amountFromBuffer > 0 - TMT->>uTkn: safeTransfer(to, amountFromBuffer) - activate uTkn - uTkn-->>TMT: // Return signal from safeTransfer - deactivate uTkn - end - - alt amountFromPool > 0 - TMT->>TMT: _withdrawFromPool(address(underlying), to, amountFromPool) - activate TMT #CornflowerBlue - Note right of TMT: Overridden method - TMT->>AavePool: withdraw(address(underlying), amountFromPool, to) - activate AavePool - AavePool-->>TMT: receivedAmount - deactivate AavePool - TMT->>TMT: require(receivedAmount == amountFromPool) - deactivate TMT #CornflowerBlue - end - deactivate TMT #LightBlue - else asset == address(aToken) - TMT->>aTkn: safeTransfer(to, amount) - activate aTkn - aTkn-->>TMT: // Return signal from safeTransfer - deactivate aTkn - else - TMT->>TMT: revert InvalidToken() - end - - TMT->>TMT: emit WithdrawIncome(to, amount) - TMT-->>Owner: (success) - deactivate TMT -``` \ No newline at end of file From 1d04126eab6d83d7fe70fc73a0fa1e9c5f5becfd Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 10 Jun 2025 09:42:58 +0800 Subject: [PATCH 062/194] v2 adapters --- contracts/v2/access/AccessManagerV2.sol | 1 - contracts/v2/factory/TermMaxFactoryV2.sol | 6 +- contracts/v2/lib/MarketConstantsV2.sol | 6 +- contracts/v2/lib/OnlyProxyCall.sol | 20 ++++ contracts/v2/lib/TransferUtilsV2.sol | 52 +++++++++ contracts/v2/oracle/OracleAggregatorV2.sol | 20 ++-- contracts/v2/router/IERC20SwapAdapter.sol | 19 ++++ contracts/v2/router/TermMaxRouterV2.sol | 58 ++++------ .../swapAdapters/ERC20SwapAdapterV2.sol | 42 ++++++++ .../swapAdapters/ERC4626VaultAdapterV2.sol | 21 ++-- .../swapAdapters/KyberswapV2AdapterV2.sol | 24 ++++- .../router/swapAdapters/OdosV2AdapterV2.sol | 33 ++++-- .../swapAdapters/PendleSwapV3AdapterV2.sol | 26 +++-- .../swapAdapters/TermMaxSwapAdapter.sol | 52 +++++++++ .../swapAdapters/TermMaxTokenAdapter.sol | 63 +++++++++++ .../swapAdapters/UniswapV3AdapterV2.sol | 17 +-- contracts/v2/test/MockSwapAdapterV2.sol | 27 +++++ contracts/v2/tokens/ITermMaxToken.sol | 102 ++++++++++++++++++ test/v1/mainnet-fork/GtBaseTest.t.sol | 8 +- test/v1/mainnet-fork/MarketBaseTest.t.sol | 4 +- test/v1/mainnet-fork/VaultBaseTest.t.sol | 4 +- test/v2/RouterV2.t.sol | 6 +- 22 files changed, 514 insertions(+), 97 deletions(-) create mode 100644 contracts/v2/lib/OnlyProxyCall.sol create mode 100644 contracts/v2/lib/TransferUtilsV2.sol create mode 100644 contracts/v2/router/IERC20SwapAdapter.sol create mode 100644 contracts/v2/router/swapAdapters/ERC20SwapAdapterV2.sol create mode 100644 contracts/v2/router/swapAdapters/TermMaxSwapAdapter.sol create mode 100644 contracts/v2/router/swapAdapters/TermMaxTokenAdapter.sol create mode 100644 contracts/v2/test/MockSwapAdapterV2.sol create mode 100644 contracts/v2/tokens/ITermMaxToken.sol diff --git a/contracts/v2/access/AccessManagerV2.sol b/contracts/v2/access/AccessManagerV2.sol index 4924afa..3b11216 100644 --- a/contracts/v2/access/AccessManagerV2.sol +++ b/contracts/v2/access/AccessManagerV2.sol @@ -11,7 +11,6 @@ import {IOracleV2} from "../oracle/IOracleV2.sol"; * @dev Inherits from AccessManager V1 and adds V2-specific functionality for managing oracles and batch operations */ contract AccessManagerV2 is AccessManager { - /** * @notice Batch pause/unpause multiple entities in a single transaction * @dev Allows efficient management of multiple pausable contracts simultaneously diff --git a/contracts/v2/factory/TermMaxFactoryV2.sol b/contracts/v2/factory/TermMaxFactoryV2.sol index 4c24852..e867f5f 100644 --- a/contracts/v2/factory/TermMaxFactoryV2.sol +++ b/contracts/v2/factory/TermMaxFactoryV2.sol @@ -27,7 +27,7 @@ contract TermMaxFactoryV2 is Ownable2Step, FactoryErrors, FactoryEvents, ITermMa address public immutable TERMMAX_MARKET_IMPLEMENTATION; /// @notice Mapping of gearing token implementation names to their contract addresses - /// @dev Based on the abstract GearingToken contract, different GearingTokens can be adapted + /// @dev Based on the abstract GearingToken contract, different GearingTokens can be adapted /// to various collaterals, such as ERC20 tokens and ERC721 tokens /// @dev Keys are keccak256 hashes of implementation names for gas efficiency mapping(bytes32 => address) public gtImplements; @@ -107,13 +107,13 @@ contract TermMaxFactoryV2 is Ownable2Step, FactoryErrors, FactoryEvents, ITermMa if (params.gtImplementation == address(0)) { revert CantNotFindGtImplementation(); } - + // Deploy market using CREATE2 for deterministic addressing market = Clones.cloneDeterministic( TERMMAX_MARKET_IMPLEMENTATION, keccak256(abi.encode(msg.sender, params.collateral, params.debtToken, params.marketConfig.maturity, salt)) ); - + // Initialize the newly deployed market with provided parameters ITermMaxMarket(market).initialize(params); diff --git a/contracts/v2/lib/MarketConstantsV2.sol b/contracts/v2/lib/MarketConstantsV2.sol index 82b21ed..33af13a 100644 --- a/contracts/v2/lib/MarketConstantsV2.sol +++ b/contracts/v2/lib/MarketConstantsV2.sol @@ -12,15 +12,15 @@ library MarketConstantsV2 { /// @notice Prefix for Fixed Term token names and symbols (e.g., "FT:USDC-24-Dec") /// @dev Fixed Term tokens represent the fixed-rate lending position in a market string constant PREFIX_FT = "FT:"; - + /// @notice Prefix for Variable Term token names and symbols (e.g., "XT:USDC-24-Dec") /// @dev Variable Term tokens represent the variable-rate lending position in a market string constant PREFIX_XT = "XT:"; - + /// @notice Prefix for Gearing Token names and symbols (e.g., "GT:USDC-24-Dec") /// @dev Gearing Tokens are NFTs representing leveraged positions with collateral backing string constant PREFIX_GT = "GT:"; - + /// @notice Prefix for TermMax Market contract names (e.g., "Termmax Market:USDC-24-Dec") /// @dev Used to create human-readable market identifiers for easier recognition and debugging /// @dev V2-specific addition for enhanced market identification diff --git a/contracts/v2/lib/OnlyProxyCall.sol b/contracts/v2/lib/OnlyProxyCall.sol new file mode 100644 index 0000000..1a4e2df --- /dev/null +++ b/contracts/v2/lib/OnlyProxyCall.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +abstract contract OnlyProxyCall { + error OnlyCallableThroughProxy(); + + address private immutable addressThis; + + constructor() { + // Store the address of the contract at deployment + addressThis = address(this); + } + + /// @notice Modifier to restrict function calls to only be made through the proxy + /// @dev This ensures that the function can only be called via the proxy contract, preventing direct calls + modifier onlyProxy() { + require(msg.sender != address(this), OnlyCallableThroughProxy()); + _; + } +} diff --git a/contracts/v2/lib/TransferUtilsV2.sol b/contracts/v2/lib/TransferUtilsV2.sol new file mode 100644 index 0000000..5156f35 --- /dev/null +++ b/contracts/v2/lib/TransferUtilsV2.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +library TransferUtilsV2 { + using SafeERC20 for IERC20; + + error CanNotTransferUintMax(); + + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + if (value == type(uint256).max) { + revert CanNotTransferUintMax(); + } + if (from == to || value == 0) { + return; + } + token.safeTransferFrom(from, to, value); + } + + function safeTransfer(IERC20 token, address to, uint256 value) internal { + if (value == type(uint256).max) { + revert CanNotTransferUintMax(); + } + if (to == address(this) || value == 0) { + return; + } + token.safeTransfer(to, value); + } + + function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { + if (value == 0 || spender == address(this)) { + return; + } + token.safeIncreaseAllowance(spender, value); + } + + function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { + if (value == 0 || spender == address(this)) { + return; + } + token.safeDecreaseAllowance(spender, value); + } + + function forceApprove(IERC20 token, address spender, uint256 value) internal { + if (spender == address(this)) { + return; + } + token.forceApprove(spender, value); + } +} diff --git a/contracts/v2/oracle/OracleAggregatorV2.sol b/contracts/v2/oracle/OracleAggregatorV2.sol index c2ec458..9fccc25 100644 --- a/contracts/v2/oracle/OracleAggregatorV2.sol +++ b/contracts/v2/oracle/OracleAggregatorV2.sol @@ -9,7 +9,7 @@ pragma solidity ^0.8.27; * Implements price feed aggregation with primary and backup oracles, * staleness checks via heartbeats, and governance-controlled updates with timelocks * similar to AAVE's oracle architecture - * + * * Key V2 improvements over V1: * - Independent heartbeat configuration for backup oracles * - Price capping mechanism with maxPrice parameter @@ -123,24 +123,24 @@ contract OracleAggregatorV2 is IOracleV2, Ownable2Step { emit UpdateOracle(asset, AggregatorV3Interface(address(0)), AggregatorV3Interface(address(0)), 0, 0, 0); return; } - + // Validate inputs for oracle addition/update if (asset == address(0) || oracle.aggregator == AggregatorV3Interface(address(0))) { revert InvalidAssetOrOracle(); } - + // Ensure backup aggregator has same decimals as primary if both are present if (address(oracle.backupAggregator) != address(0)) { if (oracle.aggregator.decimals() != oracle.backupAggregator.decimals()) { revert InvalidAssetOrOracle(); } } - + // Store pending oracle with timelock pendingOracles[asset].oracle = oracle; uint64 validAt = uint64(block.timestamp + _timeLock); pendingOracles[asset].validAt = validAt; - + emit SubmitPendingOracle( asset, oracle.aggregator, @@ -162,12 +162,12 @@ contract OracleAggregatorV2 is IOracleV2, Ownable2Step { if (block.timestamp < pendingOracles[asset].validAt) { revert TimelockNotElapsed(); } - + // Activate the pending oracle Oracle memory oracle = pendingOracles[asset].oracle; oracles[asset] = oracle; delete pendingOracles[asset]; - + emit UpdateOracle( asset, oracle.aggregator, oracle.backupAggregator, oracle.maxPrice, oracle.heartbeat, oracle.backupHeartbeat ); @@ -189,7 +189,7 @@ contract OracleAggregatorV2 is IOracleV2, Ownable2Step { */ function getPrice(address asset) external view override returns (uint256, uint8) { Oracle memory oracle = oracles[asset]; - + // Try primary oracle first { (, int256 answer,, uint256 updatedAt,) = oracle.aggregator.latestRoundData(); @@ -205,7 +205,7 @@ contract OracleAggregatorV2 is IOracleV2, Ownable2Step { // Primary exceeds cap but backup exists, continue to backup check } } - + // Try backup oracle if available if (address(oracle.backupAggregator) != address(0)) { (, int256 answer,, uint256 updatedAt,) = oracle.backupAggregator.latestRoundData(); @@ -220,7 +220,7 @@ contract OracleAggregatorV2 is IOracleV2, Ownable2Step { } } } - + // Both oracles failed or are stale revert OracleIsNotWorking(asset); } diff --git a/contracts/v2/router/IERC20SwapAdapter.sol b/contracts/v2/router/IERC20SwapAdapter.sol new file mode 100644 index 0000000..f971bd3 --- /dev/null +++ b/contracts/v2/router/IERC20SwapAdapter.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +/** + * @title TermMax ERC20SwapAdapter interface + * @author Term Structure Labs + */ +interface IERC20SwapAdapter { + /// @notice Swap tokenIn to tokenOut + /// @param receipient Address to receive the output tokens + /// @param tokenIn Input token address + /// @param tokenOut Output token address + /// @param tokenInAmt token input amount + /// @param swapData Encoded swap data + /// @return tokenOutAmt token output amount + function swap(address receipient, address tokenIn, address tokenOut, uint256 tokenInAmt, bytes memory swapData) + external + returns (uint256 tokenOutAmt); +} diff --git a/contracts/v2/router/TermMaxRouterV2.sol b/contracts/v2/router/TermMaxRouterV2.sol index 9d8cf5e..44ee1bf 100644 --- a/contracts/v2/router/TermMaxRouterV2.sol +++ b/contracts/v2/router/TermMaxRouterV2.sol @@ -15,7 +15,7 @@ import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; import {ITermMaxMarket} from "../../v1/ITermMaxMarket.sol"; import {ITermMaxMarketV2} from "../../v2/ITermMaxMarketV2.sol"; import {ITermMaxOrder} from "../../v1/ITermMaxOrder.sol"; -import {SwapUnit, ISwapAdapter} from "../../v1/router/ISwapAdapter.sol"; +import {SwapUnit} from "../../v1/router/ISwapAdapter.sol"; import {RouterErrors} from "../../v1/errors/RouterErrors.sol"; import {RouterEvents} from "../../v1/events/RouterEvents.sol"; import {TransferUtils} from "../../v1/lib/TransferUtils.sol"; @@ -28,6 +28,7 @@ import {CurveCuts} from "../../v1/storage/TermMaxStorage.sol"; import {ISwapCallback} from "../../v1/ISwapCallback.sol"; import {Constants} from "../../v1/lib/Constants.sol"; import {MathLib} from "../../v1/lib/MathLib.sol"; +import {IERC20SwapAdapter} from "./IERC20SwapAdapter.sol"; /** * @title TermMax Router V2 @@ -71,22 +72,6 @@ contract TermMaxRouterV2 is __Ownable_init(admin); } - function depositAndMint(ITermMaxMarket market, address recipient, uint256 amount) external whenNotPaused { - (,,,, IERC20 underlying) = market.tokens(); - IERC4626 vault = IERC4626(address(underlying)); - IERC20(vault.asset()).safeTransferFrom(msg.sender, address(this), amount); - underlying.safeIncreaseAllowance(address(market), amount); - market.mint(recipient, amount); - } - - function burnAndWithdraw(ITermMaxMarket market, address recipient, uint256 amount) external whenNotPaused { - (IERC20 ft, IERC20 xt,,, IERC20 underlying) = market.tokens(); - ft.safeTransferFrom(msg.sender, address(this), amount); - xt.safeTransferFrom(msg.sender, address(this), amount); - ITermMaxMarketV2(address(market)).burn(address(this), address(this), amount); - IERC4626(address(underlying)).redeem(amount, recipient, address(this)); - } - /** * @inheritdoc ITermMaxRouterV2 */ @@ -459,7 +444,7 @@ contract TermMaxRouterV2 is (,,,, IERC20 debtToken) = market.tokens(); (uint256 redeemedAmt, bytes memory collateralData) = ITermMaxMarketV2(address(market)).redeem(msg.sender, address(this), ftAmount); - redeemedAmt += _decodeAmount(_doSwap(collateralData, units)); + redeemedAmt += _doSwap(_decodeAmount(collateralData), units); if (redeemedAmt < minTokenOut) { revert InsufficientTokenOut(address(debtToken), redeemedAmt, minTokenOut); } @@ -578,26 +563,17 @@ contract TermMaxRouterV2 is (address gt, uint256 tokenInAmt, SwapUnit[] memory units, FlashLoanType flashLoanType) = abi.decode(data, (address, uint256, SwapUnit[], FlashLoanType)); uint256 totalAmount = amount + tokenInAmt; - collateralData = _doSwap(abi.encode(totalAmount), units); + uint256 collateralBalance = _doSwap(totalAmount, units); SwapUnit memory lastUnit = units[units.length - 1]; if (!adapterWhitelist[lastUnit.adapter]) { revert AdapterNotWhitelisted(lastUnit.adapter); } - + IERC20 collateral = IERC20(lastUnit.tokenOut); if (flashLoanType == FlashLoanType.COLLATERAL) { - IERC20 collateral = IERC20(lastUnit.tokenOut); - uint256 collateralBalance = collateral.balanceOf(address(this)); - collateralData = _encodeAmount(collateralBalance); - // approve all collateral if fashloan type is collateral - collateral.safeIncreaseAllowance(gt, collateralBalance); - } else if (flashLoanType == FlashLoanType.DEBT) { - bytes memory approvalData = - abi.encodeCall(ISwapAdapter.approveOutputToken, (lastUnit.tokenOut, gt, collateralData)); - (bool success, bytes memory returnData) = lastUnit.adapter.delegatecall(approvalData); - if (!success) { - revert ApproveTokenFailWhenSwap(lastUnit.tokenOut, returnData); - } + collateralBalance = collateral.balanceOf(address(this)); } + collateral.safeIncreaseAllowance(gt, collateralBalance); + collateralData = _encodeAmount(collateralBalance); } function _balanceOf(IERC20 token, address account) internal view returns (uint256) { @@ -632,11 +608,10 @@ contract TermMaxRouterV2 is function _flashRepay(IERC20 repayToken, bytes memory collateralData, bytes memory callbackData) internal { (SwapUnit[] memory units, TermMaxSwapData memory swapData) = abi.decode(callbackData, (SwapUnit[], TermMaxSwapData)); - bytes memory outData = _doSwap(collateralData, units); + uint256 amount = _doSwap(_decodeAmount(collateralData), units); if (swapData.orders.length > 0) { // swap token to exact token - uint256 amount = abi.decode(outData, (uint256)); _swapTokenToExactToken( IERC20(swapData.tokenIn), IERC20(swapData.tokenOut), @@ -663,7 +638,8 @@ contract TermMaxRouterV2 is ) = abi.decode(callbackData, (address, uint128, uint128, ITermMaxMarket, uint256, SwapUnit[], TermMaxSwapData)); { // swap collateral - collateralData = units.length == 0 ? collateralData : _doSwap(collateralData, units); + collateralData = + units.length == 0 ? collateralData : _encodeAmount(_doSwap(_decodeAmount(collateralData), units)); } (IERC20 ft,, IGearingToken gt, address collateral,) = market.tokens(); uint256 gtId; @@ -712,7 +688,7 @@ contract TermMaxRouterV2 is } } - function _doSwap(bytes memory inputData, SwapUnit[] memory units) internal returns (bytes memory outData) { + function _doSwap(uint256 inputAmt, SwapUnit[] memory units) internal returns (uint256 outputAmt) { if (units.length == 0) { revert SwapUnitsIsEmpty(); } @@ -720,16 +696,18 @@ contract TermMaxRouterV2 is if (!adapterWhitelist[units[i].adapter]) { revert AdapterNotWhitelisted(units[i].adapter); } - bytes memory dataToSwap = - abi.encodeCall(ISwapAdapter.swap, (units[i].tokenIn, units[i].tokenOut, inputData, units[i].swapData)); + bytes memory dataToSwap = abi.encodeCall( + IERC20SwapAdapter.swap, + (address(this), units[i].tokenIn, units[i].tokenOut, inputAmt, units[i].swapData) + ); (bool success, bytes memory returnData) = units[i].adapter.delegatecall(dataToSwap); if (!success) { revert SwapFailed(units[i].adapter, returnData); } - inputData = abi.decode(returnData, (bytes)); + inputAmt = abi.decode(returnData, (uint256)); } - outData = inputData; + outputAmt = inputAmt; } function onERC721Received(address, address, uint256, bytes memory) external pure override returns (bytes4) { diff --git a/contracts/v2/router/swapAdapters/ERC20SwapAdapterV2.sol b/contracts/v2/router/swapAdapters/ERC20SwapAdapterV2.sol new file mode 100644 index 0000000..b2a61fa --- /dev/null +++ b/contracts/v2/router/swapAdapters/ERC20SwapAdapterV2.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {TransferUtilsV2} from "../../lib/TransferUtilsV2.sol"; +import {IERC20SwapAdapter} from "../IERC20SwapAdapter.sol"; +import {OnlyProxyCall} from "../../lib/OnlyProxyCall.sol"; + +/** + * @title TermMax ERC20SwapAdapter V2 + * @author Term Structure Labs + * @notice This contract facilitates ERC20 token swaps with additional features. + */ +abstract contract ERC20SwapAdapterV2 is IERC20SwapAdapter, OnlyProxyCall { + using TransferUtilsV2 for IERC20; + + /// @notice Error for partial swap + error ERC20InvalidPartialSwap(uint256 expectedTradeAmt, uint256 actualTradeAmt); + + /// @notice Error for less than min token out + error LessThanMinTokenOut(uint256 actual, uint256 expected); + + error ExceedMaxTokenIn(uint256 actual, uint256 expected); + + /** + * @inheritdoc IERC20SwapAdapter + */ + function swap(address receipient, address tokenIn, address tokenOut, uint256 tokenInAmt, bytes memory swapData) + external + override + onlyProxy + returns (uint256) + { + return _swap(receipient, IERC20(tokenIn), IERC20(tokenOut), tokenInAmt, swapData); + } + + function _swap(address receipient, IERC20 tokenIn, IERC20 tokenOut, uint256 tokenInAmt, bytes memory swapData) + internal + virtual + returns (uint256 tokenOutAmt) + {} +} diff --git a/contracts/v2/router/swapAdapters/ERC4626VaultAdapterV2.sol b/contracts/v2/router/swapAdapters/ERC4626VaultAdapterV2.sol index 2ae0a62..c9cae1a 100644 --- a/contracts/v2/router/swapAdapters/ERC4626VaultAdapterV2.sol +++ b/contracts/v2/router/swapAdapters/ERC4626VaultAdapterV2.sol @@ -1,19 +1,26 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.27; -import "../../../v1/router/swapAdapters/ERC4626VaultAdapter.sol"; -import {TransferUtils} from "../../../v1/lib/TransferUtils.sol"; +import {IERC4626} from "@openzeppelin/contracts/interfaces/IERC4626.sol"; +import "./ERC20SwapAdapterV2.sol"; /** * @title TermMax ERC4626VaultAdapterV2 * @author Term Structure Labs */ -contract ERC4626VaultAdapterV2 is ERC4626VaultAdapter { - using TransferUtils for IERC20; +contract ERC4626VaultAdapterV2 is ERC20SwapAdapterV2 { + using TransferUtilsV2 for IERC20; + + enum Action { + Deposit, + Redeem + } + + error InvalidAction(); constructor() {} - function _swap(IERC20 tokenIn, IERC20 tokenOut, uint256 amount, bytes memory swapData) + function _swap(address receipient, IERC20 tokenIn, IERC20 tokenOut, uint256 amount, bytes memory swapData) internal virtual override @@ -27,13 +34,13 @@ contract ERC4626VaultAdapterV2 is ERC4626VaultAdapter { if (action == Action.Deposit) { tokenIn.safeIncreaseAllowance(address(tokenOut), amount); - tokenOutAmt = IERC4626(address(tokenOut)).deposit(amount, address(this)); + tokenOutAmt = IERC4626(address(tokenOut)).deposit(amount, receipient); if (tokenOutAmt < minTokenOut) { revert LessThanMinTokenOut(tokenOutAmt, minTokenOut); } } else if (action == Action.Redeem) { tokenIn.safeIncreaseAllowance(address(tokenIn), amount); - tokenOutAmt = IERC4626(address(tokenIn)).redeem(amount, address(this), address(this)); + tokenOutAmt = IERC4626(address(tokenIn)).redeem(amount, receipient, address(this)); if (tokenOutAmt < minTokenOut) { revert LessThanMinTokenOut(tokenOutAmt, minTokenOut); } diff --git a/contracts/v2/router/swapAdapters/KyberswapV2AdapterV2.sol b/contracts/v2/router/swapAdapters/KyberswapV2AdapterV2.sol index 22a5313..ff676d9 100644 --- a/contracts/v2/router/swapAdapters/KyberswapV2AdapterV2.sol +++ b/contracts/v2/router/swapAdapters/KyberswapV2AdapterV2.sol @@ -1,21 +1,35 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.27; -import "../../../v1/router/swapAdapters/KyberswapV2Adapter.sol"; +import {Address} from "@openzeppelin/contracts/utils/Address.sol"; +import "./ERC20SwapAdapterV2.sol"; + +interface IKyberScalingHelper { + function getScaledInputData(bytes calldata inputData, uint256 newAmount) + external + view + returns (bool isSuccess, bytes memory data); +} /** * @title TermMax KyberswapV2AdapterV2 * @author Term Structure Labs */ -contract KyberswapV2AdapterV2 is KyberswapV2Adapter { +contract KyberswapV2AdapterV2 is ERC20SwapAdapterV2 { using Address for address; - using TransferUtils for IERC20; + using TransferUtilsV2 for IERC20; error KyberScalingFailed(); - constructor(address router_, address scalingHelper_) KyberswapV2Adapter(router_, scalingHelper_) {} + address public immutable router; + address public immutable KYBER_SCALING_HELPER; + + constructor(address router_, address scalingHelper_) { + router = router_; + KYBER_SCALING_HELPER = scalingHelper_; // 0x2f577A41BeC1BE1152AeEA12e73b7391d15f655D + } - function _swap(IERC20 tokenIn, IERC20, uint256 amountIn, bytes memory swapData) + function _swap(address receipient, IERC20 tokenIn, IERC20, uint256 amountIn, bytes memory swapData) internal virtual override diff --git a/contracts/v2/router/swapAdapters/OdosV2AdapterV2.sol b/contracts/v2/router/swapAdapters/OdosV2AdapterV2.sol index 904e543..a859268 100644 --- a/contracts/v2/router/swapAdapters/OdosV2AdapterV2.sol +++ b/contracts/v2/router/swapAdapters/OdosV2AdapterV2.sol @@ -1,20 +1,41 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.27; -import "../../../v1/router/swapAdapters/OdosV2Adapter.sol"; +import "./ERC20SwapAdapterV2.sol"; + +interface IOdosRouterV2 { + struct swapTokenInfo { + address inputToken; + uint256 inputAmount; + address inputReceiver; + address outputToken; + uint256 outputQuote; + uint256 outputMin; + address outputReceiver; + } + + function swap(swapTokenInfo memory tokenInfo, bytes calldata pathDefinition, address executor, uint32 referralCode) + external + payable + returns (uint256 amountOut); +} /** * @title TermMax OdosAdapterV2AdapterV2 * @author Term Structure Labs */ -contract OdosV2AdapterV2 is OdosV2Adapter { - using TransferUtils for IERC20; +contract OdosV2AdapterV2 is ERC20SwapAdapterV2 { + using TransferUtilsV2 for IERC20; error InvalidOutputToken(); - constructor(address router_) OdosV2Adapter(router_) {} + IOdosRouterV2 public immutable router; + + constructor(address router_) { + router = IOdosRouterV2(router_); + } - function _swap(IERC20 tokenIn, IERC20 tokenOut, uint256 amountIn, bytes memory swapData) + function _swap(address receipient, IERC20 tokenIn, IERC20 tokenOut, uint256 amountIn, bytes memory swapData) internal virtual override @@ -38,7 +59,7 @@ contract OdosV2AdapterV2 is OdosV2Adapter { tokenInfo.outputQuote = (tokenInfo.outputQuote * amountIn) / tokenInfo.inputAmount; tokenInfo.outputMin = (tokenInfo.outputMin * amountIn) / tokenInfo.inputAmount; tokenInfo.inputAmount = amountIn; - tokenInfo.outputReceiver = address(this); + tokenInfo.outputReceiver = receipient; tokenOutAmt = router.swap(tokenInfo, pathDefinition, executor, referralCode); } diff --git a/contracts/v2/router/swapAdapters/PendleSwapV3AdapterV2.sol b/contracts/v2/router/swapAdapters/PendleSwapV3AdapterV2.sol index 200e6a1..1cf6a1f 100644 --- a/contracts/v2/router/swapAdapters/PendleSwapV3AdapterV2.sol +++ b/contracts/v2/router/swapAdapters/PendleSwapV3AdapterV2.sol @@ -1,21 +1,29 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.27; -import "../../../v1/router/swapAdapters/PendleSwapV3Adapter.sol"; +import {IPAllActionV3} from "@pendle/core-v2/contracts/interfaces/IPAllActionV3.sol"; +import {IPMarket, IPPrincipalToken, IPYieldToken} from "@pendle/core-v2/contracts/interfaces/IPMarket.sol"; +import {PendleHelper} from "../../extensions/pendle/PendleHelper.sol"; +import "./ERC20SwapAdapterV2.sol"; /** - * @title TermMax PendleSwapV3Adapter + * @title TermMax PendleSwapV3AdapterV2 * @author Term Structure Labs */ -contract PendleSwapV3AdapterV2 is PendleSwapV3Adapter { - using TransferUtils for IERC20; +contract PendleSwapV3AdapterV2 is ERC20SwapAdapterV2, PendleHelper { + using TransferUtilsV2 for IERC20; - constructor(address router_) PendleSwapV3Adapter(router_) {} + IPAllActionV3 public immutable router; - function _swap(IERC20 tokenIn, IERC20 tokenOut, uint256 amount, bytes memory swapData) + constructor(address router_) { + router = IPAllActionV3(router_); + } + + function _swap(address receipient, IERC20 tokenIn, IERC20 tokenOut, uint256 amount, bytes memory swapData) internal virtual override + onlyProxy returns (uint256 tokenOutAmt) { (address ptMarketAddr, uint256 inAmount, uint256 minTokenOut) = @@ -31,7 +39,7 @@ contract PendleSwapV3AdapterV2 is PendleSwapV3Adapter { minTokenOut = (minTokenOut * amount) / inAmount; if (tokenOut == PT) { (tokenOutAmt,,) = router.swapExactTokenForPt( - address(this), + receipient, address(market), minTokenOut, defaultApprox, @@ -41,11 +49,11 @@ contract PendleSwapV3AdapterV2 is PendleSwapV3Adapter { } else { if (PT.isExpired()) { (tokenOutAmt,) = router.redeemPyToToken( - address(this), PT.YT(), amount, createTokenOutputStruct(address(tokenOut), minTokenOut) + receipient, PT.YT(), amount, createTokenOutputStruct(address(tokenOut), minTokenOut) ); } else { (tokenOutAmt,,) = router.swapExactPtForToken( - address(this), + receipient, address(market), amount, createTokenOutputStruct(address(tokenOut), minTokenOut), diff --git a/contracts/v2/router/swapAdapters/TermMaxSwapAdapter.sol b/contracts/v2/router/swapAdapters/TermMaxSwapAdapter.sol new file mode 100644 index 0000000..c8b2631 --- /dev/null +++ b/contracts/v2/router/swapAdapters/TermMaxSwapAdapter.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {ERC20SwapAdapterV2, IERC20} from "./ERC20SwapAdapterV2.sol"; +import {ITermMaxOrder} from "contracts/interfaces/ITermMaxOrder.sol"; +import {TransferUtilsV2} from "../../lib/TransferUtilsV2.sol"; + +struct TermMaxSwapData { + bool swapExactTokenForToken; + address tokenIn; + address tokenOut; + address[] orders; + uint128[] tradingAmts; + uint128 netTokenAmt; + uint256 deadline; +} + +contract TermMaxSwapAdapter is ERC20SwapAdapterV2 { + using TransferUtilsV2 for IERC20; + + error OrdersAndAmtsLengthNotMatch(); + + function _swap(address receipient, IERC20 tokenIn, IERC20 tokenOut, uint256 tokenInAmt, bytes memory swapData) + internal + virtual + override + returns (uint256 netTokenOutOrIn) + { + TermMaxSwapData memory data = abi.decode(swapData, (TermMaxSwapData)); + if (data.orders.length != data.tradingAmts.length) revert OrdersAndAmtsLengthNotMatch(); + + if (data.swapExactTokenForToken) { + for (uint256 i = 0; i < data.orders.length; ++i) { + address order = data.orders[i]; + tokenIn.forceApprove(order, data.netTokenAmt); + netTokenOutOrIn += ITermMaxOrder(order).swapExactTokenToToken( + tokenIn, tokenOut, receipient, data.tradingAmts[i], 0, data.deadline + ); + } + if (netTokenOutOrIn < data.netTokenAmt) revert LessThanMinTokenOut(netTokenOutOrIn, data.netTokenAmt); + } else { + for (uint256 i = 0; i < data.orders.length; ++i) { + address order = data.orders[i]; + tokenIn.forceApprove(order, data.netTokenAmt); + netTokenOutOrIn += ITermMaxOrder(order).swapTokenToExactToken( + tokenIn, tokenOut, receipient, data.tradingAmts[i], data.netTokenAmt, data.deadline + ); + } + if (netTokenOutOrIn > data.netTokenAmt) revert LessThanMinTokenOut(netTokenOutOrIn, data.netTokenAmt); + } + } +} diff --git a/contracts/v2/router/swapAdapters/TermMaxTokenAdapter.sol b/contracts/v2/router/swapAdapters/TermMaxTokenAdapter.sol new file mode 100644 index 0000000..88796d1 --- /dev/null +++ b/contracts/v2/router/swapAdapters/TermMaxTokenAdapter.sol @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import "./ERC20SwapAdapterV2.sol"; +import {ITermMaxToken} from "../../tokens/ITermMaxToken.sol"; + +/** + * @title TermMaxTokenAdapter + * @notice Swap adapter for TermMax native tokens that support mint/burn operations + * @dev This adapter enables seamless token conversion between TermMax tokens and their underlying assets + * through mint and burn operations rather than traditional swaps. It's designed to work with + * tokens that implement the ITermMaxToken interface. + * + * @dev Usage patterns: + * - Wrapping: Convert underlying asset to TermMax token via mint operation + * - Unwrapping: Convert TermMax token back to underlying asset via burn operation + * + * @dev The adapter maintains a 1:1 conversion ratio between input and output tokens, + * making it suitable for wrapped token scenarios where no price discovery is needed. + */ +contract TermMaxTokenAdapter is ERC20SwapAdapterV2 { + /** + * @notice Performs token conversion through mint/burn operations + * @dev Overrides the base swap function to implement TermMax token-specific logic + * + * @param tokenIn The input token address + * @param tokenOut The output token address + * @param tokenInAmt The amount of input tokens to convert + * @param swapData Encoded boolean indicating operation type: + * - true: Wrap operation (mint tokenOut using tokenIn) + * - false: Unwrap operation (burn tokenIn to get underlying) + * + * @return tokenOutAmt The amount of output tokens received (always equals tokenInAmt for 1:1 conversion) + * + * @dev Security considerations: + * - Assumes caller has already transferred tokenInAmt to this contract + * - For wrap operations: tokenOut must implement ITermMaxToken.mint() + * - For unwrap operations: tokenIn must implement ITermMaxToken.burn() + * - No slippage protection needed due to 1:1 conversion ratio + */ + function _swap(address receipient, IERC20 tokenIn, IERC20 tokenOut, uint256 tokenInAmt, bytes memory swapData) + internal + virtual + override + returns (uint256 tokenOutAmt) + { + // Decode the operation type from swap data + bool isWrap = abi.decode(swapData, (bool)); + + if (isWrap) { + // Wrap operation: Mint new TermMax tokens + // tokenOut must be a TermMax token that supports minting + ITermMaxToken(address(tokenOut)).mint(receipient, tokenInAmt); + } else { + // Unwrap operation: Burn existing TermMax tokens + // tokenIn must be a TermMax token that supports burning + ITermMaxToken(address(tokenIn)).burn(receipient, tokenInAmt); + } + + // Return the same amount due to 1:1 conversion ratio + tokenOutAmt = tokenInAmt; + } +} diff --git a/contracts/v2/router/swapAdapters/UniswapV3AdapterV2.sol b/contracts/v2/router/swapAdapters/UniswapV3AdapterV2.sol index a3a0e92..9213a92 100644 --- a/contracts/v2/router/swapAdapters/UniswapV3AdapterV2.sol +++ b/contracts/v2/router/swapAdapters/UniswapV3AdapterV2.sol @@ -1,18 +1,23 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.27; -import "../../../v1/router/swapAdapters/UniswapV3Adapter.sol"; +import {ISwapRouter} from "@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol"; +import "./ERC20SwapAdapterV2.sol"; /** * @title TermMax UniswapV3AdapterV2 * @author Term Structure Labs */ -contract UniswapV3AdapterV2 is UniswapV3Adapter { - using TransferUtils for IERC20; +contract UniswapV3AdapterV2 is ERC20SwapAdapterV2 { + using TransferUtilsV2 for IERC20; - constructor(address router_) UniswapV3Adapter(router_) {} + ISwapRouter public immutable router; - function _swap(IERC20 tokenIn, IERC20, uint256 amount, bytes memory swapData) + constructor(address router_) { + router = ISwapRouter(router_); + } + + function _swap(address receipient, IERC20 tokenIn, IERC20 tokenOut, uint256 amount, bytes memory swapData) internal virtual override @@ -29,7 +34,7 @@ contract UniswapV3AdapterV2 is UniswapV3Adapter { tokenOutAmt = router.exactInput( ISwapRouter.ExactInputParams({ path: path, - recipient: address(this), + recipient: receipient, deadline: deadline, amountIn: amount, amountOutMinimum: amountOutMinimum diff --git a/contracts/v2/test/MockSwapAdapterV2.sol b/contracts/v2/test/MockSwapAdapterV2.sol new file mode 100644 index 0000000..29c6605 --- /dev/null +++ b/contracts/v2/test/MockSwapAdapterV2.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {IMintableERC20, IERC20} from "../../v1/tokens/IMintableERC20.sol"; +import "../router/swapAdapters/ERC20SwapAdapterV2.sol"; + +contract MockSwapAdapterV2 is ERC20SwapAdapterV2 { + address public immutable pool; + + constructor(address pool_) { + pool = pool_; + } + + function _swap(address recipient, IERC20 tokenIn, IERC20 tokenOut, uint256 amount, bytes memory swapData) + internal + virtual + override + returns (uint256 tokenOutAmt) + { + uint256 minTokenOut = abi.decode(swapData, (uint256)); + + IERC20(tokenIn).transfer(pool, amount); + + tokenOutAmt = minTokenOut; + IMintableERC20(address(tokenOut)).mint(recipient, tokenOutAmt); + } +} diff --git a/contracts/v2/tokens/ITermMaxToken.sol b/contracts/v2/tokens/ITermMaxToken.sol new file mode 100644 index 0000000..39dae57 --- /dev/null +++ b/contracts/v2/tokens/ITermMaxToken.sol @@ -0,0 +1,102 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +/** + * @title ITermMaxToken + * @notice Interface for TermMax protocol tokens that support advanced mint and burn operations + * @dev This interface defines the standard for tokens within the TermMax ecosystem that require + * controlled minting and burning capabilities. It extends beyond basic ERC20 functionality + * to support protocol-specific operations for wrapped tokens and yield-bearing assets. + * + * @dev Key features: + * - Controlled minting for token wrapping operations + * - Standard burning for token unwrapping + * - Special burnToAToken functionality for yield token conversions + * + * @dev Implementation requirements: + * - Must implement proper access control for mint/burn operations + * - Should emit appropriate events for transparency + * - Must handle edge cases (zero amounts, invalid addresses, etc.) + */ +interface ITermMaxToken { + /** + * @notice Returns the address of the aToken associated with this TermMax token + * @dev This function provides the address of the aToken that this TermMax token can be converted to. + * It is typically used for yield-bearing operations where TermMax tokens are converted to aTokens. + * + * @return The address of the associated aToken (e.g., yield-bearing token address) + */ + function aToken() external view returns (address); + + /** + * @notice Returns the address of the underlying asset for this TermMax token + * @dev This function provides the address of the asset that this TermMax token represents. + * It is typically used to identify the underlying asset for wrapping or unwrapping operations. + * + * @return The address of the underlying asset (e.g., ERC20 token address) + */ + function asset() external view returns (address); + /** + * @notice Mints new tokens to a specified address + * @dev Creates new token supply and assigns it to the recipient address. + * This function is typically used for wrapping underlying assets into TermMax tokens + * or for protocol rewards distribution. + * + * @param to The address that will receive the newly minted tokens + * @param amount The amount of tokens to mint (in token's smallest unit/decimals) + * + * @dev Requirements: + * - Caller must have minting permissions (typically restricted to authorized contracts) + * - `to` address must not be zero address + * - `amount` must be greater than zero + * - Must not exceed any maximum supply limits if implemented + * + * @dev Events: + * Should emit Transfer(address(0), to, amount) event as per ERC20 standard + */ + function mint(address to, uint256 amount) external; + + /** + * @notice Burns tokens from a specified address + * @dev Destroys existing tokens, reducing the total supply. + * This function is typically used for unwrapping TermMax tokens back to underlying assets + * or for protocol fee collection mechanisms. + * + * @param to The address from which tokens will be burned + * @param amount The amount of tokens to burn (in token's smallest unit/decimals) + * + * @dev Requirements: + * - Caller must have burning permissions (typically restricted to authorized contracts) + * - `to` address must have sufficient token balance + * - `amount` must be greater than zero and not exceed available balance + * + * @dev Events: + * Should emit Transfer(to, address(0), amount) event as per ERC20 standard + */ + function burn(address to, uint256 amount) external; + + /** + * @notice Burns tokens and converts them to aTokens (yield-bearing tokens) + * @dev Special burning function that destroys TermMax tokens and simultaneously + * mints or transfers equivalent aTokens to the specified address. This is used + * for direct conversion between TermMax tokens and yield-bearing variants. + * + * @param to The address that will receive the resulting aTokens + * @param amount The amount of tokens to burn and convert (in token's smallest unit/decimals) + * + * @dev Requirements: + * - Caller must have burning permissions + * - `to` address must not be zero address + * - `amount` must be greater than zero and not exceed available balance + * - Underlying aToken contract must be properly configured and functional + * + * @dev Implementation notes: + * - Conversion rate between burned tokens and minted aTokens should be clearly defined + * - May involve external calls to aToken contracts + * - Should handle potential failures in aToken minting gracefully + * + * @dev Events: + * Should emit both burn and aToken mint events for full transparency + */ + function burnToAToken(address to, uint256 amount) external; +} diff --git a/test/v1/mainnet-fork/GtBaseTest.t.sol b/test/v1/mainnet-fork/GtBaseTest.t.sol index 81c9a4e..be9dc99 100644 --- a/test/v1/mainnet-fork/GtBaseTest.t.sol +++ b/test/v1/mainnet-fork/GtBaseTest.t.sol @@ -14,9 +14,13 @@ import {ITermMaxMarket, TermMaxMarket, MarketEvents} from "contracts/v1/TermMaxM import {ITermMaxOrder} from "contracts/v1/ITermMaxOrder.sol"; import {IMintableERC20} from "contracts/v1/tokens/IMintableERC20.sol"; import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; -import {IGearingToken, AbstractGearingToken, GearingTokenConstants} from "contracts/v1/tokens/AbstractGearingToken.sol"; +import { + IGearingToken, AbstractGearingToken, GearingTokenConstants +} from "contracts/v1/tokens/AbstractGearingToken.sol"; import {IOracle, OracleAggregator, AggregatorV3Interface} from "contracts/v1/oracle/OracleAggregator.sol"; -import {TermMaxRouter, ISwapAdapter, ITermMaxRouter, SwapUnit, RouterErrors} from "contracts/v1/router/TermMaxRouter.sol"; +import { + TermMaxRouter, ISwapAdapter, ITermMaxRouter, SwapUnit, RouterErrors +} from "contracts/v1/router/TermMaxRouter.sol"; import {UniswapV3Adapter, ERC20SwapAdapter} from "contracts/v1/router/swapAdapters/UniswapV3Adapter.sol"; import {PendleSwapV3Adapter} from "contracts/v1/router/swapAdapters/PendleSwapV3Adapter.sol"; import {OdosV2Adapter, IOdosRouterV2} from "contracts/v1/router/swapAdapters/OdosV2Adapter.sol"; diff --git a/test/v1/mainnet-fork/MarketBaseTest.t.sol b/test/v1/mainnet-fork/MarketBaseTest.t.sol index c7ac0ac..2c624ed 100644 --- a/test/v1/mainnet-fork/MarketBaseTest.t.sol +++ b/test/v1/mainnet-fork/MarketBaseTest.t.sol @@ -16,7 +16,9 @@ import {IMintableERC20} from "contracts/v1/tokens/IMintableERC20.sol"; import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; import {IGearingToken, AbstractGearingToken} from "contracts/v1/tokens/AbstractGearingToken.sol"; import {IOracle, OracleAggregator, AggregatorV3Interface} from "contracts/v1/oracle/OracleAggregator.sol"; -import {TermMaxRouter, ISwapAdapter, ITermMaxRouter, SwapUnit, RouterErrors} from "contracts/v1/router/TermMaxRouter.sol"; +import { + TermMaxRouter, ISwapAdapter, ITermMaxRouter, SwapUnit, RouterErrors +} from "contracts/v1/router/TermMaxRouter.sol"; import {UniswapV3Adapter, ERC20SwapAdapter} from "contracts/v1/router/swapAdapters/UniswapV3Adapter.sol"; import {PendleSwapV3Adapter} from "contracts/v1/router/swapAdapters/PendleSwapV3Adapter.sol"; import {OdosV2Adapter, IOdosRouterV2} from "contracts/v1/router/swapAdapters/OdosV2Adapter.sol"; diff --git a/test/v1/mainnet-fork/VaultBaseTest.t.sol b/test/v1/mainnet-fork/VaultBaseTest.t.sol index e1d07c9..5a696da 100644 --- a/test/v1/mainnet-fork/VaultBaseTest.t.sol +++ b/test/v1/mainnet-fork/VaultBaseTest.t.sol @@ -16,7 +16,9 @@ import {IMintableERC20} from "contracts/v1/tokens/IMintableERC20.sol"; import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; import {IGearingToken, AbstractGearingToken} from "contracts/v1/tokens/AbstractGearingToken.sol"; import {IOracle, OracleAggregator, AggregatorV3Interface} from "contracts/v1/oracle/OracleAggregator.sol"; -import {TermMaxRouter, ISwapAdapter, ITermMaxRouter, SwapUnit, RouterErrors} from "contracts/v1/router/TermMaxRouter.sol"; +import { + TermMaxRouter, ISwapAdapter, ITermMaxRouter, SwapUnit, RouterErrors +} from "contracts/v1/router/TermMaxRouter.sol"; import {UniswapV3Adapter, ERC20SwapAdapter} from "contracts/v1/router/swapAdapters/UniswapV3Adapter.sol"; import {PendleSwapV3Adapter} from "contracts/v1/router/swapAdapters/PendleSwapV3Adapter.sol"; import {OdosV2Adapter, IOdosRouterV2} from "contracts/v1/router/swapAdapters/OdosV2Adapter.sol"; diff --git a/test/v2/RouterV2.t.sol b/test/v2/RouterV2.t.sol index 1261081..402569d 100644 --- a/test/v2/RouterV2.t.sol +++ b/test/v2/RouterV2.t.sol @@ -55,7 +55,7 @@ import { RouterEvents } from "contracts/v2/router/TermMaxRouterV2.sol"; import {ITermMaxRouter} from "contracts/v1/router/ITermMaxRouter.sol"; -import {MockSwapAdapter} from "contracts/v1/test/MockSwapAdapter.sol"; +import {MockSwapAdapterV2} from "contracts/v2/test/MockSwapAdapterV2.sol"; import {ITermMaxOrder} from "contracts/v1/ITermMaxOrder.sol"; contract RouterTestV2 is Test { @@ -75,7 +75,7 @@ contract RouterTestV2 is Test { address pool = vm.randomAddress(); - MockSwapAdapter adapter; + MockSwapAdapterV2 adapter; function setUp() public { vm.startPrank(deployer); @@ -106,7 +106,7 @@ contract RouterTestV2 is Test { res.xt.transfer(address(res.order), amount); res.router = DeployUtils.deployRouter(deployer); - adapter = new MockSwapAdapter(pool); + adapter = new MockSwapAdapterV2(pool); res.router.setAdapterWhitelist(address(adapter), true); vm.stopPrank(); From 8b430561762b258c34d3684ada9e67c172dbbd30 Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 10 Jun 2025 10:46:39 +0800 Subject: [PATCH 063/194] remove supply and withdraw queue --- contracts/v2/errors/VaultErrorsV2.sol | 15 ++ contracts/v2/vault/OrderManagerV2.sol | 324 ++++++++++++++++++++++++++ contracts/v2/vault/TermMaxVaultV2.sol | 80 ++----- contracts/v2/vault/VaultStorageV2.sol | 48 ++++ 4 files changed, 403 insertions(+), 64 deletions(-) create mode 100644 contracts/v2/errors/VaultErrorsV2.sol create mode 100644 contracts/v2/vault/OrderManagerV2.sol create mode 100644 contracts/v2/vault/VaultStorageV2.sol diff --git a/contracts/v2/errors/VaultErrorsV2.sol b/contracts/v2/errors/VaultErrorsV2.sol new file mode 100644 index 0000000..736707f --- /dev/null +++ b/contracts/v2/errors/VaultErrorsV2.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Vault Errors V2 + * @author Term Structure Labs + */ +interface VaultErrorsV2 { + /// @notice Error thrown when an invalid or unsupported functions is called + error SupplyQueueNoLongerSupported(); + /// @notice Error thrown when an invalid or unsupported functions is called + error WithdrawalQueueNoLongerSupported(); + /// @notice Error thrown when an invalid or unsupported functions is called + error UseApyInsteadOfApr(); +} diff --git a/contracts/v2/vault/OrderManagerV2.sol b/contracts/v2/vault/OrderManagerV2.sol new file mode 100644 index 0000000..d7f008e --- /dev/null +++ b/contracts/v2/vault/OrderManagerV2.sol @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.27; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; +import {PendingLib, PendingAddress, PendingUint192} from "../../v1/lib/PendingLib.sol"; +import {ITermMaxMarket} from "../../v1/ITermMaxMarket.sol"; +import {CurveCuts, OrderConfig} from "../../v1/storage/TermMaxStorage.sol"; +import {VaultErrors} from "../../v1/errors/VaultErrors.sol"; +import {VaultEvents} from "../../v1/events/VaultEvents.sol"; +import {ITermMaxRouter} from "../../v1/router/ITermMaxRouter.sol"; +import {ITermMaxOrder} from "../../v1/ITermMaxOrder.sol"; +import {VaultConstants} from "../../v1/lib/VaultConstants.sol"; +import {TransferUtils} from "../../v1/lib/TransferUtils.sol"; +import {Constants} from "../../v1/lib/Constants.sol"; +import {ArrayUtils} from "../../v1/lib/ArrayUtils.sol"; +import {MathLib} from "../../v1/lib/MathLib.sol"; +import {LinkedList} from "../../v1/lib/LinkedList.sol"; +import {IOrderManager} from "../../v1/vault/IOrderManager.sol"; +import {ISwapCallback} from "../../v1/ISwapCallback.sol"; +import {OrderInfo, VaultStorageV2} from "./VaultStorageV2.sol"; +/** + * @title Order Manager + * @author Term Structure Labs + * @notice The extension of the TermMaxVault that manages orders and calculates interest + */ + +contract OrderManager is VaultStorageV2, VaultErrors, VaultEvents, IOrderManager { + using SafeCast for uint256; + using SafeCast for int256; + using TransferUtils for IERC20; + using ArrayUtils for address[]; + using MathLib for uint256; + using LinkedList for mapping(uint64 => uint64); + + address private immutable ORDER_MANAGER_SINGLETON; + + /** + * @notice Reverts if the caller is not the proxy + */ + modifier onlyProxy() { + if (address(this) == ORDER_MANAGER_SINGLETON) revert OnlyProxy(); + _; + } + + constructor() { + ORDER_MANAGER_SINGLETON = address(this); + } + + /** + * @inheritdoc IOrderManager + */ + function updateOrders( + IERC20 asset, + ITermMaxOrder[] memory orders, + int256[] memory changes, + uint256[] memory maxSupplies, + CurveCuts[] memory curveCuts + ) external override onlyProxy { + _accruedInterest(); + for (uint256 i = 0; i < orders.length; ++i) { + _updateOrder(asset, ITermMaxOrder(orders[i]), changes[i], maxSupplies[i], curveCuts[i]); + } + } + + /** + * @inheritdoc IOrderManager + */ + function withdrawPerformanceFee(IERC20 asset, address recipient, uint256 amount) external override onlyProxy { + _accruedInterest(); + _withdrawPerformanceFee(asset, recipient, amount); + } + + /** + * @inheritdoc IOrderManager + */ + function redeemOrder(ITermMaxOrder order) external override onlyProxy { + _redeemFromMarket(address(order), _orderMapping[address(order)]); + } + + /** + * @inheritdoc IOrderManager + */ + function createOrder( + IERC20 asset, + ITermMaxMarket market, + uint256 maxSupply, + uint256 initialReserve, + CurveCuts memory curveCuts + ) external onlyProxy returns (ITermMaxOrder order) { + (IERC20 ft, IERC20 xt,,, IERC20 debtToken) = market.tokens(); + if (asset != debtToken) revert InconsistentAsset(); + + order = market.createOrder(address(this), maxSupply, ISwapCallback(address(this)), curveCuts); + if (initialReserve > 0) { + asset.safeIncreaseAllowance(address(market), initialReserve); + market.mint(address(order), initialReserve); + } + + uint64 orderMaturity = market.config().maturity; + _orderMapping[address(order)] = + OrderInfo({market: market, ft: ft, xt: xt, maxSupply: maxSupply.toUint128(), maturity: orderMaturity}); + _maturityMapping.insertWhenZeroAsRoot(orderMaturity); + emit CreateOrder(msg.sender, address(market), address(order), maxSupply, initialReserve, curveCuts); + } + + function _updateOrder( + IERC20 asset, + ITermMaxOrder order, + int256 changes, + uint256 maxSupply, + CurveCuts memory curveCuts + ) internal { + _checkOrder(address(order)); + OrderInfo memory orderInfo = _orderMapping[address(order)]; + orderInfo.maxSupply = maxSupply.toUint128(); + OrderConfig memory newOrderConfig; + newOrderConfig.curveCuts = curveCuts; + newOrderConfig.maxXtReserve = maxSupply; + newOrderConfig.swapTrigger = ISwapCallback(address(this)); + if (changes < 0) { + // withdraw assets from order and burn to assets + order.updateOrder(newOrderConfig, changes, changes); + uint256 withdrawChanges = (-changes).toUint256(); + orderInfo.ft.safeIncreaseAllowance(address(orderInfo.market), withdrawChanges); + orderInfo.xt.safeIncreaseAllowance(address(orderInfo.market), withdrawChanges); + orderInfo.market.burn(address(this), withdrawChanges); + } else { + // deposit assets to order + uint256 depositChanges = uint256(changes); + asset.safeIncreaseAllowance(address(orderInfo.market), depositChanges); + orderInfo.market.mint(address(order), depositChanges); + // update curve cuts + order.updateOrder(newOrderConfig, 0, 0); + } + _orderMapping[address(order)] = orderInfo; + emit UpdateOrder(msg.sender, address(order), changes, maxSupply, curveCuts); + } + + /** + * @inheritdoc IOrderManager + */ + function depositAssets(IERC20 asset, uint256 amount) external override onlyProxy { + _accruedInterest(); + // deposit to lpers + uint256 amplifiedAmt = amount * Constants.DECIMAL_BASE_SQ; + _totalFt += amplifiedAmt; + _accretingPrincipal += amplifiedAmt; + } + + /** + * @inheritdoc IOrderManager + */ + function withdrawAssets(IERC20 asset, address recipient, uint256 amount) external override onlyProxy { + _accruedInterest(); + uint256 amountLeft = amount; + uint256 assetBalance = asset.balanceOf(address(this)); + if (assetBalance >= amount) { + asset.safeTransfer(recipient, amount); + } else { + revert InsufficientFunds(assetBalance, amount); + } + uint256 amplifiedAmt = amount * Constants.DECIMAL_BASE_SQ; + _totalFt -= amplifiedAmt; + _accretingPrincipal -= amplifiedAmt; + } + + function _withdrawPerformanceFee(IERC20 asset, address recipient, uint256 amount) internal { + uint256 amplifiedAmt = amount * Constants.DECIMAL_BASE_SQ; + if (amplifiedAmt > _performanceFee) { + revert InsufficientFunds(_performanceFee / Constants.DECIMAL_BASE_SQ, amount); + } + asset.safeTransfer(recipient, amount); + _performanceFee -= amplifiedAmt; + _totalFt -= amplifiedAmt; + + emit WithdrawPerformanceFee(msg.sender, recipient, amount); + } + + /** + * @inheritdoc IOrderManager + */ + function dealBadDebt(address recipient, address collateral, uint256 amount) + external + onlyProxy + returns (uint256 collateralOut) + { + _accruedInterest(); + uint256 badDebtAmt = _badDebtMapping[collateral]; + if (badDebtAmt == 0) revert NoBadDebt(collateral); + if (amount > badDebtAmt) revert InsufficientFunds(badDebtAmt, amount); + uint256 collateralBalance = IERC20(collateral).balanceOf(address(this)); + collateralOut = (amount * collateralBalance) / badDebtAmt; + IERC20(collateral).safeTransfer(recipient, collateralOut); + + _badDebtMapping[collateral] -= amount; + uint256 amplifiedAmt = amount * Constants.DECIMAL_BASE_SQ; + _accretingPrincipal -= amplifiedAmt; + _totalFt -= amplifiedAmt; + } + + function _burnFromOrder(ITermMaxOrder order, OrderInfo memory orderInfo, uint256 amount) internal { + order.withdrawAssets(orderInfo.ft, address(this), amount); + order.withdrawAssets(orderInfo.xt, address(this), amount); + orderInfo.ft.safeIncreaseAllowance(address(orderInfo.market), amount); + orderInfo.xt.safeIncreaseAllowance(address(orderInfo.market), amount); + + orderInfo.market.burn(address(this), amount); + } + + function _redeemFromMarket(address order, OrderInfo memory orderInfo) internal returns (uint256 totalRedeem) { + uint256 ftReserve = orderInfo.ft.balanceOf(order); + if (ftReserve != 0) { + ITermMaxOrder(order).withdrawAssets(orderInfo.ft, address(this), ftReserve); + orderInfo.ft.safeIncreaseAllowance(address(orderInfo.market), ftReserve); + (totalRedeem,) = orderInfo.market.redeem(ftReserve, address(this)); + if (totalRedeem < ftReserve) { + // storage bad debt + (,,, address collateral,) = orderInfo.market.tokens(); + _badDebtMapping[collateral] += ftReserve - totalRedeem; + } + } + emit RedeemOrder(msg.sender, order, ftReserve.toUint128(), totalRedeem.toUint128()); + + delete _orderMapping[order]; + } + + /// @notice Calculate and distribute accrued the interest from start to end time + function _accruedPeriodInterest(uint256 startTime, uint256 endTime) internal { + uint256 interest = (_annualizedInterest * (endTime - startTime)) / 365 days; + uint256 _performanceFeeToCurator = (interest * _performanceFeeRate) / Constants.DECIMAL_BASE; + // accrue interest + _performanceFee += _performanceFeeToCurator; + _accretingPrincipal += (interest - _performanceFeeToCurator); + } + + /** + * @inheritdoc IOrderManager + */ + function accruedInterest() external onlyProxy { + _accruedInterest(); + } + + /// @notice Distribute interest + function _accruedInterest() internal { + uint64 currentTime = block.timestamp.toUint64(); + uint256 lastTime = _lastUpdateTime; + if (currentTime == lastTime) return; + uint64 recentMaturity = _maturityMapping[0]; + if (recentMaturity == 0) return; + while (recentMaturity != 0 && recentMaturity <= currentTime) { + // pop first maturity + _maturityMapping.popWhenZeroAsRoot(); + _accruedPeriodInterest(lastTime, recentMaturity); + // update last time + lastTime = recentMaturity; + // update annualized interest + _annualizedInterest -= _maturityToInterest[recentMaturity]; + delete _maturityToInterest[recentMaturity]; + // get next maturity + recentMaturity = _maturityMapping[0]; + } + // accrued interest for the remaining maturity + if (recentMaturity > 0) { + _accruedPeriodInterest(lastTime, currentTime); + } else { + // all orders are expired + _annualizedInterest = 0; + } + _lastUpdateTime = currentTime; + } + + function _checkLockedFt() internal view { + if (_accretingPrincipal + _performanceFee > _totalFt) revert LockedFtGreaterThanTotalFt(); + } + + function _checkOrder(address orderAddress) internal view { + if (address(_orderMapping[orderAddress].market) == address(0)) { + revert UnauthorizedOrder(orderAddress); + } + } + + /// @notice Callback function for the swap + /// @param deltaFt The change in the ft balance of the order + function afterSwap(uint256 ftReserve, uint256 xtReserve, int256 deltaFt) external onlyProxy { + if (ftReserve < xtReserve) { + revert OrderHasNegativeInterest(); + } + address orderAddress = msg.sender; + /// @dev Check if the order is valid + _checkOrder(orderAddress); + uint64 maturity = _orderMapping[orderAddress].maturity; + /// @dev Calculate interest from last update time to now + _accruedInterest(); + + /// @dev If ft increases, interest increases, and if ft decreases, + /// interest decreases. Update the expected annualized return based on the change + uint256 ftChanges; + + if (deltaFt > 0) { + ftChanges = uint256(deltaFt) * Constants.DECIMAL_BASE_SQ; + _totalFt += ftChanges; + uint256 deltaAnnualizedInterest = ftChanges * 365 days / uint256(maturity - block.timestamp); + + _maturityToInterest[maturity] += deltaAnnualizedInterest; + + _annualizedInterest += deltaAnnualizedInterest; + } else { + ftChanges = uint256(-deltaFt) * Constants.DECIMAL_BASE_SQ; + _totalFt -= ftChanges; + uint256 deltaAnnualizedInterest = (ftChanges * 365 days) / uint256(maturity - block.timestamp); + if ( + _maturityToInterest[maturity] < deltaAnnualizedInterest || _annualizedInterest < deltaAnnualizedInterest + ) { + revert LockedFtGreaterThanTotalFt(); + } + _maturityToInterest[maturity] -= deltaAnnualizedInterest; + _annualizedInterest -= deltaAnnualizedInterest; + } + /// @dev Ensure that the total assets after the transaction are + ///greater than or equal to the principal and the allocated interest + _checkLockedFt(); + } +} diff --git a/contracts/v2/vault/TermMaxVaultV2.sol b/contracts/v2/vault/TermMaxVaultV2.sol index 118f9af..fe39653 100644 --- a/contracts/v2/vault/TermMaxVaultV2.sol +++ b/contracts/v2/vault/TermMaxVaultV2.sol @@ -27,13 +27,14 @@ import {ISwapCallback} from "../../v1/ISwapCallback.sol"; import {VaultErrors} from "../../v1/errors/VaultErrors.sol"; import {VaultEvents} from "../../v1/events/VaultEvents.sol"; import {IOrderManager} from "../../v1/vault/IOrderManager.sol"; -import {VaultStorage, OrderInfo} from "../../v1/vault/VaultStorage.sol"; +import {VaultStorageV2, OrderInfo} from "../../v2/vault/VaultStorageV2.sol"; import {Constants} from "../../v1/lib/Constants.sol"; import {ITermMaxVault} from "../../v1/vault/ITermMaxVault.sol"; import {ITermMaxVaultV2} from "./ITermMaxVaultV2.sol"; +import {VaultErrorsV2} from "../errors/VaultErrorsV2.sol"; contract TermMaxVaultV2 is - VaultStorage, + VaultStorageV2, ITermMaxVault, Ownable2StepUpgradeable, ReentrancyGuardUpgradeable, @@ -222,14 +223,14 @@ contract TermMaxVaultV2 is * @inheritdoc ITermMaxVault */ function supplyQueue(uint256 index) external view virtual returns (address) { - return _supplyQueue[index]; + revert VaultErrorsV2.SupplyQueueNoLongerSupported(); } /** * @inheritdoc ITermMaxVault */ function withdrawQueue(uint256 index) external view virtual returns (address) { - return _withdrawQueue[index]; + revert VaultErrorsV2.WithdrawalQueueNoLongerSupported(); } /** @@ -250,7 +251,7 @@ contract TermMaxVaultV2 is * @inheritdoc ITermMaxVault */ function apr() external view virtual returns (uint256) { - revert("Method not implemented, use apy() instead"); + revert VaultErrorsV2.UseApyInsteadOfApr(); } /** @@ -265,14 +266,14 @@ contract TermMaxVaultV2 is * @inheritdoc ITermMaxVault */ function supplyQueueLength() external view virtual returns (uint256) { - return _supplyQueue.length; + revert VaultErrorsV2.SupplyQueueNoLongerSupported(); } /** * @inheritdoc ITermMaxVault */ function withdrawQueueLength() external view virtual returns (uint256) { - return _withdrawQueue.length; + revert VaultErrorsV2.WithdrawalQueueNoLongerSupported(); } // Ordermanager functions @@ -561,60 +562,14 @@ contract TermMaxVaultV2 is * @inheritdoc ITermMaxVault */ function updateSupplyQueue(uint256[] memory indexes) external virtual onlyAllocatorRole { - _updateSupplyQueue(indexes); + revert VaultErrorsV2.SupplyQueueNoLongerSupported(); } /** * @inheritdoc ITermMaxVault */ function updateWithdrawQueue(uint256[] memory indexes) external virtual onlyAllocatorRole { - _updateWithdrawQueue(indexes); - } - - function _updateWithdrawQueue(uint256[] memory indexes) internal { - uint256 length = _withdrawQueue.length; - if (indexes.length != length) { - revert WithdrawQueueLengthMismatch(); - } - bool[] memory seen = new bool[](length); - address[] memory newWithdrawQueue = new address[](length); - - for (uint256 i; i < length; ++i) { - uint256 prevIndex = indexes[i]; - - // If prevIndex >= currLength, it will revert with native "Index out of bounds". - address order = _withdrawQueue[prevIndex]; - if (seen[prevIndex]) revert DuplicateOrder(order); - seen[prevIndex] = true; - - newWithdrawQueue[i] = order; - } - _withdrawQueue = newWithdrawQueue; - - emit UpdateWithdrawQueue(msg.sender, newWithdrawQueue); - } - - function _updateSupplyQueue(uint256[] memory indexes) internal { - uint256 length = _supplyQueue.length; - if (indexes.length != length) { - revert SupplyQueueLengthMismatch(); - } - bool[] memory seen = new bool[](length); - address[] memory newSupplyQueue = new address[](length); - - for (uint256 i; i < length; ++i) { - uint256 prevIndex = indexes[i]; - - // If prevIndex >= currLength, it will revert with native "Index out of bounds". - address order = _supplyQueue[prevIndex]; - if (seen[prevIndex]) revert DuplicateOrder(order); - seen[prevIndex] = true; - - newSupplyQueue[i] = order; - } - _supplyQueue = newSupplyQueue; - - emit UpdateSupplyQueue(msg.sender, newSupplyQueue); + revert VaultErrorsV2.WithdrawalQueueNoLongerSupported(); } /** @@ -692,10 +647,6 @@ contract TermMaxVaultV2 is */ function pause() external virtual onlyOwner { _pause(); - // pause orders - for (uint256 i = 0; i < _supplyQueue.length; ++i) { - ITermMaxOrder(_supplyQueue[i]).pause(); - } } /** @@ -703,10 +654,6 @@ contract TermMaxVaultV2 is */ function unpause() external virtual onlyOwner { _unpause(); - // unpause orders - for (uint256 i = 0; i < _supplyQueue.length; ++i) { - ITermMaxOrder(_supplyQueue[i]).unpause(); - } } function _previewAccruedInterest() @@ -758,7 +705,12 @@ contract TermMaxVaultV2 is /// @notice Callback function for the swap /// @param deltaFt The change in the ft balance of the order - function afterSwap(uint256 ftReserve, uint256 xtReserve, int256 deltaFt, int256) external virtual override { + function afterSwap(uint256 ftReserve, uint256 xtReserve, int256 deltaFt, int256) + external + virtual + override + whenNotPaused + { _delegateCall(abi.encodeCall(IOrderManager.afterSwap, (ftReserve, xtReserve, deltaFt))); } } diff --git a/contracts/v2/vault/VaultStorageV2.sol b/contracts/v2/vault/VaultStorageV2.sol new file mode 100644 index 0000000..c66ccbb --- /dev/null +++ b/contracts/v2/vault/VaultStorageV2.sol @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {ITermMaxMarket} from "../../v1/ITermMaxMarket.sol"; +import {PendingAddress, PendingUint192} from "../../v1/lib/PendingLib.sol"; +import {OrderInfo} from "../../v1/vault/VaultStorage.sol"; + +contract VaultStorageV2 { + // State variables + address internal _guardian; + address internal _curator; + + mapping(address => bool) internal _isAllocator; + mapping(address => bool) internal _marketWhitelist; + mapping(address => PendingUint192) internal _pendingMarkets; + + PendingUint192 internal _pendingTimelock; + PendingUint192 internal _pendingPerformanceFeeRate; + PendingAddress internal _pendingGuardian; + + uint256 internal _timelock; + uint256 internal _maxCapacity; + + /// @dev The total ft in the vault + uint256 internal _totalFt; + /// @notice The locked ft = accretingPrincipal + performanceFee; + uint256 internal _accretingPrincipal; + /// @notice The performance fee is paid to the curators + uint256 internal _performanceFee; + /// @notice Annualize the interest income + uint256 internal _annualizedInterest; + + uint64 internal _performanceFeeRate; + + /// @dev A mapping from collateral address to bad debt + mapping(address => uint256) internal _badDebtMapping; + mapping(address => OrderInfo) internal _orderMapping; + + /// @dev The last time the interest was accurately calculated + uint64 internal _lastUpdateTime; + /// @dev A one-way linked list presented using a mapping structure, recorded in order according to matiruty + /// @dev The key is the maturity, and the value is the next maturity + /// Etc. day 0 => day 1 => day 2 => day 3 => ... + mapping(uint64 => uint64) internal _maturityMapping; + /// @dev A mapping from maturity to its annualized interest + mapping(uint64 => uint256) internal _maturityToInterest; +} From 48b38c2e85e39b0faa62a9751a37ded017c3d8e8 Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 10 Jun 2025 10:47:07 +0800 Subject: [PATCH 064/194] fix ut --- test/v2/VaultV2.t.sol | 104 ++++++++++-------------------------------- 1 file changed, 23 insertions(+), 81 deletions(-) diff --git a/test/v2/VaultV2.t.sol b/test/v2/VaultV2.t.sol index cf33383..9a4799a 100644 --- a/test/v2/VaultV2.t.sol +++ b/test/v2/VaultV2.t.sol @@ -44,6 +44,7 @@ import { OrderInfo } from "contracts/v2/vault/TermMaxVaultV2.sol"; import {PendingUint192, PendingLib} from "contracts/v1/lib/PendingLib.sol"; +import {VaultErrorsV2} from "contracts/v2/errors/VaultErrorsV2.sol"; contract VaultTestV2 is Test { using JSONLoader for *; @@ -418,57 +419,32 @@ contract VaultTestV2 is Test { vm.stopPrank(); } - function testSupplyQueue(uint256 orderCount, uint256 seed) public { - vm.assume(orderCount < VaultConstants.MAX_QUEUE_LENGTH && orderCount > 0); - address[] memory supplyQueue = new address[](orderCount); - supplyQueue[0] = vault.supplyQueue(0); - vm.startPrank(curator); - for (uint256 i = 1; i < orderCount; i++) { - address order = address(vault.createOrder(res.market, maxCapacity, 0, orderConfig.curveCuts)); - OrderInfo memory orderInfo = vault.orderMapping(order); - assertEq(address(orderInfo.market), address(res.market)); - assertEq(orderInfo.maturity, res.market.config().maturity); - assertEq(address(orderInfo.ft), address(res.ft)); - assertEq(address(orderInfo.xt), address(res.xt)); - supplyQueue[i] = order; - assertEq(vault.supplyQueue(i), order); - } + function testSupplyQueue() public { + vm.expectRevert(VaultErrorsV2.SupplyQueueNoLongerSupported.selector); + vault.supplyQueueLength(); - uint256[] memory indexes = new uint256[](orderCount); - for (uint256 i = 0; i < orderCount; i++) { - indexes[i] = i; - } - indexes = shuffle(indexes, seed); - vault.updateSupplyQueue(indexes); + vm.expectRevert(VaultErrorsV2.SupplyQueueNoLongerSupported.selector); + vault.supplyQueue(0); - for (uint256 i = 0; i < orderCount; i++) { - assertEq(vault.supplyQueue(i), supplyQueue[indexes[i]]); - } + vm.startPrank(curator); + uint256[] memory indexes = new uint256[](2); + vm.expectRevert(VaultErrorsV2.SupplyQueueNoLongerSupported.selector); + vault.updateSupplyQueue(indexes); vm.stopPrank(); } - function testWithdrawQueue(uint256 orderCount, uint256 seed) public { - vm.assume(orderCount < VaultConstants.MAX_QUEUE_LENGTH && orderCount > 0); - address[] memory withdrawQueue = new address[](orderCount); - withdrawQueue[0] = vault.withdrawQueue(0); - vm.startPrank(curator); - for (uint256 i = 1; i < orderCount; i++) { - address order = address(vault.createOrder(res.market, maxCapacity, 0, orderConfig.curveCuts)); - withdrawQueue[i] = order; - assertEq(vault.withdrawQueue(i), order); - } + function testWithdrawQueue() public { + vm.expectRevert(VaultErrorsV2.WithdrawalQueueNoLongerSupported.selector); + vault.withdrawQueueLength(); - uint256[] memory indexes = new uint256[](orderCount); - for (uint256 i = 0; i < orderCount; i++) { - indexes[i] = i; - } - indexes = shuffle(indexes, seed); - vault.updateWithdrawQueue(indexes); + vm.expectRevert(VaultErrorsV2.WithdrawalQueueNoLongerSupported.selector); + vault.withdrawQueue(0); - for (uint256 i = 0; i < orderCount; i++) { - assertEq(vault.withdrawQueue(i), withdrawQueue[indexes[i]]); - } + vm.startPrank(curator); + uint256[] memory indexes = new uint256[](2); + vm.expectRevert(VaultErrorsV2.WithdrawalQueueNoLongerSupported.selector); + vault.updateWithdrawQueue(indexes); vm.stopPrank(); } @@ -487,44 +463,6 @@ contract VaultTestV2 is Test { return arr; } - function test_RevertSupplyQueue() public { - vm.prank(lper); - vm.expectRevert(VaultErrors.NotAllocatorRole.selector); - vault.updateSupplyQueue(new uint256[](0)); - - vm.startPrank(curator); - vm.expectRevert(VaultErrors.SupplyQueueLengthMismatch.selector); - vault.updateSupplyQueue(new uint256[](0)); - - address order2 = address(vault.createOrder(res.market, maxCapacity, 0, orderConfig.curveCuts)); - uint256[] memory indexes = new uint256[](2); - indexes[0] = 1; - indexes[1] = 1; - vm.expectRevert(abi.encodeWithSelector(VaultErrors.DuplicateOrder.selector, order2)); - vault.updateSupplyQueue(indexes); - - vm.stopPrank(); - } - - function test_RevertWithdrawQueue() public { - vm.prank(lper); - vm.expectRevert(VaultErrors.NotAllocatorRole.selector); - vault.updateWithdrawQueue(new uint256[](0)); - - vm.startPrank(curator); - vm.expectRevert(VaultErrors.WithdrawQueueLengthMismatch.selector); - vault.updateWithdrawQueue(new uint256[](0)); - - address order2 = address(vault.createOrder(res.market, maxCapacity, 0, orderConfig.curveCuts)); - uint256[] memory indexes = new uint256[](2); - indexes[0] = 1; - indexes[1] = 1; - vm.expectRevert(abi.encodeWithSelector(VaultErrors.DuplicateOrder.selector, order2)); - vault.updateWithdrawQueue(indexes); - - vm.stopPrank(); - } - function testUpdateOrder() public { vm.startPrank(curator); ITermMaxOrder[] memory orders = new ITermMaxOrder[](3); @@ -945,6 +883,10 @@ contract VaultTestV2 is Test { vault.deposit(amount2, lper2); vm.stopPrank(); + vm.startPrank(curator); + + vm.stopPrank(); + address borrower = vm.randomAddress(); vm.startPrank(borrower); LoanUtils.fastMintGt(res, borrower, 1000e8, 1e18); From 62d45285053c800e02c1af0bd91f89a66625f674 Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 10 Jun 2025 11:55:49 +0800 Subject: [PATCH 065/194] fix vault v2 uts --- contracts/v2/vault/OrderManagerV2.sol | 7 +- contracts/v2/vault/TermMaxVaultV2.sol | 2 +- test/v2/VaultV2.t.sol | 197 +++++++------------------- test/v2/utils/DeployUtils.sol | 4 +- 4 files changed, 59 insertions(+), 151 deletions(-) diff --git a/contracts/v2/vault/OrderManagerV2.sol b/contracts/v2/vault/OrderManagerV2.sol index d7f008e..72802d1 100644 --- a/contracts/v2/vault/OrderManagerV2.sol +++ b/contracts/v2/vault/OrderManagerV2.sol @@ -3,14 +3,11 @@ pragma solidity ^0.8.27; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; -import {PendingLib, PendingAddress, PendingUint192} from "../../v1/lib/PendingLib.sol"; import {ITermMaxMarket} from "../../v1/ITermMaxMarket.sol"; import {CurveCuts, OrderConfig} from "../../v1/storage/TermMaxStorage.sol"; import {VaultErrors} from "../../v1/errors/VaultErrors.sol"; import {VaultEvents} from "../../v1/events/VaultEvents.sol"; -import {ITermMaxRouter} from "../../v1/router/ITermMaxRouter.sol"; import {ITermMaxOrder} from "../../v1/ITermMaxOrder.sol"; -import {VaultConstants} from "../../v1/lib/VaultConstants.sol"; import {TransferUtils} from "../../v1/lib/TransferUtils.sol"; import {Constants} from "../../v1/lib/Constants.sol"; import {ArrayUtils} from "../../v1/lib/ArrayUtils.sol"; @@ -20,12 +17,12 @@ import {IOrderManager} from "../../v1/vault/IOrderManager.sol"; import {ISwapCallback} from "../../v1/ISwapCallback.sol"; import {OrderInfo, VaultStorageV2} from "./VaultStorageV2.sol"; /** - * @title Order Manager + * @title Order Manager V2 * @author Term Structure Labs * @notice The extension of the TermMaxVault that manages orders and calculates interest */ -contract OrderManager is VaultStorageV2, VaultErrors, VaultEvents, IOrderManager { +contract OrderManagerV2 is VaultStorageV2, VaultErrors, VaultEvents, IOrderManager { using SafeCast for uint256; using SafeCast for int256; using TransferUtils for IERC20; diff --git a/contracts/v2/vault/TermMaxVaultV2.sol b/contracts/v2/vault/TermMaxVaultV2.sol index fe39653..f7d7527 100644 --- a/contracts/v2/vault/TermMaxVaultV2.sol +++ b/contracts/v2/vault/TermMaxVaultV2.sol @@ -315,7 +315,7 @@ contract TermMaxVaultV2 is /** * @inheritdoc ITermMaxVault */ - function redeemOrder(ITermMaxOrder order) external virtual onlyCuratorRole { + function redeemOrder(ITermMaxOrder order) external virtual { _delegateCall(abi.encodeCall(IOrderManager.redeemOrder, (order))); } diff --git a/test/v2/VaultV2.t.sol b/test/v2/VaultV2.t.sol index 9a4799a..52a7f09 100644 --- a/test/v2/VaultV2.t.sol +++ b/test/v2/VaultV2.t.sol @@ -45,6 +45,7 @@ import { } from "contracts/v2/vault/TermMaxVaultV2.sol"; import {PendingUint192, PendingLib} from "contracts/v1/lib/PendingLib.sol"; import {VaultErrorsV2} from "contracts/v2/errors/VaultErrorsV2.sol"; +import {IPausable} from "contracts/v1/access/AccessManager.sol"; contract VaultTestV2 is Test { using JSONLoader for *; @@ -87,6 +88,7 @@ contract VaultTestV2 is Test { orderConfig = JSONLoader.getOrderConfigFromJson(testdata, ".orderConfig"); marketConfig.maturity = uint64(currentTime + 90 days); res = DeployUtils.deployMockMarket(deployer, marketConfig, maxLtv, liquidationLtv); + vm.label(address(res.market), "market"); MarketConfig memory marketConfig2 = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); marketConfig2.maturity = uint64(currentTime + 180 days); @@ -112,6 +114,7 @@ contract VaultTestV2 is Test { 0 ) ); + vm.label(address(market2), "market2"); // update oracle res.collateralOracle.updateRoundData(JSONLoader.getRoundDataFromJson(testdata, ".priceData.ETH_2000_DAI_1.eth")); @@ -125,8 +128,17 @@ contract VaultTestV2 is Test { vault = DeployUtils.deployVault(initialParams); + vm.label(address(vault), "vault"); + vault.submitGuardian(guardian); + vm.label(guardian, "guardian"); vault.setIsAllocator(allocator, true); + vm.label(allocator, "allocator"); + vm.label(curator, "curator"); + vm.label(deployer, "deployer"); + vm.label(lper, "lper"); + vm.label(address(res.debt), "debt token"); + vm.label(address(res.collateral), "collateral token"); vault.submitMarket(address(res.market), true); vault.submitMarket(address(market2), true); @@ -138,9 +150,10 @@ contract VaultTestV2 is Test { res.debt.mint(deployer, amount); res.debt.approve(address(vault), amount); vault.deposit(amount, deployer); + assertEq(res.debt.balanceOf(address(vault)), amount); res.order = vault.createOrder(res.market, maxCapacity, amount, orderConfig.curveCuts); - + vm.label(address(res.order), "order"); res.debt.mint(deployer, 10000e18); res.debt.approve(address(res.market), 10000e18); res.market.mint(deployer, 10000e18); @@ -567,6 +580,8 @@ contract VaultTestV2 is Test { vault.deposit(amount2, lper2); vm.stopPrank(); + _depositToOrder(vault, res.order, -1e10); + vm.startPrank(deployer); uint256 totalFt = vault.totalFt(); uint256 lockedFr = vault.totalAssets(); @@ -642,6 +657,7 @@ contract VaultTestV2 is Test { res.debt.approve(address(vault), amount2); vault.deposit(amount2, lper2); vm.stopPrank(); + _depositToOrder(vault, res.order, amount2.toInt256()); console.log("principal after deposit:", vault.totalAssets()); console.log("total supply:", vault.totalSupply()); console.log("anulizedInterest:", vault.annualizedInterest()); @@ -661,6 +677,7 @@ contract VaultTestV2 is Test { console.log("----day 6----"); vm.warp(currentTime + 6 days); console.log("new principal:", vault.totalAssets()); + _depositToOrder(vault, res.order, -(vault.previewRedeem(1000e8)).toInt256()); vm.startPrank(lper2); console.log("previewRedeem: ", vault.previewRedeem(1000e8)); assertEq(vault.previewRedeem(1000e8), vault.redeem(1000e8, lper2, lper2)); @@ -680,6 +697,7 @@ contract VaultTestV2 is Test { console.log("new principal:", vault.totalAssets()); vm.startPrank(lper2); console.log("previewRedeem: ", vault.previewRedeem(1000e8)); + vault.redeemOrder(res.order); assertEq(vault.previewRedeem(1000e8), vault.redeem(1000e8, lper2, lper2)); console.log("principal after redeem:", vault.totalAssets()); console.log("total supply:", vault.totalSupply()); @@ -731,161 +749,22 @@ contract VaultTestV2 is Test { vm.stopPrank(); } - function testRedeemFromMarket() public { - vm.warp(currentTime + 2 days); - buyXt(48.219178e8, 1000e8); - - vm.warp(currentTime + 3 days); - address lper2 = vm.randomAddress(); - uint256 amount2 = 10000e8; - res.debt.mint(lper2, amount2); - vm.startPrank(lper2); - res.debt.approve(address(vault), amount2); - vault.deposit(amount2, lper2); - vm.stopPrank(); - - vm.startPrank(curator); - address order2 = address(vault.createOrder(market2, maxCapacity, 0, orderConfig.curveCuts)); - uint256[] memory indexes = new uint256[](2); - indexes[0] = 1; - indexes[1] = 0; - vault.updateSupplyQueue(indexes); - - res.debt.mint(curator, 10000e8); - res.debt.approve(address(vault), 10000e8); - vault.deposit(10000e8, curator); - - vm.stopPrank(); - - vm.warp(currentTime + 92 days); - - vm.startPrank(lper2); - - vault.redeem(1000e8, lper2, lper2); - vm.stopPrank(); - - uint256 performanceFee = vault.performanceFee(); - vm.prank(curator); - vault.withdrawPerformanceFee(curator, performanceFee); - - assertEq(vault.performanceFee(), 0); - assertEq(vault.annualizedInterest(), 0); - assertEq(vault.supplyQueueLength(), 1); - assertEq(vault.supplyQueue(0), order2); - assertEq(vault.withdrawQueueLength(), 1); - assertEq(vault.withdrawQueue(0), order2); - - vm.warp(currentTime + 182 days); - vm.prank(lper2); - vault.redeem(1000e8, lper2, lper2); - - vm.prank(curator); - vault.redeemOrder(ITermMaxOrder(order2)); - - assertEq(vault.performanceFee(), 0); - assertEq(vault.annualizedInterest(), 0); - assertEq(vault.supplyQueueLength(), 0); - assertEq(vault.withdrawQueueLength(), 0); - } - - function testRedeemFromMarket2() public { - vm.warp(currentTime + 2 days); - buyXt(48.219178e8, 1000e8); - - vm.warp(currentTime + 3 days); - address lper2 = vm.randomAddress(); - uint256 amount2 = 10000e8; - res.debt.mint(lper2, amount2); - vm.startPrank(lper2); - res.debt.approve(address(vault), amount2); - vault.deposit(amount2, lper2); - vm.stopPrank(); - - vm.startPrank(curator); - address order2 = address(vault.createOrder(market2, maxCapacity, 0, orderConfig.curveCuts)); - uint256[] memory indexes = new uint256[](2); - indexes[0] = 1; - indexes[1] = 0; - vault.updateSupplyQueue(indexes); - - res.debt.mint(curator, 10000e8); - res.debt.approve(address(vault), 10000e8); - vault.deposit(10000e8, curator); - - vm.stopPrank(); - - (, IERC20 xt,,,) = market2.tokens(); - - vm.warp(currentTime + 4 days); - { - address taker = vm.randomAddress(); - uint128 tokenAmtIn = 50e8; - res.debt.mint(taker, tokenAmtIn); - vm.startPrank(taker); - res.debt.approve(address(order2), tokenAmtIn); - ITermMaxOrder(order2).swapExactTokenToToken( - res.debt, xt, taker, tokenAmtIn, 1000e8, block.timestamp + 1 hours - ); - vm.stopPrank(); - } - - vm.warp(currentTime + 92 days); - - { - address taker = vm.randomAddress(); - uint128 tokenAmtIn = 50e8; - res.debt.mint(taker, tokenAmtIn); - vm.startPrank(taker); - res.debt.approve(address(order2), tokenAmtIn); - ITermMaxOrder(order2).swapExactTokenToToken( - res.debt, xt, taker, tokenAmtIn, 1000e8, block.timestamp + 1 hours - ); - vm.stopPrank(); - } - - vm.prank(lper2); - vault.redeem(100e8, lper2, lper2); - - uint256 performanceFee = vault.performanceFee(); - vm.prank(curator); - vault.withdrawPerformanceFee(curator, performanceFee); - - assertEq(vault.performanceFee(), 0); - assertGt(vault.annualizedInterest(), 0); - assertEq(vault.supplyQueueLength(), 1); - assertEq(vault.supplyQueue(0), order2); - assertEq(vault.withdrawQueueLength(), 1); - assertEq(vault.withdrawQueue(0), order2); - - vm.warp(currentTime + 182 days); - vm.prank(lper2); - vault.redeem(100e8, lper2, lper2); - - vm.prank(curator); - vault.redeemOrder(ITermMaxOrder(order2)); - - assertGt(vault.performanceFee(), 0); - assertEq(vault.annualizedInterest(), 0); - assertEq(vault.supplyQueueLength(), 0); - assertEq(vault.withdrawQueueLength(), 0); - } - function testBadDebt() public { vm.warp(currentTime + 2 days); buyXt(48.219178e8, 1000e8); vm.warp(currentTime + 3 days); address lper2 = vm.randomAddress(); + vm.label(lper2, "lper2"); uint256 amount2 = 10000e8; res.debt.mint(lper2, amount2); vm.startPrank(lper2); res.debt.approve(address(vault), amount2); vault.deposit(amount2, lper2); + assertEq(res.debt.balanceOf(address(vault)), amount2); vm.stopPrank(); - vm.startPrank(curator); - - vm.stopPrank(); + _depositToOrder(vault, res.order, amount2.toInt256()); address borrower = vm.randomAddress(); vm.startPrank(borrower); @@ -902,6 +781,7 @@ contract VaultTestV2 is Test { uint256 delivered = (propotion * 1e18) / Constants.DECIMAL_BASE_SQ; vm.startPrank(lper2); + vault.redeemOrder(res.order); vault.redeem(1000e8, lper2, lper2); vm.stopPrank(); @@ -945,6 +825,8 @@ contract VaultTestV2 is Test { vault.deposit(amount2, lper2); vm.stopPrank(); + _depositToOrder(vault, res.order, amount2.toInt256()); + address borrower = vm.randomAddress(); vm.startPrank(borrower); LoanUtils.fastMintGt(res, borrower, 1000e8, 1e18); @@ -952,6 +834,7 @@ contract VaultTestV2 is Test { vm.warp(currentTime + 92 days); vm.startPrank(lper2); + vault.redeemOrder(res.order); vault.redeem(1000e8, lper2, lper2); uint256 badDebt = vault.badDebtMapping(address(res.collateral)); @@ -966,6 +849,20 @@ contract VaultTestV2 is Test { vm.stopPrank(); } + function testSwapWhenVaultIsPaused() public { + vm.prank(deployer); + IPausable(address(vault)).pause(); + address taker = vm.randomAddress(); + uint128 tokenAmtIn = 1e8; + uint128 ftAmtOut = 1.2e8; + res.debt.mint(taker, tokenAmtIn); + vm.startPrank(taker); + res.debt.approve(address(res.order), tokenAmtIn); + vm.expectRevert(abi.encodeWithSignature("EnforcedPause()")); + res.order.swapExactTokenToToken(res.debt, res.ft, taker, tokenAmtIn, ftAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } + function buyFt(uint128 tokenAmtIn, uint128 ftAmtOut) internal { address taker = vm.randomAddress(); res.debt.mint(taker, tokenAmtIn); @@ -1046,4 +943,18 @@ contract VaultTestV2 is Test { function _daysToMaturity(uint256 _now) internal view returns (uint256 daysToMaturity) { daysToMaturity = (res.market.config().maturity - _now + Constants.SECONDS_IN_DAY - 1) / Constants.SECONDS_IN_DAY; } + + function _depositToOrder(ITermMaxVault vault, ITermMaxOrder order, int256 amount) internal { + vm.startPrank(vault.curator()); + CurveCuts[] memory curveCuts = new CurveCuts[](1); + curveCuts[0] = order.orderConfig().curveCuts; + int256[] memory amounts = new int256[](1); + amounts[0] = amount; + ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); + orders[0] = res.order; + uint256[] memory maxSupplies = new uint256[](1); + maxSupplies[0] = maxCapacity; + vault.updateOrders(orders, amounts, maxSupplies, curveCuts); + vm.stopPrank(); + } } diff --git a/test/v2/utils/DeployUtils.sol b/test/v2/utils/DeployUtils.sol index 64ff871..3d3e59a 100644 --- a/test/v2/utils/DeployUtils.sol +++ b/test/v2/utils/DeployUtils.sol @@ -18,7 +18,7 @@ import {IOracleV2, OracleAggregatorV2, AggregatorV3Interface} from "contracts/v2 import {IOracle} from "contracts/v1/oracle/IOracle.sol"; import {MockOrderV2} from "contracts/v2/test/MockOrderV2.sol"; import {VaultFactory, IVaultFactory} from "contracts/v1/factory/VaultFactory.sol"; -import {OrderManager} from "contracts/v1/vault/OrderManager.sol"; +import {OrderManagerV2} from "contracts/v2/vault/OrderManagerV2.sol"; import {TermMaxVaultV2, ITermMaxVault} from "contracts/v2/vault/TermMaxVaultV2.sol"; import {AccessManager} from "contracts/v2/access/AccessManagerV2.sol"; import { @@ -328,7 +328,7 @@ library DeployUtils { } function deployVault(VaultInitialParams memory initialParams) public returns (ITermMaxVault vault) { - OrderManager orderManager = new OrderManager(); + OrderManagerV2 orderManager = new OrderManagerV2(); TermMaxVaultV2 implementation = new TermMaxVaultV2(address(orderManager)); VaultFactory vaultFactory = new VaultFactory(address(implementation)); From 1e14462a21b80a238ccd9fb681276dee92ee0b11 Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 10 Jun 2025 16:21:06 +0800 Subject: [PATCH 066/194] check minApy --- contracts/v2/errors/VaultErrorsV2.sol | 2 ++ contracts/v2/vault/OrderManagerV2.sol | 14 ++++++++++++-- contracts/v2/vault/TermMaxVaultV2.sol | 8 ++++---- contracts/v2/vault/VaultStorageV2.sol | 18 ++++++++++++++---- 4 files changed, 32 insertions(+), 10 deletions(-) diff --git a/contracts/v2/errors/VaultErrorsV2.sol b/contracts/v2/errors/VaultErrorsV2.sol index 736707f..76580f7 100644 --- a/contracts/v2/errors/VaultErrorsV2.sol +++ b/contracts/v2/errors/VaultErrorsV2.sol @@ -12,4 +12,6 @@ interface VaultErrorsV2 { error WithdrawalQueueNoLongerSupported(); /// @notice Error thrown when an invalid or unsupported functions is called error UseApyInsteadOfApr(); + /// @notice Error thrown when the APY is too low + error ApyTooLow(uint256 apy, uint256 minApy); } diff --git a/contracts/v2/vault/OrderManagerV2.sol b/contracts/v2/vault/OrderManagerV2.sol index 72802d1..8460cca 100644 --- a/contracts/v2/vault/OrderManagerV2.sol +++ b/contracts/v2/vault/OrderManagerV2.sol @@ -16,6 +16,7 @@ import {LinkedList} from "../../v1/lib/LinkedList.sol"; import {IOrderManager} from "../../v1/vault/IOrderManager.sol"; import {ISwapCallback} from "../../v1/ISwapCallback.sol"; import {OrderInfo, VaultStorageV2} from "./VaultStorageV2.sol"; +import {VaultErrorsV2} from "../errors/VaultErrorsV2.sol"; /** * @title Order Manager V2 * @author Term Structure Labs @@ -150,7 +151,6 @@ contract OrderManagerV2 is VaultStorageV2, VaultErrors, VaultEvents, IOrderManag */ function withdrawAssets(IERC20 asset, address recipient, uint256 amount) external override onlyProxy { _accruedInterest(); - uint256 amountLeft = amount; uint256 assetBalance = asset.balanceOf(address(this)); if (assetBalance >= amount) { asset.safeTransfer(recipient, amount); @@ -277,6 +277,15 @@ contract OrderManagerV2 is VaultStorageV2, VaultErrors, VaultEvents, IOrderManag } } + function _checkApy() internal view { + uint256 currentApy = _accretingPrincipal == 0 + ? 0 + : (_annualizedInterest * (Constants.DECIMAL_BASE - _performanceFeeRate)) / (_accretingPrincipal); + if (currentApy < _minApy) { + revert VaultErrorsV2.ApyTooLow(currentApy, _minApy); + } + } + /// @notice Callback function for the swap /// @param deltaFt The change in the ft balance of the order function afterSwap(uint256 ftReserve, uint256 xtReserve, int256 deltaFt) external onlyProxy { @@ -313,9 +322,10 @@ contract OrderManagerV2 is VaultStorageV2, VaultErrors, VaultEvents, IOrderManag } _maturityToInterest[maturity] -= deltaAnnualizedInterest; _annualizedInterest -= deltaAnnualizedInterest; + _checkApy(); } /// @dev Ensure that the total assets after the transaction are - ///greater than or equal to the principal and the allocated interest + /// greater than or equal to the principal and the allocated interest _checkLockedFt(); } } diff --git a/contracts/v2/vault/TermMaxVaultV2.sol b/contracts/v2/vault/TermMaxVaultV2.sol index f7d7527..58a347c 100644 --- a/contracts/v2/vault/TermMaxVaultV2.sol +++ b/contracts/v2/vault/TermMaxVaultV2.sol @@ -222,14 +222,14 @@ contract TermMaxVaultV2 is /** * @inheritdoc ITermMaxVault */ - function supplyQueue(uint256 index) external view virtual returns (address) { + function supplyQueue(uint256) external view virtual returns (address) { revert VaultErrorsV2.SupplyQueueNoLongerSupported(); } /** * @inheritdoc ITermMaxVault */ - function withdrawQueue(uint256 index) external view virtual returns (address) { + function withdrawQueue(uint256) external view virtual returns (address) { revert VaultErrorsV2.WithdrawalQueueNoLongerSupported(); } @@ -561,14 +561,14 @@ contract TermMaxVaultV2 is /** * @inheritdoc ITermMaxVault */ - function updateSupplyQueue(uint256[] memory indexes) external virtual onlyAllocatorRole { + function updateSupplyQueue(uint256[] memory) external virtual onlyAllocatorRole { revert VaultErrorsV2.SupplyQueueNoLongerSupported(); } /** * @inheritdoc ITermMaxVault */ - function updateWithdrawQueue(uint256[] memory indexes) external virtual onlyAllocatorRole { + function updateWithdrawQueue(uint256[] memory) external virtual onlyAllocatorRole { revert VaultErrorsV2.WithdrawalQueueNoLongerSupported(); } diff --git a/contracts/v2/vault/VaultStorageV2.sol b/contracts/v2/vault/VaultStorageV2.sol index c66ccbb..60e9628 100644 --- a/contracts/v2/vault/VaultStorageV2.sol +++ b/contracts/v2/vault/VaultStorageV2.sol @@ -31,18 +31,28 @@ contract VaultStorageV2 { /// @notice Annualize the interest income uint256 internal _annualizedInterest; - uint64 internal _performanceFeeRate; - /// @dev A mapping from collateral address to bad debt mapping(address => uint256) internal _badDebtMapping; mapping(address => OrderInfo) internal _orderMapping; - /// @dev The last time the interest was accurately calculated - uint64 internal _lastUpdateTime; /// @dev A one-way linked list presented using a mapping structure, recorded in order according to matiruty /// @dev The key is the maturity, and the value is the next maturity /// Etc. day 0 => day 1 => day 2 => day 3 => ... mapping(uint64 => uint64) internal _maturityMapping; /// @dev A mapping from maturity to its annualized interest mapping(uint64 => uint256) internal _maturityToInterest; + + PendingUint192 internal _pendingApy; + PendingUint192 internal _pendingIdleFundRate; + + uint64 internal _performanceFeeRate; + + /// @dev The last time the interest was accurately calculated + uint64 internal _lastUpdateTime; + + /// @dev The minimum APY for the vault to be active + uint64 internal _minApy; + + /// @dev The idle fund rate is the percentage of the assets that is not actively used in markets + uint64 internal _idleFundRate; } From d723daf94e31c1cd14f660dad116fe69ab40d34b Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 10 Jun 2025 16:58:00 +0800 Subject: [PATCH 067/194] factory events --- contracts/v2/events/FactoryEventsV2.sol | 16 +++++- contracts/v2/factory/TermMaxFactoryV2.sol | 10 ++-- .../v2/factory/TermMaxPriceFeedFactoryV2.sol | 13 ++--- .../v2/factory/TermMaxVaultFactoryV2.sol | 54 +++++++++++++++++++ contracts/v2/router/TermMaxRouterV2.sol | 10 ++-- contracts/v2/vault/ITermMaxVaultV2.sol | 1 + contracts/v2/vault/OrderManagerV2.sol | 2 +- 7 files changed, 85 insertions(+), 21 deletions(-) create mode 100644 contracts/v2/factory/TermMaxVaultFactoryV2.sol diff --git a/contracts/v2/events/FactoryEventsV2.sol b/contracts/v2/events/FactoryEventsV2.sol index 07c5eb4..c9f21a1 100644 --- a/contracts/v2/events/FactoryEventsV2.sol +++ b/contracts/v2/events/FactoryEventsV2.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.0; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {MarketInitialParams} from "../../v1/storage/TermMaxStorage.sol"; +import {MarketInitialParams, VaultInitialParams} from "../../v1/storage/TermMaxStorage.sol"; /** * @title Factory Events Interface V2 @@ -19,4 +19,18 @@ interface FactoryEventsV2 { event CreateMarket( address indexed market, address indexed collateral, IERC20 indexed debtToken, MarketInitialParams params ); + + /** + * @notice Emitted when a new vault is created + * @param vault The address of the newly created vault + * @param creator The address of the vault creator + * @param initialParams The initial parameters used to configure the vault + */ + event CreateVault(address indexed vault, address indexed creator, VaultInitialParams initialParams); + + /** + * @notice Emitted when a new price feed is created + * @param priceFeed The address of the newly created price feed contract + */ + event PriceFeedCreated(address indexed priceFeed); } diff --git a/contracts/v2/factory/TermMaxFactoryV2.sol b/contracts/v2/factory/TermMaxFactoryV2.sol index e867f5f..db224bf 100644 --- a/contracts/v2/factory/TermMaxFactoryV2.sol +++ b/contracts/v2/factory/TermMaxFactoryV2.sol @@ -18,7 +18,7 @@ import {FactoryEventsV2} from "../events/FactoryEventsV2.sol"; * @dev Manages market deployment, gearing token implementations, and market configuration validation * Inherits from V1 factory interface while adding V2-specific features for improved market creation */ -contract TermMaxFactoryV2 is Ownable2Step, FactoryErrors, FactoryEvents, ITermMaxFactory, FactoryEventsV2 { +contract TermMaxFactoryV2 is Ownable2Step, ITermMaxFactory, FactoryEventsV2 { /// @notice Constant key for the default ERC20 gearing token implementation bytes32 constant GT_ERC20 = keccak256("GearingTokenWithERC20"); @@ -41,7 +41,7 @@ contract TermMaxFactoryV2 is Ownable2Step, FactoryErrors, FactoryEvents, ITermMa */ constructor(address admin, address TERMMAX_MARKET_IMPLEMENTATION_) Ownable(admin) { if (TERMMAX_MARKET_IMPLEMENTATION_ == address(0)) { - revert InvalidImplementation(); + revert FactoryErrors.InvalidImplementation(); } TERMMAX_MARKET_IMPLEMENTATION = TERMMAX_MARKET_IMPLEMENTATION_; @@ -60,7 +60,7 @@ contract TermMaxFactoryV2 is Ownable2Step, FactoryErrors, FactoryEvents, ITermMa function setGtImplement(string memory gtImplementName, address gtImplement) external onlyOwner { bytes32 key = keccak256(abi.encodePacked(gtImplementName)); gtImplements[key] = gtImplement; - emit SetGtImplement(key, gtImplement); + emit FactoryEvents.SetGtImplement(key, gtImplement); } /** @@ -105,7 +105,7 @@ contract TermMaxFactoryV2 is Ownable2Step, FactoryErrors, FactoryEvents, ITermMa // Retrieve the gearing token implementation for the requested key params.gtImplementation = gtImplements[gtKey]; if (params.gtImplementation == address(0)) { - revert CantNotFindGtImplementation(); + revert FactoryErrors.CantNotFindGtImplementation(); } // Deploy market using CREATE2 for deterministic addressing @@ -118,6 +118,6 @@ contract TermMaxFactoryV2 is Ownable2Step, FactoryErrors, FactoryEvents, ITermMa ITermMaxMarket(market).initialize(params); // Emit event for market creation tracking - emit CreateMarket(market, params.collateral, params.debtToken, params); + emit FactoryEventsV2.CreateMarket(market, params.collateral, params.debtToken, params); } } diff --git a/contracts/v2/factory/TermMaxPriceFeedFactoryV2.sol b/contracts/v2/factory/TermMaxPriceFeedFactoryV2.sol index def4063..03768bd 100644 --- a/contracts/v2/factory/TermMaxPriceFeedFactoryV2.sol +++ b/contracts/v2/factory/TermMaxPriceFeedFactoryV2.sol @@ -4,6 +4,7 @@ pragma solidity ^0.8.27; import {TermMaxERC4626PriceFeed} from "../oracle/priceFeeds/TermMaxERC4626PriceFeed.sol"; import {TermMaxPriceFeedConverter} from "../oracle/priceFeeds/TermMaxPriceFeedConverter.sol"; import {TermMaxPTPriceFeed} from "../oracle/priceFeeds/TermMaxPTPriceFeed.sol"; +import {FactoryEventsV2} from "../events/FactoryEventsV2.sol"; /** * @title TermMax Price Feed Factory V2 @@ -13,12 +14,6 @@ import {TermMaxPTPriceFeed} from "../oracle/priceFeeds/TermMaxPTPriceFeed.sol"; * All price feeds implement the ITermMaxPriceFeed interface for consistency */ contract TermMaxPriceFeedFactoryV2 { - /** - * @notice Emitted when a new price feed is created - * @param priceFeed The address of the newly created price feed contract - */ - event PriceFeedCreated(address indexed priceFeed); - /** * @notice Creates a price feed for ERC4626 vaults * @dev Deploys a TermMaxERC4626PriceFeed that calculates vault token prices based on the underlying asset price and vault exchange rate @@ -29,7 +24,7 @@ contract TermMaxPriceFeedFactoryV2 { */ function createPriceFeedWithERC4626(address _assetPriceFeed, address _vault) external returns (address) { address priceFeed = address(new TermMaxERC4626PriceFeed(_assetPriceFeed, _vault)); - emit PriceFeedCreated(priceFeed); + emit FactoryEventsV2.PriceFeedCreated(priceFeed); return priceFeed; } @@ -50,7 +45,7 @@ contract TermMaxPriceFeedFactoryV2 { ) external returns (address) { address priceFeed = address(new TermMaxPriceFeedConverter(_aTokenToBTokenPriceFeed, _bTokenToCTokenPriceFeed, _asset)); - emit PriceFeedCreated(priceFeed); + emit FactoryEventsV2.PriceFeedCreated(priceFeed); return priceFeed; } @@ -71,7 +66,7 @@ contract TermMaxPriceFeedFactoryV2 { returns (address) { address priceFeed = address(new TermMaxPTPriceFeed(_pendlePYLpOracle, _market, _duration, _priceFeed)); - emit PriceFeedCreated(priceFeed); + emit FactoryEventsV2.PriceFeedCreated(priceFeed); return priceFeed; } } diff --git a/contracts/v2/factory/TermMaxVaultFactoryV2.sol b/contracts/v2/factory/TermMaxVaultFactoryV2.sol new file mode 100644 index 0000000..069edb4 --- /dev/null +++ b/contracts/v2/factory/TermMaxVaultFactoryV2.sol @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol"; +import {VaultInitialParams} from "../../v1/storage/TermMaxStorage.sol"; +import {FactoryErrors} from "../../v1/errors/FactoryErrors.sol"; +import {IVaultFactory} from "../../v1/factory/IVaultFactory.sol"; +import {ITermMaxVault} from "../../v1/vault/ITermMaxVault.sol"; +import {FactoryEventsV2} from "../events/FactoryEventsV2.sol"; + +/** + * @title The TermMax vault factory v2 + * @author Term Structure Labs + */ +contract TermMaxVaultFactoryV2 is IVaultFactory { + /** + * @notice The implementation of TermMax Vault contract + */ + address public immutable TERMMAX_VAULT_IMPLEMENTATION; + + constructor(address TERMMAX_VAULT_IMPLEMENTATION_) { + if (TERMMAX_VAULT_IMPLEMENTATION_ == address(0)) { + revert FactoryErrors.InvalidImplementation(); + } + TERMMAX_VAULT_IMPLEMENTATION = TERMMAX_VAULT_IMPLEMENTATION_; + } + + /** + * @inheritdoc IVaultFactory + */ + function predictVaultAddress( + address deployer, + address asset, + string memory name, + string memory symbol, + uint256 salt + ) external view returns (address vault) { + return Clones.predictDeterministicAddress( + TERMMAX_VAULT_IMPLEMENTATION, keccak256(abi.encode(deployer, asset, name, symbol, salt)) + ); + } + + /** + * @inheritdoc IVaultFactory + */ + function createVault(VaultInitialParams memory initialParams, uint256 salt) public returns (address vault) { + vault = Clones.cloneDeterministic( + TERMMAX_VAULT_IMPLEMENTATION, + keccak256(abi.encode(msg.sender, initialParams.asset, initialParams.name, initialParams.symbol, salt)) + ); + ITermMaxVault(vault).initialize(initialParams); + emit FactoryEventsV2.CreateVault(vault, msg.sender, initialParams); + } +} diff --git a/contracts/v2/router/TermMaxRouterV2.sol b/contracts/v2/router/TermMaxRouterV2.sol index 44ee1bf..b95d381 100644 --- a/contracts/v2/router/TermMaxRouterV2.sol +++ b/contracts/v2/router/TermMaxRouterV2.sol @@ -238,7 +238,7 @@ contract TermMaxRouterV2 is uint128 maxLtv, SwapUnit[] memory units ) external whenNotPaused returns (uint256 gtId) { - (, IERC20 xt, IGearingToken gt,, IERC20 debtToken) = market.tokens(); + (,, IGearingToken gt,, IERC20 debtToken) = market.tokens(); debtToken.safeTransferFrom(msg.sender, address(this), tokenInAmt); bytes memory callbackData = abi.encode(address(gt), tokenInAmt, units, FlashLoanType.DEBT); @@ -263,7 +263,7 @@ contract TermMaxRouterV2 is uint128 maxLtv, SwapUnit[] memory units ) external whenNotPaused returns (uint256 gtId) { - (, IERC20 xt, IGearingToken gt, address collAddr,) = market.tokens(); + (,, IGearingToken gt, address collAddr,) = market.tokens(); IERC20 collateral = IERC20(collAddr); collateral.safeTransferFrom(msg.sender, address(this), collateralInAmt); @@ -314,7 +314,7 @@ contract TermMaxRouterV2 is whenNotPaused returns (uint256) { - (IERC20 ft, IERC20 xt, IGearingToken gt, address collateralAddr,) = market.tokens(); + (, IERC20 xt, IGearingToken gt, address collateralAddr,) = market.tokens(); IERC20(collateralAddr).safeTransferFrom(msg.sender, address(this), collInAmt); IERC20(collateralAddr).safeIncreaseAllowance(address(gt), collInAmt); @@ -337,7 +337,7 @@ contract TermMaxRouterV2 is external whenNotPaused { - (IERC20 ft, IERC20 xt, IGearingToken gt,,) = market.tokens(); + (, IERC20 xt, IGearingToken gt,,) = market.tokens(); if (gt.ownerOf(gtId) != msg.sender) { revert GtNotOwnedBySender(); @@ -605,7 +605,7 @@ contract TermMaxRouterV2 is repayToken.safeIncreaseAllowance(msg.sender, debtAmt); } - function _flashRepay(IERC20 repayToken, bytes memory collateralData, bytes memory callbackData) internal { + function _flashRepay(IERC20, bytes memory collateralData, bytes memory callbackData) internal { (SwapUnit[] memory units, TermMaxSwapData memory swapData) = abi.decode(callbackData, (SwapUnit[], TermMaxSwapData)); uint256 amount = _doSwap(_decodeAmount(collateralData), units); diff --git a/contracts/v2/vault/ITermMaxVaultV2.sol b/contracts/v2/vault/ITermMaxVaultV2.sol index a486fea..05b0258 100644 --- a/contracts/v2/vault/ITermMaxVaultV2.sol +++ b/contracts/v2/vault/ITermMaxVaultV2.sol @@ -2,5 +2,6 @@ pragma solidity ^0.8.27; interface ITermMaxVaultV2 { + /// @notice Returns the apr based on accreting principal function apy() external view returns (uint256); } diff --git a/contracts/v2/vault/OrderManagerV2.sol b/contracts/v2/vault/OrderManagerV2.sol index 8460cca..21fea66 100644 --- a/contracts/v2/vault/OrderManagerV2.sol +++ b/contracts/v2/vault/OrderManagerV2.sol @@ -138,7 +138,7 @@ contract OrderManagerV2 is VaultStorageV2, VaultErrors, VaultEvents, IOrderManag /** * @inheritdoc IOrderManager */ - function depositAssets(IERC20 asset, uint256 amount) external override onlyProxy { + function depositAssets(IERC20, uint256 amount) external override onlyProxy { _accruedInterest(); // deposit to lpers uint256 amplifiedAmt = amount * Constants.DECIMAL_BASE_SQ; From dc3360e4a69dee2bd49366279d8772fbf7ad2d91 Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 10 Jun 2025 17:21:39 +0800 Subject: [PATCH 068/194] check idle funds --- contracts/v2/errors/VaultErrorsV2.sol | 2 ++ contracts/v2/vault/OrderManagerV2.sol | 27 ++++++++++++++++++++++----- contracts/v2/vault/VaultStorageV2.sol | 4 ++-- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/contracts/v2/errors/VaultErrorsV2.sol b/contracts/v2/errors/VaultErrorsV2.sol index 76580f7..788f548 100644 --- a/contracts/v2/errors/VaultErrorsV2.sol +++ b/contracts/v2/errors/VaultErrorsV2.sol @@ -14,4 +14,6 @@ interface VaultErrorsV2 { error UseApyInsteadOfApr(); /// @notice Error thrown when the APY is too low error ApyTooLow(uint256 apy, uint256 minApy); + /// @notice Error thrown when the idle fund rate is too low + error IdleFundRateTooLow(uint256 idleFundRate, uint256 minIdleFundRate); } diff --git a/contracts/v2/vault/OrderManagerV2.sol b/contracts/v2/vault/OrderManagerV2.sol index 21fea66..ce39c2a 100644 --- a/contracts/v2/vault/OrderManagerV2.sol +++ b/contracts/v2/vault/OrderManagerV2.sol @@ -59,6 +59,7 @@ contract OrderManagerV2 is VaultStorageV2, VaultErrors, VaultEvents, IOrderManag for (uint256 i = 0; i < orders.length; ++i) { _updateOrder(asset, ITermMaxOrder(orders[i]), changes[i], maxSupplies[i], curveCuts[i]); } + _checkIdleFundRate(asset); } /** @@ -86,6 +87,7 @@ contract OrderManagerV2 is VaultStorageV2, VaultErrors, VaultEvents, IOrderManag uint256 initialReserve, CurveCuts memory curveCuts ) external onlyProxy returns (ITermMaxOrder order) { + _accruedInterest(); (IERC20 ft, IERC20 xt,,, IERC20 debtToken) = market.tokens(); if (asset != debtToken) revert InconsistentAsset(); @@ -93,6 +95,7 @@ contract OrderManagerV2 is VaultStorageV2, VaultErrors, VaultEvents, IOrderManag if (initialReserve > 0) { asset.safeIncreaseAllowance(address(market), initialReserve); market.mint(address(order), initialReserve); + _checkIdleFundRate(asset); } uint64 orderMaturity = market.config().maturity; @@ -135,6 +138,17 @@ contract OrderManagerV2 is VaultStorageV2, VaultErrors, VaultEvents, IOrderManag emit UpdateOrder(msg.sender, address(order), changes, maxSupply, curveCuts); } + function _checkIdleFundRate(IERC20 asset) internal view { + uint256 __minIdleFundRate = _minIdleFundRate; + if (__minIdleFundRate > 0) { + uint256 idleFundBalance = asset.balanceOf(address(this)); + uint256 currentIdleFundRate = idleFundBalance * Constants.DECIMAL_BASE / _accretingPrincipal; + if (currentIdleFundRate < __minIdleFundRate) { + revert VaultErrorsV2.IdleFundRateTooLow(currentIdleFundRate, __minIdleFundRate); + } + } + } + /** * @inheritdoc IOrderManager */ @@ -278,11 +292,14 @@ contract OrderManagerV2 is VaultStorageV2, VaultErrors, VaultEvents, IOrderManag } function _checkApy() internal view { - uint256 currentApy = _accretingPrincipal == 0 - ? 0 - : (_annualizedInterest * (Constants.DECIMAL_BASE - _performanceFeeRate)) / (_accretingPrincipal); - if (currentApy < _minApy) { - revert VaultErrorsV2.ApyTooLow(currentApy, _minApy); + uint256 __minAPy = _minApy; + if (__minAPy > 0) { + uint256 currentApy = _accretingPrincipal == 0 + ? 0 + : (_annualizedInterest * (Constants.DECIMAL_BASE - _performanceFeeRate)) / (_accretingPrincipal); + if (currentApy < __minAPy) { + revert VaultErrorsV2.ApyTooLow(currentApy, __minAPy); + } } } diff --git a/contracts/v2/vault/VaultStorageV2.sol b/contracts/v2/vault/VaultStorageV2.sol index 60e9628..2ceaaf1 100644 --- a/contracts/v2/vault/VaultStorageV2.sol +++ b/contracts/v2/vault/VaultStorageV2.sol @@ -53,6 +53,6 @@ contract VaultStorageV2 { /// @dev The minimum APY for the vault to be active uint64 internal _minApy; - /// @dev The idle fund rate is the percentage of the assets that is not actively used in markets - uint64 internal _idleFundRate; + /// @dev The minimum idle fund rate for the vault to be active + uint64 internal _minIdleFundRate; } From 56a808aa7d89237401df09b302f2707fa3321a10 Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 10 Jun 2025 18:06:48 +0800 Subject: [PATCH 069/194] functions for update min apy and min idleFundRate --- contracts/v2/events/VaultEventsV2.sol | 48 ++++ contracts/v2/vault/ITermMaxVaultV2.sol | 18 ++ contracts/v2/vault/TermMaxVaultV2.sol | 117 ++++++++- contracts/v2/vault/VaultStorageV2.sol | 4 +- test/v2/VaultV2.t.sol | 334 +++++++++++++++++++++++++ 5 files changed, 513 insertions(+), 8 deletions(-) create mode 100644 contracts/v2/events/VaultEventsV2.sol diff --git a/contracts/v2/events/VaultEventsV2.sol b/contracts/v2/events/VaultEventsV2.sol new file mode 100644 index 0000000..c450de1 --- /dev/null +++ b/contracts/v2/events/VaultEventsV2.sol @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Vault Events V2 Interface + * @notice Additional events for TermMax vault V2 operations + */ +interface VaultEventsV2 { + /** + * @notice Emitted when a new minimum APY is proposed + * @param newMinApy The proposed minimum APY + * @param validAt The timestamp when the minimum APY change will take effect + */ + event SubmitMinApy(uint64 newMinApy, uint64 validAt); + + /** + * @notice Emitted when the minimum APY is updated + * @param caller The address that updated the minimum APY + * @param newMinApy The new minimum APY value + */ + event SetMinApy(address indexed caller, uint64 newMinApy); + + /** + * @notice Emitted when a new minimum idle fund rate is proposed + * @param newMinIdleFundRate The proposed minimum idle fund rate + * @param validAt The timestamp when the minimum idle fund rate change will take effect + */ + event SubmitMinIdleFundRate(uint64 newMinIdleFundRate, uint64 validAt); + + /** + * @notice Emitted when the minimum idle fund rate is updated + * @param caller The address that updated the minimum idle fund rate + * @param newMinIdleFundRate The new minimum idle fund rate value + */ + event SetMinIdleFundRate(address indexed caller, uint64 newMinIdleFundRate); + + /** + * @notice Emitted when a pending minimum APY change is revoked + * @param caller The address that initiated the revocation + */ + event RevokePendingMinApy(address indexed caller); + + /** + * @notice Emitted when a pending minimum idle fund rate change is revoked + * @param caller The address that initiated the revocation + */ + event RevokePendingMinIdleFundRate(address indexed caller); +} diff --git a/contracts/v2/vault/ITermMaxVaultV2.sol b/contracts/v2/vault/ITermMaxVaultV2.sol index 05b0258..7a9f6a8 100644 --- a/contracts/v2/vault/ITermMaxVaultV2.sol +++ b/contracts/v2/vault/ITermMaxVaultV2.sol @@ -1,7 +1,25 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.27; +import {PendingAddress, PendingUint192} from "../../v1/lib/PendingLib.sol"; + interface ITermMaxVaultV2 { /// @notice Returns the apr based on accreting principal function apy() external view returns (uint256); + + function minApy() external view returns (uint64); + + function minIdleFundRate() external view returns (uint64); + + function pendingMinApy() external view returns (PendingUint192 memory); + function pendingMinIdleFundRate() external view returns (PendingUint192 memory); + + function submitPendingMinApy(uint64 newMinApy) external; + function submitPendingMinIdleFundRate(uint64 newMinIdleFundRate) external; + + function acceptPendingMinApy() external; + function acceptPendingMinIdleFundRate() external; + + function revokePendingMinApy() external; + function revokePendingMinIdleFundRate() external; } diff --git a/contracts/v2/vault/TermMaxVaultV2.sol b/contracts/v2/vault/TermMaxVaultV2.sol index 58a347c..c9d26f7 100644 --- a/contracts/v2/vault/TermMaxVaultV2.sol +++ b/contracts/v2/vault/TermMaxVaultV2.sol @@ -26,6 +26,7 @@ import {TransferUtils} from "../../v1/lib/TransferUtils.sol"; import {ISwapCallback} from "../../v1/ISwapCallback.sol"; import {VaultErrors} from "../../v1/errors/VaultErrors.sol"; import {VaultEvents} from "../../v1/events/VaultEvents.sol"; +import {VaultEventsV2} from "../events/VaultEventsV2.sol"; import {IOrderManager} from "../../v1/vault/IOrderManager.sol"; import {VaultStorageV2, OrderInfo} from "../../v2/vault/VaultStorageV2.sol"; import {Constants} from "../../v1/lib/Constants.sol"; @@ -263,17 +264,89 @@ contract TermMaxVaultV2 is } /** - * @inheritdoc ITermMaxVault + * @inheritdoc ITermMaxVaultV2 */ - function supplyQueueLength() external view virtual returns (uint256) { - revert VaultErrorsV2.SupplyQueueNoLongerSupported(); + function minApy() external view virtual override returns (uint64) { + return _minApy; } /** - * @inheritdoc ITermMaxVault + * @inheritdoc ITermMaxVaultV2 */ - function withdrawQueueLength() external view virtual returns (uint256) { - revert VaultErrorsV2.WithdrawalQueueNoLongerSupported(); + function minIdleFundRate() external view virtual override returns (uint64) { + return _minIdleFundRate; + } + + /** + * @inheritdoc ITermMaxVaultV2 + */ + function pendingMinApy() external view virtual override returns (PendingUint192 memory) { + return _pendingMinApy; + } + + /** + * @inheritdoc ITermMaxVaultV2 + */ + function pendingMinIdleFundRate() external view virtual override returns (PendingUint192 memory) { + return _pendingMinIdleFundRate; + } + + /** + * @inheritdoc ITermMaxVaultV2 + */ + function submitPendingMinApy(uint64 newMinApy) external virtual override onlyCuratorRole { + if (newMinApy == _minApy) revert AlreadySet(); + if (_pendingMinApy.validAt != 0) revert AlreadyPending(); + + if (newMinApy > _minApy) { + _setMinApy(newMinApy); + } else { + _pendingMinApy.update(uint184(newMinApy), _timelock); + emit VaultEventsV2.SubmitMinApy(newMinApy, _pendingMinApy.validAt); + } + } + + /** + * @inheritdoc ITermMaxVaultV2 + */ + function submitPendingMinIdleFundRate(uint64 newMinIdleFundRate) external virtual override onlyCuratorRole { + if (newMinIdleFundRate == _minIdleFundRate) revert AlreadySet(); + if (_pendingMinIdleFundRate.validAt != 0) revert AlreadyPending(); + + if (newMinIdleFundRate > _minIdleFundRate) { + _setMinIdleFundRate(newMinIdleFundRate); + } else { + _pendingMinIdleFundRate.update(uint184(newMinIdleFundRate), _timelock); + emit VaultEventsV2.SubmitMinIdleFundRate(newMinIdleFundRate, _pendingMinIdleFundRate.validAt); + } + } + + /** + * @inheritdoc ITermMaxVaultV2 + */ + function acceptPendingMinApy() external virtual override afterTimelock(_pendingMinApy.validAt) { + _setMinApy(uint64(_pendingMinApy.value)); + delete _pendingMinApy; + } + + /** + * @inheritdoc ITermMaxVaultV2 + */ + function acceptPendingMinIdleFundRate() external virtual override afterTimelock(_pendingMinIdleFundRate.validAt) { + _setMinIdleFundRate(uint64(_pendingMinIdleFundRate.value)); + delete _pendingMinIdleFundRate; + } + + /// @dev Sets `_minApy` to `newMinApy`. + function _setMinApy(uint64 newMinApy) internal { + _minApy = newMinApy; + emit VaultEventsV2.SetMinApy(_msgSender(), newMinApy); + } + + /// @dev Sets `_minIdleFundRate` to `newMinIdleFundRate`. + function _setMinIdleFundRate(uint64 newMinIdleFundRate) internal { + _minIdleFundRate = newMinIdleFundRate; + emit VaultEventsV2.SetMinIdleFundRate(_msgSender(), newMinIdleFundRate); } // Ordermanager functions @@ -612,6 +685,24 @@ contract TermMaxVaultV2 is emit RevokePendingPerformanceFeeRate(_msgSender()); } + /** + * @notice Revoke pending minimum APY change + */ + function revokePendingMinApy() external virtual onlyGuardianRole { + delete _pendingMinApy; + + emit VaultEventsV2.RevokePendingMinApy(_msgSender()); + } + + /** + * @notice Revoke pending minimum idle fund rate change + */ + function revokePendingMinIdleFundRate() external virtual onlyGuardianRole { + delete _pendingMinIdleFundRate; + + emit VaultEventsV2.RevokePendingMinIdleFundRate(_msgSender()); + } + /** * @inheritdoc ITermMaxVault */ @@ -713,4 +804,18 @@ contract TermMaxVaultV2 is { _delegateCall(abi.encodeCall(IOrderManager.afterSwap, (ftReserve, xtReserve, deltaFt))); } + + /** + * @inheritdoc ITermMaxVault + */ + function supplyQueueLength() external view virtual returns (uint256) { + revert VaultErrorsV2.SupplyQueueNoLongerSupported(); + } + + /** + * @inheritdoc ITermMaxVault + */ + function withdrawQueueLength() external view virtual returns (uint256) { + revert VaultErrorsV2.WithdrawalQueueNoLongerSupported(); + } } diff --git a/contracts/v2/vault/VaultStorageV2.sol b/contracts/v2/vault/VaultStorageV2.sol index 2ceaaf1..7f344f2 100644 --- a/contracts/v2/vault/VaultStorageV2.sol +++ b/contracts/v2/vault/VaultStorageV2.sol @@ -42,8 +42,8 @@ contract VaultStorageV2 { /// @dev A mapping from maturity to its annualized interest mapping(uint64 => uint256) internal _maturityToInterest; - PendingUint192 internal _pendingApy; - PendingUint192 internal _pendingIdleFundRate; + PendingUint192 internal _pendingMinApy; + PendingUint192 internal _pendingMinIdleFundRate; uint64 internal _performanceFeeRate; diff --git a/test/v2/VaultV2.t.sol b/test/v2/VaultV2.t.sol index 52a7f09..eceee6c 100644 --- a/test/v2/VaultV2.t.sol +++ b/test/v2/VaultV2.t.sol @@ -46,6 +46,7 @@ import { import {PendingUint192, PendingLib} from "contracts/v1/lib/PendingLib.sol"; import {VaultErrorsV2} from "contracts/v2/errors/VaultErrorsV2.sol"; import {IPausable} from "contracts/v1/access/AccessManager.sol"; +import {VaultEventsV2} from "contracts/v2/events/VaultEventsV2.sol"; contract VaultTestV2 is Test { using JSONLoader for *; @@ -957,4 +958,337 @@ contract VaultTestV2 is Test { vault.updateOrders(orders, amounts, maxSupplies, curveCuts); vm.stopPrank(); } + + // ========== Tests for ITermMaxVaultV2 new functions ========== + + function testMinApyManagement() public { + ITermMaxVaultV2 vaultV2 = ITermMaxVaultV2(address(vault)); + + // Test initial state + assertEq(vaultV2.minApy(), 0); + assertEq(vaultV2.pendingMinApy().value, 0); + assertEq(vaultV2.pendingMinApy().validAt, 0); + + // Test submitPendingMinApy - increase (immediate) + uint64 newMinApy = 0.05e8; // 5% + vm.prank(curator); + vaultV2.submitPendingMinApy(newMinApy); + + // Should be set immediately for increases + assertEq(vaultV2.minApy(), newMinApy); + assertEq(vaultV2.pendingMinApy().value, 0); + + // Test submitPendingMinApy - decrease (timelock required) + uint64 lowerMinApy = 0.03e8; // 3% + vm.prank(curator); + vaultV2.submitPendingMinApy(lowerMinApy); + + // Should not be set immediately for decreases + assertEq(vaultV2.minApy(), newMinApy); + assertEq(vaultV2.pendingMinApy().value, lowerMinApy); + assertEq(vaultV2.pendingMinApy().validAt, block.timestamp + timelock); + + // Test acceptPendingMinApy before timelock + vm.expectRevert(VaultErrors.TimelockNotElapsed.selector); + vaultV2.acceptPendingMinApy(); + + // Test acceptPendingMinApy after timelock + vm.warp(block.timestamp + timelock + 1); + vaultV2.acceptPendingMinApy(); + + assertEq(vaultV2.minApy(), lowerMinApy); + assertEq(vaultV2.pendingMinApy().value, 0); + assertEq(vaultV2.pendingMinApy().validAt, 0); + } + + function testMinApyRevoke() public { + ITermMaxVaultV2 vaultV2 = ITermMaxVaultV2(address(vault)); + + // Set initial minApy + uint64 initialMinApy = 0.05e8; + vm.prank(curator); + vaultV2.submitPendingMinApy(initialMinApy); + + // Submit decrease + uint64 lowerMinApy = 0.03e8; + vm.prank(curator); + vaultV2.submitPendingMinApy(lowerMinApy); + + // Guardian revokes pending change + vm.prank(guardian); + vaultV2.revokePendingMinApy(); + + assertEq(vaultV2.minApy(), initialMinApy); + assertEq(vaultV2.pendingMinApy().value, 0); + assertEq(vaultV2.pendingMinApy().validAt, 0); + } + + function testMinIdleFundRateManagement() public { + ITermMaxVaultV2 vaultV2 = ITermMaxVaultV2(address(vault)); + + // Test initial state + assertEq(vaultV2.minIdleFundRate(), 0); + assertEq(vaultV2.pendingMinIdleFundRate().value, 0); + assertEq(vaultV2.pendingMinIdleFundRate().validAt, 0); + + // Test submitPendingMinIdleFundRate - increase (immediate) + uint64 newMinIdleFundRate = 0.1e8; // 10% + vm.prank(curator); + vaultV2.submitPendingMinIdleFundRate(newMinIdleFundRate); + + // Should be set immediately for increases + assertEq(vaultV2.minIdleFundRate(), newMinIdleFundRate); + assertEq(vaultV2.pendingMinIdleFundRate().value, 0); + + // Test submitPendingMinIdleFundRate - decrease (timelock required) + uint64 lowerMinIdleFundRate = 0.05e8; // 5% + vm.prank(curator); + vaultV2.submitPendingMinIdleFundRate(lowerMinIdleFundRate); + + // Should not be set immediately for decreases + assertEq(vaultV2.minIdleFundRate(), newMinIdleFundRate); + assertEq(vaultV2.pendingMinIdleFundRate().value, lowerMinIdleFundRate); + assertEq(vaultV2.pendingMinIdleFundRate().validAt, block.timestamp + timelock); + + // Test acceptPendingMinIdleFundRate before timelock + vm.expectRevert(VaultErrors.TimelockNotElapsed.selector); + vaultV2.acceptPendingMinIdleFundRate(); + + // Test acceptPendingMinIdleFundRate after timelock + vm.warp(block.timestamp + timelock + 1); + vaultV2.acceptPendingMinIdleFundRate(); + + assertEq(vaultV2.minIdleFundRate(), lowerMinIdleFundRate); + assertEq(vaultV2.pendingMinIdleFundRate().value, 0); + assertEq(vaultV2.pendingMinIdleFundRate().validAt, 0); + } + + function testMinIdleFundRateRevoke() public { + ITermMaxVaultV2 vaultV2 = ITermMaxVaultV2(address(vault)); + + // Set initial minIdleFundRate + uint64 initialMinIdleFundRate = 0.1e8; + vm.prank(curator); + vaultV2.submitPendingMinIdleFundRate(initialMinIdleFundRate); + + // Submit decrease + uint64 lowerMinIdleFundRate = 0.05e8; + vm.prank(curator); + vaultV2.submitPendingMinIdleFundRate(lowerMinIdleFundRate); + + // Guardian revokes pending change + vm.prank(guardian); + vaultV2.revokePendingMinIdleFundRate(); + + assertEq(vaultV2.minIdleFundRate(), initialMinIdleFundRate); + assertEq(vaultV2.pendingMinIdleFundRate().value, 0); + assertEq(vaultV2.pendingMinIdleFundRate().validAt, 0); + } + + function testApyFunction() public { + ITermMaxVaultV2 vaultV2 = ITermMaxVaultV2(address(vault)); + + // Initially should return 0 when no accreting principal + assertEq(vaultV2.apy(), 0); + + // After some trading activity, APY should be calculated correctly + vm.warp(currentTime + 2 days); + buyXt(48.219178e8, 1000e8); + + uint256 apy = vaultV2.apy(); + uint256 annualizedInterest = vault.annualizedInterest(); + uint256 accretingPrincipal = vault.accretingPrincipal(); + uint256 performanceFeeRate = vault.performanceFeeRate(); + + // APY should be calculated as: (annualizedInterest * (1 - performanceFeeRate)) / accretingPrincipal + uint256 expectedApy = (annualizedInterest * (Constants.DECIMAL_BASE - performanceFeeRate)) / accretingPrincipal; + assertEq(apy, expectedApy); + + // APY should be greater than 0 after trading + assertGt(apy, 0); + } + + function test_RevertMinApyAccessControl() public { + ITermMaxVaultV2 vaultV2 = ITermMaxVaultV2(address(vault)); + + // Test unauthorized access + vm.prank(vm.randomAddress()); + vm.expectRevert(VaultErrors.NotCuratorRole.selector); + vaultV2.submitPendingMinApy(0.05e8); + + vm.prank(vm.randomAddress()); + vm.expectRevert(VaultErrors.NotGuardianRole.selector); + vaultV2.revokePendingMinApy(); + } + + function test_RevertMinIdleFundRateAccessControl() public { + ITermMaxVaultV2 vaultV2 = ITermMaxVaultV2(address(vault)); + + // Test unauthorized access + vm.prank(vm.randomAddress()); + vm.expectRevert(VaultErrors.NotCuratorRole.selector); + vaultV2.submitPendingMinIdleFundRate(0.1e8); + + vm.prank(vm.randomAddress()); + vm.expectRevert(VaultErrors.NotGuardianRole.selector); + vaultV2.revokePendingMinIdleFundRate(); + } + + function test_RevertMinApyAlreadySet() public { + ITermMaxVaultV2 vaultV2 = ITermMaxVaultV2(address(vault)); + + uint64 minApy = 0.05e8; + vm.startPrank(curator); + vaultV2.submitPendingMinApy(minApy); + + // Should revert when trying to set the same value + vm.expectRevert(VaultErrors.AlreadySet.selector); + vaultV2.submitPendingMinApy(minApy); + + vm.stopPrank(); + } + + function test_RevertMinIdleFundRateAlreadySet() public { + ITermMaxVaultV2 vaultV2 = ITermMaxVaultV2(address(vault)); + + uint64 minIdleFundRate = 0.1e8; + vm.startPrank(curator); + vaultV2.submitPendingMinIdleFundRate(minIdleFundRate); + + // Should revert when trying to set the same value + vm.expectRevert(VaultErrors.AlreadySet.selector); + vaultV2.submitPendingMinIdleFundRate(minIdleFundRate); + + vm.stopPrank(); + } + + function test_RevertMinApyAlreadyPending() public { + ITermMaxVaultV2 vaultV2 = ITermMaxVaultV2(address(vault)); + + vm.startPrank(curator); + // Set initial value + vaultV2.submitPendingMinApy(0.05e8); + + // Submit decrease (creates pending) + vaultV2.submitPendingMinApy(0.03e8); + + // Should revert when trying to submit another pending change + vm.expectRevert(VaultErrors.AlreadyPending.selector); + vaultV2.submitPendingMinApy(0.02e8); + + vm.stopPrank(); + } + + function test_RevertMinIdleFundRateAlreadyPending() public { + ITermMaxVaultV2 vaultV2 = ITermMaxVaultV2(address(vault)); + + vm.startPrank(curator); + // Set initial value + vaultV2.submitPendingMinIdleFundRate(0.1e8); + + // Submit decrease (creates pending) + vaultV2.submitPendingMinIdleFundRate(0.05e8); + + // Should revert when trying to submit another pending change + vm.expectRevert(VaultErrors.AlreadyPending.selector); + vaultV2.submitPendingMinIdleFundRate(0.03e8); + + vm.stopPrank(); + } + + function test_RevertAcceptMinApyNoPendingValue() public { + ITermMaxVaultV2 vaultV2 = ITermMaxVaultV2(address(vault)); + + // Should revert when no pending value exists + vm.expectRevert(VaultErrors.NoPendingValue.selector); + vaultV2.acceptPendingMinApy(); + } + + function test_RevertAcceptMinIdleFundRateNoPendingValue() public { + ITermMaxVaultV2 vaultV2 = ITermMaxVaultV2(address(vault)); + + // Should revert when no pending value exists + vm.expectRevert(VaultErrors.NoPendingValue.selector); + vaultV2.acceptPendingMinIdleFundRate(); + } + + function testMinApyEventEmission() public { + ITermMaxVaultV2 vaultV2 = ITermMaxVaultV2(address(vault)); + + // Test SetMinApy event for immediate increase + uint64 newMinApy = 0.05e8; + vm.expectEmit(true, false, false, true); + emit VaultEventsV2.SetMinApy(curator, newMinApy); + + vm.prank(curator); + vaultV2.submitPendingMinApy(newMinApy); + + // Test SubmitMinApy event for timelock decrease + uint64 lowerMinApy = 0.03e8; + vm.expectEmit(false, false, false, true); + emit VaultEventsV2.SubmitMinApy(lowerMinApy, uint64(block.timestamp + timelock)); + + vm.prank(curator); + vaultV2.submitPendingMinApy(lowerMinApy); + + // Test SetMinApy event when accepting pending value + vm.warp(block.timestamp + timelock + 1); + vm.expectEmit(true, false, false, true); + emit VaultEventsV2.SetMinApy(address(this), lowerMinApy); + + vaultV2.acceptPendingMinApy(); + } + + function testMinIdleFundRateEventEmission() public { + ITermMaxVaultV2 vaultV2 = ITermMaxVaultV2(address(vault)); + + // Test SetMinIdleFundRate event for immediate increase + uint64 newMinIdleFundRate = 0.1e8; + vm.expectEmit(true, false, false, true); + emit VaultEventsV2.SetMinIdleFundRate(curator, newMinIdleFundRate); + + vm.prank(curator); + vaultV2.submitPendingMinIdleFundRate(newMinIdleFundRate); + + // Test SubmitMinIdleFundRate event for timelock decrease + uint64 lowerMinIdleFundRate = 0.05e8; + vm.expectEmit(false, false, false, true); + emit VaultEventsV2.SubmitMinIdleFundRate(lowerMinIdleFundRate, uint64(block.timestamp + timelock)); + + vm.prank(curator); + vaultV2.submitPendingMinIdleFundRate(lowerMinIdleFundRate); + + // Test SetMinIdleFundRate event when accepting pending value + vm.warp(block.timestamp + timelock + 1); + vm.expectEmit(true, false, false, true); + emit VaultEventsV2.SetMinIdleFundRate(address(this), lowerMinIdleFundRate); + + vaultV2.acceptPendingMinIdleFundRate(); + } + + function testRevokeEventEmission() public { + ITermMaxVaultV2 vaultV2 = ITermMaxVaultV2(address(vault)); + + // Set up pending changes + vm.startPrank(curator); + vaultV2.submitPendingMinApy(0.05e8); + vaultV2.submitPendingMinApy(0.03e8); // Creates pending + vaultV2.submitPendingMinIdleFundRate(0.1e8); + vaultV2.submitPendingMinIdleFundRate(0.05e8); // Creates pending + vm.stopPrank(); + + // Test RevokePendingMinApy event + vm.expectEmit(true, false, false, false); + emit VaultEventsV2.RevokePendingMinApy(guardian); + + vm.prank(guardian); + vaultV2.revokePendingMinApy(); + + // Test RevokePendingMinIdleFundRate event + vm.expectEmit(true, false, false, false); + emit VaultEventsV2.RevokePendingMinIdleFundRate(guardian); + + vm.prank(guardian); + vaultV2.revokePendingMinIdleFundRate(); + } } From 8247a61210e2b0e3959115677c4d55fd869fac4c Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 10 Jun 2025 18:57:09 +0800 Subject: [PATCH 070/194] add ut for idle fund rate --- contracts/v2/vault/OrderManagerV2.sol | 21 +- test/v2/VaultDustV2.t.sol | 273 -------------------------- test/v2/VaultV2.t.sol | 25 ++- 3 files changed, 34 insertions(+), 285 deletions(-) delete mode 100644 test/v2/VaultDustV2.t.sol diff --git a/contracts/v2/vault/OrderManagerV2.sol b/contracts/v2/vault/OrderManagerV2.sol index ce39c2a..bd71f1c 100644 --- a/contracts/v2/vault/OrderManagerV2.sol +++ b/contracts/v2/vault/OrderManagerV2.sol @@ -56,10 +56,15 @@ contract OrderManagerV2 is VaultStorageV2, VaultErrors, VaultEvents, IOrderManag CurveCuts[] memory curveCuts ) external override onlyProxy { _accruedInterest(); + int256 totalChanges = 0; for (uint256 i = 0; i < orders.length; ++i) { + totalChanges += changes[i]; _updateOrder(asset, ITermMaxOrder(orders[i]), changes[i], maxSupplies[i], curveCuts[i]); } - _checkIdleFundRate(asset); + /// @dev Check idle fund rate after all orders are updated if deposit funds to orders + if (totalChanges > 0) { + _checkIdleFundRate(asset); + } } /** @@ -142,7 +147,10 @@ contract OrderManagerV2 is VaultStorageV2, VaultErrors, VaultEvents, IOrderManag uint256 __minIdleFundRate = _minIdleFundRate; if (__minIdleFundRate > 0) { uint256 idleFundBalance = asset.balanceOf(address(this)); - uint256 currentIdleFundRate = idleFundBalance * Constants.DECIMAL_BASE / _accretingPrincipal; + uint256 currentIdleFundRate = _accretingPrincipal == 0 + ? Constants.DECIMAL_BASE + : idleFundBalance * Constants.DECIMAL_BASE_SQ * Constants.DECIMAL_BASE / _accretingPrincipal; + if (currentIdleFundRate < __minIdleFundRate) { revert VaultErrorsV2.IdleFundRateTooLow(currentIdleFundRate, __minIdleFundRate); } @@ -210,15 +218,6 @@ contract OrderManagerV2 is VaultStorageV2, VaultErrors, VaultEvents, IOrderManag _totalFt -= amplifiedAmt; } - function _burnFromOrder(ITermMaxOrder order, OrderInfo memory orderInfo, uint256 amount) internal { - order.withdrawAssets(orderInfo.ft, address(this), amount); - order.withdrawAssets(orderInfo.xt, address(this), amount); - orderInfo.ft.safeIncreaseAllowance(address(orderInfo.market), amount); - orderInfo.xt.safeIncreaseAllowance(address(orderInfo.market), amount); - - orderInfo.market.burn(address(this), amount); - } - function _redeemFromMarket(address order, OrderInfo memory orderInfo) internal returns (uint256 totalRedeem) { uint256 ftReserve = orderInfo.ft.balanceOf(order); if (ftReserve != 0) { diff --git a/test/v2/VaultDustV2.t.sol b/test/v2/VaultDustV2.t.sol deleted file mode 100644 index b7bf551..0000000 --- a/test/v2/VaultDustV2.t.sol +++ /dev/null @@ -1,273 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import "forge-std/Test.sol"; -import {console} from "forge-std/console.sol"; -import {DeployUtils} from "./utils/DeployUtils.sol"; -import {JSONLoader} from "./utils/JSONLoader.sol"; -import {StateChecker} from "./utils/StateChecker.sol"; -import {SwapUtils} from "./utils/SwapUtils.sol"; -import {LoanUtils} from "./utils/LoanUtils.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; -import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; -import {IFlashLoanReceiver} from "contracts/v1/IFlashLoanReceiver.sol"; -import { - ITermMaxMarketV2, - ITermMaxMarket, - TermMaxMarketV2, - Constants, - MarketErrors, - MarketEvents, - IMintableERC20 -} from "contracts/v2/TermMaxMarketV2.sol"; -import {ITermMaxOrder, TermMaxOrderV2, ISwapCallback, OrderEvents} from "contracts/v2/TermMaxOrderV2.sol"; -import {MockERC20, ERC20} from "contracts/v1/test/MockERC20.sol"; -import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; -import {MockFlashLoanReceiver} from "contracts/v1/test/MockFlashLoanReceiver.sol"; -import {IGearingToken} from "contracts/v1/tokens/IGearingToken.sol"; -import { - VaultInitialParams, - MarketConfig, - MarketInitialParams, - LoanConfig, - OrderConfig, - CurveCuts, - IOracle -} from "contracts/v1/storage/TermMaxStorage.sol"; -import { - ITermMaxVault, - ITermMaxVaultV2, - TermMaxVaultV2, - VaultErrors, - VaultEvents, - VaultConstants, - OrderInfo -} from "contracts/v2/vault/TermMaxVaultV2.sol"; -import {PendingUint192, PendingLib} from "contracts/v1/lib/PendingLib.sol"; - -contract VaultDustTestV2 is Test { - using JSONLoader for *; - using SafeCast for *; - - OrderConfig orderConfig; - MarketConfig marketConfig; - - address deployer = vm.randomAddress(); - address curator = vm.randomAddress(); - address allocator = vm.randomAddress(); - address guardian = vm.randomAddress(); - address lper = vm.randomAddress(); - address treasurer = vm.randomAddress(); - string testdata; - - ITermMaxVault vault; - - uint256 timelock = 86400; - uint256 maxCapacity = 1000000e18; - uint64 performanceFeeRate = 0.1e8; - - ITermMaxMarket market2; - - uint256 currentTime; - uint32 maxLtv = 0.89e8; - uint32 liquidationLtv = 0.9e8; - VaultInitialParams initialParams; - - DeployUtils.Res[] resources; - - address bob = vm.addr(0x123); - address alice = vm.addr(0x456); - address charlie = vm.addr(0x789); - - address[] users = [bob, alice, charlie]; - - uint256[] durations = [3, 4, 10, 20, 5, 5, 3, 15, 20, 12]; - - function setUp() public { - vm.startPrank(deployer); - testdata = vm.readFile(string.concat(vm.projectRoot(), "/test/testdata/testdata.json")); - - currentTime = vm.parseUint(vm.parseJsonString(testdata, ".currentTime")); - vm.warp(currentTime); - - marketConfig = JSONLoader.getMarketConfigFromJson(treasurer, testdata, ".marketConfig"); - orderConfig = JSONLoader.getOrderConfigFromJson(testdata, ".orderConfig"); - - MockERC20 debt = new MockERC20("DAI", "DAI", 6); - for (uint256 i = 0; i < 10; i++) { - resources.push( - DeployUtils.deployMockMarket2(deployer, debt, durations[i], marketConfig, maxLtv, liquidationLtv) - ); - } - - initialParams = VaultInitialParams( - deployer, curator, timelock, debt, maxCapacity, "Vault-DAI", "Vault-DAI", performanceFeeRate - ); - - vault = DeployUtils.deployVault(initialParams); - - vault.submitGuardian(guardian); - vault.setIsAllocator(allocator, true); - - for (uint256 i = 0; i < resources.length; i++) { - address market = address(resources[i].market); - vault.submitMarket(market, true); - vm.warp(currentTime + timelock + 1); - vault.acceptMarket(market); - vm.warp(currentTime); - } - - vm.stopPrank(); - - debt.mint(bob, 10000e16); - vm.startPrank(bob); - debt.approve(address(vault), maxCapacity); - vault.deposit(10000e16 / 2, bob); - vm.stopPrank(); - - vm.startPrank(alice); - debt.mint(alice, 5000e18); - debt.approve(address(vault), maxCapacity); - vault.deposit(5000e18 / 2, alice); - vm.stopPrank(); - - vm.startPrank(charlie); - debt.mint(charlie, 20e15); - debt.approve(address(vault), maxCapacity); - vault.deposit(20e15 / 2, charlie); - vm.stopPrank(); - - for (uint256 i = 0; i < resources.length; i++) { - vm.startPrank(deployer); - ITermMaxMarket market = resources[i].market; - resources[i].order = vault.createOrder(market, maxCapacity, i * 1e15, orderConfig.curveCuts); - vm.stopPrank(); - } - } - - function testDust() public { - uint256 count = 0; - while (block.timestamp < currentTime + 30 days) { - uint256 k = vm.randomUint(2 ** 128 - 1, 2 ** 256 - 1); - uint256 period = vm.randomUint(2000, 3600); - count++; - vm.warp(block.timestamp); - uint256 i = k % 10; - // ITermMaxMarket market = resources[i].market; - ITermMaxOrder order = resources[i].order; - uint256 amount = k % 1e4; - // (, uint256 borrowApr) = order.apr(); - // uint256 virturalApr = borrowApr * (block.timestamp - currentTime) / 365 days; - uint256 ftBalance = resources[i].ft.balanceOf(address(order)); - uint256 xtBalance = resources[i].xt.balanceOf(address(order)); - - if (xtBalance < ftBalance * 8 / 10 && amount * 2 < ftBalance) { - console.log("buy ft:", amount); - buyFt(order, uint128(amount), uint128(amount * 2)); - } else if (amount * 2 < xtBalance) { - console.log("buy xt:", amount); - buyXt(order, uint128(amount), uint128(amount * 2)); - } - - if (i < 3) { - vm.prank(users[i]); - if (block.timestamp % 2 == 0) { - console.log("redeem:", i); - vault.redeem(1e5, users[i], users[i]); - } else { - console.log("deposit:", i); - vault.deposit(1e5, users[i]); - } - } - - vm.warp(block.timestamp + period); - } - vm.warp(block.timestamp + 60 days); - console.log("---- do redeem ---"); - for (uint256 i = 0; i < resources.length; i++) { - vm.prank(curator); - vault.redeemOrder(resources[i].order); - } - uint256 performanceFee = vault.performanceFee(); - console.log("performanceFee:", performanceFee); - vm.prank(curator); - vault.withdrawPerformanceFee(curator, performanceFee); - - vm.warp(block.timestamp + 10); - console.log("---- status ---"); - console.log("run count:", count); - console.log("total assets:", vault.totalAssets()); - console.log("total supply:", vault.totalSupply()); - console.log("annualizedInterest:", vault.annualizedInterest()); - console.log("apy:", ITermMaxVaultV2(address(vault)).apy()); - console.log("total ft:", vault.totalFt()); - console.log("actual balance:", resources[0].debt.balanceOf(address(vault))); - console.log("accretingPrincipal:", vault.accretingPrincipal()); - - console.log("---- do redeem ---"); - console.log("asset:", address(resources[0].debt)); - console.log("vault:", address(vault)); - for (uint256 i = 0; i < resources.length; i++) { - address collateral = address(resources[i].collateral); - if (vault.badDebtMapping(collateral) > 0) { - console.log("badDebt:", vault.badDebtMapping(collateral)); - console.log("collateral:", collateral); - } - } - for (uint256 i = 0; i < users.length; i++) { - console.log("user i:", i); - console.log("balance:", vault.balanceOf(users[i])); - vm.startPrank(users[i]); - uint256 redeemed = vault.redeem(vault.balanceOf(users[i]), users[i], users[i]); - console.log("redeemed:", redeemed); - console.log("remainning total assets:", vault.totalAssets()); - vm.stopPrank(); - } - uint256 dustAmt = resources[0].debt.balanceOf(address(vault)); - console.log("remaining balance:", dustAmt); - assertLe(dustAmt, 3); - } - - function buyFt(ITermMaxOrder order, uint128 tokenAmtIn, uint128 ftAmtOut) internal { - address taker = vm.randomAddress(); - (IMintableERC20 ft, IMintableERC20 xt,,, IERC20 debt) = order.market().tokens(); - IMintableERC20(address(debt)).mint(taker, tokenAmtIn); - vm.startPrank(taker); - debt.approve(address(order), tokenAmtIn); - order.swapExactTokenToToken(debt, ft, taker, tokenAmtIn, ftAmtOut, block.timestamp + 1 hours); - vm.stopPrank(); - } - - function buyXt(ITermMaxOrder order, uint128 tokenAmtIn, uint128 xtAmtOut) internal { - address taker = vm.randomAddress(); - (IMintableERC20 ft, IMintableERC20 xt,,, IERC20 debt) = order.market().tokens(); - IMintableERC20(address(debt)).mint(taker, tokenAmtIn); - vm.startPrank(taker); - debt.approve(address(order), tokenAmtIn); - order.swapExactTokenToToken(debt, xt, taker, tokenAmtIn, xtAmtOut, block.timestamp + 1 hours); - vm.stopPrank(); - } - - function sellFt(ITermMaxOrder order, uint128 ftAmtIn, uint128 tokenAmtOut) internal { - address taker = vm.randomAddress(); - (IMintableERC20 ft, IMintableERC20 xt,,, IERC20 debt) = order.market().tokens(); - vm.prank(deployer); - ft.transfer(taker, ftAmtIn); - vm.startPrank(taker); - ft.approve(address(order), ftAmtIn); - order.swapExactTokenToToken(ft, debt, taker, ftAmtIn, tokenAmtOut, block.timestamp + 1 hours); - vm.stopPrank(); - } - - function sellXt(ITermMaxOrder order, uint128 xtAmtIn, uint128 tokenAmtOut) internal { - address taker = vm.randomAddress(); - (IMintableERC20 ft, IMintableERC20 xt,,, IERC20 debt) = order.market().tokens(); - vm.prank(deployer); - xt.transfer(taker, xtAmtIn); - vm.startPrank(taker); - xt.approve(address(order), xtAmtIn); - order.swapExactTokenToToken(xt, debt, taker, xtAmtIn, tokenAmtOut, block.timestamp + 1 hours); - vm.stopPrank(); - } -} diff --git a/test/v2/VaultV2.t.sol b/test/v2/VaultV2.t.sol index eceee6c..c0c8ee5 100644 --- a/test/v2/VaultV2.t.sol +++ b/test/v2/VaultV2.t.sol @@ -952,7 +952,7 @@ contract VaultTestV2 is Test { int256[] memory amounts = new int256[](1); amounts[0] = amount; ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); - orders[0] = res.order; + orders[0] = order; uint256[] memory maxSupplies = new uint256[](1); maxSupplies[0] = maxCapacity; vault.updateOrders(orders, amounts, maxSupplies, curveCuts); @@ -1291,4 +1291,27 @@ contract VaultTestV2 is Test { vm.prank(guardian); vaultV2.revokePendingMinIdleFundRate(); } + + function testRevertWhenIdleFundTooLow() public { + ITermMaxVaultV2 vaultV2 = ITermMaxVaultV2(address(vault)); + vm.startPrank(curator); + vaultV2.submitPendingMinIdleFundRate(0.1e8); // minIdleFundRate = 10% + + CurveCuts[] memory curveCuts = new CurveCuts[](1); + curveCuts[0] = res.order.orderConfig().curveCuts; + int256[] memory amounts = new int256[](1); + amounts[0] = -3000e8; // Withdraw 3000e8 from the order + ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); + orders[0] = res.order; + uint256[] memory maxSupplies = new uint256[](1); + maxSupplies[0] = maxCapacity; + + vault.updateOrders(orders, amounts, maxSupplies, curveCuts); + + amounts[0] = 3000e8; // deposit 3000e8 from the order + vm.expectRevert(abi.encodeWithSelector(VaultErrorsV2.IdleFundRateTooLow.selector, 0, 0.1e8)); + vault.updateOrders(orders, amounts, maxSupplies, curveCuts); + + vm.stopPrank(); + } } From 75ee1ef338c1486d16ef2cc64bf1fecfe4db8fea Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 10 Jun 2025 19:06:15 +0800 Subject: [PATCH 071/194] ut for apy protection --- test/v2/VaultV2.t.sol | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/test/v2/VaultV2.t.sol b/test/v2/VaultV2.t.sol index c0c8ee5..297911a 100644 --- a/test/v2/VaultV2.t.sol +++ b/test/v2/VaultV2.t.sol @@ -1314,4 +1314,23 @@ contract VaultTestV2 is Test { vm.stopPrank(); } + + function testRevertWhenApyTooLow() public { + ITermMaxVaultV2 vaultV2 = ITermMaxVaultV2(address(vault)); + vm.prank(curator); + vaultV2.submitPendingMinApy(0.05e8); // minApy = 5% + + sellFt(1000e8, 800e8); // Sell 100e8 FT + + uint128 tokenAmtIn = 800e8; + uint128 ftAmtOut = 1000e8; + address taker = vm.randomAddress(); + res.debt.mint(taker, tokenAmtIn); + vm.startPrank(taker); + res.debt.approve(address(res.order), tokenAmtIn); + + vm.expectRevert(abi.encodeWithSelector(VaultErrorsV2.ApyTooLow.selector, 0, 0.05e8)); + res.order.swapExactTokenToToken(res.debt, res.ft, taker, tokenAmtIn, ftAmtOut, block.timestamp + 1 hours); + vm.stopPrank(); + } } From fc0f8cd02b6cb8168f0472744db9f8f616c7d8bf Mon Sep 17 00:00:00 2001 From: Evan Date: Wed, 11 Jun 2025 10:39:34 +0800 Subject: [PATCH 072/194] add event for interest changes --- contracts/v2/events/VaultEventsV2.sol | 7 +++++++ contracts/v2/vault/OrderManagerV2.sol | 3 ++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/contracts/v2/events/VaultEventsV2.sol b/contracts/v2/events/VaultEventsV2.sol index c450de1..2367c4a 100644 --- a/contracts/v2/events/VaultEventsV2.sol +++ b/contracts/v2/events/VaultEventsV2.sol @@ -45,4 +45,11 @@ interface VaultEventsV2 { * @param caller The address that initiated the revocation */ event RevokePendingMinIdleFundRate(address indexed caller); + + /** + * @notice Emitted when accrued interest is calculated + * @param newAccretingPrincipal The updated accreting principal + * @param newPerformanceFee The updated performance fee + */ + event AccruedInterest(uint256 newAccretingPrincipal, uint256 newPerformanceFee); } diff --git a/contracts/v2/vault/OrderManagerV2.sol b/contracts/v2/vault/OrderManagerV2.sol index bd71f1c..e8cd174 100644 --- a/contracts/v2/vault/OrderManagerV2.sol +++ b/contracts/v2/vault/OrderManagerV2.sol @@ -17,6 +17,7 @@ import {IOrderManager} from "../../v1/vault/IOrderManager.sol"; import {ISwapCallback} from "../../v1/ISwapCallback.sol"; import {OrderInfo, VaultStorageV2} from "./VaultStorageV2.sol"; import {VaultErrorsV2} from "../errors/VaultErrorsV2.sol"; +import {VaultEventsV2} from "../events/VaultEventsV2.sol"; /** * @title Order Manager V2 * @author Term Structure Labs @@ -192,7 +193,6 @@ contract OrderManagerV2 is VaultStorageV2, VaultErrors, VaultEvents, IOrderManag asset.safeTransfer(recipient, amount); _performanceFee -= amplifiedAmt; _totalFt -= amplifiedAmt; - emit WithdrawPerformanceFee(msg.sender, recipient, amount); } @@ -277,6 +277,7 @@ contract OrderManagerV2 is VaultStorageV2, VaultErrors, VaultEvents, IOrderManag // all orders are expired _annualizedInterest = 0; } + emit VaultEventsV2.AccruedInterest(_accretingPrincipal, _performanceFee); _lastUpdateTime = currentTime; } From d7f5171527cc03cf1a6ce3b8a93efa778c403ff6 Mon Sep 17 00:00:00 2001 From: Evan Date: Wed, 11 Jun 2025 11:56:06 +0800 Subject: [PATCH 073/194] add tx reentrant guard for vault --- README.md | 6 ++++ contracts/v2/TermMaxOrderV2.sol | 1 - .../v2/lib/TransactionReentrancyGuard.sol | 28 +++++++++++++++++++ contracts/v2/vault/TermMaxVaultV2.sol | 8 ++++-- 4 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 contracts/v2/lib/TransactionReentrancyGuard.sol diff --git a/README.md b/README.md index 80cfc1b..504bdc6 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,12 @@ Test without fork. $ forge test --skip Fork ``` +Using '--isolate' when testing TermMaxVault. + +```shell +$ forge test --skip Fork --isolate +``` + Using test scripts can configure multiple environments more flexibly, it will automatically configure the environment variables you need. Do unit test if you have an env file named sepolia.env. diff --git a/contracts/v2/TermMaxOrderV2.sol b/contracts/v2/TermMaxOrderV2.sol index 397f760..32fdfd4 100644 --- a/contracts/v2/TermMaxOrderV2.sol +++ b/contracts/v2/TermMaxOrderV2.sol @@ -11,7 +11,6 @@ import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; import {ITermMaxOrder, IERC20} from "../v1/ITermMaxOrder.sol"; import {ITermMaxMarket} from "../v1/ITermMaxMarket.sol"; import {IGearingToken} from "../v1/tokens/IGearingToken.sol"; -import {IFlashLoanReceiver} from "../v1/IFlashLoanReceiver.sol"; import {Constants} from "../v1/lib/Constants.sol"; import {TermMaxCurve, MathLib} from "../v1/lib/TermMaxCurve.sol"; import {OrderErrors} from "../v1/errors/OrderErrors.sol"; diff --git a/contracts/v2/lib/TransactionReentrancyGuard.sol b/contracts/v2/lib/TransactionReentrancyGuard.sol new file mode 100644 index 0000000..136bf70 --- /dev/null +++ b/contracts/v2/lib/TransactionReentrancyGuard.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +abstract contract TransactionReentrancyGuard { + error ReentrantCall(); + + // keccak256(abi.encode(uint256(keccak256("termmax.tsstorage.TransactionReentrancyGuard")) - 1)) & ~bytes32(uint256(0xff)) + uint256 private constant T_FLAG_STORE = 0x55d65f3b5821c66716708cd5119fc8b654f479bd23b96d0911cee85241904700; + + /// @notice Modifier to prevent reentrant calls in one transaction. + modifier nonTxReentrant() { + if (_getTxReentrancyGuardStorage() == 1) revert ReentrantCall(); + _setTxReentrancyGuardStorage(1); + _; + } + + function _getTxReentrancyGuardStorage() private view returns (uint256 reentrancyGuard) { + assembly { + reentrancyGuard := tload(T_FLAG_STORE) + } + } + + function _setTxReentrancyGuardStorage(uint256 reentrancyGuard) private { + assembly { + tstore(T_FLAG_STORE, reentrancyGuard) + } + } +} diff --git a/contracts/v2/vault/TermMaxVaultV2.sol b/contracts/v2/vault/TermMaxVaultV2.sol index c9d26f7..99017a4 100644 --- a/contracts/v2/vault/TermMaxVaultV2.sol +++ b/contracts/v2/vault/TermMaxVaultV2.sol @@ -33,6 +33,7 @@ import {Constants} from "../../v1/lib/Constants.sol"; import {ITermMaxVault} from "../../v1/vault/ITermMaxVault.sol"; import {ITermMaxVaultV2} from "./ITermMaxVaultV2.sol"; import {VaultErrorsV2} from "../errors/VaultErrorsV2.sol"; +import {TransactionReentrancyGuard} from "../lib/TransactionReentrancyGuard.sol"; contract TermMaxVaultV2 is VaultStorageV2, @@ -44,7 +45,8 @@ contract TermMaxVaultV2 is VaultErrors, VaultEvents, ISwapCallback, - ITermMaxVaultV2 + ITermMaxVaultV2, + TransactionReentrancyGuard { using SafeCast for uint256; using TransferUtils for IERC20; @@ -438,7 +440,7 @@ contract TermMaxVaultV2 is function _deposit(address caller, address recipient, uint256 assets, uint256 shares) internal override - nonReentrant + nonTxReentrant whenNotPaused { IERC20(asset()).safeTransferFrom(caller, address(this), assets); @@ -455,7 +457,7 @@ contract TermMaxVaultV2 is function _withdraw(address caller, address receiver, address owner, uint256 assets, uint256 shares) internal override - nonReentrant + nonTxReentrant { if (caller != owner) { _spendAllowance(owner, caller, shares); From a5a8431609f0a009473c8682417fa1513b02d3a8 Mon Sep 17 00:00:00 2001 From: Evan Date: Wed, 11 Jun 2025 13:12:01 +0800 Subject: [PATCH 074/194] update termmax vault factory v2 --- contracts/v2/errors/VaultErrorsV2.sol | 2 + contracts/v2/events/FactoryEventsV2.sol | 5 +- .../v2/factory/ITermMaxVaultFactoryV2.sol | 41 +++++++++++ .../v2/factory/TermMaxVaultFactoryV2.sol | 18 ++--- contracts/v2/storage/TermMaxStorageV2.sol | 18 +++++ contracts/v2/vault/ITermMaxVaultV2.sol | 70 ++++++++++++++++++- contracts/v2/vault/TermMaxVaultV2.sol | 26 +++++-- contracts/v2/vault/VaultStorageV2.sol | 2 - test/v2/AccessManagerV2.t.sol | 23 ++++-- test/v2/VaultV2.t.sol | 19 +++-- test/v2/utils/DeployUtils.sol | 6 +- 11 files changed, 197 insertions(+), 33 deletions(-) create mode 100644 contracts/v2/factory/ITermMaxVaultFactoryV2.sol create mode 100644 contracts/v2/storage/TermMaxStorageV2.sol diff --git a/contracts/v2/errors/VaultErrorsV2.sol b/contracts/v2/errors/VaultErrorsV2.sol index 788f548..a039c67 100644 --- a/contracts/v2/errors/VaultErrorsV2.sol +++ b/contracts/v2/errors/VaultErrorsV2.sol @@ -6,6 +6,8 @@ pragma solidity ^0.8.0; * @author Term Structure Labs */ interface VaultErrorsV2 { + /// @notice Error thrown when an invalid or unsupported functions is called + error UseVaultInitialParamsV2(); /// @notice Error thrown when an invalid or unsupported functions is called error SupplyQueueNoLongerSupported(); /// @notice Error thrown when an invalid or unsupported functions is called diff --git a/contracts/v2/events/FactoryEventsV2.sol b/contracts/v2/events/FactoryEventsV2.sol index c9f21a1..bcb324f 100644 --- a/contracts/v2/events/FactoryEventsV2.sol +++ b/contracts/v2/events/FactoryEventsV2.sol @@ -2,7 +2,8 @@ pragma solidity ^0.8.0; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {MarketInitialParams, VaultInitialParams} from "../../v1/storage/TermMaxStorage.sol"; +import {MarketInitialParams} from "../../v1/storage/TermMaxStorage.sol"; +import {VaultInitialParamsV2} from "../storage/TermMaxStorageV2.sol"; /** * @title Factory Events Interface V2 @@ -26,7 +27,7 @@ interface FactoryEventsV2 { * @param creator The address of the vault creator * @param initialParams The initial parameters used to configure the vault */ - event CreateVault(address indexed vault, address indexed creator, VaultInitialParams initialParams); + event CreateVault(address indexed vault, address indexed creator, VaultInitialParamsV2 initialParams); /** * @notice Emitted when a new price feed is created diff --git a/contracts/v2/factory/ITermMaxVaultFactoryV2.sol b/contracts/v2/factory/ITermMaxVaultFactoryV2.sol new file mode 100644 index 0000000..1833925 --- /dev/null +++ b/contracts/v2/factory/ITermMaxVaultFactoryV2.sol @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {VaultInitialParamsV2} from "../storage/TermMaxStorageV2.sol"; + +/** + * @title TermMax Vault Factory Interface v2 + * @author Term Structure Labs + * @notice Interface for creating new TermMax vaults + */ +interface ITermMaxVaultFactoryV2 { + /** + * @notice The implementation of TermMax Vault contract + */ + function TERMMAX_VAULT_IMPLEMENTATION() external view returns (address); + + /** + * @notice Predict the address of a new TermMax vault + * @param deployer The address of the vault deployer + * @param asset The address of the asset + * @param name The name of the vault + * @param symbol The symbol of the vault + * @param salt The salt used to create the vault + * @return vault The predicted address of the vault + */ + function predictVaultAddress( + address deployer, + address asset, + string memory name, + string memory symbol, + uint256 salt + ) external view returns (address vault); + + /** + * @notice Creates a new TermMax vault with the specified parameters + * @param initialParams Initial parameters for vault configuration + * @param salt The salt used to create the vault + * @return address The address of the newly created vault + */ + function createVault(VaultInitialParamsV2 memory initialParams, uint256 salt) external returns (address); +} diff --git a/contracts/v2/factory/TermMaxVaultFactoryV2.sol b/contracts/v2/factory/TermMaxVaultFactoryV2.sol index 069edb4..a234669 100644 --- a/contracts/v2/factory/TermMaxVaultFactoryV2.sol +++ b/contracts/v2/factory/TermMaxVaultFactoryV2.sol @@ -2,19 +2,19 @@ pragma solidity ^0.8.27; import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol"; -import {VaultInitialParams} from "../../v1/storage/TermMaxStorage.sol"; import {FactoryErrors} from "../../v1/errors/FactoryErrors.sol"; -import {IVaultFactory} from "../../v1/factory/IVaultFactory.sol"; -import {ITermMaxVault} from "../../v1/vault/ITermMaxVault.sol"; +import {ITermMaxVaultV2} from "../vault/ITermMaxVaultV2.sol"; import {FactoryEventsV2} from "../events/FactoryEventsV2.sol"; +import {ITermMaxVaultFactoryV2} from "./ITermMaxVaultFactoryV2.sol"; +import {VaultInitialParamsV2} from "../storage/TermMaxStorageV2.sol"; /** * @title The TermMax vault factory v2 * @author Term Structure Labs */ -contract TermMaxVaultFactoryV2 is IVaultFactory { +contract TermMaxVaultFactoryV2 is ITermMaxVaultFactoryV2 { /** - * @notice The implementation of TermMax Vault contract + * @notice The implementation of TermMax Vault contract v2 */ address public immutable TERMMAX_VAULT_IMPLEMENTATION; @@ -26,7 +26,7 @@ contract TermMaxVaultFactoryV2 is IVaultFactory { } /** - * @inheritdoc IVaultFactory + * @inheritdoc ITermMaxVaultFactoryV2 */ function predictVaultAddress( address deployer, @@ -41,14 +41,14 @@ contract TermMaxVaultFactoryV2 is IVaultFactory { } /** - * @inheritdoc IVaultFactory + * @inheritdoc ITermMaxVaultFactoryV2 */ - function createVault(VaultInitialParams memory initialParams, uint256 salt) public returns (address vault) { + function createVault(VaultInitialParamsV2 memory initialParams, uint256 salt) public returns (address vault) { vault = Clones.cloneDeterministic( TERMMAX_VAULT_IMPLEMENTATION, keccak256(abi.encode(msg.sender, initialParams.asset, initialParams.name, initialParams.symbol, salt)) ); - ITermMaxVault(vault).initialize(initialParams); + ITermMaxVaultV2(vault).initialize(initialParams); emit FactoryEventsV2.CreateVault(vault, msg.sender, initialParams); } } diff --git a/contracts/v2/storage/TermMaxStorageV2.sol b/contracts/v2/storage/TermMaxStorageV2.sol new file mode 100644 index 0000000..4eaed88 --- /dev/null +++ b/contracts/v2/storage/TermMaxStorageV2.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +struct VaultInitialParamsV2 { + address admin; + address curator; + address guardian; + uint256 timelock; + IERC20 asset; + uint256 maxCapacity; + string name; + string symbol; + uint64 performanceFeeRate; + uint64 minApy; + uint64 minIdleFundRate; +} diff --git a/contracts/v2/vault/ITermMaxVaultV2.sol b/contracts/v2/vault/ITermMaxVaultV2.sol index 7a9f6a8..b1d2ba4 100644 --- a/contracts/v2/vault/ITermMaxVaultV2.sol +++ b/contracts/v2/vault/ITermMaxVaultV2.sol @@ -2,24 +2,92 @@ pragma solidity ^0.8.27; import {PendingAddress, PendingUint192} from "../../v1/lib/PendingLib.sol"; +import {VaultInitialParamsV2} from "../storage/TermMaxStorageV2.sol"; +/** + * @title ITermMaxVaultV2 + * @notice Interface for TermMax Vault V2 contract + * @dev This interface defines the core functionality for vault operations including + * initialization, APY management, and pending parameter updates with timelock mechanism + */ interface ITermMaxVaultV2 { - /// @notice Returns the apr based on accreting principal + /** + * @notice Initializes the vault with the provided parameters + * @dev This function should only be called once during contract deployment + * @param params The initial configuration parameters for the vault + */ + function initialize(VaultInitialParamsV2 memory params) external; + + /** + * @notice Returns the current annual percentage yield based on accreting principal + * @dev APY is calculated based on the vault's current performance and accruing interest + * @return The current APY as a uint256 value + */ function apy() external view returns (uint256); + /** + * @notice Returns the minimum guaranteed APY for the vault + * @dev This represents the floor APY that the vault aims to maintain + * @return The minimum APY as a uint64 value + */ function minApy() external view returns (uint64); + /** + * @notice Returns the minimum rate for idle funds in the vault + * @dev This rate applies to funds that are not actively deployed in strategies + * @return The minimum idle fund rate as a uint64 value + */ function minIdleFundRate() external view returns (uint64); + /** + * @notice Returns the pending minimum APY update details + * @dev Contains the proposed new value and timing information for the pending change + * @return PendingUint192 struct with pending minimum APY data + */ function pendingMinApy() external view returns (PendingUint192 memory); + + /** + * @notice Returns the pending minimum idle fund rate update details + * @dev Contains the proposed new value and timing information for the pending change + * @return PendingUint192 struct with pending minimum idle fund rate data + */ function pendingMinIdleFundRate() external view returns (PendingUint192 memory); + /** + * @notice Submits a new minimum APY for pending approval + * @dev Initiates a timelock period before the new minimum APY can be applied + * @param newMinApy The proposed new minimum APY value + */ function submitPendingMinApy(uint64 newMinApy) external; + + /** + * @notice Submits a new minimum idle fund rate for pending approval + * @dev Initiates a timelock period before the new rate can be applied + * @param newMinIdleFundRate The proposed new minimum idle fund rate + */ function submitPendingMinIdleFundRate(uint64 newMinIdleFundRate) external; + /** + * @notice Accepts and applies the pending minimum APY change + * @dev Can only be called after the timelock period has elapsed + */ function acceptPendingMinApy() external; + + /** + * @notice Accepts and applies the pending minimum idle fund rate change + * @dev Can only be called after the timelock period has elapsed + */ function acceptPendingMinIdleFundRate() external; + /** + * @notice Revokes the pending minimum APY change + * @dev Cancels the pending change and resets the pending state + */ function revokePendingMinApy() external; + + /** + * @notice Revokes the pending minimum idle fund rate change + * @dev Cancels the pending change and resets the pending state + */ function revokePendingMinIdleFundRate() external; } diff --git a/contracts/v2/vault/TermMaxVaultV2.sol b/contracts/v2/vault/TermMaxVaultV2.sol index 99017a4..907df40 100644 --- a/contracts/v2/vault/TermMaxVaultV2.sol +++ b/contracts/v2/vault/TermMaxVaultV2.sol @@ -19,7 +19,8 @@ import {Ownable2StepUpgradeable} from "@openzeppelin/contracts-upgradeable/acces import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; import {PendingLib, PendingAddress, PendingUint192} from "../../v1/lib/PendingLib.sol"; import {ITermMaxMarket} from "../../v1/ITermMaxMarket.sol"; -import {CurveCuts, VaultInitialParams} from "../../v1/storage/TermMaxStorage.sol"; +import {VaultInitialParams, CurveCuts} from "../../v1/storage/TermMaxStorage.sol"; +import {VaultInitialParamsV2} from "../storage/TermMaxStorageV2.sol"; import {ITermMaxOrder} from "../../v1/ITermMaxOrder.sol"; import {VaultConstants} from "../../v1/lib/VaultConstants.sol"; import {TransferUtils} from "../../v1/lib/TransferUtils.sol"; @@ -101,7 +102,7 @@ contract TermMaxVaultV2 is _disableInitializers(); } - function initialize(VaultInitialParams memory params) external virtual initializer { + function initialize(VaultInitialParamsV2 memory params) external virtual initializer { __ERC20_init(params.name, params.symbol); __Ownable_init(params.admin); __ERC4626_init(params.asset); @@ -110,9 +111,16 @@ contract TermMaxVaultV2 is _setPerformanceFeeRate(params.performanceFeeRate); _checkTimelockBounds(params.timelock); - _timelock = params.timelock; - _maxCapacity = params.maxCapacity; - _curator = params.curator; + _setTimelock(params.timelock); + _setMinApy(params.minApy); + _setMinIdleFundRate(params.minIdleFundRate); + _setGuardian(params.guardian); + _setCapacity(params.maxCapacity); + _setCurator(params.curator); + } + + function initialize(VaultInitialParams memory params) external virtual initializer { + revert VaultErrorsV2.UseVaultInitialParamsV2(); } function _setPerformanceFeeRate(uint64 newPerformanceFeeRate) internal { @@ -542,6 +550,10 @@ contract TermMaxVaultV2 is */ function setCapacity(uint256 newCapacity) external virtual onlyCuratorRole { if (newCapacity == _maxCapacity) revert AlreadySet(); + _setCapacity(newCapacity); + } + + function _setCapacity(uint256 newCapacity) internal { _maxCapacity = newCapacity; emit SetCapacity(_msgSender(), newCapacity); } @@ -627,9 +639,11 @@ contract TermMaxVaultV2 is */ function setCurator(address newCurator) external virtual onlyOwner { if (newCurator == _curator) revert AlreadySet(); + _setCurator(newCurator); + } + function _setCurator(address newCurator) internal { _curator = newCurator; - emit SetCurator(newCurator); } diff --git a/contracts/v2/vault/VaultStorageV2.sol b/contracts/v2/vault/VaultStorageV2.sol index 7f344f2..5cbd00e 100644 --- a/contracts/v2/vault/VaultStorageV2.sol +++ b/contracts/v2/vault/VaultStorageV2.sol @@ -1,8 +1,6 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.27; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {ITermMaxMarket} from "../../v1/ITermMaxMarket.sol"; import {PendingAddress, PendingUint192} from "../../v1/lib/PendingLib.sol"; import {OrderInfo} from "../../v1/vault/VaultStorage.sol"; diff --git a/test/v2/AccessManagerV2.t.sol b/test/v2/AccessManagerV2.t.sol index a505d11..e08ec56 100644 --- a/test/v2/AccessManagerV2.t.sol +++ b/test/v2/AccessManagerV2.t.sol @@ -25,6 +25,7 @@ import {ITermMaxVault, TermMaxVaultV2} from "contracts/v2/vault/TermMaxVaultV2.s import {Constants} from "contracts/v1/lib/Constants.sol"; import "contracts/v1/storage/TermMaxStorage.sol"; import {IOracleV2} from "contracts/v2/oracle/IOracleV2.sol"; +import {VaultInitialParamsV2} from "contracts/v2/storage/TermMaxStorageV2.sol"; contract AccessManagerTestV2 is Test { using JSONLoader for *; @@ -219,15 +220,18 @@ contract AccessManagerTestV2 is Test { function testBatchSetSwitch() public { // Create vault initialization parameters - VaultInitialParams memory params = VaultInitialParams({ + VaultInitialParamsV2 memory params = VaultInitialParamsV2({ admin: address(manager), curator: address(0), // Will be set through AccessManager + guardian: address(0), // Will be set through AccessManager timelock: 1 days, asset: IERC20(address(res.debt)), maxCapacity: 1000000e18, name: "Test Vault", symbol: "tVAULT", - performanceFeeRate: 0.2e8 // 20% + performanceFeeRate: 0.2e8, + minApy: 0, + minIdleFundRate: 0 }); // Deploy vault @@ -278,15 +282,18 @@ contract AccessManagerTestV2 is Test { address newCurator = vm.randomAddress(); // Create vault initialization parameters - VaultInitialParams memory params = VaultInitialParams({ + VaultInitialParamsV2 memory params = VaultInitialParamsV2({ admin: address(manager), curator: address(0), // Will be set through AccessManager + guardian: address(0), // Will be set through AccessManager timelock: 1 days, asset: IERC20(address(res.debt)), maxCapacity: 1000000e18, name: "Test Vault", symbol: "tVAULT", - performanceFeeRate: 0.2e8 // 20% + performanceFeeRate: 0.2e8, // 20% + minApy: 0, // 5% minimum APY + minIdleFundRate: 0 // 1% minimum idle fund rate }); // Deploy vault @@ -340,15 +347,19 @@ contract AccessManagerTestV2 is Test { address curator = vm.randomAddress(); // Create vault initialization parameters - VaultInitialParams memory params = VaultInitialParams({ + + VaultInitialParamsV2 memory params = VaultInitialParamsV2({ admin: address(manager), curator: curator, + guardian: address(0), timelock: 1 days, asset: IERC20(address(res.debt)), maxCapacity: 1000000e18, name: "Test Vault", symbol: "tVAULT", - performanceFeeRate: 0.2e8 + performanceFeeRate: 0.2e8, // 20% + minApy: 0, + minIdleFundRate: 0 }); // Deploy vault diff --git a/test/v2/VaultV2.t.sol b/test/v2/VaultV2.t.sol index 297911a..e880055 100644 --- a/test/v2/VaultV2.t.sol +++ b/test/v2/VaultV2.t.sol @@ -47,6 +47,7 @@ import {PendingUint192, PendingLib} from "contracts/v1/lib/PendingLib.sol"; import {VaultErrorsV2} from "contracts/v2/errors/VaultErrorsV2.sol"; import {IPausable} from "contracts/v1/access/AccessManager.sol"; import {VaultEventsV2} from "contracts/v2/events/VaultEventsV2.sol"; +import {VaultInitialParamsV2} from "contracts/v2/storage/TermMaxStorageV2.sol"; contract VaultTestV2 is Test { using JSONLoader for *; @@ -76,7 +77,7 @@ contract VaultTestV2 is Test { uint256 currentTime; uint32 maxLtv = 0.89e8; uint32 liquidationLtv = 0.9e8; - VaultInitialParams initialParams; + VaultInitialParamsV2 initialParams; function setUp() public { vm.startPrank(deployer); @@ -123,15 +124,23 @@ contract VaultTestV2 is Test { uint256 amount = 10000e8; - initialParams = VaultInitialParams( - deployer, curator, timelock, res.debt, maxCapacity, "Vault-DAI", "Vault-DAI", performanceFeeRate + initialParams = VaultInitialParamsV2( + deployer, + curator, + guardian, + timelock, + res.debt, + maxCapacity, + "Vault-DAI", + "Vault-DAI", + performanceFeeRate, + 0, + 0 ); vault = DeployUtils.deployVault(initialParams); vm.label(address(vault), "vault"); - - vault.submitGuardian(guardian); vm.label(guardian, "guardian"); vault.setIsAllocator(allocator, true); vm.label(allocator, "allocator"); diff --git a/test/v2/utils/DeployUtils.sol b/test/v2/utils/DeployUtils.sol index 3d3e59a..ad00851 100644 --- a/test/v2/utils/DeployUtils.sol +++ b/test/v2/utils/DeployUtils.sol @@ -30,6 +30,8 @@ import { CurveCut, CurveCuts } from "contracts/v1/storage/TermMaxStorage.sol"; +import {VaultInitialParamsV2} from "contracts/v2/storage/TermMaxStorageV2.sol"; +import {TermMaxVaultFactoryV2} from "contracts/v2/factory/TermMaxVaultFactoryV2.sol"; library DeployUtils { bytes32 constant GT_ERC20 = keccak256("GearingTokenWithERC20"); @@ -327,10 +329,10 @@ library DeployUtils { router = TermMaxRouterV2(address(proxy)); } - function deployVault(VaultInitialParams memory initialParams) public returns (ITermMaxVault vault) { + function deployVault(VaultInitialParamsV2 memory initialParams) public returns (ITermMaxVault vault) { OrderManagerV2 orderManager = new OrderManagerV2(); TermMaxVaultV2 implementation = new TermMaxVaultV2(address(orderManager)); - VaultFactory vaultFactory = new VaultFactory(address(implementation)); + TermMaxVaultFactoryV2 vaultFactory = new TermMaxVaultFactoryV2(address(implementation)); vault = ITermMaxVault(vaultFactory.createVault(initialParams, 0)); } From 8fa9893fa2a8fd49b5c464849da827e143854826 Mon Sep 17 00:00:00 2001 From: Evan Date: Wed, 11 Jun 2025 15:42:09 +0800 Subject: [PATCH 075/194] fork test --- test/v2/mainnet-fork/ForkBaseTestV2.sol | 9 ++++---- test/v2/mainnet-fork/VaultBaseTestV2.t.sol | 26 ++++++++++++++++++++-- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/test/v2/mainnet-fork/ForkBaseTestV2.sol b/test/v2/mainnet-fork/ForkBaseTestV2.sol index 8149397..ba7b705 100644 --- a/test/v2/mainnet-fork/ForkBaseTestV2.sol +++ b/test/v2/mainnet-fork/ForkBaseTestV2.sol @@ -16,7 +16,8 @@ import {SwapAdapter} from "contracts/v1/test/testnet/SwapAdapter.sol"; import {IOracleV2, OracleAggregatorV2} from "contracts/v2/oracle/OracleAggregatorV2.sol"; import {IOrderManager, OrderManager} from "contracts/v1/vault/OrderManager.sol"; import {ITermMaxVault, ITermMaxVaultV2, TermMaxVaultV2} from "contracts/v2/vault/TermMaxVaultV2.sol"; -import {VaultFactory, IVaultFactory} from "contracts/v1/factory/VaultFactory.sol"; +import {OrderManagerV2} from "contracts/v2/vault/OrderManagerV2.sol"; +import {TermMaxVaultFactoryV2} from "contracts/v2/factory/TermMaxVaultFactoryV2.sol"; import { MarketConfig, FeeConfig, @@ -149,10 +150,10 @@ abstract contract ForkBaseTestV2 is Test { factory = new TermMaxFactoryV2(admin, address(m)); } - function deployVaultFactory() public returns (VaultFactory vaultFactory) { - OrderManager orderManager = new OrderManager(); + function deployVaultFactory() public returns (TermMaxVaultFactoryV2 vaultFactory) { + OrderManagerV2 orderManager = new OrderManagerV2(); TermMaxVaultV2 implementation = new TermMaxVaultV2(address(orderManager)); - vaultFactory = new VaultFactory(address(implementation)); + vaultFactory = new TermMaxVaultFactoryV2(address(implementation)); } function deployOracleAggregator(address admin) public returns (OracleAggregatorV2 oracle) { diff --git a/test/v2/mainnet-fork/VaultBaseTestV2.t.sol b/test/v2/mainnet-fork/VaultBaseTestV2.t.sol index c694798..2ac76a3 100644 --- a/test/v2/mainnet-fork/VaultBaseTestV2.t.sol +++ b/test/v2/mainnet-fork/VaultBaseTestV2.t.sol @@ -30,7 +30,8 @@ import { FeeConfig, MarketInitialParams, LoanConfig, - VaultInitialParams + VaultInitialParams, + CurveCuts } from "contracts/v1/storage/TermMaxStorage.sol"; import {ITermMaxRouter, RouterEvents, RouterErrors} from "contracts/v1/router/TermMaxRouter.sol"; import {MockFlashLoanReceiver} from "contracts/v1/test/MockFlashLoanReceiver.sol"; @@ -51,8 +52,12 @@ import {VaultConstants} from "contracts/v1/lib/VaultConstants.sol"; import {PendingAddress, PendingUint192} from "contracts/v1/lib/PendingLib.sol"; import {ITermMaxVault} from "contracts/v1/vault/ITermMaxVault.sol"; import {ITermMaxVaultV2, VaultErrors, VaultEvents, TermMaxVaultV2} from "contracts/v2/vault/TermMaxVaultV2.sol"; +import {VaultInitialParamsV2} from "contracts/v2/storage/TermMaxStorageV2.sol"; +import {TermMaxVaultFactoryV2} from "contracts/v2/factory/TermMaxVaultFactoryV2.sol"; abstract contract VaultBaseTestV2 is ForkBaseTestV2 { + using SafeCast for *; + struct VaultTestRes { uint256 blockNumber; uint256 orderInitialAmount; @@ -69,7 +74,7 @@ abstract contract VaultBaseTestV2 is ForkBaseTestV2 { MockPriceFeed debtPriceFeed; ITermMaxOrder order; ITermMaxVault vault; - VaultInitialParams vaultInitialParams; + VaultInitialParamsV2 vaultInitialParams; uint256 currentTime; uint256 maxCapacity; address maker; @@ -215,6 +220,8 @@ abstract contract VaultBaseTestV2 is ForkBaseTestV2 { res.vault.deposit(amount2, lper2); vm.stopPrank(); + _depositToOrder(res.vault, res.order, amount2.toInt256()); + address borrower = vm.randomAddress(); vm.startPrank(borrower); deal(borrower, 1e18); @@ -234,6 +241,7 @@ abstract contract VaultBaseTestV2 is ForkBaseTestV2 { uint256 delivered = (propotion * collateralAmt) / Constants.DECIMAL_BASE_SQ; vm.startPrank(lper2); + res.vault.redeemOrder(res.order); res.vault.redeem(10e8, lper2, lper2); vm.stopPrank(); @@ -265,4 +273,18 @@ abstract contract VaultBaseTestV2 is ForkBaseTestV2 { res.order.swapExactTokenToToken(res.debtToken, res.xt, taker, tokenAmtIn, xtAmtOut, block.timestamp + 1 hours); vm.stopPrank(); } + + function _depositToOrder(ITermMaxVault vault, ITermMaxOrder order, int256 amount) internal { + vm.startPrank(vault.curator()); + CurveCuts[] memory curveCuts = new CurveCuts[](1); + curveCuts[0] = order.orderConfig().curveCuts; + int256[] memory amounts = new int256[](1); + amounts[0] = amount; + ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); + orders[0] = order; + uint256[] memory maxSupplies = new uint256[](1); + maxSupplies[0] = type(uint128).max; + vault.updateOrders(orders, amounts, maxSupplies, curveCuts); + vm.stopPrank(); + } } From 49ecd17f29ef18bef6fe2ad12d8d7b17ec5024e0 Mon Sep 17 00:00:00 2001 From: Evan Date: Wed, 11 Jun 2025 16:54:05 +0800 Subject: [PATCH 076/194] add nonTxReentrantBetweenActions modifier and update vault methods; enhance reentrancy protection --- .../v2/lib/TransactionReentrancyGuard.sol | 10 +++++ contracts/v2/vault/TermMaxVaultV2.sol | 9 +++- test/v2/VaultV2.t.sol | 42 +++++++++++++++++++ 3 files changed, 59 insertions(+), 2 deletions(-) diff --git a/contracts/v2/lib/TransactionReentrancyGuard.sol b/contracts/v2/lib/TransactionReentrancyGuard.sol index 136bf70..387ddc3 100644 --- a/contracts/v2/lib/TransactionReentrancyGuard.sol +++ b/contracts/v2/lib/TransactionReentrancyGuard.sol @@ -2,7 +2,10 @@ pragma solidity ^0.8.27; abstract contract TransactionReentrancyGuard { + /// @notice Error thrown when a reentrant call is detected in one transaction. error ReentrantCall(); + /// @notice Error thrown when a reentrant call is detected between actions. + error ReentrantCallBetweenActions(uint256 actionId, uint256 oldActionId); // keccak256(abi.encode(uint256(keccak256("termmax.tsstorage.TransactionReentrancyGuard")) - 1)) & ~bytes32(uint256(0xff)) uint256 private constant T_FLAG_STORE = 0x55d65f3b5821c66716708cd5119fc8b654f479bd23b96d0911cee85241904700; @@ -14,6 +17,13 @@ abstract contract TransactionReentrancyGuard { _; } + modifier nonTxReentrantBetweenActions(uint256 actionId) { + uint256 oldActionId = _getTxReentrancyGuardStorage(); + if (oldActionId != 0 && oldActionId != actionId) revert ReentrantCallBetweenActions(actionId, oldActionId); + _setTxReentrancyGuardStorage(actionId); + _; + } + function _getTxReentrancyGuardStorage() private view returns (uint256 reentrancyGuard) { assembly { reentrancyGuard := tload(T_FLAG_STORE) diff --git a/contracts/v2/vault/TermMaxVaultV2.sol b/contracts/v2/vault/TermMaxVaultV2.sol index 907df40..502defb 100644 --- a/contracts/v2/vault/TermMaxVaultV2.sol +++ b/contracts/v2/vault/TermMaxVaultV2.sol @@ -55,6 +55,9 @@ contract TermMaxVaultV2 is address public immutable ORDER_MANAGER_SINGLETON; + uint256 private constant ACTION_DEPOSIT = 1; + uint256 private constant ACTION_WITHDRAW = 2; + modifier onlyCuratorRole() { address sender = _msgSender(); if (sender != _curator && sender != owner()) revert NotCuratorRole(); @@ -448,7 +451,8 @@ contract TermMaxVaultV2 is function _deposit(address caller, address recipient, uint256 assets, uint256 shares) internal override - nonTxReentrant + nonReentrant + nonTxReentrantBetweenActions(ACTION_DEPOSIT) whenNotPaused { IERC20(asset()).safeTransferFrom(caller, address(this), assets); @@ -465,7 +469,8 @@ contract TermMaxVaultV2 is function _withdraw(address caller, address receiver, address owner, uint256 assets, uint256 shares) internal override - nonTxReentrant + nonReentrant + nonTxReentrantBetweenActions(ACTION_WITHDRAW) { if (caller != owner) { _spendAllowance(owner, caller, shares); diff --git a/test/v2/VaultV2.t.sol b/test/v2/VaultV2.t.sol index e880055..c3db7e1 100644 --- a/test/v2/VaultV2.t.sol +++ b/test/v2/VaultV2.t.sol @@ -49,6 +49,7 @@ import {IPausable} from "contracts/v1/access/AccessManager.sol"; import {VaultEventsV2} from "contracts/v2/events/VaultEventsV2.sol"; import {VaultInitialParamsV2} from "contracts/v2/storage/TermMaxStorageV2.sol"; +/// @dev use --isolate to run this tests contract VaultTestV2 is Test { using JSONLoader for *; using SafeCast for *; @@ -1342,4 +1343,45 @@ contract VaultTestV2 is Test { res.order.swapExactTokenToToken(res.debt, res.ft, taker, tokenAmtIn, ftAmtOut, block.timestamp + 1 hours); vm.stopPrank(); } + + // ========== Tests for ITermMaxVaultV2 nonTxReentrantBetweenActions ========== + /// @dev remove --isolate to run this test + function testMultipleDeposits() public { + ITermMaxVaultV2 vaultV2 = ITermMaxVaultV2(address(vault)); + + // Initial deposit + vm.startPrank(deployer); + res.debt.mint(deployer, 1000e8); + res.debt.approve(address(vault), 1000e8); + vault.deposit(1000e8, deployer); + vm.stopPrank(); + + // Second deposit + vm.startPrank(deployer); + res.debt.mint(deployer, 500e8); + res.debt.approve(address(vault), 500e8); + vault.deposit(500e8, deployer); + vm.stopPrank(); + } + + /// @dev remove --isolate to run this test + function testMultipleWithdrawals() public { + ITermMaxVaultV2 vaultV2 = ITermMaxVaultV2(address(vault)); + + _depositToOrder(vault, res.order, -10e8.toInt256()); + + // First withdrawal + vm.startPrank(deployer); + uint256 sharesToWithdraw = 1e2; + uint256 amountWithdrawn = vault.withdraw(sharesToWithdraw, deployer, deployer); + assertEq(amountWithdrawn, vault.previewWithdraw(sharesToWithdraw)); + vm.stopPrank(); + + // Second withdrawal + vm.startPrank(deployer); + sharesToWithdraw = 1e3; + amountWithdrawn = vault.withdraw(sharesToWithdraw, deployer, deployer); + assertEq(amountWithdrawn, vault.previewWithdraw(sharesToWithdraw)); + vm.stopPrank(); + } } From e89acc9d75e5dc24deef00784c0bc0fc05fed466 Mon Sep 17 00:00:00 2001 From: Evan Date: Fri, 13 Jun 2025 15:19:16 +0800 Subject: [PATCH 077/194] add minPrice parameter to IOracleV2 and update related contracts; enhance price range handling --- contracts/v2/oracle/IOracleV2.sol | 1 + contracts/v2/oracle/OracleAggregatorV2.sol | 42 ++++++++------ test/v2/AccessManagerV2.t.sol | 6 +- test/v2/GtV2.t.sol | 10 ++-- test/v2/OracleAggregatorV2.t.sol | 64 +++++++++++++++------ test/v2/mainnet-fork/GtBaseTestV2.t.sol | 5 +- test/v2/mainnet-fork/MarketBaseTestV2.t.sol | 5 +- test/v2/mainnet-fork/VaultBaseTestV2.t.sol | 4 +- test/v2/utils/DeployUtils.sol | 16 +++--- 9 files changed, 96 insertions(+), 57 deletions(-) diff --git a/contracts/v2/oracle/IOracleV2.sol b/contracts/v2/oracle/IOracleV2.sol index 684d06f..7265d62 100644 --- a/contracts/v2/oracle/IOracleV2.sol +++ b/contracts/v2/oracle/IOracleV2.sol @@ -24,6 +24,7 @@ interface IOracleV2 { AggregatorV3Interface aggregator; AggregatorV3Interface backupAggregator; int256 maxPrice; + int256 minPrice; uint32 heartbeat; uint32 backupHeartbeat; } diff --git a/contracts/v2/oracle/OracleAggregatorV2.sol b/contracts/v2/oracle/OracleAggregatorV2.sol index 9fccc25..89a2a01 100644 --- a/contracts/v2/oracle/OracleAggregatorV2.sol +++ b/contracts/v2/oracle/OracleAggregatorV2.sol @@ -63,6 +63,7 @@ contract OracleAggregatorV2 is IOracleV2, Ownable2Step { * @param aggregator The address of the primary aggregator * @param backupAggregator The address of the backup aggregator * @param maxPrice The maximum price cap for this asset (0 = no cap) + * @param minPrice The minimum price floor for this asset (0 = no floor) * @param heartbeat The staleness threshold for the primary aggregator * @param backupHeartbeat The staleness threshold for the backup aggregator */ @@ -71,6 +72,7 @@ contract OracleAggregatorV2 is IOracleV2, Ownable2Step { AggregatorV3Interface indexed aggregator, AggregatorV3Interface indexed backupAggregator, int256 maxPrice, + int256 minPrice, uint32 heartbeat, uint32 backupHeartbeat ); @@ -81,6 +83,7 @@ contract OracleAggregatorV2 is IOracleV2, Ownable2Step { * @param aggregator The address of the primary aggregator * @param backupAggregator The address of the backup aggregator * @param maxPrice The maximum price cap for this asset + * @param minPrice The minimum price floor for this asset (0 = no floor) * @param heartbeat The staleness threshold for the primary aggregator * @param backupHeartbeat The staleness threshold for the backup aggregator * @param validAt The timestamp when this pending oracle can be accepted @@ -90,6 +93,7 @@ contract OracleAggregatorV2 is IOracleV2, Ownable2Step { AggregatorV3Interface indexed aggregator, AggregatorV3Interface indexed backupAggregator, int256 maxPrice, + int256 minPrice, uint32 heartbeat, uint32 backupHeartbeat, uint64 validAt @@ -120,7 +124,7 @@ contract OracleAggregatorV2 is IOracleV2, Ownable2Step { // Handle oracle removal case if (address(oracle.aggregator) == address(0) && address(oracle.backupAggregator) == address(0)) { delete oracles[asset]; - emit UpdateOracle(asset, AggregatorV3Interface(address(0)), AggregatorV3Interface(address(0)), 0, 0, 0); + emit UpdateOracle(asset, AggregatorV3Interface(address(0)), AggregatorV3Interface(address(0)), 0, 0, 0, 0); return; } @@ -146,6 +150,7 @@ contract OracleAggregatorV2 is IOracleV2, Ownable2Step { oracle.aggregator, oracle.backupAggregator, oracle.maxPrice, + oracle.minPrice, oracle.heartbeat, oracle.backupHeartbeat, validAt @@ -169,7 +174,13 @@ contract OracleAggregatorV2 is IOracleV2, Ownable2Step { delete pendingOracles[asset]; emit UpdateOracle( - asset, oracle.aggregator, oracle.backupAggregator, oracle.maxPrice, oracle.heartbeat, oracle.backupHeartbeat + asset, + oracle.aggregator, + oracle.backupAggregator, + oracle.maxPrice, + oracle.minPrice, + oracle.heartbeat, + oracle.backupHeartbeat ); } @@ -195,14 +206,7 @@ contract OracleAggregatorV2 is IOracleV2, Ownable2Step { (, int256 answer,, uint256 updatedAt,) = oracle.aggregator.latestRoundData(); // Check if primary oracle is fresh and has positive price if ((oracle.heartbeat == 0 || oracle.heartbeat + updatedAt >= block.timestamp) && answer > 0) { - // Apply price cap if configured - if (oracle.maxPrice == 0 || answer <= oracle.maxPrice) { - return (uint256(answer), oracle.aggregator.decimals()); - } else if (address(oracle.backupAggregator) == address(0)) { - // No backup available, return capped price - return (uint256(oracle.maxPrice), oracle.aggregator.decimals()); - } - // Primary exceeds cap but backup exists, continue to backup check + return (uint256(_processPriceRange(answer, oracle)), oracle.aggregator.decimals()); } } @@ -211,17 +215,21 @@ contract OracleAggregatorV2 is IOracleV2, Ownable2Step { (, int256 answer,, uint256 updatedAt,) = oracle.backupAggregator.latestRoundData(); // Check if backup oracle is fresh and has positive price if ((oracle.backupHeartbeat == 0 || oracle.backupHeartbeat + updatedAt >= block.timestamp) && answer > 0) { - // Apply price cap if configured - if (oracle.maxPrice == 0 || answer <= oracle.maxPrice) { - return (uint256(answer), oracle.backupAggregator.decimals()); - } else { - // Return capped price using backup decimals - return (uint256(oracle.maxPrice), oracle.backupAggregator.decimals()); - } + return (uint256(_processPriceRange(answer, oracle)), oracle.backupAggregator.decimals()); } } // Both oracles failed or are stale revert OracleIsNotWorking(asset); } + + function _processPriceRange(int256 price, Oracle memory oracle) internal view returns (int256) { + if (oracle.maxPrice != 0 && price > oracle.maxPrice) { + return oracle.maxPrice; + } + if (oracle.minPrice != 0 && price < oracle.minPrice) { + return oracle.minPrice; + } + return price; + } } diff --git a/test/v2/AccessManagerV2.t.sol b/test/v2/AccessManagerV2.t.sol index e08ec56..176c7c4 100644 --- a/test/v2/AccessManagerV2.t.sol +++ b/test/v2/AccessManagerV2.t.sol @@ -532,7 +532,8 @@ contract AccessManagerTestV2 is Test { backupAggregator: AggregatorV3Interface(address(new MockPriceFeed(sender))), heartbeat: 3600, backupHeartbeat: 7200, - maxPrice: 1e8 + maxPrice: 1e8, + minPrice: 0 }); // Test that non-oracle role cannot submit pending oracle @@ -573,7 +574,8 @@ contract AccessManagerTestV2 is Test { backupAggregator: AggregatorV3Interface(address(new MockPriceFeed(sender))), heartbeat: 3600, backupHeartbeat: 7200, - maxPrice: 1e8 + maxPrice: 1e8, + minPrice: 0 }); // Submit a pending oracle diff --git a/test/v2/GtV2.t.sol b/test/v2/GtV2.t.sol index def78e2..fcae501 100644 --- a/test/v2/GtV2.t.sol +++ b/test/v2/GtV2.t.sol @@ -197,7 +197,7 @@ contract GtTestV2 is Test { vm.prank(deployer); res.oracle.submitPendingOracle( - address(res.collateral), IOracleV2.Oracle(res.collateralOracle, res.collateralOracle, 0, 3600, 3600) + address(res.collateral), IOracleV2.Oracle(res.collateralOracle, res.collateralOracle, 0, 0, 3600, 3600) ); res.oracle.acceptPendingOracle(address(res.collateral)); vm.warp(block.timestamp + 3600); @@ -213,7 +213,7 @@ contract GtTestV2 is Test { vm.startPrank(deployer); res.oracle.submitPendingOracle( - address(res.collateral), IOracleV2.Oracle(res.collateralOracle, res.collateralOracle, 0, 365 days, 0) + address(res.collateral), IOracleV2.Oracle(res.collateralOracle, res.collateralOracle, 0, 0, 365 days, 0) ); res.oracle.acceptPendingOracle(address(res.collateral)); vm.stopPrank(); @@ -721,7 +721,7 @@ contract GtTestV2 is Test { vm.prank(deployer); res.oracle.submitPendingOracle( - address(res.collateral), IOracleV2.Oracle(res.collateralOracle, res.collateralOracle, 0, 3500, 3500) + address(res.collateral), IOracleV2.Oracle(res.collateralOracle, res.collateralOracle, 0, 0, 3500, 3500) ); vm.prank(deployer); res.oracle.acceptPendingOracle(address(res.collateral)); @@ -733,7 +733,7 @@ contract GtTestV2 is Test { vm.prank(deployer); res.oracle.submitPendingOracle( - address(res.collateral), IOracleV2.Oracle(res.collateralOracle, res.collateralOracle, 0, 0, 0) + address(res.collateral), IOracleV2.Oracle(res.collateralOracle, res.collateralOracle, 0, 0, 0, 0) ); vm.prank(deployer); res.oracle.acceptPendingOracle(address(res.collateral)); @@ -1260,7 +1260,7 @@ contract GtTestV2 is Test { vm.prank(deployer); res.oracle.submitPendingOracle( - address(res.collateral), IOracleV2.Oracle(res.collateralOracle, res.collateralOracle, 0, 3600, 3600) + address(res.collateral), IOracleV2.Oracle(res.collateralOracle, res.collateralOracle, 0, 0, 3600, 3600) ); res.oracle.acceptPendingOracle(address(res.collateral)); diff --git a/test/v2/OracleAggregatorV2.t.sol b/test/v2/OracleAggregatorV2.t.sol index 0ce45d5..5a4bf38 100644 --- a/test/v2/OracleAggregatorV2.t.sol +++ b/test/v2/OracleAggregatorV2.t.sol @@ -16,6 +16,7 @@ contract OracleAggregatorTestV2 is Test { uint32 public constant HEARTBEAT = 1 hours; uint32 public constant BACKUP_HEARTBEAT = 2 hours; int256 public constant MAX_PRICE = 10000e8; + int256 public constant MIN_PRICE = 8000e8; // Price feed configuration uint8 public constant DECIMALS = 8; @@ -51,7 +52,8 @@ contract OracleAggregatorTestV2 is Test { backupAggregator: backupFeed, heartbeat: HEARTBEAT, backupHeartbeat: BACKUP_HEARTBEAT, - maxPrice: MAX_PRICE + maxPrice: MAX_PRICE, + minPrice: MIN_PRICE }); vm.prank(OWNER); @@ -62,6 +64,7 @@ contract OracleAggregatorTestV2 is Test { AggregatorV3Interface aggregator, AggregatorV3Interface backupAggregator, int256 maxPrice, + int256 minPrice, uint32 heartbeat, uint32 backupHeartbeat ) = oracleAggregator.oracles(ASSET); @@ -70,6 +73,7 @@ contract OracleAggregatorTestV2 is Test { assertEq(heartbeat, 0, "Heartbeat should not be set yet"); assertEq(backupHeartbeat, 0, "Backup heartbeat should not be set yet"); assertEq(maxPrice, 0, "Max price should not be set yet"); + assertEq(minPrice, 0, "Min price should not be set yet"); (IOracleV2.Oracle memory pendingOracle, uint64 validAt) = oracleAggregator.pendingOracles(ASSET); assertEq(address(pendingOracle.aggregator), address(primaryFeed)); @@ -87,7 +91,8 @@ contract OracleAggregatorTestV2 is Test { backupAggregator: backupFeed, heartbeat: HEARTBEAT, backupHeartbeat: BACKUP_HEARTBEAT, - maxPrice: MAX_PRICE + maxPrice: MAX_PRICE, + minPrice: MIN_PRICE }); vm.prank(OWNER); @@ -103,6 +108,7 @@ contract OracleAggregatorTestV2 is Test { AggregatorV3Interface aggregator, AggregatorV3Interface backupAggregator, int256 maxPrice, + int256 minPrice, uint32 heartbeat, uint32 backupHeartbeat ) = oracleAggregator.oracles(ASSET); @@ -111,6 +117,7 @@ contract OracleAggregatorTestV2 is Test { assertEq(heartbeat, HEARTBEAT); assertEq(backupHeartbeat, BACKUP_HEARTBEAT); assertEq(maxPrice, MAX_PRICE); + assertEq(minPrice, MIN_PRICE); // Verify pending oracle is cleared (IOracleV2.Oracle memory pendingOracle, uint64 validAt) = oracleAggregator.pendingOracles(ASSET); @@ -129,7 +136,8 @@ contract OracleAggregatorTestV2 is Test { backupAggregator: backupFeed, heartbeat: HEARTBEAT, backupHeartbeat: BACKUP_HEARTBEAT, - maxPrice: MAX_PRICE + maxPrice: MAX_PRICE, + minPrice: MIN_PRICE }); vm.startPrank(OWNER); @@ -163,7 +171,8 @@ contract OracleAggregatorTestV2 is Test { backupAggregator: backupFeed, heartbeat: HEARTBEAT, backupHeartbeat: BACKUP_HEARTBEAT, - maxPrice: MAX_PRICE + maxPrice: MAX_PRICE, + minPrice: MIN_PRICE }); vm.startPrank(OWNER); @@ -201,7 +210,8 @@ contract OracleAggregatorTestV2 is Test { backupAggregator: backupFeed, heartbeat: HEARTBEAT, backupHeartbeat: BACKUP_HEARTBEAT, - maxPrice: MAX_PRICE + maxPrice: MAX_PRICE, + minPrice: MIN_PRICE }); vm.startPrank(OWNER); @@ -225,7 +235,8 @@ contract OracleAggregatorTestV2 is Test { backupAggregator: backupFeed, heartbeat: HEARTBEAT, backupHeartbeat: BACKUP_HEARTBEAT, - maxPrice: MAX_PRICE + maxPrice: MAX_PRICE, + minPrice: MIN_PRICE }); vm.prank(address(0x3)); @@ -240,7 +251,8 @@ contract OracleAggregatorTestV2 is Test { backupAggregator: backupFeed, heartbeat: HEARTBEAT, backupHeartbeat: BACKUP_HEARTBEAT, - maxPrice: MAX_PRICE + maxPrice: MAX_PRICE, + minPrice: MIN_PRICE }); vm.prank(OWNER); @@ -257,7 +269,8 @@ contract OracleAggregatorTestV2 is Test { backupAggregator: backupFeed, heartbeat: HEARTBEAT, backupHeartbeat: BACKUP_HEARTBEAT, - maxPrice: MAX_PRICE + maxPrice: MAX_PRICE, + minPrice: MIN_PRICE }); vm.startPrank(OWNER); @@ -276,7 +289,8 @@ contract OracleAggregatorTestV2 is Test { backupAggregator: AggregatorV3Interface(address(0)), heartbeat: 0, backupHeartbeat: 0, - maxPrice: 0 + maxPrice: 0, + minPrice: 0 }) ); @@ -285,6 +299,7 @@ contract OracleAggregatorTestV2 is Test { AggregatorV3Interface aggregator, AggregatorV3Interface backupAggregator, int256 maxPrice, + int256 minPrice, uint32 heartbeat, uint32 backupHeartbeat ) = oracleAggregator.oracles(ASSET); @@ -293,6 +308,7 @@ contract OracleAggregatorTestV2 is Test { assertEq(heartbeat, 0); assertEq(backupHeartbeat, 0); assertEq(maxPrice, 0); + assertEq(minPrice, 0); } function test_GetPrice_PrimaryExceedsMaxPrice_NoBackup() public { @@ -302,7 +318,8 @@ contract OracleAggregatorTestV2 is Test { backupAggregator: AggregatorV3Interface(address(0)), heartbeat: HEARTBEAT, backupHeartbeat: 0, - maxPrice: MAX_PRICE + maxPrice: MAX_PRICE, + minPrice: MIN_PRICE }); vm.startPrank(OWNER); @@ -337,7 +354,8 @@ contract OracleAggregatorTestV2 is Test { backupAggregator: backupFeed, heartbeat: HEARTBEAT, backupHeartbeat: BACKUP_HEARTBEAT, - maxPrice: MAX_PRICE + maxPrice: MAX_PRICE, + minPrice: MIN_PRICE }); vm.startPrank(OWNER); @@ -385,7 +403,8 @@ contract OracleAggregatorTestV2 is Test { backupAggregator: backupFeed, heartbeat: HEARTBEAT, backupHeartbeat: BACKUP_HEARTBEAT, - maxPrice: MAX_PRICE + maxPrice: MAX_PRICE, + minPrice: MIN_PRICE }); vm.startPrank(OWNER); @@ -432,7 +451,8 @@ contract OracleAggregatorTestV2 is Test { backupAggregator: backupFeed, heartbeat: HEARTBEAT, backupHeartbeat: BACKUP_HEARTBEAT, - maxPrice: 0 // No price cap + maxPrice: 0, // No price cap + minPrice: MIN_PRICE }); vm.startPrank(OWNER); @@ -467,7 +487,8 @@ contract OracleAggregatorTestV2 is Test { backupAggregator: backupFeed, heartbeat: HEARTBEAT, backupHeartbeat: BACKUP_HEARTBEAT, - maxPrice: 0 // No price cap + maxPrice: 0, // No price cap + minPrice: MIN_PRICE }); vm.startPrank(OWNER); @@ -505,7 +526,8 @@ contract OracleAggregatorTestV2 is Test { backupAggregator: AggregatorV3Interface(address(0)), heartbeat: HEARTBEAT, backupHeartbeat: 0, - maxPrice: MAX_PRICE + maxPrice: MAX_PRICE, + minPrice: MIN_PRICE }); vm.startPrank(OWNER); @@ -540,7 +562,8 @@ contract OracleAggregatorTestV2 is Test { backupAggregator: AggregatorV3Interface(address(0)), heartbeat: HEARTBEAT, backupHeartbeat: 0, - maxPrice: MAX_PRICE + maxPrice: MAX_PRICE, + minPrice: MIN_PRICE }); vm.startPrank(OWNER); @@ -581,7 +604,8 @@ contract OracleAggregatorTestV2 is Test { backupAggregator: differentDecimalsFeed, heartbeat: HEARTBEAT, backupHeartbeat: BACKUP_HEARTBEAT, - maxPrice: MAX_PRICE + maxPrice: MAX_PRICE, + minPrice: MIN_PRICE }); vm.prank(OWNER); @@ -596,7 +620,8 @@ contract OracleAggregatorTestV2 is Test { backupAggregator: backupFeed, heartbeat: HEARTBEAT, backupHeartbeat: BACKUP_HEARTBEAT, - maxPrice: MAX_PRICE + maxPrice: MAX_PRICE, + minPrice: MIN_PRICE }); vm.prank(OWNER); @@ -631,7 +656,8 @@ contract OracleAggregatorTestV2 is Test { backupAggregator: backupFeed, heartbeat: HEARTBEAT, backupHeartbeat: BACKUP_HEARTBEAT, - maxPrice: MAX_PRICE + maxPrice: MAX_PRICE, + minPrice: MIN_PRICE }); vm.prank(OWNER); diff --git a/test/v2/mainnet-fork/GtBaseTestV2.t.sol b/test/v2/mainnet-fork/GtBaseTestV2.t.sol index 433406e..5a3c88c 100644 --- a/test/v2/mainnet-fork/GtBaseTestV2.t.sol +++ b/test/v2/mainnet-fork/GtBaseTestV2.t.sol @@ -108,10 +108,11 @@ abstract contract GtBaseTestV2 is ForkBaseTestV2 { res.debtPriceFeed = deployMockPriceFeed(res.marketInitialParams.admin); res.oracle.submitPendingOracle( address(res.marketInitialParams.collateral), - IOracleV2.Oracle(res.collateralPriceFeed, res.collateralPriceFeed, 0, 0, 0) + IOracleV2.Oracle(res.collateralPriceFeed, res.collateralPriceFeed, 0, 0, 0, 0) ); res.oracle.submitPendingOracle( - address(res.marketInitialParams.debtToken), IOracleV2.Oracle(res.debtPriceFeed, res.debtPriceFeed, 0, 0, 0) + address(res.marketInitialParams.debtToken), + IOracleV2.Oracle(res.debtPriceFeed, res.debtPriceFeed, 0, 0, 0, 0) ); res.oracle.acceptPendingOracle(address(res.marketInitialParams.collateral)); diff --git a/test/v2/mainnet-fork/MarketBaseTestV2.t.sol b/test/v2/mainnet-fork/MarketBaseTestV2.t.sol index e4d21ee..9a9f95a 100644 --- a/test/v2/mainnet-fork/MarketBaseTestV2.t.sol +++ b/test/v2/mainnet-fork/MarketBaseTestV2.t.sol @@ -87,10 +87,11 @@ abstract contract MarketBaseTestV2 is ForkBaseTestV2 { res.debtPriceFeed = deployMockPriceFeed(res.marketInitialParams.admin); res.oracle.submitPendingOracle( address(res.marketInitialParams.collateral), - IOracleV2.Oracle(res.collateralPriceFeed, res.collateralPriceFeed, 0, 0, 0) + IOracleV2.Oracle(res.collateralPriceFeed, res.collateralPriceFeed, 0, 0, 0, 0) ); res.oracle.submitPendingOracle( - address(res.marketInitialParams.debtToken), IOracleV2.Oracle(res.debtPriceFeed, res.debtPriceFeed, 0, 0, 0) + address(res.marketInitialParams.debtToken), + IOracleV2.Oracle(res.debtPriceFeed, res.debtPriceFeed, 0, 0, 0, 0) ); res.oracle.acceptPendingOracle(address(res.marketInitialParams.collateral)); res.oracle.acceptPendingOracle(address(res.marketInitialParams.debtToken)); diff --git a/test/v2/mainnet-fork/VaultBaseTestV2.t.sol b/test/v2/mainnet-fork/VaultBaseTestV2.t.sol index 2ac76a3..256594a 100644 --- a/test/v2/mainnet-fork/VaultBaseTestV2.t.sol +++ b/test/v2/mainnet-fork/VaultBaseTestV2.t.sol @@ -100,11 +100,11 @@ abstract contract VaultBaseTestV2 is ForkBaseTestV2 { res.debtPriceFeed = deployMockPriceFeed(res.marketInitialParams.admin); res.oracle.submitPendingOracle( address(res.marketInitialParams.collateral), - IOracleV2.Oracle(res.collateralPriceFeed, res.collateralPriceFeed, 365 days, 365 days, 0) + IOracleV2.Oracle(res.collateralPriceFeed, res.collateralPriceFeed, 365 days, 365 days, 0, 0) ); res.oracle.submitPendingOracle( address(res.marketInitialParams.debtToken), - IOracleV2.Oracle(res.debtPriceFeed, res.debtPriceFeed, 365 days, 365 days, 0) + IOracleV2.Oracle(res.debtPriceFeed, res.debtPriceFeed, 365 days, 365 days, 0, 0) ); res.oracle.acceptPendingOracle(address(res.marketInitialParams.collateral)); res.oracle.acceptPendingOracle(address(res.marketInitialParams.debtToken)); diff --git a/test/v2/utils/DeployUtils.sol b/test/v2/utils/DeployUtils.sol index ad00851..d153c4a 100644 --- a/test/v2/utils/DeployUtils.sol +++ b/test/v2/utils/DeployUtils.sol @@ -81,10 +81,10 @@ library DeployUtils { res.oracle = deployOracle(admin, 0); res.oracle.submitPendingOracle( - address(res.debt), IOracleV2.Oracle(res.debtOracle, res.debtOracle, 0, 365 days, 0) + address(res.debt), IOracleV2.Oracle(res.debtOracle, res.debtOracle, 0, 0, 365 days, 0) ); res.oracle.submitPendingOracle( - address(res.collateral), IOracleV2.Oracle(res.collateralOracle, res.collateralOracle, 0, 365 days, 0) + address(res.collateral), IOracleV2.Oracle(res.collateralOracle, res.collateralOracle, 0, 0, 365 days, 0) ); res.oracle.acceptPendingOracle(address(res.debt)); @@ -140,10 +140,10 @@ library DeployUtils { res.oracle = deployOracle(admin, 0); res.oracle.submitPendingOracle( - address(res.debt), IOracleV2.Oracle(res.debtOracle, res.debtOracle, 0, 365 days, 0) + address(res.debt), IOracleV2.Oracle(res.debtOracle, res.debtOracle, 0, 0, 365 days, 0) ); res.oracle.submitPendingOracle( - address(res.collateral), IOracleV2.Oracle(res.collateralOracle, res.collateralOracle, 0, 365 days, 0) + address(res.collateral), IOracleV2.Oracle(res.collateralOracle, res.collateralOracle, 0, 0, 365 days, 0) ); res.oracle.acceptPendingOracle(address(res.debt)); res.oracle.acceptPendingOracle(address(res.collateral)); @@ -200,10 +200,10 @@ library DeployUtils { res.oracle = deployOracle(admin, 0); res.oracle.submitPendingOracle( - address(res.debt), IOracleV2.Oracle(res.debtOracle, res.debtOracle, 0, 365 days, 0) + address(res.debt), IOracleV2.Oracle(res.debtOracle, res.debtOracle, 0, 0, 365 days, 0) ); res.oracle.submitPendingOracle( - address(res.collateral), IOracleV2.Oracle(res.collateralOracle, res.collateralOracle, 0, 365 days, 0) + address(res.collateral), IOracleV2.Oracle(res.collateralOracle, res.collateralOracle, 0, 0, 365 days, 0) ); res.oracle.acceptPendingOracle(address(res.debt)); res.oracle.acceptPendingOracle(address(res.collateral)); @@ -254,10 +254,10 @@ library DeployUtils { res.oracle = deployOracle(admin, 0); res.oracle.submitPendingOracle( - address(res.debt), IOracleV2.Oracle(res.debtOracle, res.debtOracle, 0, 365 days, 0) + address(res.debt), IOracleV2.Oracle(res.debtOracle, res.debtOracle, 0, 0, 365 days, 0) ); res.oracle.submitPendingOracle( - address(res.collateral), IOracleV2.Oracle(res.collateralOracle, res.collateralOracle, 0, 365 days, 0) + address(res.collateral), IOracleV2.Oracle(res.collateralOracle, res.collateralOracle, 0, 0, 365 days, 0) ); res.oracle.acceptPendingOracle(address(res.debt)); res.oracle.acceptPendingOracle(address(res.collateral)); From e390e6a3e4ec2a73270745555b48624fc09c9805 Mon Sep 17 00:00:00 2001 From: Evan Date: Fri, 13 Jun 2025 15:54:28 +0800 Subject: [PATCH 078/194] ut for minium price --- test/v2/OracleAggregatorV2.t.sol | 359 ++++++++++++++++++++++++++++++- 1 file changed, 355 insertions(+), 4 deletions(-) diff --git a/test/v2/OracleAggregatorV2.t.sol b/test/v2/OracleAggregatorV2.t.sol index 5a4bf38..0c500b6 100644 --- a/test/v2/OracleAggregatorV2.t.sol +++ b/test/v2/OracleAggregatorV2.t.sol @@ -2,6 +2,7 @@ pragma solidity ^0.8.27; import {Test} from "forge-std/Test.sol"; +import {console} from "forge-std/console.sol"; import {OracleAggregatorV2, IOracleV2, AggregatorV3Interface} from "contracts/v2/oracle/OracleAggregatorV2.sol"; import {MockPriceFeedV2} from "contracts/v2/test/MockPriceFeedV2.sol"; @@ -16,7 +17,7 @@ contract OracleAggregatorTestV2 is Test { uint32 public constant HEARTBEAT = 1 hours; uint32 public constant BACKUP_HEARTBEAT = 2 hours; int256 public constant MAX_PRICE = 10000e8; - int256 public constant MIN_PRICE = 8000e8; + int256 public constant MIN_PRICE = 1000e8; // Price feed configuration uint8 public constant DECIMALS = 8; @@ -376,10 +377,10 @@ contract OracleAggregatorTestV2 is Test { }); // Set backup price below maxPrice - int256 validBackupPrice = MAX_PRICE - 1000e8; + int256 backupPrice = MAX_PRICE - 1000e8; MockPriceFeedV2.RoundData memory backupRoundData = MockPriceFeedV2.RoundData({ roundId: 2, - answer: validBackupPrice, + answer: backupPrice, startedAt: block.timestamp, updatedAt: block.timestamp, answeredInRound: 2 @@ -392,7 +393,7 @@ contract OracleAggregatorTestV2 is Test { // Get price - should fallback to backup oracle (uint256 price, uint8 decimals) = oracleAggregator.getPrice(ASSET); - assertEq(price, uint256(validBackupPrice)); + assertEq(price, uint256(MAX_PRICE)); assertEq(decimals, DECIMALS); } @@ -519,6 +520,159 @@ contract OracleAggregatorTestV2 is Test { assertEq(decimals, DECIMALS); } + // ========== MIN PRICE TESTS ========== + + function test_GetPrice_PrimaryBelowMinPrice_WithBackup() public { + // Create an oracle with minPrice + IOracleV2.Oracle memory oracle = IOracleV2.Oracle({ + aggregator: primaryFeed, + backupAggregator: backupFeed, + heartbeat: HEARTBEAT, + backupHeartbeat: BACKUP_HEARTBEAT, + maxPrice: MAX_PRICE, + minPrice: MIN_PRICE + }); + + vm.startPrank(OWNER); + oracleAggregator.submitPendingOracle(ASSET, oracle); + vm.warp(block.timestamp + TIMELOCK + 1); + vm.stopPrank(); + + oracleAggregator.acceptPendingOracle(ASSET); + + // Set primary price below minPrice + int256 lowPrice = MIN_PRICE - 1000e8; + MockPriceFeedV2.RoundData memory primaryRoundData = MockPriceFeedV2.RoundData({ + roundId: 2, + answer: lowPrice, + startedAt: block.timestamp, + updatedAt: block.timestamp, + answeredInRound: 2 + }); + + // Set backup price above minPrice + int256 validBackupPrice = MIN_PRICE + 1000e8; + MockPriceFeedV2.RoundData memory backupRoundData = MockPriceFeedV2.RoundData({ + roundId: 2, + answer: validBackupPrice, + startedAt: block.timestamp, + updatedAt: block.timestamp, + answeredInRound: 2 + }); + + vm.startPrank(OWNER); + primaryFeed.updateRoundData(primaryRoundData); + backupFeed.updateRoundData(backupRoundData); + vm.stopPrank(); + + // Get price - should fallback to backup oracle + (uint256 price, uint8 decimals) = oracleAggregator.getPrice(ASSET); + assertEq(price, uint256(validBackupPrice)); + assertEq(decimals, DECIMALS); + } + + function test_GetPrice_PriceAtMinPrice() public { + // Create an oracle with minPrice + IOracleV2.Oracle memory oracle = IOracleV2.Oracle({ + aggregator: primaryFeed, + backupAggregator: backupFeed, + heartbeat: HEARTBEAT, + backupHeartbeat: BACKUP_HEARTBEAT, + maxPrice: MAX_PRICE, + minPrice: MIN_PRICE + }); + + vm.startPrank(OWNER); + oracleAggregator.submitPendingOracle(ASSET, oracle); + vm.warp(block.timestamp + TIMELOCK + 1); + vm.stopPrank(); + + oracleAggregator.acceptPendingOracle(ASSET); + + // Set price exactly at minPrice + MockPriceFeedV2.RoundData memory roundData = MockPriceFeedV2.RoundData({ + roundId: 2, + answer: MIN_PRICE, + startedAt: block.timestamp, + updatedAt: block.timestamp, + answeredInRound: 2 + }); + vm.prank(OWNER); + primaryFeed.updateRoundData(roundData); + + // Get price - should return the exact minPrice + (uint256 price, uint8 decimals) = oracleAggregator.getPrice(ASSET); + assertEq(price, uint256(MIN_PRICE)); + assertEq(decimals, DECIMALS); + } + + function test_GetPrice_CombinedMaxMinPriceConstraints() public { + // Create an oracle with both maxPrice and minPrice + IOracleV2.Oracle memory oracle = IOracleV2.Oracle({ + aggregator: primaryFeed, + backupAggregator: backupFeed, + heartbeat: HEARTBEAT, + backupHeartbeat: BACKUP_HEARTBEAT, + maxPrice: MAX_PRICE, + minPrice: MIN_PRICE + }); + + vm.startPrank(OWNER); + oracleAggregator.submitPendingOracle(ASSET, oracle); + vm.warp(block.timestamp + TIMELOCK + 1); + vm.stopPrank(); + + oracleAggregator.acceptPendingOracle(ASSET); + + // Test price below minPrice gets floored + int256 lowPrice = MIN_PRICE - 100e8; + MockPriceFeedV2.RoundData memory roundData = MockPriceFeedV2.RoundData({ + roundId: 2, + answer: lowPrice, + startedAt: block.timestamp, + updatedAt: block.timestamp, + answeredInRound: 2 + }); + vm.prank(OWNER); + primaryFeed.updateRoundData(roundData); + + (uint256 price, uint8 decimals) = oracleAggregator.getPrice(ASSET); + assertEq(price, uint256(MIN_PRICE)); + assertEq(decimals, DECIMALS); + + // Test price above maxPrice gets capped + int256 highPrice = MAX_PRICE + 1000e8; + roundData = MockPriceFeedV2.RoundData({ + roundId: 3, + answer: highPrice, + startedAt: block.timestamp, + updatedAt: block.timestamp, + answeredInRound: 3 + }); + vm.prank(OWNER); + primaryFeed.updateRoundData(roundData); + + (price, decimals) = oracleAggregator.getPrice(ASSET); + assertEq(price, uint256(MAX_PRICE)); + assertEq(decimals, DECIMALS); + + // Test price within range is unchanged + int256 validPrice = (MIN_PRICE + MAX_PRICE) / 2; // Middle value + roundData = MockPriceFeedV2.RoundData({ + roundId: 4, + answer: validPrice, + startedAt: block.timestamp, + updatedAt: block.timestamp, + answeredInRound: 4 + }); + vm.prank(OWNER); + primaryFeed.updateRoundData(roundData); + + (price, decimals) = oracleAggregator.getPrice(ASSET); + assertEq(price, uint256(validPrice)); + assertEq(decimals, DECIMALS); + } + function test_GetPrice_NoBackupAggregator() public { // Create an oracle with no backup aggregator IOracleV2.Oracle memory oracle = IOracleV2.Oracle({ @@ -669,4 +823,201 @@ contract OracleAggregatorTestV2 is Test { vm.expectRevert(abi.encodeWithSignature("OwnableUnauthorizedAccount(address)", nonOwner)); oracleAggregator.revokePendingOracle(ASSET); } + + // ========== MIN PRICE TESTS ========== + + function test_GetPrice_PrimaryBelowMinPrice_NoBackup() public { + // Create an oracle with minPrice and no backup + IOracleV2.Oracle memory oracle = IOracleV2.Oracle({ + aggregator: primaryFeed, + backupAggregator: AggregatorV3Interface(address(0)), + heartbeat: HEARTBEAT, + backupHeartbeat: 0, + maxPrice: MAX_PRICE, + minPrice: MIN_PRICE + }); + + vm.startPrank(OWNER); + oracleAggregator.submitPendingOracle(ASSET, oracle); + vm.warp(block.timestamp + TIMELOCK + 1); + vm.stopPrank(); + + oracleAggregator.acceptPendingOracle(ASSET); + + // Set primary price below minPrice + int256 lowPrice = MIN_PRICE - 100e8; + MockPriceFeedV2.RoundData memory roundData = MockPriceFeedV2.RoundData({ + roundId: 2, + answer: lowPrice, + startedAt: block.timestamp, + updatedAt: block.timestamp, + answeredInRound: 2 + }); + vm.prank(OWNER); + primaryFeed.updateRoundData(roundData); + + // Get price - should return minPrice instead of actual price + (uint256 price, uint8 decimals) = oracleAggregator.getPrice(ASSET); + assertEq(price, uint256(MIN_PRICE)); + assertEq(decimals, DECIMALS); + } + + function test_GetPrice_BothBelowMinPrice() public { + // Create an oracle with minPrice + IOracleV2.Oracle memory oracle = IOracleV2.Oracle({ + aggregator: primaryFeed, + backupAggregator: backupFeed, + heartbeat: HEARTBEAT, + backupHeartbeat: BACKUP_HEARTBEAT, + maxPrice: MAX_PRICE, + minPrice: MIN_PRICE + }); + + vm.startPrank(OWNER); + oracleAggregator.submitPendingOracle(ASSET, oracle); + vm.warp(block.timestamp + TIMELOCK + 1); + vm.stopPrank(); + + oracleAggregator.acceptPendingOracle(ASSET); + + // Set both primary and backup prices below minPrice + int256 lowPrimaryPrice = MIN_PRICE - 1000e8; + MockPriceFeedV2.RoundData memory primaryRoundData = MockPriceFeedV2.RoundData({ + roundId: 2, + answer: lowPrimaryPrice, + startedAt: block.timestamp, + updatedAt: block.timestamp, + answeredInRound: 2 + }); + + int256 lowBackupPrice = MIN_PRICE - 500e8; + MockPriceFeedV2.RoundData memory backupRoundData = MockPriceFeedV2.RoundData({ + roundId: 2, + answer: lowBackupPrice, + startedAt: block.timestamp, + updatedAt: block.timestamp, + answeredInRound: 2 + }); + + vm.startPrank(OWNER); + primaryFeed.updateRoundData(primaryRoundData); + backupFeed.updateRoundData(backupRoundData); + vm.stopPrank(); + + // Get price - should use backup capped at minPrice + (uint256 price, uint8 decimals) = oracleAggregator.getPrice(ASSET); + assertEq(price, uint256(MIN_PRICE)); + assertEq(decimals, DECIMALS); + } + + function test_GetPrice_WithMinPriceZero_PrimaryOracle() public { + // Create an oracle with minPrice set to 0 (no price floor) + IOracleV2.Oracle memory oracle = IOracleV2.Oracle({ + aggregator: primaryFeed, + backupAggregator: backupFeed, + heartbeat: HEARTBEAT, + backupHeartbeat: BACKUP_HEARTBEAT, + maxPrice: MAX_PRICE, + minPrice: 0 // No price floor + }); + + vm.startPrank(OWNER); + oracleAggregator.submitPendingOracle(ASSET, oracle); + vm.warp(block.timestamp + TIMELOCK + 1); + vm.stopPrank(); + + oracleAggregator.acceptPendingOracle(ASSET); + + // Set very low price that would normally be below any reasonable floor + int256 extremelyLowPrice = 1e8; // 1 unit + MockPriceFeedV2.RoundData memory roundData = MockPriceFeedV2.RoundData({ + roundId: 2, + answer: extremelyLowPrice, + startedAt: block.timestamp, + updatedAt: block.timestamp, + answeredInRound: 2 + }); + vm.prank(OWNER); + primaryFeed.updateRoundData(roundData); + + // Get price - should return the full price without flooring + (uint256 price, uint8 decimals) = oracleAggregator.getPrice(ASSET); + assertEq(price, uint256(extremelyLowPrice)); + assertEq(decimals, DECIMALS); + } + + function test_GetPrice_WithMinPriceZero_FallbackToBackup() public { + // Create an oracle with minPrice set to 0 (no price floor) + IOracleV2.Oracle memory oracle = IOracleV2.Oracle({ + aggregator: primaryFeed, + backupAggregator: backupFeed, + heartbeat: HEARTBEAT, + backupHeartbeat: BACKUP_HEARTBEAT, + maxPrice: MAX_PRICE, + minPrice: 0 // No price floor + }); + + vm.startPrank(OWNER); + oracleAggregator.submitPendingOracle(ASSET, oracle); + vm.warp(block.timestamp + TIMELOCK + 1); + vm.stopPrank(); + + oracleAggregator.acceptPendingOracle(ASSET); + + // Make primary oracle stale + vm.warp(block.timestamp + HEARTBEAT + 1); + + // Set very low price on backup oracle + int256 extremelyLowBackupPrice = 5e7; // 0.5 units + MockPriceFeedV2.RoundData memory roundData = MockPriceFeedV2.RoundData({ + roundId: 2, + answer: extremelyLowBackupPrice, + startedAt: block.timestamp, + updatedAt: block.timestamp, + answeredInRound: 2 + }); + vm.prank(OWNER); + backupFeed.updateRoundData(roundData); + + // Get price - should return the full backup price without flooring + (uint256 price, uint8 decimals) = oracleAggregator.getPrice(ASSET); + assertEq(price, uint256(extremelyLowBackupPrice)); + assertEq(decimals, DECIMALS); + } + + function test_GetPrice_PriceJustAboveMinPrice() public { + // Create an oracle with minPrice + IOracleV2.Oracle memory oracle = IOracleV2.Oracle({ + aggregator: primaryFeed, + backupAggregator: backupFeed, + heartbeat: HEARTBEAT, + backupHeartbeat: BACKUP_HEARTBEAT, + maxPrice: MAX_PRICE, + minPrice: MIN_PRICE + }); + + vm.startPrank(OWNER); + oracleAggregator.submitPendingOracle(ASSET, oracle); + vm.warp(block.timestamp + TIMELOCK + 1); + vm.stopPrank(); + + oracleAggregator.acceptPendingOracle(ASSET); + + // Set price just above minPrice + int256 priceAboveMin = MIN_PRICE + 1; + MockPriceFeedV2.RoundData memory roundData = MockPriceFeedV2.RoundData({ + roundId: 2, + answer: priceAboveMin, + startedAt: block.timestamp, + updatedAt: block.timestamp, + answeredInRound: 2 + }); + vm.prank(OWNER); + primaryFeed.updateRoundData(roundData); + + // Get price - should return the actual price without modification + (uint256 price, uint8 decimals) = oracleAggregator.getPrice(ASSET); + assertEq(price, uint256(priceAboveMin)); + assertEq(decimals, DECIMALS); + } } From a1ba351559320fcbba4ba3c1a0bb6b8b199707ad Mon Sep 17 00:00:00 2001 From: Evan Date: Fri, 13 Jun 2025 16:57:05 +0800 Subject: [PATCH 079/194] refactor: update action constants to use keccak256 for uniqueness; improve action ID handling --- contracts/v2/lib/TransactionReentrancyGuard.sol | 3 +++ contracts/v2/vault/TermMaxVaultV2.sol | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/contracts/v2/lib/TransactionReentrancyGuard.sol b/contracts/v2/lib/TransactionReentrancyGuard.sol index 387ddc3..29d307e 100644 --- a/contracts/v2/lib/TransactionReentrancyGuard.sol +++ b/contracts/v2/lib/TransactionReentrancyGuard.sol @@ -6,6 +6,8 @@ abstract contract TransactionReentrancyGuard { error ReentrantCall(); /// @notice Error thrown when a reentrant call is detected between actions. error ReentrantCallBetweenActions(uint256 actionId, uint256 oldActionId); + /// @notice Error thrown when an invalid action ID is provided. (0 and 1 are reserved for the guard itself) + error InvalidActionId(); // keccak256(abi.encode(uint256(keccak256("termmax.tsstorage.TransactionReentrancyGuard")) - 1)) & ~bytes32(uint256(0xff)) uint256 private constant T_FLAG_STORE = 0x55d65f3b5821c66716708cd5119fc8b654f479bd23b96d0911cee85241904700; @@ -18,6 +20,7 @@ abstract contract TransactionReentrancyGuard { } modifier nonTxReentrantBetweenActions(uint256 actionId) { + if (actionId <= 1) revert InvalidActionId(); uint256 oldActionId = _getTxReentrancyGuardStorage(); if (oldActionId != 0 && oldActionId != actionId) revert ReentrantCallBetweenActions(actionId, oldActionId); _setTxReentrancyGuardStorage(actionId); diff --git a/contracts/v2/vault/TermMaxVaultV2.sol b/contracts/v2/vault/TermMaxVaultV2.sol index 502defb..7ec5967 100644 --- a/contracts/v2/vault/TermMaxVaultV2.sol +++ b/contracts/v2/vault/TermMaxVaultV2.sol @@ -55,8 +55,8 @@ contract TermMaxVaultV2 is address public immutable ORDER_MANAGER_SINGLETON; - uint256 private constant ACTION_DEPOSIT = 1; - uint256 private constant ACTION_WITHDRAW = 2; + uint256 private constant ACTION_DEPOSIT = uint256(keccak256("ACTION_DEPOSIT")); + uint256 private constant ACTION_WITHDRAW = uint256(keccak256("ACTION_WITHDRAW")); modifier onlyCuratorRole() { address sender = _msgSender(); @@ -122,7 +122,7 @@ contract TermMaxVaultV2 is _setCurator(params.curator); } - function initialize(VaultInitialParams memory params) external virtual initializer { + function initialize(VaultInitialParams memory) external virtual initializer { revert VaultErrorsV2.UseVaultInitialParamsV2(); } From 36b54648d28e8c695ee75eb035b209f336e662c3 Mon Sep 17 00:00:00 2001 From: Evan Date: Fri, 13 Jun 2025 17:34:19 +0800 Subject: [PATCH 080/194] feat: implement PlaceOrderForV1 event and update related functions; enhance order placement logic --- contracts/v2/events/RouterEventsV2.sol | 25 ++++++++++++++++++ contracts/v2/router/ITermMaxRouterV2.sol | 24 ++++------------- contracts/v2/router/TermMaxRouterV2.sol | 33 ++++++++++++------------ test/v2/RouterV2.t.sol | 25 ++++++++++-------- 4 files changed, 61 insertions(+), 46 deletions(-) create mode 100644 contracts/v2/events/RouterEventsV2.sol diff --git a/contracts/v2/events/RouterEventsV2.sol b/contracts/v2/events/RouterEventsV2.sol new file mode 100644 index 0000000..1a65fc9 --- /dev/null +++ b/contracts/v2/events/RouterEventsV2.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {OrderConfig} from "../../v1/storage/TermMaxStorage.sol"; + +/** + * @title Router Events V2 + * @author Term Structure Labs + * @notice Interface defining events for the TermMax V2 protocol's router operations + */ +interface RouterEventsV2 { + /** + * @notice Emitted when a new order is placed in the TermMax V2 protocol + * @dev This event is triggered when a user places an order, providing details about the maker, + * the order itself, the market involved, and the configuration of the order. + * @param maker The address of the user who placed the order + * @param order The address of the new order contract + * @param market The address of the market where this order is placed + * @param gtId The id of the gearing token + * @param config The configuration details of the order, encapsulated in an OrderConfig struct + */ + event PlaceOrderForV1( + address indexed maker, address indexed order, address market, uint256 gtId, OrderConfig config + ); +} diff --git a/contracts/v2/router/ITermMaxRouterV2.sol b/contracts/v2/router/ITermMaxRouterV2.sol index 6668ac9..91f0971 100644 --- a/contracts/v2/router/ITermMaxRouterV2.sol +++ b/contracts/v2/router/ITermMaxRouterV2.sol @@ -6,7 +6,7 @@ import {ITermMaxMarket} from "../../v1/ITermMaxMarket.sol"; import {ITermMaxOrder} from "../../v1/ITermMaxOrder.sol"; import {SwapUnit} from "../../v1/router/ISwapAdapter.sol"; import {ISwapCallback} from "../../v1/ISwapCallback.sol"; -import {CurveCuts} from "../../v1/storage/TermMaxStorage.sol"; +import {OrderConfig} from "../../v1/storage/TermMaxStorage.sol"; /** * @title TermMax RouterV2 interface @@ -307,27 +307,13 @@ interface ITermMaxRouterV2 { uint256 minTokenOut ) external returns (uint256 redeemedAmt); - /** - * @notice Creates an order and deposits tokens - * @dev Creates a new order and deposits tokens to the market - * @param market The market to create order in - * @param maker Address of the order maker - * @param maxXtReserve Maximum amount of XT to reserve - * @param swapTrigger Swap trigger callback - * @param debtTokenToDeposit Amount of debt tokens to deposit - * @param ftToDeposit Amount of FT tokens to deposit - * @param xtToDeposit Amount of XT tokens to deposit - * @param curveCuts Curve cuts for the order - * @return order The created order - */ - function createOrderAndDeposit( + function placeOrderForV1( ITermMaxMarket market, address maker, - uint256 maxXtReserve, - ISwapCallback swapTrigger, + uint256 collateralToMintGt, uint256 debtTokenToDeposit, uint128 ftToDeposit, uint128 xtToDeposit, - CurveCuts memory curveCuts - ) external returns (ITermMaxOrder order); + OrderConfig memory orderConfig + ) external returns (ITermMaxOrder order, uint256 gtId); } diff --git a/contracts/v2/router/TermMaxRouterV2.sol b/contracts/v2/router/TermMaxRouterV2.sol index b95d381..38bb5be 100644 --- a/contracts/v2/router/TermMaxRouterV2.sol +++ b/contracts/v2/router/TermMaxRouterV2.sol @@ -24,11 +24,12 @@ import {IFlashRepayer} from "../../v1/tokens/IFlashRepayer.sol"; import {ITermMaxRouterV2} from "./ITermMaxRouterV2.sol"; import {IGearingToken} from "../../v1/tokens/IGearingToken.sol"; import {IGearingTokenV2} from "../../v2/tokens/IGearingTokenV2.sol"; -import {CurveCuts} from "../../v1/storage/TermMaxStorage.sol"; +import {CurveCuts, OrderConfig} from "../../v1/storage/TermMaxStorage.sol"; import {ISwapCallback} from "../../v1/ISwapCallback.sol"; import {Constants} from "../../v1/lib/Constants.sol"; import {MathLib} from "../../v1/lib/MathLib.sol"; import {IERC20SwapAdapter} from "./IERC20SwapAdapter.sol"; +import {RouterEventsV2} from "../events/RouterEventsV2.sol"; /** * @title TermMax Router V2 @@ -453,31 +454,31 @@ contract TermMaxRouterV2 is return redeemedAmt; } - function createOrderAndDeposit( + function placeOrderForV1( ITermMaxMarket market, address maker, - uint256 maxXtReserve, - ISwapCallback swapTrigger, + uint256 collateralToMintGt, uint256 debtTokenToDeposit, uint128 ftToDeposit, uint128 xtToDeposit, - CurveCuts memory curveCuts - ) external whenNotPaused returns (ITermMaxOrder order) { - (IERC20 ft, IERC20 xt,,, IERC20 debtToken) = market.tokens(); - order = market.createOrder(maker, maxXtReserve, swapTrigger, curveCuts); + OrderConfig memory orderConfig + ) external whenNotPaused returns (ITermMaxOrder order, uint256 gtId) { + (IERC20 ft, IERC20 xt, IGearingToken gt, address collateral, IERC20 debtToken) = market.tokens(); + if (collateralToMintGt > 0) { + IERC20(collateral).safeTransferFrom(msg.sender, address(this), collateralToMintGt); + IERC20(collateral).safeIncreaseAllowance(address(gt), collateralToMintGt); + (gtId,) = market.issueFt(maker, 0, _encodeAmount(collateralToMintGt)); + } + order = market.createOrder(maker, orderConfig.maxXtReserve, orderConfig.swapTrigger, orderConfig.curveCuts); + if (debtTokenToDeposit > 0) { debtToken.safeTransferFrom(msg.sender, address(this), debtTokenToDeposit); debtToken.safeIncreaseAllowance(address(market), debtTokenToDeposit); market.mint(address(order), debtTokenToDeposit); } - if (ftToDeposit > 0) { - ft.safeTransferFrom(msg.sender, address(order), ftToDeposit); - } - if (xtToDeposit > 0) { - xt.safeTransferFrom(msg.sender, address(order), xtToDeposit); - } - - emit CreateOrderAndDeposit(market, order, maker, debtTokenToDeposit, ftToDeposit, xtToDeposit, curveCuts); + ft.safeTransferFrom(msg.sender, address(order), ftToDeposit); + xt.safeTransferFrom(msg.sender, address(order), xtToDeposit); + emit RouterEventsV2.PlaceOrderForV1(maker, address(order), address(market), gtId, orderConfig); } function rolloverGt( diff --git a/test/v2/RouterV2.t.sol b/test/v2/RouterV2.t.sol index 402569d..bb903c4 100644 --- a/test/v2/RouterV2.t.sol +++ b/test/v2/RouterV2.t.sol @@ -681,29 +681,32 @@ contract RouterTestV2 is Test { vm.stopPrank(); } - function testCreateOrderAndDeposit() public { + function testPlaceOrderForV1() public { vm.startPrank(sender); - uint256 maxXtReserve = 1000e8; - - ISwapCallback swapTrigger = ISwapCallback(address(0)); uint256 debtTokenToDeposit = 1e8; uint128 ftToDeposit = 2e8; - uint128 xtToDeposit = 10e8; - CurveCuts memory curveCuts = orderConfig.curveCuts; - deal(address(res.ft), sender, ftToDeposit); - deal(address(res.xt), sender, xtToDeposit); + uint128 xtToDeposit = 0; + res.debt.mint(sender, debtTokenToDeposit); + deal(address(res.ft), sender, ftToDeposit); res.debt.approve(address(res.router), debtTokenToDeposit); res.ft.approve(address(res.router), ftToDeposit); res.xt.approve(address(res.router), xtToDeposit); - ITermMaxOrder order = res.router.createOrderAndDeposit( - res.market, maker, maxXtReserve, swapTrigger, debtTokenToDeposit, ftToDeposit, xtToDeposit, curveCuts + uint256 collateralToMintGt = 1e18; + res.collateral.mint(sender, collateralToMintGt); + res.collateral.approve(address(res.router), collateralToMintGt); + + (ITermMaxOrder order, uint256 gtId) = res.router.placeOrderForV1( + res.market, sender, collateralToMintGt, debtTokenToDeposit, ftToDeposit, xtToDeposit, orderConfig ); - assertEq(order.maker(), maker); + assertEq(gtId, 1); + assertEq(order.maker(), sender); assertEq(res.ft.balanceOf(address(order)), ftToDeposit + debtTokenToDeposit); assertEq(res.xt.balanceOf(address(order)), xtToDeposit + debtTokenToDeposit); + + vm.stopPrank(); } function testOrdersAndAmtsLengthNotMatch() public { From 918b2d6cd2fd330cde64fd9deed94ef3d9ee39de Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 16 Jun 2025 07:53:45 +0800 Subject: [PATCH 081/194] feat: add ITermMaxOrderV2 interface and related events; enhance order initialization logic --- contracts/v2/ITermMaxMarketV2.sol | 5 ++++ contracts/v2/ITermMaxOrderV2.sol | 25 ++++++++++++++++ contracts/v2/TermMaxMarketV2.sol | 34 ++++++++++++++++++---- contracts/v2/TermMaxOrderV2.sol | 41 +++++++++++++++++++-------- contracts/v2/errors/OrderErrorsV2.sol | 11 +++++++ contracts/v2/events/OrderEventsV2.sol | 19 +++++++++++++ 6 files changed, 118 insertions(+), 17 deletions(-) create mode 100644 contracts/v2/ITermMaxOrderV2.sol create mode 100644 contracts/v2/errors/OrderErrorsV2.sol create mode 100644 contracts/v2/events/OrderEventsV2.sol diff --git a/contracts/v2/ITermMaxMarketV2.sol b/contracts/v2/ITermMaxMarketV2.sol index d8869c5..cc4a362 100644 --- a/contracts/v2/ITermMaxMarketV2.sol +++ b/contracts/v2/ITermMaxMarketV2.sol @@ -1,6 +1,9 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; +import {OrderConfig} from "../v1/storage/TermMaxStorage.sol"; +import {ITermMaxOrder} from "../v1/ITermMaxOrder.sol"; + /** * @title TermMax Market V2 interface * @author Term Structure Labs @@ -47,4 +50,6 @@ interface ITermMaxMarketV2 { * @return deliveryData Encoded data containing collateral delivery information */ function redeem(address ftOwner, address recipient, uint256 ftAmount) external returns (uint256, bytes memory); + + function createOrder(address maker, OrderConfig memory orderconfig) external returns (ITermMaxOrder order); } diff --git a/contracts/v2/ITermMaxOrderV2.sol b/contracts/v2/ITermMaxOrderV2.sol new file mode 100644 index 0000000..699b6e9 --- /dev/null +++ b/contracts/v2/ITermMaxOrderV2.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {IERC20} from "../v1/tokens/IMintableERC20.sol"; +import {IGearingToken} from "../v1/tokens/IGearingToken.sol"; +import {OrderConfig, MarketConfig} from "../v1/storage/TermMaxStorage.sol"; +/** + * @title TermMax Order interface v2 + * @author Term Structure Labs + */ + +interface ITermMaxOrderV2 { + /// @notice Initialize the token and configuration of the order + /// @param maker The maker + /// @param tokens The tokens + /// @param gt The Gearing Token + /// @param orderConfig The order configuration + function initialize( + address maker, + IERC20[3] memory tokens, + IGearingToken gt, + OrderConfig memory orderConfig, + MarketConfig memory marketConfig + ) external; +} diff --git a/contracts/v2/TermMaxMarketV2.sol b/contracts/v2/TermMaxMarketV2.sol index e1e5f3d..12be235 100644 --- a/contracts/v2/TermMaxMarketV2.sol +++ b/contracts/v2/TermMaxMarketV2.sol @@ -17,11 +17,19 @@ import {MarketConstantsV2} from "./lib/MarketConstantsV2.sol"; import {MarketErrors} from "../v1/errors/MarketErrors.sol"; import {MarketEvents} from "../v1/events/MarketEvents.sol"; import {StringUtil} from "../v1/lib/StringUtil.sol"; -import {MarketConfig, MarketInitialParams, GtConfig, CurveCuts, FeeConfig} from "../v1/storage/TermMaxStorage.sol"; +import { + MarketConfig, + MarketInitialParams, + GtConfig, + CurveCuts, + FeeConfig, + OrderConfig +} from "../v1/storage/TermMaxStorage.sol"; import {ISwapCallback} from "../v1/ISwapCallback.sol"; import {TransferUtils} from "../v1/lib/TransferUtils.sol"; import {ITermMaxMarket, IMintableERC20, IERC20} from "../v1/ITermMaxMarket.sol"; import {IMintableERC20V2} from "./tokens/IMintableERC20V2.sol"; +import {ITermMaxOrderV2} from "./ITermMaxOrderV2.sol"; /** * @title TermMax Market V2 @@ -435,11 +443,27 @@ contract TermMaxMarketV2 is virtual nonReentrant isOpen - returns (ITermMaxOrder order) + returns (ITermMaxOrder) { - order = ITermMaxOrder(Clones.clone(TERMMAX_ORDER_IMPLEMENT)); - order.initialize(maker, [ft, xt, debtToken], gt, maxXtReserve, swapTrigger, curveCuts, _config); - emit CreateOrder(maker, order); + OrderConfig memory orderconfig; + orderconfig.maxXtReserve = maxXtReserve; + orderconfig.swapTrigger = swapTrigger; + orderconfig.curveCuts = curveCuts; + return _createOrder(maker, orderconfig); + } + + /** + * @inheritdoc ITermMaxMarketV2 + */ + function createOrder(address maker, OrderConfig memory orderconfig) external returns (ITermMaxOrder) { + return _createOrder(maker, orderconfig); + } + + function _createOrder(address maker, OrderConfig memory orderconfig) internal returns (ITermMaxOrder) { + address order = Clones.clone(TERMMAX_ORDER_IMPLEMENT); + ITermMaxOrderV2(order).initialize(maker, [ft, xt, debtToken], gt, orderconfig, _config); + emit CreateOrder(maker, ITermMaxOrder(order)); + return ITermMaxOrder(order); } function updateOrderFeeRate(ITermMaxOrder order, FeeConfig memory newFeeConfig) external virtual onlyOwner { diff --git a/contracts/v2/TermMaxOrderV2.sol b/contracts/v2/TermMaxOrderV2.sol index 32fdfd4..16cf464 100644 --- a/contracts/v2/TermMaxOrderV2.sol +++ b/contracts/v2/TermMaxOrderV2.sol @@ -19,6 +19,9 @@ import {OrderConfig, MarketConfig, CurveCuts, CurveCut, FeeConfig} from "../v1/s import {ISwapCallback} from "../v1/ISwapCallback.sol"; import {TransferUtils} from "../v1/lib/TransferUtils.sol"; import {ITermMaxMarketV2} from "./ITermMaxMarketV2.sol"; +import {ITermMaxOrderV2} from "./ITermMaxOrderV2.sol"; +import {OrderEventsV2} from "./events/OrderEventsV2.sol"; +import {OrderErrorsV2} from "./errors/OrderErrorsV2.sol"; /** * @title TermMax Order V2 @@ -26,6 +29,7 @@ import {ITermMaxMarketV2} from "./ITermMaxMarketV2.sol"; */ contract TermMaxOrderV2 is ITermMaxOrder, + ITermMaxOrderV2, ReentrancyGuardUpgradeable, Ownable2StepUpgradeable, PausableUpgradeable, @@ -48,8 +52,10 @@ contract TermMaxOrderV2 is uint64 private maturity; - uint256 private constant T_FT_RESERVE_STORE = 0; - uint256 private constant T_XT_RESERVE_STORE = 1; + // keccak256(abi.encode(uint256(keccak256("termmax.tsstorage.order.ftReserve")) - 1)) & ~bytes32(uint256(0xff)) + uint256 private constant T_FT_RESERVE_STORE = 0x2a12e4f8e6ef46c978fd57eac04c67eb8dcdc9f0eec6327794e0ab372ed36000; + // keccak256(abi.encode(uint256(keccak256("termmax.tsstorage.order.xtReserve")) - 1)) & ~bytes32(uint256(0xff)) + uint256 private constant T_XT_RESERVE_STORE = 0x2688c417e2e5b2d9eeee9f203d038d530482d06e29ca0badc05b91bdc9593000; function setInitialFtReserve(uint256 ftReserve) private { assembly { @@ -116,32 +122,43 @@ contract TermMaxOrderV2 is /** * @inheritdoc ITermMaxOrder */ + function initialize( + address, + IERC20[3] memory, + IGearingToken, + uint256, + ISwapCallback, + CurveCuts memory, + MarketConfig memory + ) external virtual override initializer { + revert OrderErrorsV2.UseOrderInitializationFunctionV2(); + } + + /** + * @inheritdoc ITermMaxOrderV2 + */ function initialize( address maker_, IERC20[3] memory tokens, IGearingToken gt_, - uint256 maxXtReserve_, - ISwapCallback swapTrigger, - CurveCuts memory curveCuts_, + OrderConfig memory orderConfig_, MarketConfig memory marketConfig ) external virtual override initializer { __Ownable_init(maker_); __ReentrancyGuard_init(); __Pausable_init(); market = ITermMaxMarket(_msgSender()); - - // _orderConfig.curveCuts = curveCuts_; - _updateCurve(curveCuts_); + _updateCurve(orderConfig_.curveCuts); _orderConfig.feeConfig = marketConfig.feeConfig; - _orderConfig.maxXtReserve = maxXtReserve_; - _orderConfig.swapTrigger = swapTrigger; + _orderConfig.maxXtReserve = orderConfig_.maxXtReserve; + _orderConfig.swapTrigger = orderConfig_.swapTrigger; maturity = marketConfig.maturity; - ft = tokens[0]; xt = tokens[1]; debtToken = tokens[2]; gt = gt_; - emit OrderInitialized(market, maker_, maxXtReserve_, swapTrigger, curveCuts_); + + emit OrderEventsV2.OrderInitialized(address(this), maker_, address(market), orderConfig_); } /** diff --git a/contracts/v2/errors/OrderErrorsV2.sol b/contracts/v2/errors/OrderErrorsV2.sol new file mode 100644 index 0000000..d3f40b1 --- /dev/null +++ b/contracts/v2/errors/OrderErrorsV2.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title Order Errors v2 + * @author Term Structure Labs + */ +interface OrderErrorsV2 { + /// @notice Error thrown when an invalid or unsupported functions is called + error UseOrderInitializationFunctionV2(); +} diff --git a/contracts/v2/events/OrderEventsV2.sol b/contracts/v2/events/OrderEventsV2.sol new file mode 100644 index 0000000..8541478 --- /dev/null +++ b/contracts/v2/events/OrderEventsV2.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {OrderConfig} from "../../v1/storage/TermMaxStorage.sol"; + +/** + * @title Order Events v2 + * @author Term Structure Labs + */ +interface OrderEventsV2 { + /// @notice Emitted when an order is initialized + /// @param order The address of the order contract + /// @param maker The address of the maker who created the order + /// @param market The address of the market associated with the order + /// @param orderConfig The configuration of the order + event OrderInitialized( + address indexed order, address indexed maker, address indexed market, OrderConfig orderConfig + ); +} From 4254b666f9561c1a62b3a1f986697e9c02690239 Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 16 Jun 2025 09:05:51 +0800 Subject: [PATCH 082/194] fix ut --- contracts/v2/TermMaxOrderV2.sol | 4 +++- contracts/v2/events/OrderEventsV2.sol | 5 +---- contracts/v2/test/MockOrderV2.sol | 32 +++++++++++++++++++++++++++ test/v2/MarketV2.t.sol | 7 +++--- 4 files changed, 39 insertions(+), 9 deletions(-) diff --git a/contracts/v2/TermMaxOrderV2.sol b/contracts/v2/TermMaxOrderV2.sol index 16cf464..7637b78 100644 --- a/contracts/v2/TermMaxOrderV2.sol +++ b/contracts/v2/TermMaxOrderV2.sol @@ -149,6 +149,7 @@ contract TermMaxOrderV2 is __Pausable_init(); market = ITermMaxMarket(_msgSender()); _updateCurve(orderConfig_.curveCuts); + _orderConfig.feeConfig = marketConfig.feeConfig; _orderConfig.maxXtReserve = orderConfig_.maxXtReserve; _orderConfig.swapTrigger = orderConfig_.swapTrigger; @@ -158,7 +159,8 @@ contract TermMaxOrderV2 is debtToken = tokens[2]; gt = gt_; - emit OrderEventsV2.OrderInitialized(address(this), maker_, address(market), orderConfig_); + orderConfig_.feeConfig = marketConfig.feeConfig; + emit OrderEventsV2.OrderInitialized(maker_, address(market), orderConfig_); } /** diff --git a/contracts/v2/events/OrderEventsV2.sol b/contracts/v2/events/OrderEventsV2.sol index 8541478..9c726fd 100644 --- a/contracts/v2/events/OrderEventsV2.sol +++ b/contracts/v2/events/OrderEventsV2.sol @@ -9,11 +9,8 @@ import {OrderConfig} from "../../v1/storage/TermMaxStorage.sol"; */ interface OrderEventsV2 { /// @notice Emitted when an order is initialized - /// @param order The address of the order contract /// @param maker The address of the maker who created the order /// @param market The address of the market associated with the order /// @param orderConfig The configuration of the order - event OrderInitialized( - address indexed order, address indexed maker, address indexed market, OrderConfig orderConfig - ); + event OrderInitialized(address indexed maker, address indexed market, OrderConfig orderConfig); } diff --git a/contracts/v2/test/MockOrderV2.sol b/contracts/v2/test/MockOrderV2.sol index 6258134..0cd4c85 100644 --- a/contracts/v2/test/MockOrderV2.sol +++ b/contracts/v2/test/MockOrderV2.sol @@ -17,6 +17,8 @@ import {OrderConfig, MarketConfig, CurveCuts, CurveCut, FeeConfig} from "../../v import {ISwapCallback} from "../../v1/ISwapCallback.sol"; import {TransferUtils} from "../../v1/lib/TransferUtils.sol"; import {ITermMaxMarketV2} from "../ITermMaxMarketV2.sol"; +import {OrderEventsV2} from "../events/OrderEventsV2.sol"; +import {ITermMaxOrderV2} from "../ITermMaxOrderV2.sol"; /** * @title TermMax Order @@ -24,6 +26,7 @@ import {ITermMaxMarketV2} from "../ITermMaxMarketV2.sol"; */ contract MockOrderV2 is ITermMaxOrder, + ITermMaxOrderV2, ReentrancyGuardUpgradeable, OwnableUpgradeable, PausableUpgradeable, @@ -111,6 +114,35 @@ contract MockOrderV2 is emit OrderInitialized(market, maker_, maxXtReserve_, swapTrigger, curveCuts_); } + /** + * @inheritdoc ITermMaxOrderV2 + */ + function initialize( + address maker_, + IERC20[3] memory tokens, + IGearingToken gt_, + OrderConfig memory orderConfig_, + MarketConfig memory marketConfig + ) external virtual override initializer { + __Ownable_init(maker_); + __ReentrancyGuard_init(); + __Pausable_init(); + market = ITermMaxMarket(_msgSender()); + _updateCurve(orderConfig_.curveCuts); + + _orderConfig.feeConfig = marketConfig.feeConfig; + _orderConfig.maxXtReserve = orderConfig_.maxXtReserve; + _orderConfig.swapTrigger = orderConfig_.swapTrigger; + maturity = marketConfig.maturity; + ft = tokens[0]; + xt = tokens[1]; + debtToken = tokens[2]; + gt = gt_; + + orderConfig_.feeConfig = marketConfig.feeConfig; + emit OrderEventsV2.OrderInitialized(maker_, address(market), orderConfig_); + } + /** * @inheritdoc ITermMaxOrder */ diff --git a/test/v2/MarketV2.t.sol b/test/v2/MarketV2.t.sol index e86cbe4..565dcaa 100644 --- a/test/v2/MarketV2.t.sol +++ b/test/v2/MarketV2.t.sol @@ -26,6 +26,7 @@ import { OrderConfig, CurveCuts } from "contracts/v1/storage/TermMaxStorage.sol"; +import {OrderEventsV2} from "contracts/v2/events/OrderEventsV2.sol"; contract MarketV2Test is Test { using JSONLoader for *; @@ -305,11 +306,9 @@ contract MarketV2Test is Test { function testCreateOrder() public { vm.startPrank(sender); - + orderConfig.feeConfig = res.market.config().feeConfig; vm.expectEmit(); - emit OrderEvents.OrderInitialized( - res.market, sender, orderConfig.maxXtReserve, ISwapCallback(address(0)), orderConfig.curveCuts - ); + emit OrderEventsV2.OrderInitialized(sender, address(res.market), orderConfig); ITermMaxOrder order = res.market.createOrder(sender, orderConfig.maxXtReserve, ISwapCallback(address(0)), orderConfig.curveCuts); assertEq(address(order.market()), address(res.market)); From 7053e0ee068bb8dfc3f0de2e489462f88c158100 Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 16 Jun 2025 09:21:04 +0800 Subject: [PATCH 083/194] feat: update PlaceOrder event and implement placeOrderForV2 function; enhance order placement logic --- contracts/v2/events/RouterEventsV2.sol | 4 +--- contracts/v2/router/TermMaxRouterV2.sol | 29 ++++++++++++++++++++++++- test/v2/RouterV2.t.sol | 28 ++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 4 deletions(-) diff --git a/contracts/v2/events/RouterEventsV2.sol b/contracts/v2/events/RouterEventsV2.sol index 1a65fc9..03d5008 100644 --- a/contracts/v2/events/RouterEventsV2.sol +++ b/contracts/v2/events/RouterEventsV2.sol @@ -19,7 +19,5 @@ interface RouterEventsV2 { * @param gtId The id of the gearing token * @param config The configuration details of the order, encapsulated in an OrderConfig struct */ - event PlaceOrderForV1( - address indexed maker, address indexed order, address market, uint256 gtId, OrderConfig config - ); + event PlaceOrder(address indexed maker, address indexed order, address market, uint256 gtId, OrderConfig config); } diff --git a/contracts/v2/router/TermMaxRouterV2.sol b/contracts/v2/router/TermMaxRouterV2.sol index 38bb5be..1463108 100644 --- a/contracts/v2/router/TermMaxRouterV2.sol +++ b/contracts/v2/router/TermMaxRouterV2.sol @@ -478,7 +478,34 @@ contract TermMaxRouterV2 is } ft.safeTransferFrom(msg.sender, address(order), ftToDeposit); xt.safeTransferFrom(msg.sender, address(order), xtToDeposit); - emit RouterEventsV2.PlaceOrderForV1(maker, address(order), address(market), gtId, orderConfig); + emit RouterEventsV2.PlaceOrder(maker, address(order), address(market), gtId, orderConfig); + } + + function placeOrderForV2( + ITermMaxMarket market, + address maker, + uint256 collateralToMintGt, + uint256 debtTokenToDeposit, + uint128 ftToDeposit, + uint128 xtToDeposit, + OrderConfig memory orderConfig + ) external whenNotPaused returns (ITermMaxOrder order, uint256 gtId) { + (IERC20 ft, IERC20 xt, IGearingToken gt, address collateral, IERC20 debtToken) = market.tokens(); + if (collateralToMintGt > 0) { + IERC20(collateral).safeTransferFrom(msg.sender, address(this), collateralToMintGt); + IERC20(collateral).safeIncreaseAllowance(address(gt), collateralToMintGt); + (orderConfig.gtId,) = market.issueFt(maker, 0, _encodeAmount(collateralToMintGt)); + } + order = ITermMaxMarketV2(address(market)).createOrder(maker, orderConfig); + + if (debtTokenToDeposit > 0) { + debtToken.safeTransferFrom(msg.sender, address(this), debtTokenToDeposit); + debtToken.safeIncreaseAllowance(address(market), debtTokenToDeposit); + market.mint(address(order), debtTokenToDeposit); + } + ft.safeTransferFrom(msg.sender, address(order), ftToDeposit); + xt.safeTransferFrom(msg.sender, address(order), xtToDeposit); + emit RouterEventsV2.PlaceOrder(maker, address(order), address(market), gtId, orderConfig); } function rolloverGt( diff --git a/test/v2/RouterV2.t.sol b/test/v2/RouterV2.t.sol index bb903c4..911b51c 100644 --- a/test/v2/RouterV2.t.sol +++ b/test/v2/RouterV2.t.sol @@ -709,6 +709,34 @@ contract RouterTestV2 is Test { vm.stopPrank(); } + function testPlaceOrderForV2() public { + vm.startPrank(sender); + + uint256 debtTokenToDeposit = 1e8; + uint128 ftToDeposit = 2e8; + uint128 xtToDeposit = 0; + + res.debt.mint(sender, debtTokenToDeposit); + deal(address(res.ft), sender, ftToDeposit); + res.debt.approve(address(res.router), debtTokenToDeposit); + res.ft.approve(address(res.router), ftToDeposit); + res.xt.approve(address(res.router), xtToDeposit); + uint256 collateralToMintGt = 1e18; + res.collateral.mint(sender, collateralToMintGt); + res.collateral.approve(address(res.router), collateralToMintGt); + + (ITermMaxOrder order, uint256 gtId) = res.router.placeOrderForV2( + res.market, sender, collateralToMintGt, debtTokenToDeposit, ftToDeposit, xtToDeposit, orderConfig + ); + + assertEq(gtId, order.orderConfig().gtId); + assertEq(order.maker(), sender); + assertEq(res.ft.balanceOf(address(order)), ftToDeposit + debtTokenToDeposit); + assertEq(res.xt.balanceOf(address(order)), xtToDeposit + debtTokenToDeposit); + + vm.stopPrank(); + } + function testOrdersAndAmtsLengthNotMatch() public { vm.startPrank(sender); From 1e2173ad19145dbccc809ccc8a0c7f02f46fe24d Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 16 Jun 2025 10:21:04 +0800 Subject: [PATCH 084/194] add check when dealing baddebt --- contracts/v2/errors/VaultErrorsV2.sol | 2 ++ contracts/v2/vault/TermMaxVaultV2.sol | 1 + test/v2/VaultV2.t.sol | 3 +++ 3 files changed, 6 insertions(+) diff --git a/contracts/v2/errors/VaultErrorsV2.sol b/contracts/v2/errors/VaultErrorsV2.sol index a039c67..2186256 100644 --- a/contracts/v2/errors/VaultErrorsV2.sol +++ b/contracts/v2/errors/VaultErrorsV2.sol @@ -6,6 +6,8 @@ pragma solidity ^0.8.0; * @author Term Structure Labs */ interface VaultErrorsV2 { + /// @notice Error thrown when dealing unexpected collateral + error CollateralIsAsset(); /// @notice Error thrown when an invalid or unsupported functions is called error UseVaultInitialParamsV2(); /// @notice Error thrown when an invalid or unsupported functions is called diff --git a/contracts/v2/vault/TermMaxVaultV2.sol b/contracts/v2/vault/TermMaxVaultV2.sol index 7ec5967..7028a27 100644 --- a/contracts/v2/vault/TermMaxVaultV2.sol +++ b/contracts/v2/vault/TermMaxVaultV2.sol @@ -503,6 +503,7 @@ contract TermMaxVaultV2 is nonReentrant returns (uint256 shares, uint256 collateralOut) { + if (collateral == asset()) revert VaultErrorsV2.CollateralIsAsset(); address caller = msg.sender; shares = previewWithdraw(badDebtAmt); uint256 maxShares = maxRedeem(owner); diff --git a/test/v2/VaultV2.t.sol b/test/v2/VaultV2.t.sol index c3db7e1..06d06b6 100644 --- a/test/v2/VaultV2.t.sol +++ b/test/v2/VaultV2.t.sol @@ -857,6 +857,9 @@ contract VaultTestV2 is Test { vm.expectRevert(abi.encodeWithSelector(VaultErrors.NoBadDebt.selector, address(res.collateral))); vault.dealBadDebt(address(res.collateral), 10e8, lper2, lper2); + vm.expectRevert(abi.encodeWithSelector(VaultErrorsV2.CollateralIsAsset.selector)); + vault.dealBadDebt(address(res.debt), 10e8, lper2, lper2); // Update to use asset() for the test + vm.stopPrank(); } From 3cef295f5ec3341b96f005a95146473e7da28807 Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 16 Jun 2025 16:21:13 +0800 Subject: [PATCH 085/194] add missing interace and comments --- contracts/v2/router/ITermMaxRouterV2.sol | 94 +++++++++++++++++++++++- contracts/v2/router/TermMaxRouterV2.sol | 19 ++++- 2 files changed, 109 insertions(+), 4 deletions(-) diff --git a/contracts/v2/router/ITermMaxRouterV2.sol b/contracts/v2/router/ITermMaxRouterV2.sol index 91f0971..6fab729 100644 --- a/contracts/v2/router/ITermMaxRouterV2.sol +++ b/contracts/v2/router/ITermMaxRouterV2.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.27; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {ITermMaxMarket} from "../../v1/ITermMaxMarket.sol"; +import {ITermMaxMarket, IGearingToken} from "../../v1/ITermMaxMarket.sol"; import {ITermMaxOrder} from "../../v1/ITermMaxOrder.sol"; import {SwapUnit} from "../../v1/router/ISwapAdapter.sol"; import {ISwapCallback} from "../../v1/ISwapCallback.sol"; @@ -307,6 +307,75 @@ interface ITermMaxRouterV2 { uint256 minTokenOut ) external returns (uint256 redeemedAmt); + /** + * @notice Rollover GT position to a new market with additional assets(dont support partial rollover) + * @dev This function allows users to rollover their GT position to a new market + * @param recipient The address that will receive the new GT token + * @param gt The GearingToken contract instance + * @param gtId The ID of the GT token being rolled over + * @param additionalAssets Amount of additional assets to add to the position + * @param units Array of swap units defining the external swap path + * @param nextMarket The next market to rollover into + * @param additionnalNextCollateral Additional collateral for the next market + * @param swapData Data for the termmax swap operation + * @param maxLtv Maximum loan-to-value ratio for the rollover + * @return newGtId The ID of the newly created GT token in the next market + */ + function rolloverGt( + address recipient, + IGearingToken gt, + uint256 gtId, + uint128 additionalAssets, + SwapUnit[] memory units, + ITermMaxMarket nextMarket, + uint256 additionnalNextCollateral, + TermMaxSwapData memory swapData, + uint128 maxLtv + ) external returns (uint256 newGtId); + + /** + * @notice Rollover GT position to a new market with additional assets(allow partial rollover) + * @dev This function allows users to rollover their GT position to a new market + * @param recipient The address that will receive the new GT token + * @param gt The GearingToken contract instance + * @param gtId The ID of the GT token being rolled over + * @param repayAmt Amount of debt to repay + * @param additionalAssets Amount of additional assets to add to the position + * @param removedCollateral Amount of collateral to remove from the position + * @param units Array of swap units defining the external swap path + * @param nextMarket The next market to rollover into + * @param additionnalNextCollateral Additional collateral for the next market + * @param swapData Data for the termmax swap operation + * @param maxLtv Maximum loan-to-value ratio for the rollover + * @return newGtId The ID of the newly created GT token in the next market + */ + function rolloverGtV2( + address recipient, + IGearingToken gt, + uint256 gtId, + uint128 repayAmt, + uint128 additionalAssets, + uint256 removedCollateral, + SwapUnit[] memory units, + ITermMaxMarket nextMarket, + uint256 additionnalNextCollateral, + TermMaxSwapData memory swapData, + uint128 maxLtv + ) external returns (uint256 newGtId); + + /** + * @notice Places an order and mints a GT token(The gt token will not be linked to the order) + * @dev This function is used to create a new order in the TermMax protocol + * @param market The market to place the order in + * @param maker The address of the maker placing the order + * @param collateralToMintGt Amount of collateral to mint GT tokens + * @param debtTokenToDeposit Amount of debt tokens to deposit + * @param ftToDeposit Amount of FT tokens to deposit + * @param xtToDeposit Amount of XT tokens to deposit + * @param orderConfig Configuration parameters for the order + * @return order The created ITermMaxOrder instance + * @return gtId The ID of the minted GT token + */ function placeOrderForV1( ITermMaxMarket market, address maker, @@ -316,4 +385,27 @@ interface ITermMaxRouterV2 { uint128 xtToDeposit, OrderConfig memory orderConfig ) external returns (ITermMaxOrder order, uint256 gtId); + + /** + * @notice Places an order and mints a GT token(the gt token will be linked to the order) + * @dev This function is used to create a new order in the TermMax protocol + * @param market The market to place the order in + * @param maker The address of the maker placing the order + * @param collateralToMintGt Amount of collateral to mint GT tokens + * @param debtTokenToDeposit Amount of debt tokens to deposit + * @param ftToDeposit Amount of FT tokens to deposit + * @param xtToDeposit Amount of XT tokens to deposit + * @param orderConfig Configuration parameters for the order + * @return order The created ITermMaxOrder instance + * @return gtId The ID of the minted GT token + */ + function placeOrderForV2( + ITermMaxMarket market, + address maker, + uint256 collateralToMintGt, + uint256 debtTokenToDeposit, + uint128 ftToDeposit, + uint128 xtToDeposit, + OrderConfig memory orderConfig + ) external returns (ITermMaxOrder order, uint256 gtId); } diff --git a/contracts/v2/router/TermMaxRouterV2.sol b/contracts/v2/router/TermMaxRouterV2.sol index 1463108..fef3c91 100644 --- a/contracts/v2/router/TermMaxRouterV2.sol +++ b/contracts/v2/router/TermMaxRouterV2.sol @@ -1,7 +1,6 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.27; -import {IERC4626} from "@openzeppelin/contracts/interfaces/IERC4626.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {IERC721Enumerable} from "@openzeppelin/contracts/interfaces/IERC721Enumerable.sol"; import {IERC721Receiver} from "@openzeppelin/contracts/interfaces/IERC721Receiver.sol"; @@ -23,9 +22,8 @@ import {IFlashLoanReceiver} from "../../v1/IFlashLoanReceiver.sol"; import {IFlashRepayer} from "../../v1/tokens/IFlashRepayer.sol"; import {ITermMaxRouterV2} from "./ITermMaxRouterV2.sol"; import {IGearingToken} from "../../v1/tokens/IGearingToken.sol"; -import {IGearingTokenV2} from "../../v2/tokens/IGearingTokenV2.sol"; +import {IGearingTokenV2} from "../tokens/IGearingTokenV2.sol"; import {CurveCuts, OrderConfig} from "../../v1/storage/TermMaxStorage.sol"; -import {ISwapCallback} from "../../v1/ISwapCallback.sol"; import {Constants} from "../../v1/lib/Constants.sol"; import {MathLib} from "../../v1/lib/MathLib.sol"; import {IERC20SwapAdapter} from "./IERC20SwapAdapter.sol"; @@ -435,6 +433,9 @@ contract TermMaxRouterV2 is emit RepayByTokenThroughFt(market, gtId, msg.sender, recipient, repayAmt, returnAmt); } + /** + * @inheritdoc ITermMaxRouterV2 + */ function redeemAndSwap( address recipient, ITermMaxMarket market, @@ -454,6 +455,9 @@ contract TermMaxRouterV2 is return redeemedAmt; } + /** + * @inheritdoc ITermMaxRouterV2 + */ function placeOrderForV1( ITermMaxMarket market, address maker, @@ -481,6 +485,9 @@ contract TermMaxRouterV2 is emit RouterEventsV2.PlaceOrder(maker, address(order), address(market), gtId, orderConfig); } + /** + * @inheritdoc ITermMaxRouterV2 + */ function placeOrderForV2( ITermMaxMarket market, address maker, @@ -508,6 +515,9 @@ contract TermMaxRouterV2 is emit RouterEventsV2.PlaceOrder(maker, address(order), address(market), gtId, orderConfig); } + /** + * @inheritdoc ITermMaxRouterV2 + */ function rolloverGt( address recipient, IGearingToken gt, @@ -543,6 +553,9 @@ contract TermMaxRouterV2 is } } + /** + * @inheritdoc ITermMaxRouterV2 + */ function rolloverGtV2( address recipient, IGearingToken gt, From 7b2c976e9b7ffca285b5e0218c9bf4b161549e80 Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 17 Jun 2025 11:01:33 +0800 Subject: [PATCH 086/194] fix: change _processPriceRange function to internal pure for better gas efficiency --- contracts/v2/oracle/OracleAggregatorV2.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/v2/oracle/OracleAggregatorV2.sol b/contracts/v2/oracle/OracleAggregatorV2.sol index 89a2a01..3c94498 100644 --- a/contracts/v2/oracle/OracleAggregatorV2.sol +++ b/contracts/v2/oracle/OracleAggregatorV2.sol @@ -223,7 +223,7 @@ contract OracleAggregatorV2 is IOracleV2, Ownable2Step { revert OracleIsNotWorking(asset); } - function _processPriceRange(int256 price, Oracle memory oracle) internal view returns (int256) { + function _processPriceRange(int256 price, Oracle memory oracle) internal pure returns (int256) { if (oracle.maxPrice != 0 && price > oracle.maxPrice) { return oracle.maxPrice; } From 00f49685cd9b3314efdf2211c6eb0baa877e1a4c Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 19 Jun 2025 10:32:22 +0800 Subject: [PATCH 087/194] fix issue no.1 --- contracts/v2/lib/OnlyProxyCall.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/v2/lib/OnlyProxyCall.sol b/contracts/v2/lib/OnlyProxyCall.sol index 1a4e2df..5f35673 100644 --- a/contracts/v2/lib/OnlyProxyCall.sol +++ b/contracts/v2/lib/OnlyProxyCall.sol @@ -14,7 +14,7 @@ abstract contract OnlyProxyCall { /// @notice Modifier to restrict function calls to only be made through the proxy /// @dev This ensures that the function can only be called via the proxy contract, preventing direct calls modifier onlyProxy() { - require(msg.sender != address(this), OnlyCallableThroughProxy()); + require(addressThis != address(this), OnlyCallableThroughProxy()); _; } } From b940cba28c3cb6d1743424137e05d4347f55bc66 Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 19 Jun 2025 10:34:18 +0800 Subject: [PATCH 088/194] add comments --- contracts/v2/router/swapAdapters/ERC20SwapAdapterV2.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/v2/router/swapAdapters/ERC20SwapAdapterV2.sol b/contracts/v2/router/swapAdapters/ERC20SwapAdapterV2.sol index b2a61fa..942d1ca 100644 --- a/contracts/v2/router/swapAdapters/ERC20SwapAdapterV2.sol +++ b/contracts/v2/router/swapAdapters/ERC20SwapAdapterV2.sol @@ -9,7 +9,7 @@ import {OnlyProxyCall} from "../../lib/OnlyProxyCall.sol"; /** * @title TermMax ERC20SwapAdapter V2 * @author Term Structure Labs - * @notice This contract facilitates ERC20 token swaps with additional features. + * @notice This contract is an abstract base for ERC20 swap adapters in the TermMax protocol. */ abstract contract ERC20SwapAdapterV2 is IERC20SwapAdapter, OnlyProxyCall { using TransferUtilsV2 for IERC20; From a0a81dd389ab231c6301eb41580d3ba2b1c5f05f Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 19 Jun 2025 10:37:00 +0800 Subject: [PATCH 089/194] fix issue no.4 --- contracts/v2/router/swapAdapters/ERC4626VaultAdapterV2.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/v2/router/swapAdapters/ERC4626VaultAdapterV2.sol b/contracts/v2/router/swapAdapters/ERC4626VaultAdapterV2.sol index c9cae1a..b341e67 100644 --- a/contracts/v2/router/swapAdapters/ERC4626VaultAdapterV2.sol +++ b/contracts/v2/router/swapAdapters/ERC4626VaultAdapterV2.sol @@ -28,9 +28,9 @@ contract ERC4626VaultAdapterV2 is ERC20SwapAdapterV2 { { (Action action, uint256 inAmount, uint256 minTokenOut) = abi.decode(swapData, (Action, uint256, uint256)); /** - * Note: Scaling Input/Output amount + * Note: Scaling Input/Output amount (round up) */ - minTokenOut = (minTokenOut * amount) / inAmount; + minTokenOut = (minTokenOut * amount + inAmount - 1) / inAmount; if (action == Action.Deposit) { tokenIn.safeIncreaseAllowance(address(tokenOut), amount); From 4a758c08850b041f4025f5fecbd13a0f2d5e5585 Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 19 Jun 2025 10:48:23 +0800 Subject: [PATCH 090/194] round up div operations --- contracts/v2/router/swapAdapters/KyberswapV2AdapterV2.sol | 2 +- contracts/v2/router/swapAdapters/OdosV2AdapterV2.sol | 2 +- contracts/v2/router/swapAdapters/PendleSwapV3AdapterV2.sol | 2 +- contracts/v2/router/swapAdapters/UniswapV3AdapterV2.sol | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/v2/router/swapAdapters/KyberswapV2AdapterV2.sol b/contracts/v2/router/swapAdapters/KyberswapV2AdapterV2.sol index ff676d9..685599e 100644 --- a/contracts/v2/router/swapAdapters/KyberswapV2AdapterV2.sol +++ b/contracts/v2/router/swapAdapters/KyberswapV2AdapterV2.sol @@ -29,7 +29,7 @@ contract KyberswapV2AdapterV2 is ERC20SwapAdapterV2 { KYBER_SCALING_HELPER = scalingHelper_; // 0x2f577A41BeC1BE1152AeEA12e73b7391d15f655D } - function _swap(address receipient, IERC20 tokenIn, IERC20, uint256 amountIn, bytes memory swapData) + function _swap(address, IERC20 tokenIn, IERC20, uint256 amountIn, bytes memory swapData) internal virtual override diff --git a/contracts/v2/router/swapAdapters/OdosV2AdapterV2.sol b/contracts/v2/router/swapAdapters/OdosV2AdapterV2.sol index a859268..eed790e 100644 --- a/contracts/v2/router/swapAdapters/OdosV2AdapterV2.sol +++ b/contracts/v2/router/swapAdapters/OdosV2AdapterV2.sol @@ -57,7 +57,7 @@ contract OdosV2AdapterV2 is ERC20SwapAdapterV2 { * Note: Scaling Input/Output amount */ tokenInfo.outputQuote = (tokenInfo.outputQuote * amountIn) / tokenInfo.inputAmount; - tokenInfo.outputMin = (tokenInfo.outputMin * amountIn) / tokenInfo.inputAmount; + tokenInfo.outputMin = (tokenInfo.outputMin * amountIn + tokenInfo.inputAmount - 1) / tokenInfo.inputAmount; tokenInfo.inputAmount = amountIn; tokenInfo.outputReceiver = receipient; diff --git a/contracts/v2/router/swapAdapters/PendleSwapV3AdapterV2.sol b/contracts/v2/router/swapAdapters/PendleSwapV3AdapterV2.sol index 1cf6a1f..8f3a84d 100644 --- a/contracts/v2/router/swapAdapters/PendleSwapV3AdapterV2.sol +++ b/contracts/v2/router/swapAdapters/PendleSwapV3AdapterV2.sol @@ -36,7 +36,7 @@ contract PendleSwapV3AdapterV2 is ERC20SwapAdapterV2, PendleHelper { /** * Note: Scaling Input/Output amount */ - minTokenOut = (minTokenOut * amount) / inAmount; + minTokenOut = (minTokenOut * amount + inAmount - 1) / inAmount; if (tokenOut == PT) { (tokenOutAmt,,) = router.swapExactTokenForPt( receipient, diff --git a/contracts/v2/router/swapAdapters/UniswapV3AdapterV2.sol b/contracts/v2/router/swapAdapters/UniswapV3AdapterV2.sol index 9213a92..e14abc3 100644 --- a/contracts/v2/router/swapAdapters/UniswapV3AdapterV2.sol +++ b/contracts/v2/router/swapAdapters/UniswapV3AdapterV2.sol @@ -29,7 +29,7 @@ contract UniswapV3AdapterV2 is ERC20SwapAdapterV2 { /** * Note: Scaling Input/Output amount */ - amountOutMinimum = (amountOutMinimum * amount) / inAmount; + amountOutMinimum = (amountOutMinimum * amount + inAmount - 1) / inAmount; tokenOutAmt = router.exactInput( ISwapRouter.ExactInputParams({ From f65af75227664b898d4eceaabfa38c2ebc80073b Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 19 Jun 2025 10:49:37 +0800 Subject: [PATCH 091/194] fix issue no.8 --- contracts/v2/router/swapAdapters/ERC4626VaultAdapterV2.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/contracts/v2/router/swapAdapters/ERC4626VaultAdapterV2.sol b/contracts/v2/router/swapAdapters/ERC4626VaultAdapterV2.sol index b341e67..680146c 100644 --- a/contracts/v2/router/swapAdapters/ERC4626VaultAdapterV2.sol +++ b/contracts/v2/router/swapAdapters/ERC4626VaultAdapterV2.sol @@ -39,7 +39,6 @@ contract ERC4626VaultAdapterV2 is ERC20SwapAdapterV2 { revert LessThanMinTokenOut(tokenOutAmt, minTokenOut); } } else if (action == Action.Redeem) { - tokenIn.safeIncreaseAllowance(address(tokenIn), amount); tokenOutAmt = IERC4626(address(tokenIn)).redeem(amount, receipient, address(this)); if (tokenOutAmt < minTokenOut) { revert LessThanMinTokenOut(tokenOutAmt, minTokenOut); From ab89f97c125ebf8268b95ad9e62aa265b51dae06 Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 19 Jun 2025 11:01:08 +0800 Subject: [PATCH 092/194] fix issue no.9 --- contracts/v2/router/swapAdapters/OdosV2AdapterV2.sol | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/contracts/v2/router/swapAdapters/OdosV2AdapterV2.sol b/contracts/v2/router/swapAdapters/OdosV2AdapterV2.sol index eed790e..8e77e5d 100644 --- a/contracts/v2/router/swapAdapters/OdosV2AdapterV2.sol +++ b/contracts/v2/router/swapAdapters/OdosV2AdapterV2.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.27; +import {Math} from "@openzeppelin/contracts/utils/math/Math.sol"; import "./ERC20SwapAdapterV2.sol"; interface IOdosRouterV2 { @@ -26,6 +27,7 @@ interface IOdosRouterV2 { */ contract OdosV2AdapterV2 is ERC20SwapAdapterV2 { using TransferUtilsV2 for IERC20; + using Math for uint256; error InvalidOutputToken(); @@ -56,8 +58,8 @@ contract OdosV2AdapterV2 is ERC20SwapAdapterV2 { /** * Note: Scaling Input/Output amount */ - tokenInfo.outputQuote = (tokenInfo.outputQuote * amountIn) / tokenInfo.inputAmount; - tokenInfo.outputMin = (tokenInfo.outputMin * amountIn + tokenInfo.inputAmount - 1) / tokenInfo.inputAmount; + tokenInfo.outputQuote = tokenInfo.outputQuote.mulDiv(amountIn, tokenInfo.inputAmount, Math.Rounding.Ceil); + tokenInfo.outputMin = tokenInfo.outputMin.mulDiv(amountIn, tokenInfo.inputAmount, Math.Rounding.Ceil); tokenInfo.inputAmount = amountIn; tokenInfo.outputReceiver = receipient; From ca1ca115ef5960e58b6754d9ce2fa1583a8f8621 Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 19 Jun 2025 11:43:13 +0800 Subject: [PATCH 093/194] fix issue no. 13 --- contracts/v2/lib/TransferUtilsV2.sol | 41 +++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/contracts/v2/lib/TransferUtilsV2.sol b/contracts/v2/lib/TransferUtilsV2.sol index 5156f35..516730a 100644 --- a/contracts/v2/lib/TransferUtilsV2.sol +++ b/contracts/v2/lib/TransferUtilsV2.sol @@ -10,6 +10,38 @@ library TransferUtilsV2 { error CanNotTransferUintMax(); function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + // Prevent transferring the maximum uint256 value, which could be a mistake for aave aToken. + if (value == type(uint256).max) { + revert CanNotTransferUintMax(); + } + token.safeTransferFrom(from, to, value); + } + + function safeTransfer(IERC20 token, address to, uint256 value) internal { + // Prevent transferring the maximum uint256 value, which could be a mistake for aave aToken. + if (value == type(uint256).max) { + revert CanNotTransferUintMax(); + } + token.safeTransfer(to, value); + } + + function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { + token.safeIncreaseAllowance(spender, value); + } + + function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { + if (value == 0 || spender == address(this)) { + return; + } + token.safeDecreaseAllowance(spender, value); + } + + function forceApprove(IERC20 token, address spender, uint256 value) internal { + token.forceApprove(spender, value); + } + + function safeTransferFromWithCheck(IERC20 token, address from, address to, uint256 value) internal { + // Prevent transferring the maximum uint256 value, which could be a mistake for aave aToken. if (value == type(uint256).max) { revert CanNotTransferUintMax(); } @@ -19,7 +51,8 @@ library TransferUtilsV2 { token.safeTransferFrom(from, to, value); } - function safeTransfer(IERC20 token, address to, uint256 value) internal { + function safeTransferWithCheck(IERC20 token, address to, uint256 value) internal { + // Prevent transferring the maximum uint256 value, which could be a mistake for aave aToken. if (value == type(uint256).max) { revert CanNotTransferUintMax(); } @@ -29,21 +62,21 @@ library TransferUtilsV2 { token.safeTransfer(to, value); } - function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { + function safeIncreaseAllowanceWithCheck(IERC20 token, address spender, uint256 value) internal { if (value == 0 || spender == address(this)) { return; } token.safeIncreaseAllowance(spender, value); } - function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { + function safeDecreaseAllowanceWithCheck(IERC20 token, address spender, uint256 value) internal { if (value == 0 || spender == address(this)) { return; } token.safeDecreaseAllowance(spender, value); } - function forceApprove(IERC20 token, address spender, uint256 value) internal { + function forceApproveWithCheck(IERC20 token, address spender, uint256 value) internal { if (spender == address(this)) { return; } From 8e5e1e520db9bc3e10658cc4fbdf6b7c282c2bdf Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 19 Jun 2025 12:35:43 +0800 Subject: [PATCH 094/194] fix issues --- .../v2/extensions/pendle/PendleHelper.sol | 7 +++--- contracts/v2/lib/OnlyProxyCall.sol | 2 +- contracts/v2/router/IERC20SwapAdapter.sol | 2 +- .../swapAdapters/ERC20SwapAdapterV2.sol | 10 ++++----- .../swapAdapters/ERC4626VaultAdapterV2.sol | 7 +++--- .../swapAdapters/KyberswapV2AdapterV2.sol | 16 ++++++++++---- .../router/swapAdapters/OdosV2AdapterV2.sol | 22 +++++++++---------- .../swapAdapters/PendleSwapV3AdapterV2.sol | 5 +++-- .../swapAdapters/UniswapV3AdapterV2.sol | 7 +++--- 9 files changed, 42 insertions(+), 36 deletions(-) diff --git a/contracts/v2/extensions/pendle/PendleHelper.sol b/contracts/v2/extensions/pendle/PendleHelper.sol index 0b4cd85..770819f 100644 --- a/contracts/v2/extensions/pendle/PendleHelper.sol +++ b/contracts/v2/extensions/pendle/PendleHelper.sol @@ -1,8 +1,7 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; +pragma solidity ^0.8.0; import "@pendle/core-v2/contracts/interfaces/IPAllActionV3.sol"; -import "@pendle/core-v2/contracts/interfaces/IPMarket.sol"; abstract contract PendleHelper { // EmptySwap means no swap aggregator is involved @@ -18,7 +17,7 @@ abstract contract PendleHelper { /// IPAllActionTypeV3.sol function createTokenInputStruct(address tokenIn, uint256 netTokenIn) internal - view + pure returns (TokenInput memory input) { input.tokenIn = tokenIn; @@ -30,7 +29,7 @@ abstract contract PendleHelper { /// IPAllActionTypeV3.sol function createTokenOutputStruct(address tokenOut, uint256 minTokenOut) internal - view + pure returns (TokenOutput memory output) { output.tokenOut = tokenOut; diff --git a/contracts/v2/lib/OnlyProxyCall.sol b/contracts/v2/lib/OnlyProxyCall.sol index 5f35673..c85613a 100644 --- a/contracts/v2/lib/OnlyProxyCall.sol +++ b/contracts/v2/lib/OnlyProxyCall.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; +pragma solidity ^0.8.0; abstract contract OnlyProxyCall { error OnlyCallableThroughProxy(); diff --git a/contracts/v2/router/IERC20SwapAdapter.sol b/contracts/v2/router/IERC20SwapAdapter.sol index f971bd3..f3ae587 100644 --- a/contracts/v2/router/IERC20SwapAdapter.sol +++ b/contracts/v2/router/IERC20SwapAdapter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; +pragma solidity ^0.8.0; /** * @title TermMax ERC20SwapAdapter interface diff --git a/contracts/v2/router/swapAdapters/ERC20SwapAdapterV2.sol b/contracts/v2/router/swapAdapters/ERC20SwapAdapterV2.sol index 942d1ca..51cdeca 100644 --- a/contracts/v2/router/swapAdapters/ERC20SwapAdapterV2.sol +++ b/contracts/v2/router/swapAdapters/ERC20SwapAdapterV2.sol @@ -1,10 +1,11 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; +pragma solidity ^0.8.0; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {TransferUtilsV2} from "../../lib/TransferUtilsV2.sol"; import {IERC20SwapAdapter} from "../IERC20SwapAdapter.sol"; import {OnlyProxyCall} from "../../lib/OnlyProxyCall.sol"; +import {Math} from "@openzeppelin/contracts/utils/math/Math.sol"; /** * @title TermMax ERC20SwapAdapter V2 @@ -14,12 +15,11 @@ import {OnlyProxyCall} from "../../lib/OnlyProxyCall.sol"; abstract contract ERC20SwapAdapterV2 is IERC20SwapAdapter, OnlyProxyCall { using TransferUtilsV2 for IERC20; - /// @notice Error for partial swap - error ERC20InvalidPartialSwap(uint256 expectedTradeAmt, uint256 actualTradeAmt); - /// @notice Error for less than min token out + /// @dev Revert when the actual output token amount is less than the expected minimum error LessThanMinTokenOut(uint256 actual, uint256 expected); - + /// @notice Error for exceeding max token in + /// @dev Revert when the actual required input token amount exceeds the expected maximum error ExceedMaxTokenIn(uint256 actual, uint256 expected); /** diff --git a/contracts/v2/router/swapAdapters/ERC4626VaultAdapterV2.sol b/contracts/v2/router/swapAdapters/ERC4626VaultAdapterV2.sol index 680146c..c1a6ee0 100644 --- a/contracts/v2/router/swapAdapters/ERC4626VaultAdapterV2.sol +++ b/contracts/v2/router/swapAdapters/ERC4626VaultAdapterV2.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; +pragma solidity ^0.8.0; import {IERC4626} from "@openzeppelin/contracts/interfaces/IERC4626.sol"; import "./ERC20SwapAdapterV2.sol"; @@ -10,6 +10,7 @@ import "./ERC20SwapAdapterV2.sol"; */ contract ERC4626VaultAdapterV2 is ERC20SwapAdapterV2 { using TransferUtilsV2 for IERC20; + using Math for uint256; enum Action { Deposit, @@ -18,8 +19,6 @@ contract ERC4626VaultAdapterV2 is ERC20SwapAdapterV2 { error InvalidAction(); - constructor() {} - function _swap(address receipient, IERC20 tokenIn, IERC20 tokenOut, uint256 amount, bytes memory swapData) internal virtual @@ -30,7 +29,7 @@ contract ERC4626VaultAdapterV2 is ERC20SwapAdapterV2 { /** * Note: Scaling Input/Output amount (round up) */ - minTokenOut = (minTokenOut * amount + inAmount - 1) / inAmount; + minTokenOut = minTokenOut.mulDiv(amount, inAmount, Math.Rounding.Ceil); if (action == Action.Deposit) { tokenIn.safeIncreaseAllowance(address(tokenOut), amount); diff --git a/contracts/v2/router/swapAdapters/KyberswapV2AdapterV2.sol b/contracts/v2/router/swapAdapters/KyberswapV2AdapterV2.sol index 685599e..f938734 100644 --- a/contracts/v2/router/swapAdapters/KyberswapV2AdapterV2.sol +++ b/contracts/v2/router/swapAdapters/KyberswapV2AdapterV2.sol @@ -1,10 +1,18 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; +pragma solidity ^0.8.0; import {Address} from "@openzeppelin/contracts/utils/Address.sol"; import "./ERC20SwapAdapterV2.sol"; +/** + * @title KyberswapV2AdapterV2 Scaling helper interface + */ interface IKyberScalingHelper { + /// @notice Get scaled input data for KyberswapV2 + /// @param inputData The original swap data + /// @param newAmount The new amount to scale the input data + /// @return isSuccess Boolean indicating if the scaling was successful + /// @return data The scaled input data function getScaledInputData(bytes calldata inputData, uint256 newAmount) external view @@ -19,14 +27,14 @@ contract KyberswapV2AdapterV2 is ERC20SwapAdapterV2 { using Address for address; using TransferUtilsV2 for IERC20; - error KyberScalingFailed(); + error KyberScalingFailed(bytes errorData); address public immutable router; address public immutable KYBER_SCALING_HELPER; constructor(address router_, address scalingHelper_) { router = router_; - KYBER_SCALING_HELPER = scalingHelper_; // 0x2f577A41BeC1BE1152AeEA12e73b7391d15f655D + KYBER_SCALING_HELPER = scalingHelper_; } function _swap(address, IERC20 tokenIn, IERC20, uint256 amountIn, bytes memory swapData) @@ -39,7 +47,7 @@ contract KyberswapV2AdapterV2 is ERC20SwapAdapterV2 { (bool isSuccess, bytes memory newSwapData) = IKyberScalingHelper(KYBER_SCALING_HELPER).getScaledInputData(swapData, amountIn); - require(isSuccess, KyberScalingFailed()); + require(isSuccess, KyberScalingFailed(newSwapData)); bytes memory returnData = router.functionCall(newSwapData); (uint256 tokenOutAmt,) = abi.decode(returnData, (uint256, uint256)); diff --git a/contracts/v2/router/swapAdapters/OdosV2AdapterV2.sol b/contracts/v2/router/swapAdapters/OdosV2AdapterV2.sol index 8e77e5d..81c5e5c 100644 --- a/contracts/v2/router/swapAdapters/OdosV2AdapterV2.sol +++ b/contracts/v2/router/swapAdapters/OdosV2AdapterV2.sol @@ -1,11 +1,14 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; +pragma solidity ^0.8.0; -import {Math} from "@openzeppelin/contracts/utils/math/Math.sol"; import "./ERC20SwapAdapterV2.sol"; +/** + * @title OdosRouterV2 interface + */ interface IOdosRouterV2 { - struct swapTokenInfo { + /// @notice Struct to hold swap token information + struct SwapTokenInfo { address inputToken; uint256 inputAmount; address inputReceiver; @@ -15,7 +18,7 @@ interface IOdosRouterV2 { address outputReceiver; } - function swap(swapTokenInfo memory tokenInfo, bytes calldata pathDefinition, address executor, uint32 referralCode) + function swap(SwapTokenInfo memory tokenInfo, bytes calldata pathDefinition, address executor, uint32 referralCode) external payable returns (uint256 amountOut); @@ -29,15 +32,13 @@ contract OdosV2AdapterV2 is ERC20SwapAdapterV2 { using TransferUtilsV2 for IERC20; using Math for uint256; - error InvalidOutputToken(); - IOdosRouterV2 public immutable router; constructor(address router_) { router = IOdosRouterV2(router_); } - function _swap(address receipient, IERC20 tokenIn, IERC20 tokenOut, uint256 amountIn, bytes memory swapData) + function _swap(address receipient, IERC20 tokenIn, IERC20, uint256 amountIn, bytes memory swapData) internal virtual override @@ -46,15 +47,12 @@ contract OdosV2AdapterV2 is ERC20SwapAdapterV2 { tokenIn.safeIncreaseAllowance(address(router), amountIn); ( - IOdosRouterV2.swapTokenInfo memory tokenInfo, + IOdosRouterV2.SwapTokenInfo memory tokenInfo, bytes memory pathDefinition, address executor, uint32 referralCode - ) = abi.decode(swapData, (IOdosRouterV2.swapTokenInfo, bytes, address, uint32)); + ) = abi.decode(swapData, (IOdosRouterV2.SwapTokenInfo, bytes, address, uint32)); - if (tokenInfo.outputToken != address(tokenOut)) { - revert InvalidOutputToken(); - } /** * Note: Scaling Input/Output amount */ diff --git a/contracts/v2/router/swapAdapters/PendleSwapV3AdapterV2.sol b/contracts/v2/router/swapAdapters/PendleSwapV3AdapterV2.sol index 8f3a84d..f6eabf2 100644 --- a/contracts/v2/router/swapAdapters/PendleSwapV3AdapterV2.sol +++ b/contracts/v2/router/swapAdapters/PendleSwapV3AdapterV2.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; +pragma solidity ^0.8.0; import {IPAllActionV3} from "@pendle/core-v2/contracts/interfaces/IPAllActionV3.sol"; import {IPMarket, IPPrincipalToken, IPYieldToken} from "@pendle/core-v2/contracts/interfaces/IPMarket.sol"; @@ -12,6 +12,7 @@ import "./ERC20SwapAdapterV2.sol"; */ contract PendleSwapV3AdapterV2 is ERC20SwapAdapterV2, PendleHelper { using TransferUtilsV2 for IERC20; + using Math for uint256; IPAllActionV3 public immutable router; @@ -36,7 +37,7 @@ contract PendleSwapV3AdapterV2 is ERC20SwapAdapterV2, PendleHelper { /** * Note: Scaling Input/Output amount */ - minTokenOut = (minTokenOut * amount + inAmount - 1) / inAmount; + minTokenOut = minTokenOut.mulDiv(amount, inAmount, Math.Rounding.Ceil); if (tokenOut == PT) { (tokenOutAmt,,) = router.swapExactTokenForPt( receipient, diff --git a/contracts/v2/router/swapAdapters/UniswapV3AdapterV2.sol b/contracts/v2/router/swapAdapters/UniswapV3AdapterV2.sol index e14abc3..1a0b108 100644 --- a/contracts/v2/router/swapAdapters/UniswapV3AdapterV2.sol +++ b/contracts/v2/router/swapAdapters/UniswapV3AdapterV2.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; +pragma solidity ^0.8.0; import {ISwapRouter} from "@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol"; import "./ERC20SwapAdapterV2.sol"; @@ -10,6 +10,7 @@ import "./ERC20SwapAdapterV2.sol"; */ contract UniswapV3AdapterV2 is ERC20SwapAdapterV2 { using TransferUtilsV2 for IERC20; + using Math for uint256; ISwapRouter public immutable router; @@ -17,7 +18,7 @@ contract UniswapV3AdapterV2 is ERC20SwapAdapterV2 { router = ISwapRouter(router_); } - function _swap(address receipient, IERC20 tokenIn, IERC20 tokenOut, uint256 amount, bytes memory swapData) + function _swap(address receipient, IERC20 tokenIn, IERC20, uint256 amount, bytes memory swapData) internal virtual override @@ -29,7 +30,7 @@ contract UniswapV3AdapterV2 is ERC20SwapAdapterV2 { /** * Note: Scaling Input/Output amount */ - amountOutMinimum = (amountOutMinimum * amount + inAmount - 1) / inAmount; + amountOutMinimum = amountOutMinimum.mulDiv(amount, inAmount, Math.Rounding.Ceil); tokenOutAmt = router.exactInput( ISwapRouter.ExactInputParams({ From 897298b88febdcd45ce3aef422b54aaf8b2b5ee9 Mon Sep 17 00:00:00 2001 From: Evan Date: Fri, 20 Jun 2025 09:08:29 +0800 Subject: [PATCH 095/194] Fix typos --- contracts/v2/router/IERC20SwapAdapter.sol | 4 ++-- contracts/v2/router/ITermMaxRouterV2.sol | 8 ++++---- contracts/v2/router/TermMaxRouterV2.sol | 20 +++++++++---------- .../swapAdapters/ERC20SwapAdapterV2.sol | 6 +++--- .../swapAdapters/ERC4626VaultAdapterV2.sol | 6 +++--- .../router/swapAdapters/OdosV2AdapterV2.sol | 4 ++-- .../swapAdapters/PendleSwapV3AdapterV2.sol | 8 ++++---- .../swapAdapters/TermMaxSwapAdapter.sol | 6 +++--- .../swapAdapters/TermMaxTokenAdapter.sol | 6 +++--- .../swapAdapters/UniswapV3AdapterV2.sol | 4 ++-- 10 files changed, 36 insertions(+), 36 deletions(-) diff --git a/contracts/v2/router/IERC20SwapAdapter.sol b/contracts/v2/router/IERC20SwapAdapter.sol index f3ae587..1ca947f 100644 --- a/contracts/v2/router/IERC20SwapAdapter.sol +++ b/contracts/v2/router/IERC20SwapAdapter.sol @@ -7,13 +7,13 @@ pragma solidity ^0.8.0; */ interface IERC20SwapAdapter { /// @notice Swap tokenIn to tokenOut - /// @param receipient Address to receive the output tokens + /// @param recipient Address to receive the output tokens /// @param tokenIn Input token address /// @param tokenOut Output token address /// @param tokenInAmt token input amount /// @param swapData Encoded swap data /// @return tokenOutAmt token output amount - function swap(address receipient, address tokenIn, address tokenOut, uint256 tokenInAmt, bytes memory swapData) + function swap(address recipient, address tokenIn, address tokenOut, uint256 tokenInAmt, bytes memory swapData) external returns (uint256 tokenOutAmt); } diff --git a/contracts/v2/router/ITermMaxRouterV2.sol b/contracts/v2/router/ITermMaxRouterV2.sol index 6fab729..41d5896 100644 --- a/contracts/v2/router/ITermMaxRouterV2.sol +++ b/contracts/v2/router/ITermMaxRouterV2.sol @@ -316,7 +316,7 @@ interface ITermMaxRouterV2 { * @param additionalAssets Amount of additional assets to add to the position * @param units Array of swap units defining the external swap path * @param nextMarket The next market to rollover into - * @param additionnalNextCollateral Additional collateral for the next market + * @param additionalNextCollateral Additional collateral for the next market * @param swapData Data for the termmax swap operation * @param maxLtv Maximum loan-to-value ratio for the rollover * @return newGtId The ID of the newly created GT token in the next market @@ -328,7 +328,7 @@ interface ITermMaxRouterV2 { uint128 additionalAssets, SwapUnit[] memory units, ITermMaxMarket nextMarket, - uint256 additionnalNextCollateral, + uint256 additionalNextCollateral, TermMaxSwapData memory swapData, uint128 maxLtv ) external returns (uint256 newGtId); @@ -344,7 +344,7 @@ interface ITermMaxRouterV2 { * @param removedCollateral Amount of collateral to remove from the position * @param units Array of swap units defining the external swap path * @param nextMarket The next market to rollover into - * @param additionnalNextCollateral Additional collateral for the next market + * @param additionalNextCollateral Additional collateral for the next market * @param swapData Data for the termmax swap operation * @param maxLtv Maximum loan-to-value ratio for the rollover * @return newGtId The ID of the newly created GT token in the next market @@ -358,7 +358,7 @@ interface ITermMaxRouterV2 { uint256 removedCollateral, SwapUnit[] memory units, ITermMaxMarket nextMarket, - uint256 additionnalNextCollateral, + uint256 additionalNextCollateral, TermMaxSwapData memory swapData, uint128 maxLtv ) external returns (uint256 newGtId); diff --git a/contracts/v2/router/TermMaxRouterV2.sol b/contracts/v2/router/TermMaxRouterV2.sol index fef3c91..dc7dc38 100644 --- a/contracts/v2/router/TermMaxRouterV2.sol +++ b/contracts/v2/router/TermMaxRouterV2.sol @@ -525,7 +525,7 @@ contract TermMaxRouterV2 is uint128 additionalAssets, SwapUnit[] memory units, ITermMaxMarket nextMarket, - uint256 additionnalNextCollateral, + uint256 additionalNextCollateral, TermMaxSwapData memory swapData, uint128 maxLtv ) external whenNotPaused returns (uint256 newGtId) { @@ -538,14 +538,14 @@ contract TermMaxRouterV2 is IERC20(swapData.tokenOut).safeTransferFrom(msg.sender, address(this), additionalAssets); } // additional collateral to reduce the ltv - if (additionnalNextCollateral != 0) { + if (additionalNextCollateral != 0) { IERC20(units[units.length - 1].tokenOut).safeTransferFrom( - msg.sender, address(this), additionnalNextCollateral + msg.sender, address(this), additionalNextCollateral ); } gt.safeTransferFrom(msg.sender, address(this), gtId, ""); bytes memory callbackData = - abi.encode(recipient, maxLtv, additionalAssets, nextMarket, additionnalNextCollateral, units, swapData); + abi.encode(recipient, maxLtv, additionalAssets, nextMarket, additionalNextCollateral, units, swapData); callbackData = abi.encode(FlashRepayOptions.ROLLOVER, callbackData); gt.flashRepay(gtId, true, callbackData); assembly { @@ -565,7 +565,7 @@ contract TermMaxRouterV2 is uint256 removedCollateral, SwapUnit[] memory units, ITermMaxMarket nextMarket, - uint256 additionnalNextCollateral, + uint256 additionalNextCollateral, TermMaxSwapData memory swapData, uint128 maxLtv ) external whenNotPaused returns (uint256 newGtId) { @@ -578,14 +578,14 @@ contract TermMaxRouterV2 is IERC20(swapData.tokenOut).safeTransferFrom(msg.sender, address(this), additionalAssets); } // additional collateral to reduce the ltv - if (additionnalNextCollateral != 0) { + if (additionalNextCollateral != 0) { IERC20(units[units.length - 1].tokenOut).safeTransferFrom( - msg.sender, address(this), additionnalNextCollateral + msg.sender, address(this), additionalNextCollateral ); } gt.safeTransferFrom(msg.sender, address(this), gtId, ""); bytes memory callbackData = - abi.encode(recipient, maxLtv, additionalAssets, nextMarket, additionnalNextCollateral, units, swapData); + abi.encode(recipient, maxLtv, additionalAssets, nextMarket, additionalNextCollateral, units, swapData); callbackData = abi.encode(FlashRepayOptions.ROLLOVER, callbackData); if (!IGearingTokenV2(address(gt)).flashRepay(gtId, repayAmt, true, abi.encode(removedCollateral), callbackData)) { @@ -673,7 +673,7 @@ contract TermMaxRouterV2 is uint128 maxLtv, uint128 additionalAssets, ITermMaxMarket market, - uint256 additionnalNextCollateral, + uint256 additionalNextCollateral, SwapUnit[] memory units, TermMaxSwapData memory swapData ) = abi.decode(callbackData, (address, uint128, uint128, ITermMaxMarket, uint256, SwapUnit[], TermMaxSwapData)); @@ -690,7 +690,7 @@ contract TermMaxRouterV2 is uint128 newDebtAmt = ( (swapData.netTokenAmt * Constants.DECIMAL_BASE) / (Constants.DECIMAL_BASE - mintGtFeeRatio) ).toUint128(); - uint256 newCollateralAmt = _decodeAmount(collateralData) + additionnalNextCollateral; + uint256 newCollateralAmt = _decodeAmount(collateralData) + additionalNextCollateral; IERC20(collateral).safeIncreaseAllowance(address(gt), newCollateralAmt); (gtId,) = market.issueFt(address(this), newDebtAmt, abi.encode(newCollateralAmt)); } diff --git a/contracts/v2/router/swapAdapters/ERC20SwapAdapterV2.sol b/contracts/v2/router/swapAdapters/ERC20SwapAdapterV2.sol index 51cdeca..084934c 100644 --- a/contracts/v2/router/swapAdapters/ERC20SwapAdapterV2.sol +++ b/contracts/v2/router/swapAdapters/ERC20SwapAdapterV2.sol @@ -25,16 +25,16 @@ abstract contract ERC20SwapAdapterV2 is IERC20SwapAdapter, OnlyProxyCall { /** * @inheritdoc IERC20SwapAdapter */ - function swap(address receipient, address tokenIn, address tokenOut, uint256 tokenInAmt, bytes memory swapData) + function swap(address recipient, address tokenIn, address tokenOut, uint256 tokenInAmt, bytes memory swapData) external override onlyProxy returns (uint256) { - return _swap(receipient, IERC20(tokenIn), IERC20(tokenOut), tokenInAmt, swapData); + return _swap(recipient, IERC20(tokenIn), IERC20(tokenOut), tokenInAmt, swapData); } - function _swap(address receipient, IERC20 tokenIn, IERC20 tokenOut, uint256 tokenInAmt, bytes memory swapData) + function _swap(address recipient, IERC20 tokenIn, IERC20 tokenOut, uint256 tokenInAmt, bytes memory swapData) internal virtual returns (uint256 tokenOutAmt) diff --git a/contracts/v2/router/swapAdapters/ERC4626VaultAdapterV2.sol b/contracts/v2/router/swapAdapters/ERC4626VaultAdapterV2.sol index c1a6ee0..172612c 100644 --- a/contracts/v2/router/swapAdapters/ERC4626VaultAdapterV2.sol +++ b/contracts/v2/router/swapAdapters/ERC4626VaultAdapterV2.sol @@ -19,7 +19,7 @@ contract ERC4626VaultAdapterV2 is ERC20SwapAdapterV2 { error InvalidAction(); - function _swap(address receipient, IERC20 tokenIn, IERC20 tokenOut, uint256 amount, bytes memory swapData) + function _swap(address recipient, IERC20 tokenIn, IERC20 tokenOut, uint256 amount, bytes memory swapData) internal virtual override @@ -33,12 +33,12 @@ contract ERC4626VaultAdapterV2 is ERC20SwapAdapterV2 { if (action == Action.Deposit) { tokenIn.safeIncreaseAllowance(address(tokenOut), amount); - tokenOutAmt = IERC4626(address(tokenOut)).deposit(amount, receipient); + tokenOutAmt = IERC4626(address(tokenOut)).deposit(amount, recipient); if (tokenOutAmt < minTokenOut) { revert LessThanMinTokenOut(tokenOutAmt, minTokenOut); } } else if (action == Action.Redeem) { - tokenOutAmt = IERC4626(address(tokenIn)).redeem(amount, receipient, address(this)); + tokenOutAmt = IERC4626(address(tokenIn)).redeem(amount, recipient, address(this)); if (tokenOutAmt < minTokenOut) { revert LessThanMinTokenOut(tokenOutAmt, minTokenOut); } diff --git a/contracts/v2/router/swapAdapters/OdosV2AdapterV2.sol b/contracts/v2/router/swapAdapters/OdosV2AdapterV2.sol index 81c5e5c..45bc86a 100644 --- a/contracts/v2/router/swapAdapters/OdosV2AdapterV2.sol +++ b/contracts/v2/router/swapAdapters/OdosV2AdapterV2.sol @@ -38,7 +38,7 @@ contract OdosV2AdapterV2 is ERC20SwapAdapterV2 { router = IOdosRouterV2(router_); } - function _swap(address receipient, IERC20 tokenIn, IERC20, uint256 amountIn, bytes memory swapData) + function _swap(address recipient, IERC20 tokenIn, IERC20, uint256 amountIn, bytes memory swapData) internal virtual override @@ -59,7 +59,7 @@ contract OdosV2AdapterV2 is ERC20SwapAdapterV2 { tokenInfo.outputQuote = tokenInfo.outputQuote.mulDiv(amountIn, tokenInfo.inputAmount, Math.Rounding.Ceil); tokenInfo.outputMin = tokenInfo.outputMin.mulDiv(amountIn, tokenInfo.inputAmount, Math.Rounding.Ceil); tokenInfo.inputAmount = amountIn; - tokenInfo.outputReceiver = receipient; + tokenInfo.outputReceiver = recipient; tokenOutAmt = router.swap(tokenInfo, pathDefinition, executor, referralCode); } diff --git a/contracts/v2/router/swapAdapters/PendleSwapV3AdapterV2.sol b/contracts/v2/router/swapAdapters/PendleSwapV3AdapterV2.sol index f6eabf2..9f01867 100644 --- a/contracts/v2/router/swapAdapters/PendleSwapV3AdapterV2.sol +++ b/contracts/v2/router/swapAdapters/PendleSwapV3AdapterV2.sol @@ -20,7 +20,7 @@ contract PendleSwapV3AdapterV2 is ERC20SwapAdapterV2, PendleHelper { router = IPAllActionV3(router_); } - function _swap(address receipient, IERC20 tokenIn, IERC20 tokenOut, uint256 amount, bytes memory swapData) + function _swap(address recipient, IERC20 tokenIn, IERC20 tokenOut, uint256 amount, bytes memory swapData) internal virtual override @@ -40,7 +40,7 @@ contract PendleSwapV3AdapterV2 is ERC20SwapAdapterV2, PendleHelper { minTokenOut = minTokenOut.mulDiv(amount, inAmount, Math.Rounding.Ceil); if (tokenOut == PT) { (tokenOutAmt,,) = router.swapExactTokenForPt( - receipient, + recipient, address(market), minTokenOut, defaultApprox, @@ -50,11 +50,11 @@ contract PendleSwapV3AdapterV2 is ERC20SwapAdapterV2, PendleHelper { } else { if (PT.isExpired()) { (tokenOutAmt,) = router.redeemPyToToken( - receipient, PT.YT(), amount, createTokenOutputStruct(address(tokenOut), minTokenOut) + recipient, PT.YT(), amount, createTokenOutputStruct(address(tokenOut), minTokenOut) ); } else { (tokenOutAmt,,) = router.swapExactPtForToken( - receipient, + recipient, address(market), amount, createTokenOutputStruct(address(tokenOut), minTokenOut), diff --git a/contracts/v2/router/swapAdapters/TermMaxSwapAdapter.sol b/contracts/v2/router/swapAdapters/TermMaxSwapAdapter.sol index c8b2631..4a37b25 100644 --- a/contracts/v2/router/swapAdapters/TermMaxSwapAdapter.sol +++ b/contracts/v2/router/swapAdapters/TermMaxSwapAdapter.sol @@ -20,7 +20,7 @@ contract TermMaxSwapAdapter is ERC20SwapAdapterV2 { error OrdersAndAmtsLengthNotMatch(); - function _swap(address receipient, IERC20 tokenIn, IERC20 tokenOut, uint256 tokenInAmt, bytes memory swapData) + function _swap(address recipient, IERC20 tokenIn, IERC20 tokenOut, uint256 tokenInAmt, bytes memory swapData) internal virtual override @@ -34,7 +34,7 @@ contract TermMaxSwapAdapter is ERC20SwapAdapterV2 { address order = data.orders[i]; tokenIn.forceApprove(order, data.netTokenAmt); netTokenOutOrIn += ITermMaxOrder(order).swapExactTokenToToken( - tokenIn, tokenOut, receipient, data.tradingAmts[i], 0, data.deadline + tokenIn, tokenOut, recipient, data.tradingAmts[i], 0, data.deadline ); } if (netTokenOutOrIn < data.netTokenAmt) revert LessThanMinTokenOut(netTokenOutOrIn, data.netTokenAmt); @@ -43,7 +43,7 @@ contract TermMaxSwapAdapter is ERC20SwapAdapterV2 { address order = data.orders[i]; tokenIn.forceApprove(order, data.netTokenAmt); netTokenOutOrIn += ITermMaxOrder(order).swapTokenToExactToken( - tokenIn, tokenOut, receipient, data.tradingAmts[i], data.netTokenAmt, data.deadline + tokenIn, tokenOut, recipient, data.tradingAmts[i], data.netTokenAmt, data.deadline ); } if (netTokenOutOrIn > data.netTokenAmt) revert LessThanMinTokenOut(netTokenOutOrIn, data.netTokenAmt); diff --git a/contracts/v2/router/swapAdapters/TermMaxTokenAdapter.sol b/contracts/v2/router/swapAdapters/TermMaxTokenAdapter.sol index 88796d1..37b3252 100644 --- a/contracts/v2/router/swapAdapters/TermMaxTokenAdapter.sol +++ b/contracts/v2/router/swapAdapters/TermMaxTokenAdapter.sol @@ -38,7 +38,7 @@ contract TermMaxTokenAdapter is ERC20SwapAdapterV2 { * - For unwrap operations: tokenIn must implement ITermMaxToken.burn() * - No slippage protection needed due to 1:1 conversion ratio */ - function _swap(address receipient, IERC20 tokenIn, IERC20 tokenOut, uint256 tokenInAmt, bytes memory swapData) + function _swap(address recipient, IERC20 tokenIn, IERC20 tokenOut, uint256 tokenInAmt, bytes memory swapData) internal virtual override @@ -50,11 +50,11 @@ contract TermMaxTokenAdapter is ERC20SwapAdapterV2 { if (isWrap) { // Wrap operation: Mint new TermMax tokens // tokenOut must be a TermMax token that supports minting - ITermMaxToken(address(tokenOut)).mint(receipient, tokenInAmt); + ITermMaxToken(address(tokenOut)).mint(recipient, tokenInAmt); } else { // Unwrap operation: Burn existing TermMax tokens // tokenIn must be a TermMax token that supports burning - ITermMaxToken(address(tokenIn)).burn(receipient, tokenInAmt); + ITermMaxToken(address(tokenIn)).burn(recipient, tokenInAmt); } // Return the same amount due to 1:1 conversion ratio diff --git a/contracts/v2/router/swapAdapters/UniswapV3AdapterV2.sol b/contracts/v2/router/swapAdapters/UniswapV3AdapterV2.sol index 1a0b108..f7130c3 100644 --- a/contracts/v2/router/swapAdapters/UniswapV3AdapterV2.sol +++ b/contracts/v2/router/swapAdapters/UniswapV3AdapterV2.sol @@ -18,7 +18,7 @@ contract UniswapV3AdapterV2 is ERC20SwapAdapterV2 { router = ISwapRouter(router_); } - function _swap(address receipient, IERC20 tokenIn, IERC20, uint256 amount, bytes memory swapData) + function _swap(address recipient, IERC20 tokenIn, IERC20, uint256 amount, bytes memory swapData) internal virtual override @@ -35,7 +35,7 @@ contract UniswapV3AdapterV2 is ERC20SwapAdapterV2 { tokenOutAmt = router.exactInput( ISwapRouter.ExactInputParams({ path: path, - recipient: receipient, + recipient: recipient, deadline: deadline, amountIn: amount, amountOutMinimum: amountOutMinimum From e4fcb2fcb6484ec25e83011bab425ce8edb3b2ea Mon Sep 17 00:00:00 2001 From: Evan Date: Fri, 20 Jun 2025 12:49:59 +0800 Subject: [PATCH 096/194] sepecial adapters for v1 router --- .../router/temAdapters/ERC20SwapAdapterV2.sol | 75 +++++++++++++++++++ .../temAdapters/ERC4626VaultAdapterV2.sol | 49 ++++++++++++ .../v1/router/temAdapters/OdosV2AdapterV2.sol | 66 ++++++++++++++++ .../temAdapters/PendleSwapV3AdapterV2.sol | 66 ++++++++++++++++ 4 files changed, 256 insertions(+) create mode 100644 contracts/v1/router/temAdapters/ERC20SwapAdapterV2.sol create mode 100644 contracts/v1/router/temAdapters/ERC4626VaultAdapterV2.sol create mode 100644 contracts/v1/router/temAdapters/OdosV2AdapterV2.sol create mode 100644 contracts/v1/router/temAdapters/PendleSwapV3AdapterV2.sol diff --git a/contracts/v1/router/temAdapters/ERC20SwapAdapterV2.sol b/contracts/v1/router/temAdapters/ERC20SwapAdapterV2.sol new file mode 100644 index 0000000..f7c8029 --- /dev/null +++ b/contracts/v1/router/temAdapters/ERC20SwapAdapterV2.sol @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {Math} from "@openzeppelin/contracts/utils/math/Math.sol"; +import {TransferUtilsV2} from "../../../v2/lib/TransferUtilsV2.sol"; +import {ISwapAdapter} from "../ISwapAdapter.sol"; +import {OnlyProxyCall} from "../../../v2/lib/OnlyProxyCall.sol"; + +/** + * @title TermMax ERC20SwapAdapter V2 + * @author Term Structure Labs + * @notice This contract is an abstract base for ERC20 swap adapters in the TermMax protocol. + */ +abstract contract ERC20SwapAdapterV2 is ISwapAdapter, OnlyProxyCall { + using TransferUtilsV2 for IERC20; + + /// @notice Error for less than min token out + /// @dev Revert when the actual output token amount is less than the expected minimum + error LessThanMinTokenOut(uint256 actual, uint256 expected); + /// @notice Error for exceeding max token in + /// @dev Revert when the actual required input token amount exceeds the expected maximum + error ExceedMaxTokenIn(uint256 actual, uint256 expected); + + /** + * @inheritdoc ISwapAdapter + */ + function swap(address tokenIn, address tokenOut, bytes memory tokenInAmt, bytes memory swapData) + external + override + onlyProxy + returns (bytes memory) + { + return abi.encode(_swap(IERC20(tokenIn), IERC20(tokenOut), abi.decode(tokenInAmt, (uint256)), swapData)); + } + + function _swap(IERC20 tokenIn, IERC20 tokenOut, uint256 tokenInAmt, bytes memory swapData) + internal + virtual + returns (uint256 tokenOutAmt); + + /** + * @inheritdoc ISwapAdapter + */ + function approveOutputToken(address token, address spender, bytes memory tokenData) external override { + IERC20(token).safeIncreaseAllowance(spender, _decodeAmount(tokenData)); + } + + /** + * @inheritdoc ISwapAdapter + */ + function transferOutputToken(address token, address to, bytes memory tokenData) external override { + IERC20(token).safeTransfer(to, _decodeAmount(tokenData)); + } + + /** + * @inheritdoc ISwapAdapter + */ + function transferInputTokenFrom(address token, address from, address to, bytes memory tokenData) + external + override + { + IERC20(token).safeTransferFrom(from, to, _decodeAmount(tokenData)); + } + + /// @notice Encode uin256 to bytes + function _encodeAmount(uint256 amount) internal pure returns (bytes memory data) { + data = abi.encode(amount); + } + + /// @notice Decode uin256 from bytes + function _decodeAmount(bytes memory data) internal pure returns (uint256 amount) { + amount = abi.decode(data, (uint256)); + } +} diff --git a/contracts/v1/router/temAdapters/ERC4626VaultAdapterV2.sol b/contracts/v1/router/temAdapters/ERC4626VaultAdapterV2.sol new file mode 100644 index 0000000..932e8c4 --- /dev/null +++ b/contracts/v1/router/temAdapters/ERC4626VaultAdapterV2.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC4626} from "@openzeppelin/contracts/interfaces/IERC4626.sol"; +import "./ERC20SwapAdapterV2.sol"; + +/** + * @title TermMax ERC4626VaultAdapterV2 + * @author Term Structure Labs + */ +contract ERC4626VaultAdapterV2 is ERC20SwapAdapterV2 { + using TransferUtilsV2 for IERC20; + using Math for uint256; + + enum Action { + Deposit, + Redeem + } + + error InvalidAction(); + + function _swap(IERC20 tokenIn, IERC20 tokenOut, uint256 amount, bytes memory swapData) + internal + virtual + override + returns (uint256 tokenOutAmt) + { + (Action action, uint256 inAmount, uint256 minTokenOut) = abi.decode(swapData, (Action, uint256, uint256)); + /** + * Note: Scaling Input/Output amount (round up) + */ + minTokenOut = minTokenOut.mulDiv(amount, inAmount, Math.Rounding.Ceil); + + if (action == Action.Deposit) { + tokenIn.safeIncreaseAllowance(address(tokenOut), amount); + tokenOutAmt = IERC4626(address(tokenOut)).deposit(amount, address(this)); + if (tokenOutAmt < minTokenOut) { + revert LessThanMinTokenOut(tokenOutAmt, minTokenOut); + } + } else if (action == Action.Redeem) { + tokenOutAmt = IERC4626(address(tokenIn)).redeem(amount, address(this), address(this)); + if (tokenOutAmt < minTokenOut) { + revert LessThanMinTokenOut(tokenOutAmt, minTokenOut); + } + } else { + revert InvalidAction(); + } + } +} diff --git a/contracts/v1/router/temAdapters/OdosV2AdapterV2.sol b/contracts/v1/router/temAdapters/OdosV2AdapterV2.sol new file mode 100644 index 0000000..38f287e --- /dev/null +++ b/contracts/v1/router/temAdapters/OdosV2AdapterV2.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "./ERC20SwapAdapterV2.sol"; + +/** + * @title OdosRouterV2 interface + */ +interface IOdosRouterV2 { + /// @notice Struct to hold swap token information + struct SwapTokenInfo { + address inputToken; + uint256 inputAmount; + address inputReceiver; + address outputToken; + uint256 outputQuote; + uint256 outputMin; + address outputReceiver; + } + + function swap(SwapTokenInfo memory tokenInfo, bytes calldata pathDefinition, address executor, uint32 referralCode) + external + payable + returns (uint256 amountOut); +} + +/** + * @title TermMax OdosAdapterV2AdapterV2 + * @author Term Structure Labs + */ +contract OdosV2AdapterV2 is ERC20SwapAdapterV2 { + using TransferUtilsV2 for IERC20; + using Math for uint256; + + IOdosRouterV2 public immutable router; + + constructor(address router_) { + router = IOdosRouterV2(router_); + } + + function _swap(IERC20 tokenIn, IERC20, uint256 amountIn, bytes memory swapData) + internal + virtual + override + returns (uint256 tokenOutAmt) + { + tokenIn.safeIncreaseAllowance(address(router), amountIn); + + ( + IOdosRouterV2.SwapTokenInfo memory tokenInfo, + bytes memory pathDefinition, + address executor, + uint32 referralCode + ) = abi.decode(swapData, (IOdosRouterV2.SwapTokenInfo, bytes, address, uint32)); + + /** + * Note: Scaling Input/Output amount + */ + tokenInfo.outputQuote = tokenInfo.outputQuote.mulDiv(amountIn, tokenInfo.inputAmount, Math.Rounding.Ceil); + tokenInfo.outputMin = tokenInfo.outputMin.mulDiv(amountIn, tokenInfo.inputAmount, Math.Rounding.Ceil); + tokenInfo.inputAmount = amountIn; + tokenInfo.outputReceiver = address(this); + + tokenOutAmt = router.swap(tokenInfo, pathDefinition, executor, referralCode); + } +} diff --git a/contracts/v1/router/temAdapters/PendleSwapV3AdapterV2.sol b/contracts/v1/router/temAdapters/PendleSwapV3AdapterV2.sol new file mode 100644 index 0000000..e2fd9ef --- /dev/null +++ b/contracts/v1/router/temAdapters/PendleSwapV3AdapterV2.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPAllActionV3} from "@pendle/core-v2/contracts/interfaces/IPAllActionV3.sol"; +import {IPMarket, IPPrincipalToken, IPYieldToken} from "@pendle/core-v2/contracts/interfaces/IPMarket.sol"; +import {PendleHelper} from "../../../v2/extensions/pendle/PendleHelper.sol"; +import "./ERC20SwapAdapterV2.sol"; + +/** + * @title TermMax PendleSwapV3AdapterV2 + * @author Term Structure Labs + */ +contract PendleSwapV3AdapterV2 is ERC20SwapAdapterV2, PendleHelper { + using TransferUtilsV2 for IERC20; + using Math for uint256; + + IPAllActionV3 public immutable router; + + constructor(address router_) { + router = IPAllActionV3(router_); + } + + function _swap(IERC20 tokenIn, IERC20 tokenOut, uint256 amount, bytes memory swapData) + internal + virtual + override + onlyProxy + returns (uint256 tokenOutAmt) + { + (address ptMarketAddr, uint256 inAmount, uint256 minTokenOut) = + abi.decode(swapData, (address, uint256, uint256)); + IPMarket market = IPMarket(ptMarketAddr); + + (, IPPrincipalToken PT,) = market.readTokens(); + IERC20(tokenIn).safeIncreaseAllowance(address(router), amount); + + /** + * Note: Scaling Input/Output amount + */ + minTokenOut = minTokenOut.mulDiv(amount, inAmount, Math.Rounding.Ceil); + if (tokenOut == PT) { + (tokenOutAmt,,) = router.swapExactTokenForPt( + address(this), + address(market), + minTokenOut, + defaultApprox, + createTokenInputStruct(address(tokenIn), amount), + emptyLimit + ); + } else { + if (PT.isExpired()) { + (tokenOutAmt,) = router.redeemPyToToken( + address(this), PT.YT(), amount, createTokenOutputStruct(address(tokenOut), minTokenOut) + ); + } else { + (tokenOutAmt,,) = router.swapExactPtForToken( + address(this), + address(market), + amount, + createTokenOutputStruct(address(tokenOut), minTokenOut), + emptyLimit + ); + } + } + } +} From aae7dc17da218d4c079ac97ec7de4a306cc3bab4 Mon Sep 17 00:00:00 2001 From: Evan Date: Fri, 20 Jun 2025 12:52:04 +0800 Subject: [PATCH 097/194] rename folder --- .../ERC20SwapAdapterV2.sol | 0 .../ERC4626VaultAdapterV2.sol | 0 .../OdosV2AdapterV2.sol | 0 .../PendleSwapV3AdapterV2.sol | 0 .../specAdapters/UniswapV3AdapterV2.sol | 45 +++++++++++++++++++ 5 files changed, 45 insertions(+) rename contracts/v1/router/{temAdapters => specAdapters}/ERC20SwapAdapterV2.sol (100%) rename contracts/v1/router/{temAdapters => specAdapters}/ERC4626VaultAdapterV2.sol (100%) rename contracts/v1/router/{temAdapters => specAdapters}/OdosV2AdapterV2.sol (100%) rename contracts/v1/router/{temAdapters => specAdapters}/PendleSwapV3AdapterV2.sol (100%) create mode 100644 contracts/v1/router/specAdapters/UniswapV3AdapterV2.sol diff --git a/contracts/v1/router/temAdapters/ERC20SwapAdapterV2.sol b/contracts/v1/router/specAdapters/ERC20SwapAdapterV2.sol similarity index 100% rename from contracts/v1/router/temAdapters/ERC20SwapAdapterV2.sol rename to contracts/v1/router/specAdapters/ERC20SwapAdapterV2.sol diff --git a/contracts/v1/router/temAdapters/ERC4626VaultAdapterV2.sol b/contracts/v1/router/specAdapters/ERC4626VaultAdapterV2.sol similarity index 100% rename from contracts/v1/router/temAdapters/ERC4626VaultAdapterV2.sol rename to contracts/v1/router/specAdapters/ERC4626VaultAdapterV2.sol diff --git a/contracts/v1/router/temAdapters/OdosV2AdapterV2.sol b/contracts/v1/router/specAdapters/OdosV2AdapterV2.sol similarity index 100% rename from contracts/v1/router/temAdapters/OdosV2AdapterV2.sol rename to contracts/v1/router/specAdapters/OdosV2AdapterV2.sol diff --git a/contracts/v1/router/temAdapters/PendleSwapV3AdapterV2.sol b/contracts/v1/router/specAdapters/PendleSwapV3AdapterV2.sol similarity index 100% rename from contracts/v1/router/temAdapters/PendleSwapV3AdapterV2.sol rename to contracts/v1/router/specAdapters/PendleSwapV3AdapterV2.sol diff --git a/contracts/v1/router/specAdapters/UniswapV3AdapterV2.sol b/contracts/v1/router/specAdapters/UniswapV3AdapterV2.sol new file mode 100644 index 0000000..3cb1500 --- /dev/null +++ b/contracts/v1/router/specAdapters/UniswapV3AdapterV2.sol @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {ISwapRouter} from "@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol"; +import "./ERC20SwapAdapterV2.sol"; + +/** + * @title TermMax UniswapV3AdapterV2 + * @author Term Structure Labs + */ +contract UniswapV3AdapterV2 is ERC20SwapAdapterV2 { + using TransferUtilsV2 for IERC20; + using Math for uint256; + + ISwapRouter public immutable router; + + constructor(address router_) { + router = ISwapRouter(router_); + } + + function _swap(IERC20 tokenIn, IERC20, uint256 amount, bytes memory swapData) + internal + virtual + override + returns (uint256 tokenOutAmt) + { + IERC20(tokenIn).safeIncreaseAllowance(address(router), amount); + (bytes memory path, uint256 deadline, uint256 inAmount, uint256 amountOutMinimum) = + abi.decode(swapData, (bytes, uint256, uint256, uint256)); + /** + * Note: Scaling Input/Output amount + */ + amountOutMinimum = amountOutMinimum.mulDiv(amount, inAmount, Math.Rounding.Ceil); + + tokenOutAmt = router.exactInput( + ISwapRouter.ExactInputParams({ + path: path, + recipient: address(this), + deadline: deadline, + amountIn: amount, + amountOutMinimum: amountOutMinimum + }) + ); + } +} From 30b47a2e199a4e45ba82d2157c1b57b6a06f249a Mon Sep 17 00:00:00 2001 From: Evan Date: Fri, 20 Jun 2025 13:04:32 +0800 Subject: [PATCH 098/194] ut for it --- test/v1/mainnet-fork/GtBaseTest.t.sol | 17 +++++++++-------- test/v1/mainnet-fork/mainnet/ForkGt.t.sol | 2 +- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/test/v1/mainnet-fork/GtBaseTest.t.sol b/test/v1/mainnet-fork/GtBaseTest.t.sol index be9dc99..5acd874 100644 --- a/test/v1/mainnet-fork/GtBaseTest.t.sol +++ b/test/v1/mainnet-fork/GtBaseTest.t.sol @@ -21,10 +21,10 @@ import {IOracle, OracleAggregator, AggregatorV3Interface} from "contracts/v1/ora import { TermMaxRouter, ISwapAdapter, ITermMaxRouter, SwapUnit, RouterErrors } from "contracts/v1/router/TermMaxRouter.sol"; -import {UniswapV3Adapter, ERC20SwapAdapter} from "contracts/v1/router/swapAdapters/UniswapV3Adapter.sol"; -import {PendleSwapV3Adapter} from "contracts/v1/router/swapAdapters/PendleSwapV3Adapter.sol"; -import {OdosV2Adapter, IOdosRouterV2} from "contracts/v1/router/swapAdapters/OdosV2Adapter.sol"; -import {ERC4626VaultAdapter} from "contracts/v1/router/swapAdapters/ERC4626VaultAdapter.sol"; +import {UniswapV3AdapterV2, ERC20SwapAdapterV2} from "contracts/v1/router/specAdapters/UniswapV3AdapterV2.sol"; +import {PendleSwapV3AdapterV2} from "contracts/v1/router/specAdapters/PendleSwapV3AdapterV2.sol"; +import {OdosV2AdapterV2, IOdosRouterV2} from "contracts/v1/router/specAdapters/OdosV2AdapterV2.sol"; +import {ERC4626VaultAdapterV2} from "contracts/v1/router/specAdapters/ERC4626VaultAdapterV2.sol"; import {TermMaxOrder, ITermMaxOrder} from "contracts/v1/TermMaxOrder.sol"; import {ForkBaseTest} from "./ForkBaseTest.sol"; import {RouterEvents} from "contracts/v1/events/RouterEvents.sol"; @@ -130,11 +130,12 @@ abstract contract GtBaseTest is ForkBaseTest { res.market.createOrder(res.maker, res.maxXtReserve, ISwapCallback(address(0)), res.orderConfig.curveCuts); res.swapAdapters.uniswapAdapter = - address(new UniswapV3Adapter(vm.parseJsonAddress(jsonData, ".routers.uniswapRouter"))); + address(new UniswapV3AdapterV2(vm.parseJsonAddress(jsonData, ".routers.uniswapRouter"))); res.swapAdapters.pendleAdapter = - address(new PendleSwapV3Adapter(vm.parseJsonAddress(jsonData, ".routers.pendleRouter"))); - res.swapAdapters.odosAdapter = address(new OdosV2Adapter(vm.parseJsonAddress(jsonData, ".routers.odosRouter"))); - res.swapAdapters.vaultAdapter = address(new ERC4626VaultAdapter()); + address(new PendleSwapV3AdapterV2(vm.parseJsonAddress(jsonData, ".routers.pendleRouter"))); + res.swapAdapters.odosAdapter = + address(new OdosV2AdapterV2(vm.parseJsonAddress(jsonData, ".routers.odosRouter"))); + res.swapAdapters.vaultAdapter = address(new ERC4626VaultAdapterV2()); res.router = deployRouter(res.marketInitialParams.admin); res.router.setAdapterWhitelist(res.swapAdapters.uniswapAdapter, true); res.router.setAdapterWhitelist(res.swapAdapters.pendleAdapter, true); diff --git a/test/v1/mainnet-fork/mainnet/ForkGt.t.sol b/test/v1/mainnet-fork/mainnet/ForkGt.t.sol index 9d4bf06..608bbf3 100644 --- a/test/v1/mainnet-fork/mainnet/ForkGt.t.sol +++ b/test/v1/mainnet-fork/mainnet/ForkGt.t.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.27; import "../GtBaseTest.t.sol"; -contract ForkGt is GtBaseTest { +contract ForkGtV1 is GtBaseTest { string MAINNET_RPC_URL = vm.envString("MAINNET_RPC_URL"); string DATA_PATH = string.concat(vm.projectRoot(), "/test/testdata/fork/mainnet.json"); From 33c08264a9ec5bfe8b8abc02761113aa11579126 Mon Sep 17 00:00:00 2001 From: Evan Date: Fri, 20 Jun 2025 22:06:51 +0800 Subject: [PATCH 099/194] scripts --- .../arb-mainnet-access-manager.json | 15 + .../arb-mainnet-core.json | 25 + ...arb-mainnet-market-USDC-ARB@04APR2025.json | 38 + ...rb-mainnet-market-USDC-WBTC@04APR2025.json | 38 + ...rb-mainnet-market-USDC-WETH@04APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@04APR2025.json | 38 + ...ket-WETH-PT-weETH-26JUN2025@04APR2025.json | 38 + ...b-mainnet-market-WETH-weETH@04APR2025.json | 38 + ...-mainnet-market-WETH-wstETH@04APR2025.json | 38 + .../arb-mainnet-access-manager.json | 15 + .../arb-mainnet-core.json | 25 + ...arb-mainnet-market-USDC-ARB@05APR2025.json | 38 + ...rb-mainnet-market-USDC-WBTC@05APR2025.json | 38 + ...rb-mainnet-market-USDC-WETH@05APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@05APR2025.json | 38 + ...ket-WETH-PT-weETH-26JUN2025@05APR2025.json | 38 + ...b-mainnet-market-WETH-weETH@05APR2025.json | 38 + ...-mainnet-market-WETH-wstETH@05APR2025.json | 38 + .../accept-oracles-20250403-log.txt | 107 +++ .../arb-mainnet-access-manager.json | 15 + .../arb-mainnet-core.json | 25 + ...arb-mainnet-market-USDC-ARB@06APR2025.json | 38 + ...rb-mainnet-market-USDC-WBTC@06APR2025.json | 38 + ...rb-mainnet-market-USDC-WETH@06APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@06APR2025.json | 38 + ...ket-WETH-PT-weETH-26JUN2025@06APR2025.json | 38 + ...b-mainnet-market-WETH-weETH@06APR2025.json | 38 + ...-mainnet-market-WETH-wstETH@06APR2025.json | 38 + .../arb-mainnet-vault-TermMax USDC Vault.json | 24 + .../arb-mainnet-vault-TermMax WETH Vault.json | 24 + ...y-market-arb-mainnet-20250406-1400-log.txt | 243 ++++++ .../arb-mainnet-access-manager.json | 15 + .../arb-mainnet-core.json | 25 + ...arb-mainnet-market-USDC-ARB@06APR2025.json | 38 + ...rb-mainnet-market-USDC-WBTC@06APR2025.json | 38 + ...rb-mainnet-market-USDC-WETH@06APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@06APR2025.json | 38 + ...ket-WETH-PT-weETH-26JUN2025@06APR2025.json | 38 + ...b-mainnet-market-WETH-weETH@06APR2025.json | 38 + ...-mainnet-market-WETH-wstETH@06APR2025.json | 38 + .../arb-mainnet-vault-TermMax USDC Vault.json | 24 + .../arb-mainnet-vault-TermMax WETH Vault.json | 24 + ...y-market-arb-mainnet-20250406-2000-log.txt | 243 ++++++ .../arb-mainnet-access-manager.json | 15 + .../arb-mainnet-core.json | 25 + ...arb-mainnet-market-USDC-ARB@07APR2025.json | 38 + ...rb-mainnet-market-USDC-WBTC@07APR2025.json | 38 + ...rb-mainnet-market-USDC-WETH@07APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@07APR2025.json | 38 + ...ket-WETH-PT-weETH-26JUN2025@07APR2025.json | 38 + ...b-mainnet-market-WETH-weETH@07APR2025.json | 38 + ...-mainnet-market-WETH-wstETH@07APR2025.json | 38 + .../arb-mainnet-vault-TermMax USDC Vault.json | 24 + .../arb-mainnet-vault-TermMax WETH Vault.json | 24 + ...y-market-arb-mainnet-20250407-1400-log.txt | 243 ++++++ .../arb-mainnet-access-manager.json | 15 + .../arb-mainnet-core.json | 25 + ...arb-mainnet-market-USDC-ARB@07APR2025.json | 38 + ...rb-mainnet-market-USDC-WBTC@07APR2025.json | 38 + ...rb-mainnet-market-USDC-WETH@07APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@07APR2025.json | 38 + ...ket-WETH-PT-weETH-26JUN2025@07APR2025.json | 38 + ...b-mainnet-market-WETH-weETH@07APR2025.json | 38 + ...-mainnet-market-WETH-wstETH@07APR2025.json | 38 + .../arb-mainnet-vault-TermMax USDC Vault.json | 24 + .../arb-mainnet-vault-TermMax WETH Vault.json | 24 + ...y-market-arb-mainnet-20250407-2000-log.txt | 243 ++++++ .../accept-oracles-20250403-log.txt | 107 +++ .../arb-mainnet-access-manager.json | 15 + .../arb-mainnet-core.json | 25 + ...arb-mainnet-market-USDC-ARB@08APR2025.json | 38 + ...rb-mainnet-market-USDC-WBTC@08APR2025.json | 38 + ...rb-mainnet-market-USDC-WETH@08APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@08APR2025.json | 38 + ...ket-WETH-PT-weETH-26JUN2025@08APR2025.json | 38 + ...b-mainnet-market-WETH-weETH@08APR2025.json | 38 + ...-mainnet-market-WETH-wstETH@08APR2025.json | 38 + .../arb-mainnet-vault-TermMax USDC Vault.json | 24 + .../arb-mainnet-vault-TermMax WETH Vault.json | 24 + ...y-market-arb-mainnet-20250408-1400-log.txt | 243 ++++++ .../accept-oracles-20250403-log.txt | 107 +++ .../arb-mainnet-access-manager.json | 15 + .../arb-mainnet-core.json | 25 + ...arb-mainnet-market-USDC-ARB@08APR2025.json | 38 + ...rb-mainnet-market-USDC-WBTC@08APR2025.json | 38 + ...rb-mainnet-market-USDC-WETH@08APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@08APR2025.json | 38 + ...ket-WETH-PT-weETH-26JUN2025@08APR2025.json | 38 + ...b-mainnet-market-WETH-weETH@08APR2025.json | 38 + ...-mainnet-market-WETH-wstETH@08APR2025.json | 38 + .../arb-mainnet-vault-TermMax USDC Vault.json | 24 + .../arb-mainnet-vault-TermMax WETH Vault.json | 24 + ...y-market-arb-mainnet-20250408-2000-log.txt | 243 ++++++ .../accept-oracles-20250403-log.txt | 107 +++ .../arb-mainnet-access-manager.json | 15 + .../arb-mainnet-core.json | 25 + ...arb-mainnet-market-USDC-ARB@09APR2025.json | 38 + ...rb-mainnet-market-USDC-WBTC@09APR2025.json | 38 + ...rb-mainnet-market-USDC-WETH@09APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@09APR2025.json | 38 + ...ket-WETH-PT-weETH-26JUN2025@09APR2025.json | 38 + ...b-mainnet-market-WETH-weETH@09APR2025.json | 38 + ...-mainnet-market-WETH-wstETH@09APR2025.json | 38 + .../arb-mainnet-vault-TermMax USDC Vault.json | 24 + .../arb-mainnet-vault-TermMax WETH Vault.json | 24 + ...y-market-arb-mainnet-20250409-1400-log.txt | 271 +++++++ .../accept-oracles-20250403-log.txt | 107 +++ .../arb-mainnet-access-manager.json | 15 + .../arb-mainnet-core.json | 25 + ...arb-mainnet-market-USDC-ARB@09APR2025.json | 38 + ...rb-mainnet-market-USDC-WBTC@09APR2025.json | 38 + ...rb-mainnet-market-USDC-WETH@09APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@09APR2025.json | 38 + ...ket-WETH-PT-weETH-26JUN2025@09APR2025.json | 38 + ...b-mainnet-market-WETH-weETH@09APR2025.json | 38 + ...-mainnet-market-WETH-wstETH@09APR2025.json | 38 + .../arb-mainnet-vault-TermMax USDC Vault.json | 24 + .../arb-mainnet-vault-TermMax WETH Vault.json | 24 + ...y-market-arb-mainnet-20250409-2000-log.txt | 579 ++++++++++++++ .../accept-oracles-20250403-log.txt | 107 +++ .../arb-mainnet-access-manager.json | 15 + .../arb-mainnet-core.json | 25 + ...arb-mainnet-market-USDC-ARB@10APR2025.json | 38 + ...rb-mainnet-market-USDC-WBTC@10APR2025.json | 38 + ...rb-mainnet-market-USDC-WETH@10APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@10APR2025.json | 38 + ...ket-WETH-PT-weETH-26JUN2025@10APR2025.json | 38 + ...b-mainnet-market-WETH-weETH@10APR2025.json | 38 + ...-mainnet-market-WETH-wstETH@10APR2025.json | 38 + .../arb-mainnet-vault-TermMax USDC Vault.json | 24 + .../arb-mainnet-vault-TermMax WETH Vault.json | 24 + ...y-market-arb-mainnet-20250410-1400-log.txt | 299 +++++++ .../accept-oracles-20250403-log.txt | 107 +++ .../arb-mainnet-access-manager.json | 15 + .../arb-mainnet-core.json | 25 + ...arb-mainnet-market-USDC-ARB@10APR2025.json | 38 + ...rb-mainnet-market-USDC-WBTC@10APR2025.json | 38 + ...rb-mainnet-market-USDC-WETH@10APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@10APR2025.json | 38 + ...ket-WETH-PT-weETH-26JUN2025@10APR2025.json | 38 + ...b-mainnet-market-WETH-weETH@10APR2025.json | 38 + ...-mainnet-market-WETH-wstETH@10APR2025.json | 38 + .../arb-mainnet-vault-TermMax USDC Vault.json | 24 + .../arb-mainnet-vault-TermMax WETH Vault.json | 24 + ...y-market-arb-mainnet-20250410-2000-log.txt | 243 ++++++ .../accept-oracles-20250403-log.txt | 107 +++ .../arb-mainnet-access-manager.json | 15 + .../arb-mainnet-core.json | 25 + ...arb-mainnet-market-USDC-ARB@30MAY2025.json | 38 + ...rb-mainnet-market-USDC-WBTC@30MAY2025.json | 38 + ...rb-mainnet-market-USDC-WETH@30MAY2025.json | 38 + ...-mainnet-market-USDC-wstETH@30MAY2025.json | 38 + ...ket-WETH-PT-weETH-26JUN2025@27JUN2025.json | 38 + ...b-mainnet-market-WETH-weETH@30MAY2025.json | 38 + ...-mainnet-market-WETH-wstETH@30MAY2025.json | 38 + .../arb-mainnet-vault-TMX-USDC.json | 24 + .../arb-mainnet-vault-TMX-WETH.json | 24 + .../arb-mainnet-vault-TermMax USDC Vault.json | 24 + .../arb-mainnet-vault-TermMax WETH Vault.json | 24 + .../deploy-arb-markets-20250530.txt | 243 ++++++ .../accept-oracles-20250403-log.txt | 107 +++ .../arb-mainnet-access-manager.json | 15 + .../arb-mainnet-core.json | 25 + ...arb-mainnet-market-USDC-ARB@11APR2025.json | 38 + ...rb-mainnet-market-USDC-WBTC@11APR2025.json | 38 + ...rb-mainnet-market-USDC-WETH@11APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@11APR2025.json | 38 + ...ket-WETH-PT-weETH-26JUN2025@11APR2025.json | 38 + ...b-mainnet-market-WETH-weETH@11APR2025.json | 38 + ...-mainnet-market-WETH-wstETH@11APR2025.json | 38 + .../arb-mainnet-vault-TMX-USDC.json | 24 + .../arb-mainnet-vault-TMX-WETH.json | 24 + .../arb-mainnet-vault-TermMax USDC Vault.json | 24 + .../arb-mainnet-vault-TermMax WETH Vault.json | 24 + .../deploy-arb-markets-test-0411-1500-log.txt | 243 ++++++ .../accept-oracles-20250403-log.txt | 107 +++ .../arb-mainnet-access-manager.json | 15 + .../arb-mainnet-core.json | 25 + ...arb-mainnet-market-USDC-ARB@11APR2025.json | 38 + ...rb-mainnet-market-USDC-WBTC@11APR2025.json | 38 + ...rb-mainnet-market-USDC-WETH@11APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@11APR2025.json | 38 + ...ket-WETH-PT-weETH-26JUN2025@11APR2025.json | 38 + ...b-mainnet-market-WETH-weETH@11APR2025.json | 38 + ...-mainnet-market-WETH-wstETH@11APR2025.json | 38 + .../arb-mainnet-vault-TMX-USDC.json | 24 + .../arb-mainnet-vault-TMX-WETH.json | 24 + .../arb-mainnet-vault-TermMax USDC Vault.json | 24 + .../arb-mainnet-vault-TermMax WETH Vault.json | 24 + .../deploy-arb-markets-test-0411-2000-log.txt | 243 ++++++ .../accept-oracles-20250403-log.txt | 107 +++ .../arb-mainnet-access-manager.json | 15 + .../arb-mainnet-core.json | 25 + ...arb-mainnet-market-USDC-ARB@12APR2025.json | 38 + ...rb-mainnet-market-USDC-WBTC@12APR2025.json | 38 + ...rb-mainnet-market-USDC-WETH@12APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@12APR2025.json | 38 + ...ket-WETH-PT-weETH-26JUN2025@12APR2025.json | 38 + ...b-mainnet-market-WETH-weETH@12APR2025.json | 38 + ...-mainnet-market-WETH-wstETH@12APR2025.json | 38 + .../arb-mainnet-vault-TMX-USDC.json | 24 + .../arb-mainnet-vault-TMX-WETH.json | 24 + .../arb-mainnet-vault-TermMax USDC Vault.json | 24 + .../arb-mainnet-vault-TermMax WETH Vault.json | 24 + .../deploy-arb-markets-test-0412-1500-log.txt | 243 ++++++ .../accept-oracles-20250403-log.txt | 107 +++ .../arb-mainnet-access-manager.json | 15 + .../arb-mainnet-core.json | 25 + ...arb-mainnet-market-USDC-ARB@12APR2025.json | 38 + ...rb-mainnet-market-USDC-WBTC@12APR2025.json | 38 + ...rb-mainnet-market-USDC-WETH@12APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@12APR2025.json | 38 + ...ket-WETH-PT-weETH-26JUN2025@12APR2025.json | 38 + ...b-mainnet-market-WETH-weETH@12APR2025.json | 38 + ...-mainnet-market-WETH-wstETH@12APR2025.json | 38 + .../arb-mainnet-vault-TMX-USDC.json | 24 + .../arb-mainnet-vault-TMX-WETH.json | 24 + .../arb-mainnet-vault-TermMax USDC Vault.json | 24 + .../arb-mainnet-vault-TermMax WETH Vault.json | 24 + .../deploy-arb-markets-test-0412-2000-log.txt | 243 ++++++ .../accept-oracles-20250403-log.txt | 107 +++ .../arb-mainnet-access-manager.json | 15 + .../arb-mainnet-core.json | 25 + ...arb-mainnet-market-USDC-ARB@13APR2025.json | 38 + ...rb-mainnet-market-USDC-WBTC@13APR2025.json | 38 + ...rb-mainnet-market-USDC-WETH@13APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@13APR2025.json | 38 + ...ket-WETH-PT-weETH-26JUN2025@13APR2025.json | 38 + ...b-mainnet-market-WETH-weETH@13APR2025.json | 38 + ...-mainnet-market-WETH-wstETH@13APR2025.json | 38 + .../arb-mainnet-vault-TMX-USDC.json | 24 + .../arb-mainnet-vault-TMX-WETH.json | 24 + .../arb-mainnet-vault-TermMax USDC Vault.json | 24 + .../arb-mainnet-vault-TermMax WETH Vault.json | 24 + .../deploy-arb-markets-test-0413-1500-log.txt | 243 ++++++ .../accept-oracles-20250403-log.txt | 107 +++ .../arb-mainnet-access-manager.json | 15 + .../arb-mainnet-core.json | 25 + ...arb-mainnet-market-USDC-ARB@13APR2025.json | 38 + ...rb-mainnet-market-USDC-WBTC@13APR2025.json | 38 + ...rb-mainnet-market-USDC-WETH@13APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@13APR2025.json | 38 + ...ket-WETH-PT-weETH-26JUN2025@13APR2025.json | 38 + ...b-mainnet-market-WETH-weETH@13APR2025.json | 38 + ...-mainnet-market-WETH-wstETH@13APR2025.json | 38 + .../arb-mainnet-vault-TMX-USDC.json | 24 + .../arb-mainnet-vault-TMX-WETH.json | 24 + .../arb-mainnet-vault-TermMax USDC Vault.json | 24 + .../arb-mainnet-vault-TermMax WETH Vault.json | 24 + .../deploy-arb-markets-test-0413-2000-log.txt | 243 ++++++ .../accept-oracles-20250403-log.txt | 107 +++ .../arb-mainnet-access-manager.json | 15 + .../arb-mainnet-core.json | 25 + ...arb-mainnet-market-USDC-ARB@14APR2025.json | 38 + ...rb-mainnet-market-USDC-WBTC@14APR2025.json | 38 + ...rb-mainnet-market-USDC-WETH@14APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@14APR2025.json | 38 + ...ket-WETH-PT-weETH-26JUN2025@14APR2025.json | 38 + ...b-mainnet-market-WETH-weETH@14APR2025.json | 38 + ...-mainnet-market-WETH-wstETH@14APR2025.json | 38 + .../arb-mainnet-vault-TMX-USDC.json | 24 + .../arb-mainnet-vault-TMX-WETH.json | 24 + .../arb-mainnet-vault-TermMax USDC Vault.json | 24 + .../arb-mainnet-vault-TermMax WETH Vault.json | 24 + ...loy-arb-markets-test-20250414-1500-log.txt | 243 ++++++ .../accept-oracles-20250403-log.txt | 107 +++ .../arb-mainnet-access-manager.json | 15 + .../arb-mainnet-core.json | 25 + ...arb-mainnet-market-USDC-ARB@14APR2025.json | 38 + ...rb-mainnet-market-USDC-WBTC@14APR2025.json | 38 + ...rb-mainnet-market-USDC-WETH@14APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@14APR2025.json | 38 + ...ket-WETH-PT-weETH-26JUN2025@14APR2025.json | 38 + ...b-mainnet-market-WETH-weETH@14APR2025.json | 38 + ...-mainnet-market-WETH-wstETH@14APR2025.json | 38 + .../arb-mainnet-vault-TMX-USDC.json | 24 + .../arb-mainnet-vault-TMX-WETH.json | 24 + .../arb-mainnet-vault-TermMax USDC Vault.json | 24 + .../arb-mainnet-vault-TermMax WETH Vault.json | 24 + ...loy-arb-markets-test-20250414-2000-log.txt | 243 ++++++ .../accept-oracles-20250403-log.txt | 107 +++ .../arb-mainnet-V2-adapters-03JUN2025.json | 26 + .../arb-mainnet-access-manager.json | 15 + deployments/arb-mainnet/arb-mainnet-core.json | 25 + ...arb-mainnet-market-USDC-ARB@27JUN2025.json | 38 + ...rb-mainnet-market-USDC-WBTC@27JUN2025.json | 38 + ...rb-mainnet-market-USDC-WETH@27JUN2025.json | 38 + ...-mainnet-market-USDC-wstETH@27JUN2025.json | 38 + ...b-mainnet-market-WETH-weETH@27JUN2025.json | 38 + ...-mainnet-market-WETH-wstETH@27JUN2025.json | 38 + .../arb-mainnet-pendle-swap-v3-adapter.json | 14 + .../arb-mainnet-vault-TMX-USDC.json | 24 + .../arb-mainnet-vault-TMX-WETH.json | 24 + .../arb-mainnet-vault-TermMax USDC Vault.json | 24 + .../arb-mainnet-vault-TermMax WETH Vault.json | 24 + .../arb-mainnet-vault-factory-03JUN2025.json | 15 + ...deploy-arb-markets-mature-20250627-log.txt | 220 ++++++ .../arb-sepolia-access-manager.json | 15 + .../arb-sepolia-core.json | 21 + ...arb-sepolia-market-USDC-ARB@05APR2025.json | 38 + ...rb-sepolia-market-USDC-WBTC@05APR2025.json | 38 + ...rb-sepolia-market-USDC-WETH@05APR2025.json | 38 + ...-sepolia-market-USDC-wstETH@05APR2025.json | 38 + ...ket-WETH-PT-weETH-26JUN2025@05APR2025.json | 38 + ...b-sepolia-market-WETH-weETH@05APR2025.json | 38 + ...-sepolia-market-WETH-wstETH@05APR2025.json | 38 + .../arb-sepolia-access-manager.json | 15 + .../arb-sepolia-core.json | 21 + ...arb-sepolia-market-USDC-ARB@30MAY2025.json | 38 + ...rb-sepolia-market-USDC-WBTC@30MAY2025.json | 38 + ...rb-sepolia-market-USDC-WETH@30MAY2025.json | 38 + ...-sepolia-market-USDC-wstETH@30MAY2025.json | 38 + ...ket-WETH-PT-weETH-26JUN2025@27JUN2025.json | 38 + ...b-sepolia-market-WETH-weETH@30MAY2025.json | 38 + ...-sepolia-market-WETH-wstETH@30MAY2025.json | 38 + .../arb-sepolia-access-manager.json | 15 + .../arb-sepolia-core.json | 21 + ...arb-sepolia-market-USDC-ARB@30MAY2025.json | 38 + ...rb-sepolia-market-USDC-WBTC@30MAY2025.json | 38 + ...rb-sepolia-market-USDC-WETH@30MAY2025.json | 38 + ...-sepolia-market-USDC-wstETH@30MAY2025.json | 38 + ...ket-WETH-PT-weETH-26JUN2025@27JUN2025.json | 38 + ...b-sepolia-market-WETH-weETH@30MAY2025.json | 38 + ...-sepolia-market-WETH-wstETH@30MAY2025.json | 38 + .../arb-sepolia-vault-TMX-USDC.json | 24 + .../arb-sepolia-vault-TMX-WETH.json | 24 + .../arb-sepolia-access-manager.json | 15 + .../arb-sepolia-core.json | 21 + ...arb-sepolia-market-USDC-ARB@30MAY2025.json | 38 + ...rb-sepolia-market-USDC-WBTC@30MAY2025.json | 38 + ...rb-sepolia-market-USDC-WETH@30MAY2025.json | 38 + ...-sepolia-market-USDC-wstETH@30MAY2025.json | 38 + ...ket-WETH-PT-weETH-26JUN2025@27JUN2025.json | 38 + ...b-sepolia-market-WETH-weETH@30MAY2025.json | 38 + ...-sepolia-market-WETH-wstETH@30MAY2025.json | 38 + .../arb-sepolia-vault-TMX-USDC-Vault.json | 24 + .../arb-sepolia-vault-TMX-USDC.json | 24 + .../arb-sepolia-vault-TMX-WETH.json | 24 + .../arb-sepolia-access-manager.json | 15 + .../arb-sepolia-core.json | 21 + ...arb-sepolia-market-USDC-ARB@26DEC2025.json | 38 + ...rb-sepolia-market-USDC-WBTC@26SEP2025.json | 38 + ...rb-sepolia-market-USDC-WETH@26DEC2025.json | 38 + ...-sepolia-market-USDC-wstETH@26SEP2025.json | 38 + ...ket-WETH-PT-weETH-26JUN2025@26DEC2025.json | 38 + ...b-sepolia-market-WETH-weETH@26SEP2025.json | 38 + ...-sepolia-market-WETH-wstETH@26SEP2025.json | 38 + .../bnb-mainnet-V2-adapters-29MAY2025.json | 26 + .../bnb-mainnet-access-manager.json | 15 + deployments/bnb-mainnet/bnb-mainnet-core.json | 25 + ...nb-mainnet-market-BTCB-USD1@25JUL2025.json | 38 + ...nb-mainnet-market-USDT-BTCB@25JUL2025.json | 38 + ...nb-mainnet-market-USDT-USD1@25JUL2025.json | 38 + ...nb-mainnet-market-USDT-WBNB@25JUL2025.json | 38 + ...b-mainnet-market-USDT-sUSDe@25JUL2025.json | 38 + ...nb-mainnet-market-WBNB-BTCB@25JUL2025.json | 38 + ...nb-mainnet-market-WBNB-USD1@25JUL2025.json | 38 + ...-mainnet-market-WBNB-ynBNBx@25JUL2025.json | 38 + ...ainnet-vault-TMX-USDT-Vault-13JUN2025.json | 25 + ...ainnet-vault-TMX-WBNB-Vault-13JUN2025.json | 25 + .../bnb-testnet-access-manager.json | 15 + deployments/bnb-testnet/bnb-testnet-core.json | 21 + ...rket-USDF-PT-USDF-24JUL2025@30MAY2025.json | 38 + ...testnet-market-WBNB-slisBNB@30MAY2025.json | 38 + .../bnb-testnet-vault-TMX-USDF-Vault.json | 24 + .../eth-mainnet-access-manager.json | 15 + .../eth-mainnet-core.json | 25 + ...ket-USDC-PT-sUSDE-29MAY2025@30MAY2025.json | 38 + ...nnet-market-USDC-USUALUSDC+@30MAY2025.json | 38 + ...th-mainnet-market-USDC-WBTC@30MAY2025.json | 38 + ...h-mainnet-market-USDC-cbBTC@30MAY2025.json | 38 + ...h-mainnet-market-USDC-eUSDe@29MAY2025.json | 38 + ...h-mainnet-market-USDC-sUSDe@30MAY2025.json | 38 + ...-mainnet-market-USDC-wstETH@30MAY2025.json | 38 + ...-mainnet-market-WETH-MCwETH@30MAY2025.json | 38 + ...-mainnet-market-WETH-gtWETH@30MAY2025.json | 38 + ...-mainnet-market-WETH-pufETH@30MAY2025.json | 38 + ...h-mainnet-market-WETH-weETH@30MAY2025.json | 38 + ...-pufETH-PT-pufETH-26JUN2025@30MAY2025.json | 38 + .../eth-mainnet-vault-TermMax USDC Vault.json | 24 + .../eth-mainnet-vault-TermMax WETH Vault.json | 24 + ...eth-mainnet-oracle-aggregator-0401-log.txt | 21 + .../deploy_markets_test_0402_log.txt | 370 +++++++++ .../eth-mainnet-access-manager.json | 15 + .../eth-mainnet-core.json | 25 + ...ket-USDC-PT-sUSDE-29MAY2025@02APR2025.json | 38 + ...nnet-market-USDC-USUALUSDC+@02APR2025.json | 38 + ...th-mainnet-market-USDC-WBTC@02APR2025.json | 38 + ...h-mainnet-market-USDC-cbBTC@02APR2025.json | 38 + ...h-mainnet-market-USDC-eUSDe@02APR2025.json | 38 + ...h-mainnet-market-USDC-sUSDe@02APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@02APR2025.json | 38 + ...-mainnet-market-WETH-MCwETH@02APR2025.json | 38 + ...-mainnet-market-WETH-gtWETH@02APR2025.json | 38 + ...-mainnet-market-WETH-pufETH@02APR2025.json | 38 + ...h-mainnet-market-WETH-weETH@02APR2025.json | 38 + ...-pufETH-PT-pufETH-26JUN2025@02APR2025.json | 38 + .../eth-mainnet-vault-TermMax USDC Vault.json | 24 + .../eth-mainnet-vault-TermMax WETH Vault.json | 24 + ...eth-mainnet-oracle-aggregator-0401-log.txt | 21 + .../deploy_markets_test_0402_log.txt | 370 +++++++++ .../eth-mainnet-access-manager.json | 15 + .../eth-mainnet-core.json | 25 + ...ket-USDC-PT-sUSDE-29MAY2025@03APR2025.json | 38 + ...nnet-market-USDC-USUALUSDC+@03APR2025.json | 38 + ...th-mainnet-market-USDC-WBTC@03APR2025.json | 38 + ...h-mainnet-market-USDC-cbBTC@03APR2025.json | 38 + ...h-mainnet-market-USDC-eUSDe@03APR2025.json | 38 + ...h-mainnet-market-USDC-sUSDe@03APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@03APR2025.json | 38 + ...-mainnet-market-WETH-MCwETH@03APR2025.json | 38 + ...-mainnet-market-WETH-gtWETH@03APR2025.json | 38 + ...-mainnet-market-WETH-pufETH@03APR2025.json | 38 + ...h-mainnet-market-WETH-weETH@03APR2025.json | 38 + ...-pufETH-PT-pufETH-26JUN2025@03APR2025.json | 38 + ...eth-mainnet-oracle-aggregator-0401-log.txt | 21 + .../deploy_markets_test_0402_log.txt | 370 +++++++++ .../eth-mainnet-access-manager.json | 15 + .../eth-mainnet-core.json | 25 + ...ket-USDC-PT-sUSDE-29MAY2025@04APR2025.json | 38 + ...nnet-market-USDC-USUALUSDC+@04APR2025.json | 38 + ...th-mainnet-market-USDC-WBTC@04APR2025.json | 38 + ...h-mainnet-market-USDC-cbBTC@04APR2025.json | 38 + ...h-mainnet-market-USDC-eUSDe@04APR2025.json | 38 + ...h-mainnet-market-USDC-sUSDe@04APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@04APR2025.json | 38 + ...-mainnet-market-WETH-MCwETH@04APR2025.json | 38 + ...-mainnet-market-WETH-gtWETH@04APR2025.json | 38 + ...-mainnet-market-WETH-pufETH@04APR2025.json | 38 + ...h-mainnet-market-WETH-weETH@04APR2025.json | 38 + ...-pufETH-PT-pufETH-26JUN2025@04APR2025.json | 38 + ...eth-mainnet-oracle-aggregator-0401-log.txt | 21 + .../deploy_markets_test_0402_log.txt | 370 +++++++++ .../eth-mainnet-access-manager.json | 15 + .../eth-mainnet-core.json | 25 + ...ket-USDC-PT-sUSDE-29MAY2025@04APR2025.json | 38 + ...nnet-market-USDC-USUALUSDC+@04APR2025.json | 38 + ...th-mainnet-market-USDC-WBTC@04APR2025.json | 38 + ...h-mainnet-market-USDC-cbBTC@04APR2025.json | 38 + ...h-mainnet-market-USDC-eUSDe@04APR2025.json | 38 + ...h-mainnet-market-USDC-sUSDe@04APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@04APR2025.json | 38 + ...-mainnet-market-WETH-MCwETH@04APR2025.json | 38 + ...-mainnet-market-WETH-gtWETH@04APR2025.json | 38 + ...-mainnet-market-WETH-pufETH@04APR2025.json | 38 + ...h-mainnet-market-WETH-weETH@04APR2025.json | 38 + ...-pufETH-PT-pufETH-26JUN2025@04APR2025.json | 38 + ...eth-mainnet-oracle-aggregator-0401-log.txt | 21 + .../deploy_markets_test_0402_log.txt | 370 +++++++++ .../eth-mainnet-access-manager.json | 15 + .../eth-mainnet-core.json | 25 + ...ket-USDC-PT-sUSDE-29MAY2025@05APR2025.json | 38 + ...nnet-market-USDC-USUALUSDC+@05APR2025.json | 38 + ...th-mainnet-market-USDC-WBTC@05APR2025.json | 38 + ...h-mainnet-market-USDC-cbBTC@05APR2025.json | 38 + ...h-mainnet-market-USDC-eUSDe@05APR2025.json | 38 + ...h-mainnet-market-USDC-sUSDe@05APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@05APR2025.json | 38 + ...-mainnet-market-WETH-MCwETH@05APR2025.json | 38 + ...-mainnet-market-WETH-gtWETH@05APR2025.json | 38 + ...-mainnet-market-WETH-pufETH@05APR2025.json | 38 + ...h-mainnet-market-WETH-weETH@05APR2025.json | 38 + ...-pufETH-PT-pufETH-26JUN2025@05APR2025.json | 38 + ...eth-mainnet-oracle-aggregator-0401-log.txt | 21 + .../deploy_markets_test_0402_log.txt | 370 +++++++++ .../eth-mainnet-access-manager.json | 15 + .../eth-mainnet-core.json | 25 + ...ket-USDC-PT-sUSDE-29MAY2025@05APR2025.json | 38 + ...nnet-market-USDC-USUALUSDC+@05APR2025.json | 38 + ...th-mainnet-market-USDC-WBTC@05APR2025.json | 38 + ...h-mainnet-market-USDC-cbBTC@05APR2025.json | 38 + ...h-mainnet-market-USDC-eUSDe@05APR2025.json | 38 + ...h-mainnet-market-USDC-sUSDe@05APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@05APR2025.json | 38 + ...-mainnet-market-WETH-MCwETH@05APR2025.json | 38 + ...-mainnet-market-WETH-gtWETH@05APR2025.json | 38 + ...-mainnet-market-WETH-pufETH@05APR2025.json | 38 + ...h-mainnet-market-WETH-weETH@05APR2025.json | 38 + ...-pufETH-PT-pufETH-26JUN2025@05APR2025.json | 38 + ...eth-mainnet-oracle-aggregator-0401-log.txt | 21 + .../deploy_markets_test_0402_log.txt | 370 +++++++++ .../eth-mainnet-access-manager.json | 15 + .../eth-mainnet-core.json | 25 + ...ket-USDC-PT-sUSDE-29MAY2025@06APR2025.json | 38 + ...nnet-market-USDC-USUALUSDC+@06APR2025.json | 38 + ...th-mainnet-market-USDC-WBTC@06APR2025.json | 38 + ...h-mainnet-market-USDC-cbBTC@06APR2025.json | 38 + ...h-mainnet-market-USDC-eUSDe@06APR2025.json | 38 + ...h-mainnet-market-USDC-sUSDe@06APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@06APR2025.json | 38 + ...-mainnet-market-WETH-MCwETH@06APR2025.json | 38 + ...-mainnet-market-WETH-gtWETH@06APR2025.json | 38 + ...-mainnet-market-WETH-pufETH@06APR2025.json | 38 + ...h-mainnet-market-WETH-weETH@06APR2025.json | 38 + ...-pufETH-PT-pufETH-26JUN2025@06APR2025.json | 38 + ...eth-mainnet-oracle-aggregator-0401-log.txt | 21 + ...y-market-eth-mainnet-20250406-1400-log.txt | 368 +++++++++ .../deploy_markets_test_0402_log.txt | 370 +++++++++ .../eth-mainnet-access-manager.json | 15 + .../eth-mainnet-core.json | 25 + ...ket-USDC-PT-sUSDE-29MAY2025@06APR2025.json | 38 + ...nnet-market-USDC-USUALUSDC+@06APR2025.json | 38 + ...th-mainnet-market-USDC-WBTC@06APR2025.json | 38 + ...h-mainnet-market-USDC-cbBTC@06APR2025.json | 38 + ...h-mainnet-market-USDC-eUSDe@06APR2025.json | 38 + ...h-mainnet-market-USDC-sUSDe@06APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@06APR2025.json | 38 + ...-mainnet-market-WETH-MCwETH@06APR2025.json | 38 + ...-mainnet-market-WETH-gtWETH@06APR2025.json | 38 + ...-mainnet-market-WETH-pufETH@06APR2025.json | 38 + ...h-mainnet-market-WETH-weETH@06APR2025.json | 38 + ...-pufETH-PT-pufETH-26JUN2025@06APR2025.json | 38 + ...eth-mainnet-oracle-aggregator-0401-log.txt | 21 + ...y-market-eth-mainnet-20250406-2000-log.txt | 368 +++++++++ .../deploy_markets_test_0402_log.txt | 370 +++++++++ .../eth-mainnet-access-manager.json | 15 + .../eth-mainnet-core.json | 25 + ...ket-USDC-PT-sUSDE-29MAY2025@06APR2025.json | 38 + ...nnet-market-USDC-USUALUSDC+@06APR2025.json | 38 + ...th-mainnet-market-USDC-WBTC@06APR2025.json | 38 + ...h-mainnet-market-USDC-cbBTC@06APR2025.json | 38 + ...h-mainnet-market-USDC-eUSDe@06APR2025.json | 38 + ...h-mainnet-market-USDC-sUSDe@06APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@06APR2025.json | 38 + ...-mainnet-market-WETH-MCwETH@06APR2025.json | 38 + ...-mainnet-market-WETH-gtWETH@06APR2025.json | 38 + ...-mainnet-market-WETH-pufETH@06APR2025.json | 38 + ...h-mainnet-market-WETH-weETH@06APR2025.json | 38 + ...-pufETH-PT-pufETH-26JUN2025@06APR2025.json | 38 + ...eth-mainnet-oracle-aggregator-0401-log.txt | 21 + ...y-market-eth-mainnet-20250407-1400-log.txt | 368 +++++++++ .../deploy_markets_test_0402_log.txt | 370 +++++++++ .../eth-mainnet-access-manager.json | 15 + .../eth-mainnet-core.json | 25 + ...ket-USDC-PT-sUSDE-29MAY2025@07APR2025.json | 38 + ...nnet-market-USDC-USUALUSDC+@07APR2025.json | 38 + ...th-mainnet-market-USDC-WBTC@07APR2025.json | 38 + ...h-mainnet-market-USDC-cbBTC@07APR2025.json | 38 + ...h-mainnet-market-USDC-eUSDe@07APR2025.json | 38 + ...h-mainnet-market-USDC-sUSDe@07APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@07APR2025.json | 38 + ...-mainnet-market-WETH-MCwETH@07APR2025.json | 38 + ...-mainnet-market-WETH-gtWETH@07APR2025.json | 38 + ...-mainnet-market-WETH-pufETH@07APR2025.json | 38 + ...h-mainnet-market-WETH-weETH@07APR2025.json | 38 + ...-pufETH-PT-pufETH-26JUN2025@07APR2025.json | 38 + ...eth-mainnet-oracle-aggregator-0401-log.txt | 21 + ...y-market-eth-mainnet-20250407-2000-log.txt | 371 +++++++++ .../deploy_markets_test_0402_log.txt | 370 +++++++++ .../eth-mainnet-access-manager.json | 15 + .../eth-mainnet-core.json | 25 + ...ket-USDC-PT-sUSDE-29MAY2025@07APR2025.json | 38 + ...nnet-market-USDC-USUALUSDC+@07APR2025.json | 38 + ...th-mainnet-market-USDC-WBTC@07APR2025.json | 38 + ...h-mainnet-market-USDC-cbBTC@07APR2025.json | 38 + ...h-mainnet-market-USDC-eUSDe@07APR2025.json | 38 + ...h-mainnet-market-USDC-sUSDe@07APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@07APR2025.json | 38 + ...-mainnet-market-WETH-MCwETH@07APR2025.json | 38 + ...-mainnet-market-WETH-gtWETH@07APR2025.json | 38 + ...-mainnet-market-WETH-pufETH@07APR2025.json | 38 + ...h-mainnet-market-WETH-weETH@07APR2025.json | 38 + ...-pufETH-PT-pufETH-26JUN2025@07APR2025.json | 38 + ...eth-mainnet-oracle-aggregator-0401-log.txt | 21 + ...y-market-eth-mainnet-20250408-1400-log.txt | 375 +++++++++ .../deploy_markets_test_0402_log.txt | 370 +++++++++ .../eth-mainnet-access-manager.json | 15 + .../eth-mainnet-core.json | 25 + ...ket-USDC-PT-sUSDE-29MAY2025@08APR2025.json | 38 + ...nnet-market-USDC-USUALUSDC+@08APR2025.json | 38 + ...th-mainnet-market-USDC-WBTC@08APR2025.json | 38 + ...h-mainnet-market-USDC-cbBTC@08APR2025.json | 38 + ...h-mainnet-market-USDC-eUSDe@08APR2025.json | 38 + ...h-mainnet-market-USDC-sUSDe@08APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@08APR2025.json | 38 + ...-mainnet-market-WETH-MCwETH@08APR2025.json | 38 + ...-mainnet-market-WETH-gtWETH@08APR2025.json | 38 + ...-mainnet-market-WETH-pufETH@08APR2025.json | 38 + ...h-mainnet-market-WETH-weETH@08APR2025.json | 38 + ...-pufETH-PT-pufETH-26JUN2025@08APR2025.json | 38 + ...eth-mainnet-oracle-aggregator-0401-log.txt | 21 + ...y-market-eth-mainnet-20250408-2000-log.txt | 368 +++++++++ .../deploy_markets_test_0402_log.txt | 370 +++++++++ .../eth-mainnet-access-manager.json | 15 + .../eth-mainnet-core.json | 25 + ...ket-USDC-PT-sUSDE-29MAY2025@08APR2025.json | 38 + ...nnet-market-USDC-USUALUSDC+@08APR2025.json | 38 + ...th-mainnet-market-USDC-WBTC@08APR2025.json | 38 + ...h-mainnet-market-USDC-cbBTC@08APR2025.json | 38 + ...h-mainnet-market-USDC-eUSDe@08APR2025.json | 38 + ...h-mainnet-market-USDC-sUSDe@08APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@08APR2025.json | 38 + ...-mainnet-market-WETH-MCwETH@08APR2025.json | 38 + ...-mainnet-market-WETH-gtWETH@08APR2025.json | 38 + ...-mainnet-market-WETH-pufETH@08APR2025.json | 38 + ...h-mainnet-market-WETH-weETH@08APR2025.json | 38 + ...-pufETH-PT-pufETH-26JUN2025@08APR2025.json | 38 + ...eth-mainnet-oracle-aggregator-0401-log.txt | 21 + ...y-market-eth-mainnet-20250409-1400-log.txt | 368 +++++++++ .../deploy_markets_test_0402_log.txt | 370 +++++++++ .../eth-mainnet-access-manager.json | 15 + .../eth-mainnet-core.json | 25 + ...ket-USDC-PT-sUSDE-29MAY2025@09APR2025.json | 38 + ...nnet-market-USDC-USUALUSDC+@09APR2025.json | 38 + ...th-mainnet-market-USDC-WBTC@09APR2025.json | 38 + ...h-mainnet-market-USDC-cbBTC@09APR2025.json | 38 + ...h-mainnet-market-USDC-eUSDe@09APR2025.json | 38 + ...h-mainnet-market-USDC-sUSDe@09APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@09APR2025.json | 38 + ...-mainnet-market-WETH-MCwETH@09APR2025.json | 38 + ...-mainnet-market-WETH-gtWETH@09APR2025.json | 38 + ...-mainnet-market-WETH-pufETH@09APR2025.json | 38 + ...h-mainnet-market-WETH-weETH@09APR2025.json | 38 + ...-pufETH-PT-pufETH-26JUN2025@09APR2025.json | 38 + ...eth-mainnet-oracle-aggregator-0401-log.txt | 21 + ...y-market-eth-mainnet-20250409-2000-log.txt | 368 +++++++++ .../deploy_markets_test_0402_log.txt | 370 +++++++++ .../eth-mainnet-access-manager.json | 15 + .../eth-mainnet-core.json | 25 + ...ket-USDC-PT-sUSDE-29MAY2025@09APR2025.json | 38 + ...nnet-market-USDC-USUALUSDC+@09APR2025.json | 38 + ...th-mainnet-market-USDC-WBTC@09APR2025.json | 38 + ...h-mainnet-market-USDC-cbBTC@09APR2025.json | 38 + ...h-mainnet-market-USDC-eUSDe@09APR2025.json | 38 + ...h-mainnet-market-USDC-sUSDe@09APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@09APR2025.json | 38 + ...-mainnet-market-WETH-MCwETH@09APR2025.json | 38 + ...-mainnet-market-WETH-gtWETH@09APR2025.json | 38 + ...-mainnet-market-WETH-pufETH@09APR2025.json | 38 + ...h-mainnet-market-WETH-weETH@09APR2025.json | 38 + ...-pufETH-PT-pufETH-26JUN2025@09APR2025.json | 38 + ...eth-mainnet-oracle-aggregator-0401-log.txt | 21 + ...y-market-eth-mainnet-20250410-1400-log.txt | 368 +++++++++ .../deploy_markets_test_0402_log.txt | 370 +++++++++ .../eth-mainnet-access-manager.json | 15 + .../eth-mainnet-core.json | 25 + ...ket-USDC-PT-sUSDE-29MAY2025@10APR2025.json | 38 + ...nnet-market-USDC-USUALUSDC+@10APR2025.json | 38 + ...th-mainnet-market-USDC-WBTC@10APR2025.json | 38 + ...h-mainnet-market-USDC-cbBTC@10APR2025.json | 38 + ...h-mainnet-market-USDC-eUSDe@10APR2025.json | 38 + ...h-mainnet-market-USDC-sUSDe@10APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@10APR2025.json | 38 + ...-mainnet-market-WETH-MCwETH@10APR2025.json | 38 + ...-mainnet-market-WETH-gtWETH@10APR2025.json | 38 + ...-mainnet-market-WETH-pufETH@10APR2025.json | 38 + ...h-mainnet-market-WETH-weETH@10APR2025.json | 38 + ...-pufETH-PT-pufETH-26JUN2025@10APR2025.json | 38 + ...eth-mainnet-oracle-aggregator-0401-log.txt | 21 + ...y-market-eth-mainnet-20250410-2000-log.txt | 358 +++++++++ .../deploy_markets_test_0402_log.txt | 370 +++++++++ .../eth-mainnet-access-manager.json | 15 + .../eth-mainnet-core.json | 25 + ...ket-USDC-PT-sUSDE-29MAY2025@10APR2025.json | 38 + ...nnet-market-USDC-USUALUSDC+@10APR2025.json | 38 + ...th-mainnet-market-USDC-WBTC@10APR2025.json | 38 + ...h-mainnet-market-USDC-cbBTC@10APR2025.json | 38 + ...h-mainnet-market-USDC-eUSDe@10APR2025.json | 38 + ...h-mainnet-market-USDC-sUSDe@10APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@10APR2025.json | 38 + ...-mainnet-market-WETH-MCwETH@10APR2025.json | 38 + ...-mainnet-market-WETH-gtWETH@10APR2025.json | 38 + ...-mainnet-market-WETH-pufETH@10APR2025.json | 38 + ...h-mainnet-market-WETH-weETH@10APR2025.json | 38 + ...-pufETH-PT-pufETH-26JUN2025@10APR2025.json | 38 + .../accept-oracles-20250418-log.txt | 77 ++ ...eth-mainnet-oracle-aggregator-0401-log.txt | 21 + .../deploy-eth-markets-20250530.txt | 396 ++++++++++ .../deploy-markets-20250417-log.txt | 122 +++ ...deploy-price-feeds-morpho-20250417-log.txt | 21 + .../deploy_markets_test_0402_log.txt | 370 +++++++++ .../eth-mainnet-access-manager.json | 15 + .../eth-mainnet-accumulated.json | 743 ++++++++++++++++++ ...ore-before-change-pendle-swap-adapter.json | 25 + ...nnet-core-before-change-vault-factory.json | 25 + .../eth-mainnet-core.json | 25 + ...ainnet-market-USDC-MC_USDCP@30MAY2025.json | 38 + ...et-USDC-PT-lvlUSD-29MAY2025@14APR2025.json | 38 + ...et-USDC-PT-lvlUSD-29MAY2025@30MAY2025.json | 38 + ...ket-USDC-PT-sUSDE-29MAY2025@30MAY2025.json | 38 + ...nnet-market-USDC-USUALUSDC+@30MAY2025.json | 38 + ...th-mainnet-market-USDC-WBTC@30MAY2025.json | 38 + ...h-mainnet-market-USDC-cbBTC@30MAY2025.json | 38 + ...h-mainnet-market-USDC-eUSDe@29MAY2025.json | 38 + ...mainnet-market-USDC-gtusdcf@30MAY2025.json | 38 + ...h-mainnet-market-USDC-sUSDe@30MAY2025.json | 38 + ...-mainnet-market-USDC-wstETH@30MAY2025.json | 38 + ...-mainnet-market-WETH-MCwETH@30MAY2025.json | 38 + ...-mainnet-market-WETH-gtWETH@30MAY2025.json | 38 + ...-mainnet-market-WETH-mhyETH@30MAY2025.json | 38 + ...-mainnet-market-WETH-pufETH@30MAY2025.json | 38 + ...h-mainnet-market-WETH-weETH@30MAY2025.json | 38 + ...innet-market-lvlUSD-slvlUSD@14APR2025.json | 38 + ...innet-market-lvlUSD-slvlUSD@30MAY2025.json | 38 + ...-pufETH-PT-pufETH-26JUN2025@30MAY2025.json | 38 + ...et-sUSDe-PT-sUSDE-29MAY2025@14APR2025.json | 38 + ...et-sUSDe-PT-sUSDE-29MAY2025@30MAY2025.json | 38 + ...net-market-wstETH-inwstETHs@30MAY2025.json | 38 + .../eth-mainnet-pendle-swap-v3-adapter.json | 14 + .../eth-mainnet-vault-TMX-USDC-PRIME.json | 24 + .../eth-mainnet-vault-TMX-USDC.json | 24 + .../eth-mainnet-vault-TMX-WETH.json | 24 + .../eth-mainnet-vault-TMX-wstETH-Vault.json | 24 + .../eth-mainnet-vault-Weiting USDC Vault.json | 24 + .../eth-mainnet-vault-factory.json | 14 + ...eth-mainnet-oracle-aggregator-0401-log.txt | 21 + ...loy-eth-markets-test-20250411-1500-log.txt | 368 +++++++++ .../deploy_markets_test_0402_log.txt | 370 +++++++++ .../eth-mainnet-access-manager.json | 15 + .../eth-mainnet-core.json | 25 + ...ket-USDC-PT-sUSDE-29MAY2025@11APR2025.json | 38 + ...nnet-market-USDC-USUALUSDC+@11APR2025.json | 38 + ...th-mainnet-market-USDC-WBTC@11APR2025.json | 38 + ...h-mainnet-market-USDC-cbBTC@11APR2025.json | 38 + ...h-mainnet-market-USDC-eUSDe@11APR2025.json | 38 + ...h-mainnet-market-USDC-sUSDe@11APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@11APR2025.json | 38 + ...-mainnet-market-WETH-MCwETH@11APR2025.json | 38 + ...-mainnet-market-WETH-gtWETH@11APR2025.json | 38 + ...-mainnet-market-WETH-pufETH@11APR2025.json | 38 + ...h-mainnet-market-WETH-weETH@11APR2025.json | 38 + ...-pufETH-PT-pufETH-26JUN2025@11APR2025.json | 38 + .../eth-mainnet-vault-TMX-USDC.json | 24 + .../eth-mainnet-vault-TMX-WETH.json | 24 + .../eth-mainnet-vault-Weiting USDC Vault.json | 24 + ...eth-mainnet-oracle-aggregator-0401-log.txt | 21 + ...loy-eth-markets-test-20250411-2000-log.txt | 368 +++++++++ .../deploy_markets_test_0402_log.txt | 370 +++++++++ .../eth-mainnet-access-manager.json | 15 + .../eth-mainnet-core.json | 25 + ...ket-USDC-PT-sUSDE-29MAY2025@11APR2025.json | 38 + ...nnet-market-USDC-USUALUSDC+@11APR2025.json | 38 + ...th-mainnet-market-USDC-WBTC@11APR2025.json | 38 + ...h-mainnet-market-USDC-cbBTC@11APR2025.json | 38 + ...h-mainnet-market-USDC-eUSDe@11APR2025.json | 38 + ...h-mainnet-market-USDC-sUSDe@11APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@11APR2025.json | 38 + ...-mainnet-market-WETH-MCwETH@11APR2025.json | 38 + ...-mainnet-market-WETH-gtWETH@11APR2025.json | 38 + ...-mainnet-market-WETH-pufETH@11APR2025.json | 38 + ...h-mainnet-market-WETH-weETH@11APR2025.json | 38 + ...-pufETH-PT-pufETH-26JUN2025@11APR2025.json | 38 + .../eth-mainnet-vault-TMX-USDC.json | 24 + .../eth-mainnet-vault-TMX-WETH.json | 24 + .../eth-mainnet-vault-Weiting USDC Vault.json | 24 + ...eth-mainnet-oracle-aggregator-0401-log.txt | 21 + ...loy-eth-markets-test-20250412-1500-log.txt | 368 +++++++++ .../deploy_markets_test_0402_log.txt | 370 +++++++++ .../eth-mainnet-access-manager.json | 15 + .../eth-mainnet-core.json | 25 + ...ket-USDC-PT-sUSDE-29MAY2025@12APR2025.json | 38 + ...nnet-market-USDC-USUALUSDC+@12APR2025.json | 38 + ...th-mainnet-market-USDC-WBTC@12APR2025.json | 38 + ...h-mainnet-market-USDC-cbBTC@12APR2025.json | 38 + ...h-mainnet-market-USDC-eUSDe@12APR2025.json | 38 + ...h-mainnet-market-USDC-sUSDe@12APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@12APR2025.json | 38 + ...-mainnet-market-WETH-MCwETH@12APR2025.json | 38 + ...-mainnet-market-WETH-gtWETH@12APR2025.json | 38 + ...-mainnet-market-WETH-pufETH@12APR2025.json | 38 + ...h-mainnet-market-WETH-weETH@12APR2025.json | 38 + ...-pufETH-PT-pufETH-26JUN2025@12APR2025.json | 38 + .../eth-mainnet-vault-TMX-USDC.json | 24 + .../eth-mainnet-vault-TMX-WETH.json | 24 + .../eth-mainnet-vault-Weiting USDC Vault.json | 24 + ...eth-mainnet-oracle-aggregator-0401-log.txt | 21 + ...loy-eth-markets-test-20250412-2000-log.txt | 368 +++++++++ .../deploy_markets_test_0402_log.txt | 370 +++++++++ .../eth-mainnet-access-manager.json | 15 + .../eth-mainnet-core.json | 25 + ...ket-USDC-PT-sUSDE-29MAY2025@12APR2025.json | 38 + ...nnet-market-USDC-USUALUSDC+@12APR2025.json | 38 + ...th-mainnet-market-USDC-WBTC@12APR2025.json | 38 + ...h-mainnet-market-USDC-cbBTC@12APR2025.json | 38 + ...h-mainnet-market-USDC-eUSDe@12APR2025.json | 38 + ...h-mainnet-market-USDC-sUSDe@12APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@12APR2025.json | 38 + ...-mainnet-market-WETH-MCwETH@12APR2025.json | 38 + ...-mainnet-market-WETH-gtWETH@12APR2025.json | 38 + ...-mainnet-market-WETH-pufETH@12APR2025.json | 38 + ...h-mainnet-market-WETH-weETH@12APR2025.json | 38 + ...-pufETH-PT-pufETH-26JUN2025@12APR2025.json | 38 + .../eth-mainnet-vault-TMX-USDC.json | 24 + .../eth-mainnet-vault-TMX-WETH.json | 24 + .../eth-mainnet-vault-Weiting USDC Vault.json | 24 + ...eth-mainnet-oracle-aggregator-0401-log.txt | 21 + ...loy-eth-markets-test-20250413-1500-log.txt | 368 +++++++++ .../deploy_markets_test_0402_log.txt | 370 +++++++++ .../eth-mainnet-access-manager.json | 15 + .../eth-mainnet-core.json | 25 + ...ket-USDC-PT-sUSDE-29MAY2025@13APR2025.json | 38 + ...nnet-market-USDC-USUALUSDC+@13APR2025.json | 38 + ...th-mainnet-market-USDC-WBTC@13APR2025.json | 38 + ...h-mainnet-market-USDC-cbBTC@13APR2025.json | 38 + ...h-mainnet-market-USDC-eUSDe@13APR2025.json | 38 + ...h-mainnet-market-USDC-sUSDe@13APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@13APR2025.json | 38 + ...-mainnet-market-WETH-MCwETH@13APR2025.json | 38 + ...-mainnet-market-WETH-gtWETH@13APR2025.json | 38 + ...-mainnet-market-WETH-pufETH@13APR2025.json | 38 + ...h-mainnet-market-WETH-weETH@13APR2025.json | 38 + ...-pufETH-PT-pufETH-26JUN2025@13APR2025.json | 38 + .../eth-mainnet-vault-TMX-USDC.json | 24 + .../eth-mainnet-vault-TMX-WETH.json | 24 + .../eth-mainnet-vault-Weiting USDC Vault.json | 24 + ...eth-mainnet-oracle-aggregator-0401-log.txt | 21 + ...loy-eth-markets-test-20250413-2000-log.txt | 452 +++++++++++ .../deploy_markets_test_0402_log.txt | 370 +++++++++ .../eth-mainnet-access-manager.json | 15 + .../eth-mainnet-core.json | 25 + ...ket-USDC-PT-sUSDE-29MAY2025@13APR2025.json | 38 + ...nnet-market-USDC-USUALUSDC+@13APR2025.json | 38 + ...th-mainnet-market-USDC-WBTC@13APR2025.json | 38 + ...h-mainnet-market-USDC-cbBTC@13APR2025.json | 38 + ...h-mainnet-market-USDC-eUSDe@13APR2025.json | 38 + ...h-mainnet-market-USDC-sUSDe@13APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@13APR2025.json | 38 + ...-mainnet-market-WETH-MCwETH@13APR2025.json | 38 + ...-mainnet-market-WETH-gtWETH@13APR2025.json | 38 + ...-mainnet-market-WETH-pufETH@13APR2025.json | 38 + ...h-mainnet-market-WETH-weETH@13APR2025.json | 38 + ...-pufETH-PT-pufETH-26JUN2025@13APR2025.json | 38 + .../eth-mainnet-vault-TMX-USDC.json | 24 + .../eth-mainnet-vault-TMX-WETH.json | 24 + .../eth-mainnet-vault-Weiting USDC Vault.json | 24 + ...eth-mainnet-oracle-aggregator-0401-log.txt | 21 + ...loy-eth-markets-test-20250414-1500-log.txt | 368 +++++++++ .../deploy_markets_test_0402_log.txt | 370 +++++++++ .../eth-mainnet-access-manager.json | 15 + .../eth-mainnet-core.json | 25 + ...ket-USDC-PT-sUSDE-29MAY2025@14APR2025.json | 38 + ...nnet-market-USDC-USUALUSDC+@14APR2025.json | 38 + ...th-mainnet-market-USDC-WBTC@14APR2025.json | 38 + ...h-mainnet-market-USDC-cbBTC@14APR2025.json | 38 + ...h-mainnet-market-USDC-eUSDe@14APR2025.json | 38 + ...h-mainnet-market-USDC-sUSDe@14APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@14APR2025.json | 38 + ...-mainnet-market-WETH-MCwETH@14APR2025.json | 38 + ...-mainnet-market-WETH-gtWETH@14APR2025.json | 38 + ...-mainnet-market-WETH-pufETH@14APR2025.json | 38 + ...h-mainnet-market-WETH-weETH@14APR2025.json | 38 + ...-pufETH-PT-pufETH-26JUN2025@14APR2025.json | 38 + .../eth-mainnet-vault-TMX-USDC.json | 24 + .../eth-mainnet-vault-TMX-WETH.json | 24 + .../eth-mainnet-vault-Weiting USDC Vault.json | 24 + ...eth-mainnet-oracle-aggregator-0401-log.txt | 21 + ...loy-eth-markets-test-20250414-2000-log.txt | 368 +++++++++ .../deploy_markets_test_0402_log.txt | 370 +++++++++ .../eth-mainnet-access-manager.json | 15 + .../eth-mainnet-core.json | 25 + ...ket-USDC-PT-sUSDE-29MAY2025@14APR2025.json | 38 + ...nnet-market-USDC-USUALUSDC+@14APR2025.json | 38 + ...th-mainnet-market-USDC-WBTC@14APR2025.json | 38 + ...h-mainnet-market-USDC-cbBTC@14APR2025.json | 38 + ...h-mainnet-market-USDC-eUSDe@14APR2025.json | 38 + ...h-mainnet-market-USDC-sUSDe@14APR2025.json | 38 + ...-mainnet-market-USDC-wstETH@14APR2025.json | 38 + ...-mainnet-market-WETH-MCwETH@14APR2025.json | 38 + ...-mainnet-market-WETH-gtWETH@14APR2025.json | 38 + ...-mainnet-market-WETH-pufETH@14APR2025.json | 38 + ...h-mainnet-market-WETH-weETH@14APR2025.json | 38 + ...-pufETH-PT-pufETH-26JUN2025@14APR2025.json | 38 + .../eth-mainnet-vault-TMX-USDC.json | 24 + .../eth-mainnet-vault-TMX-WETH.json | 24 + .../eth-mainnet-vault-Weiting USDC Vault.json | 24 + .../eth-mainnet/accept-oracle-PT-USDS-log.txt | 73 ++ .../accept-oracles-20250418-log.txt | 77 ++ .../accept-oracles-20250515-log.txt | 28 + .../accept-oracles-20250516-log.txt | 21 + .../deploy-PT-cUSDO-PT-lvlUSD-markets-log.txt | 145 ++++ ...eth-mainnet-oracle-aggregator-0401-log.txt | 21 + .../deploy-eth-markets-20250515-log.txt | 197 +++++ ...deploy-eth-markets-mature-20250627-log.txt | 270 +++++++ .../deploy-inwsteth-price-feed-log.txt | 16 + .../deploy-markets-20250417-log.txt | 122 +++ ...loy-markets-pt-susde-and-pt-pufeth-log.txt | 120 +++ .../deploy-price-feeds-20250508-log.txt | 34 + ...deploy-price-feeds-morpho-20250417-log.txt | 21 + .../deploy_markets_test_0402_log.txt | 370 +++++++++ .../eth-mainnet-V2-adapters-03JUN2025.json | 26 + .../eth-mainnet-access-manager.json | 15 + .../eth-mainnet/eth-mainnet-accumulated.json | 743 ++++++++++++++++++ ...ore-before-change-pendle-swap-adapter.json | 25 + ...nnet-core-before-change-vault-factory.json | 25 + deployments/eth-mainnet/eth-mainnet-core.json | 25 + ...-mainnet-market-USDC-MC_PTs@15SEP2025.json | 38 + ...ainnet-market-USDC-MC_USDCP@29AUG2025.json | 38 + ...ainnet-market-USDC-MC_USDCP@30MAY2025.json | 38 + ...rket-USDC-PT-USDS-14AUG2025@15AUG2025.json | 38 + ...ket-USDC-PT-cUSDO-19JUN2025@20JUN2025.json | 38 + ...et-USDC-PT-lvlUSD-25SEP2025@25JUL2025.json | 38 + ...et-USDC-PT-lvlUSD-25SEP2025@26SEP2025.json | 38 + ...et-USDC-PT-lvlUSD-29MAY2025@14APR2025.json | 38 + ...et-USDC-PT-lvlUSD-29MAY2025@30MAY2025.json | 38 + ...rket-USDC-PT-mMEV-31JUL2025@01AUG2025.json | 38 + ...ket-USDC-PT-sUSDE-31JUL2025@01AUG2025.json | 38 + ...t-USDC-PT-slvlUSD-25SEP2025@26SEP2025.json | 38 + ...th-mainnet-market-USDC-WBTC@26SEP2025.json | 38 + ...th-mainnet-market-USDC-WBTC@27JUN2025.json | 38 + ...th-mainnet-market-USDC-XAUM@27JUN2025.json | 38 + ...h-mainnet-market-USDC-cUSDO@25JUL2025.json | 38 + ...h-mainnet-market-USDC-cbBTC@27JUN2025.json | 38 + ...h-mainnet-market-USDC-eUSDe@15AUG2025.json | 38 + ...mainnet-market-USDC-gtusdcf@30MAY2025.json | 38 + ...th-mainnet-market-USDC-mMEV@01AUG2025.json | 38 + ...h-mainnet-market-USDC-sUSDe@26SEP2025.json | 38 + ...h-mainnet-market-USDC-sUSDe@27JUN2025.json | 38 + ...-mainnet-market-USDC-wstETH@27JUN2025.json | 38 + ...th-mainnet-market-USDC-xUSD@26SEP2025.json | 38 + ...th-mainnet-market-USDC-xUSD@29AUG2025.json | 38 + ...h-mainnet-market-WBTC-sUSDe@26SEP2025.json | 38 + ...h-mainnet-market-WBTC-sUSDe@27JUN2025.json | 38 + ...et-WETH-PT-pufETH-26JUN2025@27JUN2025.json | 38 + ...-mainnet-market-WETH-mhyETH@30MAY2025.json | 38 + ...-mainnet-market-WETH-pufETH@27JUN2025.json | 38 + ...-mainnet-market-WETH-pufETH@29AUG2025.json | 38 + ...h-mainnet-market-WETH-sUSDe@26SEP2025.json | 38 + ...h-mainnet-market-WETH-sUSDe@27JUN2025.json | 38 + ...h-mainnet-market-WETH-weETH@26SEP2025.json | 38 + ...h-mainnet-market-WETH-weETH@27JUN2025.json | 38 + ...-mainnet-market-WETH-wstETH@26SEP2025.json | 38 + ...-mainnet-market-WETH-ynETHx@29AUG2025.json | 38 + ...innet-market-lvlUSD-slvlUSD@14APR2025.json | 38 + ...innet-market-lvlUSD-slvlUSD@27JUN2025.json | 38 + ...innet-market-lvlUSD-slvlUSD@30MAY2025.json | 38 + ...-pufETH-PT-pufETH-26JUN2025@27JUN2025.json | 38 + ...et-sUSDe-PT-sUSDE-29MAY2025@14APR2025.json | 38 + ...et-sUSDe-PT-sUSDE-29MAY2025@30MAY2025.json | 38 + ...et-sUSDe-PT-sUSDE-31JUL2025@01AUG2025.json | 38 + ...-mainnet-market-wstETH-ETH+@15AUG2025.json | 38 + ...-mainnet-market-wstETH-ETH+@15SEP2025.json | 38 + ...net-market-wstETH-inwstETHs@25JUL2025.json | 38 + ...net-market-wstETH-inwstETHs@27JUN2025.json | 38 + ...net-market-wstETH-inwstETHs@30MAY2025.json | 38 + .../eth-mainnet-pendle-swap-v3-adapter.json | 14 + .../eth-mainnet-vault-TMX-LBTC-Vault.json | 24 + ...mainnet-vault-TMX-USDC-Delivery-Vault.json | 24 + .../eth-mainnet-vault-TMX-USDC-PRIME.json | 24 + .../eth-mainnet-vault-TMX-USDC.json | 24 + .../eth-mainnet-vault-TMX-WBTC-Vault.json | 24 + ...mainnet-vault-TMX-WETH-Delivery-Vault.json | 24 + .../eth-mainnet-vault-TMX-WETH.json | 24 + .../eth-mainnet-vault-TMX-XAU-USDC-Vault.json | 24 + .../eth-mainnet-vault-TMX-eUSDe-Vault.json | 24 + .../eth-mainnet-vault-TMX-pufETH-Vault.json | 24 + .../eth-mainnet-vault-TMX-sUSDe-Vault.json | 24 + .../eth-mainnet-vault-TMX-uniBTC-Vault.json | 24 + .../eth-mainnet-vault-TMX-wstETH-Vault.json | 24 + .../eth-mainnet-vault-TMX-wstUSR-Vault.json | 24 + .../eth-mainnet-vault-Weiting USDC Vault.json | 24 + .../eth-mainnet-vault-factory.json | 14 + ...mit-eth-mainnet-pt-susde-31jul2025-log.txt | 12 + .../submit-inwsteth-oracle-log.txt | 37 + .../submit-oracles-20250417-log.txt | 47 ++ .../submit-oracles-20250515-log.txt | 23 + .../submit-price-feed-20250522-log.txt | 120 +++ .../eth-sepolia-access-manager.json | 15 + .../eth-sepolia-core.json | 21 + ...ket-USDC-PT-sUSDE-29MAY2025@06APR2025.json | 38 + ...olia-market-USDC-USUALUSDC+@06APR2025.json | 38 + ...th-sepolia-market-USDC-WBTC@06APR2025.json | 38 + ...h-sepolia-market-USDC-cbBTC@06APR2025.json | 38 + ...h-sepolia-market-USDC-eUSDe@06APR2025.json | 38 + ...h-sepolia-market-USDC-sUSDe@06APR2025.json | 38 + ...-sepolia-market-USDC-wstETH@06APR2025.json | 38 + ...-sepolia-market-WETH-MCwETH@06APR2025.json | 38 + ...-sepolia-market-WETH-gtWETH@06APR2025.json | 38 + ...-sepolia-market-WETH-pufETH@06APR2025.json | 38 + ...h-sepolia-market-WETH-weETH@06APR2025.json | 38 + ...-pufETH-PT-pufETH-26JUN2025@06APR2025.json | 38 + .../eth-sepolia-access-manager.json | 15 + .../eth-sepolia-core.json | 21 + ...ket-USDC-PT-sUSDE-29MAY2025@30MAY2025.json | 38 + ...olia-market-USDC-USUALUSDC+@30MAY2025.json | 38 + ...th-sepolia-market-USDC-WBTC@30MAY2025.json | 38 + ...h-sepolia-market-USDC-cbBTC@30MAY2025.json | 38 + ...h-sepolia-market-USDC-eUSDe@29MAY2025.json | 38 + ...h-sepolia-market-USDC-sUSDe@30MAY2025.json | 38 + ...-sepolia-market-USDC-wstETH@30MAY2025.json | 38 + ...-sepolia-market-WETH-MCwETH@30MAY2025.json | 38 + ...-sepolia-market-WETH-gtWETH@30MAY2025.json | 38 + ...-sepolia-market-WETH-pufETH@30MAY2025.json | 38 + ...h-sepolia-market-WETH-weETH@30MAY2025.json | 38 + ...-pufETH-PT-pufETH-26JUN2025@30MAY2025.json | 38 + .../eth-sepolia-access-manager.json | 15 + .../eth-sepolia-core.json | 21 + ...-sepolia-market-USDC-wstETH@27MAY2025.json | 38 + ...h-sepolia-market-WETH-weETH@27MAY2025.json | 38 + .../eth-sepolia-vault-TMX-USDC.json | 24 + .../eth-sepolia-access-manager.json | 15 + .../eth-sepolia-core.json | 21 + ...ket-USDC-PT-sUSDE-29MAY2025@30MAY2025.json | 38 + ...olia-market-USDC-USUALUSDC+@30MAY2025.json | 38 + ...th-sepolia-market-USDC-WBTC@30MAY2025.json | 38 + ...h-sepolia-market-USDC-cbBTC@30MAY2025.json | 38 + ...h-sepolia-market-USDC-eUSDe@29MAY2025.json | 38 + ...h-sepolia-market-USDC-sUSDe@30MAY2025.json | 38 + ...-sepolia-market-USDC-wstETH@11APR2025.json | 38 + ...-sepolia-market-USDC-wstETH@27JUN2025.json | 38 + ...-sepolia-market-USDC-wstETH@27MAY2025.json | 38 + ...-sepolia-market-USDC-wstETH@28MAY2025.json | 38 + ...-sepolia-market-USDC-wstETH@30MAY2025.json | 38 + ...-sepolia-market-WETH-MCwETH@30MAY2025.json | 38 + ...-sepolia-market-WETH-gtWETH@30MAY2025.json | 38 + ...-sepolia-market-WETH-pufETH@30MAY2025.json | 38 + ...h-sepolia-market-WETH-weETH@11APR2025.json | 38 + ...h-sepolia-market-WETH-weETH@27JUN2025.json | 38 + ...h-sepolia-market-WETH-weETH@27MAY2025.json | 38 + ...h-sepolia-market-WETH-weETH@30MAY2025.json | 38 + ...-pufETH-PT-pufETH-26JUN2025@30MAY2025.json | 38 + .../eth-sepolia-vault-TMT-USDC.json | 24 + ...epolia-vault-TMX-USDC-Vault-02JUN2025.json | 25 + .../eth-sepolia-vault-TMX-USDC.json | 24 + .../eth-sepolia-vault-TMX-WETH.json | 24 + .../eth-sepolia-access-manager.json | 15 + .../eth-sepolia-core.json | 21 + ...ket-USDC-PT-sUSDE-29MAY2025@30MAY2025.json | 38 + ...olia-market-USDC-USUALUSDC+@30MAY2025.json | 38 + ...th-sepolia-market-USDC-WBTC@30MAY2025.json | 38 + ...h-sepolia-market-USDC-cbBTC@30MAY2025.json | 38 + ...h-sepolia-market-USDC-eUSDe@29MAY2025.json | 38 + ...h-sepolia-market-USDC-sUSDe@30MAY2025.json | 38 + ...-sepolia-market-USDC-wstETH@11APR2025.json | 38 + ...-sepolia-market-USDC-wstETH@30MAY2025.json | 38 + ...-sepolia-market-WETH-MCwETH@30MAY2025.json | 38 + ...-sepolia-market-WETH-gtWETH@30MAY2025.json | 38 + ...-sepolia-market-WETH-pufETH@30MAY2025.json | 38 + ...h-sepolia-market-WETH-weETH@11APR2025.json | 38 + ...h-sepolia-market-WETH-weETH@30MAY2025.json | 38 + ...-pufETH-PT-pufETH-26JUN2025@30MAY2025.json | 38 + .../eth-sepolia-vault-TMT-USDC.json | 24 + .../eth-sepolia-vault-TMX-USDC.json | 24 + .../eth-sepolia-vault-TMX-WETH.json | 24 + .../eth-sepolia-access-manager.json | 15 + .../eth-sepolia-core.json | 21 + ...ket-USDC-PT-sUSDE-31JUL2025@26SEP2025.json | 38 + ...th-sepolia-market-USDC-WBTC@26DEC2025.json | 38 + ...h-sepolia-market-USDC-eUSDe@26DEC2025.json | 38 + ...h-sepolia-market-USDC-sUSDe@26SEP2025.json | 38 + ...-sepolia-market-USDC-wstETH@26SEP2025.json | 38 + ...-sepolia-market-WETH-pufETH@26DEC2025.json | 38 + ...h-sepolia-market-WETH-weETH@26SEP2025.json | 38 + ...epolia-vault-TMX-USDC-Vault-07JUN2025.json | 25 + script.sh | 5 +- script/deploy/DeployAdapters.s.sol | 187 +++++ script/deploy/DeployBase.s.sol | 87 +- 1046 files changed, 58381 insertions(+), 29 deletions(-) create mode 100644 deployments/arb-mainnet-v1.0.8-20250404-2000/arb-mainnet-access-manager.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250404-2000/arb-mainnet-core.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250404-2000/arb-mainnet-market-USDC-ARB@04APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250404-2000/arb-mainnet-market-USDC-WBTC@04APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250404-2000/arb-mainnet-market-USDC-WETH@04APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250404-2000/arb-mainnet-market-USDC-wstETH@04APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250404-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@04APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250404-2000/arb-mainnet-market-WETH-weETH@04APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250404-2000/arb-mainnet-market-WETH-wstETH@04APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250405-1200/arb-mainnet-access-manager.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250405-1200/arb-mainnet-core.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250405-1200/arb-mainnet-market-USDC-ARB@05APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250405-1200/arb-mainnet-market-USDC-WBTC@05APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250405-1200/arb-mainnet-market-USDC-WETH@05APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250405-1200/arb-mainnet-market-USDC-wstETH@05APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250405-1200/arb-mainnet-market-WETH-PT-weETH-26JUN2025@05APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250405-1200/arb-mainnet-market-WETH-weETH@05APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250405-1200/arb-mainnet-market-WETH-wstETH@05APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250406-1400/accept-oracles-20250403-log.txt create mode 100644 deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-access-manager.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-core.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-market-USDC-ARB@06APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-market-USDC-WBTC@06APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-market-USDC-WETH@06APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-market-USDC-wstETH@06APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-market-WETH-PT-weETH-26JUN2025@06APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-market-WETH-weETH@06APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-market-WETH-wstETH@06APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-vault-TermMax USDC Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-vault-TermMax WETH Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250406-1400/deploy-market-arb-mainnet-20250406-1400-log.txt create mode 100644 deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-access-manager.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-core.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-market-USDC-ARB@06APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-market-USDC-WBTC@06APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-market-USDC-WETH@06APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-market-USDC-wstETH@06APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@06APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-market-WETH-weETH@06APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-market-WETH-wstETH@06APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-vault-TermMax USDC Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-vault-TermMax WETH Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250406-2000/deploy-market-arb-mainnet-20250406-2000-log.txt create mode 100644 deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-access-manager.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-core.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-market-USDC-ARB@07APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-market-USDC-WBTC@07APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-market-USDC-WETH@07APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-market-USDC-wstETH@07APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-market-WETH-PT-weETH-26JUN2025@07APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-market-WETH-weETH@07APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-market-WETH-wstETH@07APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-vault-TermMax USDC Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-vault-TermMax WETH Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250407-1400/deploy-market-arb-mainnet-20250407-1400-log.txt create mode 100644 deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-access-manager.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-core.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-market-USDC-ARB@07APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-market-USDC-WBTC@07APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-market-USDC-WETH@07APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-market-USDC-wstETH@07APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@07APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-market-WETH-weETH@07APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-market-WETH-wstETH@07APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-vault-TermMax USDC Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-vault-TermMax WETH Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250407-2000/deploy-market-arb-mainnet-20250407-2000-log.txt create mode 100644 deployments/arb-mainnet-v1.0.8-20250408-1400/accept-oracles-20250403-log.txt create mode 100644 deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-access-manager.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-core.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-market-USDC-ARB@08APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-market-USDC-WBTC@08APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-market-USDC-WETH@08APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-market-USDC-wstETH@08APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-market-WETH-PT-weETH-26JUN2025@08APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-market-WETH-weETH@08APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-market-WETH-wstETH@08APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-vault-TermMax USDC Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-vault-TermMax WETH Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250408-1400/deploy-market-arb-mainnet-20250408-1400-log.txt create mode 100644 deployments/arb-mainnet-v1.0.8-20250408-2000/accept-oracles-20250403-log.txt create mode 100644 deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-access-manager.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-core.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-market-USDC-ARB@08APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-market-USDC-WBTC@08APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-market-USDC-WETH@08APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-market-USDC-wstETH@08APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@08APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-market-WETH-weETH@08APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-market-WETH-wstETH@08APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-vault-TermMax USDC Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-vault-TermMax WETH Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250408-2000/deploy-market-arb-mainnet-20250408-2000-log.txt create mode 100644 deployments/arb-mainnet-v1.0.8-20250409-1400/accept-oracles-20250403-log.txt create mode 100644 deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-access-manager.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-core.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-market-USDC-ARB@09APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-market-USDC-WBTC@09APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-market-USDC-WETH@09APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-market-USDC-wstETH@09APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-market-WETH-PT-weETH-26JUN2025@09APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-market-WETH-weETH@09APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-market-WETH-wstETH@09APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-vault-TermMax USDC Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-vault-TermMax WETH Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250409-1400/deploy-market-arb-mainnet-20250409-1400-log.txt create mode 100644 deployments/arb-mainnet-v1.0.8-20250409-2000/accept-oracles-20250403-log.txt create mode 100644 deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-access-manager.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-core.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-market-USDC-ARB@09APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-market-USDC-WBTC@09APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-market-USDC-WETH@09APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-market-USDC-wstETH@09APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@09APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-market-WETH-weETH@09APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-market-WETH-wstETH@09APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-vault-TermMax USDC Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-vault-TermMax WETH Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250409-2000/deploy-market-arb-mainnet-20250409-2000-log.txt create mode 100644 deployments/arb-mainnet-v1.0.8-20250410-1400/accept-oracles-20250403-log.txt create mode 100644 deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-access-manager.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-core.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-market-USDC-ARB@10APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-market-USDC-WBTC@10APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-market-USDC-WETH@10APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-market-USDC-wstETH@10APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-market-WETH-PT-weETH-26JUN2025@10APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-market-WETH-weETH@10APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-market-WETH-wstETH@10APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-vault-TermMax USDC Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-vault-TermMax WETH Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250410-1400/deploy-market-arb-mainnet-20250410-1400-log.txt create mode 100644 deployments/arb-mainnet-v1.0.8-20250410-2000/accept-oracles-20250403-log.txt create mode 100644 deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-access-manager.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-core.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-market-USDC-ARB@10APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-market-USDC-WBTC@10APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-market-USDC-WETH@10APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-market-USDC-wstETH@10APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@10APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-market-WETH-weETH@10APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-market-WETH-wstETH@10APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-vault-TermMax USDC Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-vault-TermMax WETH Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250410-2000/deploy-market-arb-mainnet-20250410-2000-log.txt create mode 100644 deployments/arb-mainnet-v1.0.8-20250530/accept-oracles-20250403-log.txt create mode 100644 deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-access-manager.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-core.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-market-USDC-ARB@30MAY2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-market-USDC-WBTC@30MAY2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-market-USDC-WETH@30MAY2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-market-USDC-wstETH@30MAY2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-market-WETH-PT-weETH-26JUN2025@27JUN2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-market-WETH-weETH@30MAY2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-market-WETH-wstETH@30MAY2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-vault-TMX-USDC.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-vault-TMX-WETH.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-vault-TermMax USDC Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-vault-TermMax WETH Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-20250530/deploy-arb-markets-20250530.txt create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250411-1500/accept-oracles-20250403-log.txt create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-access-manager.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-core.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-market-USDC-ARB@11APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-market-USDC-WBTC@11APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-market-USDC-WETH@11APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-market-USDC-wstETH@11APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-market-WETH-PT-weETH-26JUN2025@11APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-market-WETH-weETH@11APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-market-WETH-wstETH@11APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-vault-TMX-USDC.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-vault-TMX-WETH.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-vault-TermMax USDC Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-vault-TermMax WETH Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250411-1500/deploy-arb-markets-test-0411-1500-log.txt create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250411-2000/accept-oracles-20250403-log.txt create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-access-manager.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-core.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-market-USDC-ARB@11APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-market-USDC-WBTC@11APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-market-USDC-WETH@11APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-market-USDC-wstETH@11APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@11APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-market-WETH-weETH@11APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-market-WETH-wstETH@11APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-vault-TMX-USDC.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-vault-TMX-WETH.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-vault-TermMax USDC Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-vault-TermMax WETH Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250411-2000/deploy-arb-markets-test-0411-2000-log.txt create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250412-1500/accept-oracles-20250403-log.txt create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-access-manager.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-core.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-market-USDC-ARB@12APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-market-USDC-WBTC@12APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-market-USDC-WETH@12APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-market-USDC-wstETH@12APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-market-WETH-PT-weETH-26JUN2025@12APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-market-WETH-weETH@12APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-market-WETH-wstETH@12APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-vault-TMX-USDC.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-vault-TMX-WETH.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-vault-TermMax USDC Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-vault-TermMax WETH Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250412-1500/deploy-arb-markets-test-0412-1500-log.txt create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250412-2000/accept-oracles-20250403-log.txt create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-access-manager.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-core.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-market-USDC-ARB@12APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-market-USDC-WBTC@12APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-market-USDC-WETH@12APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-market-USDC-wstETH@12APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@12APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-market-WETH-weETH@12APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-market-WETH-wstETH@12APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-vault-TMX-USDC.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-vault-TMX-WETH.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-vault-TermMax USDC Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-vault-TermMax WETH Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250412-2000/deploy-arb-markets-test-0412-2000-log.txt create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250413-1500/accept-oracles-20250403-log.txt create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-access-manager.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-core.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-market-USDC-ARB@13APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-market-USDC-WBTC@13APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-market-USDC-WETH@13APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-market-USDC-wstETH@13APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-market-WETH-PT-weETH-26JUN2025@13APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-market-WETH-weETH@13APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-market-WETH-wstETH@13APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-vault-TMX-USDC.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-vault-TMX-WETH.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-vault-TermMax USDC Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-vault-TermMax WETH Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250413-1500/deploy-arb-markets-test-0413-1500-log.txt create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250413-2000/accept-oracles-20250403-log.txt create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-access-manager.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-core.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-market-USDC-ARB@13APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-market-USDC-WBTC@13APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-market-USDC-WETH@13APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-market-USDC-wstETH@13APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@13APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-market-WETH-weETH@13APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-market-WETH-wstETH@13APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-vault-TMX-USDC.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-vault-TMX-WETH.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-vault-TermMax USDC Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-vault-TermMax WETH Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250413-2000/deploy-arb-markets-test-0413-2000-log.txt create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250414-1500/accept-oracles-20250403-log.txt create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-access-manager.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-core.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-market-USDC-ARB@14APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-market-USDC-WBTC@14APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-market-USDC-WETH@14APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-market-USDC-wstETH@14APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-market-WETH-PT-weETH-26JUN2025@14APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-market-WETH-weETH@14APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-market-WETH-wstETH@14APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-vault-TMX-USDC.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-vault-TMX-WETH.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-vault-TermMax USDC Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-vault-TermMax WETH Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250414-1500/deploy-arb-markets-test-20250414-1500-log.txt create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250414-2000/accept-oracles-20250403-log.txt create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-access-manager.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-core.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-market-USDC-ARB@14APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-market-USDC-WBTC@14APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-market-USDC-WETH@14APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-market-USDC-wstETH@14APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@14APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-market-WETH-weETH@14APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-market-WETH-wstETH@14APR2025.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-vault-TMX-USDC.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-vault-TMX-WETH.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-vault-TermMax USDC Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-vault-TermMax WETH Vault.json create mode 100644 deployments/arb-mainnet-v1.0.8-test-20250414-2000/deploy-arb-markets-test-20250414-2000-log.txt create mode 100644 deployments/arb-mainnet/accept-oracles-20250403-log.txt create mode 100644 deployments/arb-mainnet/arb-mainnet-V2-adapters-03JUN2025.json create mode 100644 deployments/arb-mainnet/arb-mainnet-access-manager.json create mode 100644 deployments/arb-mainnet/arb-mainnet-core.json create mode 100644 deployments/arb-mainnet/arb-mainnet-market-USDC-ARB@27JUN2025.json create mode 100644 deployments/arb-mainnet/arb-mainnet-market-USDC-WBTC@27JUN2025.json create mode 100644 deployments/arb-mainnet/arb-mainnet-market-USDC-WETH@27JUN2025.json create mode 100644 deployments/arb-mainnet/arb-mainnet-market-USDC-wstETH@27JUN2025.json create mode 100644 deployments/arb-mainnet/arb-mainnet-market-WETH-weETH@27JUN2025.json create mode 100644 deployments/arb-mainnet/arb-mainnet-market-WETH-wstETH@27JUN2025.json create mode 100644 deployments/arb-mainnet/arb-mainnet-pendle-swap-v3-adapter.json create mode 100644 deployments/arb-mainnet/arb-mainnet-vault-TMX-USDC.json create mode 100644 deployments/arb-mainnet/arb-mainnet-vault-TMX-WETH.json create mode 100644 deployments/arb-mainnet/arb-mainnet-vault-TermMax USDC Vault.json create mode 100644 deployments/arb-mainnet/arb-mainnet-vault-TermMax WETH Vault.json create mode 100644 deployments/arb-mainnet/arb-mainnet-vault-factory-03JUN2025.json create mode 100644 deployments/arb-mainnet/deploy-arb-markets-mature-20250627-log.txt create mode 100644 deployments/arb-sepolia-v1.0.8-sandbox-20250404/arb-sepolia-access-manager.json create mode 100644 deployments/arb-sepolia-v1.0.8-sandbox-20250404/arb-sepolia-core.json create mode 100644 deployments/arb-sepolia-v1.0.8-sandbox-20250404/arb-sepolia-market-USDC-ARB@05APR2025.json create mode 100644 deployments/arb-sepolia-v1.0.8-sandbox-20250404/arb-sepolia-market-USDC-WBTC@05APR2025.json create mode 100644 deployments/arb-sepolia-v1.0.8-sandbox-20250404/arb-sepolia-market-USDC-WETH@05APR2025.json create mode 100644 deployments/arb-sepolia-v1.0.8-sandbox-20250404/arb-sepolia-market-USDC-wstETH@05APR2025.json create mode 100644 deployments/arb-sepolia-v1.0.8-sandbox-20250404/arb-sepolia-market-WETH-PT-weETH-26JUN2025@05APR2025.json create mode 100644 deployments/arb-sepolia-v1.0.8-sandbox-20250404/arb-sepolia-market-WETH-weETH@05APR2025.json create mode 100644 deployments/arb-sepolia-v1.0.8-sandbox-20250404/arb-sepolia-market-WETH-wstETH@05APR2025.json create mode 100644 deployments/arb-sepolia-v1.0.8-sandbox-20250413/arb-sepolia-access-manager.json create mode 100644 deployments/arb-sepolia-v1.0.8-sandbox-20250413/arb-sepolia-core.json create mode 100644 deployments/arb-sepolia-v1.0.8-sandbox-20250413/arb-sepolia-market-USDC-ARB@30MAY2025.json create mode 100644 deployments/arb-sepolia-v1.0.8-sandbox-20250413/arb-sepolia-market-USDC-WBTC@30MAY2025.json create mode 100644 deployments/arb-sepolia-v1.0.8-sandbox-20250413/arb-sepolia-market-USDC-WETH@30MAY2025.json create mode 100644 deployments/arb-sepolia-v1.0.8-sandbox-20250413/arb-sepolia-market-USDC-wstETH@30MAY2025.json create mode 100644 deployments/arb-sepolia-v1.0.8-sandbox-20250413/arb-sepolia-market-WETH-PT-weETH-26JUN2025@27JUN2025.json create mode 100644 deployments/arb-sepolia-v1.0.8-sandbox-20250413/arb-sepolia-market-WETH-weETH@30MAY2025.json create mode 100644 deployments/arb-sepolia-v1.0.8-sandbox-20250413/arb-sepolia-market-WETH-wstETH@30MAY2025.json create mode 100644 deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-access-manager.json create mode 100644 deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-core.json create mode 100644 deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-market-USDC-ARB@30MAY2025.json create mode 100644 deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-market-USDC-WBTC@30MAY2025.json create mode 100644 deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-market-USDC-WETH@30MAY2025.json create mode 100644 deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-market-USDC-wstETH@30MAY2025.json create mode 100644 deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-market-WETH-PT-weETH-26JUN2025@27JUN2025.json create mode 100644 deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-market-WETH-weETH@30MAY2025.json create mode 100644 deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-market-WETH-wstETH@30MAY2025.json create mode 100644 deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-vault-TMX-USDC.json create mode 100644 deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-vault-TMX-WETH.json create mode 100644 deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-access-manager.json create mode 100644 deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-core.json create mode 100644 deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-market-USDC-ARB@30MAY2025.json create mode 100644 deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-market-USDC-WBTC@30MAY2025.json create mode 100644 deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-market-USDC-WETH@30MAY2025.json create mode 100644 deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-market-USDC-wstETH@30MAY2025.json create mode 100644 deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-market-WETH-PT-weETH-26JUN2025@27JUN2025.json create mode 100644 deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-market-WETH-weETH@30MAY2025.json create mode 100644 deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-market-WETH-wstETH@30MAY2025.json create mode 100644 deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-vault-TMX-USDC-Vault.json create mode 100644 deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-vault-TMX-USDC.json create mode 100644 deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-vault-TMX-WETH.json create mode 100644 deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-access-manager.json create mode 100644 deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-core.json create mode 100644 deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-USDC-ARB@26DEC2025.json create mode 100644 deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-USDC-WBTC@26SEP2025.json create mode 100644 deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-USDC-WETH@26DEC2025.json create mode 100644 deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-USDC-wstETH@26SEP2025.json create mode 100644 deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-WETH-PT-weETH-26JUN2025@26DEC2025.json create mode 100644 deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-WETH-weETH@26SEP2025.json create mode 100644 deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-WETH-wstETH@26SEP2025.json create mode 100644 deployments/bnb-mainnet/bnb-mainnet-V2-adapters-29MAY2025.json create mode 100644 deployments/bnb-mainnet/bnb-mainnet-access-manager.json create mode 100644 deployments/bnb-mainnet/bnb-mainnet-core.json create mode 100644 deployments/bnb-mainnet/bnb-mainnet-market-BTCB-USD1@25JUL2025.json create mode 100644 deployments/bnb-mainnet/bnb-mainnet-market-USDT-BTCB@25JUL2025.json create mode 100644 deployments/bnb-mainnet/bnb-mainnet-market-USDT-USD1@25JUL2025.json create mode 100644 deployments/bnb-mainnet/bnb-mainnet-market-USDT-WBNB@25JUL2025.json create mode 100644 deployments/bnb-mainnet/bnb-mainnet-market-USDT-sUSDe@25JUL2025.json create mode 100644 deployments/bnb-mainnet/bnb-mainnet-market-WBNB-BTCB@25JUL2025.json create mode 100644 deployments/bnb-mainnet/bnb-mainnet-market-WBNB-USD1@25JUL2025.json create mode 100644 deployments/bnb-mainnet/bnb-mainnet-market-WBNB-ynBNBx@25JUL2025.json create mode 100644 deployments/bnb-mainnet/bnb-mainnet-vault-TMX-USDT-Vault-13JUN2025.json create mode 100644 deployments/bnb-mainnet/bnb-mainnet-vault-TMX-WBNB-Vault-13JUN2025.json create mode 100644 deployments/bnb-testnet/bnb-testnet-access-manager.json create mode 100644 deployments/bnb-testnet/bnb-testnet-core.json create mode 100644 deployments/bnb-testnet/bnb-testnet-market-USDF-PT-USDF-24JUL2025@30MAY2025.json create mode 100644 deployments/bnb-testnet/bnb-testnet-market-WBNB-slisBNB@30MAY2025.json create mode 100644 deployments/bnb-testnet/bnb-testnet-vault-TMX-USDF-Vault.json create mode 100644 deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-access-manager.json create mode 100644 deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-core.json create mode 100644 deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@30MAY2025.json create mode 100644 deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-USDC-USUALUSDC+@30MAY2025.json create mode 100644 deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-USDC-WBTC@30MAY2025.json create mode 100644 deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-USDC-cbBTC@30MAY2025.json create mode 100644 deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-USDC-eUSDe@29MAY2025.json create mode 100644 deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-USDC-sUSDe@30MAY2025.json create mode 100644 deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-USDC-wstETH@30MAY2025.json create mode 100644 deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-WETH-MCwETH@30MAY2025.json create mode 100644 deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-WETH-gtWETH@30MAY2025.json create mode 100644 deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-WETH-pufETH@30MAY2025.json create mode 100644 deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-WETH-weETH@30MAY2025.json create mode 100644 deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@30MAY2025.json create mode 100644 deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-vault-TermMax USDC Vault.json create mode 100644 deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-vault-TermMax WETH Vault.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250402-1700/deploy-eth-mainnet-oracle-aggregator-0401-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250402-1700/deploy_markets_test_0402_log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-access-manager.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-core.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@02APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-USDC-USUALUSDC+@02APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-USDC-WBTC@02APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-USDC-cbBTC@02APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-USDC-eUSDe@02APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-USDC-sUSDe@02APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-USDC-wstETH@02APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-WETH-MCwETH@02APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-WETH-gtWETH@02APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-WETH-pufETH@02APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-WETH-weETH@02APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@02APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-vault-TermMax USDC Vault.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-vault-TermMax WETH Vault.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250403-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250403-2000/deploy_markets_test_0402_log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-access-manager.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-core.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@03APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-USDC-USUALUSDC+@03APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-USDC-WBTC@03APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-USDC-cbBTC@03APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-USDC-eUSDe@03APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-USDC-sUSDe@03APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-USDC-wstETH@03APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-WETH-MCwETH@03APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-WETH-gtWETH@03APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-WETH-pufETH@03APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-WETH-weETH@03APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@03APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250404-1200/deploy-eth-mainnet-oracle-aggregator-0401-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250404-1200/deploy_markets_test_0402_log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-access-manager.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-core.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@04APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-USDC-USUALUSDC+@04APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-USDC-WBTC@04APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-USDC-cbBTC@04APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-USDC-eUSDe@04APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-USDC-sUSDe@04APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-USDC-wstETH@04APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-WETH-MCwETH@04APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-WETH-gtWETH@04APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-WETH-pufETH@04APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-WETH-weETH@04APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@04APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250404-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250404-2000/deploy_markets_test_0402_log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-access-manager.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-core.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@04APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-USDC-USUALUSDC+@04APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-USDC-WBTC@04APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-USDC-cbBTC@04APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-USDC-eUSDe@04APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-USDC-sUSDe@04APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-USDC-wstETH@04APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-WETH-MCwETH@04APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-WETH-gtWETH@04APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-WETH-pufETH@04APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-WETH-weETH@04APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@04APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250405-1200/deploy-eth-mainnet-oracle-aggregator-0401-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250405-1200/deploy_markets_test_0402_log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-access-manager.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-core.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@05APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-USDC-USUALUSDC+@05APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-USDC-WBTC@05APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-USDC-cbBTC@05APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-USDC-eUSDe@05APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-USDC-sUSDe@05APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-USDC-wstETH@05APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-WETH-MCwETH@05APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-WETH-gtWETH@05APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-WETH-pufETH@05APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-WETH-weETH@05APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@05APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250405-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250405-2000/deploy_markets_test_0402_log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-access-manager.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-core.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@05APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-USDC-USUALUSDC+@05APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-USDC-WBTC@05APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-USDC-cbBTC@05APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-USDC-eUSDe@05APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-USDC-sUSDe@05APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-USDC-wstETH@05APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-WETH-MCwETH@05APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-WETH-gtWETH@05APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-WETH-pufETH@05APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-WETH-weETH@05APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@05APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-1200/deploy-eth-mainnet-oracle-aggregator-0401-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-1200/deploy_markets_test_0402_log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-access-manager.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-core.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@06APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-USDC-USUALUSDC+@06APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-USDC-WBTC@06APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-USDC-cbBTC@06APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-USDC-eUSDe@06APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-USDC-sUSDe@06APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-USDC-wstETH@06APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-WETH-MCwETH@06APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-WETH-gtWETH@06APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-WETH-pufETH@06APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-WETH-weETH@06APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@06APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-1400/deploy-eth-mainnet-oracle-aggregator-0401-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-1400/deploy-market-eth-mainnet-20250406-1400-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-1400/deploy_markets_test_0402_log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-access-manager.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-core.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@06APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-USDC-USUALUSDC+@06APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-USDC-WBTC@06APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-USDC-cbBTC@06APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-USDC-eUSDe@06APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-USDC-sUSDe@06APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-USDC-wstETH@06APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-WETH-MCwETH@06APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-WETH-gtWETH@06APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-WETH-pufETH@06APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-WETH-weETH@06APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@06APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-2000/deploy-market-eth-mainnet-20250406-2000-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-2000/deploy_markets_test_0402_log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-access-manager.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-core.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@06APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-USDC-USUALUSDC+@06APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-USDC-WBTC@06APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-USDC-cbBTC@06APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-USDC-eUSDe@06APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-USDC-sUSDe@06APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-USDC-wstETH@06APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-WETH-MCwETH@06APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-WETH-gtWETH@06APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-WETH-pufETH@06APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-WETH-weETH@06APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@06APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250407-1400/deploy-eth-mainnet-oracle-aggregator-0401-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250407-1400/deploy-market-eth-mainnet-20250407-1400-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250407-1400/deploy_markets_test_0402_log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-access-manager.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-core.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@07APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-USDC-USUALUSDC+@07APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-USDC-WBTC@07APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-USDC-cbBTC@07APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-USDC-eUSDe@07APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-USDC-sUSDe@07APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-USDC-wstETH@07APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-WETH-MCwETH@07APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-WETH-gtWETH@07APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-WETH-pufETH@07APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-WETH-weETH@07APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@07APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250407-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250407-2000/deploy-market-eth-mainnet-20250407-2000-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250407-2000/deploy_markets_test_0402_log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-access-manager.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-core.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@07APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-USDC-USUALUSDC+@07APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-USDC-WBTC@07APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-USDC-cbBTC@07APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-USDC-eUSDe@07APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-USDC-sUSDe@07APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-USDC-wstETH@07APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-WETH-MCwETH@07APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-WETH-gtWETH@07APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-WETH-pufETH@07APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-WETH-weETH@07APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@07APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250408-1400/deploy-eth-mainnet-oracle-aggregator-0401-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250408-1400/deploy-market-eth-mainnet-20250408-1400-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250408-1400/deploy_markets_test_0402_log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-access-manager.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-core.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@08APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-USDC-USUALUSDC+@08APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-USDC-WBTC@08APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-USDC-cbBTC@08APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-USDC-eUSDe@08APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-USDC-sUSDe@08APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-USDC-wstETH@08APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-WETH-MCwETH@08APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-WETH-gtWETH@08APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-WETH-pufETH@08APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-WETH-weETH@08APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@08APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250408-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250408-2000/deploy-market-eth-mainnet-20250408-2000-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250408-2000/deploy_markets_test_0402_log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-access-manager.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-core.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@08APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-USDC-USUALUSDC+@08APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-USDC-WBTC@08APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-USDC-cbBTC@08APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-USDC-eUSDe@08APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-USDC-sUSDe@08APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-USDC-wstETH@08APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-WETH-MCwETH@08APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-WETH-gtWETH@08APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-WETH-pufETH@08APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-WETH-weETH@08APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@08APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250409-1400/deploy-eth-mainnet-oracle-aggregator-0401-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250409-1400/deploy-market-eth-mainnet-20250409-1400-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250409-1400/deploy_markets_test_0402_log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-access-manager.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-core.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@09APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-USDC-USUALUSDC+@09APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-USDC-WBTC@09APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-USDC-cbBTC@09APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-USDC-eUSDe@09APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-USDC-sUSDe@09APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-USDC-wstETH@09APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-WETH-MCwETH@09APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-WETH-gtWETH@09APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-WETH-pufETH@09APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-WETH-weETH@09APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@09APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250409-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250409-2000/deploy-market-eth-mainnet-20250409-2000-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250409-2000/deploy_markets_test_0402_log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-access-manager.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-core.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@09APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-USDC-USUALUSDC+@09APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-USDC-WBTC@09APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-USDC-cbBTC@09APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-USDC-eUSDe@09APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-USDC-sUSDe@09APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-USDC-wstETH@09APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-WETH-MCwETH@09APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-WETH-gtWETH@09APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-WETH-pufETH@09APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-WETH-weETH@09APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@09APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250410-1400/deploy-eth-mainnet-oracle-aggregator-0401-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250410-1400/deploy-market-eth-mainnet-20250410-1400-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250410-1400/deploy_markets_test_0402_log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-access-manager.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-core.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@10APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-USDC-USUALUSDC+@10APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-USDC-WBTC@10APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-USDC-cbBTC@10APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-USDC-eUSDe@10APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-USDC-sUSDe@10APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-USDC-wstETH@10APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-WETH-MCwETH@10APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-WETH-gtWETH@10APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-WETH-pufETH@10APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-WETH-weETH@10APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@10APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250410-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250410-2000/deploy-market-eth-mainnet-20250410-2000-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250410-2000/deploy_markets_test_0402_log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-access-manager.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-core.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@10APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-USDC-USUALUSDC+@10APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-USDC-WBTC@10APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-USDC-cbBTC@10APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-USDC-eUSDe@10APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-USDC-sUSDe@10APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-USDC-wstETH@10APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-WETH-MCwETH@10APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-WETH-gtWETH@10APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-WETH-pufETH@10APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-WETH-weETH@10APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@10APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/accept-oracles-20250418-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/deploy-eth-mainnet-oracle-aggregator-0401-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/deploy-eth-markets-20250530.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/deploy-markets-20250417-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/deploy-price-feeds-morpho-20250417-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/deploy_markets_test_0402_log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-access-manager.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-accumulated.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-core-before-change-pendle-swap-adapter.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-core-before-change-vault-factory.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-core.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-MC_USDCP@30MAY2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-PT-lvlUSD-29MAY2025@14APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-PT-lvlUSD-29MAY2025@30MAY2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@30MAY2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-USUALUSDC+@30MAY2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-WBTC@30MAY2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-cbBTC@30MAY2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-eUSDe@29MAY2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-gtusdcf@30MAY2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-sUSDe@30MAY2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-wstETH@30MAY2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-WETH-MCwETH@30MAY2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-WETH-gtWETH@30MAY2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-WETH-mhyETH@30MAY2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-WETH-pufETH@30MAY2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-WETH-weETH@30MAY2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-lvlUSD-slvlUSD@14APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-lvlUSD-slvlUSD@30MAY2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@30MAY2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-sUSDe-PT-sUSDE-29MAY2025@14APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-sUSDe-PT-sUSDE-29MAY2025@30MAY2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-wstETH-inwstETHs@30MAY2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-pendle-swap-v3-adapter.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-vault-TMX-USDC-PRIME.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-vault-TMX-USDC.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-vault-TMX-WETH.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-vault-TMX-wstETH-Vault.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-vault-Weiting USDC Vault.json create mode 100644 deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-vault-factory.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-1500/deploy-eth-mainnet-oracle-aggregator-0401-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-1500/deploy-eth-markets-test-20250411-1500-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-1500/deploy_markets_test_0402_log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-access-manager.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-core.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@11APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-USDC-USUALUSDC+@11APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-USDC-WBTC@11APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-USDC-cbBTC@11APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-USDC-eUSDe@11APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-USDC-sUSDe@11APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-USDC-wstETH@11APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-WETH-MCwETH@11APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-WETH-gtWETH@11APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-WETH-pufETH@11APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-WETH-weETH@11APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@11APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-vault-TMX-USDC.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-vault-TMX-WETH.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-vault-Weiting USDC Vault.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-2000/deploy-eth-markets-test-20250411-2000-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-2000/deploy_markets_test_0402_log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-access-manager.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-core.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@11APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-USDC-USUALUSDC+@11APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-USDC-WBTC@11APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-USDC-cbBTC@11APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-USDC-eUSDe@11APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-USDC-sUSDe@11APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-USDC-wstETH@11APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-WETH-MCwETH@11APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-WETH-gtWETH@11APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-WETH-pufETH@11APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-WETH-weETH@11APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@11APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-vault-TMX-USDC.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-vault-TMX-WETH.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-vault-Weiting USDC Vault.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-1500/deploy-eth-mainnet-oracle-aggregator-0401-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-1500/deploy-eth-markets-test-20250412-1500-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-1500/deploy_markets_test_0402_log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-access-manager.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-core.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@12APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-USDC-USUALUSDC+@12APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-USDC-WBTC@12APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-USDC-cbBTC@12APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-USDC-eUSDe@12APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-USDC-sUSDe@12APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-USDC-wstETH@12APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-WETH-MCwETH@12APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-WETH-gtWETH@12APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-WETH-pufETH@12APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-WETH-weETH@12APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@12APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-vault-TMX-USDC.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-vault-TMX-WETH.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-vault-Weiting USDC Vault.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-2000/deploy-eth-markets-test-20250412-2000-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-2000/deploy_markets_test_0402_log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-access-manager.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-core.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@12APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-USDC-USUALUSDC+@12APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-USDC-WBTC@12APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-USDC-cbBTC@12APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-USDC-eUSDe@12APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-USDC-sUSDe@12APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-USDC-wstETH@12APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-WETH-MCwETH@12APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-WETH-gtWETH@12APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-WETH-pufETH@12APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-WETH-weETH@12APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@12APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-vault-TMX-USDC.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-vault-TMX-WETH.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-vault-Weiting USDC Vault.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-1500/deploy-eth-mainnet-oracle-aggregator-0401-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-1500/deploy-eth-markets-test-20250413-1500-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-1500/deploy_markets_test_0402_log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-access-manager.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-core.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@13APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-USDC-USUALUSDC+@13APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-USDC-WBTC@13APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-USDC-cbBTC@13APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-USDC-eUSDe@13APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-USDC-sUSDe@13APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-USDC-wstETH@13APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-WETH-MCwETH@13APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-WETH-gtWETH@13APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-WETH-pufETH@13APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-WETH-weETH@13APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@13APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-vault-TMX-USDC.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-vault-TMX-WETH.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-vault-Weiting USDC Vault.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-2000/deploy-eth-markets-test-20250413-2000-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-2000/deploy_markets_test_0402_log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-access-manager.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-core.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@13APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-USDC-USUALUSDC+@13APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-USDC-WBTC@13APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-USDC-cbBTC@13APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-USDC-eUSDe@13APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-USDC-sUSDe@13APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-USDC-wstETH@13APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-WETH-MCwETH@13APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-WETH-gtWETH@13APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-WETH-pufETH@13APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-WETH-weETH@13APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@13APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-vault-TMX-USDC.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-vault-TMX-WETH.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-vault-Weiting USDC Vault.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-1500/deploy-eth-mainnet-oracle-aggregator-0401-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-1500/deploy-eth-markets-test-20250414-1500-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-1500/deploy_markets_test_0402_log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-access-manager.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-core.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@14APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-USDC-USUALUSDC+@14APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-USDC-WBTC@14APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-USDC-cbBTC@14APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-USDC-eUSDe@14APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-USDC-sUSDe@14APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-USDC-wstETH@14APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-WETH-MCwETH@14APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-WETH-gtWETH@14APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-WETH-pufETH@14APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-WETH-weETH@14APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@14APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-vault-TMX-USDC.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-vault-TMX-WETH.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-vault-Weiting USDC Vault.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-2000/deploy-eth-markets-test-20250414-2000-log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-2000/deploy_markets_test_0402_log.txt create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-access-manager.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-core.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@14APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-USDC-USUALUSDC+@14APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-USDC-WBTC@14APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-USDC-cbBTC@14APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-USDC-eUSDe@14APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-USDC-sUSDe@14APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-USDC-wstETH@14APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-WETH-MCwETH@14APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-WETH-gtWETH@14APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-WETH-pufETH@14APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-WETH-weETH@14APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@14APR2025.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-vault-TMX-USDC.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-vault-TMX-WETH.json create mode 100644 deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-vault-Weiting USDC Vault.json create mode 100644 deployments/eth-mainnet/accept-oracle-PT-USDS-log.txt create mode 100644 deployments/eth-mainnet/accept-oracles-20250418-log.txt create mode 100644 deployments/eth-mainnet/accept-oracles-20250515-log.txt create mode 100644 deployments/eth-mainnet/accept-oracles-20250516-log.txt create mode 100644 deployments/eth-mainnet/deploy-PT-cUSDO-PT-lvlUSD-markets-log.txt create mode 100644 deployments/eth-mainnet/deploy-eth-mainnet-oracle-aggregator-0401-log.txt create mode 100644 deployments/eth-mainnet/deploy-eth-markets-20250515-log.txt create mode 100644 deployments/eth-mainnet/deploy-eth-markets-mature-20250627-log.txt create mode 100644 deployments/eth-mainnet/deploy-inwsteth-price-feed-log.txt create mode 100644 deployments/eth-mainnet/deploy-markets-20250417-log.txt create mode 100644 deployments/eth-mainnet/deploy-markets-pt-susde-and-pt-pufeth-log.txt create mode 100644 deployments/eth-mainnet/deploy-price-feeds-20250508-log.txt create mode 100644 deployments/eth-mainnet/deploy-price-feeds-morpho-20250417-log.txt create mode 100644 deployments/eth-mainnet/deploy_markets_test_0402_log.txt create mode 100644 deployments/eth-mainnet/eth-mainnet-V2-adapters-03JUN2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-access-manager.json create mode 100644 deployments/eth-mainnet/eth-mainnet-accumulated.json create mode 100644 deployments/eth-mainnet/eth-mainnet-core-before-change-pendle-swap-adapter.json create mode 100644 deployments/eth-mainnet/eth-mainnet-core-before-change-vault-factory.json create mode 100644 deployments/eth-mainnet/eth-mainnet-core.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-USDC-MC_PTs@15SEP2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-USDC-MC_USDCP@29AUG2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-USDC-MC_USDCP@30MAY2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-USDC-PT-USDS-14AUG2025@15AUG2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-USDC-PT-cUSDO-19JUN2025@20JUN2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-USDC-PT-lvlUSD-25SEP2025@25JUL2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-USDC-PT-lvlUSD-25SEP2025@26SEP2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-USDC-PT-lvlUSD-29MAY2025@14APR2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-USDC-PT-lvlUSD-29MAY2025@30MAY2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-USDC-PT-mMEV-31JUL2025@01AUG2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-31JUL2025@01AUG2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-USDC-PT-slvlUSD-25SEP2025@26SEP2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@26SEP2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@27JUN2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-USDC-XAUM@27JUN2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-USDC-cUSDO@25JUL2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@27JUN2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@15AUG2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-USDC-gtusdcf@30MAY2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-USDC-mMEV@01AUG2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@26SEP2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@27JUN2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@27JUN2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-USDC-xUSD@26SEP2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-USDC-xUSD@29AUG2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-WBTC-sUSDe@26SEP2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-WBTC-sUSDe@27JUN2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-WETH-PT-pufETH-26JUN2025@27JUN2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-WETH-mhyETH@30MAY2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@27JUN2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@29AUG2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-WETH-sUSDe@26SEP2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-WETH-sUSDe@27JUN2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@26SEP2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@27JUN2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-WETH-wstETH@26SEP2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-WETH-ynETHx@29AUG2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-lvlUSD-slvlUSD@14APR2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-lvlUSD-slvlUSD@27JUN2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-lvlUSD-slvlUSD@30MAY2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@27JUN2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-sUSDe-PT-sUSDE-29MAY2025@14APR2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-sUSDe-PT-sUSDE-29MAY2025@30MAY2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-sUSDe-PT-sUSDE-31JUL2025@01AUG2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-wstETH-ETH+@15AUG2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-wstETH-ETH+@15SEP2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-wstETH-inwstETHs@25JUL2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-wstETH-inwstETHs@27JUN2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-wstETH-inwstETHs@30MAY2025.json create mode 100644 deployments/eth-mainnet/eth-mainnet-pendle-swap-v3-adapter.json create mode 100644 deployments/eth-mainnet/eth-mainnet-vault-TMX-LBTC-Vault.json create mode 100644 deployments/eth-mainnet/eth-mainnet-vault-TMX-USDC-Delivery-Vault.json create mode 100644 deployments/eth-mainnet/eth-mainnet-vault-TMX-USDC-PRIME.json create mode 100644 deployments/eth-mainnet/eth-mainnet-vault-TMX-USDC.json create mode 100644 deployments/eth-mainnet/eth-mainnet-vault-TMX-WBTC-Vault.json create mode 100644 deployments/eth-mainnet/eth-mainnet-vault-TMX-WETH-Delivery-Vault.json create mode 100644 deployments/eth-mainnet/eth-mainnet-vault-TMX-WETH.json create mode 100644 deployments/eth-mainnet/eth-mainnet-vault-TMX-XAU-USDC-Vault.json create mode 100644 deployments/eth-mainnet/eth-mainnet-vault-TMX-eUSDe-Vault.json create mode 100644 deployments/eth-mainnet/eth-mainnet-vault-TMX-pufETH-Vault.json create mode 100644 deployments/eth-mainnet/eth-mainnet-vault-TMX-sUSDe-Vault.json create mode 100644 deployments/eth-mainnet/eth-mainnet-vault-TMX-uniBTC-Vault.json create mode 100644 deployments/eth-mainnet/eth-mainnet-vault-TMX-wstETH-Vault.json create mode 100644 deployments/eth-mainnet/eth-mainnet-vault-TMX-wstUSR-Vault.json create mode 100644 deployments/eth-mainnet/eth-mainnet-vault-Weiting USDC Vault.json create mode 100644 deployments/eth-mainnet/eth-mainnet-vault-factory.json create mode 100644 deployments/eth-mainnet/submit-eth-mainnet-pt-susde-31jul2025-log.txt create mode 100644 deployments/eth-mainnet/submit-inwsteth-oracle-log.txt create mode 100644 deployments/eth-mainnet/submit-oracles-20250417-log.txt create mode 100644 deployments/eth-mainnet/submit-oracles-20250515-log.txt create mode 100644 deployments/eth-mainnet/submit-price-feed-20250522-log.txt create mode 100644 deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-access-manager.json create mode 100644 deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-core.json create mode 100644 deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-USDC-PT-sUSDE-29MAY2025@06APR2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-USDC-USUALUSDC+@06APR2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-USDC-WBTC@06APR2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-USDC-cbBTC@06APR2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-USDC-eUSDe@06APR2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-USDC-sUSDe@06APR2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-USDC-wstETH@06APR2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-WETH-MCwETH@06APR2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-WETH-gtWETH@06APR2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-WETH-pufETH@06APR2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-WETH-weETH@06APR2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-pufETH-PT-pufETH-26JUN2025@06APR2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-access-manager.json create mode 100644 deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-core.json create mode 100644 deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-USDC-PT-sUSDE-29MAY2025@30MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-USDC-USUALUSDC+@30MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-USDC-WBTC@30MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-USDC-cbBTC@30MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-USDC-eUSDe@29MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-USDC-sUSDe@30MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-USDC-wstETH@30MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-WETH-MCwETH@30MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-WETH-gtWETH@30MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-WETH-pufETH@30MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-WETH-weETH@30MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-pufETH-PT-pufETH-26JUN2025@30MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-staging-20250527/eth-sepolia-access-manager.json create mode 100644 deployments/eth-sepolia-v1.0.8-staging-20250527/eth-sepolia-core.json create mode 100644 deployments/eth-sepolia-v1.0.8-staging-20250527/eth-sepolia-market-USDC-wstETH@27MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-staging-20250527/eth-sepolia-market-WETH-weETH@27MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-staging-20250527/eth-sepolia-vault-TMX-USDC.json create mode 100644 deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-access-manager.json create mode 100644 deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-core.json create mode 100644 deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-PT-sUSDE-29MAY2025@30MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-USUALUSDC+@30MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-WBTC@30MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-cbBTC@30MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-eUSDe@29MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-sUSDe@30MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-wstETH@11APR2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-wstETH@27JUN2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-wstETH@27MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-wstETH@28MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-wstETH@30MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-WETH-MCwETH@30MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-WETH-gtWETH@30MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-WETH-pufETH@30MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-WETH-weETH@11APR2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-WETH-weETH@27JUN2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-WETH-weETH@27MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-WETH-weETH@30MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-pufETH-PT-pufETH-26JUN2025@30MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-vault-TMT-USDC.json create mode 100644 deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-vault-TMX-USDC-Vault-02JUN2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-vault-TMX-USDC.json create mode 100644 deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-vault-TMX-WETH.json create mode 100644 deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-access-manager.json create mode 100644 deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-core.json create mode 100644 deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-USDC-PT-sUSDE-29MAY2025@30MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-USDC-USUALUSDC+@30MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-USDC-WBTC@30MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-USDC-cbBTC@30MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-USDC-eUSDe@29MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-USDC-sUSDe@30MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-USDC-wstETH@11APR2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-USDC-wstETH@30MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-WETH-MCwETH@30MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-WETH-gtWETH@30MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-WETH-pufETH@30MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-WETH-weETH@11APR2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-WETH-weETH@30MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-pufETH-PT-pufETH-26JUN2025@30MAY2025.json create mode 100644 deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-vault-TMT-USDC.json create mode 100644 deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-vault-TMX-USDC.json create mode 100644 deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-vault-TMX-WETH.json create mode 100644 deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-access-manager.json create mode 100644 deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-core.json create mode 100644 deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-USDC-PT-sUSDE-31JUL2025@26SEP2025.json create mode 100644 deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-USDC-WBTC@26DEC2025.json create mode 100644 deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-USDC-eUSDe@26DEC2025.json create mode 100644 deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-USDC-sUSDe@26SEP2025.json create mode 100644 deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-USDC-wstETH@26SEP2025.json create mode 100644 deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-WETH-pufETH@26DEC2025.json create mode 100644 deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-WETH-weETH@26SEP2025.json create mode 100644 deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-vault-TMX-USDC-Vault-07JUN2025.json create mode 100644 script/deploy/DeployAdapters.s.sol diff --git a/deployments/arb-mainnet-v1.0.8-20250404-2000/arb-mainnet-access-manager.json b/deployments/arb-mainnet-v1.0.8-20250404-2000/arb-mainnet-access-manager.json new file mode 100644 index 0000000..f75a2f5 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250404-2000/arb-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743606817", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182046", + "timestamp": "1743606817" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250404-2000/arb-mainnet-core.json b/deployments/arb-mainnet-v1.0.8-20250404-2000/arb-mainnet-core.json new file mode 100644 index 0000000..435d898 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250404-2000/arb-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743608156", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182159", + "timestamp": "1743608156" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x14920Eb11b71873d01c93B589b40585dacfCA096", + "vaultFactory": "0x929CBcb8150aD59DB63c92A7dAEc07b30d38bA79", + "oracleAggregator": "0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa", + "router": "0x7fa333b184868d88aC78a82eC06d5e87d4B0322E", + "swapAdapter": { + "uniswapV3Adapter": "0x609F20ee24E10010A62970E1dAb7E2b84eD74CAb", + "odosV2Adapter": "0x7de4efa140E52B7207FA689D41AfEE461B83E748", + "pendleSwapV3Adapter": "0xb0eCCbaD4b4cc190261c29C6E8d85bcF04284a8b", + "ERC4626VaultAdapter": "0xa50929A67daF9Ff3567e2Bb3411204A134f72546" + }, + "marketViewer": "0x276C0E52508d94ff2D4106b1559c8c4Bc3a75dec" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250404-2000/arb-mainnet-market-USDC-ARB@04APR2025.json b/deployments/arb-mainnet-v1.0.8-20250404-2000/arb-mainnet-market-USDC-ARB@04APR2025.json new file mode 100644 index 0000000..441efaf --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250404-2000/arb-mainnet-market-USDC-ARB@04APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22182256", + "timestamp": "1743609341" + }, + "market": "0x4b0b62464FaC18A27091120f3F2b9Ee1C5d1CFcf", + "collateral": { + "address": "0x912CE59144191C1204E64559FE8253a0e49E6548", + "symbol": "ARB", + "priceFeed": "0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xA3A5946739C4ED5342C0cA89F9aEFdFB0E0088a9", + "xt": "0xF3d3feA2D2069bC53A5BF8e6E67Ff6AaD9164593", + "gt": "0x6D58B49a8ab68174Cb3Da017A9a1FEE491B78026" + }, + "config": { + "marketSymbol": "USDC/ARB@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "04APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250404-2000/arb-mainnet-market-USDC-WBTC@04APR2025.json b/deployments/arb-mainnet-v1.0.8-20250404-2000/arb-mainnet-market-USDC-WBTC@04APR2025.json new file mode 100644 index 0000000..53c6feb --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250404-2000/arb-mainnet-market-USDC-WBTC@04APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22182256", + "timestamp": "1743609341" + }, + "market": "0x452d119C2F66a37dABF7A687b8429558497C0414", + "collateral": { + "address": "0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f", + "symbol": "WBTC", + "priceFeed": "0xd0C7101eACbB49F3deCcCc166d238410D6D46d57", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x134e5F60c5EEC98BfdaF1b94d01cb2f3239827fD", + "xt": "0x07323E13cD3E7591cF2BfcF6C35e3A7687E1E1C2", + "gt": "0x30Ada0601dc7483c308795d9a3f92d8bE17c4491" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "04APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250404-2000/arb-mainnet-market-USDC-WETH@04APR2025.json b/deployments/arb-mainnet-v1.0.8-20250404-2000/arb-mainnet-market-USDC-WETH@04APR2025.json new file mode 100644 index 0000000..61f2ae1 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250404-2000/arb-mainnet-market-USDC-WETH@04APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22182256", + "timestamp": "1743609341" + }, + "market": "0xad20EdcC8706d2C9624C1075A78b4A586BF194d9", + "collateral": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xA4868843f97cBd9087D3Db1458F15afA89a9aC7d", + "xt": "0xDC9b4BE1A6f01211b4eD5549e393c3E748D211E9", + "gt": "0xd203F58EA93e0ee62b44c64eC368ad9cFB61944a" + }, + "config": { + "marketSymbol": "USDC/WETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "04APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250404-2000/arb-mainnet-market-USDC-wstETH@04APR2025.json b/deployments/arb-mainnet-v1.0.8-20250404-2000/arb-mainnet-market-USDC-wstETH@04APR2025.json new file mode 100644 index 0000000..93f0377 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250404-2000/arb-mainnet-market-USDC-wstETH@04APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22182256", + "timestamp": "1743609341" + }, + "market": "0xf56aA1862c35538d6803c11bBd7F5Df204e764d4", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x940A77c928230aa73A89c51461AfcAD728bbF67A", + "xt": "0xEb640fc9D65E5350dEb87d5564Af7BeD483E7f95", + "gt": "0x2a66A6A89E5253B0b85eDa45c33670ADdE7F27ac" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "04APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250404-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@04APR2025.json b/deployments/arb-mainnet-v1.0.8-20250404-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@04APR2025.json new file mode 100644 index 0000000..c463caf --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250404-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@04APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22182256", + "timestamp": "1743609341" + }, + "market": "0xb9067dcd1aA87B0Ac6824E9F7c6321370afa6730", + "collateral": { + "address": "0xb33808ea0e883138680BA29311a220A7377cdb92", + "symbol": "PT-weETH-26JUN2025", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x3b038D640Ae38380Ca2d586815a1dB6B7bC2a944", + "xt": "0x221298435116EECC7678752a31A26C81F48C91E7", + "gt": "0xEeAb36300485c72f4A6b8272119949440C0D04e7" + }, + "config": { + "marketSymbol": "WETH/PT-weETH-26JUN2025@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "04APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250404-2000/arb-mainnet-market-WETH-weETH@04APR2025.json b/deployments/arb-mainnet-v1.0.8-20250404-2000/arb-mainnet-market-WETH-weETH@04APR2025.json new file mode 100644 index 0000000..2bed5c6 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250404-2000/arb-mainnet-market-WETH-weETH@04APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22182256", + "timestamp": "1743609341" + }, + "market": "0x7c67428515497e0F1aE32898D01914B1e6F1110a", + "collateral": { + "address": "0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe", + "symbol": "weETH", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x2415a73Aa88A18D71d9140De9112c6FB729bF7ab", + "xt": "0x3A4044f65816D7E89d67aC929E29a1A6B0D0A626", + "gt": "0x9e07ebc871A5C8DfB5F9B76d5DEb89Ad8A2EEB4d" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "04APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250404-2000/arb-mainnet-market-WETH-wstETH@04APR2025.json b/deployments/arb-mainnet-v1.0.8-20250404-2000/arb-mainnet-market-WETH-wstETH@04APR2025.json new file mode 100644 index 0000000..b8ec45b --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250404-2000/arb-mainnet-market-WETH-wstETH@04APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22182256", + "timestamp": "1743609341" + }, + "market": "0xf81Ab50c58d3B97b6a05400d6A984A3c0E4Ca03a", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xA9646D8A2f031e3529023feF84DE8b504b61562F", + "xt": "0xB243ecF1c6f363b641B0D443583E2865cd5B8a8B", + "gt": "0x27f759aE372Ac4AaDE979C638333025a6b105f12" + }, + "config": { + "marketSymbol": "WETH/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "04APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250405-1200/arb-mainnet-access-manager.json b/deployments/arb-mainnet-v1.0.8-20250405-1200/arb-mainnet-access-manager.json new file mode 100644 index 0000000..f75a2f5 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250405-1200/arb-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743606817", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182046", + "timestamp": "1743606817" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250405-1200/arb-mainnet-core.json b/deployments/arb-mainnet-v1.0.8-20250405-1200/arb-mainnet-core.json new file mode 100644 index 0000000..435d898 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250405-1200/arb-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743608156", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182159", + "timestamp": "1743608156" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x14920Eb11b71873d01c93B589b40585dacfCA096", + "vaultFactory": "0x929CBcb8150aD59DB63c92A7dAEc07b30d38bA79", + "oracleAggregator": "0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa", + "router": "0x7fa333b184868d88aC78a82eC06d5e87d4B0322E", + "swapAdapter": { + "uniswapV3Adapter": "0x609F20ee24E10010A62970E1dAb7E2b84eD74CAb", + "odosV2Adapter": "0x7de4efa140E52B7207FA689D41AfEE461B83E748", + "pendleSwapV3Adapter": "0xb0eCCbaD4b4cc190261c29C6E8d85bcF04284a8b", + "ERC4626VaultAdapter": "0xa50929A67daF9Ff3567e2Bb3411204A134f72546" + }, + "marketViewer": "0x276C0E52508d94ff2D4106b1559c8c4Bc3a75dec" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250405-1200/arb-mainnet-market-USDC-ARB@05APR2025.json b/deployments/arb-mainnet-v1.0.8-20250405-1200/arb-mainnet-market-USDC-ARB@05APR2025.json new file mode 100644 index 0000000..0bc640f --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250405-1200/arb-mainnet-market-USDC-ARB@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22182287", + "timestamp": "1743609704" + }, + "market": "0x2C848DF8Aba613Bf9763cABe1415bbc7CE01D585", + "collateral": { + "address": "0x912CE59144191C1204E64559FE8253a0e49E6548", + "symbol": "ARB", + "priceFeed": "0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x1e0080FcFcFBB21910b14Bd7F345C94B0260B7c9", + "xt": "0x88eC26530c693C119D83aC81a81C525834Ac52d5", + "gt": "0x51f1FF5985719E0969e85Fc0f59C1eb27e277b0a" + }, + "config": { + "marketSymbol": "USDC/ARB@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250405-1200/arb-mainnet-market-USDC-WBTC@05APR2025.json b/deployments/arb-mainnet-v1.0.8-20250405-1200/arb-mainnet-market-USDC-WBTC@05APR2025.json new file mode 100644 index 0000000..9a3abbc --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250405-1200/arb-mainnet-market-USDC-WBTC@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22182287", + "timestamp": "1743609704" + }, + "market": "0xE71C5DEd95c63dDc05d8f161b8E26aE64AC770a9", + "collateral": { + "address": "0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f", + "symbol": "WBTC", + "priceFeed": "0xd0C7101eACbB49F3deCcCc166d238410D6D46d57", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x19949c1db068F5aD557671b10Cfd21188204f1D3", + "xt": "0xC5e64cE23995211fFE327C3Fa5597810a8eDfaE5", + "gt": "0x7dB51C5540660440b4bfee2dd72B5c9A1c72dcA8" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250405-1200/arb-mainnet-market-USDC-WETH@05APR2025.json b/deployments/arb-mainnet-v1.0.8-20250405-1200/arb-mainnet-market-USDC-WETH@05APR2025.json new file mode 100644 index 0000000..fbb4a8b --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250405-1200/arb-mainnet-market-USDC-WETH@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22182287", + "timestamp": "1743609704" + }, + "market": "0x46527120D75d814273Af1f8ede44ae81377F495d", + "collateral": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xf133Ea64fbbcd4BC0B767cd25d3eeD795761fb1D", + "xt": "0xcb60b2bE7E59284f6905c1eB79282Bd4C29ADB4B", + "gt": "0xFD66f1e205f760898DD7A788F9A85c38a83982aB" + }, + "config": { + "marketSymbol": "USDC/WETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250405-1200/arb-mainnet-market-USDC-wstETH@05APR2025.json b/deployments/arb-mainnet-v1.0.8-20250405-1200/arb-mainnet-market-USDC-wstETH@05APR2025.json new file mode 100644 index 0000000..38f2adc --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250405-1200/arb-mainnet-market-USDC-wstETH@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22182287", + "timestamp": "1743609704" + }, + "market": "0xF4162ebBF1310Dc482da9eF6Cd9e1A9A9430E79F", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x18F189e81bbF40B544AeBd6657456ce0562269d3", + "xt": "0x6B45F231c9f421002D9f3000e0A0036EF291B812", + "gt": "0xED0D14C054893b577B49BbC2F5E08D44E92A9E0E" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250405-1200/arb-mainnet-market-WETH-PT-weETH-26JUN2025@05APR2025.json b/deployments/arb-mainnet-v1.0.8-20250405-1200/arb-mainnet-market-WETH-PT-weETH-26JUN2025@05APR2025.json new file mode 100644 index 0000000..85c1da0 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250405-1200/arb-mainnet-market-WETH-PT-weETH-26JUN2025@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22182287", + "timestamp": "1743609704" + }, + "market": "0xE3e14125B237d5919cA3FbE2721C31033545CF52", + "collateral": { + "address": "0xb33808ea0e883138680BA29311a220A7377cdb92", + "symbol": "PT-weETH-26JUN2025", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xB38dA25D1F2060902a25602c4Ee3D81b334cEf4a", + "xt": "0xcbcCa2D5A88807f72D16B7bB44ED361ba8933dFA", + "gt": "0x17af9c9dBe7ce40C6bEb42D4199a32B073520580" + }, + "config": { + "marketSymbol": "WETH/PT-weETH-26JUN2025@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250405-1200/arb-mainnet-market-WETH-weETH@05APR2025.json b/deployments/arb-mainnet-v1.0.8-20250405-1200/arb-mainnet-market-WETH-weETH@05APR2025.json new file mode 100644 index 0000000..4fa419b --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250405-1200/arb-mainnet-market-WETH-weETH@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22182287", + "timestamp": "1743609704" + }, + "market": "0x6656c7dd6CD85f687f9299BA7ae40EF32D1eDD33", + "collateral": { + "address": "0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe", + "symbol": "weETH", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x6694fc4F0B1Bf88C2802C3c7255c0d31CB36E581", + "xt": "0x815f58c7852559374AF8495b84CcDdB1A9640BB9", + "gt": "0xC15446144218E6AFeF324D8a5F343ca1c8C27486" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250405-1200/arb-mainnet-market-WETH-wstETH@05APR2025.json b/deployments/arb-mainnet-v1.0.8-20250405-1200/arb-mainnet-market-WETH-wstETH@05APR2025.json new file mode 100644 index 0000000..baad374 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250405-1200/arb-mainnet-market-WETH-wstETH@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22182287", + "timestamp": "1743609704" + }, + "market": "0x8cE9Ab473deEF208D90A39D60526d93f6D086e79", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x4065C7961b70d7A4Ff770753DCD777C326d1e4AF", + "xt": "0x6c120763F4E84C0ca87357D67AaBA4aE864C59aC", + "gt": "0x6cec51134fEB3d9306cA838616F4B06A1315Ac10" + }, + "config": { + "marketSymbol": "WETH/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250406-1400/accept-oracles-20250403-log.txt b/deployments/arb-mainnet-v1.0.8-20250406-1400/accept-oracles-20250403-log.txt new file mode 100644 index 0000000..2a93d96 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250406-1400/accept-oracles-20250403-log.txt @@ -0,0 +1,107 @@ +Running on arb-mainnet... +=== Configuration === +Operation: Script Execution +Network: arb-mainnet +Script: AcceptOracles.s.sol +Path: script/AcceptOracles.s.sol +RPC URL: http*****://arb-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Disabled +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xa669e7A0d4b3e4Fa48af2dE86BD4CD7126Be4e13 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting script execution... +Executing: forge script script/AcceptOracles.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow +No files changed, compilation skipped +Script ran successfully. + +== Logs == + === Checking Pending Oracles === + Oracle Aggregator Address: 0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa + Network: arb-mainnet + Current Block Timestamp: 1743663209 + + Accepted oracle for token: + Token Symbol: WETH + Token Address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: wstETH + Token Address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: USDC + Token Address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: WBTC + Token Address: 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: weETH + Token Address: 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: ARB + Token Address: 0x912CE59144191C1204E64559FE8253a0e49E6548 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: PT-weETH-26JUN2025 + Token Address: 0xb33808ea0e883138680BA29311a220A7377cdb92 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Heartbeat: 86400 + -------------------------------- + + === Oracle Acceptance Summary === + Total tokens checked: 7 + Oracles accepted: 7 + Oracles not ready: 0 + +## Setting up 1 EVM. + +========================== + +Chain 42161 + +Estimated gas price: 0.020000001 gwei + +Estimated total gas used for script: 914354 + +Estimated amount required: 0.000018287080914354 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/AcceptOracles.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/AcceptOracles.s.sol/42161/run-latest.json + +[SUCCESS] Script AcceptOracles executed successfully on arb-mainnet (Broadcast mode)! diff --git a/deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-access-manager.json b/deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-access-manager.json new file mode 100644 index 0000000..f75a2f5 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743606817", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182046", + "timestamp": "1743606817" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-core.json b/deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-core.json new file mode 100644 index 0000000..435d898 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743608156", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182159", + "timestamp": "1743608156" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x14920Eb11b71873d01c93B589b40585dacfCA096", + "vaultFactory": "0x929CBcb8150aD59DB63c92A7dAEc07b30d38bA79", + "oracleAggregator": "0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa", + "router": "0x7fa333b184868d88aC78a82eC06d5e87d4B0322E", + "swapAdapter": { + "uniswapV3Adapter": "0x609F20ee24E10010A62970E1dAb7E2b84eD74CAb", + "odosV2Adapter": "0x7de4efa140E52B7207FA689D41AfEE461B83E748", + "pendleSwapV3Adapter": "0xb0eCCbaD4b4cc190261c29C6E8d85bcF04284a8b", + "ERC4626VaultAdapter": "0xa50929A67daF9Ff3567e2Bb3411204A134f72546" + }, + "marketViewer": "0x276C0E52508d94ff2D4106b1559c8c4Bc3a75dec" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-market-USDC-ARB@06APR2025.json b/deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-market-USDC-ARB@06APR2025.json new file mode 100644 index 0000000..fd90e98 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-market-USDC-ARB@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22200971", + "timestamp": "1743835071" + }, + "market": "0xa77BD71a168c814DC3c3a0Df1df89905306e4D2e", + "collateral": { + "address": "0x912CE59144191C1204E64559FE8253a0e49E6548", + "symbol": "ARB", + "priceFeed": "0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x4f85770660dBbdAC9337f039133CBbcA86F0f128", + "xt": "0xa895F0DcBE4B20D6eAb7435Ac37Bc0c0ecccaC98", + "gt": "0x61AAA12fa3f6fa170F58efE8855bFB3E3F57447f" + }, + "config": { + "marketSymbol": "USDC/ARB@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-market-USDC-WBTC@06APR2025.json b/deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-market-USDC-WBTC@06APR2025.json new file mode 100644 index 0000000..e8d1e82 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-market-USDC-WBTC@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22200971", + "timestamp": "1743835071" + }, + "market": "0x89d72446542156B001ACE4a8f5557C4BD903Bc5b", + "collateral": { + "address": "0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f", + "symbol": "WBTC", + "priceFeed": "0xd0C7101eACbB49F3deCcCc166d238410D6D46d57", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x4Cc26320725235813f84D1340cE3225CdF08F999", + "xt": "0x4A1c48C2B9538901BA56f5a9DDB20DDb9793Bc3E", + "gt": "0xa0706c0286F18dE51F16d1B581Bd11be256085BD" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-market-USDC-WETH@06APR2025.json b/deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-market-USDC-WETH@06APR2025.json new file mode 100644 index 0000000..378925e --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-market-USDC-WETH@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22200971", + "timestamp": "1743835071" + }, + "market": "0xD484A89403c42c3AeAB2215425Db888a6972c4D8", + "collateral": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xc0A9Cb630B77665Db32FdBf61aC23868d6AE82E4", + "xt": "0xC5a424F7328904cfeEA16A84673a87975CE2da4A", + "gt": "0x356E6E5FCE66eB7117b66a504DB2e786eca1d6d7" + }, + "config": { + "marketSymbol": "USDC/WETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-market-USDC-wstETH@06APR2025.json b/deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-market-USDC-wstETH@06APR2025.json new file mode 100644 index 0000000..92801af --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-market-USDC-wstETH@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22200971", + "timestamp": "1743835071" + }, + "market": "0xbdd9105C30e509AdF89f49FF053c91fb454cc5E7", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xdB837F797da1cEfE1b41E89C3DB59B2810Fe788D", + "xt": "0x48d6Ec1f572b302325A6c50624e65AF0b95eBb81", + "gt": "0x8457d0250A5994d7E1E48ee19A55C567CA4237a4" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-market-WETH-PT-weETH-26JUN2025@06APR2025.json b/deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-market-WETH-PT-weETH-26JUN2025@06APR2025.json new file mode 100644 index 0000000..1a30c2f --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-market-WETH-PT-weETH-26JUN2025@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22200971", + "timestamp": "1743835071" + }, + "market": "0xE1242fBD316e92B8f4ED829c7d8ce4fA9E4CA5b1", + "collateral": { + "address": "0xb33808ea0e883138680BA29311a220A7377cdb92", + "symbol": "PT-weETH-26JUN2025", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x9eb985F67F7d39E49E4123E5d2d64fEe1D4355f4", + "xt": "0xeA62Bd42c80763a55Fd43e0364a46067225B8732", + "gt": "0xf8d939a4f2415bD851d48608305106b5D231b676" + }, + "config": { + "marketSymbol": "WETH/PT-weETH-26JUN2025@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-market-WETH-weETH@06APR2025.json b/deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-market-WETH-weETH@06APR2025.json new file mode 100644 index 0000000..3a88d45 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-market-WETH-weETH@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22200971", + "timestamp": "1743835071" + }, + "market": "0x3EA2595bcD33Cc3633B0c88F7CA8230c2a340b54", + "collateral": { + "address": "0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe", + "symbol": "weETH", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xe0fc61f5A4cBd707D79d4EBcc913825D97e35940", + "xt": "0x6C6D326Bd71F554C118A37fEa48941b792018568", + "gt": "0xC3FBEc1ea786C86687E1924baE2d74188805bde7" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-market-WETH-wstETH@06APR2025.json b/deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-market-WETH-wstETH@06APR2025.json new file mode 100644 index 0000000..6fe8f92 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-market-WETH-wstETH@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22200971", + "timestamp": "1743835071" + }, + "market": "0x203fc97998503cE3ADb26B00fe7fd8c51D64fb28", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x0DD18aA62D0A9A47dAB757db55f8A9f46f34808F", + "xt": "0x8356565Adc18D5Ccb8Da346122E2c6a13f7BE1fc", + "gt": "0xBeA1318Dcfd3F441aA4A8A328a58987baac290A7" + }, + "config": { + "marketSymbol": "WETH/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-vault-TermMax USDC Vault.json b/deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-vault-TermMax USDC Vault.json new file mode 100644 index 0000000..4084050 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-vault-TermMax USDC Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22186270", + "timestamp": "1743657771" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TermMax USDC Vault", + "address": "0x9170A095e7073559ffe1240ccF692Abb94F32a28", + "asset": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "performanceFeeRate": 10000000, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-vault-TermMax WETH Vault.json b/deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-vault-TermMax WETH Vault.json new file mode 100644 index 0000000..7b33cbf --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250406-1400/arb-mainnet-vault-TermMax WETH Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22182632", + "timestamp": "1743613861" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TermMax WETH Vault", + "address": "0xeBF448902145f65b4E1B3C4e3A269444e0213C9e", + "asset": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "performanceFeeRate": 10000000, + "maxCapacity": "500000000000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250406-1400/deploy-market-arb-mainnet-20250406-1400-log.txt b/deployments/arb-mainnet-v1.0.8-20250406-1400/deploy-market-arb-mainnet-20250406-1400-log.txt new file mode 100644 index 0000000..d86f76c --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250406-1400/deploy-market-arb-mainnet-20250406-1400-log.txt @@ -0,0 +1,243 @@ +Running on arb-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: arb-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://arb-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ARBSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf7ea840ec163817b51384fcc1d53ee433b758a8b + + ===== Block Info ===== + Block number: 22200971 + Block timestamp: 1743835071 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22200971 + + ===== Market Info - 0 ===== + Market deployed at: 0x203fc97998503cE3ADb26B00fe7fd8c51D64fb28 + Market name: WETH/wstETH@30MAY2025 + Market symbol: WETH/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x0DD18aA62D0A9A47dAB757db55f8A9f46f34808F + XT deployed at: 0x8356565Adc18D5Ccb8Da346122E2c6a13f7BE1fc + GT deployed at: 0xBeA1318Dcfd3F441aA4A8A328a58987baac290A7 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-wstETH@06APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xbdd9105C30e509AdF89f49FF053c91fb454cc5E7 + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0xdB837F797da1cEfE1b41E89C3DB59B2810Fe788D + XT deployed at: 0x48d6Ec1f572b302325A6c50624e65AF0b95eBb81 + GT deployed at: 0x8457d0250A5994d7E1E48ee19A55C567CA4237a4 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-wstETH@06APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x89d72446542156B001ACE4a8f5557C4BD903Bc5b + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x4Cc26320725235813f84D1340cE3225CdF08F999 + XT deployed at: 0x4A1c48C2B9538901BA56f5a9DDB20DDb9793Bc3E + GT deployed at: 0xa0706c0286F18dE51F16d1B581Bd11be256085BD + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WBTC@06APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0x3EA2595bcD33Cc3633B0c88F7CA8230c2a340b54 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0xe0fc61f5A4cBd707D79d4EBcc913825D97e35940 + XT deployed at: 0x6C6D326Bd71F554C118A37fEa48941b792018568 + GT deployed at: 0xC3FBEc1ea786C86687E1924baE2d74188805bde7 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-weETH@06APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0xD484A89403c42c3AeAB2215425Db888a6972c4D8 + Market name: USDC/WETH@30MAY2025 + Market symbol: USDC/WETH@30MAY2025 + Collateral (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0xc0A9Cb630B77665Db32FdBf61aC23868d6AE82E4 + XT deployed at: 0xC5a424F7328904cfeEA16A84673a87975CE2da4A + GT deployed at: 0x356E6E5FCE66eB7117b66a504DB2e786eca1d6d7 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WETH@06APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0xa77BD71a168c814DC3c3a0Df1df89905306e4D2e + Market name: USDC/ARB@30MAY2025 + Market symbol: USDC/ARB@30MAY2025 + Collateral (ARB) address: 0x912CE59144191C1204E64559FE8253a0e49E6548 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x4f85770660dBbdAC9337f039133CBbcA86F0f128 + XT deployed at: 0xa895F0DcBE4B20D6eAb7435Ac37Bc0c0ecccaC98 + GT deployed at: 0x61AAA12fa3f6fa170F58efE8855bFB3E3F57447f + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-ARB@06APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0xE1242fBD316e92B8f4ED829c7d8ce4fA9E4CA5b1 + Market name: WETH/PT-weETH-26JUN2025@27JUN2025 + Market symbol: WETH/PT-weETH-26JUN2025@27JUN2025 + Collateral (PT-weETH-26JUN2025) address: 0xb33808ea0e883138680BA29311a220A7377cdb92 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x9eb985F67F7d39E49E4123E5d2d64fEe1D4355f4 + XT deployed at: 0xeA62Bd42c80763a55Fd43e0364a46067225B8732 + GT deployed at: 0xf8d939a4f2415bD851d48608305106b5D231b676 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-PT-weETH-26JUN2025@06APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 42161 + +Estimated gas price: 0.020000001 gwei + +Estimated total gas used for script: 10150845 + +Estimated amount required: 0.000203016910150845 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x203fc97998503ce3adb26b00fe7fd8c51d64fb28, 0x0dd18aa62d0a9a47dab757db55f8a9f46f34808f, 0x8356565adc18d5ccb8da346122e2c6a13f7be1fc, 0xbea1318dcfd3f441aa4a8a328a58987baac290a7, 0xbdd9105c30e509adf89f49ff053c91fb454cc5e7, 0xdb837f797da1cefe1b41e89c3db59b2810fe788d, 0x48d6ec1f572b302325a6c50624e65af0b95ebb81, 0x8457d0250a5994d7e1e48ee19a55c567ca4237a4, 0x89d72446542156b001ace4a8f5557c4bd903bc5b, 0x4cc26320725235813f84d1340ce3225cdf08f999, 0x4a1c48c2b9538901ba56f5a9ddb20ddb9793bc3e, 0xa0706c0286f18de51f16d1b581bd11be256085bd, 0x3ea2595bcd33cc3633b0c88f7ca8230c2a340b54, 0xe0fc61f5a4cbd707d79d4ebcc913825d97e35940, 0x6c6d326bd71f554c118a37fea48941b792018568, 0xc3fbec1ea786c86687e1924bae2d74188805bde7, 0xd484a89403c42c3aeab2215425db888a6972c4d8, 0xc0a9cb630b77665db32fdbf61ac23868d6ae82e4, 0xc5a424f7328904cfeea16a84673a87975ce2da4a, 0x356e6e5fce66eb7117b66a504db2e786eca1d6d7, 0xa77bd71a168c814dc3c3a0df1df89905306e4d2e, 0x4f85770660dbbdac9337f039133cbbca86f0f128, 0xa895f0dcbe4b20d6eab7435ac37bc0c0ecccac98, 0x61aaa12fa3f6fa170f58efe8855bfb3e3f57447f, 0xe1242fbd316e92b8f4ed829c7d8ce4fa9e4ca5b1, 0x9eb985f67f7d39e49e4123e5d2d64fee1d4355f4, 0xea62bd42c80763a55fd43e0364a46067225b8732, 0xf8d939a4f2415bd851d48608305106b5d231b676]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/42161/run-latest.json + +[SUCCESS] market deployment to arb-mainnet completed successfully! diff --git a/deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-access-manager.json b/deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-access-manager.json new file mode 100644 index 0000000..f75a2f5 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743606817", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182046", + "timestamp": "1743606817" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-core.json b/deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-core.json new file mode 100644 index 0000000..435d898 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743608156", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182159", + "timestamp": "1743608156" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x14920Eb11b71873d01c93B589b40585dacfCA096", + "vaultFactory": "0x929CBcb8150aD59DB63c92A7dAEc07b30d38bA79", + "oracleAggregator": "0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa", + "router": "0x7fa333b184868d88aC78a82eC06d5e87d4B0322E", + "swapAdapter": { + "uniswapV3Adapter": "0x609F20ee24E10010A62970E1dAb7E2b84eD74CAb", + "odosV2Adapter": "0x7de4efa140E52B7207FA689D41AfEE461B83E748", + "pendleSwapV3Adapter": "0xb0eCCbaD4b4cc190261c29C6E8d85bcF04284a8b", + "ERC4626VaultAdapter": "0xa50929A67daF9Ff3567e2Bb3411204A134f72546" + }, + "marketViewer": "0x276C0E52508d94ff2D4106b1559c8c4Bc3a75dec" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-market-USDC-ARB@06APR2025.json b/deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-market-USDC-ARB@06APR2025.json new file mode 100644 index 0000000..1ba3a77 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-market-USDC-ARB@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201070", + "timestamp": "1743836288" + }, + "market": "0xcf1C5CDc29BB74B1e5DAC755a4C196BD6453fb0B", + "collateral": { + "address": "0x912CE59144191C1204E64559FE8253a0e49E6548", + "symbol": "ARB", + "priceFeed": "0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x8Fdf5d00F4a880F04B789F07D4E7041A4cD85A50", + "xt": "0x77f5862E721dBd0ac99b8198F3b72d8De3784d21", + "gt": "0x7003d2D4E5d6169175e5D2ae675D4127F42DbF0A" + }, + "config": { + "marketSymbol": "USDC/ARB@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-market-USDC-WBTC@06APR2025.json b/deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-market-USDC-WBTC@06APR2025.json new file mode 100644 index 0000000..5a55cfd --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-market-USDC-WBTC@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201070", + "timestamp": "1743836288" + }, + "market": "0xcC87397a8C6d750167182C4786f96fe025c4CfAb", + "collateral": { + "address": "0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f", + "symbol": "WBTC", + "priceFeed": "0xd0C7101eACbB49F3deCcCc166d238410D6D46d57", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x792B7de63EC6C6990C73443F26D1e56872Bc228b", + "xt": "0x7b13B8c19b86b3b0BA3f518Faa12A6776860F8d0", + "gt": "0xdcBbBc7817097b85c56D9155b2204b7e31A7c0B3" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-market-USDC-WETH@06APR2025.json b/deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-market-USDC-WETH@06APR2025.json new file mode 100644 index 0000000..b1027d6 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-market-USDC-WETH@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201070", + "timestamp": "1743836288" + }, + "market": "0xDA1036d5bb427c97D7E11B7B715cf9b9729E8a2C", + "collateral": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xF5972CCAbE97e25cE93c474B0ddc93aB5662a0Fe", + "xt": "0xAA4891F772D41f0e2963A0Fb2CA6a251abCaC78d", + "gt": "0x83d4F1279BF3994Bd5A03A11378faC42569a8e14" + }, + "config": { + "marketSymbol": "USDC/WETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-market-USDC-wstETH@06APR2025.json b/deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-market-USDC-wstETH@06APR2025.json new file mode 100644 index 0000000..29a5de0 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-market-USDC-wstETH@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201070", + "timestamp": "1743836288" + }, + "market": "0xF1e1bbFf2e48509CCC528B578d423E1f47B22EA8", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x3d37c8B4E60fdB0227Df08920F9785D747983155", + "xt": "0xaCc398Cdf4119916bF5d418D83dc990311c47534", + "gt": "0x8786e939b7dAC67e0C12Ee46bfA9fc31356bad6d" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@06APR2025.json b/deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@06APR2025.json new file mode 100644 index 0000000..a8b811a --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201070", + "timestamp": "1743836288" + }, + "market": "0xAf631567aB57b650fD1bFdBA4Bd030814cA24c5d", + "collateral": { + "address": "0xb33808ea0e883138680BA29311a220A7377cdb92", + "symbol": "PT-weETH-26JUN2025", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xA1B430bcCdcBc6D2CFe51a9bBdE4c4F651feaEC2", + "xt": "0x745FDC4dF70b86A1c219447864BD31AA9eb7B789", + "gt": "0x91Cc8d420263d4876F95Fe643Ffd899d6E39E51e" + }, + "config": { + "marketSymbol": "WETH/PT-weETH-26JUN2025@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-market-WETH-weETH@06APR2025.json b/deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-market-WETH-weETH@06APR2025.json new file mode 100644 index 0000000..0a90974 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-market-WETH-weETH@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201070", + "timestamp": "1743836288" + }, + "market": "0xCfD6E2Af9a878E3B6D1a1F7cA0faeD908720762A", + "collateral": { + "address": "0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe", + "symbol": "weETH", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xE3143743ee21EA1B6398611b1356186a9f2C433B", + "xt": "0xbF6e6Cf06365Ad4BD455E70B0b1F1036C80eCE38", + "gt": "0x00BbF2c25Be973ced1aA3143f4Fa52AC7e5F7403" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-market-WETH-wstETH@06APR2025.json b/deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-market-WETH-wstETH@06APR2025.json new file mode 100644 index 0000000..8ee0da5 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-market-WETH-wstETH@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201070", + "timestamp": "1743836288" + }, + "market": "0x8D773ACe070c36a01F0dA7fd13DABd2Ca39246AB", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x21ed381c28918e222649B9048BEFB5e564FB7682", + "xt": "0x4f61e6be86C76D46658A68e20D18cB0Cf650a38A", + "gt": "0x366A6c4aC0DE8e008BdB37578055D06553d8c830" + }, + "config": { + "marketSymbol": "WETH/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-vault-TermMax USDC Vault.json b/deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-vault-TermMax USDC Vault.json new file mode 100644 index 0000000..4084050 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-vault-TermMax USDC Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22186270", + "timestamp": "1743657771" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TermMax USDC Vault", + "address": "0x9170A095e7073559ffe1240ccF692Abb94F32a28", + "asset": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "performanceFeeRate": 10000000, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-vault-TermMax WETH Vault.json b/deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-vault-TermMax WETH Vault.json new file mode 100644 index 0000000..7b33cbf --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250406-2000/arb-mainnet-vault-TermMax WETH Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22182632", + "timestamp": "1743613861" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TermMax WETH Vault", + "address": "0xeBF448902145f65b4E1B3C4e3A269444e0213C9e", + "asset": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "performanceFeeRate": 10000000, + "maxCapacity": "500000000000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250406-2000/deploy-market-arb-mainnet-20250406-2000-log.txt b/deployments/arb-mainnet-v1.0.8-20250406-2000/deploy-market-arb-mainnet-20250406-2000-log.txt new file mode 100644 index 0000000..9f4c507 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250406-2000/deploy-market-arb-mainnet-20250406-2000-log.txt @@ -0,0 +1,243 @@ +Running on arb-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: arb-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://arb-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ARBSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf7ea840ec163817b51384fcc1d53ee433b758a8b + + ===== Block Info ===== + Block number: 22201070 + Block timestamp: 1743836288 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22201070 + + ===== Market Info - 0 ===== + Market deployed at: 0x8D773ACe070c36a01F0dA7fd13DABd2Ca39246AB + Market name: WETH/wstETH@30MAY2025 + Market symbol: WETH/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x21ed381c28918e222649B9048BEFB5e564FB7682 + XT deployed at: 0x4f61e6be86C76D46658A68e20D18cB0Cf650a38A + GT deployed at: 0x366A6c4aC0DE8e008BdB37578055D06553d8c830 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-wstETH@06APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xF1e1bbFf2e48509CCC528B578d423E1f47B22EA8 + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x3d37c8B4E60fdB0227Df08920F9785D747983155 + XT deployed at: 0xaCc398Cdf4119916bF5d418D83dc990311c47534 + GT deployed at: 0x8786e939b7dAC67e0C12Ee46bfA9fc31356bad6d + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-wstETH@06APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0xcC87397a8C6d750167182C4786f96fe025c4CfAb + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x792B7de63EC6C6990C73443F26D1e56872Bc228b + XT deployed at: 0x7b13B8c19b86b3b0BA3f518Faa12A6776860F8d0 + GT deployed at: 0xdcBbBc7817097b85c56D9155b2204b7e31A7c0B3 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WBTC@06APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xCfD6E2Af9a878E3B6D1a1F7cA0faeD908720762A + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0xE3143743ee21EA1B6398611b1356186a9f2C433B + XT deployed at: 0xbF6e6Cf06365Ad4BD455E70B0b1F1036C80eCE38 + GT deployed at: 0x00BbF2c25Be973ced1aA3143f4Fa52AC7e5F7403 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-weETH@06APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0xDA1036d5bb427c97D7E11B7B715cf9b9729E8a2C + Market name: USDC/WETH@30MAY2025 + Market symbol: USDC/WETH@30MAY2025 + Collateral (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0xF5972CCAbE97e25cE93c474B0ddc93aB5662a0Fe + XT deployed at: 0xAA4891F772D41f0e2963A0Fb2CA6a251abCaC78d + GT deployed at: 0x83d4F1279BF3994Bd5A03A11378faC42569a8e14 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WETH@06APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0xcf1C5CDc29BB74B1e5DAC755a4C196BD6453fb0B + Market name: USDC/ARB@30MAY2025 + Market symbol: USDC/ARB@30MAY2025 + Collateral (ARB) address: 0x912CE59144191C1204E64559FE8253a0e49E6548 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x8Fdf5d00F4a880F04B789F07D4E7041A4cD85A50 + XT deployed at: 0x77f5862E721dBd0ac99b8198F3b72d8De3784d21 + GT deployed at: 0x7003d2D4E5d6169175e5D2ae675D4127F42DbF0A + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-ARB@06APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0xAf631567aB57b650fD1bFdBA4Bd030814cA24c5d + Market name: WETH/PT-weETH-26JUN2025@27JUN2025 + Market symbol: WETH/PT-weETH-26JUN2025@27JUN2025 + Collateral (PT-weETH-26JUN2025) address: 0xb33808ea0e883138680BA29311a220A7377cdb92 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0xA1B430bcCdcBc6D2CFe51a9bBdE4c4F651feaEC2 + XT deployed at: 0x745FDC4dF70b86A1c219447864BD31AA9eb7B789 + GT deployed at: 0x91Cc8d420263d4876F95Fe643Ffd899d6E39E51e + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-PT-weETH-26JUN2025@06APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 42161 + +Estimated gas price: 0.020000001 gwei + +Estimated total gas used for script: 10151995 + +Estimated amount required: 0.000203039910151995 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x8d773ace070c36a01f0da7fd13dabd2ca39246ab, 0x21ed381c28918e222649b9048befb5e564fb7682, 0x4f61e6be86c76d46658a68e20d18cb0cf650a38a, 0x366a6c4ac0de8e008bdb37578055d06553d8c830, 0xf1e1bbff2e48509ccc528b578d423e1f47b22ea8, 0x3d37c8b4e60fdb0227df08920f9785d747983155, 0xacc398cdf4119916bf5d418d83dc990311c47534, 0x8786e939b7dac67e0c12ee46bfa9fc31356bad6d, 0xcc87397a8c6d750167182c4786f96fe025c4cfab, 0x792b7de63ec6c6990c73443f26d1e56872bc228b, 0x7b13b8c19b86b3b0ba3f518faa12a6776860f8d0, 0xdcbbbc7817097b85c56d9155b2204b7e31a7c0b3, 0xcfd6e2af9a878e3b6d1a1f7ca0faed908720762a, 0xe3143743ee21ea1b6398611b1356186a9f2c433b, 0xbf6e6cf06365ad4bd455e70b0b1f1036c80ece38, 0x00bbf2c25be973ced1aa3143f4fa52ac7e5f7403, 0xda1036d5bb427c97d7e11b7b715cf9b9729e8a2c, 0xf5972ccabe97e25ce93c474b0ddc93ab5662a0fe, 0xaa4891f772d41f0e2963a0fb2ca6a251abcac78d, 0x83d4f1279bf3994bd5a03a11378fac42569a8e14, 0xcf1c5cdc29bb74b1e5dac755a4c196bd6453fb0b, 0x8fdf5d00f4a880f04b789f07d4e7041a4cd85a50, 0x77f5862e721dbd0ac99b8198f3b72d8de3784d21, 0x7003d2d4e5d6169175e5d2ae675d4127f42dbf0a, 0xaf631567ab57b650fd1bfdba4bd030814ca24c5d, 0xa1b430bccdcbc6d2cfe51a9bbde4c4f651feaec2, 0x745fdc4df70b86a1c219447864bd31aa9eb7b789, 0x91cc8d420263d4876f95fe643ffd899d6e39e51e]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/42161/run-latest.json + +[SUCCESS] market deployment to arb-mainnet completed successfully! diff --git a/deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-access-manager.json b/deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-access-manager.json new file mode 100644 index 0000000..f75a2f5 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743606817", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182046", + "timestamp": "1743606817" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-core.json b/deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-core.json new file mode 100644 index 0000000..435d898 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743608156", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182159", + "timestamp": "1743608156" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x14920Eb11b71873d01c93B589b40585dacfCA096", + "vaultFactory": "0x929CBcb8150aD59DB63c92A7dAEc07b30d38bA79", + "oracleAggregator": "0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa", + "router": "0x7fa333b184868d88aC78a82eC06d5e87d4B0322E", + "swapAdapter": { + "uniswapV3Adapter": "0x609F20ee24E10010A62970E1dAb7E2b84eD74CAb", + "odosV2Adapter": "0x7de4efa140E52B7207FA689D41AfEE461B83E748", + "pendleSwapV3Adapter": "0xb0eCCbaD4b4cc190261c29C6E8d85bcF04284a8b", + "ERC4626VaultAdapter": "0xa50929A67daF9Ff3567e2Bb3411204A134f72546" + }, + "marketViewer": "0x276C0E52508d94ff2D4106b1559c8c4Bc3a75dec" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-market-USDC-ARB@07APR2025.json b/deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-market-USDC-ARB@07APR2025.json new file mode 100644 index 0000000..6b60fd6 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-market-USDC-ARB@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201120", + "timestamp": "1743836903" + }, + "market": "0xfbf611Ef130C85229FCC8134328fBfaaa8D908D4", + "collateral": { + "address": "0x912CE59144191C1204E64559FE8253a0e49E6548", + "symbol": "ARB", + "priceFeed": "0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x77bf49973Dc750d98b2F7ED012197f6EA665207b", + "xt": "0xD30032672490Ddf596C1E8d263DB7667C070Cf87", + "gt": "0x1dA8C91eBf644b6ae0F46fdA9f59a3D7cc160950" + }, + "config": { + "marketSymbol": "USDC/ARB@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-market-USDC-WBTC@07APR2025.json b/deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-market-USDC-WBTC@07APR2025.json new file mode 100644 index 0000000..c4a17b0 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-market-USDC-WBTC@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201120", + "timestamp": "1743836903" + }, + "market": "0x06A84dcFB71738664C1fDE4Ff043f2Db1C38442c", + "collateral": { + "address": "0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f", + "symbol": "WBTC", + "priceFeed": "0xd0C7101eACbB49F3deCcCc166d238410D6D46d57", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x993e7dAcEE006e57551f7a26649a4C1410363d4e", + "xt": "0xa7f2Dbf1Da1a21E64eBe8707c42956f1770352D7", + "gt": "0xBC1421C17298D9d03673D57a9f05b2cdCFa5a638" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-market-USDC-WETH@07APR2025.json b/deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-market-USDC-WETH@07APR2025.json new file mode 100644 index 0000000..27bc5ce --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-market-USDC-WETH@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201120", + "timestamp": "1743836903" + }, + "market": "0xEC3fabFd6d39D4BFD0979D81dC2723eb6Dab09A5", + "collateral": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x0734F5A1C63963165A2DF5717C516c6c0768640F", + "xt": "0x52E4EaD3B7438dA4d812eb68514102Ee87a907bC", + "gt": "0xEFea5D0a3375C3c9f56c12Ea89F7C286997a3462" + }, + "config": { + "marketSymbol": "USDC/WETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-market-USDC-wstETH@07APR2025.json b/deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-market-USDC-wstETH@07APR2025.json new file mode 100644 index 0000000..d517156 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-market-USDC-wstETH@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201120", + "timestamp": "1743836903" + }, + "market": "0xe5A7C080c1aa8E7638940C5853529d3485D4575D", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x32824D2f7c12754b69ADD0D4EDA78f134e6b85cB", + "xt": "0xc94Af21C6e0510ceDB921ba9C3076a987151935a", + "gt": "0xFFC5E6e6504bB8D74D5cA132924Abfb165cE6B6b" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-market-WETH-PT-weETH-26JUN2025@07APR2025.json b/deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-market-WETH-PT-weETH-26JUN2025@07APR2025.json new file mode 100644 index 0000000..4b49a13 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-market-WETH-PT-weETH-26JUN2025@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201120", + "timestamp": "1743836903" + }, + "market": "0x63Bc26dfA64D84F8544433bf1828075d78cb84D1", + "collateral": { + "address": "0xb33808ea0e883138680BA29311a220A7377cdb92", + "symbol": "PT-weETH-26JUN2025", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xF3FFdC74CfbB6949F08E6aE0935cF7a7AceB03F5", + "xt": "0x73352F71F5522c1cb9235D77D922dAaAe1191191", + "gt": "0xEbc276fD8CB5D77f12CF7b8F9dA823180FA90Cfd" + }, + "config": { + "marketSymbol": "WETH/PT-weETH-26JUN2025@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-market-WETH-weETH@07APR2025.json b/deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-market-WETH-weETH@07APR2025.json new file mode 100644 index 0000000..c17549c --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-market-WETH-weETH@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201120", + "timestamp": "1743836903" + }, + "market": "0x18FAf8f0f8ba9CE562fb85D1c87A2478438142F9", + "collateral": { + "address": "0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe", + "symbol": "weETH", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xFED7c66155fb8952911dda0AEe722304BEB7E12D", + "xt": "0xb3B46dE7bc4aC50aE2767D9314cD3145fB369D60", + "gt": "0x347f2B0a02aB4e0A7ed216200E739AC7DD995f62" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-market-WETH-wstETH@07APR2025.json b/deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-market-WETH-wstETH@07APR2025.json new file mode 100644 index 0000000..217e0f7 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-market-WETH-wstETH@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201120", + "timestamp": "1743836903" + }, + "market": "0x39147B25E0674B85251862da8f4CCa70025bE528", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xb712A559474A3D898D769F0c5B9824Cd636a7684", + "xt": "0x70b2bf10E653f2d5Fd72B9f9c5352e1Ed8b000c8", + "gt": "0x889a2152a1a2aa3FecFCe8CD13dd5c3FC22b7bD0" + }, + "config": { + "marketSymbol": "WETH/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-vault-TermMax USDC Vault.json b/deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-vault-TermMax USDC Vault.json new file mode 100644 index 0000000..4084050 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-vault-TermMax USDC Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22186270", + "timestamp": "1743657771" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TermMax USDC Vault", + "address": "0x9170A095e7073559ffe1240ccF692Abb94F32a28", + "asset": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "performanceFeeRate": 10000000, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-vault-TermMax WETH Vault.json b/deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-vault-TermMax WETH Vault.json new file mode 100644 index 0000000..7b33cbf --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250407-1400/arb-mainnet-vault-TermMax WETH Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22182632", + "timestamp": "1743613861" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TermMax WETH Vault", + "address": "0xeBF448902145f65b4E1B3C4e3A269444e0213C9e", + "asset": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "performanceFeeRate": 10000000, + "maxCapacity": "500000000000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250407-1400/deploy-market-arb-mainnet-20250407-1400-log.txt b/deployments/arb-mainnet-v1.0.8-20250407-1400/deploy-market-arb-mainnet-20250407-1400-log.txt new file mode 100644 index 0000000..e7058bf --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250407-1400/deploy-market-arb-mainnet-20250407-1400-log.txt @@ -0,0 +1,243 @@ +Running on arb-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: arb-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://arb-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ARBSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf7ea840ec163817b51384fcc1d53ee433b758a8b + + ===== Block Info ===== + Block number: 22201120 + Block timestamp: 1743836903 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22201120 + + ===== Market Info - 0 ===== + Market deployed at: 0x39147B25E0674B85251862da8f4CCa70025bE528 + Market name: WETH/wstETH@30MAY2025 + Market symbol: WETH/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0xb712A559474A3D898D769F0c5B9824Cd636a7684 + XT deployed at: 0x70b2bf10E653f2d5Fd72B9f9c5352e1Ed8b000c8 + GT deployed at: 0x889a2152a1a2aa3FecFCe8CD13dd5c3FC22b7bD0 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-wstETH@07APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xe5A7C080c1aa8E7638940C5853529d3485D4575D + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x32824D2f7c12754b69ADD0D4EDA78f134e6b85cB + XT deployed at: 0xc94Af21C6e0510ceDB921ba9C3076a987151935a + GT deployed at: 0xFFC5E6e6504bB8D74D5cA132924Abfb165cE6B6b + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-wstETH@07APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x06A84dcFB71738664C1fDE4Ff043f2Db1C38442c + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x993e7dAcEE006e57551f7a26649a4C1410363d4e + XT deployed at: 0xa7f2Dbf1Da1a21E64eBe8707c42956f1770352D7 + GT deployed at: 0xBC1421C17298D9d03673D57a9f05b2cdCFa5a638 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WBTC@07APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0x18FAf8f0f8ba9CE562fb85D1c87A2478438142F9 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0xFED7c66155fb8952911dda0AEe722304BEB7E12D + XT deployed at: 0xb3B46dE7bc4aC50aE2767D9314cD3145fB369D60 + GT deployed at: 0x347f2B0a02aB4e0A7ed216200E739AC7DD995f62 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-weETH@07APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0xEC3fabFd6d39D4BFD0979D81dC2723eb6Dab09A5 + Market name: USDC/WETH@30MAY2025 + Market symbol: USDC/WETH@30MAY2025 + Collateral (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x0734F5A1C63963165A2DF5717C516c6c0768640F + XT deployed at: 0x52E4EaD3B7438dA4d812eb68514102Ee87a907bC + GT deployed at: 0xEFea5D0a3375C3c9f56c12Ea89F7C286997a3462 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WETH@07APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0xfbf611Ef130C85229FCC8134328fBfaaa8D908D4 + Market name: USDC/ARB@30MAY2025 + Market symbol: USDC/ARB@30MAY2025 + Collateral (ARB) address: 0x912CE59144191C1204E64559FE8253a0e49E6548 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x77bf49973Dc750d98b2F7ED012197f6EA665207b + XT deployed at: 0xD30032672490Ddf596C1E8d263DB7667C070Cf87 + GT deployed at: 0x1dA8C91eBf644b6ae0F46fdA9f59a3D7cc160950 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-ARB@07APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x63Bc26dfA64D84F8544433bf1828075d78cb84D1 + Market name: WETH/PT-weETH-26JUN2025@27JUN2025 + Market symbol: WETH/PT-weETH-26JUN2025@27JUN2025 + Collateral (PT-weETH-26JUN2025) address: 0xb33808ea0e883138680BA29311a220A7377cdb92 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0xF3FFdC74CfbB6949F08E6aE0935cF7a7AceB03F5 + XT deployed at: 0x73352F71F5522c1cb9235D77D922dAaAe1191191 + GT deployed at: 0xEbc276fD8CB5D77f12CF7b8F9dA823180FA90Cfd + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-PT-weETH-26JUN2025@07APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 42161 + +Estimated gas price: 0.020000001 gwei + +Estimated total gas used for script: 10140491 + +Estimated amount required: 0.000202809830140491 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x39147b25e0674b85251862da8f4cca70025be528, 0xb712a559474a3d898d769f0c5b9824cd636a7684, 0x70b2bf10e653f2d5fd72b9f9c5352e1ed8b000c8, 0x889a2152a1a2aa3fecfce8cd13dd5c3fc22b7bd0, 0xe5a7c080c1aa8e7638940c5853529d3485d4575d, 0x32824d2f7c12754b69add0d4eda78f134e6b85cb, 0xc94af21c6e0510cedb921ba9c3076a987151935a, 0xffc5e6e6504bb8d74d5ca132924abfb165ce6b6b, 0x06a84dcfb71738664c1fde4ff043f2db1c38442c, 0x993e7dacee006e57551f7a26649a4c1410363d4e, 0xa7f2dbf1da1a21e64ebe8707c42956f1770352d7, 0xbc1421c17298d9d03673d57a9f05b2cdcfa5a638, 0x18faf8f0f8ba9ce562fb85d1c87a2478438142f9, 0xfed7c66155fb8952911dda0aee722304beb7e12d, 0xb3b46de7bc4ac50ae2767d9314cd3145fb369d60, 0x347f2b0a02ab4e0a7ed216200e739ac7dd995f62, 0xec3fabfd6d39d4bfd0979d81dc2723eb6dab09a5, 0x0734f5a1c63963165a2df5717c516c6c0768640f, 0x52e4ead3b7438da4d812eb68514102ee87a907bc, 0xefea5d0a3375c3c9f56c12ea89f7c286997a3462, 0xfbf611ef130c85229fcc8134328fbfaaa8d908d4, 0x77bf49973dc750d98b2f7ed012197f6ea665207b, 0xd30032672490ddf596c1e8d263db7667c070cf87, 0x1da8c91ebf644b6ae0f46fda9f59a3d7cc160950, 0x63bc26dfa64d84f8544433bf1828075d78cb84d1, 0xf3ffdc74cfbb6949f08e6ae0935cf7a7aceb03f5, 0x73352f71f5522c1cb9235d77d922daaae1191191, 0xebc276fd8cb5d77f12cf7b8f9da823180fa90cfd]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/42161/run-latest.json + +[SUCCESS] market deployment to arb-mainnet completed successfully! diff --git a/deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-access-manager.json b/deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-access-manager.json new file mode 100644 index 0000000..f75a2f5 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743606817", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182046", + "timestamp": "1743606817" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-core.json b/deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-core.json new file mode 100644 index 0000000..435d898 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743608156", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182159", + "timestamp": "1743608156" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x14920Eb11b71873d01c93B589b40585dacfCA096", + "vaultFactory": "0x929CBcb8150aD59DB63c92A7dAEc07b30d38bA79", + "oracleAggregator": "0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa", + "router": "0x7fa333b184868d88aC78a82eC06d5e87d4B0322E", + "swapAdapter": { + "uniswapV3Adapter": "0x609F20ee24E10010A62970E1dAb7E2b84eD74CAb", + "odosV2Adapter": "0x7de4efa140E52B7207FA689D41AfEE461B83E748", + "pendleSwapV3Adapter": "0xb0eCCbaD4b4cc190261c29C6E8d85bcF04284a8b", + "ERC4626VaultAdapter": "0xa50929A67daF9Ff3567e2Bb3411204A134f72546" + }, + "marketViewer": "0x276C0E52508d94ff2D4106b1559c8c4Bc3a75dec" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-market-USDC-ARB@07APR2025.json b/deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-market-USDC-ARB@07APR2025.json new file mode 100644 index 0000000..bb9c99e --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-market-USDC-ARB@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201160", + "timestamp": "1743837392" + }, + "market": "0x6b200B04b991a4Bb2008fCFeF1543B67F50Db66A", + "collateral": { + "address": "0x912CE59144191C1204E64559FE8253a0e49E6548", + "symbol": "ARB", + "priceFeed": "0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x46598ddEFC61F16C0F2E649Ce79067237F665D8E", + "xt": "0x8835fE29EE045b54F104b7fcA4d7c8A43ACbb285", + "gt": "0xE70AEf3e286d08c245acFeCb6e3BA4BDF5DCCA9e" + }, + "config": { + "marketSymbol": "USDC/ARB@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-market-USDC-WBTC@07APR2025.json b/deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-market-USDC-WBTC@07APR2025.json new file mode 100644 index 0000000..40e637d --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-market-USDC-WBTC@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201160", + "timestamp": "1743837392" + }, + "market": "0x594c0cFCac1d8ba5d574C23BAeA862254483706e", + "collateral": { + "address": "0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f", + "symbol": "WBTC", + "priceFeed": "0xd0C7101eACbB49F3deCcCc166d238410D6D46d57", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x72F96776aE04Ee008ec3B23F03De8C5201b4aeA6", + "xt": "0xf4492D1D6b4431a70259375DbbbAB0098818E551", + "gt": "0x6a0F318E8B6B732F21D920d8f7039385954402db" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-market-USDC-WETH@07APR2025.json b/deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-market-USDC-WETH@07APR2025.json new file mode 100644 index 0000000..ad09033 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-market-USDC-WETH@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201160", + "timestamp": "1743837392" + }, + "market": "0xC8b5DcF19647e46Ee84faC6415Fa2DAE417744A2", + "collateral": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x9bc7917d2653c640b709423b90a4dc68010d12cc", + "xt": "0x4acd37C33a209041dd3ddae692700926ed89bf93", + "gt": "0x50A554031A9f41EdFee643E0304bc740D1C0d304" + }, + "config": { + "marketSymbol": "USDC/WETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-market-USDC-wstETH@07APR2025.json b/deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-market-USDC-wstETH@07APR2025.json new file mode 100644 index 0000000..61f6eb9 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-market-USDC-wstETH@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201160", + "timestamp": "1743837392" + }, + "market": "0xbbA787E60732E7e6B54C98ad2FA580194439e013", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x42e2e298FAD57A92ec0b12a2672C1D6B643e5cA4", + "xt": "0xD9a19fa50a745F241d06B0edb1e0ecf9c3A60503", + "gt": "0x8f1CEaA9B96D723eCe4024F60393Dfa5712bA599" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@07APR2025.json b/deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@07APR2025.json new file mode 100644 index 0000000..a0d0f4e --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201160", + "timestamp": "1743837392" + }, + "market": "0x007000fC3334A89919Eee221E6C2D2c8da975AAf", + "collateral": { + "address": "0xb33808ea0e883138680BA29311a220A7377cdb92", + "symbol": "PT-weETH-26JUN2025", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x9a8cb9085f56311D32552EeAaF821ae451d09F04", + "xt": "0x0865E44B0C21cF6bee4aFaDB6c809d305DeAdb1f", + "gt": "0xffd615b03e4872314114F934022DF122Cb1662e6" + }, + "config": { + "marketSymbol": "WETH/PT-weETH-26JUN2025@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-market-WETH-weETH@07APR2025.json b/deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-market-WETH-weETH@07APR2025.json new file mode 100644 index 0000000..4328387 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-market-WETH-weETH@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201160", + "timestamp": "1743837392" + }, + "market": "0x60a2ED2fb29Db61ba6F3b66fc9aD5bF790E7F475", + "collateral": { + "address": "0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe", + "symbol": "weETH", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xF5C8AbcCB2342A28503A563509eB7Cadb2aDf978", + "xt": "0xFdCE88048A2bB99EF2b343e94Fd8c118EAF4B440", + "gt": "0x6B1585BeD002F2C85574736AB031dcb4a9E06c04" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-market-WETH-wstETH@07APR2025.json b/deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-market-WETH-wstETH@07APR2025.json new file mode 100644 index 0000000..4fd5976 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-market-WETH-wstETH@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201160", + "timestamp": "1743837392" + }, + "market": "0x019523D518293564560Dc46136DCfa389B05305c", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x1FafD0DEd8Dd75D19C39268cbF5C41830E95b70F", + "xt": "0xc01f16f8A4b29603a4133efa479b61416866AD10", + "gt": "0x7866514a8E42df186C5EF4C9C995Aa193b434cc6" + }, + "config": { + "marketSymbol": "WETH/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-vault-TermMax USDC Vault.json b/deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-vault-TermMax USDC Vault.json new file mode 100644 index 0000000..4084050 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-vault-TermMax USDC Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22186270", + "timestamp": "1743657771" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TermMax USDC Vault", + "address": "0x9170A095e7073559ffe1240ccF692Abb94F32a28", + "asset": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "performanceFeeRate": 10000000, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-vault-TermMax WETH Vault.json b/deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-vault-TermMax WETH Vault.json new file mode 100644 index 0000000..7b33cbf --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250407-2000/arb-mainnet-vault-TermMax WETH Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22182632", + "timestamp": "1743613861" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TermMax WETH Vault", + "address": "0xeBF448902145f65b4E1B3C4e3A269444e0213C9e", + "asset": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "performanceFeeRate": 10000000, + "maxCapacity": "500000000000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250407-2000/deploy-market-arb-mainnet-20250407-2000-log.txt b/deployments/arb-mainnet-v1.0.8-20250407-2000/deploy-market-arb-mainnet-20250407-2000-log.txt new file mode 100644 index 0000000..86047e0 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250407-2000/deploy-market-arb-mainnet-20250407-2000-log.txt @@ -0,0 +1,243 @@ +Running on arb-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: arb-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://arb-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ARBSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf7ea840ec163817b51384fcc1d53ee433b758a8b + + ===== Block Info ===== + Block number: 22201160 + Block timestamp: 1743837392 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22201160 + + ===== Market Info - 0 ===== + Market deployed at: 0x019523D518293564560Dc46136DCfa389B05305c + Market name: WETH/wstETH@30MAY2025 + Market symbol: WETH/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x1FafD0DEd8Dd75D19C39268cbF5C41830E95b70F + XT deployed at: 0xc01f16f8A4b29603a4133efa479b61416866AD10 + GT deployed at: 0x7866514a8E42df186C5EF4C9C995Aa193b434cc6 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-wstETH@07APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xbbA787E60732E7e6B54C98ad2FA580194439e013 + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x42e2e298FAD57A92ec0b12a2672C1D6B643e5cA4 + XT deployed at: 0xD9a19fa50a745F241d06B0edb1e0ecf9c3A60503 + GT deployed at: 0x8f1CEaA9B96D723eCe4024F60393Dfa5712bA599 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-wstETH@07APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x594c0cFCac1d8ba5d574C23BAeA862254483706e + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x72F96776aE04Ee008ec3B23F03De8C5201b4aeA6 + XT deployed at: 0xf4492D1D6b4431a70259375DbbbAB0098818E551 + GT deployed at: 0x6a0F318E8B6B732F21D920d8f7039385954402db + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WBTC@07APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0x60a2ED2fb29Db61ba6F3b66fc9aD5bF790E7F475 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0xF5C8AbcCB2342A28503A563509eB7Cadb2aDf978 + XT deployed at: 0xFdCE88048A2bB99EF2b343e94Fd8c118EAF4B440 + GT deployed at: 0x6B1585BeD002F2C85574736AB031dcb4a9E06c04 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-weETH@07APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0xC8b5DcF19647e46Ee84faC6415Fa2DAE417744A2 + Market name: USDC/WETH@30MAY2025 + Market symbol: USDC/WETH@30MAY2025 + Collateral (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x9bc7917d2653c640b709423b90a4dc68010d12cc + XT deployed at: 0x4acd37C33a209041dd3ddae692700926ed89bf93 + GT deployed at: 0x50A554031A9f41EdFee643E0304bc740D1C0d304 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WETH@07APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x6b200B04b991a4Bb2008fCFeF1543B67F50Db66A + Market name: USDC/ARB@30MAY2025 + Market symbol: USDC/ARB@30MAY2025 + Collateral (ARB) address: 0x912CE59144191C1204E64559FE8253a0e49E6548 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x46598ddEFC61F16C0F2E649Ce79067237F665D8E + XT deployed at: 0x8835fE29EE045b54F104b7fcA4d7c8A43ACbb285 + GT deployed at: 0xE70AEf3e286d08c245acFeCb6e3BA4BDF5DCCA9e + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-ARB@07APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x007000fC3334A89919Eee221E6C2D2c8da975AAf + Market name: WETH/PT-weETH-26JUN2025@27JUN2025 + Market symbol: WETH/PT-weETH-26JUN2025@27JUN2025 + Collateral (PT-weETH-26JUN2025) address: 0xb33808ea0e883138680BA29311a220A7377cdb92 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x9a8cb9085f56311D32552EeAaF821ae451d09F04 + XT deployed at: 0x0865E44B0C21cF6bee4aFaDB6c809d305DeAdb1f + GT deployed at: 0xffd615b03e4872314114F934022DF122Cb1662e6 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-PT-weETH-26JUN2025@07APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 42161 + +Estimated gas price: 0.020000001 gwei + +Estimated total gas used for script: 10142918 + +Estimated amount required: 0.000202858370142918 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x019523d518293564560dc46136dcfa389b05305c, 0x1fafd0ded8dd75d19c39268cbf5c41830e95b70f, 0xc01f16f8a4b29603a4133efa479b61416866ad10, 0x7866514a8e42df186c5ef4c9c995aa193b434cc6, 0xbba787e60732e7e6b54c98ad2fa580194439e013, 0x42e2e298fad57a92ec0b12a2672c1d6b643e5ca4, 0xd9a19fa50a745f241d06b0edb1e0ecf9c3a60503, 0x8f1ceaa9b96d723ece4024f60393dfa5712ba599, 0x594c0cfcac1d8ba5d574c23baea862254483706e, 0x72f96776ae04ee008ec3b23f03de8c5201b4aea6, 0xf4492d1d6b4431a70259375dbbbab0098818e551, 0x6a0f318e8b6b732f21d920d8f7039385954402db, 0x60a2ed2fb29db61ba6f3b66fc9ad5bf790e7f475, 0xf5c8abccb2342a28503a563509eb7cadb2adf978, 0xfdce88048a2bb99ef2b343e94fd8c118eaf4b440, 0x6b1585bed002f2c85574736ab031dcb4a9e06c04, 0xc8b5dcf19647e46ee84fac6415fa2dae417744a2, 0x9bc7917d2653c640b709423b90a4dc68010d12cc, 0x4acd37c33a209041dd3ddae692700926ed89bf93, 0x50a554031a9f41edfee643e0304bc740d1c0d304, 0x6b200b04b991a4bb2008fcfef1543b67f50db66a, 0x46598ddefc61f16c0f2e649ce79067237f665d8e, 0x8835fe29ee045b54f104b7fca4d7c8a43acbb285, 0xe70aef3e286d08c245acfecb6e3ba4bdf5dcca9e, 0x007000fc3334a89919eee221e6c2d2c8da975aaf, 0x9a8cb9085f56311d32552eeaaf821ae451d09f04, 0x0865e44b0c21cf6bee4afadb6c809d305deadb1f, 0xffd615b03e4872314114f934022df122cb1662e6]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/42161/run-latest.json + +[SUCCESS] market deployment to arb-mainnet completed successfully! diff --git a/deployments/arb-mainnet-v1.0.8-20250408-1400/accept-oracles-20250403-log.txt b/deployments/arb-mainnet-v1.0.8-20250408-1400/accept-oracles-20250403-log.txt new file mode 100644 index 0000000..2a93d96 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250408-1400/accept-oracles-20250403-log.txt @@ -0,0 +1,107 @@ +Running on arb-mainnet... +=== Configuration === +Operation: Script Execution +Network: arb-mainnet +Script: AcceptOracles.s.sol +Path: script/AcceptOracles.s.sol +RPC URL: http*****://arb-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Disabled +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xa669e7A0d4b3e4Fa48af2dE86BD4CD7126Be4e13 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting script execution... +Executing: forge script script/AcceptOracles.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow +No files changed, compilation skipped +Script ran successfully. + +== Logs == + === Checking Pending Oracles === + Oracle Aggregator Address: 0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa + Network: arb-mainnet + Current Block Timestamp: 1743663209 + + Accepted oracle for token: + Token Symbol: WETH + Token Address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: wstETH + Token Address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: USDC + Token Address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: WBTC + Token Address: 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: weETH + Token Address: 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: ARB + Token Address: 0x912CE59144191C1204E64559FE8253a0e49E6548 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: PT-weETH-26JUN2025 + Token Address: 0xb33808ea0e883138680BA29311a220A7377cdb92 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Heartbeat: 86400 + -------------------------------- + + === Oracle Acceptance Summary === + Total tokens checked: 7 + Oracles accepted: 7 + Oracles not ready: 0 + +## Setting up 1 EVM. + +========================== + +Chain 42161 + +Estimated gas price: 0.020000001 gwei + +Estimated total gas used for script: 914354 + +Estimated amount required: 0.000018287080914354 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/AcceptOracles.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/AcceptOracles.s.sol/42161/run-latest.json + +[SUCCESS] Script AcceptOracles executed successfully on arb-mainnet (Broadcast mode)! diff --git a/deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-access-manager.json b/deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-access-manager.json new file mode 100644 index 0000000..f75a2f5 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743606817", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182046", + "timestamp": "1743606817" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-core.json b/deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-core.json new file mode 100644 index 0000000..435d898 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743608156", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182159", + "timestamp": "1743608156" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x14920Eb11b71873d01c93B589b40585dacfCA096", + "vaultFactory": "0x929CBcb8150aD59DB63c92A7dAEc07b30d38bA79", + "oracleAggregator": "0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa", + "router": "0x7fa333b184868d88aC78a82eC06d5e87d4B0322E", + "swapAdapter": { + "uniswapV3Adapter": "0x609F20ee24E10010A62970E1dAb7E2b84eD74CAb", + "odosV2Adapter": "0x7de4efa140E52B7207FA689D41AfEE461B83E748", + "pendleSwapV3Adapter": "0xb0eCCbaD4b4cc190261c29C6E8d85bcF04284a8b", + "ERC4626VaultAdapter": "0xa50929A67daF9Ff3567e2Bb3411204A134f72546" + }, + "marketViewer": "0x276C0E52508d94ff2D4106b1559c8c4Bc3a75dec" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-market-USDC-ARB@08APR2025.json b/deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-market-USDC-ARB@08APR2025.json new file mode 100644 index 0000000..57ffcfc --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-market-USDC-ARB@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22215100", + "timestamp": "1744005644" + }, + "market": "0x336d1bc868139BE75CbbD6714b6e1ff43DDe9d06", + "collateral": { + "address": "0x912CE59144191C1204E64559FE8253a0e49E6548", + "symbol": "ARB", + "priceFeed": "0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xf3dd96209a49583bD831809730146b4e109d3dA7", + "xt": "0x4484d42F46A4485c50894639A9743c8506B7EAA3", + "gt": "0xA9843e77E3585B2D7D9286249E8Ce6f72Db4C5F7" + }, + "config": { + "marketSymbol": "USDC/ARB@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-market-USDC-WBTC@08APR2025.json b/deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-market-USDC-WBTC@08APR2025.json new file mode 100644 index 0000000..78077fa --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-market-USDC-WBTC@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22215100", + "timestamp": "1744005644" + }, + "market": "0x1fc86F5E314f8926C2a65fA3Fbd5475872F93587", + "collateral": { + "address": "0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f", + "symbol": "WBTC", + "priceFeed": "0xd0C7101eACbB49F3deCcCc166d238410D6D46d57", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x6D71683e3671631847B1c1FF98876175585d0232", + "xt": "0x815E7Abf75b20d44E4bac65a8dB78Be52Baaf5AB", + "gt": "0x93264Dce6f50699C153aF26781550BF60e6D718F" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-market-USDC-WETH@08APR2025.json b/deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-market-USDC-WETH@08APR2025.json new file mode 100644 index 0000000..ee77c46 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-market-USDC-WETH@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22215100", + "timestamp": "1744005644" + }, + "market": "0xaac38fBAa34C840d272D4a390439d1a52AaFf656", + "collateral": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x08F2FaFFB91AB82b69F89E9A6F71F35BE79858D8", + "xt": "0xC1B4bf59f2Face17E5d367Cb6c84Fe95755D5BCa", + "gt": "0xE1aEBa432af030f98aBB8134858C97b96D4da23b" + }, + "config": { + "marketSymbol": "USDC/WETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-market-USDC-wstETH@08APR2025.json b/deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-market-USDC-wstETH@08APR2025.json new file mode 100644 index 0000000..33bac5e --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-market-USDC-wstETH@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22215100", + "timestamp": "1744005644" + }, + "market": "0xE905E3d8ABf8426FBC92cF937593d015d3E91452", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x4d2c344bA129d64FaEf265c46acFf649Ef68370a", + "xt": "0x33F1F076C95C9c82f8d375F23055296D0bF50329", + "gt": "0x4232f028ACA0cc0F33F08be7763833988960a30e" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-market-WETH-PT-weETH-26JUN2025@08APR2025.json b/deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-market-WETH-PT-weETH-26JUN2025@08APR2025.json new file mode 100644 index 0000000..2424e9a --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-market-WETH-PT-weETH-26JUN2025@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22215100", + "timestamp": "1744005644" + }, + "market": "0xc104cb7445a6a47FA29a1eeC72354b90B9eAadB2", + "collateral": { + "address": "0xb33808ea0e883138680BA29311a220A7377cdb92", + "symbol": "PT-weETH-26JUN2025", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x1E8cBe3b7d15f7496Fd557cB4924d97C528311fc", + "xt": "0x8bB6a140c7B6e482dDED87A562647dd9cfc22F56", + "gt": "0x23ef45cF5356d91edA61378A23bF88f5535F0fD6" + }, + "config": { + "marketSymbol": "WETH/PT-weETH-26JUN2025@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-market-WETH-weETH@08APR2025.json b/deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-market-WETH-weETH@08APR2025.json new file mode 100644 index 0000000..b47c82a --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-market-WETH-weETH@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22215100", + "timestamp": "1744005644" + }, + "market": "0xA85Bb264896dD2D50f01c2BD307707160C342b10", + "collateral": { + "address": "0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe", + "symbol": "weETH", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xc3270d221e8a86488dFF21d4BE89A42afD076131", + "xt": "0x3c1ffB2954Fd7a594f51201e7A0e27aB7A9E8A87", + "gt": "0x447FAa89d091c67B0D4bC0CD1D5113EB92cfC4Ec" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-market-WETH-wstETH@08APR2025.json b/deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-market-WETH-wstETH@08APR2025.json new file mode 100644 index 0000000..b3556f7 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-market-WETH-wstETH@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22215100", + "timestamp": "1744005644" + }, + "market": "0x12F4f557D8B1C90F4371e6826AC75c7ebE605163", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xc0C53eD8a103BF9eCab7D1d326236bc1d7Bfe830", + "xt": "0xBDC43d2f94B5B54e31412D0aE7bed82DF8B27ba8", + "gt": "0x461168F7ab077020CB3cfc337959a72d0dD9FCd1" + }, + "config": { + "marketSymbol": "WETH/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-vault-TermMax USDC Vault.json b/deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-vault-TermMax USDC Vault.json new file mode 100644 index 0000000..4084050 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-vault-TermMax USDC Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22186270", + "timestamp": "1743657771" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TermMax USDC Vault", + "address": "0x9170A095e7073559ffe1240ccF692Abb94F32a28", + "asset": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "performanceFeeRate": 10000000, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-vault-TermMax WETH Vault.json b/deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-vault-TermMax WETH Vault.json new file mode 100644 index 0000000..7b33cbf --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250408-1400/arb-mainnet-vault-TermMax WETH Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22182632", + "timestamp": "1743613861" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TermMax WETH Vault", + "address": "0xeBF448902145f65b4E1B3C4e3A269444e0213C9e", + "asset": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "performanceFeeRate": 10000000, + "maxCapacity": "500000000000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250408-1400/deploy-market-arb-mainnet-20250408-1400-log.txt b/deployments/arb-mainnet-v1.0.8-20250408-1400/deploy-market-arb-mainnet-20250408-1400-log.txt new file mode 100644 index 0000000..2369b4f --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250408-1400/deploy-market-arb-mainnet-20250408-1400-log.txt @@ -0,0 +1,243 @@ +Running on arb-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: arb-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://arb-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ARBSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xa933ec01396c317772c0830fa6db0eaa420df34f + + ===== Block Info ===== + Block number: 22215100 + Block timestamp: 1744005644 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22215100 + + ===== Market Info - 0 ===== + Market deployed at: 0x12F4f557D8B1C90F4371e6826AC75c7ebE605163 + Market name: WETH/wstETH@30MAY2025 + Market symbol: WETH/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0xc0C53eD8a103BF9eCab7D1d326236bc1d7Bfe830 + XT deployed at: 0xBDC43d2f94B5B54e31412D0aE7bed82DF8B27ba8 + GT deployed at: 0x461168F7ab077020CB3cfc337959a72d0dD9FCd1 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-wstETH@08APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xE905E3d8ABf8426FBC92cF937593d015d3E91452 + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x4d2c344bA129d64FaEf265c46acFf649Ef68370a + XT deployed at: 0x33F1F076C95C9c82f8d375F23055296D0bF50329 + GT deployed at: 0x4232f028ACA0cc0F33F08be7763833988960a30e + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-wstETH@08APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x1fc86F5E314f8926C2a65fA3Fbd5475872F93587 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x6D71683e3671631847B1c1FF98876175585d0232 + XT deployed at: 0x815E7Abf75b20d44E4bac65a8dB78Be52Baaf5AB + GT deployed at: 0x93264Dce6f50699C153aF26781550BF60e6D718F + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WBTC@08APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xA85Bb264896dD2D50f01c2BD307707160C342b10 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0xc3270d221e8a86488dFF21d4BE89A42afD076131 + XT deployed at: 0x3c1ffB2954Fd7a594f51201e7A0e27aB7A9E8A87 + GT deployed at: 0x447FAa89d091c67B0D4bC0CD1D5113EB92cfC4Ec + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-weETH@08APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0xaac38fBAa34C840d272D4a390439d1a52AaFf656 + Market name: USDC/WETH@30MAY2025 + Market symbol: USDC/WETH@30MAY2025 + Collateral (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x08F2FaFFB91AB82b69F89E9A6F71F35BE79858D8 + XT deployed at: 0xC1B4bf59f2Face17E5d367Cb6c84Fe95755D5BCa + GT deployed at: 0xE1aEBa432af030f98aBB8134858C97b96D4da23b + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WETH@08APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x336d1bc868139BE75CbbD6714b6e1ff43DDe9d06 + Market name: USDC/ARB@30MAY2025 + Market symbol: USDC/ARB@30MAY2025 + Collateral (ARB) address: 0x912CE59144191C1204E64559FE8253a0e49E6548 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0xf3dd96209a49583bD831809730146b4e109d3dA7 + XT deployed at: 0x4484d42F46A4485c50894639A9743c8506B7EAA3 + GT deployed at: 0xA9843e77E3585B2D7D9286249E8Ce6f72Db4C5F7 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-ARB@08APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0xc104cb7445a6a47FA29a1eeC72354b90B9eAadB2 + Market name: WETH/PT-weETH-26JUN2025@27JUN2025 + Market symbol: WETH/PT-weETH-26JUN2025@27JUN2025 + Collateral (PT-weETH-26JUN2025) address: 0xb33808ea0e883138680BA29311a220A7377cdb92 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x1E8cBe3b7d15f7496Fd557cB4924d97C528311fc + XT deployed at: 0x8bB6a140c7B6e482dDED87A562647dd9cfc22F56 + GT deployed at: 0x23ef45cF5356d91edA61378A23bF88f5535F0fD6 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-PT-weETH-26JUN2025@08APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 42161 + +Estimated gas price: 0.028040001 gwei + +Estimated total gas used for script: 11099281 + +Estimated amount required: 0.000311223850339281 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x12f4f557d8b1c90f4371e6826ac75c7ebe605163, 0xc0c53ed8a103bf9ecab7d1d326236bc1d7bfe830, 0xbdc43d2f94b5b54e31412d0ae7bed82df8b27ba8, 0x461168f7ab077020cb3cfc337959a72d0dd9fcd1, 0xe905e3d8abf8426fbc92cf937593d015d3e91452, 0x4d2c344ba129d64faef265c46acff649ef68370a, 0x33f1f076c95c9c82f8d375f23055296d0bf50329, 0x4232f028aca0cc0f33f08be7763833988960a30e, 0x1fc86f5e314f8926c2a65fa3fbd5475872f93587, 0x6d71683e3671631847b1c1ff98876175585d0232, 0x815e7abf75b20d44e4bac65a8db78be52baaf5ab, 0x93264dce6f50699c153af26781550bf60e6d718f, 0xa85bb264896dd2d50f01c2bd307707160c342b10, 0xc3270d221e8a86488dff21d4be89a42afd076131, 0x3c1ffb2954fd7a594f51201e7a0e27ab7a9e8a87, 0x447faa89d091c67b0d4bc0cd1d5113eb92cfc4ec, 0xaac38fbaa34c840d272d4a390439d1a52aaff656, 0x08f2faffb91ab82b69f89e9a6f71f35be79858d8, 0xc1b4bf59f2face17e5d367cb6c84fe95755d5bca, 0xe1aeba432af030f98abb8134858c97b96d4da23b, 0x336d1bc868139be75cbbd6714b6e1ff43dde9d06, 0xf3dd96209a49583bd831809730146b4e109d3da7, 0x4484d42f46a4485c50894639a9743c8506b7eaa3, 0xa9843e77e3585b2d7d9286249e8ce6f72db4c5f7, 0xc104cb7445a6a47fa29a1eec72354b90b9eaadb2, 0x1e8cbe3b7d15f7496fd557cb4924d97c528311fc, 0x8bb6a140c7b6e482dded87a562647dd9cfc22f56, 0x23ef45cf5356d91eda61378a23bf88f5535f0fd6]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/42161/run-latest.json + +[SUCCESS] market deployment to arb-mainnet completed successfully! diff --git a/deployments/arb-mainnet-v1.0.8-20250408-2000/accept-oracles-20250403-log.txt b/deployments/arb-mainnet-v1.0.8-20250408-2000/accept-oracles-20250403-log.txt new file mode 100644 index 0000000..2a93d96 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250408-2000/accept-oracles-20250403-log.txt @@ -0,0 +1,107 @@ +Running on arb-mainnet... +=== Configuration === +Operation: Script Execution +Network: arb-mainnet +Script: AcceptOracles.s.sol +Path: script/AcceptOracles.s.sol +RPC URL: http*****://arb-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Disabled +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xa669e7A0d4b3e4Fa48af2dE86BD4CD7126Be4e13 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting script execution... +Executing: forge script script/AcceptOracles.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow +No files changed, compilation skipped +Script ran successfully. + +== Logs == + === Checking Pending Oracles === + Oracle Aggregator Address: 0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa + Network: arb-mainnet + Current Block Timestamp: 1743663209 + + Accepted oracle for token: + Token Symbol: WETH + Token Address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: wstETH + Token Address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: USDC + Token Address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: WBTC + Token Address: 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: weETH + Token Address: 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: ARB + Token Address: 0x912CE59144191C1204E64559FE8253a0e49E6548 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: PT-weETH-26JUN2025 + Token Address: 0xb33808ea0e883138680BA29311a220A7377cdb92 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Heartbeat: 86400 + -------------------------------- + + === Oracle Acceptance Summary === + Total tokens checked: 7 + Oracles accepted: 7 + Oracles not ready: 0 + +## Setting up 1 EVM. + +========================== + +Chain 42161 + +Estimated gas price: 0.020000001 gwei + +Estimated total gas used for script: 914354 + +Estimated amount required: 0.000018287080914354 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/AcceptOracles.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/AcceptOracles.s.sol/42161/run-latest.json + +[SUCCESS] Script AcceptOracles executed successfully on arb-mainnet (Broadcast mode)! diff --git a/deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-access-manager.json b/deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-access-manager.json new file mode 100644 index 0000000..f75a2f5 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743606817", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182046", + "timestamp": "1743606817" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-core.json b/deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-core.json new file mode 100644 index 0000000..435d898 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743608156", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182159", + "timestamp": "1743608156" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x14920Eb11b71873d01c93B589b40585dacfCA096", + "vaultFactory": "0x929CBcb8150aD59DB63c92A7dAEc07b30d38bA79", + "oracleAggregator": "0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa", + "router": "0x7fa333b184868d88aC78a82eC06d5e87d4B0322E", + "swapAdapter": { + "uniswapV3Adapter": "0x609F20ee24E10010A62970E1dAb7E2b84eD74CAb", + "odosV2Adapter": "0x7de4efa140E52B7207FA689D41AfEE461B83E748", + "pendleSwapV3Adapter": "0xb0eCCbaD4b4cc190261c29C6E8d85bcF04284a8b", + "ERC4626VaultAdapter": "0xa50929A67daF9Ff3567e2Bb3411204A134f72546" + }, + "marketViewer": "0x276C0E52508d94ff2D4106b1559c8c4Bc3a75dec" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-market-USDC-ARB@08APR2025.json b/deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-market-USDC-ARB@08APR2025.json new file mode 100644 index 0000000..7ec48f6 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-market-USDC-ARB@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22215143", + "timestamp": "1744006181" + }, + "market": "0x63428d655660316bbcA6d1CdD76aCfdd43CEFfc1", + "collateral": { + "address": "0x912CE59144191C1204E64559FE8253a0e49E6548", + "symbol": "ARB", + "priceFeed": "0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xe495c826827dF55F8A025e733A8f3Ab6D328E604", + "xt": "0x90873FB4F076f9deC65F6085205BC3AE3ba636a2", + "gt": "0x92be40fFb75cFc4AD386b81a0083641c712d7eF4" + }, + "config": { + "marketSymbol": "USDC/ARB@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-market-USDC-WBTC@08APR2025.json b/deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-market-USDC-WBTC@08APR2025.json new file mode 100644 index 0000000..df85039 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-market-USDC-WBTC@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22215143", + "timestamp": "1744006181" + }, + "market": "0xa42fd9df391a1eEaFf562cb1663ac40a60dd082D", + "collateral": { + "address": "0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f", + "symbol": "WBTC", + "priceFeed": "0xd0C7101eACbB49F3deCcCc166d238410D6D46d57", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xb3264555D6Abe7B79Dfb6c0Aa21b255c18CfDf22", + "xt": "0x261b6ED8bea34af26a5BacfA85FBff72CE6f7b7B", + "gt": "0xb0303Fe50e57ED5F8ee09D1101f1c31C09734994" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-market-USDC-WETH@08APR2025.json b/deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-market-USDC-WETH@08APR2025.json new file mode 100644 index 0000000..b84e0c6 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-market-USDC-WETH@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22215143", + "timestamp": "1744006181" + }, + "market": "0xfddAC22E6891A3baD6ACB3E62A2245FFac5BaE5a", + "collateral": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x4cFA2bd435bD0F0385AeA22dd649699922490629", + "xt": "0x91E820479F5d08318F116044d95E1C78E4Fa3AD3", + "gt": "0xc4f218332598D83Dcc00876677409aD853389bD8" + }, + "config": { + "marketSymbol": "USDC/WETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-market-USDC-wstETH@08APR2025.json b/deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-market-USDC-wstETH@08APR2025.json new file mode 100644 index 0000000..f54a1ad --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-market-USDC-wstETH@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22215143", + "timestamp": "1744006181" + }, + "market": "0xd60C6FbAED1bfFA8F0592B7c8ad45089C04df8c2", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x0CA3fc2e728b03fcDd1072bF586B229A02f797e1", + "xt": "0x2F07e5B8105c6186E9c7Ac589d24b33EDd7c2099", + "gt": "0x32476D620D080088708ed99BEBEe651F7102a73c" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@08APR2025.json b/deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@08APR2025.json new file mode 100644 index 0000000..8c2bfba --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22215143", + "timestamp": "1744006181" + }, + "market": "0x5CB98009a854ba0c6B4B3a41f891b4a725760699", + "collateral": { + "address": "0xb33808ea0e883138680BA29311a220A7377cdb92", + "symbol": "PT-weETH-26JUN2025", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x043fEF2732473cB672FB850C8b48E4F5D9Ac903A", + "xt": "0x44c49c109bCd38D19f8Ee83ACE66F873a5D29941", + "gt": "0x2BC2ee958dD293BBE727163cE88760c2B8D1cE4B" + }, + "config": { + "marketSymbol": "WETH/PT-weETH-26JUN2025@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-market-WETH-weETH@08APR2025.json b/deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-market-WETH-weETH@08APR2025.json new file mode 100644 index 0000000..6f7df19 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-market-WETH-weETH@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22215143", + "timestamp": "1744006181" + }, + "market": "0x1903C34bB9B761716cbB7E39529c60e27b3a3FD3", + "collateral": { + "address": "0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe", + "symbol": "weETH", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x97Ff4413a3311eC3FD68f6c612E5AAE2e856E558", + "xt": "0x547B9897A952E82DDc4dA6c78aBcC6706d3C9Ab9", + "gt": "0x6d8463f5BAD86170390aa046A9Fe0Fdb908bA2b8" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-market-WETH-wstETH@08APR2025.json b/deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-market-WETH-wstETH@08APR2025.json new file mode 100644 index 0000000..740e1fe --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-market-WETH-wstETH@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22215143", + "timestamp": "1744006181" + }, + "market": "0x935205D7ee76e0416f1f131Bc52083Fa2Eb54Bd6", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x07c6D7C2c4eaD1d9Fb5261025971b933bE07Dd8C", + "xt": "0x4cb7Bac7D97591511F0bdf8402BDd24cCEcDCF4E", + "gt": "0x49A975A24Ee227835876164dfaf55061F9F67997" + }, + "config": { + "marketSymbol": "WETH/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-vault-TermMax USDC Vault.json b/deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-vault-TermMax USDC Vault.json new file mode 100644 index 0000000..4084050 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-vault-TermMax USDC Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22186270", + "timestamp": "1743657771" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TermMax USDC Vault", + "address": "0x9170A095e7073559ffe1240ccF692Abb94F32a28", + "asset": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "performanceFeeRate": 10000000, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-vault-TermMax WETH Vault.json b/deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-vault-TermMax WETH Vault.json new file mode 100644 index 0000000..7b33cbf --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250408-2000/arb-mainnet-vault-TermMax WETH Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22182632", + "timestamp": "1743613861" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TermMax WETH Vault", + "address": "0xeBF448902145f65b4E1B3C4e3A269444e0213C9e", + "asset": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "performanceFeeRate": 10000000, + "maxCapacity": "500000000000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250408-2000/deploy-market-arb-mainnet-20250408-2000-log.txt b/deployments/arb-mainnet-v1.0.8-20250408-2000/deploy-market-arb-mainnet-20250408-2000-log.txt new file mode 100644 index 0000000..aadc609 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250408-2000/deploy-market-arb-mainnet-20250408-2000-log.txt @@ -0,0 +1,243 @@ +Running on arb-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: arb-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://arb-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ARBSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xa933ec01396c317772c0830fa6db0eaa420df34f + + ===== Block Info ===== + Block number: 22215143 + Block timestamp: 1744006181 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22215143 + + ===== Market Info - 0 ===== + Market deployed at: 0x935205D7ee76e0416f1f131Bc52083Fa2Eb54Bd6 + Market name: WETH/wstETH@30MAY2025 + Market symbol: WETH/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x07c6D7C2c4eaD1d9Fb5261025971b933bE07Dd8C + XT deployed at: 0x4cb7Bac7D97591511F0bdf8402BDd24cCEcDCF4E + GT deployed at: 0x49A975A24Ee227835876164dfaf55061F9F67997 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-wstETH@08APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xd60C6FbAED1bfFA8F0592B7c8ad45089C04df8c2 + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x0CA3fc2e728b03fcDd1072bF586B229A02f797e1 + XT deployed at: 0x2F07e5B8105c6186E9c7Ac589d24b33EDd7c2099 + GT deployed at: 0x32476D620D080088708ed99BEBEe651F7102a73c + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-wstETH@08APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0xa42fd9df391a1eEaFf562cb1663ac40a60dd082D + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0xb3264555D6Abe7B79Dfb6c0Aa21b255c18CfDf22 + XT deployed at: 0x261b6ED8bea34af26a5BacfA85FBff72CE6f7b7B + GT deployed at: 0xb0303Fe50e57ED5F8ee09D1101f1c31C09734994 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WBTC@08APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0x1903C34bB9B761716cbB7E39529c60e27b3a3FD3 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x97Ff4413a3311eC3FD68f6c612E5AAE2e856E558 + XT deployed at: 0x547B9897A952E82DDc4dA6c78aBcC6706d3C9Ab9 + GT deployed at: 0x6d8463f5BAD86170390aa046A9Fe0Fdb908bA2b8 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-weETH@08APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0xfddAC22E6891A3baD6ACB3E62A2245FFac5BaE5a + Market name: USDC/WETH@30MAY2025 + Market symbol: USDC/WETH@30MAY2025 + Collateral (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x4cFA2bd435bD0F0385AeA22dd649699922490629 + XT deployed at: 0x91E820479F5d08318F116044d95E1C78E4Fa3AD3 + GT deployed at: 0xc4f218332598D83Dcc00876677409aD853389bD8 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WETH@08APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x63428d655660316bbcA6d1CdD76aCfdd43CEFfc1 + Market name: USDC/ARB@30MAY2025 + Market symbol: USDC/ARB@30MAY2025 + Collateral (ARB) address: 0x912CE59144191C1204E64559FE8253a0e49E6548 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0xe495c826827dF55F8A025e733A8f3Ab6D328E604 + XT deployed at: 0x90873FB4F076f9deC65F6085205BC3AE3ba636a2 + GT deployed at: 0x92be40fFb75cFc4AD386b81a0083641c712d7eF4 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-ARB@08APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x5CB98009a854ba0c6B4B3a41f891b4a725760699 + Market name: WETH/PT-weETH-26JUN2025@27JUN2025 + Market symbol: WETH/PT-weETH-26JUN2025@27JUN2025 + Collateral (PT-weETH-26JUN2025) address: 0xb33808ea0e883138680BA29311a220A7377cdb92 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x043fEF2732473cB672FB850C8b48E4F5D9Ac903A + XT deployed at: 0x44c49c109bCd38D19f8Ee83ACE66F873a5D29941 + GT deployed at: 0x2BC2ee958dD293BBE727163cE88760c2B8D1cE4B + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-PT-weETH-26JUN2025@08APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 42161 + +Estimated gas price: 0.041546001 gwei + +Estimated total gas used for script: 10222369 + +Estimated amount required: 0.000424698552696369 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x935205d7ee76e0416f1f131bc52083fa2eb54bd6, 0x07c6d7c2c4ead1d9fb5261025971b933be07dd8c, 0x4cb7bac7d97591511f0bdf8402bdd24ccecdcf4e, 0x49a975a24ee227835876164dfaf55061f9f67997, 0xd60c6fbaed1bffa8f0592b7c8ad45089c04df8c2, 0x0ca3fc2e728b03fcdd1072bf586b229a02f797e1, 0x2f07e5b8105c6186e9c7ac589d24b33edd7c2099, 0x32476d620d080088708ed99bebee651f7102a73c, 0xa42fd9df391a1eeaff562cb1663ac40a60dd082d, 0xb3264555d6abe7b79dfb6c0aa21b255c18cfdf22, 0x261b6ed8bea34af26a5bacfa85fbff72ce6f7b7b, 0xb0303fe50e57ed5f8ee09d1101f1c31c09734994, 0x1903c34bb9b761716cbb7e39529c60e27b3a3fd3, 0x97ff4413a3311ec3fd68f6c612e5aae2e856e558, 0x547b9897a952e82ddc4da6c78abcc6706d3c9ab9, 0x6d8463f5bad86170390aa046a9fe0fdb908ba2b8, 0xfddac22e6891a3bad6acb3e62a2245ffac5bae5a, 0x4cfa2bd435bd0f0385aea22dd649699922490629, 0x91e820479f5d08318f116044d95e1c78e4fa3ad3, 0xc4f218332598d83dcc00876677409ad853389bd8, 0x63428d655660316bbca6d1cdd76acfdd43ceffc1, 0xe495c826827df55f8a025e733a8f3ab6d328e604, 0x90873fb4f076f9dec65f6085205bc3ae3ba636a2, 0x92be40ffb75cfc4ad386b81a0083641c712d7ef4, 0x5cb98009a854ba0c6b4b3a41f891b4a725760699, 0x043fef2732473cb672fb850c8b48e4f5d9ac903a, 0x44c49c109bcd38d19f8ee83ace66f873a5d29941, 0x2bc2ee958dd293bbe727163ce88760c2b8d1ce4b]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/42161/run-latest.json + +[SUCCESS] market deployment to arb-mainnet completed successfully! diff --git a/deployments/arb-mainnet-v1.0.8-20250409-1400/accept-oracles-20250403-log.txt b/deployments/arb-mainnet-v1.0.8-20250409-1400/accept-oracles-20250403-log.txt new file mode 100644 index 0000000..2a93d96 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250409-1400/accept-oracles-20250403-log.txt @@ -0,0 +1,107 @@ +Running on arb-mainnet... +=== Configuration === +Operation: Script Execution +Network: arb-mainnet +Script: AcceptOracles.s.sol +Path: script/AcceptOracles.s.sol +RPC URL: http*****://arb-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Disabled +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xa669e7A0d4b3e4Fa48af2dE86BD4CD7126Be4e13 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting script execution... +Executing: forge script script/AcceptOracles.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow +No files changed, compilation skipped +Script ran successfully. + +== Logs == + === Checking Pending Oracles === + Oracle Aggregator Address: 0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa + Network: arb-mainnet + Current Block Timestamp: 1743663209 + + Accepted oracle for token: + Token Symbol: WETH + Token Address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: wstETH + Token Address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: USDC + Token Address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: WBTC + Token Address: 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: weETH + Token Address: 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: ARB + Token Address: 0x912CE59144191C1204E64559FE8253a0e49E6548 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: PT-weETH-26JUN2025 + Token Address: 0xb33808ea0e883138680BA29311a220A7377cdb92 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Heartbeat: 86400 + -------------------------------- + + === Oracle Acceptance Summary === + Total tokens checked: 7 + Oracles accepted: 7 + Oracles not ready: 0 + +## Setting up 1 EVM. + +========================== + +Chain 42161 + +Estimated gas price: 0.020000001 gwei + +Estimated total gas used for script: 914354 + +Estimated amount required: 0.000018287080914354 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/AcceptOracles.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/AcceptOracles.s.sol/42161/run-latest.json + +[SUCCESS] Script AcceptOracles executed successfully on arb-mainnet (Broadcast mode)! diff --git a/deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-access-manager.json b/deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-access-manager.json new file mode 100644 index 0000000..f75a2f5 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743606817", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182046", + "timestamp": "1743606817" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-core.json b/deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-core.json new file mode 100644 index 0000000..435d898 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743608156", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182159", + "timestamp": "1743608156" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x14920Eb11b71873d01c93B589b40585dacfCA096", + "vaultFactory": "0x929CBcb8150aD59DB63c92A7dAEc07b30d38bA79", + "oracleAggregator": "0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa", + "router": "0x7fa333b184868d88aC78a82eC06d5e87d4B0322E", + "swapAdapter": { + "uniswapV3Adapter": "0x609F20ee24E10010A62970E1dAb7E2b84eD74CAb", + "odosV2Adapter": "0x7de4efa140E52B7207FA689D41AfEE461B83E748", + "pendleSwapV3Adapter": "0xb0eCCbaD4b4cc190261c29C6E8d85bcF04284a8b", + "ERC4626VaultAdapter": "0xa50929A67daF9Ff3567e2Bb3411204A134f72546" + }, + "marketViewer": "0x276C0E52508d94ff2D4106b1559c8c4Bc3a75dec" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-market-USDC-ARB@09APR2025.json b/deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-market-USDC-ARB@09APR2025.json new file mode 100644 index 0000000..46531df --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-market-USDC-ARB@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22215249", + "timestamp": "1744007446" + }, + "market": "0x5578C516E134b1B60412Df0f7951C8B3eA3348eA", + "collateral": { + "address": "0x912CE59144191C1204E64559FE8253a0e49E6548", + "symbol": "ARB", + "priceFeed": "0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x850Ea7CdFb3477437e32De1f3e9a5586f5cD22cE", + "xt": "0x8489eec54c597DEcEa3eaFAb03c3B4eA9aaeB524", + "gt": "0xb4a086CD14FD5414B34CE058126CCA7985B5F312" + }, + "config": { + "marketSymbol": "USDC/ARB@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-market-USDC-WBTC@09APR2025.json b/deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-market-USDC-WBTC@09APR2025.json new file mode 100644 index 0000000..4af7129 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-market-USDC-WBTC@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22215249", + "timestamp": "1744007446" + }, + "market": "0x751693F66787D95dB97Fb3E8140704beC7ACd88E", + "collateral": { + "address": "0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f", + "symbol": "WBTC", + "priceFeed": "0xd0C7101eACbB49F3deCcCc166d238410D6D46d57", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x66BAD5FAd11095e4eaBdf3FEe54eeDa5F43191A1", + "xt": "0xFD19f1EDeCE0599A27a4a77Be5C39931fE6e6487", + "gt": "0x7F28967A495C9b3D5816d70a41fDeFEbcF260F77" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-market-USDC-WETH@09APR2025.json b/deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-market-USDC-WETH@09APR2025.json new file mode 100644 index 0000000..451c792 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-market-USDC-WETH@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22215249", + "timestamp": "1744007446" + }, + "market": "0x96cA7692f88220C51735BDe99A80f9EAF5A21c10", + "collateral": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xB937177C11F4d2BbB063998Deb622Cd55A182E7A", + "xt": "0x9BAB3048aCE2Eb2CE6269040513A2bF1D68924af", + "gt": "0x567E64baEE90B346A104DDFeb75ceC3aaE5A3EDf" + }, + "config": { + "marketSymbol": "USDC/WETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-market-USDC-wstETH@09APR2025.json b/deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-market-USDC-wstETH@09APR2025.json new file mode 100644 index 0000000..974dd74 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-market-USDC-wstETH@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22215249", + "timestamp": "1744007446" + }, + "market": "0x87D1f1a063F0CFACD596c464404De58FfD6BB5c8", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xAb2041a4fC56b044c2A505ddb645776D3e42d4fC", + "xt": "0x6c93b9cAdB8575B7adff2c7C1f9666f42Aa82aA7", + "gt": "0xF2B221266340fd5bE276bAD0343eDd4043643B4b" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-market-WETH-PT-weETH-26JUN2025@09APR2025.json b/deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-market-WETH-PT-weETH-26JUN2025@09APR2025.json new file mode 100644 index 0000000..12d5dcc --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-market-WETH-PT-weETH-26JUN2025@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22215249", + "timestamp": "1744007446" + }, + "market": "0xfEdfD999eEd941FE1E28411D70F6638F531D2d70", + "collateral": { + "address": "0xb33808ea0e883138680BA29311a220A7377cdb92", + "symbol": "PT-weETH-26JUN2025", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x713f2e816Acec4A58Ddd85BdeE33Aa9a272790C1", + "xt": "0xEDE6da97351a970817e3633670B364a742159eD7", + "gt": "0xe62fd9c9Ff7662c10fF8131A4855B4B54eCdD09A" + }, + "config": { + "marketSymbol": "WETH/PT-weETH-26JUN2025@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-market-WETH-weETH@09APR2025.json b/deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-market-WETH-weETH@09APR2025.json new file mode 100644 index 0000000..a841e4f --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-market-WETH-weETH@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22215249", + "timestamp": "1744007446" + }, + "market": "0x7884d18d13AC1e2A0fFBa1D05309196076d448F7", + "collateral": { + "address": "0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe", + "symbol": "weETH", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x0834a67Ada892Ad2e570aF5A6770f947e1B93094", + "xt": "0x826634f8F0Cd43222c44081A5159F0ecB5B503db", + "gt": "0x9749ced7c129950a55E87cB963A63E06bb05766e" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-market-WETH-wstETH@09APR2025.json b/deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-market-WETH-wstETH@09APR2025.json new file mode 100644 index 0000000..d744809 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-market-WETH-wstETH@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22215249", + "timestamp": "1744007446" + }, + "market": "0x510F69C9bA80bc602ccbD74e7a41431fe7255676", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x13c5ffc2b9cC9D39901ba7f953823C5Ee9414197", + "xt": "0xD9f0997d8d044Cd2d71e55cb0C66d28A1056238B", + "gt": "0x81c17328BE460cd150461B1eB28299BBee4473b6" + }, + "config": { + "marketSymbol": "WETH/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-vault-TermMax USDC Vault.json b/deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-vault-TermMax USDC Vault.json new file mode 100644 index 0000000..4084050 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-vault-TermMax USDC Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22186270", + "timestamp": "1743657771" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TermMax USDC Vault", + "address": "0x9170A095e7073559ffe1240ccF692Abb94F32a28", + "asset": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "performanceFeeRate": 10000000, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-vault-TermMax WETH Vault.json b/deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-vault-TermMax WETH Vault.json new file mode 100644 index 0000000..7b33cbf --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250409-1400/arb-mainnet-vault-TermMax WETH Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22182632", + "timestamp": "1743613861" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TermMax WETH Vault", + "address": "0xeBF448902145f65b4E1B3C4e3A269444e0213C9e", + "asset": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "performanceFeeRate": 10000000, + "maxCapacity": "500000000000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250409-1400/deploy-market-arb-mainnet-20250409-1400-log.txt b/deployments/arb-mainnet-v1.0.8-20250409-1400/deploy-market-arb-mainnet-20250409-1400-log.txt new file mode 100644 index 0000000..1c56e4f --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250409-1400/deploy-market-arb-mainnet-20250409-1400-log.txt @@ -0,0 +1,271 @@ +Running on arb-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: arb-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://arb-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ARBSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xa933ec01396c317772c0830fa6db0eaa420df34f + + ===== Block Info ===== + Block number: 22215249 + Block timestamp: 1744007446 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22215249 + + ===== Market Info - 0 ===== + Market deployed at: 0x510F69C9bA80bc602ccbD74e7a41431fe7255676 + Market name: WETH/wstETH@30MAY2025 + Market symbol: WETH/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x13c5ffc2b9cC9D39901ba7f953823C5Ee9414197 + XT deployed at: 0xD9f0997d8d044Cd2d71e55cb0C66d28A1056238B + GT deployed at: 0x81c17328BE460cd150461B1eB28299BBee4473b6 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-wstETH@09APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0x87D1f1a063F0CFACD596c464404De58FfD6BB5c8 + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0xAb2041a4fC56b044c2A505ddb645776D3e42d4fC + XT deployed at: 0x6c93b9cAdB8575B7adff2c7C1f9666f42Aa82aA7 + GT deployed at: 0xF2B221266340fd5bE276bAD0343eDd4043643B4b + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-wstETH@09APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x751693F66787D95dB97Fb3E8140704beC7ACd88E + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x66BAD5FAd11095e4eaBdf3FEe54eeDa5F43191A1 + XT deployed at: 0xFD19f1EDeCE0599A27a4a77Be5C39931fE6e6487 + GT deployed at: 0x7F28967A495C9b3D5816d70a41fDeFEbcF260F77 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WBTC@09APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0x7884d18d13AC1e2A0fFBa1D05309196076d448F7 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x0834a67Ada892Ad2e570aF5A6770f947e1B93094 + XT deployed at: 0x826634f8F0Cd43222c44081A5159F0ecB5B503db + GT deployed at: 0x9749ced7c129950a55E87cB963A63E06bb05766e + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-weETH@09APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x96cA7692f88220C51735BDe99A80f9EAF5A21c10 + Market name: USDC/WETH@30MAY2025 + Market symbol: USDC/WETH@30MAY2025 + Collateral (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0xB937177C11F4d2BbB063998Deb622Cd55A182E7A + XT deployed at: 0x9BAB3048aCE2Eb2CE6269040513A2bF1D68924af + GT deployed at: 0x567E64baEE90B346A104DDFeb75ceC3aaE5A3EDf + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WETH@09APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x5578C516E134b1B60412Df0f7951C8B3eA3348eA + Market name: USDC/ARB@30MAY2025 + Market symbol: USDC/ARB@30MAY2025 + Collateral (ARB) address: 0x912CE59144191C1204E64559FE8253a0e49E6548 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x850Ea7CdFb3477437e32De1f3e9a5586f5cD22cE + XT deployed at: 0x8489eec54c597DEcEa3eaFAb03c3B4eA9aaeB524 + GT deployed at: 0xb4a086CD14FD5414B34CE058126CCA7985B5F312 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-ARB@09APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0xfEdfD999eEd941FE1E28411D70F6638F531D2d70 + Market name: WETH/PT-weETH-26JUN2025@27JUN2025 + Market symbol: WETH/PT-weETH-26JUN2025@27JUN2025 + Collateral (PT-weETH-26JUN2025) address: 0xb33808ea0e883138680BA29311a220A7377cdb92 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x713f2e816Acec4A58Ddd85BdeE33Aa9a272790C1 + XT deployed at: 0xEDE6da97351a970817e3633670B364a742159eD7 + GT deployed at: 0xe62fd9c9Ff7662c10fF8131A4855B4B54eCdD09A + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-PT-weETH-26JUN2025@09APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 42161 + +Estimated gas price: 9.072340001 gwei + +Estimated total gas used for script: 10056788 + +Estimated amount required: 0.091238600053976788 ETH + +========================== + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/42161/run-latest.json + +[ERROR] market deployment to arb-mainnet failed! +You can resume the failed deployment by running the same command with the --resume option: +./script.sh arb-mainnet deploy:market --broadcast --resume --verify +Running on arb-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: arb-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://arb-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Enabled (will resume from last broadcasted transaction) +Verification: Enabled--verify +Using API Key: ARBSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --resume --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x510f69c9ba80bc602ccbd74e7a41431fe7255676, 0x13c5ffc2b9cc9d39901ba7f953823c5ee9414197, 0xd9f0997d8d044cd2d71e55cb0c66d28a1056238b, 0x81c17328be460cd150461b1eb28299bbee4473b6, 0x87d1f1a063f0cfacd596c464404de58ffd6bb5c8, 0xab2041a4fc56b044c2a505ddb645776d3e42d4fc, 0x6c93b9cadb8575b7adff2c7c1f9666f42aa82aa7, 0xf2b221266340fd5be276bad0343edd4043643b4b, 0x751693f66787d95db97fb3e8140704bec7acd88e, 0x66bad5fad11095e4eabdf3fee54eeda5f43191a1, 0xfd19f1edece0599a27a4a77be5c39931fe6e6487, 0x7f28967a495c9b3d5816d70a41fdefebcf260f77, 0x7884d18d13ac1e2a0ffba1d05309196076d448f7, 0x0834a67ada892ad2e570af5a6770f947e1b93094, 0x826634f8f0cd43222c44081a5159f0ecb5b503db, 0x9749ced7c129950a55e87cb963a63e06bb05766e, 0x96ca7692f88220c51735bde99a80f9eaf5a21c10, 0xb937177c11f4d2bbb063998deb622cd55a182e7a, 0x9bab3048ace2eb2ce6269040513a2bf1d68924af, 0x567e64baee90b346a104ddfeb75cec3aae5a3edf, 0x5578c516e134b1b60412df0f7951c8b3ea3348ea, 0x850ea7cdfb3477437e32de1f3e9a5586f5cd22ce, 0x8489eec54c597decea3eafab03c3b4ea9aaeb524, 0xb4a086cd14fd5414b34ce058126cca7985b5f312, 0xfedfd999eed941fe1e28411d70f6638f531d2d70, 0x713f2e816acec4a58ddd85bdee33aa9a272790c1, 0xede6da97351a970817e3633670b364a742159ed7, 0xe62fd9c9ff7662c10ff8131a4855b4b54ecdd09a]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/42161/run-latest.json + +[SUCCESS] market deployment to arb-mainnet completed successfully! diff --git a/deployments/arb-mainnet-v1.0.8-20250409-2000/accept-oracles-20250403-log.txt b/deployments/arb-mainnet-v1.0.8-20250409-2000/accept-oracles-20250403-log.txt new file mode 100644 index 0000000..2a93d96 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250409-2000/accept-oracles-20250403-log.txt @@ -0,0 +1,107 @@ +Running on arb-mainnet... +=== Configuration === +Operation: Script Execution +Network: arb-mainnet +Script: AcceptOracles.s.sol +Path: script/AcceptOracles.s.sol +RPC URL: http*****://arb-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Disabled +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xa669e7A0d4b3e4Fa48af2dE86BD4CD7126Be4e13 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting script execution... +Executing: forge script script/AcceptOracles.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow +No files changed, compilation skipped +Script ran successfully. + +== Logs == + === Checking Pending Oracles === + Oracle Aggregator Address: 0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa + Network: arb-mainnet + Current Block Timestamp: 1743663209 + + Accepted oracle for token: + Token Symbol: WETH + Token Address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: wstETH + Token Address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: USDC + Token Address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: WBTC + Token Address: 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: weETH + Token Address: 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: ARB + Token Address: 0x912CE59144191C1204E64559FE8253a0e49E6548 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: PT-weETH-26JUN2025 + Token Address: 0xb33808ea0e883138680BA29311a220A7377cdb92 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Heartbeat: 86400 + -------------------------------- + + === Oracle Acceptance Summary === + Total tokens checked: 7 + Oracles accepted: 7 + Oracles not ready: 0 + +## Setting up 1 EVM. + +========================== + +Chain 42161 + +Estimated gas price: 0.020000001 gwei + +Estimated total gas used for script: 914354 + +Estimated amount required: 0.000018287080914354 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/AcceptOracles.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/AcceptOracles.s.sol/42161/run-latest.json + +[SUCCESS] Script AcceptOracles executed successfully on arb-mainnet (Broadcast mode)! diff --git a/deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-access-manager.json b/deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-access-manager.json new file mode 100644 index 0000000..f75a2f5 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743606817", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182046", + "timestamp": "1743606817" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-core.json b/deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-core.json new file mode 100644 index 0000000..435d898 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743608156", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182159", + "timestamp": "1743608156" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x14920Eb11b71873d01c93B589b40585dacfCA096", + "vaultFactory": "0x929CBcb8150aD59DB63c92A7dAEc07b30d38bA79", + "oracleAggregator": "0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa", + "router": "0x7fa333b184868d88aC78a82eC06d5e87d4B0322E", + "swapAdapter": { + "uniswapV3Adapter": "0x609F20ee24E10010A62970E1dAb7E2b84eD74CAb", + "odosV2Adapter": "0x7de4efa140E52B7207FA689D41AfEE461B83E748", + "pendleSwapV3Adapter": "0xb0eCCbaD4b4cc190261c29C6E8d85bcF04284a8b", + "ERC4626VaultAdapter": "0xa50929A67daF9Ff3567e2Bb3411204A134f72546" + }, + "marketViewer": "0x276C0E52508d94ff2D4106b1559c8c4Bc3a75dec" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-market-USDC-ARB@09APR2025.json b/deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-market-USDC-ARB@09APR2025.json new file mode 100644 index 0000000..ea5324c --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-market-USDC-ARB@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22215388", + "timestamp": "1744009113" + }, + "market": "0x0b4084ACEd7c8dFe84f1b084F50E12B9CE35a1b4", + "collateral": { + "address": "0x912CE59144191C1204E64559FE8253a0e49E6548", + "symbol": "ARB", + "priceFeed": "0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x38A3D4197b7cD90Fe31fe2BB59763aF4627E2714", + "xt": "0x46c57404f90866b2b26a6EF5c3735fA73F306Ee8", + "gt": "0x172f496b78dc962f1aa4B2CD92c9C21093081331" + }, + "config": { + "marketSymbol": "USDC/ARB@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-market-USDC-WBTC@09APR2025.json b/deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-market-USDC-WBTC@09APR2025.json new file mode 100644 index 0000000..3ef39e1 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-market-USDC-WBTC@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22215388", + "timestamp": "1744009113" + }, + "market": "0x9bf834de7B951c7a0119eC3c0438B0d1e83D6BDF", + "collateral": { + "address": "0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f", + "symbol": "WBTC", + "priceFeed": "0xd0C7101eACbB49F3deCcCc166d238410D6D46d57", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x1cB872765b6d5AaC6B951a70E1002C470c8f0554", + "xt": "0x4D86E7d921C56D06a5b0f7fbdB80d7DFd8532a24", + "gt": "0x20F2A47f4297e9aE929002213Fbe7a168034b5Aa" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-market-USDC-WETH@09APR2025.json b/deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-market-USDC-WETH@09APR2025.json new file mode 100644 index 0000000..7c41c9b --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-market-USDC-WETH@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22215388", + "timestamp": "1744009113" + }, + "market": "0xEF77c361d50B1A9976ba702feCA233b734639Fda", + "collateral": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x51dE84c1dfc24b1EDD023972FFd48903B1FA66c3", + "xt": "0x95F4652078F45548AD749E6EC076B703495413B7", + "gt": "0x3B6476155f9A2E7e7648fA27d3648e0F4302059A" + }, + "config": { + "marketSymbol": "USDC/WETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-market-USDC-wstETH@09APR2025.json b/deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-market-USDC-wstETH@09APR2025.json new file mode 100644 index 0000000..d49b3e7 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-market-USDC-wstETH@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22215388", + "timestamp": "1744009113" + }, + "market": "0xb4B207969EbAcF10c1bd192f93e5B3217590C029", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x9784AAe160d71EDf37B8a421E5FfA42AE9AA4ac9", + "xt": "0x312fce698b5ABf0B15cF894a89EaE67dAF97A03e", + "gt": "0xb71e701de5F9AeA020799049154830e902BdacBe" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@09APR2025.json b/deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@09APR2025.json new file mode 100644 index 0000000..eb3f263 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22215388", + "timestamp": "1744009113" + }, + "market": "0x151F42b840DD287d108Bb624fD1438D823209F41", + "collateral": { + "address": "0xb33808ea0e883138680BA29311a220A7377cdb92", + "symbol": "PT-weETH-26JUN2025", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xB346b2c6F8774423F92850186a2a8E9E957CB9fE", + "xt": "0x9F765ABd43859EA5FaBE04A3067f1076136BD7C8", + "gt": "0x7c92b79eD6bA4E84E914887D5Bf50aAC625129E6" + }, + "config": { + "marketSymbol": "WETH/PT-weETH-26JUN2025@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-market-WETH-weETH@09APR2025.json b/deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-market-WETH-weETH@09APR2025.json new file mode 100644 index 0000000..1a3282d --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-market-WETH-weETH@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22215388", + "timestamp": "1744009113" + }, + "market": "0xe6C399f22d5D721058324A59E3cC772D13e1E274", + "collateral": { + "address": "0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe", + "symbol": "weETH", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x9A888F4feeF89D0E70bf97d93fe60e4F0B091e21", + "xt": "0x08359897bcDF58aaa73492776C6eeedb2C9dBf39", + "gt": "0xb3C0bfE13474c4CdD1409Ba6B6B4FcFdFb95827A" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-market-WETH-wstETH@09APR2025.json b/deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-market-WETH-wstETH@09APR2025.json new file mode 100644 index 0000000..4a2498e --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-market-WETH-wstETH@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22215388", + "timestamp": "1744009113" + }, + "market": "0x6D5dcE785FDA044dE81AaA0abaB881BA4bbC59B7", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xbE26080CE287A2Bb346baB44F7550DE18DBDB107", + "xt": "0xa628a5948B6613845F5A8f46ec53D817A216C745", + "gt": "0x706FD4696B070B9B525C1A9a2C0801b7b4E85d30" + }, + "config": { + "marketSymbol": "WETH/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-vault-TermMax USDC Vault.json b/deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-vault-TermMax USDC Vault.json new file mode 100644 index 0000000..4084050 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-vault-TermMax USDC Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22186270", + "timestamp": "1743657771" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TermMax USDC Vault", + "address": "0x9170A095e7073559ffe1240ccF692Abb94F32a28", + "asset": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "performanceFeeRate": 10000000, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-vault-TermMax WETH Vault.json b/deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-vault-TermMax WETH Vault.json new file mode 100644 index 0000000..7b33cbf --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250409-2000/arb-mainnet-vault-TermMax WETH Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22182632", + "timestamp": "1743613861" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TermMax WETH Vault", + "address": "0xeBF448902145f65b4E1B3C4e3A269444e0213C9e", + "asset": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "performanceFeeRate": 10000000, + "maxCapacity": "500000000000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250409-2000/deploy-market-arb-mainnet-20250409-2000-log.txt b/deployments/arb-mainnet-v1.0.8-20250409-2000/deploy-market-arb-mainnet-20250409-2000-log.txt new file mode 100644 index 0000000..3fd5950 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250409-2000/deploy-market-arb-mainnet-20250409-2000-log.txt @@ -0,0 +1,579 @@ +Running on arb-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: arb-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://arb-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ARBSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xa933ec01396c317772c0830fa6db0eaa420df34f + + ===== Block Info ===== + Block number: 22215388 + Block timestamp: 1744009113 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22215388 + + ===== Market Info - 0 ===== + Market deployed at: 0x6D5dcE785FDA044dE81AaA0abaB881BA4bbC59B7 + Market name: WETH/wstETH@30MAY2025 + Market symbol: WETH/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0xbE26080CE287A2Bb346baB44F7550DE18DBDB107 + XT deployed at: 0xa628a5948B6613845F5A8f46ec53D817A216C745 + GT deployed at: 0x706FD4696B070B9B525C1A9a2C0801b7b4E85d30 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-wstETH@09APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xb4B207969EbAcF10c1bd192f93e5B3217590C029 + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x9784AAe160d71EDf37B8a421E5FfA42AE9AA4ac9 + XT deployed at: 0x312fce698b5ABf0B15cF894a89EaE67dAF97A03e + GT deployed at: 0xb71e701de5F9AeA020799049154830e902BdacBe + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-wstETH@09APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x9bf834de7B951c7a0119eC3c0438B0d1e83D6BDF + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x1cB872765b6d5AaC6B951a70E1002C470c8f0554 + XT deployed at: 0x4D86E7d921C56D06a5b0f7fbdB80d7DFd8532a24 + GT deployed at: 0x20F2A47f4297e9aE929002213Fbe7a168034b5Aa + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WBTC@09APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xe6C399f22d5D721058324A59E3cC772D13e1E274 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x9A888F4feeF89D0E70bf97d93fe60e4F0B091e21 + XT deployed at: 0x08359897bcDF58aaa73492776C6eeedb2C9dBf39 + GT deployed at: 0xb3C0bfE13474c4CdD1409Ba6B6B4FcFdFb95827A + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-weETH@09APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0xEF77c361d50B1A9976ba702feCA233b734639Fda + Market name: USDC/WETH@30MAY2025 + Market symbol: USDC/WETH@30MAY2025 + Collateral (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x51dE84c1dfc24b1EDD023972FFd48903B1FA66c3 + XT deployed at: 0x95F4652078F45548AD749E6EC076B703495413B7 + GT deployed at: 0x3B6476155f9A2E7e7648fA27d3648e0F4302059A + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WETH@09APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x0b4084ACEd7c8dFe84f1b084F50E12B9CE35a1b4 + Market name: USDC/ARB@30MAY2025 + Market symbol: USDC/ARB@30MAY2025 + Collateral (ARB) address: 0x912CE59144191C1204E64559FE8253a0e49E6548 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x38A3D4197b7cD90Fe31fe2BB59763aF4627E2714 + XT deployed at: 0x46c57404f90866b2b26a6EF5c3735fA73F306Ee8 + GT deployed at: 0x172f496b78dc962f1aa4B2CD92c9C21093081331 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-ARB@09APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x151F42b840DD287d108Bb624fD1438D823209F41 + Market name: WETH/PT-weETH-26JUN2025@27JUN2025 + Market symbol: WETH/PT-weETH-26JUN2025@27JUN2025 + Collateral (PT-weETH-26JUN2025) address: 0xb33808ea0e883138680BA29311a220A7377cdb92 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0xB346b2c6F8774423F92850186a2a8E9E957CB9fE + XT deployed at: 0x9F765ABd43859EA5FaBE04A3067f1076136BD7C8 + GT deployed at: 0x7c92b79eD6bA4E84E914887D5Bf50aAC625129E6 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-PT-weETH-26JUN2025@09APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 42161 + +Estimated gas price: 15.354864001 gwei + +Estimated total gas used for script: 10064039 + +Estimated amount required: 0.154531950145760039 ETH + +========================== + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/42161/run-latest.json + +[ERROR] market deployment to arb-mainnet failed! +You can resume the failed deployment by running the same command with the --resume option: +./script.sh arb-mainnet deploy:market --broadcast --resume --verify +Running on arb-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: arb-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://arb-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Enabled (will resume from last broadcasted transaction) +Verification: Enabled--verify +Using API Key: ARBSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --resume --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/42161/run-latest.json + +[ERROR] market deployment to arb-mainnet failed! +You can resume the failed deployment by running the same command with the --resume option: +./script.sh arb-mainnet deploy:market --broadcast --resume --verify +Running on arb-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: arb-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://arb-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Enabled (will resume from last broadcasted transaction) +Verification: Enabled--verify +Using API Key: ARBSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --resume --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/42161/run-latest.json + +[ERROR] market deployment to arb-mainnet failed! +You can resume the failed deployment by running the same command with the --resume option: +./script.sh arb-mainnet deploy:market --broadcast --resume --verify +Running on arb-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: arb-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://arb-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Enabled (will resume from last broadcasted transaction) +Verification: Enabled--verify +Using API Key: ARBSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --resume --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/42161/run-latest.json + +[ERROR] market deployment to arb-mainnet failed! +You can resume the failed deployment by running the same command with the --resume option: +./script.sh arb-mainnet deploy:market --broadcast --resume --verify +Running on arb-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: arb-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://arb-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Enabled (will resume from last broadcasted transaction) +Verification: Enabled--verify +Using API Key: ARBSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --resume --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/42161/run-latest.json + +[ERROR] market deployment to arb-mainnet failed! +You can resume the failed deployment by running the same command with the --resume option: +./script.sh arb-mainnet deploy:market --broadcast --resume --verify +Running on arb-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: arb-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://arb-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Enabled (will resume from last broadcasted transaction) +Verification: Enabled--verify +Using API Key: ARBSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --resume --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/42161/run-latest.json + +[ERROR] market deployment to arb-mainnet failed! +You can resume the failed deployment by running the same command with the --resume option: +./script.sh arb-mainnet deploy:market --broadcast --resume --verify +Running on arb-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: arb-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://arb-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Enabled (will resume from last broadcasted transaction) +Verification: Enabled--verify +Using API Key: ARBSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --resume --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/42161/run-latest.json + +[ERROR] market deployment to arb-mainnet failed! +You can resume the failed deployment by running the same command with the --resume option: +./script.sh arb-mainnet deploy:market --broadcast --resume --verify +Running on arb-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: arb-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://arb-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Enabled (will resume from last broadcasted transaction) +Verification: Enabled--verify +Using API Key: ARBSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --resume --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/42161/run-latest.json + +[ERROR] market deployment to arb-mainnet failed! +You can resume the failed deployment by running the same command with the --resume option: +./script.sh arb-mainnet deploy:market --broadcast --resume --verify +Running on arb-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: arb-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://arb-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Enabled (will resume from last broadcasted transaction) +Verification: Enabled--verify +Using API Key: ARBSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --resume --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/42161/run-latest.json + +[ERROR] market deployment to arb-mainnet failed! +You can resume the failed deployment by running the same command with the --resume option: +./script.sh arb-mainnet deploy:market --broadcast --resume --verify +Running on arb-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: arb-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://arb-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Enabled (will resume from last broadcasted transaction) +Verification: Enabled--verify +Using API Key: ARBSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --resume --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/42161/run-latest.json + +[ERROR] market deployment to arb-mainnet failed! +You can resume the failed deployment by running the same command with the --resume option: +./script.sh arb-mainnet deploy:market --broadcast --resume --verify +Running on arb-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: arb-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://arb-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Enabled (will resume from last broadcasted transaction) +Verification: Enabled--verify +Using API Key: ARBSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --resume --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/42161/run-latest.json + +[ERROR] market deployment to arb-mainnet failed! +You can resume the failed deployment by running the same command with the --resume option: +./script.sh arb-mainnet deploy:market --broadcast --resume --verify +Running on arb-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: arb-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://arb-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Enabled (will resume from last broadcasted transaction) +Verification: Enabled--verify +Using API Key: ARBSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --resume --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/42161/run-latest.json + +[ERROR] market deployment to arb-mainnet failed! +You can resume the failed deployment by running the same command with the --resume option: +./script.sh arb-mainnet deploy:market --broadcast --resume --verify +Running on arb-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: arb-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://arbi*****.gate*****.tend*****.co/agLs***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Enabled (will resume from last broadcasted transaction) +Verification: Enabled--verify +Using API Key: ARBSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --resume --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x6d5dce785fda044de81aaa0abab881ba4bbc59b7, 0xbe26080ce287a2bb346bab44f7550de18dbdb107, 0xa628a5948b6613845f5a8f46ec53d817a216c745, 0x706fd4696b070b9b525c1a9a2c0801b7b4e85d30, 0xb4b207969ebacf10c1bd192f93e5b3217590c029, 0x9784aae160d71edf37b8a421e5ffa42ae9aa4ac9, 0x312fce698b5abf0b15cf894a89eae67daf97a03e, 0xb71e701de5f9aea020799049154830e902bdacbe, 0x9bf834de7b951c7a0119ec3c0438b0d1e83d6bdf, 0x1cb872765b6d5aac6b951a70e1002c470c8f0554, 0x4d86e7d921c56d06a5b0f7fbdb80d7dfd8532a24, 0x20f2a47f4297e9ae929002213fbe7a168034b5aa, 0xe6c399f22d5d721058324a59e3cc772d13e1e274, 0x9a888f4feef89d0e70bf97d93fe60e4f0b091e21, 0x08359897bcdf58aaa73492776c6eeedb2c9dbf39, 0xb3c0bfe13474c4cdd1409ba6b6b4fcfdfb95827a, 0xef77c361d50b1a9976ba702feca233b734639fda, 0x51de84c1dfc24b1edd023972ffd48903b1fa66c3, 0x95f4652078f45548ad749e6ec076b703495413b7, 0x3b6476155f9a2e7e7648fa27d3648e0f4302059a, 0x0b4084aced7c8dfe84f1b084f50e12b9ce35a1b4, 0x38a3d4197b7cd90fe31fe2bb59763af4627e2714, 0x46c57404f90866b2b26a6ef5c3735fa73f306ee8, 0x172f496b78dc962f1aa4b2cd92c9c21093081331, 0x151f42b840dd287d108bb624fd1438d823209f41, 0xb346b2c6f8774423f92850186a2a8e9e957cb9fe, 0x9f765abd43859ea5fabe04a3067f1076136bd7c8, 0x7c92b79ed6ba4e84e914887d5bf50aac625129e6]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/42161/run-latest.json + +[SUCCESS] market deployment to arb-mainnet completed successfully! diff --git a/deployments/arb-mainnet-v1.0.8-20250410-1400/accept-oracles-20250403-log.txt b/deployments/arb-mainnet-v1.0.8-20250410-1400/accept-oracles-20250403-log.txt new file mode 100644 index 0000000..2a93d96 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250410-1400/accept-oracles-20250403-log.txt @@ -0,0 +1,107 @@ +Running on arb-mainnet... +=== Configuration === +Operation: Script Execution +Network: arb-mainnet +Script: AcceptOracles.s.sol +Path: script/AcceptOracles.s.sol +RPC URL: http*****://arb-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Disabled +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xa669e7A0d4b3e4Fa48af2dE86BD4CD7126Be4e13 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting script execution... +Executing: forge script script/AcceptOracles.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow +No files changed, compilation skipped +Script ran successfully. + +== Logs == + === Checking Pending Oracles === + Oracle Aggregator Address: 0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa + Network: arb-mainnet + Current Block Timestamp: 1743663209 + + Accepted oracle for token: + Token Symbol: WETH + Token Address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: wstETH + Token Address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: USDC + Token Address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: WBTC + Token Address: 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: weETH + Token Address: 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: ARB + Token Address: 0x912CE59144191C1204E64559FE8253a0e49E6548 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: PT-weETH-26JUN2025 + Token Address: 0xb33808ea0e883138680BA29311a220A7377cdb92 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Heartbeat: 86400 + -------------------------------- + + === Oracle Acceptance Summary === + Total tokens checked: 7 + Oracles accepted: 7 + Oracles not ready: 0 + +## Setting up 1 EVM. + +========================== + +Chain 42161 + +Estimated gas price: 0.020000001 gwei + +Estimated total gas used for script: 914354 + +Estimated amount required: 0.000018287080914354 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/AcceptOracles.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/AcceptOracles.s.sol/42161/run-latest.json + +[SUCCESS] Script AcceptOracles executed successfully on arb-mainnet (Broadcast mode)! diff --git a/deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-access-manager.json b/deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-access-manager.json new file mode 100644 index 0000000..f75a2f5 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743606817", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182046", + "timestamp": "1743606817" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-core.json b/deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-core.json new file mode 100644 index 0000000..435d898 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743608156", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182159", + "timestamp": "1743608156" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x14920Eb11b71873d01c93B589b40585dacfCA096", + "vaultFactory": "0x929CBcb8150aD59DB63c92A7dAEc07b30d38bA79", + "oracleAggregator": "0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa", + "router": "0x7fa333b184868d88aC78a82eC06d5e87d4B0322E", + "swapAdapter": { + "uniswapV3Adapter": "0x609F20ee24E10010A62970E1dAb7E2b84eD74CAb", + "odosV2Adapter": "0x7de4efa140E52B7207FA689D41AfEE461B83E748", + "pendleSwapV3Adapter": "0xb0eCCbaD4b4cc190261c29C6E8d85bcF04284a8b", + "ERC4626VaultAdapter": "0xa50929A67daF9Ff3567e2Bb3411204A134f72546" + }, + "marketViewer": "0x276C0E52508d94ff2D4106b1559c8c4Bc3a75dec" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-market-USDC-ARB@10APR2025.json b/deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-market-USDC-ARB@10APR2025.json new file mode 100644 index 0000000..b90dd7d --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-market-USDC-ARB@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "323793348", + "timestamp": "1744009941" + }, + "market": "0x9Ba3021219981b9a41D6d42185Cc130503F13B9E", + "collateral": { + "address": "0x912CE59144191C1204E64559FE8253a0e49E6548", + "symbol": "ARB", + "priceFeed": "0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xDdD8e706356AA212032235FCb93dCD1BC8d6A126", + "xt": "0xBA0879ccF624699030f8899B6529b8079EE8e9E5", + "gt": "0xD3560F95bF3E80786F46FdF9F515E3Aa40A5d9d0" + }, + "config": { + "marketSymbol": "USDC/ARB@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-market-USDC-WBTC@10APR2025.json b/deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-market-USDC-WBTC@10APR2025.json new file mode 100644 index 0000000..69fb414 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-market-USDC-WBTC@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "323793348", + "timestamp": "1744009941" + }, + "market": "0xEcC95f8AD037B9BFd35460C234877F2498ecD734", + "collateral": { + "address": "0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f", + "symbol": "WBTC", + "priceFeed": "0xd0C7101eACbB49F3deCcCc166d238410D6D46d57", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xEB4EBAcd8da08F8b82aeA3E3EfDDa675F36b5Fe3", + "xt": "0x3d0d5499399C5740829ea48A7F504BC88Fa4B456", + "gt": "0x0171cA88704DA4CEab3E2B6B54EA9975Ff6Af535" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-market-USDC-WETH@10APR2025.json b/deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-market-USDC-WETH@10APR2025.json new file mode 100644 index 0000000..11a5a16 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-market-USDC-WETH@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "323793348", + "timestamp": "1744009941" + }, + "market": "0xdf672158D746F6cB70F8E2d573424AFf9039fcB3", + "collateral": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x0912c12a5307DaFF5aa9f4EbfA1248228b4fE2eD", + "xt": "0xCCCaa1B1B1b7f7333f8220c5831f83C109Ffa528", + "gt": "0xAe1C16a3a82026829327F79Cd42DC273F6816b43" + }, + "config": { + "marketSymbol": "USDC/WETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-market-USDC-wstETH@10APR2025.json b/deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-market-USDC-wstETH@10APR2025.json new file mode 100644 index 0000000..e001347 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-market-USDC-wstETH@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "323793348", + "timestamp": "1744009941" + }, + "market": "0xE6aDadaB44Cc32CB542D7b1d8CD409D8c48fbf57", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x9323961ab93bCA70b4ffCBB8b16B4545D9178fe1", + "xt": "0x30B8DDc94F6c0173Afdbc2f598541048C1cfEDA6", + "gt": "0x817B901989d1faCFCdFc97c03A0b31eD8CA62a50" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-market-WETH-PT-weETH-26JUN2025@10APR2025.json b/deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-market-WETH-PT-weETH-26JUN2025@10APR2025.json new file mode 100644 index 0000000..f982bb1 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-market-WETH-PT-weETH-26JUN2025@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "323793348", + "timestamp": "1744009941" + }, + "market": "0xDa230B9AaFe2fc14069c7f09bb25E42D9F3530ED", + "collateral": { + "address": "0xb33808ea0e883138680BA29311a220A7377cdb92", + "symbol": "PT-weETH-26JUN2025", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x6ddA8079dFedF4Db8EDCbb5d0dAd311Ad4521767", + "xt": "0xF6b0D185BeFF716E2AEe212584B8aF7d98547b05", + "gt": "0x2a4144aC39022963C0aECA0d2De463aD2bD07dDa" + }, + "config": { + "marketSymbol": "WETH/PT-weETH-26JUN2025@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-market-WETH-weETH@10APR2025.json b/deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-market-WETH-weETH@10APR2025.json new file mode 100644 index 0000000..8b62877 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-market-WETH-weETH@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "323793348", + "timestamp": "1744009941" + }, + "market": "0x5cddb91F285C52DfdC02AEF2f91D72d124e82BF4", + "collateral": { + "address": "0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe", + "symbol": "weETH", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x7935309ADd4550321961af5A3Fa6E98e3923CB74", + "xt": "0x51e3B92a7ABC3d61649Bf9B47ED8eA23c2668068", + "gt": "0x4978555126Fe3E467C5d10183a750939d8EB3B47" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-market-WETH-wstETH@10APR2025.json b/deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-market-WETH-wstETH@10APR2025.json new file mode 100644 index 0000000..e361679 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-market-WETH-wstETH@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "323793348", + "timestamp": "1744009941" + }, + "market": "0xA29FE72858b0Fb221E2a8Fa2e0E6E5a0206FA8f2", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x98c1496Bc11F9C8a2E89Dbae0fb69A1f0ebF2aE9", + "xt": "0x0b26dDba757d568e8Bda3D67A7C878699A779dB8", + "gt": "0x1cdd8e51B1708a42bC97b9578b5991b0F3A7ca49" + }, + "config": { + "marketSymbol": "WETH/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-vault-TermMax USDC Vault.json b/deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-vault-TermMax USDC Vault.json new file mode 100644 index 0000000..4084050 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-vault-TermMax USDC Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22186270", + "timestamp": "1743657771" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TermMax USDC Vault", + "address": "0x9170A095e7073559ffe1240ccF692Abb94F32a28", + "asset": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "performanceFeeRate": 10000000, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-vault-TermMax WETH Vault.json b/deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-vault-TermMax WETH Vault.json new file mode 100644 index 0000000..7b33cbf --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250410-1400/arb-mainnet-vault-TermMax WETH Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22182632", + "timestamp": "1743613861" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TermMax WETH Vault", + "address": "0xeBF448902145f65b4E1B3C4e3A269444e0213C9e", + "asset": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "performanceFeeRate": 10000000, + "maxCapacity": "500000000000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250410-1400/deploy-market-arb-mainnet-20250410-1400-log.txt b/deployments/arb-mainnet-v1.0.8-20250410-1400/deploy-market-arb-mainnet-20250410-1400-log.txt new file mode 100644 index 0000000..0751e22 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250410-1400/deploy-market-arb-mainnet-20250410-1400-log.txt @@ -0,0 +1,299 @@ +Running on arb-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: arb-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://arbi*****.gate*****.tend*****.co/agLs***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ARBSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xa933ec01396c317772c0830fa6db0eaa420df34f + + ===== Block Info ===== + Block number: 323793348 + Block timestamp: 1744009941 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 323793348 + + ===== Market Info - 0 ===== + Market deployed at: 0xA29FE72858b0Fb221E2a8Fa2e0E6E5a0206FA8f2 + Market name: WETH/wstETH@30MAY2025 + Market symbol: WETH/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x98c1496Bc11F9C8a2E89Dbae0fb69A1f0ebF2aE9 + XT deployed at: 0x0b26dDba757d568e8Bda3D67A7C878699A779dB8 + GT deployed at: 0x1cdd8e51B1708a42bC97b9578b5991b0F3A7ca49 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-wstETH@10APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xE6aDadaB44Cc32CB542D7b1d8CD409D8c48fbf57 + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x9323961ab93bCA70b4ffCBB8b16B4545D9178fe1 + XT deployed at: 0x30B8DDc94F6c0173Afdbc2f598541048C1cfEDA6 + GT deployed at: 0x817B901989d1faCFCdFc97c03A0b31eD8CA62a50 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-wstETH@10APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0xEcC95f8AD037B9BFd35460C234877F2498ecD734 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0xEB4EBAcd8da08F8b82aeA3E3EfDDa675F36b5Fe3 + XT deployed at: 0x3d0d5499399C5740829ea48A7F504BC88Fa4B456 + GT deployed at: 0x0171cA88704DA4CEab3E2B6B54EA9975Ff6Af535 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WBTC@10APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0x5cddb91F285C52DfdC02AEF2f91D72d124e82BF4 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x7935309ADd4550321961af5A3Fa6E98e3923CB74 + XT deployed at: 0x51e3B92a7ABC3d61649Bf9B47ED8eA23c2668068 + GT deployed at: 0x4978555126Fe3E467C5d10183a750939d8EB3B47 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-weETH@10APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0xdf672158D746F6cB70F8E2d573424AFf9039fcB3 + Market name: USDC/WETH@30MAY2025 + Market symbol: USDC/WETH@30MAY2025 + Collateral (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x0912c12a5307DaFF5aa9f4EbfA1248228b4fE2eD + XT deployed at: 0xCCCaa1B1B1b7f7333f8220c5831f83C109Ffa528 + GT deployed at: 0xAe1C16a3a82026829327F79Cd42DC273F6816b43 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WETH@10APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x9Ba3021219981b9a41D6d42185Cc130503F13B9E + Market name: USDC/ARB@30MAY2025 + Market symbol: USDC/ARB@30MAY2025 + Collateral (ARB) address: 0x912CE59144191C1204E64559FE8253a0e49E6548 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0xDdD8e706356AA212032235FCb93dCD1BC8d6A126 + XT deployed at: 0xBA0879ccF624699030f8899B6529b8079EE8e9E5 + GT deployed at: 0xD3560F95bF3E80786F46FdF9F515E3Aa40A5d9d0 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-ARB@10APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0xDa230B9AaFe2fc14069c7f09bb25E42D9F3530ED + Market name: WETH/PT-weETH-26JUN2025@27JUN2025 + Market symbol: WETH/PT-weETH-26JUN2025@27JUN2025 + Collateral (PT-weETH-26JUN2025) address: 0xb33808ea0e883138680BA29311a220A7377cdb92 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x6ddA8079dFedF4Db8EDCbb5d0dAd311Ad4521767 + XT deployed at: 0xF6b0D185BeFF716E2AEe212584B8aF7d98547b05 + GT deployed at: 0x2a4144aC39022963C0aECA0d2De463aD2bD07dDa + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-PT-weETH-26JUN2025@10APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 42161 + +Estimated gas price: 3.411208001 gwei + +Estimated total gas used for script: 10083777 + +Estimated amount required: 0.034397860782699777 ETH + +========================== + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/42161/run-latest.json + +[ERROR] market deployment to arb-mainnet failed! +You can resume the failed deployment by running the same command with the --resume option: +./script.sh arb-mainnet deploy:market --broadcast --resume --verify +Running on arb-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: arb-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://arbi*****.gate*****.tend*****.co/agLs***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Enabled (will resume from last broadcasted transaction) +Verification: Enabled--verify +Using API Key: ARBSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --resume --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/42161/run-latest.json + +[ERROR] market deployment to arb-mainnet failed! +You can resume the failed deployment by running the same command with the --resume option: +./script.sh arb-mainnet deploy:market --broadcast --resume --verify +Running on arb-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: arb-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://arbi*****.gate*****.tend*****.co/agLs***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Enabled (will resume from last broadcasted transaction) +Verification: Enabled--verify +Using API Key: ARBSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --resume --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0xa29fe72858b0fb221e2a8fa2e0e6e5a0206fa8f2, 0x98c1496bc11f9c8a2e89dbae0fb69a1f0ebf2ae9, 0x0b26ddba757d568e8bda3d67a7c878699a779db8, 0x1cdd8e51b1708a42bc97b9578b5991b0f3a7ca49, 0xe6adadab44cc32cb542d7b1d8cd409d8c48fbf57, 0x9323961ab93bca70b4ffcbb8b16b4545d9178fe1, 0x30b8ddc94f6c0173afdbc2f598541048c1cfeda6, 0x817b901989d1facfcdfc97c03a0b31ed8ca62a50, 0xecc95f8ad037b9bfd35460c234877f2498ecd734, 0xeb4ebacd8da08f8b82aea3e3efdda675f36b5fe3, 0x3d0d5499399c5740829ea48a7f504bc88fa4b456, 0x0171ca88704da4ceab3e2b6b54ea9975ff6af535, 0x5cddb91f285c52dfdc02aef2f91d72d124e82bf4, 0x7935309add4550321961af5a3fa6e98e3923cb74, 0x51e3b92a7abc3d61649bf9b47ed8ea23c2668068, 0x4978555126fe3e467c5d10183a750939d8eb3b47, 0xdf672158d746f6cb70f8e2d573424aff9039fcb3, 0x0912c12a5307daff5aa9f4ebfa1248228b4fe2ed, 0xcccaa1b1b1b7f7333f8220c5831f83c109ffa528, 0xae1c16a3a82026829327f79cd42dc273f6816b43, 0x9ba3021219981b9a41d6d42185cc130503f13b9e, 0xddd8e706356aa212032235fcb93dcd1bc8d6a126, 0xba0879ccf624699030f8899b6529b8079ee8e9e5, 0xd3560f95bf3e80786f46fdf9f515e3aa40a5d9d0, 0xda230b9aafe2fc14069c7f09bb25e42d9f3530ed, 0x6dda8079dfedf4db8edcbb5d0dad311ad4521767, 0xf6b0d185beff716e2aee212584b8af7d98547b05, 0x2a4144ac39022963c0aeca0d2de463ad2bd07dda]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/42161/run-latest.json + +[SUCCESS] market deployment to arb-mainnet completed successfully! diff --git a/deployments/arb-mainnet-v1.0.8-20250410-2000/accept-oracles-20250403-log.txt b/deployments/arb-mainnet-v1.0.8-20250410-2000/accept-oracles-20250403-log.txt new file mode 100644 index 0000000..2a93d96 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250410-2000/accept-oracles-20250403-log.txt @@ -0,0 +1,107 @@ +Running on arb-mainnet... +=== Configuration === +Operation: Script Execution +Network: arb-mainnet +Script: AcceptOracles.s.sol +Path: script/AcceptOracles.s.sol +RPC URL: http*****://arb-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Disabled +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xa669e7A0d4b3e4Fa48af2dE86BD4CD7126Be4e13 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting script execution... +Executing: forge script script/AcceptOracles.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow +No files changed, compilation skipped +Script ran successfully. + +== Logs == + === Checking Pending Oracles === + Oracle Aggregator Address: 0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa + Network: arb-mainnet + Current Block Timestamp: 1743663209 + + Accepted oracle for token: + Token Symbol: WETH + Token Address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: wstETH + Token Address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: USDC + Token Address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: WBTC + Token Address: 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: weETH + Token Address: 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: ARB + Token Address: 0x912CE59144191C1204E64559FE8253a0e49E6548 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: PT-weETH-26JUN2025 + Token Address: 0xb33808ea0e883138680BA29311a220A7377cdb92 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Heartbeat: 86400 + -------------------------------- + + === Oracle Acceptance Summary === + Total tokens checked: 7 + Oracles accepted: 7 + Oracles not ready: 0 + +## Setting up 1 EVM. + +========================== + +Chain 42161 + +Estimated gas price: 0.020000001 gwei + +Estimated total gas used for script: 914354 + +Estimated amount required: 0.000018287080914354 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/AcceptOracles.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/AcceptOracles.s.sol/42161/run-latest.json + +[SUCCESS] Script AcceptOracles executed successfully on arb-mainnet (Broadcast mode)! diff --git a/deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-access-manager.json b/deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-access-manager.json new file mode 100644 index 0000000..f75a2f5 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743606817", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182046", + "timestamp": "1743606817" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-core.json b/deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-core.json new file mode 100644 index 0000000..435d898 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743608156", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182159", + "timestamp": "1743608156" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x14920Eb11b71873d01c93B589b40585dacfCA096", + "vaultFactory": "0x929CBcb8150aD59DB63c92A7dAEc07b30d38bA79", + "oracleAggregator": "0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa", + "router": "0x7fa333b184868d88aC78a82eC06d5e87d4B0322E", + "swapAdapter": { + "uniswapV3Adapter": "0x609F20ee24E10010A62970E1dAb7E2b84eD74CAb", + "odosV2Adapter": "0x7de4efa140E52B7207FA689D41AfEE461B83E748", + "pendleSwapV3Adapter": "0xb0eCCbaD4b4cc190261c29C6E8d85bcF04284a8b", + "ERC4626VaultAdapter": "0xa50929A67daF9Ff3567e2Bb3411204A134f72546" + }, + "marketViewer": "0x276C0E52508d94ff2D4106b1559c8c4Bc3a75dec" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-market-USDC-ARB@10APR2025.json b/deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-market-USDC-ARB@10APR2025.json new file mode 100644 index 0000000..778edca --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-market-USDC-ARB@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "323797789", + "timestamp": "1744011050" + }, + "market": "0xaCb4D7405ae781aDCC16CAc86e72243AF3508E55", + "collateral": { + "address": "0x912CE59144191C1204E64559FE8253a0e49E6548", + "symbol": "ARB", + "priceFeed": "0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xba31Ef5Fe837afb7f334110268043A1c737c9Edc", + "xt": "0xCC5c0AF602812E5f2898b9c5bCa28073E87dD605", + "gt": "0x59914BEcb17de30340EF7F5143F2a1A27634FB2F" + }, + "config": { + "marketSymbol": "USDC/ARB@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-market-USDC-WBTC@10APR2025.json b/deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-market-USDC-WBTC@10APR2025.json new file mode 100644 index 0000000..c703686 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-market-USDC-WBTC@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "323797789", + "timestamp": "1744011050" + }, + "market": "0x75011A84DA47800FD74728e42e2bb264F4b9C97c", + "collateral": { + "address": "0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f", + "symbol": "WBTC", + "priceFeed": "0xd0C7101eACbB49F3deCcCc166d238410D6D46d57", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x2608e32BFBBa311872E539Ac350445fF45Fcd99B", + "xt": "0xc23D0F479D1AFF95a1ae9DB3D7D75edD9Bdd9aba", + "gt": "0x410c0A8aB2728Bc3728e5fEa96497d43ea56F20b" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-market-USDC-WETH@10APR2025.json b/deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-market-USDC-WETH@10APR2025.json new file mode 100644 index 0000000..0e502ca --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-market-USDC-WETH@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "323797789", + "timestamp": "1744011050" + }, + "market": "0x97b433dD0bad862621A78E350c398941d523535a", + "collateral": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xA5a3B9763056258930590c91279643642B4714EA", + "xt": "0x393B4f022869E093CCb25f8251970D81884d7Ff5", + "gt": "0x3D4010bD02A6f62486d767BAdB1BeDc829f28Ef4" + }, + "config": { + "marketSymbol": "USDC/WETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-market-USDC-wstETH@10APR2025.json b/deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-market-USDC-wstETH@10APR2025.json new file mode 100644 index 0000000..f483ca7 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-market-USDC-wstETH@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "323797789", + "timestamp": "1744011050" + }, + "market": "0xC049Ef6d6654E1C5e09f35FDe54f108F5A129BfF", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x77200A2f6415FFFDAd420148d221e5868d9860B2", + "xt": "0x7FdA9c31b8838598B3F317b0755DA989C1890B23", + "gt": "0x651204d5d856c64291E529C943E9d758B8fB2b75" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@10APR2025.json b/deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@10APR2025.json new file mode 100644 index 0000000..cdacc87 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "323797789", + "timestamp": "1744011050" + }, + "market": "0x720343ccA2A8F31267Cf499611Fc43B601Be771b", + "collateral": { + "address": "0xb33808ea0e883138680BA29311a220A7377cdb92", + "symbol": "PT-weETH-26JUN2025", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xDCBaC6B90CA991D2019a4f38e9d5E94738284229", + "xt": "0xBA62BB37080C32b0368c629494065919F6890420", + "gt": "0xB4bBaBD6DCF41ed15EC34F875217E18eCbD4A28A" + }, + "config": { + "marketSymbol": "WETH/PT-weETH-26JUN2025@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-market-WETH-weETH@10APR2025.json b/deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-market-WETH-weETH@10APR2025.json new file mode 100644 index 0000000..ddba05e --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-market-WETH-weETH@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "323797789", + "timestamp": "1744011050" + }, + "market": "0x3d9B41A0AC3e12c5C4709e08A0D84Ab481365d30", + "collateral": { + "address": "0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe", + "symbol": "weETH", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xE128969Bf9a7aa96944255CDd235A03b0BfB4140", + "xt": "0x3330374892e639b5e137fA36aE248610B57006c3", + "gt": "0xC190b3570c9B2CF98d97da5879f7745F07070dfe" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-market-WETH-wstETH@10APR2025.json b/deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-market-WETH-wstETH@10APR2025.json new file mode 100644 index 0000000..1948a7c --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-market-WETH-wstETH@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "323797789", + "timestamp": "1744011050" + }, + "market": "0xC13Fd303B55205aC214B38EbF7278374D7a94F61", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x44545E0BCB3c9a43897505c96e3B43da37AB4738", + "xt": "0x914cA525b206EC8C1B4C82eaD8A484BDBec51DEf", + "gt": "0x2128986F2Dd6CE0cb1C12B39e62e91F13B01261D" + }, + "config": { + "marketSymbol": "WETH/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-vault-TermMax USDC Vault.json b/deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-vault-TermMax USDC Vault.json new file mode 100644 index 0000000..4084050 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-vault-TermMax USDC Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22186270", + "timestamp": "1743657771" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TermMax USDC Vault", + "address": "0x9170A095e7073559ffe1240ccF692Abb94F32a28", + "asset": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "performanceFeeRate": 10000000, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-vault-TermMax WETH Vault.json b/deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-vault-TermMax WETH Vault.json new file mode 100644 index 0000000..7b33cbf --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250410-2000/arb-mainnet-vault-TermMax WETH Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22182632", + "timestamp": "1743613861" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TermMax WETH Vault", + "address": "0xeBF448902145f65b4E1B3C4e3A269444e0213C9e", + "asset": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "performanceFeeRate": 10000000, + "maxCapacity": "500000000000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250410-2000/deploy-market-arb-mainnet-20250410-2000-log.txt b/deployments/arb-mainnet-v1.0.8-20250410-2000/deploy-market-arb-mainnet-20250410-2000-log.txt new file mode 100644 index 0000000..8e56be5 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250410-2000/deploy-market-arb-mainnet-20250410-2000-log.txt @@ -0,0 +1,243 @@ +Running on arb-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: arb-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://arbi*****.gate*****.tend*****.co/agLs***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ARBSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xa933ec01396c317772c0830fa6db0eaa420df34f + + ===== Block Info ===== + Block number: 323797789 + Block timestamp: 1744011050 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 323797789 + + ===== Market Info - 0 ===== + Market deployed at: 0xC13Fd303B55205aC214B38EbF7278374D7a94F61 + Market name: WETH/wstETH@30MAY2025 + Market symbol: WETH/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x44545E0BCB3c9a43897505c96e3B43da37AB4738 + XT deployed at: 0x914cA525b206EC8C1B4C82eaD8A484BDBec51DEf + GT deployed at: 0x2128986F2Dd6CE0cb1C12B39e62e91F13B01261D + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-wstETH@10APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xC049Ef6d6654E1C5e09f35FDe54f108F5A129BfF + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x77200A2f6415FFFDAd420148d221e5868d9860B2 + XT deployed at: 0x7FdA9c31b8838598B3F317b0755DA989C1890B23 + GT deployed at: 0x651204d5d856c64291E529C943E9d758B8fB2b75 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-wstETH@10APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x75011A84DA47800FD74728e42e2bb264F4b9C97c + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x2608e32BFBBa311872E539Ac350445fF45Fcd99B + XT deployed at: 0xc23D0F479D1AFF95a1ae9DB3D7D75edD9Bdd9aba + GT deployed at: 0x410c0A8aB2728Bc3728e5fEa96497d43ea56F20b + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WBTC@10APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0x3d9B41A0AC3e12c5C4709e08A0D84Ab481365d30 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0xE128969Bf9a7aa96944255CDd235A03b0BfB4140 + XT deployed at: 0x3330374892e639b5e137fA36aE248610B57006c3 + GT deployed at: 0xC190b3570c9B2CF98d97da5879f7745F07070dfe + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-weETH@10APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x97b433dD0bad862621A78E350c398941d523535a + Market name: USDC/WETH@30MAY2025 + Market symbol: USDC/WETH@30MAY2025 + Collateral (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0xA5a3B9763056258930590c91279643642B4714EA + XT deployed at: 0x393B4f022869E093CCb25f8251970D81884d7Ff5 + GT deployed at: 0x3D4010bD02A6f62486d767BAdB1BeDc829f28Ef4 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WETH@10APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0xaCb4D7405ae781aDCC16CAc86e72243AF3508E55 + Market name: USDC/ARB@30MAY2025 + Market symbol: USDC/ARB@30MAY2025 + Collateral (ARB) address: 0x912CE59144191C1204E64559FE8253a0e49E6548 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0xba31Ef5Fe837afb7f334110268043A1c737c9Edc + XT deployed at: 0xCC5c0AF602812E5f2898b9c5bCa28073E87dD605 + GT deployed at: 0x59914BEcb17de30340EF7F5143F2a1A27634FB2F + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-ARB@10APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x720343ccA2A8F31267Cf499611Fc43B601Be771b + Market name: WETH/PT-weETH-26JUN2025@27JUN2025 + Market symbol: WETH/PT-weETH-26JUN2025@27JUN2025 + Collateral (PT-weETH-26JUN2025) address: 0xb33808ea0e883138680BA29311a220A7377cdb92 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0xDCBaC6B90CA991D2019a4f38e9d5E94738284229 + XT deployed at: 0xBA62BB37080C32b0368c629494065919F6890420 + GT deployed at: 0xB4bBaBD6DCF41ed15EC34F875217E18eCbD4A28A + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-PT-weETH-26JUN2025@10APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 42161 + +Estimated gas price: 0.491682001 gwei + +Estimated total gas used for script: 10600129 + +Estimated amount required: 0.005211892637578129 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0xc13fd303b55205ac214b38ebf7278374d7a94f61, 0x44545e0bcb3c9a43897505c96e3b43da37ab4738, 0x914ca525b206ec8c1b4c82ead8a484bdbec51def, 0x2128986f2dd6ce0cb1c12b39e62e91f13b01261d, 0xc049ef6d6654e1c5e09f35fde54f108f5a129bff, 0x77200a2f6415fffdad420148d221e5868d9860b2, 0x7fda9c31b8838598b3f317b0755da989c1890b23, 0x651204d5d856c64291e529c943e9d758b8fb2b75, 0x75011a84da47800fd74728e42e2bb264f4b9c97c, 0x2608e32bfbba311872e539ac350445ff45fcd99b, 0xc23d0f479d1aff95a1ae9db3d7d75edd9bdd9aba, 0x410c0a8ab2728bc3728e5fea96497d43ea56f20b, 0x3d9b41a0ac3e12c5c4709e08a0d84ab481365d30, 0xe128969bf9a7aa96944255cdd235a03b0bfb4140, 0x3330374892e639b5e137fa36ae248610b57006c3, 0xc190b3570c9b2cf98d97da5879f7745f07070dfe, 0x97b433dd0bad862621a78e350c398941d523535a, 0xa5a3b9763056258930590c91279643642b4714ea, 0x393b4f022869e093ccb25f8251970d81884d7ff5, 0x3d4010bd02a6f62486d767badb1bedc829f28ef4, 0xacb4d7405ae781adcc16cac86e72243af3508e55, 0xba31ef5fe837afb7f334110268043a1c737c9edc, 0xcc5c0af602812e5f2898b9c5bca28073e87dd605, 0x59914becb17de30340ef7f5143f2a1a27634fb2f, 0x720343cca2a8f31267cf499611fc43b601be771b, 0xdcbac6b90ca991d2019a4f38e9d5e94738284229, 0xba62bb37080c32b0368c629494065919f6890420, 0xb4bbabd6dcf41ed15ec34f875217e18ecbd4a28a]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/42161/run-latest.json + +[SUCCESS] market deployment to arb-mainnet completed successfully! diff --git a/deployments/arb-mainnet-v1.0.8-20250530/accept-oracles-20250403-log.txt b/deployments/arb-mainnet-v1.0.8-20250530/accept-oracles-20250403-log.txt new file mode 100644 index 0000000..2a93d96 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250530/accept-oracles-20250403-log.txt @@ -0,0 +1,107 @@ +Running on arb-mainnet... +=== Configuration === +Operation: Script Execution +Network: arb-mainnet +Script: AcceptOracles.s.sol +Path: script/AcceptOracles.s.sol +RPC URL: http*****://arb-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Disabled +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xa669e7A0d4b3e4Fa48af2dE86BD4CD7126Be4e13 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting script execution... +Executing: forge script script/AcceptOracles.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow +No files changed, compilation skipped +Script ran successfully. + +== Logs == + === Checking Pending Oracles === + Oracle Aggregator Address: 0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa + Network: arb-mainnet + Current Block Timestamp: 1743663209 + + Accepted oracle for token: + Token Symbol: WETH + Token Address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: wstETH + Token Address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: USDC + Token Address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: WBTC + Token Address: 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: weETH + Token Address: 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: ARB + Token Address: 0x912CE59144191C1204E64559FE8253a0e49E6548 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: PT-weETH-26JUN2025 + Token Address: 0xb33808ea0e883138680BA29311a220A7377cdb92 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Heartbeat: 86400 + -------------------------------- + + === Oracle Acceptance Summary === + Total tokens checked: 7 + Oracles accepted: 7 + Oracles not ready: 0 + +## Setting up 1 EVM. + +========================== + +Chain 42161 + +Estimated gas price: 0.020000001 gwei + +Estimated total gas used for script: 914354 + +Estimated amount required: 0.000018287080914354 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/AcceptOracles.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/AcceptOracles.s.sol/42161/run-latest.json + +[SUCCESS] Script AcceptOracles executed successfully on arb-mainnet (Broadcast mode)! diff --git a/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-access-manager.json b/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-access-manager.json new file mode 100644 index 0000000..f75a2f5 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743606817", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182046", + "timestamp": "1743606817" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-core.json b/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-core.json new file mode 100644 index 0000000..435d898 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743608156", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182159", + "timestamp": "1743608156" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x14920Eb11b71873d01c93B589b40585dacfCA096", + "vaultFactory": "0x929CBcb8150aD59DB63c92A7dAEc07b30d38bA79", + "oracleAggregator": "0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa", + "router": "0x7fa333b184868d88aC78a82eC06d5e87d4B0322E", + "swapAdapter": { + "uniswapV3Adapter": "0x609F20ee24E10010A62970E1dAb7E2b84eD74CAb", + "odosV2Adapter": "0x7de4efa140E52B7207FA689D41AfEE461B83E748", + "pendleSwapV3Adapter": "0xb0eCCbaD4b4cc190261c29C6E8d85bcF04284a8b", + "ERC4626VaultAdapter": "0xa50929A67daF9Ff3567e2Bb3411204A134f72546" + }, + "marketViewer": "0x276C0E52508d94ff2D4106b1559c8c4Bc3a75dec" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-market-USDC-ARB@30MAY2025.json b/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-market-USDC-ARB@30MAY2025.json new file mode 100644 index 0000000..c65f4d5 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-market-USDC-ARB@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "324770690", + "timestamp": "1744254877" + }, + "market": "0x79A4963f8b2f8d997908615352A44192Bc3D23e7", + "collateral": { + "address": "0x912CE59144191C1204E64559FE8253a0e49E6548", + "symbol": "ARB", + "priceFeed": "0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x4d924ee8d2201D7f4da0B4921Fd9d24CA912B7cD", + "xt": "0x7c7feD69BBdEEC00cBe381cE21BD97D2745857BA", + "gt": "0x34d324Ab749BE907f5d60FB58D05f58C9D401666" + }, + "config": { + "marketSymbol": "USDC/ARB@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-market-USDC-WBTC@30MAY2025.json b/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-market-USDC-WBTC@30MAY2025.json new file mode 100644 index 0000000..b696bbf --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-market-USDC-WBTC@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "324770690", + "timestamp": "1744254877" + }, + "market": "0x49E11668EAc15896ecF5B31baeF63C98897D4263", + "collateral": { + "address": "0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f", + "symbol": "WBTC", + "priceFeed": "0xd0C7101eACbB49F3deCcCc166d238410D6D46d57", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xE9F18d347Fb782B7496d637D5EF5e8287d21Dd47", + "xt": "0x1B28415e1490262Ad20842D718b3272501dF27Cd", + "gt": "0xF1e33c79809159014207c4662A9C1A8a44c67744" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-market-USDC-WETH@30MAY2025.json b/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-market-USDC-WETH@30MAY2025.json new file mode 100644 index 0000000..c123f90 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-market-USDC-WETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "324770690", + "timestamp": "1744254877" + }, + "market": "0x59e3D532727221ac3aeE2D6303cf3C39F1De65D7", + "collateral": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x56c574463b44dF7FaC5eCf650F1F66e640806a46", + "xt": "0xD781f71b8D0B27a098f85bf532b9640CbDDdC565", + "gt": "0x602F667B90Aac06ba269884e51Ff52E8723634C9" + }, + "config": { + "marketSymbol": "USDC/WETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-market-USDC-wstETH@30MAY2025.json b/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-market-USDC-wstETH@30MAY2025.json new file mode 100644 index 0000000..af46c14 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-market-USDC-wstETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "324770690", + "timestamp": "1744254877" + }, + "market": "0xC62B23864c1e909868471bf72Cc457397BC52E13", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xdD6a46c4520eC02b0D3243bD43Eefc5aADcc329B", + "xt": "0xfc5AEdDE0155D3e5E5C8CA584795Bb4620DC670F", + "gt": "0xb0e34bB7a2A2bf475B14D3FFbB49F027C48529De" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-market-WETH-PT-weETH-26JUN2025@27JUN2025.json b/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-market-WETH-PT-weETH-26JUN2025@27JUN2025.json new file mode 100644 index 0000000..0bc9045 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-market-WETH-PT-weETH-26JUN2025@27JUN2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "324770690", + "timestamp": "1744254877" + }, + "market": "0xA016DecA4AbdB8fd94BC221a5feB15BA3DB62031", + "collateral": { + "address": "0xb33808ea0e883138680BA29311a220A7377cdb92", + "symbol": "PT-weETH-26JUN2025", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x19a60ba0a5731eA9A6D2dBDf8e42Fa9412b27faa", + "xt": "0x4190aE2FF7716875104ffC1994323C43d65EF184", + "gt": "0x10bC3066fb401131a4D5C58fF469f392988B0ffC" + }, + "config": { + "marketSymbol": "WETH/PT-weETH-26JUN2025@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "27JUN2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-market-WETH-weETH@30MAY2025.json b/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-market-WETH-weETH@30MAY2025.json new file mode 100644 index 0000000..62e48c7 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-market-WETH-weETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "324770690", + "timestamp": "1744254877" + }, + "market": "0xa93A81835DAb4AC07649506B88AF7eE6DDaD03Ba", + "collateral": { + "address": "0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe", + "symbol": "weETH", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x60Cf9d67A072084f6891bf65E223DBa7E1182D6A", + "xt": "0x1761b7a22f13C8E32f15D650ACf73F07e3bE0C8A", + "gt": "0xa42B46Fd5Ad2fd38Edf6F8509D1702a16cFBC5b6" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-market-WETH-wstETH@30MAY2025.json b/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-market-WETH-wstETH@30MAY2025.json new file mode 100644 index 0000000..23fbd21 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-market-WETH-wstETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "324770690", + "timestamp": "1744254877" + }, + "market": "0xcc60D097222f45538159D43681FBa4B1fD37DE97", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xDd7049672aB42AF472D43849CBD25da619622f10", + "xt": "0x39FDbccDD78dED330EdcF11dE4FFd805a7F69D5E", + "gt": "0xc9244551127b07f0964a4320C86129a7C5F0826b" + }, + "config": { + "marketSymbol": "WETH/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-vault-TMX-USDC.json b/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-vault-TMX-USDC.json new file mode 100644 index 0000000..af05fff --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-vault-TMX-USDC.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "324633071", + "timestamp": "1744220329" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TMX-USDC", + "address": "0xc94b752839a22D2C44E99e298671dd4B2aDd11b3", + "asset": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "performanceFeeRate": 0, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-vault-TMX-WETH.json b/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-vault-TMX-WETH.json new file mode 100644 index 0000000..9177b68 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-vault-TMX-WETH.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "324634324", + "timestamp": "1744220643" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TMX-WETH", + "address": "0x8c5161f287Cbc9Afa48bC8972eE8CC0a755fcAdC", + "asset": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "performanceFeeRate": 0, + "maxCapacity": "5000000000000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-vault-TermMax USDC Vault.json b/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-vault-TermMax USDC Vault.json new file mode 100644 index 0000000..4084050 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-vault-TermMax USDC Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22186270", + "timestamp": "1743657771" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TermMax USDC Vault", + "address": "0x9170A095e7073559ffe1240ccF692Abb94F32a28", + "asset": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "performanceFeeRate": 10000000, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-vault-TermMax WETH Vault.json b/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-vault-TermMax WETH Vault.json new file mode 100644 index 0000000..7b33cbf --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250530/arb-mainnet-vault-TermMax WETH Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22182632", + "timestamp": "1743613861" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TermMax WETH Vault", + "address": "0xeBF448902145f65b4E1B3C4e3A269444e0213C9e", + "asset": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "performanceFeeRate": 10000000, + "maxCapacity": "500000000000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-20250530/deploy-arb-markets-20250530.txt b/deployments/arb-mainnet-v1.0.8-20250530/deploy-arb-markets-20250530.txt new file mode 100644 index 0000000..d34f3b0 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-20250530/deploy-arb-markets-20250530.txt @@ -0,0 +1,243 @@ +Running on arb-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: arb-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://arbi*****.gate*****.tend*****.co/agLs***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ARBSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xb2b014ea037e2ab91e91090a3d3afca9457b840b + + ===== Block Info ===== + Block number: 324770690 + Block timestamp: 1744254877 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 324770690 + + ===== Market Info - 0 ===== + Market deployed at: 0xcc60D097222f45538159D43681FBa4B1fD37DE97 + Market name: WETH/wstETH@30MAY2025 + Market symbol: WETH/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0xDd7049672aB42AF472D43849CBD25da619622f10 + XT deployed at: 0x39FDbccDD78dED330EdcF11dE4FFd805a7F69D5E + GT deployed at: 0xc9244551127b07f0964a4320C86129a7C5F0826b + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 30MAY2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-wstETH@30MAY2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xC62B23864c1e909868471bf72Cc457397BC52E13 + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0xdD6a46c4520eC02b0D3243bD43Eefc5aADcc329B + XT deployed at: 0xfc5AEdDE0155D3e5E5C8CA584795Bb4620DC670F + GT deployed at: 0xb0e34bB7a2A2bf475B14D3FFbB49F027C48529De + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 30MAY2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-wstETH@30MAY2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x49E11668EAc15896ecF5B31baeF63C98897D4263 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0xE9F18d347Fb782B7496d637D5EF5e8287d21Dd47 + XT deployed at: 0x1B28415e1490262Ad20842D718b3272501dF27Cd + GT deployed at: 0xF1e33c79809159014207c4662A9C1A8a44c67744 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 30MAY2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WBTC@30MAY2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xa93A81835DAb4AC07649506B88AF7eE6DDaD03Ba + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x60Cf9d67A072084f6891bf65E223DBa7E1182D6A + XT deployed at: 0x1761b7a22f13C8E32f15D650ACf73F07e3bE0C8A + GT deployed at: 0xa42B46Fd5Ad2fd38Edf6F8509D1702a16cFBC5b6 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 30MAY2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-weETH@30MAY2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x59e3D532727221ac3aeE2D6303cf3C39F1De65D7 + Market name: USDC/WETH@30MAY2025 + Market symbol: USDC/WETH@30MAY2025 + Collateral (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x56c574463b44dF7FaC5eCf650F1F66e640806a46 + XT deployed at: 0xD781f71b8D0B27a098f85bf532b9640CbDDdC565 + GT deployed at: 0x602F667B90Aac06ba269884e51Ff52E8723634C9 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 30MAY2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WETH@30MAY2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x79A4963f8b2f8d997908615352A44192Bc3D23e7 + Market name: USDC/ARB@30MAY2025 + Market symbol: USDC/ARB@30MAY2025 + Collateral (ARB) address: 0x912CE59144191C1204E64559FE8253a0e49E6548 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x4d924ee8d2201D7f4da0B4921Fd9d24CA912B7cD + XT deployed at: 0x7c7feD69BBdEEC00cBe381cE21BD97D2745857BA + GT deployed at: 0x34d324Ab749BE907f5d60FB58D05f58C9D401666 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 30MAY2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-ARB@30MAY2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0xA016DecA4AbdB8fd94BC221a5feB15BA3DB62031 + Market name: WETH/PT-weETH-26JUN2025@27JUN2025 + Market symbol: WETH/PT-weETH-26JUN2025@27JUN2025 + Collateral (PT-weETH-26JUN2025) address: 0xb33808ea0e883138680BA29311a220A7377cdb92 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x19a60ba0a5731eA9A6D2dBDf8e42Fa9412b27faa + XT deployed at: 0x4190aE2FF7716875104ffC1994323C43d65EF184 + GT deployed at: 0x10bC3066fb401131a4D5C58fF469f392988B0ffC + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 27JUN2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-PT-weETH-26JUN2025@27JUN2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 42161 + +Estimated gas price: 0.037730001 gwei + +Estimated total gas used for script: 10088133 + +Estimated amount required: 0.000380625268178133 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0xcc60d097222f45538159d43681fba4b1fd37de97, 0xdd7049672ab42af472d43849cbd25da619622f10, 0x39fdbccdd78ded330edcf11de4ffd805a7f69d5e, 0xc9244551127b07f0964a4320c86129a7c5f0826b, 0xc62b23864c1e909868471bf72cc457397bc52e13, 0xdd6a46c4520ec02b0d3243bd43eefc5aadcc329b, 0xfc5aedde0155d3e5e5c8ca584795bb4620dc670f, 0xb0e34bb7a2a2bf475b14d3ffbb49f027c48529de, 0x49e11668eac15896ecf5b31baef63c98897d4263, 0xe9f18d347fb782b7496d637d5ef5e8287d21dd47, 0x1b28415e1490262ad20842d718b3272501df27cd, 0xf1e33c79809159014207c4662a9c1a8a44c67744, 0xa93a81835dab4ac07649506b88af7ee6ddad03ba, 0x60cf9d67a072084f6891bf65e223dba7e1182d6a, 0x1761b7a22f13c8e32f15d650acf73f07e3be0c8a, 0xa42b46fd5ad2fd38edf6f8509d1702a16cfbc5b6, 0x59e3d532727221ac3aee2d6303cf3c39f1de65d7, 0x56c574463b44df7fac5ecf650f1f66e640806a46, 0xd781f71b8d0b27a098f85bf532b9640cbdddc565, 0x602f667b90aac06ba269884e51ff52e8723634c9, 0x79a4963f8b2f8d997908615352a44192bc3d23e7, 0x4d924ee8d2201d7f4da0b4921fd9d24ca912b7cd, 0x7c7fed69bbdeec00cbe381ce21bd97d2745857ba, 0x34d324ab749be907f5d60fb58d05f58c9d401666, 0xa016deca4abdb8fd94bc221a5feb15ba3db62031, 0x19a60ba0a5731ea9a6d2dbdf8e42fa9412b27faa, 0x4190ae2ff7716875104ffc1994323c43d65ef184, 0x10bc3066fb401131a4d5c58ff469f392988b0ffc]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/42161/run-latest.json + +[SUCCESS] market deployment to arb-mainnet completed successfully! diff --git a/deployments/arb-mainnet-v1.0.8-test-20250411-1500/accept-oracles-20250403-log.txt b/deployments/arb-mainnet-v1.0.8-test-20250411-1500/accept-oracles-20250403-log.txt new file mode 100644 index 0000000..2a93d96 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250411-1500/accept-oracles-20250403-log.txt @@ -0,0 +1,107 @@ +Running on arb-mainnet... +=== Configuration === +Operation: Script Execution +Network: arb-mainnet +Script: AcceptOracles.s.sol +Path: script/AcceptOracles.s.sol +RPC URL: http*****://arb-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Disabled +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xa669e7A0d4b3e4Fa48af2dE86BD4CD7126Be4e13 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting script execution... +Executing: forge script script/AcceptOracles.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow +No files changed, compilation skipped +Script ran successfully. + +== Logs == + === Checking Pending Oracles === + Oracle Aggregator Address: 0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa + Network: arb-mainnet + Current Block Timestamp: 1743663209 + + Accepted oracle for token: + Token Symbol: WETH + Token Address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: wstETH + Token Address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: USDC + Token Address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: WBTC + Token Address: 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: weETH + Token Address: 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: ARB + Token Address: 0x912CE59144191C1204E64559FE8253a0e49E6548 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: PT-weETH-26JUN2025 + Token Address: 0xb33808ea0e883138680BA29311a220A7377cdb92 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Heartbeat: 86400 + -------------------------------- + + === Oracle Acceptance Summary === + Total tokens checked: 7 + Oracles accepted: 7 + Oracles not ready: 0 + +## Setting up 1 EVM. + +========================== + +Chain 42161 + +Estimated gas price: 0.020000001 gwei + +Estimated total gas used for script: 914354 + +Estimated amount required: 0.000018287080914354 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/AcceptOracles.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/AcceptOracles.s.sol/42161/run-latest.json + +[SUCCESS] Script AcceptOracles executed successfully on arb-mainnet (Broadcast mode)! diff --git a/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-access-manager.json b/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-access-manager.json new file mode 100644 index 0000000..f75a2f5 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743606817", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182046", + "timestamp": "1743606817" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-core.json b/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-core.json new file mode 100644 index 0000000..435d898 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743608156", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182159", + "timestamp": "1743608156" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x14920Eb11b71873d01c93B589b40585dacfCA096", + "vaultFactory": "0x929CBcb8150aD59DB63c92A7dAEc07b30d38bA79", + "oracleAggregator": "0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa", + "router": "0x7fa333b184868d88aC78a82eC06d5e87d4B0322E", + "swapAdapter": { + "uniswapV3Adapter": "0x609F20ee24E10010A62970E1dAb7E2b84eD74CAb", + "odosV2Adapter": "0x7de4efa140E52B7207FA689D41AfEE461B83E748", + "pendleSwapV3Adapter": "0xb0eCCbaD4b4cc190261c29C6E8d85bcF04284a8b", + "ERC4626VaultAdapter": "0xa50929A67daF9Ff3567e2Bb3411204A134f72546" + }, + "marketViewer": "0x276C0E52508d94ff2D4106b1559c8c4Bc3a75dec" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-market-USDC-ARB@11APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-market-USDC-ARB@11APR2025.json new file mode 100644 index 0000000..758e845 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-market-USDC-ARB@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325149891", + "timestamp": "1744349799" + }, + "market": "0x36f8fFc69441EdF1f52b4b978Fd94ED8a9dAf737", + "collateral": { + "address": "0x912CE59144191C1204E64559FE8253a0e49E6548", + "symbol": "ARB", + "priceFeed": "0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xF09Ca86f5EF8b22bf7AfB9bC74A44a31EA6457e5", + "xt": "0xF0e6F190eb6b009981976185C09FF5c191C33717", + "gt": "0xa70856F585B871392db05c2E005A20A6e50b37E3" + }, + "config": { + "marketSymbol": "USDC/ARB@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-market-USDC-WBTC@11APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-market-USDC-WBTC@11APR2025.json new file mode 100644 index 0000000..dff47f7 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-market-USDC-WBTC@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325149891", + "timestamp": "1744349799" + }, + "market": "0x9ea78935DfCbE81EFdAB8870fdCD6D71a008e0f8", + "collateral": { + "address": "0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f", + "symbol": "WBTC", + "priceFeed": "0xd0C7101eACbB49F3deCcCc166d238410D6D46d57", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x71d87ddf465398080f56554E465bF43C84b0dA0B", + "xt": "0xc399cF5a4de10D0b872CBd112f8cc7c66d54D5d1", + "gt": "0x0BB62BFC1339BF59030C759Ea85a526e7975e390" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-market-USDC-WETH@11APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-market-USDC-WETH@11APR2025.json new file mode 100644 index 0000000..122215b --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-market-USDC-WETH@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325149891", + "timestamp": "1744349799" + }, + "market": "0xA0BD7680c5A8B8988Fb12F396BB8a0Bfbd6f4bA3", + "collateral": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x814Cc3F80034970D6aa1eDC2d0fd2B85825B6b0E", + "xt": "0x4adcFeaD3a554762A70Ba2F6D916aFf5d918Ec4b", + "gt": "0xff556658051bA66562179853f2eF5915aA2dD712" + }, + "config": { + "marketSymbol": "USDC/WETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-market-USDC-wstETH@11APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-market-USDC-wstETH@11APR2025.json new file mode 100644 index 0000000..d27337e --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-market-USDC-wstETH@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325149891", + "timestamp": "1744349799" + }, + "market": "0x2157B903582802F3E7562685CE2385D697cf593a", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xD9Cbf987a671097870654Cfdfb78d8F3b38BeEbC", + "xt": "0xb44aDdAc938B10EA7cda7d81FE4EA2ef58E3a65c", + "gt": "0xfC1775e4256B2a40DfDb9C92746d78ba06A47EBa" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-market-WETH-PT-weETH-26JUN2025@11APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-market-WETH-PT-weETH-26JUN2025@11APR2025.json new file mode 100644 index 0000000..231da22 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-market-WETH-PT-weETH-26JUN2025@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325149891", + "timestamp": "1744349799" + }, + "market": "0xd4B04EE3f32Cc9e7C8b91D76a801C925CEF125c3", + "collateral": { + "address": "0xb33808ea0e883138680BA29311a220A7377cdb92", + "symbol": "PT-weETH-26JUN2025", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x2774Fd4853736B0A6dCcb2fFb2DE72cCFAEb8482", + "xt": "0x55558cec4e1CC3ae4E657E0E454AC2CEbb5347e8", + "gt": "0x9c66Be7Aff46630144EE737CDA5518e491a2a35d" + }, + "config": { + "marketSymbol": "WETH/PT-weETH-26JUN2025@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-market-WETH-weETH@11APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-market-WETH-weETH@11APR2025.json new file mode 100644 index 0000000..1ae5c2f --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-market-WETH-weETH@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325149891", + "timestamp": "1744349799" + }, + "market": "0x85b5cFe61f8D989406b9f17Aa81c718DDdc9322A", + "collateral": { + "address": "0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe", + "symbol": "weETH", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x7B86B36ce1C227EC193AaA2cC3b8F1586348b570", + "xt": "0x64033a21B9874b953a9025cD7Ea19b56b9925E7a", + "gt": "0x7C23a5455Fed12661F84aa35B71Fd5fE243F0FEb" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-market-WETH-wstETH@11APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-market-WETH-wstETH@11APR2025.json new file mode 100644 index 0000000..b3d285b --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-market-WETH-wstETH@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325149891", + "timestamp": "1744349799" + }, + "market": "0x447d5ba6F9e3Ad8E3F8155Ef759E29f9DbE43C9A", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xf2F0Efd4aB75f44E93868874A4dbd4252147A000", + "xt": "0x17EB9733eb098493e10A4459aeD059D0daE85bEc", + "gt": "0x8b36cFd1B28ff385A7306a34f18fE04523D3C912" + }, + "config": { + "marketSymbol": "WETH/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-vault-TMX-USDC.json b/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-vault-TMX-USDC.json new file mode 100644 index 0000000..af05fff --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-vault-TMX-USDC.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "324633071", + "timestamp": "1744220329" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TMX-USDC", + "address": "0xc94b752839a22D2C44E99e298671dd4B2aDd11b3", + "asset": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "performanceFeeRate": 0, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-vault-TMX-WETH.json b/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-vault-TMX-WETH.json new file mode 100644 index 0000000..9177b68 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-vault-TMX-WETH.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "324634324", + "timestamp": "1744220643" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TMX-WETH", + "address": "0x8c5161f287Cbc9Afa48bC8972eE8CC0a755fcAdC", + "asset": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "performanceFeeRate": 0, + "maxCapacity": "5000000000000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-vault-TermMax USDC Vault.json b/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-vault-TermMax USDC Vault.json new file mode 100644 index 0000000..4084050 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-vault-TermMax USDC Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22186270", + "timestamp": "1743657771" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TermMax USDC Vault", + "address": "0x9170A095e7073559ffe1240ccF692Abb94F32a28", + "asset": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "performanceFeeRate": 10000000, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-vault-TermMax WETH Vault.json b/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-vault-TermMax WETH Vault.json new file mode 100644 index 0000000..7b33cbf --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250411-1500/arb-mainnet-vault-TermMax WETH Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22182632", + "timestamp": "1743613861" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TermMax WETH Vault", + "address": "0xeBF448902145f65b4E1B3C4e3A269444e0213C9e", + "asset": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "performanceFeeRate": 10000000, + "maxCapacity": "500000000000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250411-1500/deploy-arb-markets-test-0411-1500-log.txt b/deployments/arb-mainnet-v1.0.8-test-20250411-1500/deploy-arb-markets-test-0411-1500-log.txt new file mode 100644 index 0000000..fa52257 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250411-1500/deploy-arb-markets-test-0411-1500-log.txt @@ -0,0 +1,243 @@ +Running on arb-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: arb-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://arbi*****.gate*****.tend*****.co/agLs***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ARBSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0x8276d5d79cb2ee0475a52d58d6eaca7d4b30f877 + + ===== Block Info ===== + Block number: 325149891 + Block timestamp: 1744349799 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 325149891 + + ===== Market Info - 0 ===== + Market deployed at: 0x447d5ba6F9e3Ad8E3F8155Ef759E29f9DbE43C9A + Market name: WETH/wstETH@30MAY2025 + Market symbol: WETH/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0xf2F0Efd4aB75f44E93868874A4dbd4252147A000 + XT deployed at: 0x17EB9733eb098493e10A4459aeD059D0daE85bEc + GT deployed at: 0x8b36cFd1B28ff385A7306a34f18fE04523D3C912 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-wstETH@11APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0x2157B903582802F3E7562685CE2385D697cf593a + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0xD9Cbf987a671097870654Cfdfb78d8F3b38BeEbC + XT deployed at: 0xb44aDdAc938B10EA7cda7d81FE4EA2ef58E3a65c + GT deployed at: 0xfC1775e4256B2a40DfDb9C92746d78ba06A47EBa + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-wstETH@11APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x9ea78935DfCbE81EFdAB8870fdCD6D71a008e0f8 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x71d87ddf465398080f56554E465bF43C84b0dA0B + XT deployed at: 0xc399cF5a4de10D0b872CBd112f8cc7c66d54D5d1 + GT deployed at: 0x0BB62BFC1339BF59030C759Ea85a526e7975e390 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WBTC@11APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0x85b5cFe61f8D989406b9f17Aa81c718DDdc9322A + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x7B86B36ce1C227EC193AaA2cC3b8F1586348b570 + XT deployed at: 0x64033a21B9874b953a9025cD7Ea19b56b9925E7a + GT deployed at: 0x7C23a5455Fed12661F84aa35B71Fd5fE243F0FEb + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-weETH@11APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0xA0BD7680c5A8B8988Fb12F396BB8a0Bfbd6f4bA3 + Market name: USDC/WETH@30MAY2025 + Market symbol: USDC/WETH@30MAY2025 + Collateral (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x814Cc3F80034970D6aa1eDC2d0fd2B85825B6b0E + XT deployed at: 0x4adcFeaD3a554762A70Ba2F6D916aFf5d918Ec4b + GT deployed at: 0xff556658051bA66562179853f2eF5915aA2dD712 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WETH@11APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x36f8fFc69441EdF1f52b4b978Fd94ED8a9dAf737 + Market name: USDC/ARB@30MAY2025 + Market symbol: USDC/ARB@30MAY2025 + Collateral (ARB) address: 0x912CE59144191C1204E64559FE8253a0e49E6548 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0xF09Ca86f5EF8b22bf7AfB9bC74A44a31EA6457e5 + XT deployed at: 0xF0e6F190eb6b009981976185C09FF5c191C33717 + GT deployed at: 0xa70856F585B871392db05c2E005A20A6e50b37E3 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-ARB@11APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0xd4B04EE3f32Cc9e7C8b91D76a801C925CEF125c3 + Market name: WETH/PT-weETH-26JUN2025@27JUN2025 + Market symbol: WETH/PT-weETH-26JUN2025@27JUN2025 + Collateral (PT-weETH-26JUN2025) address: 0xb33808ea0e883138680BA29311a220A7377cdb92 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x2774Fd4853736B0A6dCcb2fFb2DE72cCFAEb8482 + XT deployed at: 0x55558cec4e1CC3ae4E657E0E454AC2CEbb5347e8 + GT deployed at: 0x9c66Be7Aff46630144EE737CDA5518e491a2a35d + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-PT-weETH-26JUN2025@11APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 42161 + +Estimated gas price: 0.020000001 gwei + +Estimated total gas used for script: 10134099 + +Estimated amount required: 0.000202681990134099 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x447d5ba6f9e3ad8e3f8155ef759e29f9dbe43c9a, 0xf2f0efd4ab75f44e93868874a4dbd4252147a000, 0x17eb9733eb098493e10a4459aed059d0dae85bec, 0x8b36cfd1b28ff385a7306a34f18fe04523d3c912, 0x2157b903582802f3e7562685ce2385d697cf593a, 0xd9cbf987a671097870654cfdfb78d8f3b38beebc, 0xb44addac938b10ea7cda7d81fe4ea2ef58e3a65c, 0xfc1775e4256b2a40dfdb9c92746d78ba06a47eba, 0x9ea78935dfcbe81efdab8870fdcd6d71a008e0f8, 0x71d87ddf465398080f56554e465bf43c84b0da0b, 0xc399cf5a4de10d0b872cbd112f8cc7c66d54d5d1, 0x0bb62bfc1339bf59030c759ea85a526e7975e390, 0x85b5cfe61f8d989406b9f17aa81c718dddc9322a, 0x7b86b36ce1c227ec193aaa2cc3b8f1586348b570, 0x64033a21b9874b953a9025cd7ea19b56b9925e7a, 0x7c23a5455fed12661f84aa35b71fd5fe243f0feb, 0xa0bd7680c5a8b8988fb12f396bb8a0bfbd6f4ba3, 0x814cc3f80034970d6aa1edc2d0fd2b85825b6b0e, 0x4adcfead3a554762a70ba2f6d916aff5d918ec4b, 0xff556658051ba66562179853f2ef5915aa2dd712, 0x36f8ffc69441edf1f52b4b978fd94ed8a9daf737, 0xf09ca86f5ef8b22bf7afb9bc74a44a31ea6457e5, 0xf0e6f190eb6b009981976185c09ff5c191c33717, 0xa70856f585b871392db05c2e005a20a6e50b37e3, 0xd4b04ee3f32cc9e7c8b91d76a801c925cef125c3, 0x2774fd4853736b0a6dccb2ffb2de72ccfaeb8482, 0x55558cec4e1cc3ae4e657e0e454ac2cebb5347e8, 0x9c66be7aff46630144ee737cda5518e491a2a35d]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/42161/run-latest.json + +[SUCCESS] market deployment to arb-mainnet completed successfully! diff --git a/deployments/arb-mainnet-v1.0.8-test-20250411-2000/accept-oracles-20250403-log.txt b/deployments/arb-mainnet-v1.0.8-test-20250411-2000/accept-oracles-20250403-log.txt new file mode 100644 index 0000000..2a93d96 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250411-2000/accept-oracles-20250403-log.txt @@ -0,0 +1,107 @@ +Running on arb-mainnet... +=== Configuration === +Operation: Script Execution +Network: arb-mainnet +Script: AcceptOracles.s.sol +Path: script/AcceptOracles.s.sol +RPC URL: http*****://arb-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Disabled +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xa669e7A0d4b3e4Fa48af2dE86BD4CD7126Be4e13 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting script execution... +Executing: forge script script/AcceptOracles.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow +No files changed, compilation skipped +Script ran successfully. + +== Logs == + === Checking Pending Oracles === + Oracle Aggregator Address: 0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa + Network: arb-mainnet + Current Block Timestamp: 1743663209 + + Accepted oracle for token: + Token Symbol: WETH + Token Address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: wstETH + Token Address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: USDC + Token Address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: WBTC + Token Address: 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: weETH + Token Address: 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: ARB + Token Address: 0x912CE59144191C1204E64559FE8253a0e49E6548 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: PT-weETH-26JUN2025 + Token Address: 0xb33808ea0e883138680BA29311a220A7377cdb92 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Heartbeat: 86400 + -------------------------------- + + === Oracle Acceptance Summary === + Total tokens checked: 7 + Oracles accepted: 7 + Oracles not ready: 0 + +## Setting up 1 EVM. + +========================== + +Chain 42161 + +Estimated gas price: 0.020000001 gwei + +Estimated total gas used for script: 914354 + +Estimated amount required: 0.000018287080914354 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/AcceptOracles.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/AcceptOracles.s.sol/42161/run-latest.json + +[SUCCESS] Script AcceptOracles executed successfully on arb-mainnet (Broadcast mode)! diff --git a/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-access-manager.json b/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-access-manager.json new file mode 100644 index 0000000..f75a2f5 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743606817", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182046", + "timestamp": "1743606817" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-core.json b/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-core.json new file mode 100644 index 0000000..435d898 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743608156", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182159", + "timestamp": "1743608156" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x14920Eb11b71873d01c93B589b40585dacfCA096", + "vaultFactory": "0x929CBcb8150aD59DB63c92A7dAEc07b30d38bA79", + "oracleAggregator": "0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa", + "router": "0x7fa333b184868d88aC78a82eC06d5e87d4B0322E", + "swapAdapter": { + "uniswapV3Adapter": "0x609F20ee24E10010A62970E1dAb7E2b84eD74CAb", + "odosV2Adapter": "0x7de4efa140E52B7207FA689D41AfEE461B83E748", + "pendleSwapV3Adapter": "0xb0eCCbaD4b4cc190261c29C6E8d85bcF04284a8b", + "ERC4626VaultAdapter": "0xa50929A67daF9Ff3567e2Bb3411204A134f72546" + }, + "marketViewer": "0x276C0E52508d94ff2D4106b1559c8c4Bc3a75dec" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-market-USDC-ARB@11APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-market-USDC-ARB@11APR2025.json new file mode 100644 index 0000000..f014a26 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-market-USDC-ARB@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325151570", + "timestamp": "1744350219" + }, + "market": "0xC9F2352aEcB12632a43126a2408C9841a43eE1ea", + "collateral": { + "address": "0x912CE59144191C1204E64559FE8253a0e49E6548", + "symbol": "ARB", + "priceFeed": "0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xED97598a7Cee1bbe2802bcef15CB74fCe29FeFf2", + "xt": "0x0B182c45F1296EFd23433a473a8f4C513cf51f70", + "gt": "0xd725F92C42133f3ba4B5cDB3a99b2113FD231Ff0" + }, + "config": { + "marketSymbol": "USDC/ARB@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-market-USDC-WBTC@11APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-market-USDC-WBTC@11APR2025.json new file mode 100644 index 0000000..2caa54a --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-market-USDC-WBTC@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325151570", + "timestamp": "1744350219" + }, + "market": "0xB1aa1Bf2971199f19F48828533bc3f30D5b8B27f", + "collateral": { + "address": "0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f", + "symbol": "WBTC", + "priceFeed": "0xd0C7101eACbB49F3deCcCc166d238410D6D46d57", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x82EFA0dEdE8656a8D2363548a74321F0A802a0B7", + "xt": "0x8C488f42dCE530735E1D1B20CA3981a2eA165f07", + "gt": "0x6C865Eb499225F2d472B91E9aF19353cAf1344D7" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-market-USDC-WETH@11APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-market-USDC-WETH@11APR2025.json new file mode 100644 index 0000000..e17b7c3 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-market-USDC-WETH@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325151570", + "timestamp": "1744350219" + }, + "market": "0x53F529923d3b122bCe02249a961Ad128549613fd", + "collateral": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x45FD84bF71c79649eC13a37d8A18213845d88bfF", + "xt": "0x6C2CA7752E179cb7C84871FFAee09C0C9B0a6079", + "gt": "0x4B07298c4870322cBD9aDB6C491c4D67a32AF81d" + }, + "config": { + "marketSymbol": "USDC/WETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-market-USDC-wstETH@11APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-market-USDC-wstETH@11APR2025.json new file mode 100644 index 0000000..b265b05 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-market-USDC-wstETH@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325151570", + "timestamp": "1744350219" + }, + "market": "0x082B417692a2983dF2baF57D4baF5B18d0e39D84", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x729882074d89692b582464801044dB6b07A655AA", + "xt": "0xd8D2558cd04e7ea3b538A4f262d8F862cf61dF8B", + "gt": "0x3cBe84B3de1fe3287df900a844b117707a2e362C" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@11APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@11APR2025.json new file mode 100644 index 0000000..7dd4d91 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325151570", + "timestamp": "1744350219" + }, + "market": "0x328F2F1525C5AAbd5535439A59A0C263fa9200C7", + "collateral": { + "address": "0xb33808ea0e883138680BA29311a220A7377cdb92", + "symbol": "PT-weETH-26JUN2025", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x43F64C850D6C33f88c6aFb512973ab002bCE4fE5", + "xt": "0x1024D1F26920E7419679D612F159826115196D9f", + "gt": "0x0C87E3c399A3D719219E8511CdD9c9CC2630B632" + }, + "config": { + "marketSymbol": "WETH/PT-weETH-26JUN2025@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-market-WETH-weETH@11APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-market-WETH-weETH@11APR2025.json new file mode 100644 index 0000000..c2e6c48 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-market-WETH-weETH@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325151570", + "timestamp": "1744350219" + }, + "market": "0x32f5aBB7ee2F1a49a0497De6D712FFf04Bfe68f6", + "collateral": { + "address": "0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe", + "symbol": "weETH", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x1ef03aD3e847303Aa8f465a716E474666Bc64B66", + "xt": "0x85189787cf75629A35c3f0Ae6729bdFEA6fC93ad", + "gt": "0x80Ad699E85F78a50Cc7Fcf52e8dd15B97a426eEF" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-market-WETH-wstETH@11APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-market-WETH-wstETH@11APR2025.json new file mode 100644 index 0000000..9f6e829 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-market-WETH-wstETH@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325151570", + "timestamp": "1744350219" + }, + "market": "0xDF89891c8fccaA682266170406Fa00158552B30E", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x6dBD3e2fe29FEa64e3218971Fa0a656e7C873174", + "xt": "0xBEECd0eD11c6dC81B0A20B75aE4dCB7ECb4fFFe1", + "gt": "0x0b3381731b9D74F29d144B3ED5Cc3106E30345dB" + }, + "config": { + "marketSymbol": "WETH/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-vault-TMX-USDC.json b/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-vault-TMX-USDC.json new file mode 100644 index 0000000..af05fff --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-vault-TMX-USDC.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "324633071", + "timestamp": "1744220329" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TMX-USDC", + "address": "0xc94b752839a22D2C44E99e298671dd4B2aDd11b3", + "asset": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "performanceFeeRate": 0, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-vault-TMX-WETH.json b/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-vault-TMX-WETH.json new file mode 100644 index 0000000..9177b68 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-vault-TMX-WETH.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "324634324", + "timestamp": "1744220643" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TMX-WETH", + "address": "0x8c5161f287Cbc9Afa48bC8972eE8CC0a755fcAdC", + "asset": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "performanceFeeRate": 0, + "maxCapacity": "5000000000000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-vault-TermMax USDC Vault.json b/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-vault-TermMax USDC Vault.json new file mode 100644 index 0000000..4084050 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-vault-TermMax USDC Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22186270", + "timestamp": "1743657771" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TermMax USDC Vault", + "address": "0x9170A095e7073559ffe1240ccF692Abb94F32a28", + "asset": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "performanceFeeRate": 10000000, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-vault-TermMax WETH Vault.json b/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-vault-TermMax WETH Vault.json new file mode 100644 index 0000000..7b33cbf --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250411-2000/arb-mainnet-vault-TermMax WETH Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22182632", + "timestamp": "1743613861" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TermMax WETH Vault", + "address": "0xeBF448902145f65b4E1B3C4e3A269444e0213C9e", + "asset": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "performanceFeeRate": 10000000, + "maxCapacity": "500000000000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250411-2000/deploy-arb-markets-test-0411-2000-log.txt b/deployments/arb-mainnet-v1.0.8-test-20250411-2000/deploy-arb-markets-test-0411-2000-log.txt new file mode 100644 index 0000000..281614a --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250411-2000/deploy-arb-markets-test-0411-2000-log.txt @@ -0,0 +1,243 @@ +Running on arb-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: arb-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://arbi*****.gate*****.tend*****.co/agLs***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ARBSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0x8276d5d79cb2ee0475a52d58d6eaca7d4b30f877 + + ===== Block Info ===== + Block number: 325151570 + Block timestamp: 1744350219 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 325151570 + + ===== Market Info - 0 ===== + Market deployed at: 0xDF89891c8fccaA682266170406Fa00158552B30E + Market name: WETH/wstETH@30MAY2025 + Market symbol: WETH/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x6dBD3e2fe29FEa64e3218971Fa0a656e7C873174 + XT deployed at: 0xBEECd0eD11c6dC81B0A20B75aE4dCB7ECb4fFFe1 + GT deployed at: 0x0b3381731b9D74F29d144B3ED5Cc3106E30345dB + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-wstETH@11APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0x082B417692a2983dF2baF57D4baF5B18d0e39D84 + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x729882074d89692b582464801044dB6b07A655AA + XT deployed at: 0xd8D2558cd04e7ea3b538A4f262d8F862cf61dF8B + GT deployed at: 0x3cBe84B3de1fe3287df900a844b117707a2e362C + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-wstETH@11APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0xB1aa1Bf2971199f19F48828533bc3f30D5b8B27f + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x82EFA0dEdE8656a8D2363548a74321F0A802a0B7 + XT deployed at: 0x8C488f42dCE530735E1D1B20CA3981a2eA165f07 + GT deployed at: 0x6C865Eb499225F2d472B91E9aF19353cAf1344D7 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WBTC@11APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0x32f5aBB7ee2F1a49a0497De6D712FFf04Bfe68f6 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x1ef03aD3e847303Aa8f465a716E474666Bc64B66 + XT deployed at: 0x85189787cf75629A35c3f0Ae6729bdFEA6fC93ad + GT deployed at: 0x80Ad699E85F78a50Cc7Fcf52e8dd15B97a426eEF + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-weETH@11APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x53F529923d3b122bCe02249a961Ad128549613fd + Market name: USDC/WETH@30MAY2025 + Market symbol: USDC/WETH@30MAY2025 + Collateral (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x45FD84bF71c79649eC13a37d8A18213845d88bfF + XT deployed at: 0x6C2CA7752E179cb7C84871FFAee09C0C9B0a6079 + GT deployed at: 0x4B07298c4870322cBD9aDB6C491c4D67a32AF81d + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WETH@11APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0xC9F2352aEcB12632a43126a2408C9841a43eE1ea + Market name: USDC/ARB@30MAY2025 + Market symbol: USDC/ARB@30MAY2025 + Collateral (ARB) address: 0x912CE59144191C1204E64559FE8253a0e49E6548 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0xED97598a7Cee1bbe2802bcef15CB74fCe29FeFf2 + XT deployed at: 0x0B182c45F1296EFd23433a473a8f4C513cf51f70 + GT deployed at: 0xd725F92C42133f3ba4B5cDB3a99b2113FD231Ff0 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-ARB@11APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x328F2F1525C5AAbd5535439A59A0C263fa9200C7 + Market name: WETH/PT-weETH-26JUN2025@27JUN2025 + Market symbol: WETH/PT-weETH-26JUN2025@27JUN2025 + Collateral (PT-weETH-26JUN2025) address: 0xb33808ea0e883138680BA29311a220A7377cdb92 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x43F64C850D6C33f88c6aFb512973ab002bCE4fE5 + XT deployed at: 0x1024D1F26920E7419679D612F159826115196D9f + GT deployed at: 0x0C87E3c399A3D719219E8511CdD9c9CC2630B632 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-PT-weETH-26JUN2025@11APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 42161 + +Estimated gas price: 0.020000001 gwei + +Estimated total gas used for script: 10158983 + +Estimated amount required: 0.000203179670158983 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0xdf89891c8fccaa682266170406fa00158552b30e, 0x6dbd3e2fe29fea64e3218971fa0a656e7c873174, 0xbeecd0ed11c6dc81b0a20b75ae4dcb7ecb4fffe1, 0x0b3381731b9d74f29d144b3ed5cc3106e30345db, 0x082b417692a2983df2baf57d4baf5b18d0e39d84, 0x729882074d89692b582464801044db6b07a655aa, 0xd8d2558cd04e7ea3b538a4f262d8f862cf61df8b, 0x3cbe84b3de1fe3287df900a844b117707a2e362c, 0xb1aa1bf2971199f19f48828533bc3f30d5b8b27f, 0x82efa0dede8656a8d2363548a74321f0a802a0b7, 0x8c488f42dce530735e1d1b20ca3981a2ea165f07, 0x6c865eb499225f2d472b91e9af19353caf1344d7, 0x32f5abb7ee2f1a49a0497de6d712fff04bfe68f6, 0x1ef03ad3e847303aa8f465a716e474666bc64b66, 0x85189787cf75629a35c3f0ae6729bdfea6fc93ad, 0x80ad699e85f78a50cc7fcf52e8dd15b97a426eef, 0x53f529923d3b122bce02249a961ad128549613fd, 0x45fd84bf71c79649ec13a37d8a18213845d88bff, 0x6c2ca7752e179cb7c84871ffaee09c0c9b0a6079, 0x4b07298c4870322cbd9adb6c491c4d67a32af81d, 0xc9f2352aecb12632a43126a2408c9841a43ee1ea, 0xed97598a7cee1bbe2802bcef15cb74fce29feff2, 0x0b182c45f1296efd23433a473a8f4c513cf51f70, 0xd725f92c42133f3ba4b5cdb3a99b2113fd231ff0, 0x328f2f1525c5aabd5535439a59a0c263fa9200c7, 0x43f64c850d6c33f88c6afb512973ab002bce4fe5, 0x1024d1f26920e7419679d612f159826115196d9f, 0x0c87e3c399a3d719219e8511cdd9c9cc2630b632]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/42161/run-latest.json + +[SUCCESS] market deployment to arb-mainnet completed successfully! diff --git a/deployments/arb-mainnet-v1.0.8-test-20250412-1500/accept-oracles-20250403-log.txt b/deployments/arb-mainnet-v1.0.8-test-20250412-1500/accept-oracles-20250403-log.txt new file mode 100644 index 0000000..2a93d96 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250412-1500/accept-oracles-20250403-log.txt @@ -0,0 +1,107 @@ +Running on arb-mainnet... +=== Configuration === +Operation: Script Execution +Network: arb-mainnet +Script: AcceptOracles.s.sol +Path: script/AcceptOracles.s.sol +RPC URL: http*****://arb-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Disabled +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xa669e7A0d4b3e4Fa48af2dE86BD4CD7126Be4e13 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting script execution... +Executing: forge script script/AcceptOracles.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow +No files changed, compilation skipped +Script ran successfully. + +== Logs == + === Checking Pending Oracles === + Oracle Aggregator Address: 0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa + Network: arb-mainnet + Current Block Timestamp: 1743663209 + + Accepted oracle for token: + Token Symbol: WETH + Token Address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: wstETH + Token Address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: USDC + Token Address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: WBTC + Token Address: 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: weETH + Token Address: 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: ARB + Token Address: 0x912CE59144191C1204E64559FE8253a0e49E6548 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: PT-weETH-26JUN2025 + Token Address: 0xb33808ea0e883138680BA29311a220A7377cdb92 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Heartbeat: 86400 + -------------------------------- + + === Oracle Acceptance Summary === + Total tokens checked: 7 + Oracles accepted: 7 + Oracles not ready: 0 + +## Setting up 1 EVM. + +========================== + +Chain 42161 + +Estimated gas price: 0.020000001 gwei + +Estimated total gas used for script: 914354 + +Estimated amount required: 0.000018287080914354 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/AcceptOracles.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/AcceptOracles.s.sol/42161/run-latest.json + +[SUCCESS] Script AcceptOracles executed successfully on arb-mainnet (Broadcast mode)! diff --git a/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-access-manager.json b/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-access-manager.json new file mode 100644 index 0000000..f75a2f5 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743606817", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182046", + "timestamp": "1743606817" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-core.json b/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-core.json new file mode 100644 index 0000000..435d898 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743608156", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182159", + "timestamp": "1743608156" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x14920Eb11b71873d01c93B589b40585dacfCA096", + "vaultFactory": "0x929CBcb8150aD59DB63c92A7dAEc07b30d38bA79", + "oracleAggregator": "0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa", + "router": "0x7fa333b184868d88aC78a82eC06d5e87d4B0322E", + "swapAdapter": { + "uniswapV3Adapter": "0x609F20ee24E10010A62970E1dAb7E2b84eD74CAb", + "odosV2Adapter": "0x7de4efa140E52B7207FA689D41AfEE461B83E748", + "pendleSwapV3Adapter": "0xb0eCCbaD4b4cc190261c29C6E8d85bcF04284a8b", + "ERC4626VaultAdapter": "0xa50929A67daF9Ff3567e2Bb3411204A134f72546" + }, + "marketViewer": "0x276C0E52508d94ff2D4106b1559c8c4Bc3a75dec" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-market-USDC-ARB@12APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-market-USDC-ARB@12APR2025.json new file mode 100644 index 0000000..2c2a24a --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-market-USDC-ARB@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325153499", + "timestamp": "1744350702" + }, + "market": "0xBA6D2FcCA88E1aD3594202b2d59aCfBAACe48065", + "collateral": { + "address": "0x912CE59144191C1204E64559FE8253a0e49E6548", + "symbol": "ARB", + "priceFeed": "0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xb3b0E40362Ec1F2BEb3aBcd9a73De22616FFe696", + "xt": "0x865577f73CCC60D9009e6D101b0F66B6077DDF93", + "gt": "0x536900f59384e3269aB6a902a2000FBCE969C55B" + }, + "config": { + "marketSymbol": "USDC/ARB@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-market-USDC-WBTC@12APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-market-USDC-WBTC@12APR2025.json new file mode 100644 index 0000000..8eaaaa3 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-market-USDC-WBTC@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325153499", + "timestamp": "1744350702" + }, + "market": "0xccd3e263bB1beC696E75Fd86a6d1F59777D1b1be", + "collateral": { + "address": "0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f", + "symbol": "WBTC", + "priceFeed": "0xd0C7101eACbB49F3deCcCc166d238410D6D46d57", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x272DD113247b61175eFb01a5b0FeE771598f7c08", + "xt": "0x11F7f9517eDf2aEE3cBC26F012dC11069749a524", + "gt": "0x8b0880b4f5C385B5e1DfC2CAC9e2D11B636c2A74" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-market-USDC-WETH@12APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-market-USDC-WETH@12APR2025.json new file mode 100644 index 0000000..cc4c200 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-market-USDC-WETH@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325153499", + "timestamp": "1744350702" + }, + "market": "0x0f44f0045eCb773f42785513Cc77AC15AAeBe9De", + "collateral": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x435b5FA350D56E69eb8ad6bA0e684A7B83655bBD", + "xt": "0x3404f3358792b5342A68228BA401ad5c97e7dC68", + "gt": "0xbC3d90b34f0a7Ea5fbF0cf1332A2Ba3F6bbfe055" + }, + "config": { + "marketSymbol": "USDC/WETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-market-USDC-wstETH@12APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-market-USDC-wstETH@12APR2025.json new file mode 100644 index 0000000..c1d6071 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-market-USDC-wstETH@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325153499", + "timestamp": "1744350702" + }, + "market": "0x226Bb027F57913efD1D1d84984A6a7436F09E371", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x24471a05c423bfe0720Eb7A66D6C9711F472C467", + "xt": "0x9d24Deb957EE67e7911bf74ed8247B6D3D3B819f", + "gt": "0x5b1e4fA44ad0E3645e6AA7Bf7eB886Df713d509c" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-market-WETH-PT-weETH-26JUN2025@12APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-market-WETH-PT-weETH-26JUN2025@12APR2025.json new file mode 100644 index 0000000..423d205 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-market-WETH-PT-weETH-26JUN2025@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325153499", + "timestamp": "1744350702" + }, + "market": "0x323F04176547A62ad0d31Aab153180a7bF06246b", + "collateral": { + "address": "0xb33808ea0e883138680BA29311a220A7377cdb92", + "symbol": "PT-weETH-26JUN2025", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x0b961Ca70A8432e3f2c9CF05B9101341D199B110", + "xt": "0xe86c7Ab2feA926Eb5D550D10305cc04355223f5a", + "gt": "0x22b7f00759e599AdFFA71f0A3Ebe2b2DBFb2d49A" + }, + "config": { + "marketSymbol": "WETH/PT-weETH-26JUN2025@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-market-WETH-weETH@12APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-market-WETH-weETH@12APR2025.json new file mode 100644 index 0000000..9b97a99 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-market-WETH-weETH@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325153499", + "timestamp": "1744350702" + }, + "market": "0x4Db3E6D2a025a1aC6D20d1f90e4e0f636D14d4D4", + "collateral": { + "address": "0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe", + "symbol": "weETH", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x4B8E353D2Aa9fBaEbcBb5ceA934611823c699E15", + "xt": "0x2224BA35C2Ec03974ff310ED5e9542c62384465F", + "gt": "0x26cbD6B9cC6eC5DE77D85e0D69Bc216adcA4B1b4" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-market-WETH-wstETH@12APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-market-WETH-wstETH@12APR2025.json new file mode 100644 index 0000000..16a192a --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-market-WETH-wstETH@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325153499", + "timestamp": "1744350702" + }, + "market": "0x8eF545Af5c174D33Cd75eB142A279414fDC69A98", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x148678346f8B3687d456CC153aE5DDAFD130b995", + "xt": "0xc36e3340643D4cF593F2ce40daFE7cFC42d098f5", + "gt": "0xE14c0c08dB7314Ebe4C2a474Fc7C451548b5ebF9" + }, + "config": { + "marketSymbol": "WETH/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-vault-TMX-USDC.json b/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-vault-TMX-USDC.json new file mode 100644 index 0000000..af05fff --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-vault-TMX-USDC.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "324633071", + "timestamp": "1744220329" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TMX-USDC", + "address": "0xc94b752839a22D2C44E99e298671dd4B2aDd11b3", + "asset": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "performanceFeeRate": 0, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-vault-TMX-WETH.json b/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-vault-TMX-WETH.json new file mode 100644 index 0000000..9177b68 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-vault-TMX-WETH.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "324634324", + "timestamp": "1744220643" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TMX-WETH", + "address": "0x8c5161f287Cbc9Afa48bC8972eE8CC0a755fcAdC", + "asset": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "performanceFeeRate": 0, + "maxCapacity": "5000000000000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-vault-TermMax USDC Vault.json b/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-vault-TermMax USDC Vault.json new file mode 100644 index 0000000..4084050 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-vault-TermMax USDC Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22186270", + "timestamp": "1743657771" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TermMax USDC Vault", + "address": "0x9170A095e7073559ffe1240ccF692Abb94F32a28", + "asset": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "performanceFeeRate": 10000000, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-vault-TermMax WETH Vault.json b/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-vault-TermMax WETH Vault.json new file mode 100644 index 0000000..7b33cbf --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250412-1500/arb-mainnet-vault-TermMax WETH Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22182632", + "timestamp": "1743613861" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TermMax WETH Vault", + "address": "0xeBF448902145f65b4E1B3C4e3A269444e0213C9e", + "asset": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "performanceFeeRate": 10000000, + "maxCapacity": "500000000000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250412-1500/deploy-arb-markets-test-0412-1500-log.txt b/deployments/arb-mainnet-v1.0.8-test-20250412-1500/deploy-arb-markets-test-0412-1500-log.txt new file mode 100644 index 0000000..d8c2b37 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250412-1500/deploy-arb-markets-test-0412-1500-log.txt @@ -0,0 +1,243 @@ +Running on arb-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: arb-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://arbi*****.gate*****.tend*****.co/agLs***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ARBSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0x8276d5d79cb2ee0475a52d58d6eaca7d4b30f877 + + ===== Block Info ===== + Block number: 325153499 + Block timestamp: 1744350702 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 325153499 + + ===== Market Info - 0 ===== + Market deployed at: 0x8eF545Af5c174D33Cd75eB142A279414fDC69A98 + Market name: WETH/wstETH@30MAY2025 + Market symbol: WETH/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x148678346f8B3687d456CC153aE5DDAFD130b995 + XT deployed at: 0xc36e3340643D4cF593F2ce40daFE7cFC42d098f5 + GT deployed at: 0xE14c0c08dB7314Ebe4C2a474Fc7C451548b5ebF9 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-wstETH@12APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0x226Bb027F57913efD1D1d84984A6a7436F09E371 + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x24471a05c423bfe0720Eb7A66D6C9711F472C467 + XT deployed at: 0x9d24Deb957EE67e7911bf74ed8247B6D3D3B819f + GT deployed at: 0x5b1e4fA44ad0E3645e6AA7Bf7eB886Df713d509c + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-wstETH@12APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0xccd3e263bB1beC696E75Fd86a6d1F59777D1b1be + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x272DD113247b61175eFb01a5b0FeE771598f7c08 + XT deployed at: 0x11F7f9517eDf2aEE3cBC26F012dC11069749a524 + GT deployed at: 0x8b0880b4f5C385B5e1DfC2CAC9e2D11B636c2A74 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WBTC@12APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0x4Db3E6D2a025a1aC6D20d1f90e4e0f636D14d4D4 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x4B8E353D2Aa9fBaEbcBb5ceA934611823c699E15 + XT deployed at: 0x2224BA35C2Ec03974ff310ED5e9542c62384465F + GT deployed at: 0x26cbD6B9cC6eC5DE77D85e0D69Bc216adcA4B1b4 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-weETH@12APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x0f44f0045eCb773f42785513Cc77AC15AAeBe9De + Market name: USDC/WETH@30MAY2025 + Market symbol: USDC/WETH@30MAY2025 + Collateral (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x435b5FA350D56E69eb8ad6bA0e684A7B83655bBD + XT deployed at: 0x3404f3358792b5342A68228BA401ad5c97e7dC68 + GT deployed at: 0xbC3d90b34f0a7Ea5fbF0cf1332A2Ba3F6bbfe055 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WETH@12APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0xBA6D2FcCA88E1aD3594202b2d59aCfBAACe48065 + Market name: USDC/ARB@30MAY2025 + Market symbol: USDC/ARB@30MAY2025 + Collateral (ARB) address: 0x912CE59144191C1204E64559FE8253a0e49E6548 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0xb3b0E40362Ec1F2BEb3aBcd9a73De22616FFe696 + XT deployed at: 0x865577f73CCC60D9009e6D101b0F66B6077DDF93 + GT deployed at: 0x536900f59384e3269aB6a902a2000FBCE969C55B + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-ARB@12APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x323F04176547A62ad0d31Aab153180a7bF06246b + Market name: WETH/PT-weETH-26JUN2025@27JUN2025 + Market symbol: WETH/PT-weETH-26JUN2025@27JUN2025 + Collateral (PT-weETH-26JUN2025) address: 0xb33808ea0e883138680BA29311a220A7377cdb92 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x0b961Ca70A8432e3f2c9CF05B9101341D199B110 + XT deployed at: 0xe86c7Ab2feA926Eb5D550D10305cc04355223f5a + GT deployed at: 0x22b7f00759e599AdFFA71f0A3Ebe2b2DBFb2d49A + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-PT-weETH-26JUN2025@12APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 42161 + +Estimated gas price: 0.020000001 gwei + +Estimated total gas used for script: 10137940 + +Estimated amount required: 0.00020275881013794 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x8ef545af5c174d33cd75eb142a279414fdc69a98, 0x148678346f8b3687d456cc153ae5ddafd130b995, 0xc36e3340643d4cf593f2ce40dafe7cfc42d098f5, 0xe14c0c08db7314ebe4c2a474fc7c451548b5ebf9, 0x226bb027f57913efd1d1d84984a6a7436f09e371, 0x24471a05c423bfe0720eb7a66d6c9711f472c467, 0x9d24deb957ee67e7911bf74ed8247b6d3d3b819f, 0x5b1e4fa44ad0e3645e6aa7bf7eb886df713d509c, 0xccd3e263bb1bec696e75fd86a6d1f59777d1b1be, 0x272dd113247b61175efb01a5b0fee771598f7c08, 0x11f7f9517edf2aee3cbc26f012dc11069749a524, 0x8b0880b4f5c385b5e1dfc2cac9e2d11b636c2a74, 0x4db3e6d2a025a1ac6d20d1f90e4e0f636d14d4d4, 0x4b8e353d2aa9fbaebcbb5cea934611823c699e15, 0x2224ba35c2ec03974ff310ed5e9542c62384465f, 0x26cbd6b9cc6ec5de77d85e0d69bc216adca4b1b4, 0x0f44f0045ecb773f42785513cc77ac15aaebe9de, 0x435b5fa350d56e69eb8ad6ba0e684a7b83655bbd, 0x3404f3358792b5342a68228ba401ad5c97e7dc68, 0xbc3d90b34f0a7ea5fbf0cf1332a2ba3f6bbfe055, 0xba6d2fcca88e1ad3594202b2d59acfbaace48065, 0xb3b0e40362ec1f2beb3abcd9a73de22616ffe696, 0x865577f73ccc60d9009e6d101b0f66b6077ddf93, 0x536900f59384e3269ab6a902a2000fbce969c55b, 0x323f04176547a62ad0d31aab153180a7bf06246b, 0x0b961ca70a8432e3f2c9cf05b9101341d199b110, 0xe86c7ab2fea926eb5d550d10305cc04355223f5a, 0x22b7f00759e599adffa71f0a3ebe2b2dbfb2d49a]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/42161/run-latest.json + +[SUCCESS] market deployment to arb-mainnet completed successfully! diff --git a/deployments/arb-mainnet-v1.0.8-test-20250412-2000/accept-oracles-20250403-log.txt b/deployments/arb-mainnet-v1.0.8-test-20250412-2000/accept-oracles-20250403-log.txt new file mode 100644 index 0000000..2a93d96 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250412-2000/accept-oracles-20250403-log.txt @@ -0,0 +1,107 @@ +Running on arb-mainnet... +=== Configuration === +Operation: Script Execution +Network: arb-mainnet +Script: AcceptOracles.s.sol +Path: script/AcceptOracles.s.sol +RPC URL: http*****://arb-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Disabled +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xa669e7A0d4b3e4Fa48af2dE86BD4CD7126Be4e13 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting script execution... +Executing: forge script script/AcceptOracles.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow +No files changed, compilation skipped +Script ran successfully. + +== Logs == + === Checking Pending Oracles === + Oracle Aggregator Address: 0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa + Network: arb-mainnet + Current Block Timestamp: 1743663209 + + Accepted oracle for token: + Token Symbol: WETH + Token Address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: wstETH + Token Address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: USDC + Token Address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: WBTC + Token Address: 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: weETH + Token Address: 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: ARB + Token Address: 0x912CE59144191C1204E64559FE8253a0e49E6548 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: PT-weETH-26JUN2025 + Token Address: 0xb33808ea0e883138680BA29311a220A7377cdb92 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Heartbeat: 86400 + -------------------------------- + + === Oracle Acceptance Summary === + Total tokens checked: 7 + Oracles accepted: 7 + Oracles not ready: 0 + +## Setting up 1 EVM. + +========================== + +Chain 42161 + +Estimated gas price: 0.020000001 gwei + +Estimated total gas used for script: 914354 + +Estimated amount required: 0.000018287080914354 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/AcceptOracles.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/AcceptOracles.s.sol/42161/run-latest.json + +[SUCCESS] Script AcceptOracles executed successfully on arb-mainnet (Broadcast mode)! diff --git a/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-access-manager.json b/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-access-manager.json new file mode 100644 index 0000000..f75a2f5 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743606817", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182046", + "timestamp": "1743606817" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-core.json b/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-core.json new file mode 100644 index 0000000..435d898 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743608156", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182159", + "timestamp": "1743608156" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x14920Eb11b71873d01c93B589b40585dacfCA096", + "vaultFactory": "0x929CBcb8150aD59DB63c92A7dAEc07b30d38bA79", + "oracleAggregator": "0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa", + "router": "0x7fa333b184868d88aC78a82eC06d5e87d4B0322E", + "swapAdapter": { + "uniswapV3Adapter": "0x609F20ee24E10010A62970E1dAb7E2b84eD74CAb", + "odosV2Adapter": "0x7de4efa140E52B7207FA689D41AfEE461B83E748", + "pendleSwapV3Adapter": "0xb0eCCbaD4b4cc190261c29C6E8d85bcF04284a8b", + "ERC4626VaultAdapter": "0xa50929A67daF9Ff3567e2Bb3411204A134f72546" + }, + "marketViewer": "0x276C0E52508d94ff2D4106b1559c8c4Bc3a75dec" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-market-USDC-ARB@12APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-market-USDC-ARB@12APR2025.json new file mode 100644 index 0000000..a420a19 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-market-USDC-ARB@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325154473", + "timestamp": "1744350945" + }, + "market": "0x596B8597f003c129eFbed3F63D36Dc613305D42E", + "collateral": { + "address": "0x912CE59144191C1204E64559FE8253a0e49E6548", + "symbol": "ARB", + "priceFeed": "0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x982B5cf38D9c3B4C3B9566FA4DceB0cf89E25B9b", + "xt": "0x80DF08BAE1E16e42788f21508CdaF2FeA0dd0663", + "gt": "0x5CB6d321565c84307cF25E94EdA94DA94FBDCd25" + }, + "config": { + "marketSymbol": "USDC/ARB@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-market-USDC-WBTC@12APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-market-USDC-WBTC@12APR2025.json new file mode 100644 index 0000000..c9a7009 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-market-USDC-WBTC@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325154473", + "timestamp": "1744350945" + }, + "market": "0x56FB65a3164C6aA537bc4437356f28d07036b33e", + "collateral": { + "address": "0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f", + "symbol": "WBTC", + "priceFeed": "0xd0C7101eACbB49F3deCcCc166d238410D6D46d57", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xDdE6FC783F25d8DD47162C9100508dE576865768", + "xt": "0xbAA98F744728CF318E696f40Fc0a1851325fcDc6", + "gt": "0x90882Eb67934898A7bAE755985A9D321DE9D7466" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-market-USDC-WETH@12APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-market-USDC-WETH@12APR2025.json new file mode 100644 index 0000000..19cd4fb --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-market-USDC-WETH@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325154473", + "timestamp": "1744350945" + }, + "market": "0xF85e7e15225E229E7789B480ef05475D001dFE06", + "collateral": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xE3EE0A7E3c7dd8F25249D6ed1B0496DAA3BAe55b", + "xt": "0x4804865142CDb34dc4fEBFE57D40117C2a51192D", + "gt": "0x86b61b7B69a02e235A179b19160F170545C01d14" + }, + "config": { + "marketSymbol": "USDC/WETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-market-USDC-wstETH@12APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-market-USDC-wstETH@12APR2025.json new file mode 100644 index 0000000..8b5ed0b --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-market-USDC-wstETH@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325154473", + "timestamp": "1744350945" + }, + "market": "0xB8f785d20F527de5409399CFB108e7DB4563b974", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xB96B454C9A83089A9Cf91eA91f6B0120C6C59cb3", + "xt": "0xEcef649eE25a7DeD0F252161AE9757b838B0E15A", + "gt": "0x7Ed6665393c02e9bb47c99B91eC29d4d8094b8c2" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@12APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@12APR2025.json new file mode 100644 index 0000000..c6da710 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325154473", + "timestamp": "1744350945" + }, + "market": "0xb537AeD9e4C331008A8cF715240921533a42318F", + "collateral": { + "address": "0xb33808ea0e883138680BA29311a220A7377cdb92", + "symbol": "PT-weETH-26JUN2025", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x62D6CC44668E1D23dA42428D8eC9bE011558e0c0", + "xt": "0xaB51Ad62aDD57f1172D943Cc5Ba180Dccd822695", + "gt": "0xFB4221fa146958582aF3C718214618eF77a928f9" + }, + "config": { + "marketSymbol": "WETH/PT-weETH-26JUN2025@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-market-WETH-weETH@12APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-market-WETH-weETH@12APR2025.json new file mode 100644 index 0000000..93a234d --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-market-WETH-weETH@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325154473", + "timestamp": "1744350945" + }, + "market": "0x91803E2F0253bc70Fb4fc44b32052665B5750928", + "collateral": { + "address": "0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe", + "symbol": "weETH", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xbA1b5483FF0c3f573E6275fCD26eF464919D2291", + "xt": "0x8BdB64f58f1D1cf0C1d19A993DB2d829f1BDA356", + "gt": "0xeE97c27cc95CB88154f4DA902B525B90eb7A1FF0" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-market-WETH-wstETH@12APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-market-WETH-wstETH@12APR2025.json new file mode 100644 index 0000000..2f13abe --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-market-WETH-wstETH@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325154473", + "timestamp": "1744350945" + }, + "market": "0x0812A235A2310feEBA8ca0518b0058dAd6ECaf47", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x7Eec7c1A76635bE779CD0BA3c207bA9973FD150d", + "xt": "0x9e99a233cDa761AcB7d4D85276A57b40B7A51364", + "gt": "0x05E4aCf6bbE00A4e23d09aE650Df099856871236" + }, + "config": { + "marketSymbol": "WETH/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-vault-TMX-USDC.json b/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-vault-TMX-USDC.json new file mode 100644 index 0000000..af05fff --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-vault-TMX-USDC.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "324633071", + "timestamp": "1744220329" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TMX-USDC", + "address": "0xc94b752839a22D2C44E99e298671dd4B2aDd11b3", + "asset": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "performanceFeeRate": 0, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-vault-TMX-WETH.json b/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-vault-TMX-WETH.json new file mode 100644 index 0000000..9177b68 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-vault-TMX-WETH.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "324634324", + "timestamp": "1744220643" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TMX-WETH", + "address": "0x8c5161f287Cbc9Afa48bC8972eE8CC0a755fcAdC", + "asset": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "performanceFeeRate": 0, + "maxCapacity": "5000000000000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-vault-TermMax USDC Vault.json b/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-vault-TermMax USDC Vault.json new file mode 100644 index 0000000..4084050 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-vault-TermMax USDC Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22186270", + "timestamp": "1743657771" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TermMax USDC Vault", + "address": "0x9170A095e7073559ffe1240ccF692Abb94F32a28", + "asset": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "performanceFeeRate": 10000000, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-vault-TermMax WETH Vault.json b/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-vault-TermMax WETH Vault.json new file mode 100644 index 0000000..7b33cbf --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250412-2000/arb-mainnet-vault-TermMax WETH Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22182632", + "timestamp": "1743613861" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TermMax WETH Vault", + "address": "0xeBF448902145f65b4E1B3C4e3A269444e0213C9e", + "asset": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "performanceFeeRate": 10000000, + "maxCapacity": "500000000000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250412-2000/deploy-arb-markets-test-0412-2000-log.txt b/deployments/arb-mainnet-v1.0.8-test-20250412-2000/deploy-arb-markets-test-0412-2000-log.txt new file mode 100644 index 0000000..6907a04 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250412-2000/deploy-arb-markets-test-0412-2000-log.txt @@ -0,0 +1,243 @@ +Running on arb-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: arb-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://arbi*****.gate*****.tend*****.co/agLs***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ARBSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0x8276d5d79cb2ee0475a52d58d6eaca7d4b30f877 + + ===== Block Info ===== + Block number: 325154473 + Block timestamp: 1744350945 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 325154473 + + ===== Market Info - 0 ===== + Market deployed at: 0x0812A235A2310feEBA8ca0518b0058dAd6ECaf47 + Market name: WETH/wstETH@30MAY2025 + Market symbol: WETH/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x7Eec7c1A76635bE779CD0BA3c207bA9973FD150d + XT deployed at: 0x9e99a233cDa761AcB7d4D85276A57b40B7A51364 + GT deployed at: 0x05E4aCf6bbE00A4e23d09aE650Df099856871236 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-wstETH@12APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xB8f785d20F527de5409399CFB108e7DB4563b974 + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0xB96B454C9A83089A9Cf91eA91f6B0120C6C59cb3 + XT deployed at: 0xEcef649eE25a7DeD0F252161AE9757b838B0E15A + GT deployed at: 0x7Ed6665393c02e9bb47c99B91eC29d4d8094b8c2 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-wstETH@12APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x56FB65a3164C6aA537bc4437356f28d07036b33e + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0xDdE6FC783F25d8DD47162C9100508dE576865768 + XT deployed at: 0xbAA98F744728CF318E696f40Fc0a1851325fcDc6 + GT deployed at: 0x90882Eb67934898A7bAE755985A9D321DE9D7466 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WBTC@12APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0x91803E2F0253bc70Fb4fc44b32052665B5750928 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0xbA1b5483FF0c3f573E6275fCD26eF464919D2291 + XT deployed at: 0x8BdB64f58f1D1cf0C1d19A993DB2d829f1BDA356 + GT deployed at: 0xeE97c27cc95CB88154f4DA902B525B90eb7A1FF0 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-weETH@12APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0xF85e7e15225E229E7789B480ef05475D001dFE06 + Market name: USDC/WETH@30MAY2025 + Market symbol: USDC/WETH@30MAY2025 + Collateral (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0xE3EE0A7E3c7dd8F25249D6ed1B0496DAA3BAe55b + XT deployed at: 0x4804865142CDb34dc4fEBFE57D40117C2a51192D + GT deployed at: 0x86b61b7B69a02e235A179b19160F170545C01d14 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WETH@12APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x596B8597f003c129eFbed3F63D36Dc613305D42E + Market name: USDC/ARB@30MAY2025 + Market symbol: USDC/ARB@30MAY2025 + Collateral (ARB) address: 0x912CE59144191C1204E64559FE8253a0e49E6548 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x982B5cf38D9c3B4C3B9566FA4DceB0cf89E25B9b + XT deployed at: 0x80DF08BAE1E16e42788f21508CdaF2FeA0dd0663 + GT deployed at: 0x5CB6d321565c84307cF25E94EdA94DA94FBDCd25 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-ARB@12APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0xb537AeD9e4C331008A8cF715240921533a42318F + Market name: WETH/PT-weETH-26JUN2025@27JUN2025 + Market symbol: WETH/PT-weETH-26JUN2025@27JUN2025 + Collateral (PT-weETH-26JUN2025) address: 0xb33808ea0e883138680BA29311a220A7377cdb92 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x62D6CC44668E1D23dA42428D8eC9bE011558e0c0 + XT deployed at: 0xaB51Ad62aDD57f1172D943Cc5Ba180Dccd822695 + GT deployed at: 0xFB4221fa146958582aF3C718214618eF77a928f9 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-PT-weETH-26JUN2025@12APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 42161 + +Estimated gas price: 0.020000001 gwei + +Estimated total gas used for script: 10150327 + +Estimated amount required: 0.000203006550150327 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x0812a235a2310feeba8ca0518b0058dad6ecaf47, 0x7eec7c1a76635be779cd0ba3c207ba9973fd150d, 0x9e99a233cda761acb7d4d85276a57b40b7a51364, 0x05e4acf6bbe00a4e23d09ae650df099856871236, 0xb8f785d20f527de5409399cfb108e7db4563b974, 0xb96b454c9a83089a9cf91ea91f6b0120c6c59cb3, 0xecef649ee25a7ded0f252161ae9757b838b0e15a, 0x7ed6665393c02e9bb47c99b91ec29d4d8094b8c2, 0x56fb65a3164c6aa537bc4437356f28d07036b33e, 0xdde6fc783f25d8dd47162c9100508de576865768, 0xbaa98f744728cf318e696f40fc0a1851325fcdc6, 0x90882eb67934898a7bae755985a9d321de9d7466, 0x91803e2f0253bc70fb4fc44b32052665b5750928, 0xba1b5483ff0c3f573e6275fcd26ef464919d2291, 0x8bdb64f58f1d1cf0c1d19a993db2d829f1bda356, 0xee97c27cc95cb88154f4da902b525b90eb7a1ff0, 0xf85e7e15225e229e7789b480ef05475d001dfe06, 0xe3ee0a7e3c7dd8f25249d6ed1b0496daa3bae55b, 0x4804865142cdb34dc4febfe57d40117c2a51192d, 0x86b61b7b69a02e235a179b19160f170545c01d14, 0x596b8597f003c129efbed3f63d36dc613305d42e, 0x982b5cf38d9c3b4c3b9566fa4dceb0cf89e25b9b, 0x80df08bae1e16e42788f21508cdaf2fea0dd0663, 0x5cb6d321565c84307cf25e94eda94da94fbdcd25, 0xb537aed9e4c331008a8cf715240921533a42318f, 0x62d6cc44668e1d23da42428d8ec9be011558e0c0, 0xab51ad62add57f1172d943cc5ba180dccd822695, 0xfb4221fa146958582af3c718214618ef77a928f9]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/42161/run-latest.json + +[SUCCESS] market deployment to arb-mainnet completed successfully! diff --git a/deployments/arb-mainnet-v1.0.8-test-20250413-1500/accept-oracles-20250403-log.txt b/deployments/arb-mainnet-v1.0.8-test-20250413-1500/accept-oracles-20250403-log.txt new file mode 100644 index 0000000..2a93d96 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250413-1500/accept-oracles-20250403-log.txt @@ -0,0 +1,107 @@ +Running on arb-mainnet... +=== Configuration === +Operation: Script Execution +Network: arb-mainnet +Script: AcceptOracles.s.sol +Path: script/AcceptOracles.s.sol +RPC URL: http*****://arb-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Disabled +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xa669e7A0d4b3e4Fa48af2dE86BD4CD7126Be4e13 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting script execution... +Executing: forge script script/AcceptOracles.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow +No files changed, compilation skipped +Script ran successfully. + +== Logs == + === Checking Pending Oracles === + Oracle Aggregator Address: 0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa + Network: arb-mainnet + Current Block Timestamp: 1743663209 + + Accepted oracle for token: + Token Symbol: WETH + Token Address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: wstETH + Token Address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: USDC + Token Address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: WBTC + Token Address: 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: weETH + Token Address: 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: ARB + Token Address: 0x912CE59144191C1204E64559FE8253a0e49E6548 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: PT-weETH-26JUN2025 + Token Address: 0xb33808ea0e883138680BA29311a220A7377cdb92 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Heartbeat: 86400 + -------------------------------- + + === Oracle Acceptance Summary === + Total tokens checked: 7 + Oracles accepted: 7 + Oracles not ready: 0 + +## Setting up 1 EVM. + +========================== + +Chain 42161 + +Estimated gas price: 0.020000001 gwei + +Estimated total gas used for script: 914354 + +Estimated amount required: 0.000018287080914354 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/AcceptOracles.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/AcceptOracles.s.sol/42161/run-latest.json + +[SUCCESS] Script AcceptOracles executed successfully on arb-mainnet (Broadcast mode)! diff --git a/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-access-manager.json b/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-access-manager.json new file mode 100644 index 0000000..f75a2f5 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743606817", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182046", + "timestamp": "1743606817" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-core.json b/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-core.json new file mode 100644 index 0000000..435d898 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743608156", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182159", + "timestamp": "1743608156" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x14920Eb11b71873d01c93B589b40585dacfCA096", + "vaultFactory": "0x929CBcb8150aD59DB63c92A7dAEc07b30d38bA79", + "oracleAggregator": "0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa", + "router": "0x7fa333b184868d88aC78a82eC06d5e87d4B0322E", + "swapAdapter": { + "uniswapV3Adapter": "0x609F20ee24E10010A62970E1dAb7E2b84eD74CAb", + "odosV2Adapter": "0x7de4efa140E52B7207FA689D41AfEE461B83E748", + "pendleSwapV3Adapter": "0xb0eCCbaD4b4cc190261c29C6E8d85bcF04284a8b", + "ERC4626VaultAdapter": "0xa50929A67daF9Ff3567e2Bb3411204A134f72546" + }, + "marketViewer": "0x276C0E52508d94ff2D4106b1559c8c4Bc3a75dec" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-market-USDC-ARB@13APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-market-USDC-ARB@13APR2025.json new file mode 100644 index 0000000..2d58afa --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-market-USDC-ARB@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325155286", + "timestamp": "1744351148" + }, + "market": "0x130fDEE7436D62afE5e2f69C671a15E6CF94c9BC", + "collateral": { + "address": "0x912CE59144191C1204E64559FE8253a0e49E6548", + "symbol": "ARB", + "priceFeed": "0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xE96f358ad04Cc597534d512B31fc942B71A48Eb1", + "xt": "0xb23d0bC3BE551363fb4Df42e9e3FCCdC7C06b338", + "gt": "0x085545810313f824E3a9A4460ba98Ff8b23D9D09" + }, + "config": { + "marketSymbol": "USDC/ARB@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-market-USDC-WBTC@13APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-market-USDC-WBTC@13APR2025.json new file mode 100644 index 0000000..450f5cf --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-market-USDC-WBTC@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325155286", + "timestamp": "1744351148" + }, + "market": "0xE2462f7fc1435d2C035cC379e308c4c6459F428f", + "collateral": { + "address": "0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f", + "symbol": "WBTC", + "priceFeed": "0xd0C7101eACbB49F3deCcCc166d238410D6D46d57", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xd8d31eb463d9769CDa68e7c36bf5ac6947b5608F", + "xt": "0xBbc32246c065aE9d0b71BFB0030fD84f2AB0F7D6", + "gt": "0x6d2C24786E871F13bf0d74274Fd43e99242fEcAe" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-market-USDC-WETH@13APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-market-USDC-WETH@13APR2025.json new file mode 100644 index 0000000..2cd3d8a --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-market-USDC-WETH@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325155286", + "timestamp": "1744351148" + }, + "market": "0xE8104A63d1a3fa2E356150C3dbC6F9CeF8FCefac", + "collateral": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xBb057E410da64ac32fCE4a4D97784463E6baA587", + "xt": "0x2D9e7f75362B5be38C222cF689eBE147097baDAB", + "gt": "0xEB2Cf4345317F33d52BA2de7dd405289bF2aa9CE" + }, + "config": { + "marketSymbol": "USDC/WETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-market-USDC-wstETH@13APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-market-USDC-wstETH@13APR2025.json new file mode 100644 index 0000000..82b3d4c --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-market-USDC-wstETH@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325155286", + "timestamp": "1744351148" + }, + "market": "0x312fD0012412BaB57d43521a8197a98d68483d41", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xe39Cb550D3e855958250F2D2EE04a8C54FDE55e1", + "xt": "0xFf54bcA6f75F6F894855aA1D7d75f7dc220dc0Ef", + "gt": "0x398438cD1f5f176A43357653C7f9db6254dc0e9B" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-market-WETH-PT-weETH-26JUN2025@13APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-market-WETH-PT-weETH-26JUN2025@13APR2025.json new file mode 100644 index 0000000..4727de3 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-market-WETH-PT-weETH-26JUN2025@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325155286", + "timestamp": "1744351148" + }, + "market": "0xbA65D3140272ffFBb4eB6bFB5DA4Cef740DeaE56", + "collateral": { + "address": "0xb33808ea0e883138680BA29311a220A7377cdb92", + "symbol": "PT-weETH-26JUN2025", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xc2E827a2b5B85DFe3586C759d15668E71C57cCda", + "xt": "0xEedfBE3C5De26348D818d39a42Cdc62C339A69a2", + "gt": "0x8833bff000b8fee7Db10d59d1e1750Fa172d007E" + }, + "config": { + "marketSymbol": "WETH/PT-weETH-26JUN2025@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-market-WETH-weETH@13APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-market-WETH-weETH@13APR2025.json new file mode 100644 index 0000000..241600a --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-market-WETH-weETH@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325155286", + "timestamp": "1744351148" + }, + "market": "0x0eEbaBAc5cED8032772b1501573C6f9bf7a084e1", + "collateral": { + "address": "0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe", + "symbol": "weETH", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x3F7d367a5d75a9183C28b029bAc1f2fa4E28B8A8", + "xt": "0x5536299a06a020D5aE3A7f44f98BC1cAc623F85a", + "gt": "0xA14049d807aD34375D29da5dcd85Bc91aAD555A6" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-market-WETH-wstETH@13APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-market-WETH-wstETH@13APR2025.json new file mode 100644 index 0000000..e6aea20 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-market-WETH-wstETH@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325155286", + "timestamp": "1744351148" + }, + "market": "0x2ee11875D023Cc70a191b0eFc06d63A1Db14EAa7", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x47ED39cE3e241A9d825086738297B4DB2155d334", + "xt": "0x69B7b2AA55Eeb9eaeDde6eAc849fa3e454EF3fd0", + "gt": "0x48D0a8C890f476d3F256f6Be9824125b778a0205" + }, + "config": { + "marketSymbol": "WETH/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-vault-TMX-USDC.json b/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-vault-TMX-USDC.json new file mode 100644 index 0000000..af05fff --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-vault-TMX-USDC.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "324633071", + "timestamp": "1744220329" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TMX-USDC", + "address": "0xc94b752839a22D2C44E99e298671dd4B2aDd11b3", + "asset": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "performanceFeeRate": 0, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-vault-TMX-WETH.json b/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-vault-TMX-WETH.json new file mode 100644 index 0000000..9177b68 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-vault-TMX-WETH.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "324634324", + "timestamp": "1744220643" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TMX-WETH", + "address": "0x8c5161f287Cbc9Afa48bC8972eE8CC0a755fcAdC", + "asset": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "performanceFeeRate": 0, + "maxCapacity": "5000000000000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-vault-TermMax USDC Vault.json b/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-vault-TermMax USDC Vault.json new file mode 100644 index 0000000..4084050 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-vault-TermMax USDC Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22186270", + "timestamp": "1743657771" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TermMax USDC Vault", + "address": "0x9170A095e7073559ffe1240ccF692Abb94F32a28", + "asset": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "performanceFeeRate": 10000000, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-vault-TermMax WETH Vault.json b/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-vault-TermMax WETH Vault.json new file mode 100644 index 0000000..7b33cbf --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250413-1500/arb-mainnet-vault-TermMax WETH Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22182632", + "timestamp": "1743613861" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TermMax WETH Vault", + "address": "0xeBF448902145f65b4E1B3C4e3A269444e0213C9e", + "asset": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "performanceFeeRate": 10000000, + "maxCapacity": "500000000000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250413-1500/deploy-arb-markets-test-0413-1500-log.txt b/deployments/arb-mainnet-v1.0.8-test-20250413-1500/deploy-arb-markets-test-0413-1500-log.txt new file mode 100644 index 0000000..c96b012 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250413-1500/deploy-arb-markets-test-0413-1500-log.txt @@ -0,0 +1,243 @@ +Running on arb-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: arb-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://arbi*****.gate*****.tend*****.co/agLs***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ARBSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0x8276d5d79cb2ee0475a52d58d6eaca7d4b30f877 + + ===== Block Info ===== + Block number: 325155286 + Block timestamp: 1744351148 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 325155286 + + ===== Market Info - 0 ===== + Market deployed at: 0x2ee11875D023Cc70a191b0eFc06d63A1Db14EAa7 + Market name: WETH/wstETH@30MAY2025 + Market symbol: WETH/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x47ED39cE3e241A9d825086738297B4DB2155d334 + XT deployed at: 0x69B7b2AA55Eeb9eaeDde6eAc849fa3e454EF3fd0 + GT deployed at: 0x48D0a8C890f476d3F256f6Be9824125b778a0205 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-wstETH@13APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0x312fD0012412BaB57d43521a8197a98d68483d41 + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0xe39Cb550D3e855958250F2D2EE04a8C54FDE55e1 + XT deployed at: 0xFf54bcA6f75F6F894855aA1D7d75f7dc220dc0Ef + GT deployed at: 0x398438cD1f5f176A43357653C7f9db6254dc0e9B + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-wstETH@13APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0xE2462f7fc1435d2C035cC379e308c4c6459F428f + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0xd8d31eb463d9769CDa68e7c36bf5ac6947b5608F + XT deployed at: 0xBbc32246c065aE9d0b71BFB0030fD84f2AB0F7D6 + GT deployed at: 0x6d2C24786E871F13bf0d74274Fd43e99242fEcAe + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WBTC@13APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0x0eEbaBAc5cED8032772b1501573C6f9bf7a084e1 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x3F7d367a5d75a9183C28b029bAc1f2fa4E28B8A8 + XT deployed at: 0x5536299a06a020D5aE3A7f44f98BC1cAc623F85a + GT deployed at: 0xA14049d807aD34375D29da5dcd85Bc91aAD555A6 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-weETH@13APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0xE8104A63d1a3fa2E356150C3dbC6F9CeF8FCefac + Market name: USDC/WETH@30MAY2025 + Market symbol: USDC/WETH@30MAY2025 + Collateral (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0xBb057E410da64ac32fCE4a4D97784463E6baA587 + XT deployed at: 0x2D9e7f75362B5be38C222cF689eBE147097baDAB + GT deployed at: 0xEB2Cf4345317F33d52BA2de7dd405289bF2aa9CE + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WETH@13APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x130fDEE7436D62afE5e2f69C671a15E6CF94c9BC + Market name: USDC/ARB@30MAY2025 + Market symbol: USDC/ARB@30MAY2025 + Collateral (ARB) address: 0x912CE59144191C1204E64559FE8253a0e49E6548 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0xE96f358ad04Cc597534d512B31fc942B71A48Eb1 + XT deployed at: 0xb23d0bC3BE551363fb4Df42e9e3FCCdC7C06b338 + GT deployed at: 0x085545810313f824E3a9A4460ba98Ff8b23D9D09 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-ARB@13APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0xbA65D3140272ffFBb4eB6bFB5DA4Cef740DeaE56 + Market name: WETH/PT-weETH-26JUN2025@27JUN2025 + Market symbol: WETH/PT-weETH-26JUN2025@27JUN2025 + Collateral (PT-weETH-26JUN2025) address: 0xb33808ea0e883138680BA29311a220A7377cdb92 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0xc2E827a2b5B85DFe3586C759d15668E71C57cCda + XT deployed at: 0xEedfBE3C5De26348D818d39a42Cdc62C339A69a2 + GT deployed at: 0x8833bff000b8fee7Db10d59d1e1750Fa172d007E + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-PT-weETH-26JUN2025@13APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 42161 + +Estimated gas price: 0.020000001 gwei + +Estimated total gas used for script: 10150327 + +Estimated amount required: 0.000203006550150327 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x2ee11875d023cc70a191b0efc06d63a1db14eaa7, 0x47ed39ce3e241a9d825086738297b4db2155d334, 0x69b7b2aa55eeb9eaedde6eac849fa3e454ef3fd0, 0x48d0a8c890f476d3f256f6be9824125b778a0205, 0x312fd0012412bab57d43521a8197a98d68483d41, 0xe39cb550d3e855958250f2d2ee04a8c54fde55e1, 0xff54bca6f75f6f894855aa1d7d75f7dc220dc0ef, 0x398438cd1f5f176a43357653c7f9db6254dc0e9b, 0xe2462f7fc1435d2c035cc379e308c4c6459f428f, 0xd8d31eb463d9769cda68e7c36bf5ac6947b5608f, 0xbbc32246c065ae9d0b71bfb0030fd84f2ab0f7d6, 0x6d2c24786e871f13bf0d74274fd43e99242fecae, 0x0eebabac5ced8032772b1501573c6f9bf7a084e1, 0x3f7d367a5d75a9183c28b029bac1f2fa4e28b8a8, 0x5536299a06a020d5ae3a7f44f98bc1cac623f85a, 0xa14049d807ad34375d29da5dcd85bc91aad555a6, 0xe8104a63d1a3fa2e356150c3dbc6f9cef8fcefac, 0xbb057e410da64ac32fce4a4d97784463e6baa587, 0x2d9e7f75362b5be38c222cf689ebe147097badab, 0xeb2cf4345317f33d52ba2de7dd405289bf2aa9ce, 0x130fdee7436d62afe5e2f69c671a15e6cf94c9bc, 0xe96f358ad04cc597534d512b31fc942b71a48eb1, 0xb23d0bc3be551363fb4df42e9e3fccdc7c06b338, 0x085545810313f824e3a9a4460ba98ff8b23d9d09, 0xba65d3140272fffbb4eb6bfb5da4cef740deae56, 0xc2e827a2b5b85dfe3586c759d15668e71c57ccda, 0xeedfbe3c5de26348d818d39a42cdc62c339a69a2, 0x8833bff000b8fee7db10d59d1e1750fa172d007e]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/42161/run-latest.json + +[SUCCESS] market deployment to arb-mainnet completed successfully! diff --git a/deployments/arb-mainnet-v1.0.8-test-20250413-2000/accept-oracles-20250403-log.txt b/deployments/arb-mainnet-v1.0.8-test-20250413-2000/accept-oracles-20250403-log.txt new file mode 100644 index 0000000..2a93d96 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250413-2000/accept-oracles-20250403-log.txt @@ -0,0 +1,107 @@ +Running on arb-mainnet... +=== Configuration === +Operation: Script Execution +Network: arb-mainnet +Script: AcceptOracles.s.sol +Path: script/AcceptOracles.s.sol +RPC URL: http*****://arb-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Disabled +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xa669e7A0d4b3e4Fa48af2dE86BD4CD7126Be4e13 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting script execution... +Executing: forge script script/AcceptOracles.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow +No files changed, compilation skipped +Script ran successfully. + +== Logs == + === Checking Pending Oracles === + Oracle Aggregator Address: 0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa + Network: arb-mainnet + Current Block Timestamp: 1743663209 + + Accepted oracle for token: + Token Symbol: WETH + Token Address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: wstETH + Token Address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: USDC + Token Address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: WBTC + Token Address: 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: weETH + Token Address: 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: ARB + Token Address: 0x912CE59144191C1204E64559FE8253a0e49E6548 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: PT-weETH-26JUN2025 + Token Address: 0xb33808ea0e883138680BA29311a220A7377cdb92 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Heartbeat: 86400 + -------------------------------- + + === Oracle Acceptance Summary === + Total tokens checked: 7 + Oracles accepted: 7 + Oracles not ready: 0 + +## Setting up 1 EVM. + +========================== + +Chain 42161 + +Estimated gas price: 0.020000001 gwei + +Estimated total gas used for script: 914354 + +Estimated amount required: 0.000018287080914354 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/AcceptOracles.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/AcceptOracles.s.sol/42161/run-latest.json + +[SUCCESS] Script AcceptOracles executed successfully on arb-mainnet (Broadcast mode)! diff --git a/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-access-manager.json b/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-access-manager.json new file mode 100644 index 0000000..f75a2f5 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743606817", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182046", + "timestamp": "1743606817" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-core.json b/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-core.json new file mode 100644 index 0000000..435d898 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743608156", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182159", + "timestamp": "1743608156" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x14920Eb11b71873d01c93B589b40585dacfCA096", + "vaultFactory": "0x929CBcb8150aD59DB63c92A7dAEc07b30d38bA79", + "oracleAggregator": "0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa", + "router": "0x7fa333b184868d88aC78a82eC06d5e87d4B0322E", + "swapAdapter": { + "uniswapV3Adapter": "0x609F20ee24E10010A62970E1dAb7E2b84eD74CAb", + "odosV2Adapter": "0x7de4efa140E52B7207FA689D41AfEE461B83E748", + "pendleSwapV3Adapter": "0xb0eCCbaD4b4cc190261c29C6E8d85bcF04284a8b", + "ERC4626VaultAdapter": "0xa50929A67daF9Ff3567e2Bb3411204A134f72546" + }, + "marketViewer": "0x276C0E52508d94ff2D4106b1559c8c4Bc3a75dec" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-market-USDC-ARB@13APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-market-USDC-ARB@13APR2025.json new file mode 100644 index 0000000..0de8679 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-market-USDC-ARB@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325156134", + "timestamp": "1744351362" + }, + "market": "0x7e7d8c959155b10A3D47Afbc28888A44b27A26Dc", + "collateral": { + "address": "0x912CE59144191C1204E64559FE8253a0e49E6548", + "symbol": "ARB", + "priceFeed": "0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xD27AA5b326e58DfA182E77409d72d17301a03f42", + "xt": "0xAeA24e9a8f57688779e60e5ee7abE16A8cad54e6", + "gt": "0x3380CAD698f34098c9306FF8168003396BAdb39A" + }, + "config": { + "marketSymbol": "USDC/ARB@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-market-USDC-WBTC@13APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-market-USDC-WBTC@13APR2025.json new file mode 100644 index 0000000..9b5e03c --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-market-USDC-WBTC@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325156134", + "timestamp": "1744351362" + }, + "market": "0x7317AEb20254Bd43683333296CB903EcEe31e55d", + "collateral": { + "address": "0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f", + "symbol": "WBTC", + "priceFeed": "0xd0C7101eACbB49F3deCcCc166d238410D6D46d57", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xd45b1Bd85576e2A547677e74a3f5DD61f0A6546f", + "xt": "0x9195691eeCb0D60F5fDf48759b526dE9a85c5bE7", + "gt": "0xfeEd33CdebCdD56BcCa7feAdFe560cc39C285Ef8" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-market-USDC-WETH@13APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-market-USDC-WETH@13APR2025.json new file mode 100644 index 0000000..7a82e50 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-market-USDC-WETH@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325156134", + "timestamp": "1744351362" + }, + "market": "0x6eF5C3B3ed271CA0e0a540adDA6a51dD5B5Ce7d4", + "collateral": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x46C7441e9B8d8A6017EbeFf4A61b4615575E6777", + "xt": "0x8b09CF402E5807Ae70626E89c55D2746888fC10C", + "gt": "0x1dD00B382d8976798d21f4d38191798dd2143E54" + }, + "config": { + "marketSymbol": "USDC/WETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-market-USDC-wstETH@13APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-market-USDC-wstETH@13APR2025.json new file mode 100644 index 0000000..d7bbfef --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-market-USDC-wstETH@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325156134", + "timestamp": "1744351362" + }, + "market": "0x1e8F95669dc8CF8a4ab838299c6d876186517A63", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xb0005C7C89bfC330A67169e416829c5347B7f717", + "xt": "0x13C6DFCb5c0142573D38dd20fFc52d21c3081e1c", + "gt": "0xCEDF76569e130a88fCd61EDc503ee374bF4c5565" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@13APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@13APR2025.json new file mode 100644 index 0000000..d176e9d --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325156134", + "timestamp": "1744351362" + }, + "market": "0xedac8FE94A6D9E6650EEF40622386173B1e2371d", + "collateral": { + "address": "0xb33808ea0e883138680BA29311a220A7377cdb92", + "symbol": "PT-weETH-26JUN2025", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xeF26767b7B20Ff8eB88fB076e7b5876129449077", + "xt": "0x68955585F7B6953DD3270b71007685d65F7F8B13", + "gt": "0xB7994F1b4d780C088EEcB8c71c35B404dA9Ef08e" + }, + "config": { + "marketSymbol": "WETH/PT-weETH-26JUN2025@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-market-WETH-weETH@13APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-market-WETH-weETH@13APR2025.json new file mode 100644 index 0000000..87d600e --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-market-WETH-weETH@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325156134", + "timestamp": "1744351362" + }, + "market": "0xFd4188C472ADD94fa2325290C4A831FF47acD444", + "collateral": { + "address": "0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe", + "symbol": "weETH", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x2Eb3BCab8276a6A32aE1533B7720BD0A5c73745F", + "xt": "0x2c2d37d2D2FF88Fe97456b5b66eB96A3B15C4f4B", + "gt": "0x5eF213f42489CF00377A72891308CF888B6310c5" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-market-WETH-wstETH@13APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-market-WETH-wstETH@13APR2025.json new file mode 100644 index 0000000..763e456 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-market-WETH-wstETH@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325156134", + "timestamp": "1744351362" + }, + "market": "0x79Fce305B4c13277A1B3b002985a57a8465694e5", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xa4FF94E96382f96C7Ea3f88415F9662993366127", + "xt": "0xedfd81e8232aDBb1d6635ec04aa0766511925CD5", + "gt": "0x1335b05566A699Ef54965Cc7563689D9429a4390" + }, + "config": { + "marketSymbol": "WETH/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-vault-TMX-USDC.json b/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-vault-TMX-USDC.json new file mode 100644 index 0000000..af05fff --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-vault-TMX-USDC.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "324633071", + "timestamp": "1744220329" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TMX-USDC", + "address": "0xc94b752839a22D2C44E99e298671dd4B2aDd11b3", + "asset": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "performanceFeeRate": 0, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-vault-TMX-WETH.json b/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-vault-TMX-WETH.json new file mode 100644 index 0000000..9177b68 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-vault-TMX-WETH.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "324634324", + "timestamp": "1744220643" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TMX-WETH", + "address": "0x8c5161f287Cbc9Afa48bC8972eE8CC0a755fcAdC", + "asset": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "performanceFeeRate": 0, + "maxCapacity": "5000000000000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-vault-TermMax USDC Vault.json b/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-vault-TermMax USDC Vault.json new file mode 100644 index 0000000..4084050 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-vault-TermMax USDC Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22186270", + "timestamp": "1743657771" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TermMax USDC Vault", + "address": "0x9170A095e7073559ffe1240ccF692Abb94F32a28", + "asset": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "performanceFeeRate": 10000000, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-vault-TermMax WETH Vault.json b/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-vault-TermMax WETH Vault.json new file mode 100644 index 0000000..7b33cbf --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250413-2000/arb-mainnet-vault-TermMax WETH Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22182632", + "timestamp": "1743613861" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TermMax WETH Vault", + "address": "0xeBF448902145f65b4E1B3C4e3A269444e0213C9e", + "asset": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "performanceFeeRate": 10000000, + "maxCapacity": "500000000000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250413-2000/deploy-arb-markets-test-0413-2000-log.txt b/deployments/arb-mainnet-v1.0.8-test-20250413-2000/deploy-arb-markets-test-0413-2000-log.txt new file mode 100644 index 0000000..2390fbb --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250413-2000/deploy-arb-markets-test-0413-2000-log.txt @@ -0,0 +1,243 @@ +Running on arb-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: arb-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://arbi*****.gate*****.tend*****.co/agLs***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ARBSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0x8276d5d79cb2ee0475a52d58d6eaca7d4b30f877 + + ===== Block Info ===== + Block number: 325156134 + Block timestamp: 1744351362 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 325156134 + + ===== Market Info - 0 ===== + Market deployed at: 0x79Fce305B4c13277A1B3b002985a57a8465694e5 + Market name: WETH/wstETH@30MAY2025 + Market symbol: WETH/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0xa4FF94E96382f96C7Ea3f88415F9662993366127 + XT deployed at: 0xedfd81e8232aDBb1d6635ec04aa0766511925CD5 + GT deployed at: 0x1335b05566A699Ef54965Cc7563689D9429a4390 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-wstETH@13APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0x1e8F95669dc8CF8a4ab838299c6d876186517A63 + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0xb0005C7C89bfC330A67169e416829c5347B7f717 + XT deployed at: 0x13C6DFCb5c0142573D38dd20fFc52d21c3081e1c + GT deployed at: 0xCEDF76569e130a88fCd61EDc503ee374bF4c5565 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-wstETH@13APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x7317AEb20254Bd43683333296CB903EcEe31e55d + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0xd45b1Bd85576e2A547677e74a3f5DD61f0A6546f + XT deployed at: 0x9195691eeCb0D60F5fDf48759b526dE9a85c5bE7 + GT deployed at: 0xfeEd33CdebCdD56BcCa7feAdFe560cc39C285Ef8 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WBTC@13APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xFd4188C472ADD94fa2325290C4A831FF47acD444 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x2Eb3BCab8276a6A32aE1533B7720BD0A5c73745F + XT deployed at: 0x2c2d37d2D2FF88Fe97456b5b66eB96A3B15C4f4B + GT deployed at: 0x5eF213f42489CF00377A72891308CF888B6310c5 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-weETH@13APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x6eF5C3B3ed271CA0e0a540adDA6a51dD5B5Ce7d4 + Market name: USDC/WETH@30MAY2025 + Market symbol: USDC/WETH@30MAY2025 + Collateral (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x46C7441e9B8d8A6017EbeFf4A61b4615575E6777 + XT deployed at: 0x8b09CF402E5807Ae70626E89c55D2746888fC10C + GT deployed at: 0x1dD00B382d8976798d21f4d38191798dd2143E54 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WETH@13APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x7e7d8c959155b10A3D47Afbc28888A44b27A26Dc + Market name: USDC/ARB@30MAY2025 + Market symbol: USDC/ARB@30MAY2025 + Collateral (ARB) address: 0x912CE59144191C1204E64559FE8253a0e49E6548 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0xD27AA5b326e58DfA182E77409d72d17301a03f42 + XT deployed at: 0xAeA24e9a8f57688779e60e5ee7abE16A8cad54e6 + GT deployed at: 0x3380CAD698f34098c9306FF8168003396BAdb39A + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-ARB@13APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0xedac8FE94A6D9E6650EEF40622386173B1e2371d + Market name: WETH/PT-weETH-26JUN2025@27JUN2025 + Market symbol: WETH/PT-weETH-26JUN2025@27JUN2025 + Collateral (PT-weETH-26JUN2025) address: 0xb33808ea0e883138680BA29311a220A7377cdb92 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0xeF26767b7B20Ff8eB88fB076e7b5876129449077 + XT deployed at: 0x68955585F7B6953DD3270b71007685d65F7F8B13 + GT deployed at: 0xB7994F1b4d780C088EEcB8c71c35B404dA9Ef08e + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-PT-weETH-26JUN2025@13APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 42161 + +Estimated gas price: 0.027418001 gwei + +Estimated total gas used for script: 10138787 + +Estimated amount required: 0.000277985272104787 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x79fce305b4c13277a1b3b002985a57a8465694e5, 0xa4ff94e96382f96c7ea3f88415f9662993366127, 0xedfd81e8232adbb1d6635ec04aa0766511925cd5, 0x1335b05566a699ef54965cc7563689d9429a4390, 0x1e8f95669dc8cf8a4ab838299c6d876186517a63, 0xb0005c7c89bfc330a67169e416829c5347b7f717, 0x13c6dfcb5c0142573d38dd20ffc52d21c3081e1c, 0xcedf76569e130a88fcd61edc503ee374bf4c5565, 0x7317aeb20254bd43683333296cb903ecee31e55d, 0xd45b1bd85576e2a547677e74a3f5dd61f0a6546f, 0x9195691eecb0d60f5fdf48759b526de9a85c5be7, 0xfeed33cdebcdd56bcca7feadfe560cc39c285ef8, 0xfd4188c472add94fa2325290c4a831ff47acd444, 0x2eb3bcab8276a6a32ae1533b7720bd0a5c73745f, 0x2c2d37d2d2ff88fe97456b5b66eb96a3b15c4f4b, 0x5ef213f42489cf00377a72891308cf888b6310c5, 0x6ef5c3b3ed271ca0e0a540adda6a51dd5b5ce7d4, 0x46c7441e9b8d8a6017ebeff4a61b4615575e6777, 0x8b09cf402e5807ae70626e89c55d2746888fc10c, 0x1dd00b382d8976798d21f4d38191798dd2143e54, 0x7e7d8c959155b10a3d47afbc28888a44b27a26dc, 0xd27aa5b326e58dfa182e77409d72d17301a03f42, 0xaea24e9a8f57688779e60e5ee7abe16a8cad54e6, 0x3380cad698f34098c9306ff8168003396badb39a, 0xedac8fe94a6d9e6650eef40622386173b1e2371d, 0xef26767b7b20ff8eb88fb076e7b5876129449077, 0x68955585f7b6953dd3270b71007685d65f7f8b13, 0xb7994f1b4d780c088eecb8c71c35b404da9ef08e]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/42161/run-latest.json + +[SUCCESS] market deployment to arb-mainnet completed successfully! diff --git a/deployments/arb-mainnet-v1.0.8-test-20250414-1500/accept-oracles-20250403-log.txt b/deployments/arb-mainnet-v1.0.8-test-20250414-1500/accept-oracles-20250403-log.txt new file mode 100644 index 0000000..2a93d96 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250414-1500/accept-oracles-20250403-log.txt @@ -0,0 +1,107 @@ +Running on arb-mainnet... +=== Configuration === +Operation: Script Execution +Network: arb-mainnet +Script: AcceptOracles.s.sol +Path: script/AcceptOracles.s.sol +RPC URL: http*****://arb-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Disabled +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xa669e7A0d4b3e4Fa48af2dE86BD4CD7126Be4e13 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting script execution... +Executing: forge script script/AcceptOracles.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow +No files changed, compilation skipped +Script ran successfully. + +== Logs == + === Checking Pending Oracles === + Oracle Aggregator Address: 0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa + Network: arb-mainnet + Current Block Timestamp: 1743663209 + + Accepted oracle for token: + Token Symbol: WETH + Token Address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: wstETH + Token Address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: USDC + Token Address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: WBTC + Token Address: 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: weETH + Token Address: 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: ARB + Token Address: 0x912CE59144191C1204E64559FE8253a0e49E6548 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: PT-weETH-26JUN2025 + Token Address: 0xb33808ea0e883138680BA29311a220A7377cdb92 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Heartbeat: 86400 + -------------------------------- + + === Oracle Acceptance Summary === + Total tokens checked: 7 + Oracles accepted: 7 + Oracles not ready: 0 + +## Setting up 1 EVM. + +========================== + +Chain 42161 + +Estimated gas price: 0.020000001 gwei + +Estimated total gas used for script: 914354 + +Estimated amount required: 0.000018287080914354 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/AcceptOracles.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/AcceptOracles.s.sol/42161/run-latest.json + +[SUCCESS] Script AcceptOracles executed successfully on arb-mainnet (Broadcast mode)! diff --git a/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-access-manager.json b/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-access-manager.json new file mode 100644 index 0000000..f75a2f5 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743606817", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182046", + "timestamp": "1743606817" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-core.json b/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-core.json new file mode 100644 index 0000000..435d898 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743608156", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182159", + "timestamp": "1743608156" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x14920Eb11b71873d01c93B589b40585dacfCA096", + "vaultFactory": "0x929CBcb8150aD59DB63c92A7dAEc07b30d38bA79", + "oracleAggregator": "0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa", + "router": "0x7fa333b184868d88aC78a82eC06d5e87d4B0322E", + "swapAdapter": { + "uniswapV3Adapter": "0x609F20ee24E10010A62970E1dAb7E2b84eD74CAb", + "odosV2Adapter": "0x7de4efa140E52B7207FA689D41AfEE461B83E748", + "pendleSwapV3Adapter": "0xb0eCCbaD4b4cc190261c29C6E8d85bcF04284a8b", + "ERC4626VaultAdapter": "0xa50929A67daF9Ff3567e2Bb3411204A134f72546" + }, + "marketViewer": "0x276C0E52508d94ff2D4106b1559c8c4Bc3a75dec" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-market-USDC-ARB@14APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-market-USDC-ARB@14APR2025.json new file mode 100644 index 0000000..87803b8 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-market-USDC-ARB@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325208244", + "timestamp": "1744364407" + }, + "market": "0x3b5F5473e495deBDF5fB5B4EF4B06eD058f2fD7b", + "collateral": { + "address": "0x912CE59144191C1204E64559FE8253a0e49E6548", + "symbol": "ARB", + "priceFeed": "0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xeB912c87b727E435E7C25110dF5A30E6FdB88F8A", + "xt": "0xdA37d425C3dBb22388284b85f10572DCe9092230", + "gt": "0xE90D046Dd53dfba2469B9168c385805d0ab780d1" + }, + "config": { + "marketSymbol": "USDC/ARB@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-market-USDC-WBTC@14APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-market-USDC-WBTC@14APR2025.json new file mode 100644 index 0000000..73af9ee --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-market-USDC-WBTC@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325208244", + "timestamp": "1744364407" + }, + "market": "0x4f1569adf58e3CDaFf1Af2D3f76CE43feAEe57B5", + "collateral": { + "address": "0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f", + "symbol": "WBTC", + "priceFeed": "0xd0C7101eACbB49F3deCcCc166d238410D6D46d57", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x3408BD3b062770BbCff6a438500e549703c6A145", + "xt": "0x0cc5262ffcbd45b1e7592EC9BBA44f0957d0F166", + "gt": "0x171E5B98E35c4Df5770864C942ceB8650c2a548F" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-market-USDC-WETH@14APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-market-USDC-WETH@14APR2025.json new file mode 100644 index 0000000..b6548b3 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-market-USDC-WETH@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325208244", + "timestamp": "1744364407" + }, + "market": "0x74271F0CdC7583C2d5F2a3Eaa65CcA519d4807c4", + "collateral": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x6c40F8E62138CbF834910eB1C7f4D731e6cAb2C7", + "xt": "0x43608d1a1949067167b0A51f620839432BF5fB51", + "gt": "0x678E4F5793f925391651ce33946b8829344376e2" + }, + "config": { + "marketSymbol": "USDC/WETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-market-USDC-wstETH@14APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-market-USDC-wstETH@14APR2025.json new file mode 100644 index 0000000..97d637e --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-market-USDC-wstETH@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325208244", + "timestamp": "1744364407" + }, + "market": "0xD98A186d3C9C83B50416B4e11574381bb669daea", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xB9ddAca9a9d7F598373fc9a78aD654Cd45d14198", + "xt": "0xA94F9230Ca17b6626568a46e8De17C5d85dB0aaD", + "gt": "0xb6f457C30c6e670520BDEbC1bbdFFED0F724c048" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-market-WETH-PT-weETH-26JUN2025@14APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-market-WETH-PT-weETH-26JUN2025@14APR2025.json new file mode 100644 index 0000000..e3ec0a3 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-market-WETH-PT-weETH-26JUN2025@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325208244", + "timestamp": "1744364407" + }, + "market": "0x24972D5de9376cc8c31486851fbbb1D6438fE6B6", + "collateral": { + "address": "0xb33808ea0e883138680BA29311a220A7377cdb92", + "symbol": "PT-weETH-26JUN2025", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x1016ea41d3C23395F740b8fD5320B1900631DEd0", + "xt": "0xc993b3dCa27071ce74923690263ACf01d1b55f79", + "gt": "0xcBABBcdD91E971A2a07D51dB0Cd1673D6fe46c45" + }, + "config": { + "marketSymbol": "WETH/PT-weETH-26JUN2025@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-market-WETH-weETH@14APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-market-WETH-weETH@14APR2025.json new file mode 100644 index 0000000..6d39106 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-market-WETH-weETH@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325208244", + "timestamp": "1744364407" + }, + "market": "0x1406E78edfaa8844Fb737d1D3F426f8e401369aa", + "collateral": { + "address": "0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe", + "symbol": "weETH", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xCB84aC7AE32a261544b28f5E23aa334F92D4782A", + "xt": "0xD0536ab09ed6180F9EbAD8E978c2392B9D3eb0A9", + "gt": "0x8aC5452743f554851c452D02E77Fe4be576e34Bf" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-market-WETH-wstETH@14APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-market-WETH-wstETH@14APR2025.json new file mode 100644 index 0000000..5fd65ae --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-market-WETH-wstETH@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325208244", + "timestamp": "1744364407" + }, + "market": "0x60461317e526B3f2862Fb8A28A10D40c4AD7E7Ca", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x4C6F766DDe2CEA9752Df3BE4585a83131207cEe8", + "xt": "0xB516d58B72B2E476f2CD9e4ca777bFe36e6dA3b0", + "gt": "0x49C6ee9F64272948919fa9Fc76E54a03ffC5BdcB" + }, + "config": { + "marketSymbol": "WETH/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-vault-TMX-USDC.json b/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-vault-TMX-USDC.json new file mode 100644 index 0000000..af05fff --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-vault-TMX-USDC.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "324633071", + "timestamp": "1744220329" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TMX-USDC", + "address": "0xc94b752839a22D2C44E99e298671dd4B2aDd11b3", + "asset": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "performanceFeeRate": 0, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-vault-TMX-WETH.json b/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-vault-TMX-WETH.json new file mode 100644 index 0000000..9177b68 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-vault-TMX-WETH.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "324634324", + "timestamp": "1744220643" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TMX-WETH", + "address": "0x8c5161f287Cbc9Afa48bC8972eE8CC0a755fcAdC", + "asset": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "performanceFeeRate": 0, + "maxCapacity": "5000000000000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-vault-TermMax USDC Vault.json b/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-vault-TermMax USDC Vault.json new file mode 100644 index 0000000..4084050 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-vault-TermMax USDC Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22186270", + "timestamp": "1743657771" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TermMax USDC Vault", + "address": "0x9170A095e7073559ffe1240ccF692Abb94F32a28", + "asset": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "performanceFeeRate": 10000000, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-vault-TermMax WETH Vault.json b/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-vault-TermMax WETH Vault.json new file mode 100644 index 0000000..7b33cbf --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250414-1500/arb-mainnet-vault-TermMax WETH Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22182632", + "timestamp": "1743613861" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TermMax WETH Vault", + "address": "0xeBF448902145f65b4E1B3C4e3A269444e0213C9e", + "asset": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "performanceFeeRate": 10000000, + "maxCapacity": "500000000000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250414-1500/deploy-arb-markets-test-20250414-1500-log.txt b/deployments/arb-mainnet-v1.0.8-test-20250414-1500/deploy-arb-markets-test-20250414-1500-log.txt new file mode 100644 index 0000000..a5cdb5e --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250414-1500/deploy-arb-markets-test-20250414-1500-log.txt @@ -0,0 +1,243 @@ +Running on arb-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: arb-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://arbi*****.gate*****.tend*****.co/agLs***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ARBSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xde1cdb58961941699a119629baed0334da2512a3 + + ===== Block Info ===== + Block number: 325208244 + Block timestamp: 1744364407 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 325208244 + + ===== Market Info - 0 ===== + Market deployed at: 0x60461317e526B3f2862Fb8A28A10D40c4AD7E7Ca + Market name: WETH/wstETH@30MAY2025 + Market symbol: WETH/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x4C6F766DDe2CEA9752Df3BE4585a83131207cEe8 + XT deployed at: 0xB516d58B72B2E476f2CD9e4ca777bFe36e6dA3b0 + GT deployed at: 0x49C6ee9F64272948919fa9Fc76E54a03ffC5BdcB + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-wstETH@14APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xD98A186d3C9C83B50416B4e11574381bb669daea + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0xB9ddAca9a9d7F598373fc9a78aD654Cd45d14198 + XT deployed at: 0xA94F9230Ca17b6626568a46e8De17C5d85dB0aaD + GT deployed at: 0xb6f457C30c6e670520BDEbC1bbdFFED0F724c048 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-wstETH@14APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x4f1569adf58e3CDaFf1Af2D3f76CE43feAEe57B5 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x3408BD3b062770BbCff6a438500e549703c6A145 + XT deployed at: 0x0cc5262ffcbd45b1e7592EC9BBA44f0957d0F166 + GT deployed at: 0x171E5B98E35c4Df5770864C942ceB8650c2a548F + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WBTC@14APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0x1406E78edfaa8844Fb737d1D3F426f8e401369aa + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0xCB84aC7AE32a261544b28f5E23aa334F92D4782A + XT deployed at: 0xD0536ab09ed6180F9EbAD8E978c2392B9D3eb0A9 + GT deployed at: 0x8aC5452743f554851c452D02E77Fe4be576e34Bf + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-weETH@14APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x74271F0CdC7583C2d5F2a3Eaa65CcA519d4807c4 + Market name: USDC/WETH@30MAY2025 + Market symbol: USDC/WETH@30MAY2025 + Collateral (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x6c40F8E62138CbF834910eB1C7f4D731e6cAb2C7 + XT deployed at: 0x43608d1a1949067167b0A51f620839432BF5fB51 + GT deployed at: 0x678E4F5793f925391651ce33946b8829344376e2 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WETH@14APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x3b5F5473e495deBDF5fB5B4EF4B06eD058f2fD7b + Market name: USDC/ARB@30MAY2025 + Market symbol: USDC/ARB@30MAY2025 + Collateral (ARB) address: 0x912CE59144191C1204E64559FE8253a0e49E6548 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0xeB912c87b727E435E7C25110dF5A30E6FdB88F8A + XT deployed at: 0xdA37d425C3dBb22388284b85f10572DCe9092230 + GT deployed at: 0xE90D046Dd53dfba2469B9168c385805d0ab780d1 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-ARB@14APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x24972D5de9376cc8c31486851fbbb1D6438fE6B6 + Market name: WETH/PT-weETH-26JUN2025@27JUN2025 + Market symbol: WETH/PT-weETH-26JUN2025@27JUN2025 + Collateral (PT-weETH-26JUN2025) address: 0xb33808ea0e883138680BA29311a220A7377cdb92 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x1016ea41d3C23395F740b8fD5320B1900631DEd0 + XT deployed at: 0xc993b3dCa27071ce74923690263ACf01d1b55f79 + GT deployed at: 0xcBABBcdD91E971A2a07D51dB0Cd1673D6fe46c45 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-PT-weETH-26JUN2025@14APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 42161 + +Estimated gas price: 0.020000001 gwei + +Estimated total gas used for script: 10153728 + +Estimated amount required: 0.000203074570153728 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x60461317e526b3f2862fb8a28a10d40c4ad7e7ca, 0x4c6f766dde2cea9752df3be4585a83131207cee8, 0xb516d58b72b2e476f2cd9e4ca777bfe36e6da3b0, 0x49c6ee9f64272948919fa9fc76e54a03ffc5bdcb, 0xd98a186d3c9c83b50416b4e11574381bb669daea, 0xb9ddaca9a9d7f598373fc9a78ad654cd45d14198, 0xa94f9230ca17b6626568a46e8de17c5d85db0aad, 0xb6f457c30c6e670520bdebc1bbdffed0f724c048, 0x4f1569adf58e3cdaff1af2d3f76ce43feaee57b5, 0x3408bd3b062770bbcff6a438500e549703c6a145, 0x0cc5262ffcbd45b1e7592ec9bba44f0957d0f166, 0x171e5b98e35c4df5770864c942ceb8650c2a548f, 0x1406e78edfaa8844fb737d1d3f426f8e401369aa, 0xcb84ac7ae32a261544b28f5e23aa334f92d4782a, 0xd0536ab09ed6180f9ebad8e978c2392b9d3eb0a9, 0x8ac5452743f554851c452d02e77fe4be576e34bf, 0x74271f0cdc7583c2d5f2a3eaa65cca519d4807c4, 0x6c40f8e62138cbf834910eb1c7f4d731e6cab2c7, 0x43608d1a1949067167b0a51f620839432bf5fb51, 0x678e4f5793f925391651ce33946b8829344376e2, 0x3b5f5473e495debdf5fb5b4ef4b06ed058f2fd7b, 0xeb912c87b727e435e7c25110df5a30e6fdb88f8a, 0xda37d425c3dbb22388284b85f10572dce9092230, 0xe90d046dd53dfba2469b9168c385805d0ab780d1, 0x24972d5de9376cc8c31486851fbbb1d6438fe6b6, 0x1016ea41d3c23395f740b8fd5320b1900631ded0, 0xc993b3dca27071ce74923690263acf01d1b55f79, 0xcbabbcdd91e971a2a07d51db0cd1673d6fe46c45]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/42161/run-latest.json + +[SUCCESS] market deployment to arb-mainnet completed successfully! diff --git a/deployments/arb-mainnet-v1.0.8-test-20250414-2000/accept-oracles-20250403-log.txt b/deployments/arb-mainnet-v1.0.8-test-20250414-2000/accept-oracles-20250403-log.txt new file mode 100644 index 0000000..2a93d96 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250414-2000/accept-oracles-20250403-log.txt @@ -0,0 +1,107 @@ +Running on arb-mainnet... +=== Configuration === +Operation: Script Execution +Network: arb-mainnet +Script: AcceptOracles.s.sol +Path: script/AcceptOracles.s.sol +RPC URL: http*****://arb-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Disabled +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xa669e7A0d4b3e4Fa48af2dE86BD4CD7126Be4e13 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting script execution... +Executing: forge script script/AcceptOracles.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow +No files changed, compilation skipped +Script ran successfully. + +== Logs == + === Checking Pending Oracles === + Oracle Aggregator Address: 0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa + Network: arb-mainnet + Current Block Timestamp: 1743663209 + + Accepted oracle for token: + Token Symbol: WETH + Token Address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: wstETH + Token Address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: USDC + Token Address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: WBTC + Token Address: 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: weETH + Token Address: 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: ARB + Token Address: 0x912CE59144191C1204E64559FE8253a0e49E6548 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: PT-weETH-26JUN2025 + Token Address: 0xb33808ea0e883138680BA29311a220A7377cdb92 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Heartbeat: 86400 + -------------------------------- + + === Oracle Acceptance Summary === + Total tokens checked: 7 + Oracles accepted: 7 + Oracles not ready: 0 + +## Setting up 1 EVM. + +========================== + +Chain 42161 + +Estimated gas price: 0.020000001 gwei + +Estimated total gas used for script: 914354 + +Estimated amount required: 0.000018287080914354 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/AcceptOracles.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/AcceptOracles.s.sol/42161/run-latest.json + +[SUCCESS] Script AcceptOracles executed successfully on arb-mainnet (Broadcast mode)! diff --git a/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-access-manager.json b/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-access-manager.json new file mode 100644 index 0000000..f75a2f5 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743606817", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182046", + "timestamp": "1743606817" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-core.json b/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-core.json new file mode 100644 index 0000000..435d898 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743608156", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182159", + "timestamp": "1743608156" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x14920Eb11b71873d01c93B589b40585dacfCA096", + "vaultFactory": "0x929CBcb8150aD59DB63c92A7dAEc07b30d38bA79", + "oracleAggregator": "0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa", + "router": "0x7fa333b184868d88aC78a82eC06d5e87d4B0322E", + "swapAdapter": { + "uniswapV3Adapter": "0x609F20ee24E10010A62970E1dAb7E2b84eD74CAb", + "odosV2Adapter": "0x7de4efa140E52B7207FA689D41AfEE461B83E748", + "pendleSwapV3Adapter": "0xb0eCCbaD4b4cc190261c29C6E8d85bcF04284a8b", + "ERC4626VaultAdapter": "0xa50929A67daF9Ff3567e2Bb3411204A134f72546" + }, + "marketViewer": "0x276C0E52508d94ff2D4106b1559c8c4Bc3a75dec" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-market-USDC-ARB@14APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-market-USDC-ARB@14APR2025.json new file mode 100644 index 0000000..d50a0e8 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-market-USDC-ARB@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325209688", + "timestamp": "1744364769" + }, + "market": "0x28977e47c5470A80d83B519C46E2Da6e59e5f143", + "collateral": { + "address": "0x912CE59144191C1204E64559FE8253a0e49E6548", + "symbol": "ARB", + "priceFeed": "0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x2b9B8e3b33A272690DC6a4251175C92fC3f44Bc9", + "xt": "0x9Cc38b3F1cd3Fc41ceBC84A775626784B0E12264", + "gt": "0xf06765F765C5F9591d66f9f06F2ED5D65a679D09" + }, + "config": { + "marketSymbol": "USDC/ARB@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-market-USDC-WBTC@14APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-market-USDC-WBTC@14APR2025.json new file mode 100644 index 0000000..e65fb31 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-market-USDC-WBTC@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325209688", + "timestamp": "1744364769" + }, + "market": "0x460423259552da8ED3D7945B2Ec3Af1419E6722C", + "collateral": { + "address": "0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f", + "symbol": "WBTC", + "priceFeed": "0xd0C7101eACbB49F3deCcCc166d238410D6D46d57", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x28651FEd51F4E3E2D39a62f3438F93bc9A9C44A6", + "xt": "0xe279BA4c7E466AD1e4fe98e9637729BFefa01C81", + "gt": "0x1B2638AFDf4C2963eC23e0AefC1e8d94759f3cA8" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-market-USDC-WETH@14APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-market-USDC-WETH@14APR2025.json new file mode 100644 index 0000000..d12bdf0 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-market-USDC-WETH@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325209688", + "timestamp": "1744364769" + }, + "market": "0x5Fb23BfAdA5C97570a45B06F99994c7224AeF653", + "collateral": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xc2327396940Aa3453aC8F2f00f75B7F2e5b059Dc", + "xt": "0xC68D0b54a8b282156e3c81B3e16ee10749cA7f68", + "gt": "0x8ce0B24D12b4F5c7a9481963594E7f623149a6F7" + }, + "config": { + "marketSymbol": "USDC/WETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-market-USDC-wstETH@14APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-market-USDC-wstETH@14APR2025.json new file mode 100644 index 0000000..93987bf --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-market-USDC-wstETH@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325209688", + "timestamp": "1744364769" + }, + "market": "0xCC9844D517b2BF2E4d645F2121F21e3b10941d6a", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xf5406a53e94A9FAe4C813784F65C167C8cA1A7eD", + "xt": "0xc6fbbc8fDf94Dd4067f1BBC5D957D5DDC0d58b66", + "gt": "0xdce8F451265f1CCd66Dc05d5C1Fa020A5C857450" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@14APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@14APR2025.json new file mode 100644 index 0000000..f9753b6 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-market-WETH-PT-weETH-26JUN2025@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325209688", + "timestamp": "1744364769" + }, + "market": "0x6Bb9fB25Cf93C226d1114416623FD776045797C1", + "collateral": { + "address": "0xb33808ea0e883138680BA29311a220A7377cdb92", + "symbol": "PT-weETH-26JUN2025", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x216D61b43D7Fb45511515B93B2d9eD83032586B1", + "xt": "0x4D814c2B037D22B772EFe26199A593543Ff608F2", + "gt": "0x0E1b8AFe6D936e746D7C495c2204fd281392A9CF" + }, + "config": { + "marketSymbol": "WETH/PT-weETH-26JUN2025@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-market-WETH-weETH@14APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-market-WETH-weETH@14APR2025.json new file mode 100644 index 0000000..7c0d958 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-market-WETH-weETH@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325209688", + "timestamp": "1744364769" + }, + "market": "0x1ABe1F4F1bbABC2b3076Bf2CE766dC2554aA7ce6", + "collateral": { + "address": "0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe", + "symbol": "weETH", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x6aA835DA33985900E3571BEfEB5BB5eed308cB0F", + "xt": "0xCF5251690281E40B255A108b93357853CBC84EF3", + "gt": "0x54e2d173C800494aBc5049319a51fc22988562D1" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-market-WETH-wstETH@14APR2025.json b/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-market-WETH-wstETH@14APR2025.json new file mode 100644 index 0000000..5fe2a71 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-market-WETH-wstETH@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "325209688", + "timestamp": "1744364769" + }, + "market": "0x945aE0004614CBf2d7355e0A0105AAa36C92AC1a", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x8569e536beb2a43E069e20f37618d6EA3325Db20", + "xt": "0xDC322CFE96289D3cA789f66f4bA2da2a9BC2B9a4", + "gt": "0xE1A48E5f4EBD564Ce5291F396580e9D9252D1E1A" + }, + "config": { + "marketSymbol": "WETH/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-vault-TMX-USDC.json b/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-vault-TMX-USDC.json new file mode 100644 index 0000000..af05fff --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-vault-TMX-USDC.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "324633071", + "timestamp": "1744220329" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TMX-USDC", + "address": "0xc94b752839a22D2C44E99e298671dd4B2aDd11b3", + "asset": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "performanceFeeRate": 0, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-vault-TMX-WETH.json b/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-vault-TMX-WETH.json new file mode 100644 index 0000000..9177b68 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-vault-TMX-WETH.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "324634324", + "timestamp": "1744220643" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TMX-WETH", + "address": "0x8c5161f287Cbc9Afa48bC8972eE8CC0a755fcAdC", + "asset": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "performanceFeeRate": 0, + "maxCapacity": "5000000000000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-vault-TermMax USDC Vault.json b/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-vault-TermMax USDC Vault.json new file mode 100644 index 0000000..4084050 --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-vault-TermMax USDC Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22186270", + "timestamp": "1743657771" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TermMax USDC Vault", + "address": "0x9170A095e7073559ffe1240ccF692Abb94F32a28", + "asset": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "performanceFeeRate": 10000000, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-vault-TermMax WETH Vault.json b/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-vault-TermMax WETH Vault.json new file mode 100644 index 0000000..7b33cbf --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250414-2000/arb-mainnet-vault-TermMax WETH Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22182632", + "timestamp": "1743613861" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TermMax WETH Vault", + "address": "0xeBF448902145f65b4E1B3C4e3A269444e0213C9e", + "asset": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "performanceFeeRate": 10000000, + "maxCapacity": "500000000000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet-v1.0.8-test-20250414-2000/deploy-arb-markets-test-20250414-2000-log.txt b/deployments/arb-mainnet-v1.0.8-test-20250414-2000/deploy-arb-markets-test-20250414-2000-log.txt new file mode 100644 index 0000000..871f19d --- /dev/null +++ b/deployments/arb-mainnet-v1.0.8-test-20250414-2000/deploy-arb-markets-test-20250414-2000-log.txt @@ -0,0 +1,243 @@ +Running on arb-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: arb-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://arbi*****.gate*****.tend*****.co/agLs***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ARBSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xde1cdb58961941699a119629baed0334da2512a3 + + ===== Block Info ===== + Block number: 325209688 + Block timestamp: 1744364769 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 325209688 + + ===== Market Info - 0 ===== + Market deployed at: 0x945aE0004614CBf2d7355e0A0105AAa36C92AC1a + Market name: WETH/wstETH@30MAY2025 + Market symbol: WETH/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x8569e536beb2a43E069e20f37618d6EA3325Db20 + XT deployed at: 0xDC322CFE96289D3cA789f66f4bA2da2a9BC2B9a4 + GT deployed at: 0xE1A48E5f4EBD564Ce5291F396580e9D9252D1E1A + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-wstETH@14APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xCC9844D517b2BF2E4d645F2121F21e3b10941d6a + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0xf5406a53e94A9FAe4C813784F65C167C8cA1A7eD + XT deployed at: 0xc6fbbc8fDf94Dd4067f1BBC5D957D5DDC0d58b66 + GT deployed at: 0xdce8F451265f1CCd66Dc05d5C1Fa020A5C857450 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-wstETH@14APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x460423259552da8ED3D7945B2Ec3Af1419E6722C + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x28651FEd51F4E3E2D39a62f3438F93bc9A9C44A6 + XT deployed at: 0xe279BA4c7E466AD1e4fe98e9637729BFefa01C81 + GT deployed at: 0x1B2638AFDf4C2963eC23e0AefC1e8d94759f3cA8 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WBTC@14APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0x1ABe1F4F1bbABC2b3076Bf2CE766dC2554aA7ce6 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x6aA835DA33985900E3571BEfEB5BB5eed308cB0F + XT deployed at: 0xCF5251690281E40B255A108b93357853CBC84EF3 + GT deployed at: 0x54e2d173C800494aBc5049319a51fc22988562D1 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-weETH@14APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x5Fb23BfAdA5C97570a45B06F99994c7224AeF653 + Market name: USDC/WETH@30MAY2025 + Market symbol: USDC/WETH@30MAY2025 + Collateral (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0xc2327396940Aa3453aC8F2f00f75B7F2e5b059Dc + XT deployed at: 0xC68D0b54a8b282156e3c81B3e16ee10749cA7f68 + GT deployed at: 0x8ce0B24D12b4F5c7a9481963594E7f623149a6F7 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WETH@14APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x28977e47c5470A80d83B519C46E2Da6e59e5f143 + Market name: USDC/ARB@30MAY2025 + Market symbol: USDC/ARB@30MAY2025 + Collateral (ARB) address: 0x912CE59144191C1204E64559FE8253a0e49E6548 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x2b9B8e3b33A272690DC6a4251175C92fC3f44Bc9 + XT deployed at: 0x9Cc38b3F1cd3Fc41ceBC84A775626784B0E12264 + GT deployed at: 0xf06765F765C5F9591d66f9f06F2ED5D65a679D09 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-ARB@14APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x6Bb9fB25Cf93C226d1114416623FD776045797C1 + Market name: WETH/PT-weETH-26JUN2025@27JUN2025 + Market symbol: WETH/PT-weETH-26JUN2025@27JUN2025 + Collateral (PT-weETH-26JUN2025) address: 0xb33808ea0e883138680BA29311a220A7377cdb92 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x216D61b43D7Fb45511515B93B2d9eD83032586B1 + XT deployed at: 0x4D814c2B037D22B772EFe26199A593543Ff608F2 + GT deployed at: 0x0E1b8AFe6D936e746D7C495c2204fd281392A9CF + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-PT-weETH-26JUN2025@14APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 42161 + +Estimated gas price: 0.020000001 gwei + +Estimated total gas used for script: 10221309 + +Estimated amount required: 0.000204426190221309 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x945ae0004614cbf2d7355e0a0105aaa36c92ac1a, 0x8569e536beb2a43e069e20f37618d6ea3325db20, 0xdc322cfe96289d3ca789f66f4ba2da2a9bc2b9a4, 0xe1a48e5f4ebd564ce5291f396580e9d9252d1e1a, 0xcc9844d517b2bf2e4d645f2121f21e3b10941d6a, 0xf5406a53e94a9fae4c813784f65c167c8ca1a7ed, 0xc6fbbc8fdf94dd4067f1bbc5d957d5ddc0d58b66, 0xdce8f451265f1ccd66dc05d5c1fa020a5c857450, 0x460423259552da8ed3d7945b2ec3af1419e6722c, 0x28651fed51f4e3e2d39a62f3438f93bc9a9c44a6, 0xe279ba4c7e466ad1e4fe98e9637729bfefa01c81, 0x1b2638afdf4c2963ec23e0aefc1e8d94759f3ca8, 0x1abe1f4f1bbabc2b3076bf2ce766dc2554aa7ce6, 0x6aa835da33985900e3571befeb5bb5eed308cb0f, 0xcf5251690281e40b255a108b93357853cbc84ef3, 0x54e2d173c800494abc5049319a51fc22988562d1, 0x5fb23bfada5c97570a45b06f99994c7224aef653, 0xc2327396940aa3453ac8f2f00f75b7f2e5b059dc, 0xc68d0b54a8b282156e3c81b3e16ee10749ca7f68, 0x8ce0b24d12b4f5c7a9481963594e7f623149a6f7, 0x28977e47c5470a80d83b519c46e2da6e59e5f143, 0x2b9b8e3b33a272690dc6a4251175c92fc3f44bc9, 0x9cc38b3f1cd3fc41cebc84a775626784b0e12264, 0xf06765f765c5f9591d66f9f06f2ed5d65a679d09, 0x6bb9fb25cf93c226d1114416623fd776045797c1, 0x216d61b43d7fb45511515b93b2d9ed83032586b1, 0x4d814c2b037d22b772efe26199a593543ff608f2, 0x0e1b8afe6d936e746d7c495c2204fd281392a9cf]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/42161/run-latest.json + +[SUCCESS] market deployment to arb-mainnet completed successfully! diff --git a/deployments/arb-mainnet/accept-oracles-20250403-log.txt b/deployments/arb-mainnet/accept-oracles-20250403-log.txt new file mode 100644 index 0000000..2a93d96 --- /dev/null +++ b/deployments/arb-mainnet/accept-oracles-20250403-log.txt @@ -0,0 +1,107 @@ +Running on arb-mainnet... +=== Configuration === +Operation: Script Execution +Network: arb-mainnet +Script: AcceptOracles.s.sol +Path: script/AcceptOracles.s.sol +RPC URL: http*****://arb-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Disabled +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xa669e7A0d4b3e4Fa48af2dE86BD4CD7126Be4e13 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting script execution... +Executing: forge script script/AcceptOracles.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow +No files changed, compilation skipped +Script ran successfully. + +== Logs == + === Checking Pending Oracles === + Oracle Aggregator Address: 0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa + Network: arb-mainnet + Current Block Timestamp: 1743663209 + + Accepted oracle for token: + Token Symbol: WETH + Token Address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: wstETH + Token Address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: USDC + Token Address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: WBTC + Token Address: 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: weETH + Token Address: 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: ARB + Token Address: 0x912CE59144191C1204E64559FE8253a0e49E6548 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: PT-weETH-26JUN2025 + Token Address: 0xb33808ea0e883138680BA29311a220A7377cdb92 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Heartbeat: 86400 + -------------------------------- + + === Oracle Acceptance Summary === + Total tokens checked: 7 + Oracles accepted: 7 + Oracles not ready: 0 + +## Setting up 1 EVM. + +========================== + +Chain 42161 + +Estimated gas price: 0.020000001 gwei + +Estimated total gas used for script: 914354 + +Estimated amount required: 0.000018287080914354 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/AcceptOracles.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/AcceptOracles.s.sol/42161/run-latest.json + +[SUCCESS] Script AcceptOracles executed successfully on arb-mainnet (Broadcast mode)! diff --git a/deployments/arb-mainnet/arb-mainnet-V2-adapters-03JUN2025.json b/deployments/arb-mainnet/arb-mainnet-V2-adapters-03JUN2025.json new file mode 100644 index 0000000..f45dd9f --- /dev/null +++ b/deployments/arb-mainnet/arb-mainnet-V2-adapters-03JUN2025.json @@ -0,0 +1,26 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1748946564", + "dateString": "03JUN2025", + "gitBranch": "deploy/v1.0.9", + "gitCommitHash": "0x0x0489591746b16bb969ea123423e618e76b7e2dcb", + "blockInfo": { + "number": "343446256", + "timestamp": "1748946564" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x0000000000000000000000000000000000000000", + "accessManager": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "router": "0x7fa333b184868d88aC78a82eC06d5e87d4B0322E", + "contracts": { + "odosV2Adapter": "0xddc9Aabe0fD4270E3E537ea3C2c36b2aD5574FC7", + "pendleSwapV3Adapter": "0x924204d7Eae3A096C9bC0f6aE3D4140583b5E778", + "uniswapV3Adapter": "0x8b910b6bB8d9CBCEB68fFB5E5E1812C516182B70", + "erc4626VaultAdapter": "0x05B48bF072123BD7D20C965aE8BeF2A23dc2AfEE" + }, + "routerAddresses": { + "uniswapV3Router": "0xE592427A0AEce92De3Edee1F18E0157C05861564", + "odosV2Router": "0xa669e7A0d4b3e4Fa48af2dE86BD4CD7126Be4e13", + "pendleSwapV3Router": "0x888888888889758F76e7103c6CbF23ABbF58F946" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet/arb-mainnet-access-manager.json b/deployments/arb-mainnet/arb-mainnet-access-manager.json new file mode 100644 index 0000000..f75a2f5 --- /dev/null +++ b/deployments/arb-mainnet/arb-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743606817", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182046", + "timestamp": "1743606817" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet/arb-mainnet-core.json b/deployments/arb-mainnet/arb-mainnet-core.json new file mode 100644 index 0000000..435d898 --- /dev/null +++ b/deployments/arb-mainnet/arb-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1743608156", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x5d493753c1ba3ec4b848690b28ab1bd5846cbac1", + "blockInfo": { + "number": "22182159", + "timestamp": "1743608156" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x14920Eb11b71873d01c93B589b40585dacfCA096", + "vaultFactory": "0x929CBcb8150aD59DB63c92A7dAEc07b30d38bA79", + "oracleAggregator": "0x2e1c769A9BA8248C7c8128c2BEBa11331ebF98Aa", + "router": "0x7fa333b184868d88aC78a82eC06d5e87d4B0322E", + "swapAdapter": { + "uniswapV3Adapter": "0x609F20ee24E10010A62970E1dAb7E2b84eD74CAb", + "odosV2Adapter": "0x7de4efa140E52B7207FA689D41AfEE461B83E748", + "pendleSwapV3Adapter": "0xb0eCCbaD4b4cc190261c29C6E8d85bcF04284a8b", + "ERC4626VaultAdapter": "0xa50929A67daF9Ff3567e2Bb3411204A134f72546" + }, + "marketViewer": "0x276C0E52508d94ff2D4106b1559c8c4Bc3a75dec" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet/arb-mainnet-market-USDC-ARB@27JUN2025.json b/deployments/arb-mainnet/arb-mainnet-market-USDC-ARB@27JUN2025.json new file mode 100644 index 0000000..783a62b --- /dev/null +++ b/deployments/arb-mainnet/arb-mainnet-market-USDC-ARB@27JUN2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "334435607", + "timestamp": "1746682800" + }, + "market": "0x0b91Cd4e86F0DBBbB2c37c384e1fA91B9a5A3220", + "collateral": { + "address": "0x912CE59144191C1204E64559FE8253a0e49E6548", + "symbol": "ARB", + "priceFeed": "0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x7FD98474f7F3F5Ee5823395f79C1258CED0649c6", + "xt": "0x5fF0e5bf7Af82F8a05c7BCe2Aa522df8F869e2Bd", + "gt": "0x1Be601F4f8CBBc632D45E664E262E86c11771B63" + }, + "config": { + "marketSymbol": "USDC/ARB@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "27JUN2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "10000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet/arb-mainnet-market-USDC-WBTC@27JUN2025.json b/deployments/arb-mainnet/arb-mainnet-market-USDC-WBTC@27JUN2025.json new file mode 100644 index 0000000..d03d5ce --- /dev/null +++ b/deployments/arb-mainnet/arb-mainnet-market-USDC-WBTC@27JUN2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "334435607", + "timestamp": "1746682800" + }, + "market": "0x10Af30e205Da0fFc594433BB87e41039be5d1f01", + "collateral": { + "address": "0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f", + "symbol": "WBTC", + "priceFeed": "0xd0C7101eACbB49F3deCcCc166d238410D6D46d57", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xCCB07922901E454F71f5A2ec67D4C2E8d2dff625", + "xt": "0xECfeFb11B855A32d719689f5C2A963534aB77502", + "gt": "0xAd66772ab0CDb0af994050636017c3578E24022b" + }, + "config": { + "marketSymbol": "USDC/WBTC@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "27JUN2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "10000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet/arb-mainnet-market-USDC-WETH@27JUN2025.json b/deployments/arb-mainnet/arb-mainnet-market-USDC-WETH@27JUN2025.json new file mode 100644 index 0000000..d5fc5d3 --- /dev/null +++ b/deployments/arb-mainnet/arb-mainnet-market-USDC-WETH@27JUN2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "334435607", + "timestamp": "1746682800" + }, + "market": "0x58C4d4688E0Bc92eF8d81fb963Bca2EaA5DFc31C", + "collateral": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x6d16D1345eF0C71E6B3f081F3d84919967bd9660", + "xt": "0xFB02999Ecb7A6842Dd9601c1CdFE23AB2e79E55D", + "gt": "0x1200E9991c02CfC6d5C8dC833689E3F062B655EF" + }, + "config": { + "marketSymbol": "USDC/WETH@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "27JUN2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "10000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet/arb-mainnet-market-USDC-wstETH@27JUN2025.json b/deployments/arb-mainnet/arb-mainnet-market-USDC-wstETH@27JUN2025.json new file mode 100644 index 0000000..458b9fd --- /dev/null +++ b/deployments/arb-mainnet/arb-mainnet-market-USDC-wstETH@27JUN2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "334435607", + "timestamp": "1746682800" + }, + "market": "0x63765e904777E0e13F0cE46A63B2feCf920681aA", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x7b3323EA461755Fb8010fEa1A98dF31cAA57E7ED", + "xt": "0x79e166629200C4E4403436517c8b15dD554D13A6", + "gt": "0xD567D302926e3C3A1F314e06287a61d61c7d447c" + }, + "config": { + "marketSymbol": "USDC/wstETH@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "27JUN2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "10000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet/arb-mainnet-market-WETH-weETH@27JUN2025.json b/deployments/arb-mainnet/arb-mainnet-market-WETH-weETH@27JUN2025.json new file mode 100644 index 0000000..81b29a7 --- /dev/null +++ b/deployments/arb-mainnet/arb-mainnet-market-WETH-weETH@27JUN2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "334435607", + "timestamp": "1746682800" + }, + "market": "0x4B66219eCcE3AD157A31B9E584beFDc798b556A1", + "collateral": { + "address": "0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe", + "symbol": "weETH", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xdbcA965D5aee36777d1083b515E8329B47307f46", + "xt": "0x24716141891afE2e0385DAD2D512348386135B5B", + "gt": "0xBFBc1D5dde5A740F048Df76e04A948ddE6F9C2Ee" + }, + "config": { + "marketSymbol": "WETH/weETH@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "27JUN2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "4000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet/arb-mainnet-market-WETH-wstETH@27JUN2025.json b/deployments/arb-mainnet/arb-mainnet-market-WETH-wstETH@27JUN2025.json new file mode 100644 index 0000000..b97ad6b --- /dev/null +++ b/deployments/arb-mainnet/arb-mainnet-market-WETH-wstETH@27JUN2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "334435607", + "timestamp": "1746682800" + }, + "market": "0x2706f663C6e6a0AF2e1c16f7e0d2CcC85758d92c", + "collateral": { + "address": "0x5979D7b546E38E414F7E9822514be443A4800529", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x4F074de5E97EaE3130Af1eDEe4034549208ff1EE", + "xt": "0xA045B77db8317A774F02c8f47F705a52e789c8B7", + "gt": "0x3748A7A8f2600F43C03CBeA7490d53E4B8aaFFE7" + }, + "config": { + "marketSymbol": "WETH/wstETH@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "27JUN2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "4000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet/arb-mainnet-pendle-swap-v3-adapter.json b/deployments/arb-mainnet/arb-mainnet-pendle-swap-v3-adapter.json new file mode 100644 index 0000000..925711d --- /dev/null +++ b/deployments/arb-mainnet/arb-mainnet-pendle-swap-v3-adapter.json @@ -0,0 +1,14 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1744446513", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x1b19b284f4f6a7ffebcb90e1d9af5058a71d0ab5", + "blockInfo": { + "number": "325535022", + "timestamp": "1744446513" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "contracts": { + "pendleSwapV3Adapter": "0x4e9C9796Fcfddf2Eb66B7051B6A17f3eB6BCb57d" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet/arb-mainnet-vault-TMX-USDC.json b/deployments/arb-mainnet/arb-mainnet-vault-TMX-USDC.json new file mode 100644 index 0000000..af05fff --- /dev/null +++ b/deployments/arb-mainnet/arb-mainnet-vault-TMX-USDC.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "324633071", + "timestamp": "1744220329" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TMX-USDC", + "address": "0xc94b752839a22D2C44E99e298671dd4B2aDd11b3", + "asset": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "performanceFeeRate": 0, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet/arb-mainnet-vault-TMX-WETH.json b/deployments/arb-mainnet/arb-mainnet-vault-TMX-WETH.json new file mode 100644 index 0000000..9177b68 --- /dev/null +++ b/deployments/arb-mainnet/arb-mainnet-vault-TMX-WETH.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "324634324", + "timestamp": "1744220643" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TMX-WETH", + "address": "0x8c5161f287Cbc9Afa48bC8972eE8CC0a755fcAdC", + "asset": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "performanceFeeRate": 0, + "maxCapacity": "5000000000000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet/arb-mainnet-vault-TermMax USDC Vault.json b/deployments/arb-mainnet/arb-mainnet-vault-TermMax USDC Vault.json new file mode 100644 index 0000000..4084050 --- /dev/null +++ b/deployments/arb-mainnet/arb-mainnet-vault-TermMax USDC Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22186270", + "timestamp": "1743657771" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TermMax USDC Vault", + "address": "0x9170A095e7073559ffe1240ccF692Abb94F32a28", + "asset": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "performanceFeeRate": 10000000, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet/arb-mainnet-vault-TermMax WETH Vault.json b/deployments/arb-mainnet/arb-mainnet-vault-TermMax WETH Vault.json new file mode 100644 index 0000000..7b33cbf --- /dev/null +++ b/deployments/arb-mainnet/arb-mainnet-vault-TermMax WETH Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xe73e9755e483821e03ecc04b8928b63e51147d9e" + }, + "blockInfo": { + "network": "arb-mainnet", + "blockNumber": "22182632", + "timestamp": "1743613861" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TermMax WETH Vault", + "address": "0xeBF448902145f65b4E1B3C4e3A269444e0213C9e", + "asset": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "performanceFeeRate": 10000000, + "maxCapacity": "500000000000000000000", + "timelock": 86400, + "admin": "0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet/arb-mainnet-vault-factory-03JUN2025.json b/deployments/arb-mainnet/arb-mainnet-vault-factory-03JUN2025.json new file mode 100644 index 0000000..81bc223 --- /dev/null +++ b/deployments/arb-mainnet/arb-mainnet-vault-factory-03JUN2025.json @@ -0,0 +1,15 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1748947028", + "dateString": "03JUN2025", + "gitBranch": "deploy/v1.0.9", + "gitCommitHash": "0x0x0489591746b16bb969ea123423e618e76b7e2dcb", + "blockInfo": { + "number": "343448104", + "timestamp": "1748947028" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "contracts": { + "vaultFactory": "0x4cB25655e7eED71F57d308c775c08a0e137E857d" + } +} \ No newline at end of file diff --git a/deployments/arb-mainnet/deploy-arb-markets-mature-20250627-log.txt b/deployments/arb-mainnet/deploy-arb-markets-mature-20250627-log.txt new file mode 100644 index 0000000..3cf4446 --- /dev/null +++ b/deployments/arb-mainnet/deploy-arb-markets-mature-20250627-log.txt @@ -0,0 +1,220 @@ +Running on arb-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: arb-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://arbi*****.gate*****.tend*****.co/agLs***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Enabled--verify +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xa669e7A0d4b3e4Fa48af2dE86BD4CD7126Be4e13 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.9 + Git commit hash: + 0x3d777a2ef7fc7151b8a882db3b339a68174fc651 + + ===== Block Info ===== + Block number: 334435607 + Block timestamp: 1746682800 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 334435607 + + ===== Market Info - 0 ===== + Market deployed at: 0x2706f663C6e6a0AF2e1c16f7e0d2CcC85758d92c + Market name: WETH/wstETH@27JUN2025 + Market symbol: WETH/wstETH@27JUN2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0x4F074de5E97EaE3130Af1eDEe4034549208ff1EE + XT deployed at: 0xA045B77db8317A774F02c8f47F705a52e789c8B7 + GT deployed at: 0x3748A7A8f2600F43C03CBeA7490d53E4B8aaFFE7 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 27JUN2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 10000000 + Issue FT Fee Ref: 4000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-wstETH@27JUN2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0x63765e904777E0e13F0cE46A63B2feCf920681aA + Market name: USDC/wstETH@27JUN2025 + Market symbol: USDC/wstETH@27JUN2025 + Collateral (wstETH) address: 0x5979D7b546E38E414F7E9822514be443A4800529 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x7b3323EA461755Fb8010fEa1A98dF31cAA57E7ED + XT deployed at: 0x79e166629200C4E4403436517c8b15dD554D13A6 + GT deployed at: 0xD567D302926e3C3A1F314e06287a61d61c7d447c + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 27JUN2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 10000000 + Issue FT Fee Ref: 10000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-wstETH@27JUN2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x10Af30e205Da0fFc594433BB87e41039be5d1f01 + Market name: USDC/WBTC@27JUN2025 + Market symbol: USDC/WBTC@27JUN2025 + Collateral (WBTC) address: 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0xCCB07922901E454F71f5A2ec67D4C2E8d2dff625 + XT deployed at: 0xECfeFb11B855A32d719689f5C2A963534aB77502 + GT deployed at: 0xAd66772ab0CDb0af994050636017c3578E24022b + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 27JUN2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 10000000 + Issue FT Fee Ref: 10000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WBTC@27JUN2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0x4B66219eCcE3AD157A31B9E584beFDc798b556A1 + Market name: WETH/weETH@27JUN2025 + Market symbol: WETH/weETH@27JUN2025 + Collateral (weETH) address: 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe + Underlying (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Underlying heartbeat: 86400 + FT deployed at: 0xdbcA965D5aee36777d1083b515E8329B47307f46 + XT deployed at: 0x24716141891afE2e0385DAD2D512348386135B5B + GT deployed at: 0xBFBc1D5dde5A740F048Df76e04A948ddE6F9C2Ee + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 27JUN2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 10000000 + Issue FT Fee Ref: 4000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-WETH-weETH@27JUN2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x58C4d4688E0Bc92eF8d81fb963Bca2EaA5DFc31C + Market name: USDC/WETH@27JUN2025 + Market symbol: USDC/WETH@27JUN2025 + Collateral (WETH) address: 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x6d16D1345eF0C71E6B3f081F3d84919967bd9660 + XT deployed at: 0xFB02999Ecb7A6842Dd9601c1CdFE23AB2e79E55D + GT deployed at: 0x1200E9991c02CfC6d5C8dC833689E3F062B655EF + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 27JUN2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 10000000 + Issue FT Fee Ref: 10000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-WETH@27JUN2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x0b91Cd4e86F0DBBbB2c37c384e1fA91B9a5A3220 + Market name: USDC/ARB@27JUN2025 + Market symbol: USDC/ARB@27JUN2025 + Collateral (ARB) address: 0x912CE59144191C1204E64559FE8253a0e49E6548 + Underlying (USDC) address: 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 + Collateral price feed address: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 + Collateral heartbeat: 86400 + Underlying price feed address: 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3 + Underlying heartbeat: 86400 + FT deployed at: 0x7FD98474f7F3F5Ee5823395f79C1258CED0649c6 + XT deployed at: 0x5fF0e5bf7Af82F8a05c7BCe2Aa522df8F869e2Bd + GT deployed at: 0x1Be601F4f8CBBc632D45E664E262E86c11771B63 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 27JUN2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 10000000 + Issue FT Fee Ref: 10000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/arb-mainnet/arb-mainnet-market-USDC-ARB@27JUN2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 42161 + +Estimated gas price: 0.020000001 gwei + +Estimated total gas used for script: 8454921 + +Estimated amount required: 0.000169098428454921 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x2706f663c6e6a0af2e1c16f7e0d2ccc85758d92c, 0x4f074de5e97eae3130af1edee4034549208ff1ee, 0xa045b77db8317a774f02c8f47f705a52e789c8b7, 0x3748a7a8f2600f43c03cbea7490d53e4b8aaffe7, 0x63765e904777e0e13f0ce46a63b2fecf920681aa, 0x7b3323ea461755fb8010fea1a98df31caa57e7ed, 0x79e166629200c4e4403436517c8b15dd554d13a6, 0xd567d302926e3c3a1f314e06287a61d61c7d447c, 0x10af30e205da0ffc594433bb87e41039be5d1f01, 0xccb07922901e454f71f5a2ec67d4c2e8d2dff625, 0xecfefb11b855a32d719689f5c2a963534ab77502, 0xad66772ab0cdb0af994050636017c3578e24022b, 0x4b66219ecce3ad157a31b9e584befdc798b556a1, 0xdbca965d5aee36777d1083b515e8329b47307f46, 0x24716141891afe2e0385dad2d512348386135b5b, 0xbfbc1d5dde5a740f048df76e04a948dde6f9c2ee, 0x58c4d4688e0bc92ef8d81fb963bca2eaa5dfc31c, 0x6d16d1345ef0c71e6b3f081f3d84919967bd9660, 0xfb02999ecb7a6842dd9601c1cdfe23ab2e79e55d, 0x1200e9991c02cfc6d5c8dc833689e3f062b655ef, 0x0b91cd4e86f0dbbbb2c37c384e1fa91b9a5a3220, 0x7fd98474f7f3f5ee5823395f79c1258ced0649c6, 0x5ff0e5bf7af82f8a05c7bce2aa522df8f869e2bd, 0x1be601f4f8cbbc632d45e664e262e86c11771b63]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/42161/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/42161/run-latest.json + +[SUCCESS] market deployment to arb-mainnet completed successfully! diff --git a/deployments/arb-sepolia-v1.0.8-sandbox-20250404/arb-sepolia-access-manager.json b/deployments/arb-sepolia-v1.0.8-sandbox-20250404/arb-sepolia-access-manager.json new file mode 100644 index 0000000..769e116 --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-sandbox-20250404/arb-sepolia-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "arb-sepolia", + "deployedAt": "1743745964", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x02fff1d6d797ed5e62117eb2d07b7f4f25d0e281", + "blockInfo": { + "number": "8047019", + "timestamp": "1743745964" + }, + "deployer": "0xE355d5D8aa52EF0FbbD037C4a3C5E6Fd659cf46B", + "admin": "0x81f314f70702Bbe89FEd0F2cFe6841950275E0b7", + "contracts": { + "accessManager": "0x2263c9847DE61023C99D38FFa348C13831919236" + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-sandbox-20250404/arb-sepolia-core.json b/deployments/arb-sepolia-v1.0.8-sandbox-20250404/arb-sepolia-core.json new file mode 100644 index 0000000..cbc43fc --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-sandbox-20250404/arb-sepolia-core.json @@ -0,0 +1,21 @@ +{ + "network": "arb-sepolia", + "deployedAt": "1743746764", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x02fff1d6d797ed5e62117eb2d07b7f4f25d0e281", + "blockInfo": { + "number": "8047085", + "timestamp": "1743746764" + }, + "deployer": "0xE355d5D8aa52EF0FbbD037C4a3C5E6Fd659cf46B", + "admin": "0x81f314f70702Bbe89FEd0F2cFe6841950275E0b7", + "contracts": { + "factory": "0x94004D6dc0024924F946A601fA627d20147E367c", + "vaultFactory": "0xF73D80BDB9e627f7EEA965806F5dcb3df3378E4B", + "oracleAggregator": "0x8EC69D1b6ce8DE14d180C02a631D0cF90B6E933B", + "router": "0xAcBF51D18eAD87CD7362e5faDDfb484714f3aCED", + "swapAdapter": "0x06254a04199093b8A1ABCd8D7bD366BCAa79e391", + "faucet": "0x75B47f7e86884e0C8Ac27c5ef550B8CD9c142430", + "marketViewer": "0x9bD6EFe4eac70708C4c2E22547D1de751131d86b" + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-sandbox-20250404/arb-sepolia-market-USDC-ARB@05APR2025.json b/deployments/arb-sepolia-v1.0.8-sandbox-20250404/arb-sepolia-market-USDC-ARB@05APR2025.json new file mode 100644 index 0000000..470bb4a --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-sandbox-20250404/arb-sepolia-market-USDC-ARB@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8047154", + "timestamp": "1743747631" + }, + "market": "0xcCAC13b8Ed36c6e60435558E605F35A05A3bb9D5", + "collateral": { + "address": "0x19F13efABc1F591d9F11d4845578E0C9B6A8EB4a", + "symbol": "ARB", + "priceFeed": "0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x2a5c469444433DA68fDDee62298E5fD0C1137D68", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x5676881c7F7c0B3FA257237dbcf12829fFF2f001", + "xt": "0x2CdA786b463060C4f22f5ECBae5ED1125b91452B", + "gt": "0x6c73770Dd137046126FFbEbc1EA4e88380737fF2" + }, + "config": { + "marketSymbol": "USDC/ARB@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-sandbox-20250404/arb-sepolia-market-USDC-WBTC@05APR2025.json b/deployments/arb-sepolia-v1.0.8-sandbox-20250404/arb-sepolia-market-USDC-WBTC@05APR2025.json new file mode 100644 index 0000000..f647837 --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-sandbox-20250404/arb-sepolia-market-USDC-WBTC@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8047154", + "timestamp": "1743747631" + }, + "market": "0x89f95Fae167be4AB609fc546ff022E649D587bE9", + "collateral": { + "address": "0xa03dfa1b57B9Ca64cEb872346be2E8316d4B7710", + "symbol": "WBTC", + "priceFeed": "0xd0C7101eACbB49F3deCcCc166d238410D6D46d57", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x2a5c469444433DA68fDDee62298E5fD0C1137D68", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xDe6Cbc75466CC2982003b6dcBED7371d2481c2e3", + "xt": "0x5BAf8b10C35884eC927E1926344886e503Ad66CE", + "gt": "0xC24CF580e50f4F79aB619D6F4b51dBAA36D6fdD8" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-sandbox-20250404/arb-sepolia-market-USDC-WETH@05APR2025.json b/deployments/arb-sepolia-v1.0.8-sandbox-20250404/arb-sepolia-market-USDC-WETH@05APR2025.json new file mode 100644 index 0000000..3b7e38c --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-sandbox-20250404/arb-sepolia-market-USDC-WETH@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8047154", + "timestamp": "1743747631" + }, + "market": "0xC909d5EBA267216CD57E91233aE38b90e30EC725", + "collateral": { + "address": "0x6E63f6D0eAFB4C8A54B723976D95E5D578A21A65", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x2a5c469444433DA68fDDee62298E5fD0C1137D68", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x51726781cecad402D248b429a6EdDBf0B363f7C4", + "xt": "0x22393f906ec6616AE9cB663ad657ff7B79Dd3d16", + "gt": "0x95eeB5c86CF1eaECf1c8fD57A9C7DE5F52463c82" + }, + "config": { + "marketSymbol": "USDC/WETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-sandbox-20250404/arb-sepolia-market-USDC-wstETH@05APR2025.json b/deployments/arb-sepolia-v1.0.8-sandbox-20250404/arb-sepolia-market-USDC-wstETH@05APR2025.json new file mode 100644 index 0000000..34f61c5 --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-sandbox-20250404/arb-sepolia-market-USDC-wstETH@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8047154", + "timestamp": "1743747631" + }, + "market": "0x7B465F316248bE3b2DDA0BCBA419882030318a61", + "collateral": { + "address": "0x3b66056895D7c4B9436E69D0c60359Bd8948ab23", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x2a5c469444433DA68fDDee62298E5fD0C1137D68", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xdE74484c3a9bAEE28fFe3AdFB6c6D17574F73300", + "xt": "0x006b93Df7422264dBf4144f9C1bdb986A1Ac1804", + "gt": "0x3759cBaFA1f260c1C8110D5E2e5243a2b6d0c8fE" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-sandbox-20250404/arb-sepolia-market-WETH-PT-weETH-26JUN2025@05APR2025.json b/deployments/arb-sepolia-v1.0.8-sandbox-20250404/arb-sepolia-market-WETH-PT-weETH-26JUN2025@05APR2025.json new file mode 100644 index 0000000..ffd3d84 --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-sandbox-20250404/arb-sepolia-market-WETH-PT-weETH-26JUN2025@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8047154", + "timestamp": "1743747631" + }, + "market": "0x139aE13c221228b4fAA4B92e9b54e0b71AA4b40E", + "collateral": { + "address": "0x2AC4ee68991F648DAee22A1223eB57D057a46010", + "symbol": "PT-weETH-26JUN2025", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x6E63f6D0eAFB4C8A54B723976D95E5D578A21A65", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xb2A46e617b81B8EcbddCB15b0292f125979cedf8", + "xt": "0x5F2712c906fE364BE6da6dFB1aF606C34a8Eac66", + "gt": "0x4E6b0D2D719298a3C4d67b09c35c619787A37DB7" + }, + "config": { + "marketSymbol": "WETH/PT-weETH-26JUN2025@27JUN2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-sandbox-20250404/arb-sepolia-market-WETH-weETH@05APR2025.json b/deployments/arb-sepolia-v1.0.8-sandbox-20250404/arb-sepolia-market-WETH-weETH@05APR2025.json new file mode 100644 index 0000000..089adca --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-sandbox-20250404/arb-sepolia-market-WETH-weETH@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8047154", + "timestamp": "1743747631" + }, + "market": "0x33Bb5F474d6942ab4e4633E0007Ceea4d4c6daf5", + "collateral": { + "address": "0x4dEdd765D325a26419c1B153416e07Dbde8013a9", + "symbol": "weETH", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x6E63f6D0eAFB4C8A54B723976D95E5D578A21A65", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x06B470f95D015d78B6Bca1413DC3C90C78A1e3dF", + "xt": "0x58D2d9800F9c0469f741B5E9d4F870AC0dB0F896", + "gt": "0xF3505e4Bd62B4fC2F8320CAD6AF574291e1AAd11" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-sandbox-20250404/arb-sepolia-market-WETH-wstETH@05APR2025.json b/deployments/arb-sepolia-v1.0.8-sandbox-20250404/arb-sepolia-market-WETH-wstETH@05APR2025.json new file mode 100644 index 0000000..ea0f0ed --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-sandbox-20250404/arb-sepolia-market-WETH-wstETH@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8047154", + "timestamp": "1743747631" + }, + "market": "0xB378edC995883DF4cA226C7fDC4e8e36420aF92B", + "collateral": { + "address": "0x3b66056895D7c4B9436E69D0c60359Bd8948ab23", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x6E63f6D0eAFB4C8A54B723976D95E5D578A21A65", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xDD087CE5dc318a2aDb9d8c17FE98cf8253bA30E4", + "xt": "0x373E9b6b20E3B9e8C4Ed206aB2ed32EAaFa74e5D", + "gt": "0xdDE6c31C543AEba1BC4b9C57b48E4be13F42C21c" + }, + "config": { + "marketSymbol": "WETH/wstETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-sandbox-20250413/arb-sepolia-access-manager.json b/deployments/arb-sepolia-v1.0.8-sandbox-20250413/arb-sepolia-access-manager.json new file mode 100644 index 0000000..f9f2ff6 --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-sandbox-20250413/arb-sepolia-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "arb-sepolia", + "deployedAt": "1744527141", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x1b19b284f4f6a7ffebcb90e1d9af5058a71d0ab5", + "blockInfo": { + "number": "8108878", + "timestamp": "1744527141" + }, + "deployer": "0xE355d5D8aa52EF0FbbD037C4a3C5E6Fd659cf46B", + "admin": "0x81f314f70702Bbe89FEd0F2cFe6841950275E0b7", + "contracts": { + "accessManager": "0x56e893B18dC888b2dc4C828e43eD7e907627e1D9" + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-sandbox-20250413/arb-sepolia-core.json b/deployments/arb-sepolia-v1.0.8-sandbox-20250413/arb-sepolia-core.json new file mode 100644 index 0000000..b782f74 --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-sandbox-20250413/arb-sepolia-core.json @@ -0,0 +1,21 @@ +{ + "network": "arb-sepolia", + "deployedAt": "1744527328", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x1b19b284f4f6a7ffebcb90e1d9af5058a71d0ab5", + "blockInfo": { + "number": "8108891", + "timestamp": "1744527328" + }, + "deployer": "0xE355d5D8aa52EF0FbbD037C4a3C5E6Fd659cf46B", + "admin": "0x81f314f70702Bbe89FEd0F2cFe6841950275E0b7", + "contracts": { + "factory": "0x6E77A3Da12497764a120587db923a09b335094f3", + "vaultFactory": "0xf96b6C262aE62082a581c5cc7faea5EE5C9245F4", + "oracleAggregator": "0x8B4e7EfD02131F6CE3956EE03c0C080D4f581e3A", + "router": "0x5816E6969933653a34D4bB5D3b1e50139727C021", + "swapAdapter": "0x9DB5A064049E9CDAd24C15a26fA761033E6471d4", + "faucet": "0xE4B41d004D202bc88463dE560BDC080a59B3De6C", + "marketViewer": "0xb64069Ef32394507fd0F6F8BFab25C56520D7D58" + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-sandbox-20250413/arb-sepolia-market-USDC-ARB@30MAY2025.json b/deployments/arb-sepolia-v1.0.8-sandbox-20250413/arb-sepolia-market-USDC-ARB@30MAY2025.json new file mode 100644 index 0000000..a4c58e9 --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-sandbox-20250413/arb-sepolia-market-USDC-ARB@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8108983", + "timestamp": "1744528585" + }, + "market": "0x4eBC329DD5E72Ce1a46eE3e80C7861722a8dA399", + "collateral": { + "address": "0x4f24Cf75Ba4f347514E2F197Dc4F1f18dBC5Ef69", + "symbol": "ARB", + "priceFeed": "0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x2b7443068c8ca0EBc3A862c160eDC1Ae353B6302", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x29816d95bFeceDF043cd6FA3E2E575C0FCF1F398", + "xt": "0x388D9Def2975789BD1e778b6EFf9365E742fa5a6", + "gt": "0x64b7A33ED8d752d871c166751a31c0f68D224003" + }, + "config": { + "marketSymbol": "USDC/ARB@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-sandbox-20250413/arb-sepolia-market-USDC-WBTC@30MAY2025.json b/deployments/arb-sepolia-v1.0.8-sandbox-20250413/arb-sepolia-market-USDC-WBTC@30MAY2025.json new file mode 100644 index 0000000..3495584 --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-sandbox-20250413/arb-sepolia-market-USDC-WBTC@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8108983", + "timestamp": "1744528585" + }, + "market": "0xfeEaF6BB2d5a6F9Af6CA1bC89376503d7b55dC36", + "collateral": { + "address": "0xA896b70a5bf28DDC01cDAC20AcC928892fc45b24", + "symbol": "WBTC", + "priceFeed": "0xd0C7101eACbB49F3deCcCc166d238410D6D46d57", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x2b7443068c8ca0EBc3A862c160eDC1Ae353B6302", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xB5B64c68fa689C9C1226cE6451B635EEe301D4b0", + "xt": "0xD0969e425Ac1879381526f7384A3CE5FC2AEbf8b", + "gt": "0xa3e71915AC3B77490Dd99bAc722153368C61128E" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-sandbox-20250413/arb-sepolia-market-USDC-WETH@30MAY2025.json b/deployments/arb-sepolia-v1.0.8-sandbox-20250413/arb-sepolia-market-USDC-WETH@30MAY2025.json new file mode 100644 index 0000000..3fdaeb0 --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-sandbox-20250413/arb-sepolia-market-USDC-WETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8108983", + "timestamp": "1744528585" + }, + "market": "0x8F6a4caBB2f9442Fe07F5Db3c9bF9B86D16975d2", + "collateral": { + "address": "0x6906dc739753473D1BdcaA342C6E18871d21873F", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x2b7443068c8ca0EBc3A862c160eDC1Ae353B6302", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x143168319AC9896De934E6e40afFE53C5079Cbde", + "xt": "0xbc49b831164eDA1c106E62Fac4495D46Dd7Fb2D3", + "gt": "0x1faAaB823220C44c0f8F0bEE746F70c499A46011" + }, + "config": { + "marketSymbol": "USDC/WETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-sandbox-20250413/arb-sepolia-market-USDC-wstETH@30MAY2025.json b/deployments/arb-sepolia-v1.0.8-sandbox-20250413/arb-sepolia-market-USDC-wstETH@30MAY2025.json new file mode 100644 index 0000000..dcd4b33 --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-sandbox-20250413/arb-sepolia-market-USDC-wstETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8108983", + "timestamp": "1744528585" + }, + "market": "0xFD7C80e2FA8921F9e61B3E4EdE36642C49611D67", + "collateral": { + "address": "0x59F28D5Ecf8ceaeDcAcA1Cb826ABf22418b60A70", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x2b7443068c8ca0EBc3A862c160eDC1Ae353B6302", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xd6bd727bf8126349AF934a56e9019d8CB15ab6ec", + "xt": "0xD0d382e1314F16B502b3d2D5529C56c2c501e3F7", + "gt": "0x43D328615033C93d3d04e6727EC24e673c136692" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-sandbox-20250413/arb-sepolia-market-WETH-PT-weETH-26JUN2025@27JUN2025.json b/deployments/arb-sepolia-v1.0.8-sandbox-20250413/arb-sepolia-market-WETH-PT-weETH-26JUN2025@27JUN2025.json new file mode 100644 index 0000000..4463506 --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-sandbox-20250413/arb-sepolia-market-WETH-PT-weETH-26JUN2025@27JUN2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8108983", + "timestamp": "1744528585" + }, + "market": "0x25B6A902D55754eea472BFb0f39792cc1Ea6C158", + "collateral": { + "address": "0xDd8437E64fC9Eba7f7F0725E4836852f1971fFc3", + "symbol": "PT-weETH-26JUN2025", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x6906dc739753473D1BdcaA342C6E18871d21873F", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xFb66e7C0f148a439118842986B29b9571E48BbBa", + "xt": "0x2C71A553134444bAe554049E2459575BDBfc91C3", + "gt": "0x7205c6c479409639A714dc65017AE820c71DA029" + }, + "config": { + "marketSymbol": "WETH/PT-weETH-26JUN2025@27JUN2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "27JUN2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-sandbox-20250413/arb-sepolia-market-WETH-weETH@30MAY2025.json b/deployments/arb-sepolia-v1.0.8-sandbox-20250413/arb-sepolia-market-WETH-weETH@30MAY2025.json new file mode 100644 index 0000000..ec8f1b5 --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-sandbox-20250413/arb-sepolia-market-WETH-weETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8108983", + "timestamp": "1744528585" + }, + "market": "0xE43e70275e357c6C75BC145Bb5a78E5815A6928c", + "collateral": { + "address": "0x5e2B4aDBd874c1213704C57E7CdFaA12d0c79a00", + "symbol": "weETH", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x6906dc739753473D1BdcaA342C6E18871d21873F", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xDF6542170D86c89C7de5e749698889086235fCAB", + "xt": "0xEE6BDd71DDF351f10BeD868B879C9d9121320d26", + "gt": "0x0c8094dEC0a4b9907D5F509f48Aef3eb591aF16f" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-sandbox-20250413/arb-sepolia-market-WETH-wstETH@30MAY2025.json b/deployments/arb-sepolia-v1.0.8-sandbox-20250413/arb-sepolia-market-WETH-wstETH@30MAY2025.json new file mode 100644 index 0000000..a6df7f5 --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-sandbox-20250413/arb-sepolia-market-WETH-wstETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8108983", + "timestamp": "1744528585" + }, + "market": "0x02ac27201D723F712DE42fBC9c4FF59c5Be3E466", + "collateral": { + "address": "0x59F28D5Ecf8ceaeDcAcA1Cb826ABf22418b60A70", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x6906dc739753473D1BdcaA342C6E18871d21873F", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x9a7F21Fa737eAF495674de5f31A34dfAaeC1e4F8", + "xt": "0x01128cB0Fb8bfE2d20845CAAEDa53977D3Ba9b1B", + "gt": "0xC96677c559B98f0306e8e957d1A1C443AF64a7FE" + }, + "config": { + "marketSymbol": "WETH/wstETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-access-manager.json b/deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-access-manager.json new file mode 100644 index 0000000..e3dafe5 --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "arb-sepolia", + "deployedAt": "1744097315", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0xb07dca68abfa0915501a9f9b5e5f8ae686c02d95", + "blockInfo": { + "number": "8075764", + "timestamp": "1744097315" + }, + "deployer": "0xE355d5D8aa52EF0FbbD037C4a3C5E6Fd659cf46B", + "admin": "0x81f314f70702Bbe89FEd0F2cFe6841950275E0b7", + "contracts": { + "accessManager": "0x73582719184969d11baDf253D8e04c09867B66a8" + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-core.json b/deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-core.json new file mode 100644 index 0000000..c42920b --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-core.json @@ -0,0 +1,21 @@ +{ + "network": "arb-sepolia", + "deployedAt": "1744097884", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0xb07dca68abfa0915501a9f9b5e5f8ae686c02d95", + "blockInfo": { + "number": "8075807", + "timestamp": "1744097884" + }, + "deployer": "0xE355d5D8aa52EF0FbbD037C4a3C5E6Fd659cf46B", + "admin": "0x81f314f70702Bbe89FEd0F2cFe6841950275E0b7", + "contracts": { + "factory": "0x8D89d9A9c41351d1991e1F5b578006eD3d7e2ffE", + "vaultFactory": "0xEF1037e414c60D98e333670b25C89555e425C631", + "oracleAggregator": "0x2D8f037DA792198f6eB30c292554ce55f5ABaCE5", + "router": "0x6A847024BECCF5039301ebAA4Fd666C3dD467480", + "swapAdapter": "0xff195F1de3301e7c9BDf9bEECD10D6BC3aDD1690", + "faucet": "0xCC903bFE36499405dCE3224266D7f10C01b511f0", + "marketViewer": "0x13a9F9037DCf1Bbc5f99c94CacFEf931e6BCbe5D" + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-market-USDC-ARB@30MAY2025.json b/deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-market-USDC-ARB@30MAY2025.json new file mode 100644 index 0000000..b5c2848 --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-market-USDC-ARB@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8075848", + "timestamp": "1744098382" + }, + "market": "0xD45a73C1954249399917336948e3B646B72ae28d", + "collateral": { + "address": "0x7775Ae869cad5F2caA9F672e0e935A32E948401E", + "symbol": "ARB", + "priceFeed": "0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC78b3362e9Fd717963151a3f7ee40C248e369092", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x0341478D89aeFF86fAb6Fc72A6A9EFB2073E4894", + "xt": "0xc9311c2E2500fb5e7307052EbE2fd1d1D3B53ef8", + "gt": "0x9d79088Fa50BbA5929e1fcA343d1D0D805D2776B" + }, + "config": { + "marketSymbol": "USDC/ARB@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-market-USDC-WBTC@30MAY2025.json b/deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-market-USDC-WBTC@30MAY2025.json new file mode 100644 index 0000000..a6b3fb5 --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-market-USDC-WBTC@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8075848", + "timestamp": "1744098382" + }, + "market": "0xfD37d637CfBF0401a4F800333E22c644Bd7401A0", + "collateral": { + "address": "0x850D599249de78D8b67D65f529f599B1c59ACE4e", + "symbol": "WBTC", + "priceFeed": "0xd0C7101eACbB49F3deCcCc166d238410D6D46d57", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC78b3362e9Fd717963151a3f7ee40C248e369092", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x24044B9fF32321429f832Ee0C1f1CB1c64C0294C", + "xt": "0x53bAe17D5A9a1176312E1F2EA1F8eD1a4129a8D3", + "gt": "0x79853699660aE059f95DA847D3DD0a4E64d37147" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-market-USDC-WETH@30MAY2025.json b/deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-market-USDC-WETH@30MAY2025.json new file mode 100644 index 0000000..a639ee2 --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-market-USDC-WETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8075848", + "timestamp": "1744098382" + }, + "market": "0x755E472E12B7906Dc72ce4b97942f4Ad420DB332", + "collateral": { + "address": "0xA12136197Fc7dDB83b89B2EDAEEcd88316FDE991", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC78b3362e9Fd717963151a3f7ee40C248e369092", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xFf842CdcFb05A5912Ab31CE75a70f7fcF60d967f", + "xt": "0xfD156076153724C01B644F63EA8e5eF58544C9F2", + "gt": "0x545ebf2c88ecE21ab577239977174DA742Ca6c94" + }, + "config": { + "marketSymbol": "USDC/WETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-market-USDC-wstETH@30MAY2025.json b/deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-market-USDC-wstETH@30MAY2025.json new file mode 100644 index 0000000..1900073 --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-market-USDC-wstETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8075848", + "timestamp": "1744098382" + }, + "market": "0x626e18cfE4EcA0914d52dAc9106Ea6716E7C346B", + "collateral": { + "address": "0xa7Ab96A774d5d272ce2Dcac3f8B406676B82a650", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC78b3362e9Fd717963151a3f7ee40C248e369092", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x08C00Dd029ee1C61BD48B71bA31852a330F3d101", + "xt": "0xfB22a60c478381571dFf2206605220d4Bd251149", + "gt": "0x8C419a833A0A3D0c41F06F964764CFB7720617a3" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-market-WETH-PT-weETH-26JUN2025@27JUN2025.json b/deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-market-WETH-PT-weETH-26JUN2025@27JUN2025.json new file mode 100644 index 0000000..a305327 --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-market-WETH-PT-weETH-26JUN2025@27JUN2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8075848", + "timestamp": "1744098382" + }, + "market": "0x732C150aAfdeeB270e6e5913914Ca5A7aA11C895", + "collateral": { + "address": "0x4c88e7f2938772C880e9b9960De96891b2ecf670", + "symbol": "PT-weETH-26JUN2025", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA12136197Fc7dDB83b89B2EDAEEcd88316FDE991", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xD78948D3f8C856cF28bDcf00e0De6FF8745d658f", + "xt": "0xbbD4C494312353bD06a38880aF2F117FaB3181b5", + "gt": "0xFf2ac6a9dc8c1b37e597d9323a9acA534f675783" + }, + "config": { + "marketSymbol": "WETH/PT-weETH-26JUN2025@27JUN2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "27JUN2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-market-WETH-weETH@30MAY2025.json b/deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-market-WETH-weETH@30MAY2025.json new file mode 100644 index 0000000..06d304a --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-market-WETH-weETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8075848", + "timestamp": "1744098382" + }, + "market": "0xc6455E2F1b7327794454A8a146086CADD8b1abEa", + "collateral": { + "address": "0x4e629b3c2791b78B7E4DafDFcD56e385bb6596a1", + "symbol": "weETH", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA12136197Fc7dDB83b89B2EDAEEcd88316FDE991", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xFc1e71670ad51bEbEB46dc82c435657Ad32e9191", + "xt": "0x94534B731a50b24f411303cE6eb3197CE3550218", + "gt": "0x4417af404c009eb7b075C7f1de23e10c5CC1DC03" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-market-WETH-wstETH@30MAY2025.json b/deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-market-WETH-wstETH@30MAY2025.json new file mode 100644 index 0000000..ca0eac3 --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-market-WETH-wstETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8075848", + "timestamp": "1744098382" + }, + "market": "0x43c514d7De79E20E216C6Eb2e9796ffB044a2110", + "collateral": { + "address": "0xa7Ab96A774d5d272ce2Dcac3f8B406676B82a650", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA12136197Fc7dDB83b89B2EDAEEcd88316FDE991", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x9780b6608de32bf151A2BbC92eAF51E1AEd1B28e", + "xt": "0xe7CAB6c6b2D448d5cC8332faCA5092830dc7Ea9D", + "gt": "0x7171d195d395c3A3cDC5c86aF0241c96E49eADC1" + }, + "config": { + "marketSymbol": "WETH/wstETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-vault-TMX-USDC.json b/deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-vault-TMX-USDC.json new file mode 100644 index 0000000..756b445 --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-vault-TMX-USDC.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x141ada4a7f722cd4faab7818834dada2688bdc69" + }, + "blockInfo": { + "network": "arb-sepolia", + "blockNumber": "8076069", + "timestamp": "1744101122" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TMX-USDC", + "address": "0x6cefBD5C64bd212c9C5Dcf9274e2b894F5D92590", + "asset": "0xC78b3362e9Fd717963151a3f7ee40C248e369092", + "performanceFeeRate": 10000000, + "maxCapacity": "1000000000000", + "timelock": 1, + "admin": "0x73582719184969d11baDf253D8e04c09867B66a8", + "curator": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE", + "guardian": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE", + "allocator": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE" + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-vault-TMX-WETH.json b/deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-vault-TMX-WETH.json new file mode 100644 index 0000000..d9c4758 --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-testnet-20250408/arb-sepolia-vault-TMX-WETH.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x141ada4a7f722cd4faab7818834dada2688bdc69" + }, + "blockInfo": { + "network": "arb-sepolia", + "blockNumber": "8076093", + "timestamp": "1744101443" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TMX-WETH", + "address": "0x8CAd8288C5AF8F721A0177Eb387744816836DD38", + "asset": "0xA12136197Fc7dDB83b89B2EDAEEcd88316FDE991", + "performanceFeeRate": 10000000, + "maxCapacity": "5000000000000000000000", + "timelock": 1, + "admin": "0x73582719184969d11baDf253D8e04c09867B66a8", + "curator": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE", + "guardian": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE", + "allocator": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE" + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-access-manager.json b/deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-access-manager.json new file mode 100644 index 0000000..e3dafe5 --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "arb-sepolia", + "deployedAt": "1744097315", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0xb07dca68abfa0915501a9f9b5e5f8ae686c02d95", + "blockInfo": { + "number": "8075764", + "timestamp": "1744097315" + }, + "deployer": "0xE355d5D8aa52EF0FbbD037C4a3C5E6Fd659cf46B", + "admin": "0x81f314f70702Bbe89FEd0F2cFe6841950275E0b7", + "contracts": { + "accessManager": "0x73582719184969d11baDf253D8e04c09867B66a8" + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-core.json b/deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-core.json new file mode 100644 index 0000000..c42920b --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-core.json @@ -0,0 +1,21 @@ +{ + "network": "arb-sepolia", + "deployedAt": "1744097884", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0xb07dca68abfa0915501a9f9b5e5f8ae686c02d95", + "blockInfo": { + "number": "8075807", + "timestamp": "1744097884" + }, + "deployer": "0xE355d5D8aa52EF0FbbD037C4a3C5E6Fd659cf46B", + "admin": "0x81f314f70702Bbe89FEd0F2cFe6841950275E0b7", + "contracts": { + "factory": "0x8D89d9A9c41351d1991e1F5b578006eD3d7e2ffE", + "vaultFactory": "0xEF1037e414c60D98e333670b25C89555e425C631", + "oracleAggregator": "0x2D8f037DA792198f6eB30c292554ce55f5ABaCE5", + "router": "0x6A847024BECCF5039301ebAA4Fd666C3dD467480", + "swapAdapter": "0xff195F1de3301e7c9BDf9bEECD10D6BC3aDD1690", + "faucet": "0xCC903bFE36499405dCE3224266D7f10C01b511f0", + "marketViewer": "0x13a9F9037DCf1Bbc5f99c94CacFEf931e6BCbe5D" + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-market-USDC-ARB@30MAY2025.json b/deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-market-USDC-ARB@30MAY2025.json new file mode 100644 index 0000000..b5c2848 --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-market-USDC-ARB@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8075848", + "timestamp": "1744098382" + }, + "market": "0xD45a73C1954249399917336948e3B646B72ae28d", + "collateral": { + "address": "0x7775Ae869cad5F2caA9F672e0e935A32E948401E", + "symbol": "ARB", + "priceFeed": "0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC78b3362e9Fd717963151a3f7ee40C248e369092", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x0341478D89aeFF86fAb6Fc72A6A9EFB2073E4894", + "xt": "0xc9311c2E2500fb5e7307052EbE2fd1d1D3B53ef8", + "gt": "0x9d79088Fa50BbA5929e1fcA343d1D0D805D2776B" + }, + "config": { + "marketSymbol": "USDC/ARB@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-market-USDC-WBTC@30MAY2025.json b/deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-market-USDC-WBTC@30MAY2025.json new file mode 100644 index 0000000..a6b3fb5 --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-market-USDC-WBTC@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8075848", + "timestamp": "1744098382" + }, + "market": "0xfD37d637CfBF0401a4F800333E22c644Bd7401A0", + "collateral": { + "address": "0x850D599249de78D8b67D65f529f599B1c59ACE4e", + "symbol": "WBTC", + "priceFeed": "0xd0C7101eACbB49F3deCcCc166d238410D6D46d57", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC78b3362e9Fd717963151a3f7ee40C248e369092", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x24044B9fF32321429f832Ee0C1f1CB1c64C0294C", + "xt": "0x53bAe17D5A9a1176312E1F2EA1F8eD1a4129a8D3", + "gt": "0x79853699660aE059f95DA847D3DD0a4E64d37147" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-market-USDC-WETH@30MAY2025.json b/deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-market-USDC-WETH@30MAY2025.json new file mode 100644 index 0000000..a639ee2 --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-market-USDC-WETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8075848", + "timestamp": "1744098382" + }, + "market": "0x755E472E12B7906Dc72ce4b97942f4Ad420DB332", + "collateral": { + "address": "0xA12136197Fc7dDB83b89B2EDAEEcd88316FDE991", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC78b3362e9Fd717963151a3f7ee40C248e369092", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xFf842CdcFb05A5912Ab31CE75a70f7fcF60d967f", + "xt": "0xfD156076153724C01B644F63EA8e5eF58544C9F2", + "gt": "0x545ebf2c88ecE21ab577239977174DA742Ca6c94" + }, + "config": { + "marketSymbol": "USDC/WETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-market-USDC-wstETH@30MAY2025.json b/deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-market-USDC-wstETH@30MAY2025.json new file mode 100644 index 0000000..1900073 --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-market-USDC-wstETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8075848", + "timestamp": "1744098382" + }, + "market": "0x626e18cfE4EcA0914d52dAc9106Ea6716E7C346B", + "collateral": { + "address": "0xa7Ab96A774d5d272ce2Dcac3f8B406676B82a650", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC78b3362e9Fd717963151a3f7ee40C248e369092", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x08C00Dd029ee1C61BD48B71bA31852a330F3d101", + "xt": "0xfB22a60c478381571dFf2206605220d4Bd251149", + "gt": "0x8C419a833A0A3D0c41F06F964764CFB7720617a3" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-market-WETH-PT-weETH-26JUN2025@27JUN2025.json b/deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-market-WETH-PT-weETH-26JUN2025@27JUN2025.json new file mode 100644 index 0000000..a305327 --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-market-WETH-PT-weETH-26JUN2025@27JUN2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8075848", + "timestamp": "1744098382" + }, + "market": "0x732C150aAfdeeB270e6e5913914Ca5A7aA11C895", + "collateral": { + "address": "0x4c88e7f2938772C880e9b9960De96891b2ecf670", + "symbol": "PT-weETH-26JUN2025", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA12136197Fc7dDB83b89B2EDAEEcd88316FDE991", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xD78948D3f8C856cF28bDcf00e0De6FF8745d658f", + "xt": "0xbbD4C494312353bD06a38880aF2F117FaB3181b5", + "gt": "0xFf2ac6a9dc8c1b37e597d9323a9acA534f675783" + }, + "config": { + "marketSymbol": "WETH/PT-weETH-26JUN2025@27JUN2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "27JUN2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-market-WETH-weETH@30MAY2025.json b/deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-market-WETH-weETH@30MAY2025.json new file mode 100644 index 0000000..06d304a --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-market-WETH-weETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8075848", + "timestamp": "1744098382" + }, + "market": "0xc6455E2F1b7327794454A8a146086CADD8b1abEa", + "collateral": { + "address": "0x4e629b3c2791b78B7E4DafDFcD56e385bb6596a1", + "symbol": "weETH", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA12136197Fc7dDB83b89B2EDAEEcd88316FDE991", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xFc1e71670ad51bEbEB46dc82c435657Ad32e9191", + "xt": "0x94534B731a50b24f411303cE6eb3197CE3550218", + "gt": "0x4417af404c009eb7b075C7f1de23e10c5CC1DC03" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-market-WETH-wstETH@30MAY2025.json b/deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-market-WETH-wstETH@30MAY2025.json new file mode 100644 index 0000000..ca0eac3 --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-market-WETH-wstETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8075848", + "timestamp": "1744098382" + }, + "market": "0x43c514d7De79E20E216C6Eb2e9796ffB044a2110", + "collateral": { + "address": "0xa7Ab96A774d5d272ce2Dcac3f8B406676B82a650", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA12136197Fc7dDB83b89B2EDAEEcd88316FDE991", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x9780b6608de32bf151A2BbC92eAF51E1AEd1B28e", + "xt": "0xe7CAB6c6b2D448d5cC8332faCA5092830dc7Ea9D", + "gt": "0x7171d195d395c3A3cDC5c86aF0241c96E49eADC1" + }, + "config": { + "marketSymbol": "WETH/wstETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-vault-TMX-USDC-Vault.json b/deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-vault-TMX-USDC-Vault.json new file mode 100644 index 0000000..fa2c88f --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-vault-TMX-USDC-Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.9", + "commit": "0x0x55645a734d4ae98f2e59cf375332380b31adb729" + }, + "blockInfo": { + "network": "arb-sepolia", + "blockNumber": "8297013", + "timestamp": "1746884305" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TMX-USDC-Vault", + "address": "0x2B2cEDCa288F31314EB0d39308408386DfC967Ff", + "asset": "0xC78b3362e9Fd717963151a3f7ee40C248e369092", + "performanceFeeRate": 0, + "maxCapacity": "10000000000000000000000000", + "timelock": 1, + "admin": "0x73582719184969d11baDf253D8e04c09867B66a8", + "curator": "0x9cd0f93381B22e80afB7401b61569e21E694F9A3", + "guardian": "0x9cd0f93381B22e80afB7401b61569e21E694F9A3", + "allocator": "0x9cd0f93381B22e80afB7401b61569e21E694F9A3" + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-vault-TMX-USDC.json b/deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-vault-TMX-USDC.json new file mode 100644 index 0000000..756b445 --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-vault-TMX-USDC.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x141ada4a7f722cd4faab7818834dada2688bdc69" + }, + "blockInfo": { + "network": "arb-sepolia", + "blockNumber": "8076069", + "timestamp": "1744101122" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TMX-USDC", + "address": "0x6cefBD5C64bd212c9C5Dcf9274e2b894F5D92590", + "asset": "0xC78b3362e9Fd717963151a3f7ee40C248e369092", + "performanceFeeRate": 10000000, + "maxCapacity": "1000000000000", + "timelock": 1, + "admin": "0x73582719184969d11baDf253D8e04c09867B66a8", + "curator": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE", + "guardian": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE", + "allocator": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE" + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-vault-TMX-WETH.json b/deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-vault-TMX-WETH.json new file mode 100644 index 0000000..d9c4758 --- /dev/null +++ b/deployments/arb-sepolia-v1.0.8-testnet-20250603/arb-sepolia-vault-TMX-WETH.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x141ada4a7f722cd4faab7818834dada2688bdc69" + }, + "blockInfo": { + "network": "arb-sepolia", + "blockNumber": "8076093", + "timestamp": "1744101443" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TMX-WETH", + "address": "0x8CAd8288C5AF8F721A0177Eb387744816836DD38", + "asset": "0xA12136197Fc7dDB83b89B2EDAEEcd88316FDE991", + "performanceFeeRate": 10000000, + "maxCapacity": "5000000000000000000000", + "timelock": 1, + "admin": "0x73582719184969d11baDf253D8e04c09867B66a8", + "curator": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE", + "guardian": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE", + "allocator": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE" + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-access-manager.json b/deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-access-manager.json new file mode 100644 index 0000000..f0aa22c --- /dev/null +++ b/deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "arb-sepolia", + "deployedAt": "1748951146", + "gitBranch": "deploy/v1.0.9", + "gitCommitHash": "0x0x0489591746b16bb969ea123423e618e76b7e2dcb", + "blockInfo": { + "number": "8467679", + "timestamp": "1748951146" + }, + "deployer": "0xE355d5D8aa52EF0FbbD037C4a3C5E6Fd659cf46B", + "admin": "0x81f314f70702Bbe89FEd0F2cFe6841950275E0b7", + "contracts": { + "accessManager": "0x0709F8B7BdEA284C7352A5b12505f3d70BF9C21b" + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-core.json b/deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-core.json new file mode 100644 index 0000000..b0b3421 --- /dev/null +++ b/deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-core.json @@ -0,0 +1,21 @@ +{ + "network": "arb-sepolia", + "deployedAt": "1748952621", + "gitBranch": "deploy/v1.0.9", + "gitCommitHash": "0x0x0489591746b16bb969ea123423e618e76b7e2dcb", + "blockInfo": { + "number": "8467802", + "timestamp": "1748952621" + }, + "deployer": "0xE355d5D8aa52EF0FbbD037C4a3C5E6Fd659cf46B", + "admin": "0x81f314f70702Bbe89FEd0F2cFe6841950275E0b7", + "contracts": { + "factory": "0xc1d2224D57F1A156d59073ed791C7f7C41C03877", + "vaultFactory": "0xD6FcF8aE09660dF44539954261Daee43aE56A39C", + "oracleAggregator": "0xD58B80655ed0342A297560AD1f3251C2b99752CF", + "router": "0x9c9832dD2ead3d0752A22aCd50B112FD36e063B5", + "swapAdapter": "0x80E51c9A593963930B0bf13476ebcD61063dA130", + "faucet": "0xE877cB4bD6f5F10b3C207f7B691E4275A2A398bc", + "marketViewer": "0xf8c19ab9150b2b93afc4d797a4c4Ef3A50BB3610" + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-USDC-ARB@26DEC2025.json b/deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-USDC-ARB@26DEC2025.json new file mode 100644 index 0000000..8c64ebf --- /dev/null +++ b/deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-USDC-ARB@26DEC2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8468222", + "timestamp": "1748957660" + }, + "market": "0x41926faE08F5B5C428bf88f157B22B767d8d5E45", + "collateral": { + "address": "0x4E919ba6c904463a2D36B85fD8738DBEF11d8506", + "symbol": "ARB", + "priceFeed": "0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xE7e6EA2B6A1D7E7d80727290a86CCC9FE5fbe0C1", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x8b19f75D2AF0Fd4617D2a268C52412aE1bB63aF2", + "xt": "0x29ef9eBF255E67BAB764359eFD97b14095c5d09C", + "gt": "0xf5f3EDe4C92324341fBa5ef64Fe1f0096c46327D" + }, + "config": { + "marketSymbol": "USDC/ARB@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "26DEC2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-USDC-WBTC@26SEP2025.json b/deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-USDC-WBTC@26SEP2025.json new file mode 100644 index 0000000..c044155 --- /dev/null +++ b/deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-USDC-WBTC@26SEP2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8468222", + "timestamp": "1748957660" + }, + "market": "0xb82927d2420680a69650842Ba985788a426FC148", + "collateral": { + "address": "0xecDe7427eA7CEfF00AfC89733d66Fe4656C503b6", + "symbol": "WBTC", + "priceFeed": "0xd0C7101eACbB49F3deCcCc166d238410D6D46d57", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xE7e6EA2B6A1D7E7d80727290a86CCC9FE5fbe0C1", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x451e3383F700b596930F405c9C6271A44B30fFA2", + "xt": "0xfA1E27067Abbe8ECAb1D8D407E2c67147269c817", + "gt": "0xAfCE12e90B504305707C4ebF03e0905Deef36A6e" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "26SEP2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-USDC-WETH@26DEC2025.json b/deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-USDC-WETH@26DEC2025.json new file mode 100644 index 0000000..7e095f2 --- /dev/null +++ b/deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-USDC-WETH@26DEC2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8468222", + "timestamp": "1748957660" + }, + "market": "0xE6dd131De3e11bdC1212aEefE00B374b8691022d", + "collateral": { + "address": "0xf12a10232455E2F22aBc0B688e9C458E1cD14338", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xE7e6EA2B6A1D7E7d80727290a86CCC9FE5fbe0C1", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x88cA1534A2d5d975D2E20E12CEDB2f0275FD40f5", + "xt": "0xbaBAf9eae188ae5A63fc10A02159Dc3c0751EB59", + "gt": "0xae76aFbc6Bc295db018baF4FD63f52B53AdaaF48" + }, + "config": { + "marketSymbol": "USDC/WETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "26DEC2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-USDC-wstETH@26SEP2025.json b/deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-USDC-wstETH@26SEP2025.json new file mode 100644 index 0000000..fd3aaaf --- /dev/null +++ b/deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-USDC-wstETH@26SEP2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8468222", + "timestamp": "1748957660" + }, + "market": "0x5F133D0D068d64EDe88D1C551A9b8A47f717Ff9A", + "collateral": { + "address": "0xdD9e964C4C1C9d6903a865eEEc72e5B13D9dC643", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xE7e6EA2B6A1D7E7d80727290a86CCC9FE5fbe0C1", + "symbol": "USDC", + "priceFeed": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x6DCb42f5Ec257d4CE9ACbCA2a25cdDbC44d09237", + "xt": "0x196e2CF09a181c55A7a93eb54126ef9E6C3A2021", + "gt": "0xacF9B134719f2C6d6C21b0dFD181e762A120c8DC" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "26SEP2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-WETH-PT-weETH-26JUN2025@26DEC2025.json b/deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-WETH-PT-weETH-26JUN2025@26DEC2025.json new file mode 100644 index 0000000..00d96c2 --- /dev/null +++ b/deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-WETH-PT-weETH-26JUN2025@26DEC2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8468222", + "timestamp": "1748957660" + }, + "market": "0x52C73bFEFcCA692EeF7F9caF99b40E15319f895c", + "collateral": { + "address": "0x6c107b779B0fA77107606329f64c60545994A758", + "symbol": "PT-weETH-26JUN2025", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xf12a10232455E2F22aBc0B688e9C458E1cD14338", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x9ec45b2C1C452780A2248Fa3232070F0701Cf9f5", + "xt": "0xc92E7f14cEa1214ca8F5EB01CE67e31047dD2E55", + "gt": "0xf1839cABb4389792b0c0eC1a9bd092942f5f13dB" + }, + "config": { + "marketSymbol": "WETH/PT-weETH-26JUN2025@27JUN2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "26DEC2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-WETH-weETH@26SEP2025.json b/deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-WETH-weETH@26SEP2025.json new file mode 100644 index 0000000..2fca95b --- /dev/null +++ b/deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-WETH-weETH@26SEP2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8468222", + "timestamp": "1748957660" + }, + "market": "0x6c2576De69bfb62Ae6dEdd97114da69959DaEa2f", + "collateral": { + "address": "0x9e0fB430c8cb111293208513D8DFd943ac1C4941", + "symbol": "weETH", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xf12a10232455E2F22aBc0B688e9C458E1cD14338", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x57C8D7670e9FFe6f1eBE9aD3Ab3b71890D36D5B7", + "xt": "0xF4fB411fd61b4E6C0d696a01deA8B3cbf94535FE", + "gt": "0x72B52226001884b1e5c07FFFfF18Bc8c3C0eFabA" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "26SEP2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-WETH-wstETH@26SEP2025.json b/deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-WETH-wstETH@26SEP2025.json new file mode 100644 index 0000000..b1d212f --- /dev/null +++ b/deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-WETH-wstETH@26SEP2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8468222", + "timestamp": "1748957660" + }, + "market": "0xee1E95cDCA9A83da352e5B549Bf7c82006C59D7D", + "collateral": { + "address": "0xdD9e964C4C1C9d6903a865eEEc72e5B13D9dC643", + "symbol": "wstETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xf12a10232455E2F22aBc0B688e9C458E1cD14338", + "symbol": "WETH", + "priceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x40e3afAef7b555B9eda442Aa587Adcd00eB94283", + "xt": "0x9D170044DaD1fa0Dd5e12EFB7f46CCeEe2A97B66", + "gt": "0xb4df6fbAF95BC73D1Bb1918d52dAdE581130477f" + }, + "config": { + "marketSymbol": "WETH/wstETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "26SEP2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/bnb-mainnet/bnb-mainnet-V2-adapters-29MAY2025.json b/deployments/bnb-mainnet/bnb-mainnet-V2-adapters-29MAY2025.json new file mode 100644 index 0000000..c0fff79 --- /dev/null +++ b/deployments/bnb-mainnet/bnb-mainnet-V2-adapters-29MAY2025.json @@ -0,0 +1,26 @@ +{ + "network": "bnb-mainnet", + "deployedAt": "1748526829", + "dateString": "29MAY2025", + "gitBranch": "deploy/v1.0.9", + "gitCommitHash": "0x0xf2fc71ad48a28d22075027313412d5b61d0b7ef5", + "blockInfo": { + "number": "50522003", + "timestamp": "1748526829" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x0000000000000000000000000000000000000000", + "accessManager": "0x9498764f0c62257B83A04e2A757De30908EC793d", + "router": "0xb7634dB4f4710bb992118bC37d1F63e00e2704A4", + "contracts": { + "odosV2Adapter": "0xBd795F755dbB5A5358D6c60AED53ceB486Fa8517", + "pendleSwapV3Adapter": "0x02F389E230a4844203692c9a1DBC0ee8f8D2F70b", + "uniswapV3Adapter": "0x78834843E9cFaeDC03471ba8b5b648c2C8cFd0B5", + "erc4626VaultAdapter": "0xa9b7719CefE39A0233B77960ACcca015aD5f3184" + }, + "routerAddresses": { + "uniswapV3Router": "0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2", + "odosV2Router": "0x89b8AA89FDd0507a99d334CBe3C808fAFC7d850E", + "pendleSwapV3Router": "0x888888888889758F76e7103c6CbF23ABbF58F946" + } +} \ No newline at end of file diff --git a/deployments/bnb-mainnet/bnb-mainnet-access-manager.json b/deployments/bnb-mainnet/bnb-mainnet-access-manager.json new file mode 100644 index 0000000..b1083ab --- /dev/null +++ b/deployments/bnb-mainnet/bnb-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "bnb-mainnet", + "deployedAt": "1748427061", + "gitBranch": "deploy/v1.0.9", + "gitCommitHash": "0x0xbbca9bae55a04187db0c7e41898feb98c52d000c", + "blockInfo": { + "number": "50455621", + "timestamp": "1748427061" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0x9498764f0c62257B83A04e2A757De30908EC793d" + } +} \ No newline at end of file diff --git a/deployments/bnb-mainnet/bnb-mainnet-core.json b/deployments/bnb-mainnet/bnb-mainnet-core.json new file mode 100644 index 0000000..12a51be --- /dev/null +++ b/deployments/bnb-mainnet/bnb-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "bnb-mainnet", + "deployedAt": "1748523134", + "gitBranch": "deploy/v1.0.9", + "gitCommitHash": "0x0xe3a5c207cb14ce86cbfbd9ae89417a4f5e6192e2", + "blockInfo": { + "number": "50519540", + "timestamp": "1748523134" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x8Df05E11e72378c1710e296450Bf6b72e2F12019", + "vaultFactory": "0x48bCd27e208dC973C3F56812F762077A90E88Cea", + "oracleAggregator": "0xC7dE1A55758bDBa5CC6b6f7535006eE1349A6d37", + "router": "0xb7634dB4f4710bb992118bC37d1F63e00e2704A4", + "swapAdapter": { + "uniswapV3Adapter": "0xbb35188CD8Ba0A85ED8C8406187cA6443203423d", + "odosV2Adapter": "0x6Ac37B549660F2c9F1a77597Ee1ACA5F742C7093", + "pendleSwapV3Adapter": "0xFa8BE638a78fa426C4228Df1002fD54fA48A6CAF", + "ERC4626VaultAdapter": "0x6Fa11E0e1e0eE768DEB0E728a08a4407d15EE466" + }, + "marketViewer": "0x8b2ae4e2070b3E9bf9625FC61290700a2E24A808" + } +} \ No newline at end of file diff --git a/deployments/bnb-mainnet/bnb-mainnet-market-BTCB-USD1@25JUL2025.json b/deployments/bnb-mainnet/bnb-mainnet-market-BTCB-USD1@25JUL2025.json new file mode 100644 index 0000000..634528a --- /dev/null +++ b/deployments/bnb-mainnet/bnb-mainnet-market-BTCB-USD1@25JUL2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "51480317", + "timestamp": "1749964600" + }, + "market": "0xA7EcD333b3429F4EEe50bE866c4Ca697885F5F8C", + "collateral": { + "address": "0x8d0D000Ee44948FC98c9B98A4FA4921476f08B0d", + "symbol": "USD1", + "priceFeed": "0xaD8b4e59A7f25B68945fAf0f3a3EAF027832FFB0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x7130d2A12B9BCbFAe4f2634d864A1Ee1Ce3Ead9c", + "symbol": "BTCB", + "priceFeed": "0x264990fbd0A4796A3E3d8E37C4d5F87a3aCa5Ebf", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xB308dCd5C21234f4CBC78EE7848a88C8B58d8417", + "xt": "0x945dAE4328ae940048Af2DBd6f28Ae06c1a78E31", + "gt": "0xa784F8BA616ab8a1908718dd1247235683EacD02" + }, + "config": { + "marketSymbol": "BTCB/USD1@25JUL2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "25JUL2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "3000000" + } + } +} \ No newline at end of file diff --git a/deployments/bnb-mainnet/bnb-mainnet-market-USDT-BTCB@25JUL2025.json b/deployments/bnb-mainnet/bnb-mainnet-market-USDT-BTCB@25JUL2025.json new file mode 100644 index 0000000..b63a3f2 --- /dev/null +++ b/deployments/bnb-mainnet/bnb-mainnet-market-USDT-BTCB@25JUL2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "51480317", + "timestamp": "1749964600" + }, + "market": "0x38fb9E8fdff8a6b810b5651A827052C8DB25eF51", + "collateral": { + "address": "0x7130d2A12B9BCbFAe4f2634d864A1Ee1Ce3Ead9c", + "symbol": "BTCB", + "priceFeed": "0x264990fbd0A4796A3E3d8E37C4d5F87a3aCa5Ebf", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x55d398326f99059fF775485246999027B3197955", + "symbol": "USDT", + "priceFeed": "0xB97Ad0E74fa7d920791E90258A6E2085088b4320", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xC8140937C35BEd389FcEbC57fD38296cC443e7dD", + "xt": "0x426046b777Be06bF9eCf57705c0609fBECC3cdDe", + "gt": "0x3A519afc88b255bDBF106403243D91D59B2E33Cd" + }, + "config": { + "marketSymbol": "USDT/BTCB@25JUL2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "25JUL2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "6000000" + } + } +} \ No newline at end of file diff --git a/deployments/bnb-mainnet/bnb-mainnet-market-USDT-USD1@25JUL2025.json b/deployments/bnb-mainnet/bnb-mainnet-market-USDT-USD1@25JUL2025.json new file mode 100644 index 0000000..5654a65 --- /dev/null +++ b/deployments/bnb-mainnet/bnb-mainnet-market-USDT-USD1@25JUL2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "51480317", + "timestamp": "1749964600" + }, + "market": "0x32887001dfE06Efe3013C0CE9b875a569c439124", + "collateral": { + "address": "0x8d0D000Ee44948FC98c9B98A4FA4921476f08B0d", + "symbol": "USD1", + "priceFeed": "0xaD8b4e59A7f25B68945fAf0f3a3EAF027832FFB0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x55d398326f99059fF775485246999027B3197955", + "symbol": "USDT", + "priceFeed": "0xB97Ad0E74fa7d920791E90258A6E2085088b4320", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xa1af01dd0653D07b20A69C3c9Fb0CD4A15d93b1F", + "xt": "0x7087a6cB21C3f9aa7F7Ef16e3271C286d2D18f37", + "gt": "0x7e0805D07b0b24305D227D96f1855ED936B70D53" + }, + "config": { + "marketSymbol": "USDT/USD1@25JUL2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "25JUL2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "6000000" + } + } +} \ No newline at end of file diff --git a/deployments/bnb-mainnet/bnb-mainnet-market-USDT-WBNB@25JUL2025.json b/deployments/bnb-mainnet/bnb-mainnet-market-USDT-WBNB@25JUL2025.json new file mode 100644 index 0000000..afb77af --- /dev/null +++ b/deployments/bnb-mainnet/bnb-mainnet-market-USDT-WBNB@25JUL2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "51480317", + "timestamp": "1749964600" + }, + "market": "0xAb5c179FA24d760f648711c977690b07Ec77782A", + "collateral": { + "address": "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c", + "symbol": "WBNB", + "priceFeed": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x55d398326f99059fF775485246999027B3197955", + "symbol": "USDT", + "priceFeed": "0xB97Ad0E74fa7d920791E90258A6E2085088b4320", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xF0B0c8594e28923543265c83b2469375B985CC30", + "xt": "0x1D148453D39AAC38f4273c703CC46396E3Be7a78", + "gt": "0x80C1FD61bB4987Bfd84C01Bb0F7E3914a9B20dd4" + }, + "config": { + "marketSymbol": "USDT/WBNB@25JUL2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "25JUL2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "6000000" + } + } +} \ No newline at end of file diff --git a/deployments/bnb-mainnet/bnb-mainnet-market-USDT-sUSDe@25JUL2025.json b/deployments/bnb-mainnet/bnb-mainnet-market-USDT-sUSDe@25JUL2025.json new file mode 100644 index 0000000..c07ee06 --- /dev/null +++ b/deployments/bnb-mainnet/bnb-mainnet-market-USDT-sUSDe@25JUL2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "51480317", + "timestamp": "1749964600" + }, + "market": "0xfb0aF63370a24E402b027A8677a6197e7f9C7017", + "collateral": { + "address": "0x211Cc4DD073734dA055fbF44a2b4667d5E5fE5d2", + "symbol": "sUSDe", + "priceFeed": "0x7CD1174235476Ec8844A88de0d3E56A21E72ADa2", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x55d398326f99059fF775485246999027B3197955", + "symbol": "USDT", + "priceFeed": "0xB97Ad0E74fa7d920791E90258A6E2085088b4320", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xE910f6faF046E7F56cfb7ba832ec6f110EEA1BB3", + "xt": "0xdf7eA87881725913F08bf1c73312752d567BB278", + "gt": "0x8f4F84a1a49aE7361489dfBCD2985E25F967D386" + }, + "config": { + "marketSymbol": "USDT/sUSDe@25JUL2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "25JUL2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "6000000" + } + } +} \ No newline at end of file diff --git a/deployments/bnb-mainnet/bnb-mainnet-market-WBNB-BTCB@25JUL2025.json b/deployments/bnb-mainnet/bnb-mainnet-market-WBNB-BTCB@25JUL2025.json new file mode 100644 index 0000000..98d0269 --- /dev/null +++ b/deployments/bnb-mainnet/bnb-mainnet-market-WBNB-BTCB@25JUL2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "51480317", + "timestamp": "1749964600" + }, + "market": "0x93E7b60888391a7FEECe0a60C7E632394d1A856C", + "collateral": { + "address": "0x7130d2A12B9BCbFAe4f2634d864A1Ee1Ce3Ead9c", + "symbol": "BTCB", + "priceFeed": "0x264990fbd0A4796A3E3d8E37C4d5F87a3aCa5Ebf", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c", + "symbol": "WBNB", + "priceFeed": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x1Fb31CabbE59084c30f0AB3FF32F84f2FC92C8b5", + "xt": "0xB77ebabA0f1ebcbBAdb98B8254A02B1A6F2fFbFE", + "gt": "0x1FDFCfBc2E401B4DADd4114773F6aE5fA2bFEb8c" + }, + "config": { + "marketSymbol": "WBNB/BTCB@25JUL2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "25JUL2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "3000000" + } + } +} \ No newline at end of file diff --git a/deployments/bnb-mainnet/bnb-mainnet-market-WBNB-USD1@25JUL2025.json b/deployments/bnb-mainnet/bnb-mainnet-market-WBNB-USD1@25JUL2025.json new file mode 100644 index 0000000..554a599 --- /dev/null +++ b/deployments/bnb-mainnet/bnb-mainnet-market-WBNB-USD1@25JUL2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "51480317", + "timestamp": "1749964600" + }, + "market": "0x721BC0332754DAb1962afe2aBc784AeEBf1De11E", + "collateral": { + "address": "0x8d0D000Ee44948FC98c9B98A4FA4921476f08B0d", + "symbol": "USD1", + "priceFeed": "0xaD8b4e59A7f25B68945fAf0f3a3EAF027832FFB0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c", + "symbol": "WBNB", + "priceFeed": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x4b47864E34867Aef7cb76C3297088d8cbC5c6bBC", + "xt": "0xA5c5eCd8Ca806b78986e508c7338af012962aCfc", + "gt": "0xa623bB457FD8c99e0c903F74c1889Fa15e700f04" + }, + "config": { + "marketSymbol": "WBNB/USD1@25JUL2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "25JUL2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "3000000" + } + } +} \ No newline at end of file diff --git a/deployments/bnb-mainnet/bnb-mainnet-market-WBNB-ynBNBx@25JUL2025.json b/deployments/bnb-mainnet/bnb-mainnet-market-WBNB-ynBNBx@25JUL2025.json new file mode 100644 index 0000000..6a8edf4 --- /dev/null +++ b/deployments/bnb-mainnet/bnb-mainnet-market-WBNB-ynBNBx@25JUL2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "51480317", + "timestamp": "1749964600" + }, + "market": "0x66cC6a17F93f2dc013dfcf8627EbD1269C20FD8f", + "collateral": { + "address": "0x32C830f5c34122C6afB8aE87ABA541B7900a2C5F", + "symbol": "ynBNBx", + "priceFeed": "0x5F5376913E011AeDe8d93027B335832180411322", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c", + "symbol": "WBNB", + "priceFeed": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x70CF7BA3b643170E2fb10b4D46C364384b785837", + "xt": "0x03de568624787CA82bF14A86A3be895655D1CEd0", + "gt": "0x04bcFe13B9fFE3628DBeabB8a4377aDc9240d261" + }, + "config": { + "marketSymbol": "WBNB/ynBNBx@25JUL2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "25JUL2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "3000000" + } + } +} \ No newline at end of file diff --git a/deployments/bnb-mainnet/bnb-mainnet-vault-TMX-USDT-Vault-13JUN2025.json b/deployments/bnb-mainnet/bnb-mainnet-vault-TMX-USDT-Vault-13JUN2025.json new file mode 100644 index 0000000..dc08f16 --- /dev/null +++ b/deployments/bnb-mainnet/bnb-mainnet-vault-TMX-USDT-Vault-13JUN2025.json @@ -0,0 +1,25 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.9", + "commit": "0x0x8fb8627bea884c615df68b127ae9a09b4e20db1d" + }, + "blockInfo": { + "network": "bnb-mainnet", + "blockNumber": "51385092", + "timestamp": "1749821745", + "dateString": "13JUN2025" + }, + "vaultInfo": { + "name": "TermMax USDT Vault", + "symbol": "TMX-USDT-Vault", + "address": "0x86c958CAc8aeE37dE62715691c0D597c710Eca51", + "asset": "0x55d398326f99059fF775485246999027B3197955", + "performanceFeeRate": 0, + "maxCapacity": "50000000000000000000000000", + "timelock": 86400, + "admin": "0x9498764f0c62257B83A04e2A757De30908EC793d", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/bnb-mainnet/bnb-mainnet-vault-TMX-WBNB-Vault-13JUN2025.json b/deployments/bnb-mainnet/bnb-mainnet-vault-TMX-WBNB-Vault-13JUN2025.json new file mode 100644 index 0000000..c10b618 --- /dev/null +++ b/deployments/bnb-mainnet/bnb-mainnet-vault-TMX-WBNB-Vault-13JUN2025.json @@ -0,0 +1,25 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.9", + "commit": "0x0x8fb8627bea884c615df68b127ae9a09b4e20db1d" + }, + "blockInfo": { + "network": "bnb-mainnet", + "blockNumber": "51384859", + "timestamp": "1749821395", + "dateString": "13JUN2025" + }, + "vaultInfo": { + "name": "TermMax WBNB Vault", + "symbol": "TMX-WBNB-Vault", + "address": "0x89653E6523fB73284353252b41AE580E6f96dFad", + "asset": "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c", + "performanceFeeRate": 0, + "maxCapacity": "20000000000000000000000", + "timelock": 86400, + "admin": "0x9498764f0c62257B83A04e2A757De30908EC793d", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/bnb-testnet/bnb-testnet-access-manager.json b/deployments/bnb-testnet/bnb-testnet-access-manager.json new file mode 100644 index 0000000..e4d391b --- /dev/null +++ b/deployments/bnb-testnet/bnb-testnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "bnb-testnet", + "deployedAt": "1745078880", + "gitBranch": "deploy/v1.0.9", + "gitCommitHash": "0x0x9ccea93c0ceff6a76f38270be9ea3d3aad9552d7", + "blockInfo": { + "number": "50444060", + "timestamp": "1745078880" + }, + "deployer": "0xE355d5D8aa52EF0FbbD037C4a3C5E6Fd659cf46B", + "admin": "0x81f314f70702Bbe89FEd0F2cFe6841950275E0b7", + "contracts": { + "accessManager": "0xF28546cFbBBB0474aa77ec692e35AbebB6ba98E1" + } +} \ No newline at end of file diff --git a/deployments/bnb-testnet/bnb-testnet-core.json b/deployments/bnb-testnet/bnb-testnet-core.json new file mode 100644 index 0000000..d9858c0 --- /dev/null +++ b/deployments/bnb-testnet/bnb-testnet-core.json @@ -0,0 +1,21 @@ +{ + "network": "bnb-testnet", + "deployedAt": "1745079294", + "gitBranch": "deploy/v1.0.9", + "gitCommitHash": "0x0x9ccea93c0ceff6a76f38270be9ea3d3aad9552d7", + "blockInfo": { + "number": "50444336", + "timestamp": "1745079294" + }, + "deployer": "0xE355d5D8aa52EF0FbbD037C4a3C5E6Fd659cf46B", + "admin": "0x81f314f70702Bbe89FEd0F2cFe6841950275E0b7", + "contracts": { + "factory": "0x3b25e0b9AFff38620b7c070C0E21C49520F1933B", + "vaultFactory": "0xa2450A147a1e03109c9ecea50590f13F1e4F10e5", + "oracleAggregator": "0x23b6CAd9F1376A2146C7ab469b371ae090246dD4", + "router": "0xfe1dFCe548E8AEBe2964D5C0c9906FcE981d7E47", + "swapAdapter": "0x7584B2003c208629748dE4B28c925b011F79200b", + "faucet": "0xD0F4bA61A691F31463a459B631E997580B6C2C26", + "marketViewer": "0x43D245c1106f38721A8bbd0022108DA02d8073a5" + } +} \ No newline at end of file diff --git a/deployments/bnb-testnet/bnb-testnet-market-USDF-PT-USDF-24JUL2025@30MAY2025.json b/deployments/bnb-testnet/bnb-testnet-market-USDF-PT-USDF-24JUL2025@30MAY2025.json new file mode 100644 index 0000000..4ae3e30 --- /dev/null +++ b/deployments/bnb-testnet/bnb-testnet-market-USDF-PT-USDF-24JUL2025@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "50446056", + "timestamp": "1745081875" + }, + "market": "0xCEBfcCeAE78523cAb0a651BB9F50F2a42cD02334", + "collateral": { + "address": "0x99EE8b5FCaAFfe20F13Ea2d1f98CC0E5007bC0B4", + "symbol": "PT-USDF-24JUL2025", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xE0542c184612e3bA238c04a13BC2400B78740278", + "symbol": "USDF", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x256056E4413338fc965D30d70b7E593b042cF728", + "xt": "0x4829f19FA3AcBb85Ac518b4e8712D7625848683d", + "gt": "0x8DFa26A1745bCf7EEb10302025EA090777973C2F" + }, + "config": { + "marketSymbol": "USDF/PT-USDF-24JUL2025@24JUL2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/bnb-testnet/bnb-testnet-market-WBNB-slisBNB@30MAY2025.json b/deployments/bnb-testnet/bnb-testnet-market-WBNB-slisBNB@30MAY2025.json new file mode 100644 index 0000000..d5b6b63 --- /dev/null +++ b/deployments/bnb-testnet/bnb-testnet-market-WBNB-slisBNB@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "50446056", + "timestamp": "1745081875" + }, + "market": "0x61b3cd6E5e8c41258789fCe40A4B77Cc5b3c769E", + "collateral": { + "address": "0x550AF08ceA3346EB5bA7ab88267E03C686a51eaC", + "symbol": "slisBNB", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x378b9B0224252f4F0e5fC5ef80Ae63389215d0b3", + "symbol": "WBNB", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x374c3c33137a412F9DA82F8AAA4663B61C91837c", + "xt": "0xCDEC91fB09297DAb82770897b02A34fd4b614e57", + "gt": "0x2bA292497afe4b2E5a8459b34d301606F2bcEE20" + }, + "config": { + "marketSymbol": "WBNB/slisBNB@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/bnb-testnet/bnb-testnet-vault-TMX-USDF-Vault.json b/deployments/bnb-testnet/bnb-testnet-vault-TMX-USDF-Vault.json new file mode 100644 index 0000000..9f818e4 --- /dev/null +++ b/deployments/bnb-testnet/bnb-testnet-vault-TMX-USDF-Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.9", + "commit": "0x0x53dd1e2e6f9d69f487810fb71472654b1fc82c09" + }, + "blockInfo": { + "network": "bnb-testnet", + "blockNumber": "50959780", + "timestamp": "1745853264" + }, + "vaultInfo": { + "name": "TermMax USD Vault", + "symbol": "TMX-USDF-Vault", + "address": "0xc685Dac88A70cf75f442575f34a4e11890f4f0d6", + "asset": "0xE0542c184612e3bA238c04a13BC2400B78740278", + "performanceFeeRate": 0, + "maxCapacity": "10000000000000000000000000", + "timelock": 1, + "admin": "0xF28546cFbBBB0474aa77ec692e35AbebB6ba98E1", + "curator": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE", + "guardian": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE", + "allocator": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-access-manager.json b/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-access-manager.json new file mode 100644 index 0000000..ac9b224 --- /dev/null +++ b/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743496825", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x63beb3e4a59b16c67274f2a221a2b31cbdd405f0", + "blockInfo": { + "number": "22095404", + "timestamp": "1743496825" + }, + "deployer": "0xE355d5D8aa52EF0FbbD037C4a3C5E6Fd659cf46B", + "admin": "0x81f314f70702Bbe89FEd0F2cFe6841950275E0b7", + "contracts": { + "accessManager": "0x8A9954d09aa511c3d986167766244Eaf7B986dE5" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-core.json b/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-core.json new file mode 100644 index 0000000..6ff6173 --- /dev/null +++ b/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743497402", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x63beb3e4a59b16c67274f2a221a2b31cbdd405f0", + "blockInfo": { + "number": "22095410", + "timestamp": "1743497402" + }, + "deployer": "0xE355d5D8aa52EF0FbbD037C4a3C5E6Fd659cf46B", + "admin": "0x81f314f70702Bbe89FEd0F2cFe6841950275E0b7", + "contracts": { + "factory": "0xeE43AE1fa906497F4dbC561F77856E21238A1E25", + "vaultFactory": "0x7c48A59E3346D8A0cdDB221a836b84F706dc372e", + "oracleAggregator": "0xf6B4a5b64d9AA15689e03A0116499c38410b045f", + "router": "0x23cafE3c010e8BdA1f247b9d97A87d3c173318A7", + "swapAdapter": { + "uniswapV3Adapter": "0x21C2376eb9Ec0B832f7eE7E25028AEA1602b9531", + "odosV2Adapter": "0xB9D03162de01d9303Fb729287BB65363895ac9f2", + "pendleSwapV3Adapter": "0xDa7cD8EFA0D019F1644171E3F122e9A7454C916E", + "ERC4626VaultAdapter": "0x8ade0c89f9a751fB2112AeF41C4E817dC62Cd0c5" + }, + "marketViewer": "0xdC325533007E364fCc715667228B5278C75CC416" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@30MAY2025.json b/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@30MAY2025.json new file mode 100644 index 0000000..3c0d641 --- /dev/null +++ b/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22095459", + "timestamp": "1743498020" + }, + "market": "0x6Ed197F78A66257121B96f5748CedB723C24bf63", + "collateral": { + "address": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "symbol": "PT-sUSDE-29MAY2025", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x20955f2649117181b04a3FAB48AaA9C593Ec2f4F", + "xt": "0xBA5C563d93c8e90b390DE2A74EBFeB1a69C826E9", + "gt": "0x8347605e402745C15eD0b63dA28d501846A96db6" + }, + "config": { + "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-USDC-USUALUSDC+@30MAY2025.json b/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-USDC-USUALUSDC+@30MAY2025.json new file mode 100644 index 0000000..c1ee47b --- /dev/null +++ b/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-USDC-USUALUSDC+@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22095459", + "timestamp": "1743498020" + }, + "market": "0x72F9bBE83980aFD6025c13b4d59a7EB0594C2c88", + "collateral": { + "address": "0xd63070114470f685b75B74D60EEc7c1113d33a3D", + "symbol": "USUALUSDC+", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x6A035EB3BA89790f9DD5b52263dF9681e41256f3", + "xt": "0x13F592D438AC4968c98baD8dC74C849cA4841D8E", + "gt": "0x3aFd794880639A4AFBA18E75b988102Bc32294b1" + }, + "config": { + "marketSymbol": "USDC/USUALUSDC+@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-USDC-WBTC@30MAY2025.json b/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-USDC-WBTC@30MAY2025.json new file mode 100644 index 0000000..3fe7848 --- /dev/null +++ b/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-USDC-WBTC@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22095459", + "timestamp": "1743498020" + }, + "market": "0x3E3F02141237F0C5B090f2F4F741Daf80F0B3C78", + "collateral": { + "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "symbol": "WBTC", + "priceFeed": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xaC97B2cfF42B01f3edC797D7fb21fDC08Eb52300", + "xt": "0xc09D096E088510b08eCf7e8cfaF71a4778a400d5", + "gt": "0x6E6c0B08a7aD7807a8cb6e262ABbBE3b4037495E" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-USDC-cbBTC@30MAY2025.json b/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-USDC-cbBTC@30MAY2025.json new file mode 100644 index 0000000..95d6d5a --- /dev/null +++ b/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-USDC-cbBTC@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22095459", + "timestamp": "1743498020" + }, + "market": "0x66a295662D76E002e923AD052dd9eff60573F56E", + "collateral": { + "address": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", + "symbol": "cbBTC", + "priceFeed": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xDBB8B610A8aB95AF823c8886e9A034e1A181FB2f", + "xt": "0xcdfA5d0915ab4bE4ff173d13B98101F6cECd042c", + "gt": "0x70DaBe1729b4fE69fbDde0Bf56fC520019a7cEeA" + }, + "config": { + "marketSymbol": "USDC/cbBTC@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-USDC-eUSDe@29MAY2025.json b/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-USDC-eUSDe@29MAY2025.json new file mode 100644 index 0000000..f83d729 --- /dev/null +++ b/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-USDC-eUSDe@29MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22095459", + "timestamp": "1743498020" + }, + "market": "0x9dc16Bc9Ba936db34187099BC4e8E8708D45690E", + "collateral": { + "address": "0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F", + "symbol": "eUSDe", + "priceFeed": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x1168E8C52E347386D1Db3AcC07174386bD54e9e1", + "xt": "0x0DB3C4E985b80B111A9E8B57F1fcdE2fa54F2F59", + "gt": "0x624e3C5cB5F4cC16EAA4E5174f352fEfa5F34F84" + }, + "config": { + "marketSymbol": "USDC/eUSDe@29MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "29MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-USDC-sUSDe@30MAY2025.json b/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-USDC-sUSDe@30MAY2025.json new file mode 100644 index 0000000..63eb352 --- /dev/null +++ b/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-USDC-sUSDe@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22095459", + "timestamp": "1743498020" + }, + "market": "0xB658C7c51F21489f12B618560D791100e538fA5a", + "collateral": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x3Ed00148e9959c406Ec3a1219Da36117344B74A2", + "xt": "0x83CA57f58C64567AA83b49F9Afa38aae3BaA1812", + "gt": "0x32078C4e488AF31BFc891Ba6Be905E4DE40fd392" + }, + "config": { + "marketSymbol": "USDC/sUSDe@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-USDC-wstETH@30MAY2025.json b/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-USDC-wstETH@30MAY2025.json new file mode 100644 index 0000000..3ff5b16 --- /dev/null +++ b/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-USDC-wstETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22095459", + "timestamp": "1743498020" + }, + "market": "0x8D1D5A71C37636348811ab706a8da1F46028e343", + "collateral": { + "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x57216cE7b3A4Ca9Ad7F43Db684b0e679f5072523", + "xt": "0xa78fB0F9a0F12B9b08BbaE5832B7258D57eD1939", + "gt": "0x527822304738DB9d42a7cbd7e4CEd5D94431274f" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-WETH-MCwETH@30MAY2025.json b/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-WETH-MCwETH@30MAY2025.json new file mode 100644 index 0000000..ee43a01 --- /dev/null +++ b/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-WETH-MCwETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22095459", + "timestamp": "1743498020" + }, + "market": "0x0A403B16eac0E40b71d79939d09D5df8b37244d9", + "collateral": { + "address": "0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8", + "symbol": "MCwETH", + "priceFeed": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xC6498EDbAd606A64be9DBb472317c06d034117E1", + "xt": "0xA311E0684d9F6368149025e5a997311a32AaBA12", + "gt": "0xEC9Cc6e53b695A511BEE3d67C6f393fA69B172AB" + }, + "config": { + "marketSymbol": "WETH/MCwETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-WETH-gtWETH@30MAY2025.json b/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-WETH-gtWETH@30MAY2025.json new file mode 100644 index 0000000..018b5d1 --- /dev/null +++ b/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-WETH-gtWETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22095459", + "timestamp": "1743498020" + }, + "market": "0x5AA8FD282642F55E4B812078927E672E6c0a6807", + "collateral": { + "address": "0x2371e134e3455e0593363cBF89d3b6cf53740618", + "symbol": "gtWETH", + "priceFeed": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xFD2b44a67CFEcb0B1D8dF3ea437b95d0171F8DF4", + "xt": "0xA3EB96060551CAbcCD59478764ef3BCE04e05dd4", + "gt": "0xB89F84937c899042A978c981C449aDa352188e83" + }, + "config": { + "marketSymbol": "WETH/gtWETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-WETH-pufETH@30MAY2025.json b/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-WETH-pufETH@30MAY2025.json new file mode 100644 index 0000000..1329c38 --- /dev/null +++ b/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-WETH-pufETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22095459", + "timestamp": "1743498020" + }, + "market": "0xFdFFA2C857CB603BFbdFB98a9db057E784b15888", + "collateral": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x98Bb39d34FF39e9b75dfB825c9922289A79d39D2", + "xt": "0x6c0EAEB2DcAc732ade7CadbdaA53Ec3424d556c6", + "gt": "0x83cB297891C9A46d7a700450Cfd77ab106F7EA29" + }, + "config": { + "marketSymbol": "WETH/pufETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-WETH-weETH@30MAY2025.json b/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-WETH-weETH@30MAY2025.json new file mode 100644 index 0000000..6787630 --- /dev/null +++ b/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-WETH-weETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22095459", + "timestamp": "1743498020" + }, + "market": "0x1EFc12001f73557600387ff198353cB3F6332dAe", + "collateral": { + "address": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "21600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x37f6bAFd7355174d6794B53878Fe726dFEdD821D", + "xt": "0x8E6b927C59dd23Caa07c48d29F2eA7b36B734ee8", + "gt": "0x10d2d58f8096e6CbDf055F379936bA303aA22CA9" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@30MAY2025.json b/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@30MAY2025.json new file mode 100644 index 0000000..3bca152 --- /dev/null +++ b/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22095459", + "timestamp": "1743498020" + }, + "market": "0x493A77f1110D1102Ae9fB915728062Fe85d2b1F2", + "collateral": { + "address": "0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D", + "symbol": "PT-pufETH-26JUN2025", + "priceFeed": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x35E6ac2B95BE2E408bd891Ef18C3a7B0d63418F7", + "xt": "0xf480941EA275dBa128550753b369C478D6c67E29", + "gt": "0x925f0E7b3396A426790628b0C38f975B3C93faC3" + }, + "config": { + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-vault-TermMax USDC Vault.json b/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-vault-TermMax USDC Vault.json new file mode 100644 index 0000000..3d8d626 --- /dev/null +++ b/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-vault-TermMax USDC Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x63beb3e4a59b16c67274f2a221a2b31cbdd405f0" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22095474", + "timestamp": "1743498814" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TermMax USDC Vault", + "address": "0xd20440456fad0928e7994283E290f6afD6CaB699", + "asset": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "performanceFeeRate": 10000000, + "maxCapacity": "10000000000000", + "timelock": 60, + "admin": "0x8A9954d09aa511c3d986167766244Eaf7B986dE5", + "curator": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE", + "guardian": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE", + "allocator": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-vault-TermMax WETH Vault.json b/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-vault-TermMax WETH Vault.json new file mode 100644 index 0000000..a41a640 --- /dev/null +++ b/deployments/eth-mainnet-fork-v1.0.8-20250401/eth-mainnet-vault-TermMax WETH Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x63beb3e4a59b16c67274f2a221a2b31cbdd405f0" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22095477", + "timestamp": "1743499048" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TermMax WETH Vault", + "address": "0x83c717503A778dcc2729504A8f353f2B5e57FEcA", + "asset": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "performanceFeeRate": 10000000, + "maxCapacity": "5000000000000000000000", + "timelock": 60, + "admin": "0x8A9954d09aa511c3d986167766244Eaf7B986dE5", + "curator": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE", + "guardian": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE", + "allocator": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250402-1700/deploy-eth-mainnet-oracle-aggregator-0401-log.txt b/deployments/eth-mainnet-v1.0.8-20250402-1700/deploy-eth-mainnet-oracle-aggregator-0401-log.txt new file mode 100644 index 0000000..81ca312 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250402-1700/deploy-eth-mainnet-oracle-aggregator-0401-log.txt @@ -0,0 +1,21 @@ +== Logs == + Network: eth-mainnet + Deployer balance: 158879257545733090 + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175070 + Block timestamp: 1743522719 + + ===== Oracle Aggregator Info ===== + Deployer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Admin: 0x8409a9C1A911CED491892c5694E43994c9d47E8f + Oracle Aggregator deployed at: 0xE3a31690392E8E18DC3d862651C079339E2c1ADE + Oracle Timelock: 43200 + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250402-1700/deploy_markets_test_0402_log.txt b/deployments/eth-mainnet-v1.0.8-20250402-1700/deploy_markets_test_0402_log.txt new file mode 100644 index 0000000..236c256 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250402-1700/deploy_markets_test_0402_log.txt @@ -0,0 +1,370 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Enabled--verify +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175185 + Block timestamp: 1743524099 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22175185 + + ===== Market Info - 0 ===== + Market deployed at: 0x4a20DdEB8696b1f542649626889522068cc19438 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x00B210A7f79653A0fe7e2bc31d6Fe3026421195d + XT deployed at: 0x465c30b940E792262Ef65B7Fe7A5bAd3b5b7f034 + GT deployed at: 0xca3F986978ADEf5aA8e4F9e4F3d27f6f4Eb3f47d + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@02APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xC8c3A49b64dB371F96EdC15941e043966297Ea6b + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x19632ff799BA54B54934b52a89964F6cb12D396f + XT deployed at: 0xe459c64a852Df70Ea7D0cc46142A1a0d8BCd4f2A + GT deployed at: 0x9CEA72e4C7Fd1dd0bb2D0AAF98D756B1f85e096D + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@02APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x54ACdb3da45bBDEb1a53e1E3F6DB51C8384c7F9c + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x3ebabb95e4276DD2850666a95037f5EE3bb798Bb + XT deployed at: 0xb7d4329b11Dff286890F4d7e5b10763E09E8804C + GT deployed at: 0x28C108FD44B2E58DD9B07CBE453c0BCF836b8CB7 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@02APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xf2F9b0fDD5D22e574421A7Ee0E29e410E63C70A9 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x594Db033Ade81E0C8182B66d2B07fbc97452d1FA + XT deployed at: 0x544786112d542910634109BcCEF84C3Deb1b65e0 + GT deployed at: 0x81CAc518B14B28570C667A143F801bF2e05b6BEe + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@02APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x10aCD317ebf3F65e30c72720D89c55B7C68a9628 + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xA03710F73585cb5458F43739624611633Bf24173 + XT deployed at: 0x80525c75690102bb024BcEd8bE81D18A56172EC0 + GT deployed at: 0xe2e5403923B0421FA5a9D28c1012aeAFfc820f02 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@02APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x49913B7Bd178e21FaC84C3dED810Ff4CcDcb8403 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x8CDe48E20b5d77C3ec0fbCbf50d0C78B2DE11264 + XT deployed at: 0x8b596614c9ac30bd9DF615c3C18F0f05a97F0779 + GT deployed at: 0xBA03824B38E83B7CBAF3Fcb5aF02EF8342A110d8 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@02APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x69E1A695Ee24e7BcFc55d2dA7DfD479E4C7Eb6A3 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0xc7d5476d361C8d0E5c0478EA320431AD4a49A558 + XT deployed at: 0xe1710D5449241ce311Bfcefb5272594ECD930ec0 + GT deployed at: 0x4B87E9281de9573f2025565E632bdb8F136766E5 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@02APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0x9dA149D4Bc9eF4e6Eb1D131E837270f76dc62e79 + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD667a61e822564e1399f73196c73B2C41bCBda69 + XT deployed at: 0x2348B91F2037799d6AE604D792101534461DB06E + GT deployed at: 0x1aE5482Db2883e1ae8CDBFDbaE95539266F1bF32 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@02APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0x9cde69Ea28c9125060F86eB982305BafaE57f585 + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x4bDD2b0f934EECCE01A8Fc47E3762Ce86C9D061F + XT deployed at: 0x63B96518024b49C8F16104fDFd9d94a79A3d185C + GT deployed at: 0xa78bE568bc5ec42C8E41734dADcb86D3dde73af3 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@02APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x565656a354F6C2953EB2D00DC7e2e0Ab815e19E7 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x1184866Ed937F4605efc100c1f18E028F7CBDD86 + XT deployed at: 0x3F56b53953adf3a65f5Bb8E8Dce1C4926e1D629c + GT deployed at: 0x315f180e74247E01ca0377244Eb6b6D1c7444452 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@02APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x0ed76A80D639E7Bf88524b63429bB841c1633E60 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD4771df4a0f6338f521512A1651D8DB7EF5Af633 + XT deployed at: 0x4bbc10317e5b70B6B491836F5B2b496EE35f5E31 + GT deployed at: 0xFF601c3788236F231a8771cACBbB3087D0Ee7A2c + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@02APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x8c07c10a0a3530a9fB64c65f109A32F7B4b2DB80 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x0469A60F8fbc0c35c4D1D965a50A6Bd29c9dAB8C + XT deployed at: 0xE292927A017d58823957A83ea5EFeAF9C37D6F94 + GT deployed at: 0x7AdE4961Fccba087E8b4De84E8be61098Daf0230 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@02APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 5.079885262 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.087924645429718704 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x4a20ddeb8696b1f542649626889522068cc19438, 0x00b210a7f79653a0fe7e2bc31d6fe3026421195d, 0x465c30b940e792262ef65b7fe7a5bad3b5b7f034, 0xca3f986978adef5aa8e4f9e4f3d27f6f4eb3f47d, 0xc8c3a49b64db371f96edc15941e043966297ea6b, 0x19632ff799ba54b54934b52a89964f6cb12d396f, 0xe459c64a852df70ea7d0cc46142a1a0d8bcd4f2a, 0x9cea72e4c7fd1dd0bb2d0aaf98d756b1f85e096d, 0x54acdb3da45bbdeb1a53e1e3f6db51c8384c7f9c, 0x3ebabb95e4276dd2850666a95037f5ee3bb798bb, 0xb7d4329b11dff286890f4d7e5b10763e09e8804c, 0x28c108fd44b2e58dd9b07cbe453c0bcf836b8cb7, 0xf2f9b0fdd5d22e574421a7ee0e29e410e63c70a9, 0x594db033ade81e0c8182b66d2b07fbc97452d1fa, 0x544786112d542910634109bccef84c3deb1b65e0, 0x81cac518b14b28570c667a143f801bf2e05b6bee, 0x10acd317ebf3f65e30c72720d89c55b7c68a9628, 0xa03710f73585cb5458f43739624611633bf24173, 0x80525c75690102bb024bced8be81d18a56172ec0, 0xe2e5403923b0421fa5a9d28c1012aeaffc820f02, 0x49913b7bd178e21fac84c3ded810ff4ccdcb8403, 0x8cde48e20b5d77c3ec0fbcbf50d0c78b2de11264, 0x8b596614c9ac30bd9df615c3c18f0f05a97f0779, 0xba03824b38e83b7cbaf3fcb5af02ef8342a110d8, 0x69e1a695ee24e7bcfc55d2da7dfd479e4c7eb6a3, 0xc7d5476d361c8d0e5c0478ea320431ad4a49a558, 0xe1710d5449241ce311bfcefb5272594ecd930ec0, 0x4b87e9281de9573f2025565e632bdb8f136766e5, 0x9da149d4bc9ef4e6eb1d131e837270f76dc62e79, 0xd667a61e822564e1399f73196c73b2c41bcbda69, 0x2348b91f2037799d6ae604d792101534461db06e, 0x1ae5482db2883e1ae8cdbfdbae95539266f1bf32, 0x9cde69ea28c9125060f86eb982305bafae57f585, 0x4bdd2b0f934eecce01a8fc47e3762ce86c9d061f, 0x63b96518024b49c8f16104fdfd9d94a79a3d185c, 0xa78be568bc5ec42c8e41734dadcb86d3dde73af3, 0x565656a354f6c2953eb2d00dc7e2e0ab815e19e7, 0x1184866ed937f4605efc100c1f18e028f7cbdd86, 0x3f56b53953adf3a65f5bb8e8dce1c4926e1d629c, 0x315f180e74247e01ca0377244eb6b6d1c7444452, 0x0ed76a80d639e7bf88524b63429bb841c1633e60, 0xd4771df4a0f6338f521512a1651d8db7ef5af633, 0x4bbc10317e5b70b6b491836f5b2b496ee35f5e31, 0xff601c3788236f231a8771cacbbb3087d0ee7a2c, 0x8c07c10a0a3530a9fb64c65f109a32f7b4b2db80, 0x0469a60f8fbc0c35c4d1d965a50a6bd29c9dab8c, 0xe292927a017d58823957a83ea5efeaf9c37d6f94, 0x7ade4961fccba087e8b4de84e8be61098daf0230]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-access-manager.json b/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-access-manager.json new file mode 100644 index 0000000..a1a5b6a --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743155675", + "gitBranch": "deploy/v1.0.5", + "gitCommitHash": "0x0x65c418860c22aecb27054e7a8c3207a4f87ad6af", + "blockInfo": { + "number": "22144647", + "timestamp": "1743155675" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-core.json b/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-core.json new file mode 100644 index 0000000..34b5474 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743518639", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x30f0c30e4edf518e2bf6700837dad2a7624d35df", + "blockInfo": { + "number": "22174730", + "timestamp": "1743518639" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x37Ba9934aAbA7a49cC29d0952C6a91d7c7043dbc", + "vaultFactory": "0x01D8C1e0584751085a876892151Bf8490e862E3E", + "oracleAggregator": "0xE3a31690392E8E18DC3d862651C079339E2c1ADE", + "router": "0xC47591F5c023e44931c78D5A993834875b79FB11", + "swapAdapter": { + "uniswapV3Adapter": "0x34F7b52b0d33959C8351eF95F3523C89b6123C0b", + "odosV2Adapter": "0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779", + "pendleSwapV3Adapter": "0x0B30251FA697A39Fd41813b267b50F03414E82da", + "ERC4626VaultAdapter": "0x85ce30537c14EFB66B673f284bEa7c28351244F6" + }, + "marketViewer": "0x74Dfb95Ae623123ecf82Ba841985fB460bB9d45D" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@02APR2025.json b/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@02APR2025.json new file mode 100644 index 0000000..3e9c71c --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@02APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22175185", + "timestamp": "1743524099" + }, + "market": "0xf2F9b0fDD5D22e574421A7Ee0E29e410E63C70A9", + "collateral": { + "address": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "symbol": "PT-sUSDE-29MAY2025", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x594Db033Ade81E0C8182B66d2B07fbc97452d1FA", + "xt": "0x544786112d542910634109BcCEF84C3Deb1b65e0", + "gt": "0x81CAc518B14B28570C667A143F801bF2e05b6BEe" + }, + "config": { + "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "02APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-USDC-USUALUSDC+@02APR2025.json b/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-USDC-USUALUSDC+@02APR2025.json new file mode 100644 index 0000000..abc5d82 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-USDC-USUALUSDC+@02APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22175185", + "timestamp": "1743524099" + }, + "market": "0x10aCD317ebf3F65e30c72720D89c55B7C68a9628", + "collateral": { + "address": "0xd63070114470f685b75B74D60EEc7c1113d33a3D", + "symbol": "USUALUSDC+", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xA03710F73585cb5458F43739624611633Bf24173", + "xt": "0x80525c75690102bb024BcEd8bE81D18A56172EC0", + "gt": "0xe2e5403923B0421FA5a9D28c1012aeAFfc820f02" + }, + "config": { + "marketSymbol": "USDC/USUALUSDC+@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "02APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-USDC-WBTC@02APR2025.json b/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-USDC-WBTC@02APR2025.json new file mode 100644 index 0000000..0769af1 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-USDC-WBTC@02APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22175185", + "timestamp": "1743524099" + }, + "market": "0x565656a354F6C2953EB2D00DC7e2e0Ab815e19E7", + "collateral": { + "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "symbol": "WBTC", + "priceFeed": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x1184866Ed937F4605efc100c1f18E028F7CBDD86", + "xt": "0x3F56b53953adf3a65f5Bb8E8Dce1C4926e1D629c", + "gt": "0x315f180e74247E01ca0377244Eb6b6D1c7444452" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "02APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-USDC-cbBTC@02APR2025.json b/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-USDC-cbBTC@02APR2025.json new file mode 100644 index 0000000..931fb64 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-USDC-cbBTC@02APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22175185", + "timestamp": "1743524099" + }, + "market": "0x0ed76A80D639E7Bf88524b63429bB841c1633E60", + "collateral": { + "address": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", + "symbol": "cbBTC", + "priceFeed": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xD4771df4a0f6338f521512A1651D8DB7EF5Af633", + "xt": "0x4bbc10317e5b70B6B491836F5B2b496EE35f5E31", + "gt": "0xFF601c3788236F231a8771cACBbB3087D0Ee7A2c" + }, + "config": { + "marketSymbol": "USDC/cbBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "02APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-USDC-eUSDe@02APR2025.json b/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-USDC-eUSDe@02APR2025.json new file mode 100644 index 0000000..5902626 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-USDC-eUSDe@02APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22175185", + "timestamp": "1743524099" + }, + "market": "0x9dA149D4Bc9eF4e6Eb1D131E837270f76dc62e79", + "collateral": { + "address": "0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F", + "symbol": "eUSDe", + "priceFeed": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xD667a61e822564e1399f73196c73B2C41bCBda69", + "xt": "0x2348B91F2037799d6AE604D792101534461DB06E", + "gt": "0x1aE5482Db2883e1ae8CDBFDbaE95539266F1bF32" + }, + "config": { + "marketSymbol": "USDC/eUSDe@29MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "02APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-USDC-sUSDe@02APR2025.json b/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-USDC-sUSDe@02APR2025.json new file mode 100644 index 0000000..34e7505 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-USDC-sUSDe@02APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22175185", + "timestamp": "1743524099" + }, + "market": "0x54ACdb3da45bBDEb1a53e1E3F6DB51C8384c7F9c", + "collateral": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x3ebabb95e4276DD2850666a95037f5EE3bb798Bb", + "xt": "0xb7d4329b11Dff286890F4d7e5b10763E09E8804C", + "gt": "0x28C108FD44B2E58DD9B07CBE453c0BCF836b8CB7" + }, + "config": { + "marketSymbol": "USDC/sUSDe@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "02APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-USDC-wstETH@02APR2025.json b/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-USDC-wstETH@02APR2025.json new file mode 100644 index 0000000..0a54520 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-USDC-wstETH@02APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22175185", + "timestamp": "1743524099" + }, + "market": "0xC8c3A49b64dB371F96EdC15941e043966297Ea6b", + "collateral": { + "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x19632ff799BA54B54934b52a89964F6cb12D396f", + "xt": "0xe459c64a852Df70Ea7D0cc46142A1a0d8BCd4f2A", + "gt": "0x9CEA72e4C7Fd1dd0bb2D0AAF98D756B1f85e096D" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "02APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-WETH-MCwETH@02APR2025.json b/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-WETH-MCwETH@02APR2025.json new file mode 100644 index 0000000..f9f5972 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-WETH-MCwETH@02APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22175185", + "timestamp": "1743524099" + }, + "market": "0x49913B7Bd178e21FaC84C3dED810Ff4CcDcb8403", + "collateral": { + "address": "0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8", + "symbol": "MCwETH", + "priceFeed": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x8CDe48E20b5d77C3ec0fbCbf50d0C78B2DE11264", + "xt": "0x8b596614c9ac30bd9DF615c3C18F0f05a97F0779", + "gt": "0xBA03824B38E83B7CBAF3Fcb5aF02EF8342A110d8" + }, + "config": { + "marketSymbol": "WETH/MCwETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "02APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-WETH-gtWETH@02APR2025.json b/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-WETH-gtWETH@02APR2025.json new file mode 100644 index 0000000..d8f6598 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-WETH-gtWETH@02APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22175185", + "timestamp": "1743524099" + }, + "market": "0x8c07c10a0a3530a9fB64c65f109A32F7B4b2DB80", + "collateral": { + "address": "0x2371e134e3455e0593363cBF89d3b6cf53740618", + "symbol": "gtWETH", + "priceFeed": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x0469A60F8fbc0c35c4D1D965a50A6Bd29c9dAB8C", + "xt": "0xE292927A017d58823957A83ea5EFeAF9C37D6F94", + "gt": "0x7AdE4961Fccba087E8b4De84E8be61098Daf0230" + }, + "config": { + "marketSymbol": "WETH/gtWETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "02APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-WETH-pufETH@02APR2025.json b/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-WETH-pufETH@02APR2025.json new file mode 100644 index 0000000..b4b82ac --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-WETH-pufETH@02APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22175185", + "timestamp": "1743524099" + }, + "market": "0x9cde69Ea28c9125060F86eB982305BafaE57f585", + "collateral": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x4bDD2b0f934EECCE01A8Fc47E3762Ce86C9D061F", + "xt": "0x63B96518024b49C8F16104fDFd9d94a79A3d185C", + "gt": "0xa78bE568bc5ec42C8E41734dADcb86D3dde73af3" + }, + "config": { + "marketSymbol": "WETH/pufETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "02APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-WETH-weETH@02APR2025.json b/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-WETH-weETH@02APR2025.json new file mode 100644 index 0000000..f8fefa6 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-WETH-weETH@02APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22175185", + "timestamp": "1743524099" + }, + "market": "0x4a20DdEB8696b1f542649626889522068cc19438", + "collateral": { + "address": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "21600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x00B210A7f79653A0fe7e2bc31d6Fe3026421195d", + "xt": "0x465c30b940E792262Ef65B7Fe7A5bAd3b5b7f034", + "gt": "0xca3F986978ADEf5aA8e4F9e4F3d27f6f4Eb3f47d" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "02APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@02APR2025.json b/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@02APR2025.json new file mode 100644 index 0000000..18b9e25 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@02APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22175185", + "timestamp": "1743524099" + }, + "market": "0x69E1A695Ee24e7BcFc55d2dA7DfD479E4C7Eb6A3", + "collateral": { + "address": "0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D", + "symbol": "PT-pufETH-26JUN2025", + "priceFeed": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xc7d5476d361C8d0E5c0478EA320431AD4a49A558", + "xt": "0xe1710D5449241ce311Bfcefb5272594ECD930ec0", + "gt": "0x4B87E9281de9573f2025565E632bdb8F136766E5" + }, + "config": { + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "02APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-vault-TermMax USDC Vault.json b/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-vault-TermMax USDC Vault.json new file mode 100644 index 0000000..e579dbd --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-vault-TermMax USDC Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xf0e7aead33f178cc18e33b5c6e07f406fb95194d" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22175287", + "timestamp": "1743525323" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TermMax USDC Vault", + "address": "0xf9ed1da089DEe56a929975aE4E4017098e45a09A", + "asset": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "performanceFeeRate": 10000000, + "maxCapacity": "10000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-vault-TermMax WETH Vault.json b/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-vault-TermMax WETH Vault.json new file mode 100644 index 0000000..e377b2d --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250402-1700/eth-mainnet-vault-TermMax WETH Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xf0e7aead33f178cc18e33b5c6e07f406fb95194d" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22175304", + "timestamp": "1743525527" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TermMax WETH Vault", + "address": "0xfa9e4093875cE1a3b4d5C220A387aCc24ffdc64c", + "asset": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "performanceFeeRate": 10000000, + "maxCapacity": "500000000000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "guardian": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b", + "allocator": "0x96e65A7a861D70A1c024774d7a48af44bCAD502b" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250403-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt b/deployments/eth-mainnet-v1.0.8-20250403-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt new file mode 100644 index 0000000..81ca312 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250403-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt @@ -0,0 +1,21 @@ +== Logs == + Network: eth-mainnet + Deployer balance: 158879257545733090 + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175070 + Block timestamp: 1743522719 + + ===== Oracle Aggregator Info ===== + Deployer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Admin: 0x8409a9C1A911CED491892c5694E43994c9d47E8f + Oracle Aggregator deployed at: 0xE3a31690392E8E18DC3d862651C079339E2c1ADE + Oracle Timelock: 43200 + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250403-2000/deploy_markets_test_0402_log.txt b/deployments/eth-mainnet-v1.0.8-20250403-2000/deploy_markets_test_0402_log.txt new file mode 100644 index 0000000..236c256 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250403-2000/deploy_markets_test_0402_log.txt @@ -0,0 +1,370 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Enabled--verify +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175185 + Block timestamp: 1743524099 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22175185 + + ===== Market Info - 0 ===== + Market deployed at: 0x4a20DdEB8696b1f542649626889522068cc19438 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x00B210A7f79653A0fe7e2bc31d6Fe3026421195d + XT deployed at: 0x465c30b940E792262Ef65B7Fe7A5bAd3b5b7f034 + GT deployed at: 0xca3F986978ADEf5aA8e4F9e4F3d27f6f4Eb3f47d + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@02APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xC8c3A49b64dB371F96EdC15941e043966297Ea6b + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x19632ff799BA54B54934b52a89964F6cb12D396f + XT deployed at: 0xe459c64a852Df70Ea7D0cc46142A1a0d8BCd4f2A + GT deployed at: 0x9CEA72e4C7Fd1dd0bb2D0AAF98D756B1f85e096D + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@02APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x54ACdb3da45bBDEb1a53e1E3F6DB51C8384c7F9c + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x3ebabb95e4276DD2850666a95037f5EE3bb798Bb + XT deployed at: 0xb7d4329b11Dff286890F4d7e5b10763E09E8804C + GT deployed at: 0x28C108FD44B2E58DD9B07CBE453c0BCF836b8CB7 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@02APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xf2F9b0fDD5D22e574421A7Ee0E29e410E63C70A9 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x594Db033Ade81E0C8182B66d2B07fbc97452d1FA + XT deployed at: 0x544786112d542910634109BcCEF84C3Deb1b65e0 + GT deployed at: 0x81CAc518B14B28570C667A143F801bF2e05b6BEe + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@02APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x10aCD317ebf3F65e30c72720D89c55B7C68a9628 + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xA03710F73585cb5458F43739624611633Bf24173 + XT deployed at: 0x80525c75690102bb024BcEd8bE81D18A56172EC0 + GT deployed at: 0xe2e5403923B0421FA5a9D28c1012aeAFfc820f02 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@02APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x49913B7Bd178e21FaC84C3dED810Ff4CcDcb8403 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x8CDe48E20b5d77C3ec0fbCbf50d0C78B2DE11264 + XT deployed at: 0x8b596614c9ac30bd9DF615c3C18F0f05a97F0779 + GT deployed at: 0xBA03824B38E83B7CBAF3Fcb5aF02EF8342A110d8 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@02APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x69E1A695Ee24e7BcFc55d2dA7DfD479E4C7Eb6A3 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0xc7d5476d361C8d0E5c0478EA320431AD4a49A558 + XT deployed at: 0xe1710D5449241ce311Bfcefb5272594ECD930ec0 + GT deployed at: 0x4B87E9281de9573f2025565E632bdb8F136766E5 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@02APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0x9dA149D4Bc9eF4e6Eb1D131E837270f76dc62e79 + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD667a61e822564e1399f73196c73B2C41bCBda69 + XT deployed at: 0x2348B91F2037799d6AE604D792101534461DB06E + GT deployed at: 0x1aE5482Db2883e1ae8CDBFDbaE95539266F1bF32 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@02APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0x9cde69Ea28c9125060F86eB982305BafaE57f585 + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x4bDD2b0f934EECCE01A8Fc47E3762Ce86C9D061F + XT deployed at: 0x63B96518024b49C8F16104fDFd9d94a79A3d185C + GT deployed at: 0xa78bE568bc5ec42C8E41734dADcb86D3dde73af3 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@02APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x565656a354F6C2953EB2D00DC7e2e0Ab815e19E7 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x1184866Ed937F4605efc100c1f18E028F7CBDD86 + XT deployed at: 0x3F56b53953adf3a65f5Bb8E8Dce1C4926e1D629c + GT deployed at: 0x315f180e74247E01ca0377244Eb6b6D1c7444452 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@02APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x0ed76A80D639E7Bf88524b63429bB841c1633E60 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD4771df4a0f6338f521512A1651D8DB7EF5Af633 + XT deployed at: 0x4bbc10317e5b70B6B491836F5B2b496EE35f5E31 + GT deployed at: 0xFF601c3788236F231a8771cACBbB3087D0Ee7A2c + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@02APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x8c07c10a0a3530a9fB64c65f109A32F7B4b2DB80 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x0469A60F8fbc0c35c4D1D965a50A6Bd29c9dAB8C + XT deployed at: 0xE292927A017d58823957A83ea5EFeAF9C37D6F94 + GT deployed at: 0x7AdE4961Fccba087E8b4De84E8be61098Daf0230 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@02APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 5.079885262 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.087924645429718704 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x4a20ddeb8696b1f542649626889522068cc19438, 0x00b210a7f79653a0fe7e2bc31d6fe3026421195d, 0x465c30b940e792262ef65b7fe7a5bad3b5b7f034, 0xca3f986978adef5aa8e4f9e4f3d27f6f4eb3f47d, 0xc8c3a49b64db371f96edc15941e043966297ea6b, 0x19632ff799ba54b54934b52a89964f6cb12d396f, 0xe459c64a852df70ea7d0cc46142a1a0d8bcd4f2a, 0x9cea72e4c7fd1dd0bb2d0aaf98d756b1f85e096d, 0x54acdb3da45bbdeb1a53e1e3f6db51c8384c7f9c, 0x3ebabb95e4276dd2850666a95037f5ee3bb798bb, 0xb7d4329b11dff286890f4d7e5b10763e09e8804c, 0x28c108fd44b2e58dd9b07cbe453c0bcf836b8cb7, 0xf2f9b0fdd5d22e574421a7ee0e29e410e63c70a9, 0x594db033ade81e0c8182b66d2b07fbc97452d1fa, 0x544786112d542910634109bccef84c3deb1b65e0, 0x81cac518b14b28570c667a143f801bf2e05b6bee, 0x10acd317ebf3f65e30c72720d89c55b7c68a9628, 0xa03710f73585cb5458f43739624611633bf24173, 0x80525c75690102bb024bced8be81d18a56172ec0, 0xe2e5403923b0421fa5a9d28c1012aeaffc820f02, 0x49913b7bd178e21fac84c3ded810ff4ccdcb8403, 0x8cde48e20b5d77c3ec0fbcbf50d0c78b2de11264, 0x8b596614c9ac30bd9df615c3c18f0f05a97f0779, 0xba03824b38e83b7cbaf3fcb5af02ef8342a110d8, 0x69e1a695ee24e7bcfc55d2da7dfd479e4c7eb6a3, 0xc7d5476d361c8d0e5c0478ea320431ad4a49a558, 0xe1710d5449241ce311bfcefb5272594ecd930ec0, 0x4b87e9281de9573f2025565e632bdb8f136766e5, 0x9da149d4bc9ef4e6eb1d131e837270f76dc62e79, 0xd667a61e822564e1399f73196c73b2c41bcbda69, 0x2348b91f2037799d6ae604d792101534461db06e, 0x1ae5482db2883e1ae8cdbfdbae95539266f1bf32, 0x9cde69ea28c9125060f86eb982305bafae57f585, 0x4bdd2b0f934eecce01a8fc47e3762ce86c9d061f, 0x63b96518024b49c8f16104fdfd9d94a79a3d185c, 0xa78be568bc5ec42c8e41734dadcb86d3dde73af3, 0x565656a354f6c2953eb2d00dc7e2e0ab815e19e7, 0x1184866ed937f4605efc100c1f18e028f7cbdd86, 0x3f56b53953adf3a65f5bb8e8dce1c4926e1d629c, 0x315f180e74247e01ca0377244eb6b6d1c7444452, 0x0ed76a80d639e7bf88524b63429bb841c1633e60, 0xd4771df4a0f6338f521512a1651d8db7ef5af633, 0x4bbc10317e5b70b6b491836f5b2b496ee35f5e31, 0xff601c3788236f231a8771cacbbb3087d0ee7a2c, 0x8c07c10a0a3530a9fb64c65f109a32f7b4b2db80, 0x0469a60f8fbc0c35c4d1d965a50a6bd29c9dab8c, 0xe292927a017d58823957a83ea5efeaf9c37d6f94, 0x7ade4961fccba087e8b4de84e8be61098daf0230]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-access-manager.json b/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-access-manager.json new file mode 100644 index 0000000..a1a5b6a --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743155675", + "gitBranch": "deploy/v1.0.5", + "gitCommitHash": "0x0x65c418860c22aecb27054e7a8c3207a4f87ad6af", + "blockInfo": { + "number": "22144647", + "timestamp": "1743155675" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-core.json b/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-core.json new file mode 100644 index 0000000..34b5474 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743518639", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x30f0c30e4edf518e2bf6700837dad2a7624d35df", + "blockInfo": { + "number": "22174730", + "timestamp": "1743518639" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x37Ba9934aAbA7a49cC29d0952C6a91d7c7043dbc", + "vaultFactory": "0x01D8C1e0584751085a876892151Bf8490e862E3E", + "oracleAggregator": "0xE3a31690392E8E18DC3d862651C079339E2c1ADE", + "router": "0xC47591F5c023e44931c78D5A993834875b79FB11", + "swapAdapter": { + "uniswapV3Adapter": "0x34F7b52b0d33959C8351eF95F3523C89b6123C0b", + "odosV2Adapter": "0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779", + "pendleSwapV3Adapter": "0x0B30251FA697A39Fd41813b267b50F03414E82da", + "ERC4626VaultAdapter": "0x85ce30537c14EFB66B673f284bEa7c28351244F6" + }, + "marketViewer": "0x74Dfb95Ae623123ecf82Ba841985fB460bB9d45D" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@03APR2025.json b/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@03APR2025.json new file mode 100644 index 0000000..dcf8ea7 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@03APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179054", + "timestamp": "1743570719" + }, + "market": "0xEb96441fd0E77a985847776fC1E1e50586227Ecb", + "collateral": { + "address": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "symbol": "PT-sUSDE-29MAY2025", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x6956d2FA2723c3ce424912AfDA08aF272ee3296c", + "xt": "0x9a7380C034B580E2e4CAF8235543dA4b0775Fe5F", + "gt": "0x3c911a08583f87eC069de10e876f3150b35DE26C" + }, + "config": { + "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "03APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-USDC-USUALUSDC+@03APR2025.json b/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-USDC-USUALUSDC+@03APR2025.json new file mode 100644 index 0000000..d63f3a7 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-USDC-USUALUSDC+@03APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179054", + "timestamp": "1743570719" + }, + "market": "0xCD0A8c210D440cA2F493f5e4169f54d0e1012b7d", + "collateral": { + "address": "0xd63070114470f685b75B74D60EEc7c1113d33a3D", + "symbol": "USUALUSDC+", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xFc4CB28BE791291ac85E3eABdC14E03E6BE6618d", + "xt": "0x225D49E1EdB0A20090722dd04E85a90c31cC2c6E", + "gt": "0x0e634d626becf1B120310075AAD62F4fB967e934" + }, + "config": { + "marketSymbol": "USDC/USUALUSDC+@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "03APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-USDC-WBTC@03APR2025.json b/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-USDC-WBTC@03APR2025.json new file mode 100644 index 0000000..9174ab5 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-USDC-WBTC@03APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179054", + "timestamp": "1743570719" + }, + "market": "0x01eEEbA9F5CEb71e491dE52249ED38ac0dED53c3", + "collateral": { + "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "symbol": "WBTC", + "priceFeed": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xac94eBa061142aCFFe6983764Da4B40d5d9dB08a", + "xt": "0x18B2491dFc648A3f1ACa39EC798C441694E6c835", + "gt": "0xA2F73360c1Aae8fAF729729fcc91b40912C1D604" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "03APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-USDC-cbBTC@03APR2025.json b/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-USDC-cbBTC@03APR2025.json new file mode 100644 index 0000000..edc925e --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-USDC-cbBTC@03APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179054", + "timestamp": "1743570719" + }, + "market": "0x08237aB656A745a2E4ed19fd0b8C3B04F2fB05BC", + "collateral": { + "address": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", + "symbol": "cbBTC", + "priceFeed": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x2dFAd7a4649ce5632fa1d0fC354b1F828be09E8D", + "xt": "0x41CAd787532177ace4E8AC8f2C670573c45e08dc", + "gt": "0xa13e8c94f035AA8449c50eA15B040267d5239b2C" + }, + "config": { + "marketSymbol": "USDC/cbBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "03APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-USDC-eUSDe@03APR2025.json b/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-USDC-eUSDe@03APR2025.json new file mode 100644 index 0000000..257a553 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-USDC-eUSDe@03APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179054", + "timestamp": "1743570719" + }, + "market": "0x50D37b2513286614135F3D81Cc985B88a5038Dc8", + "collateral": { + "address": "0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F", + "symbol": "eUSDe", + "priceFeed": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xa2B2b631AE75ac9536B6Db64172f6499E7b9AA1b", + "xt": "0xCBC5b7A1e6E613a1b11909DA8Cad8B46DbB2C1d3", + "gt": "0x6622a35AF1f194Ebd482E528bEDF2adD470732E5" + }, + "config": { + "marketSymbol": "USDC/eUSDe@29MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "03APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-USDC-sUSDe@03APR2025.json b/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-USDC-sUSDe@03APR2025.json new file mode 100644 index 0000000..ff09739 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-USDC-sUSDe@03APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179054", + "timestamp": "1743570719" + }, + "market": "0xF2126DefF8f745b7DC86742262128bE3AbDe9DF7", + "collateral": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x9f3297eC596fA7F2e2fe2b2941D29208100A3fB1", + "xt": "0xe14aD2ffB58707453375a65b26336BAba5ff2B9F", + "gt": "0xD070F93AE349D813fa4DF0A205f1AB073786E021" + }, + "config": { + "marketSymbol": "USDC/sUSDe@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "03APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-USDC-wstETH@03APR2025.json b/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-USDC-wstETH@03APR2025.json new file mode 100644 index 0000000..ea8834f --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-USDC-wstETH@03APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179054", + "timestamp": "1743570719" + }, + "market": "0x3500Dc964b8cB452B6EDFe5Bfbc4940FB54c4C96", + "collateral": { + "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x9f58B3Fcbc0705075402a93A31F5e1f3ceA73D64", + "xt": "0x5d133D579cbfBFC048eC9048096D401724c76824", + "gt": "0x804fc570D337AC97Aa6dD74e70d6fC3fDc429F0d" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "03APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-WETH-MCwETH@03APR2025.json b/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-WETH-MCwETH@03APR2025.json new file mode 100644 index 0000000..d843ae5 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-WETH-MCwETH@03APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179054", + "timestamp": "1743570719" + }, + "market": "0xA55F2f1f8747671481680f0C5169458964Fde8D1", + "collateral": { + "address": "0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8", + "symbol": "MCwETH", + "priceFeed": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xD0B235EaB3d3EDEAEf769b2720c08BB5f09cAA98", + "xt": "0x8EA0Ef90750361CDc0fF1D031414AEFBeea16710", + "gt": "0x9cC86500e8fC470F8789F4987F42D534FCba5a5b" + }, + "config": { + "marketSymbol": "WETH/MCwETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "03APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-WETH-gtWETH@03APR2025.json b/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-WETH-gtWETH@03APR2025.json new file mode 100644 index 0000000..47db3ea --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-WETH-gtWETH@03APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179054", + "timestamp": "1743570719" + }, + "market": "0xB4D162644fD338528d86f687112B8AF56aC41743", + "collateral": { + "address": "0x2371e134e3455e0593363cBF89d3b6cf53740618", + "symbol": "gtWETH", + "priceFeed": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x0943f667Db1Aa5b4D011e776fD9C3Ef7A42753A1", + "xt": "0x8Bc19EcEC54Aa9fdD802Ff4e1E1D884619dd4E00", + "gt": "0x37a0D4134B6F73Db8bCb35ffb9fb2AD460F69185" + }, + "config": { + "marketSymbol": "WETH/gtWETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "03APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-WETH-pufETH@03APR2025.json b/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-WETH-pufETH@03APR2025.json new file mode 100644 index 0000000..4178851 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-WETH-pufETH@03APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179054", + "timestamp": "1743570719" + }, + "market": "0x172d1dCED534b3941B0172272556c31B9fbd4eC7", + "collateral": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xBe6565aD58237B7dda8B3F43C0D4d526c0393C55", + "xt": "0x6182A2f730d15fEBf08003F3eFE523a3c4675Ba1", + "gt": "0x06E08D541bB729F1d3f2C995D49e950F9610B7D4" + }, + "config": { + "marketSymbol": "WETH/pufETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "03APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-WETH-weETH@03APR2025.json b/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-WETH-weETH@03APR2025.json new file mode 100644 index 0000000..d332085 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-WETH-weETH@03APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179054", + "timestamp": "1743570719" + }, + "market": "0xDA4003d48f355FA18586e6a5b96D2F93072129fa", + "collateral": { + "address": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "21600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xFeE08e6119337f62dFd0175beD3Aa6363b1d6644", + "xt": "0x991cD2FAa4Ef2E13480755B117868B73Ca7cF614", + "gt": "0x14402B00E18Bc9ebD4193cB13F7B52a74C4073D5" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "03APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@03APR2025.json b/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@03APR2025.json new file mode 100644 index 0000000..98dfca9 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250403-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@03APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179054", + "timestamp": "1743570719" + }, + "market": "0x37194e3b5C4EacDC19B2703bD67Da82f6011d758", + "collateral": { + "address": "0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D", + "symbol": "PT-pufETH-26JUN2025", + "priceFeed": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x238dabbc3Ad3f5F1BA9CDa0f0649dE0aF296d7B4", + "xt": "0x30480BdC9f861aF922E66649FCefDE606699Db84", + "gt": "0xFfD3Cee3030528f2B619772831A06FE56A06bAe1" + }, + "config": { + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "03APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250404-1200/deploy-eth-mainnet-oracle-aggregator-0401-log.txt b/deployments/eth-mainnet-v1.0.8-20250404-1200/deploy-eth-mainnet-oracle-aggregator-0401-log.txt new file mode 100644 index 0000000..81ca312 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250404-1200/deploy-eth-mainnet-oracle-aggregator-0401-log.txt @@ -0,0 +1,21 @@ +== Logs == + Network: eth-mainnet + Deployer balance: 158879257545733090 + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175070 + Block timestamp: 1743522719 + + ===== Oracle Aggregator Info ===== + Deployer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Admin: 0x8409a9C1A911CED491892c5694E43994c9d47E8f + Oracle Aggregator deployed at: 0xE3a31690392E8E18DC3d862651C079339E2c1ADE + Oracle Timelock: 43200 + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250404-1200/deploy_markets_test_0402_log.txt b/deployments/eth-mainnet-v1.0.8-20250404-1200/deploy_markets_test_0402_log.txt new file mode 100644 index 0000000..236c256 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250404-1200/deploy_markets_test_0402_log.txt @@ -0,0 +1,370 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Enabled--verify +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175185 + Block timestamp: 1743524099 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22175185 + + ===== Market Info - 0 ===== + Market deployed at: 0x4a20DdEB8696b1f542649626889522068cc19438 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x00B210A7f79653A0fe7e2bc31d6Fe3026421195d + XT deployed at: 0x465c30b940E792262Ef65B7Fe7A5bAd3b5b7f034 + GT deployed at: 0xca3F986978ADEf5aA8e4F9e4F3d27f6f4Eb3f47d + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@02APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xC8c3A49b64dB371F96EdC15941e043966297Ea6b + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x19632ff799BA54B54934b52a89964F6cb12D396f + XT deployed at: 0xe459c64a852Df70Ea7D0cc46142A1a0d8BCd4f2A + GT deployed at: 0x9CEA72e4C7Fd1dd0bb2D0AAF98D756B1f85e096D + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@02APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x54ACdb3da45bBDEb1a53e1E3F6DB51C8384c7F9c + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x3ebabb95e4276DD2850666a95037f5EE3bb798Bb + XT deployed at: 0xb7d4329b11Dff286890F4d7e5b10763E09E8804C + GT deployed at: 0x28C108FD44B2E58DD9B07CBE453c0BCF836b8CB7 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@02APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xf2F9b0fDD5D22e574421A7Ee0E29e410E63C70A9 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x594Db033Ade81E0C8182B66d2B07fbc97452d1FA + XT deployed at: 0x544786112d542910634109BcCEF84C3Deb1b65e0 + GT deployed at: 0x81CAc518B14B28570C667A143F801bF2e05b6BEe + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@02APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x10aCD317ebf3F65e30c72720D89c55B7C68a9628 + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xA03710F73585cb5458F43739624611633Bf24173 + XT deployed at: 0x80525c75690102bb024BcEd8bE81D18A56172EC0 + GT deployed at: 0xe2e5403923B0421FA5a9D28c1012aeAFfc820f02 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@02APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x49913B7Bd178e21FaC84C3dED810Ff4CcDcb8403 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x8CDe48E20b5d77C3ec0fbCbf50d0C78B2DE11264 + XT deployed at: 0x8b596614c9ac30bd9DF615c3C18F0f05a97F0779 + GT deployed at: 0xBA03824B38E83B7CBAF3Fcb5aF02EF8342A110d8 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@02APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x69E1A695Ee24e7BcFc55d2dA7DfD479E4C7Eb6A3 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0xc7d5476d361C8d0E5c0478EA320431AD4a49A558 + XT deployed at: 0xe1710D5449241ce311Bfcefb5272594ECD930ec0 + GT deployed at: 0x4B87E9281de9573f2025565E632bdb8F136766E5 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@02APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0x9dA149D4Bc9eF4e6Eb1D131E837270f76dc62e79 + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD667a61e822564e1399f73196c73B2C41bCBda69 + XT deployed at: 0x2348B91F2037799d6AE604D792101534461DB06E + GT deployed at: 0x1aE5482Db2883e1ae8CDBFDbaE95539266F1bF32 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@02APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0x9cde69Ea28c9125060F86eB982305BafaE57f585 + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x4bDD2b0f934EECCE01A8Fc47E3762Ce86C9D061F + XT deployed at: 0x63B96518024b49C8F16104fDFd9d94a79A3d185C + GT deployed at: 0xa78bE568bc5ec42C8E41734dADcb86D3dde73af3 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@02APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x565656a354F6C2953EB2D00DC7e2e0Ab815e19E7 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x1184866Ed937F4605efc100c1f18E028F7CBDD86 + XT deployed at: 0x3F56b53953adf3a65f5Bb8E8Dce1C4926e1D629c + GT deployed at: 0x315f180e74247E01ca0377244Eb6b6D1c7444452 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@02APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x0ed76A80D639E7Bf88524b63429bB841c1633E60 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD4771df4a0f6338f521512A1651D8DB7EF5Af633 + XT deployed at: 0x4bbc10317e5b70B6B491836F5B2b496EE35f5E31 + GT deployed at: 0xFF601c3788236F231a8771cACBbB3087D0Ee7A2c + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@02APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x8c07c10a0a3530a9fB64c65f109A32F7B4b2DB80 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x0469A60F8fbc0c35c4D1D965a50A6Bd29c9dAB8C + XT deployed at: 0xE292927A017d58823957A83ea5EFeAF9C37D6F94 + GT deployed at: 0x7AdE4961Fccba087E8b4De84E8be61098Daf0230 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@02APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 5.079885262 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.087924645429718704 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x4a20ddeb8696b1f542649626889522068cc19438, 0x00b210a7f79653a0fe7e2bc31d6fe3026421195d, 0x465c30b940e792262ef65b7fe7a5bad3b5b7f034, 0xca3f986978adef5aa8e4f9e4f3d27f6f4eb3f47d, 0xc8c3a49b64db371f96edc15941e043966297ea6b, 0x19632ff799ba54b54934b52a89964f6cb12d396f, 0xe459c64a852df70ea7d0cc46142a1a0d8bcd4f2a, 0x9cea72e4c7fd1dd0bb2d0aaf98d756b1f85e096d, 0x54acdb3da45bbdeb1a53e1e3f6db51c8384c7f9c, 0x3ebabb95e4276dd2850666a95037f5ee3bb798bb, 0xb7d4329b11dff286890f4d7e5b10763e09e8804c, 0x28c108fd44b2e58dd9b07cbe453c0bcf836b8cb7, 0xf2f9b0fdd5d22e574421a7ee0e29e410e63c70a9, 0x594db033ade81e0c8182b66d2b07fbc97452d1fa, 0x544786112d542910634109bccef84c3deb1b65e0, 0x81cac518b14b28570c667a143f801bf2e05b6bee, 0x10acd317ebf3f65e30c72720d89c55b7c68a9628, 0xa03710f73585cb5458f43739624611633bf24173, 0x80525c75690102bb024bced8be81d18a56172ec0, 0xe2e5403923b0421fa5a9d28c1012aeaffc820f02, 0x49913b7bd178e21fac84c3ded810ff4ccdcb8403, 0x8cde48e20b5d77c3ec0fbcbf50d0c78b2de11264, 0x8b596614c9ac30bd9df615c3c18f0f05a97f0779, 0xba03824b38e83b7cbaf3fcb5af02ef8342a110d8, 0x69e1a695ee24e7bcfc55d2da7dfd479e4c7eb6a3, 0xc7d5476d361c8d0e5c0478ea320431ad4a49a558, 0xe1710d5449241ce311bfcefb5272594ecd930ec0, 0x4b87e9281de9573f2025565e632bdb8f136766e5, 0x9da149d4bc9ef4e6eb1d131e837270f76dc62e79, 0xd667a61e822564e1399f73196c73b2c41bcbda69, 0x2348b91f2037799d6ae604d792101534461db06e, 0x1ae5482db2883e1ae8cdbfdbae95539266f1bf32, 0x9cde69ea28c9125060f86eb982305bafae57f585, 0x4bdd2b0f934eecce01a8fc47e3762ce86c9d061f, 0x63b96518024b49c8f16104fdfd9d94a79a3d185c, 0xa78be568bc5ec42c8e41734dadcb86d3dde73af3, 0x565656a354f6c2953eb2d00dc7e2e0ab815e19e7, 0x1184866ed937f4605efc100c1f18e028f7cbdd86, 0x3f56b53953adf3a65f5bb8e8dce1c4926e1d629c, 0x315f180e74247e01ca0377244eb6b6d1c7444452, 0x0ed76a80d639e7bf88524b63429bb841c1633e60, 0xd4771df4a0f6338f521512a1651d8db7ef5af633, 0x4bbc10317e5b70b6b491836f5b2b496ee35f5e31, 0xff601c3788236f231a8771cacbbb3087d0ee7a2c, 0x8c07c10a0a3530a9fb64c65f109a32f7b4b2db80, 0x0469a60f8fbc0c35c4d1d965a50a6bd29c9dab8c, 0xe292927a017d58823957a83ea5efeaf9c37d6f94, 0x7ade4961fccba087e8b4de84e8be61098daf0230]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-access-manager.json b/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-access-manager.json new file mode 100644 index 0000000..a1a5b6a --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743155675", + "gitBranch": "deploy/v1.0.5", + "gitCommitHash": "0x0x65c418860c22aecb27054e7a8c3207a4f87ad6af", + "blockInfo": { + "number": "22144647", + "timestamp": "1743155675" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-core.json b/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-core.json new file mode 100644 index 0000000..34b5474 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743518639", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x30f0c30e4edf518e2bf6700837dad2a7624d35df", + "blockInfo": { + "number": "22174730", + "timestamp": "1743518639" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x37Ba9934aAbA7a49cC29d0952C6a91d7c7043dbc", + "vaultFactory": "0x01D8C1e0584751085a876892151Bf8490e862E3E", + "oracleAggregator": "0xE3a31690392E8E18DC3d862651C079339E2c1ADE", + "router": "0xC47591F5c023e44931c78D5A993834875b79FB11", + "swapAdapter": { + "uniswapV3Adapter": "0x34F7b52b0d33959C8351eF95F3523C89b6123C0b", + "odosV2Adapter": "0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779", + "pendleSwapV3Adapter": "0x0B30251FA697A39Fd41813b267b50F03414E82da", + "ERC4626VaultAdapter": "0x85ce30537c14EFB66B673f284bEa7c28351244F6" + }, + "marketViewer": "0x74Dfb95Ae623123ecf82Ba841985fB460bB9d45D" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@04APR2025.json b/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@04APR2025.json new file mode 100644 index 0000000..bb5e1ec --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@04APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179478", + "timestamp": "1743575843" + }, + "market": "0x253BFCEf3e01d2976658DA1660Ce1Ddb3193b3C2", + "collateral": { + "address": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "symbol": "PT-sUSDE-29MAY2025", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xB85982048FdF3525152EaF2AD46aBc3217957db2", + "xt": "0xaE10FD3E8Efd65fA2FaA31c71381F608d9a38885", + "gt": "0x5cDb3526CC64AEEfD27c26195B8C98d2b83A5AD6" + }, + "config": { + "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "04APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-USDC-USUALUSDC+@04APR2025.json b/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-USDC-USUALUSDC+@04APR2025.json new file mode 100644 index 0000000..3dcf08e --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-USDC-USUALUSDC+@04APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179478", + "timestamp": "1743575843" + }, + "market": "0x4041864081667d1fe7FcAf54D6521b88b795395D", + "collateral": { + "address": "0xd63070114470f685b75B74D60EEc7c1113d33a3D", + "symbol": "USUALUSDC+", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xBeDDcEB759e417f2889C9Db654f84084C2DA2e28", + "xt": "0xD98a6310E4cF92301CAB16667C65800B20b78523", + "gt": "0xCE3E6a82A5c716E32b1c91d45267B1de8E6A431f" + }, + "config": { + "marketSymbol": "USDC/USUALUSDC+@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "04APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-USDC-WBTC@04APR2025.json b/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-USDC-WBTC@04APR2025.json new file mode 100644 index 0000000..e256b0c --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-USDC-WBTC@04APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179478", + "timestamp": "1743575843" + }, + "market": "0x685502b6CF5c401703F21ecc3f5998242F57d986", + "collateral": { + "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "symbol": "WBTC", + "priceFeed": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x8F35519720c69568A992a56a90168096ce325646", + "xt": "0xaa6bc38e89b84ABC47d76275411DaF6F0dabb532", + "gt": "0x5cf4A4665DDf672D6C2A476c1ecB29e7f726aA55" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "04APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-USDC-cbBTC@04APR2025.json b/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-USDC-cbBTC@04APR2025.json new file mode 100644 index 0000000..b75a255 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-USDC-cbBTC@04APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179478", + "timestamp": "1743575843" + }, + "market": "0x42969576B5307507026d95f7436E643A05Ba7543", + "collateral": { + "address": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", + "symbol": "cbBTC", + "priceFeed": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x0E20312cB62c986bC96CE4436A4233F17D6f3cb2", + "xt": "0x2A081c7B64d1c32C240CB79ADE4177ec349b2F28", + "gt": "0x4E7f6A06c334765BCe2fB1eEFB8e77032872B8c9" + }, + "config": { + "marketSymbol": "USDC/cbBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "04APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-USDC-eUSDe@04APR2025.json b/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-USDC-eUSDe@04APR2025.json new file mode 100644 index 0000000..aa71a9a --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-USDC-eUSDe@04APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179478", + "timestamp": "1743575843" + }, + "market": "0xF929DB55b42834D89408568F9C5b85C233e645dF", + "collateral": { + "address": "0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F", + "symbol": "eUSDe", + "priceFeed": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x3aA2F1e7BD6858F06E3D20593B9Ad56a3D90E6B6", + "xt": "0xa0B23FE56a2617633aaa7318cBEC2947dB505E00", + "gt": "0x58Aea5162E527A11e5124B02Bd61127515DA25d2" + }, + "config": { + "marketSymbol": "USDC/eUSDe@29MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "04APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-USDC-sUSDe@04APR2025.json b/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-USDC-sUSDe@04APR2025.json new file mode 100644 index 0000000..3b861bf --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-USDC-sUSDe@04APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179478", + "timestamp": "1743575843" + }, + "market": "0xb4F060a20Ea7f30E88936aAbD9A14eF50f8D47CA", + "collateral": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xAb7eB39D78024adFD4264ffc20b7aC98f4240258", + "xt": "0x0837406657aCb163B053c45363030E8Ca38C4234", + "gt": "0xF47bb4d0C86F6BEe249d7E59bCC0eAB6BC19f61d" + }, + "config": { + "marketSymbol": "USDC/sUSDe@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "04APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-USDC-wstETH@04APR2025.json b/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-USDC-wstETH@04APR2025.json new file mode 100644 index 0000000..8d49d3f --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-USDC-wstETH@04APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179478", + "timestamp": "1743575843" + }, + "market": "0x14d63227e3F623459e56981aF8B8562476cc71C7", + "collateral": { + "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x951FfA0FE0C5fFee06D3617C08a537A56a1C5015", + "xt": "0xD3cd972A8253801051068f1Df316EcFC9A786Daf", + "gt": "0xA07D0BcBD0608F0B2AD6502Db366b5002B3C6d7C" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "04APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-WETH-MCwETH@04APR2025.json b/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-WETH-MCwETH@04APR2025.json new file mode 100644 index 0000000..7ad68ae --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-WETH-MCwETH@04APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179478", + "timestamp": "1743575843" + }, + "market": "0xDd61d5fE9B33Fa2485ffd88EA117246cfBA1499F", + "collateral": { + "address": "0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8", + "symbol": "MCwETH", + "priceFeed": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xe98b4cfE2Df9F45dd0Bc11482dc39D6f060df52d", + "xt": "0x4C81B8ec3a7efB2Ab09ACE7b60967C83A5C76Da1", + "gt": "0xE57210d539095a26f563f5056684F9235bf09C30" + }, + "config": { + "marketSymbol": "WETH/MCwETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "04APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-WETH-gtWETH@04APR2025.json b/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-WETH-gtWETH@04APR2025.json new file mode 100644 index 0000000..caee4ef --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-WETH-gtWETH@04APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179478", + "timestamp": "1743575843" + }, + "market": "0x259ADb419EFF325E36BD40936ad125864F2Ae5B1", + "collateral": { + "address": "0x2371e134e3455e0593363cBF89d3b6cf53740618", + "symbol": "gtWETH", + "priceFeed": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xda3759365F01e43c429F147f92a005D938D976Cc", + "xt": "0xF4a2c0e28D55A7BB5E1570BE340f6430188151cE", + "gt": "0x08D97cd7688f9a33AfB0402EEBeDbFAE7184DdF1" + }, + "config": { + "marketSymbol": "WETH/gtWETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "04APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-WETH-pufETH@04APR2025.json b/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-WETH-pufETH@04APR2025.json new file mode 100644 index 0000000..744fbf2 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-WETH-pufETH@04APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179478", + "timestamp": "1743575843" + }, + "market": "0x21a93E5Dc9EBaA2FD4a489dFB1D809ca668c543C", + "collateral": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xdF57Ba3199E79ceCC9B063474821A1236E2248Cf", + "xt": "0x014D1B97D7b785db28d9397718dfdD4613EeD09e", + "gt": "0xea86E308062340ecd4D04e124663E8A27D2b3ca2" + }, + "config": { + "marketSymbol": "WETH/pufETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "04APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-WETH-weETH@04APR2025.json b/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-WETH-weETH@04APR2025.json new file mode 100644 index 0000000..22e2447 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-WETH-weETH@04APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179478", + "timestamp": "1743575843" + }, + "market": "0x0B5aAf5B8100eee81A82ba1dCd0Ad6aE6E8ea75a", + "collateral": { + "address": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "21600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x53667f2F0030f96e7F757F687b92187E4E219110", + "xt": "0x8395397D9A97B4A44FA114032733823Efa6302b4", + "gt": "0x7d3Df00884f6f4146a5A9acAa53972853064EAEd" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "04APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@04APR2025.json b/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@04APR2025.json new file mode 100644 index 0000000..96e2d5c --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250404-1200/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@04APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179478", + "timestamp": "1743575843" + }, + "market": "0x90E2ae2f6Be939FEf6CA2ef908d620EFA3085B43", + "collateral": { + "address": "0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D", + "symbol": "PT-pufETH-26JUN2025", + "priceFeed": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x9e38cF293Ae451C075BB12837311F1a39d82d767", + "xt": "0x4cDc86612Ef264B6c57D780a58e03E3d551489B7", + "gt": "0x2f7921867f98bfa3053411D87EC35A2C952CF65b" + }, + "config": { + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "04APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250404-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt b/deployments/eth-mainnet-v1.0.8-20250404-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt new file mode 100644 index 0000000..81ca312 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250404-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt @@ -0,0 +1,21 @@ +== Logs == + Network: eth-mainnet + Deployer balance: 158879257545733090 + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175070 + Block timestamp: 1743522719 + + ===== Oracle Aggregator Info ===== + Deployer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Admin: 0x8409a9C1A911CED491892c5694E43994c9d47E8f + Oracle Aggregator deployed at: 0xE3a31690392E8E18DC3d862651C079339E2c1ADE + Oracle Timelock: 43200 + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250404-2000/deploy_markets_test_0402_log.txt b/deployments/eth-mainnet-v1.0.8-20250404-2000/deploy_markets_test_0402_log.txt new file mode 100644 index 0000000..236c256 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250404-2000/deploy_markets_test_0402_log.txt @@ -0,0 +1,370 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Enabled--verify +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175185 + Block timestamp: 1743524099 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22175185 + + ===== Market Info - 0 ===== + Market deployed at: 0x4a20DdEB8696b1f542649626889522068cc19438 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x00B210A7f79653A0fe7e2bc31d6Fe3026421195d + XT deployed at: 0x465c30b940E792262Ef65B7Fe7A5bAd3b5b7f034 + GT deployed at: 0xca3F986978ADEf5aA8e4F9e4F3d27f6f4Eb3f47d + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@02APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xC8c3A49b64dB371F96EdC15941e043966297Ea6b + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x19632ff799BA54B54934b52a89964F6cb12D396f + XT deployed at: 0xe459c64a852Df70Ea7D0cc46142A1a0d8BCd4f2A + GT deployed at: 0x9CEA72e4C7Fd1dd0bb2D0AAF98D756B1f85e096D + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@02APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x54ACdb3da45bBDEb1a53e1E3F6DB51C8384c7F9c + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x3ebabb95e4276DD2850666a95037f5EE3bb798Bb + XT deployed at: 0xb7d4329b11Dff286890F4d7e5b10763E09E8804C + GT deployed at: 0x28C108FD44B2E58DD9B07CBE453c0BCF836b8CB7 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@02APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xf2F9b0fDD5D22e574421A7Ee0E29e410E63C70A9 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x594Db033Ade81E0C8182B66d2B07fbc97452d1FA + XT deployed at: 0x544786112d542910634109BcCEF84C3Deb1b65e0 + GT deployed at: 0x81CAc518B14B28570C667A143F801bF2e05b6BEe + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@02APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x10aCD317ebf3F65e30c72720D89c55B7C68a9628 + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xA03710F73585cb5458F43739624611633Bf24173 + XT deployed at: 0x80525c75690102bb024BcEd8bE81D18A56172EC0 + GT deployed at: 0xe2e5403923B0421FA5a9D28c1012aeAFfc820f02 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@02APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x49913B7Bd178e21FaC84C3dED810Ff4CcDcb8403 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x8CDe48E20b5d77C3ec0fbCbf50d0C78B2DE11264 + XT deployed at: 0x8b596614c9ac30bd9DF615c3C18F0f05a97F0779 + GT deployed at: 0xBA03824B38E83B7CBAF3Fcb5aF02EF8342A110d8 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@02APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x69E1A695Ee24e7BcFc55d2dA7DfD479E4C7Eb6A3 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0xc7d5476d361C8d0E5c0478EA320431AD4a49A558 + XT deployed at: 0xe1710D5449241ce311Bfcefb5272594ECD930ec0 + GT deployed at: 0x4B87E9281de9573f2025565E632bdb8F136766E5 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@02APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0x9dA149D4Bc9eF4e6Eb1D131E837270f76dc62e79 + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD667a61e822564e1399f73196c73B2C41bCBda69 + XT deployed at: 0x2348B91F2037799d6AE604D792101534461DB06E + GT deployed at: 0x1aE5482Db2883e1ae8CDBFDbaE95539266F1bF32 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@02APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0x9cde69Ea28c9125060F86eB982305BafaE57f585 + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x4bDD2b0f934EECCE01A8Fc47E3762Ce86C9D061F + XT deployed at: 0x63B96518024b49C8F16104fDFd9d94a79A3d185C + GT deployed at: 0xa78bE568bc5ec42C8E41734dADcb86D3dde73af3 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@02APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x565656a354F6C2953EB2D00DC7e2e0Ab815e19E7 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x1184866Ed937F4605efc100c1f18E028F7CBDD86 + XT deployed at: 0x3F56b53953adf3a65f5Bb8E8Dce1C4926e1D629c + GT deployed at: 0x315f180e74247E01ca0377244Eb6b6D1c7444452 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@02APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x0ed76A80D639E7Bf88524b63429bB841c1633E60 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD4771df4a0f6338f521512A1651D8DB7EF5Af633 + XT deployed at: 0x4bbc10317e5b70B6B491836F5B2b496EE35f5E31 + GT deployed at: 0xFF601c3788236F231a8771cACBbB3087D0Ee7A2c + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@02APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x8c07c10a0a3530a9fB64c65f109A32F7B4b2DB80 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x0469A60F8fbc0c35c4D1D965a50A6Bd29c9dAB8C + XT deployed at: 0xE292927A017d58823957A83ea5EFeAF9C37D6F94 + GT deployed at: 0x7AdE4961Fccba087E8b4De84E8be61098Daf0230 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@02APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 5.079885262 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.087924645429718704 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x4a20ddeb8696b1f542649626889522068cc19438, 0x00b210a7f79653a0fe7e2bc31d6fe3026421195d, 0x465c30b940e792262ef65b7fe7a5bad3b5b7f034, 0xca3f986978adef5aa8e4f9e4f3d27f6f4eb3f47d, 0xc8c3a49b64db371f96edc15941e043966297ea6b, 0x19632ff799ba54b54934b52a89964f6cb12d396f, 0xe459c64a852df70ea7d0cc46142a1a0d8bcd4f2a, 0x9cea72e4c7fd1dd0bb2d0aaf98d756b1f85e096d, 0x54acdb3da45bbdeb1a53e1e3f6db51c8384c7f9c, 0x3ebabb95e4276dd2850666a95037f5ee3bb798bb, 0xb7d4329b11dff286890f4d7e5b10763e09e8804c, 0x28c108fd44b2e58dd9b07cbe453c0bcf836b8cb7, 0xf2f9b0fdd5d22e574421a7ee0e29e410e63c70a9, 0x594db033ade81e0c8182b66d2b07fbc97452d1fa, 0x544786112d542910634109bccef84c3deb1b65e0, 0x81cac518b14b28570c667a143f801bf2e05b6bee, 0x10acd317ebf3f65e30c72720d89c55b7c68a9628, 0xa03710f73585cb5458f43739624611633bf24173, 0x80525c75690102bb024bced8be81d18a56172ec0, 0xe2e5403923b0421fa5a9d28c1012aeaffc820f02, 0x49913b7bd178e21fac84c3ded810ff4ccdcb8403, 0x8cde48e20b5d77c3ec0fbcbf50d0c78b2de11264, 0x8b596614c9ac30bd9df615c3c18f0f05a97f0779, 0xba03824b38e83b7cbaf3fcb5af02ef8342a110d8, 0x69e1a695ee24e7bcfc55d2da7dfd479e4c7eb6a3, 0xc7d5476d361c8d0e5c0478ea320431ad4a49a558, 0xe1710d5449241ce311bfcefb5272594ecd930ec0, 0x4b87e9281de9573f2025565e632bdb8f136766e5, 0x9da149d4bc9ef4e6eb1d131e837270f76dc62e79, 0xd667a61e822564e1399f73196c73b2c41bcbda69, 0x2348b91f2037799d6ae604d792101534461db06e, 0x1ae5482db2883e1ae8cdbfdbae95539266f1bf32, 0x9cde69ea28c9125060f86eb982305bafae57f585, 0x4bdd2b0f934eecce01a8fc47e3762ce86c9d061f, 0x63b96518024b49c8f16104fdfd9d94a79a3d185c, 0xa78be568bc5ec42c8e41734dadcb86d3dde73af3, 0x565656a354f6c2953eb2d00dc7e2e0ab815e19e7, 0x1184866ed937f4605efc100c1f18e028f7cbdd86, 0x3f56b53953adf3a65f5bb8e8dce1c4926e1d629c, 0x315f180e74247e01ca0377244eb6b6d1c7444452, 0x0ed76a80d639e7bf88524b63429bb841c1633e60, 0xd4771df4a0f6338f521512a1651d8db7ef5af633, 0x4bbc10317e5b70b6b491836f5b2b496ee35f5e31, 0xff601c3788236f231a8771cacbbb3087d0ee7a2c, 0x8c07c10a0a3530a9fb64c65f109a32f7b4b2db80, 0x0469a60f8fbc0c35c4d1d965a50a6bd29c9dab8c, 0xe292927a017d58823957a83ea5efeaf9c37d6f94, 0x7ade4961fccba087e8b4de84e8be61098daf0230]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-access-manager.json b/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-access-manager.json new file mode 100644 index 0000000..a1a5b6a --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743155675", + "gitBranch": "deploy/v1.0.5", + "gitCommitHash": "0x0x65c418860c22aecb27054e7a8c3207a4f87ad6af", + "blockInfo": { + "number": "22144647", + "timestamp": "1743155675" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-core.json b/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-core.json new file mode 100644 index 0000000..34b5474 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743518639", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x30f0c30e4edf518e2bf6700837dad2a7624d35df", + "blockInfo": { + "number": "22174730", + "timestamp": "1743518639" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x37Ba9934aAbA7a49cC29d0952C6a91d7c7043dbc", + "vaultFactory": "0x01D8C1e0584751085a876892151Bf8490e862E3E", + "oracleAggregator": "0xE3a31690392E8E18DC3d862651C079339E2c1ADE", + "router": "0xC47591F5c023e44931c78D5A993834875b79FB11", + "swapAdapter": { + "uniswapV3Adapter": "0x34F7b52b0d33959C8351eF95F3523C89b6123C0b", + "odosV2Adapter": "0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779", + "pendleSwapV3Adapter": "0x0B30251FA697A39Fd41813b267b50F03414E82da", + "ERC4626VaultAdapter": "0x85ce30537c14EFB66B673f284bEa7c28351244F6" + }, + "marketViewer": "0x74Dfb95Ae623123ecf82Ba841985fB460bB9d45D" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@04APR2025.json b/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@04APR2025.json new file mode 100644 index 0000000..bf221d2 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@04APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179115", + "timestamp": "1743571451" + }, + "market": "0x0b0c808Caf5c7F9dAa57771564f20E024468c2a0", + "collateral": { + "address": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "symbol": "PT-sUSDE-29MAY2025", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xBc5B6A7f44a67D02c1b03D5Bb2E00b54184d27B2", + "xt": "0x0D980f2d7FAe22F7169c02aD32c24D0369590C65", + "gt": "0x6F5Ed34EeaBA4747bdD67e7270021C2e181918eC" + }, + "config": { + "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "04APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-USDC-USUALUSDC+@04APR2025.json b/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-USDC-USUALUSDC+@04APR2025.json new file mode 100644 index 0000000..caf00c9 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-USDC-USUALUSDC+@04APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179115", + "timestamp": "1743571451" + }, + "market": "0x536c719578451EAcb812C04EFfc94C20d9108565", + "collateral": { + "address": "0xd63070114470f685b75B74D60EEc7c1113d33a3D", + "symbol": "USUALUSDC+", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x4B80CDA0F058e300f7aF40C6d56B73b787E3dB06", + "xt": "0x039B6d19958540657E58327Fb1A5CFC7b36A5E21", + "gt": "0xa7e9C0daBB808aC2894BF4D48d257B6Ec11fa327" + }, + "config": { + "marketSymbol": "USDC/USUALUSDC+@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "04APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-USDC-WBTC@04APR2025.json b/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-USDC-WBTC@04APR2025.json new file mode 100644 index 0000000..1995928 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-USDC-WBTC@04APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179115", + "timestamp": "1743571451" + }, + "market": "0x29e5e71Bf70a9A6C5DaA9198Df028b50f9d3828B", + "collateral": { + "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "symbol": "WBTC", + "priceFeed": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x0D5EAeE862c70D9dF9D01Aac71A0E4f646269360", + "xt": "0xccC44E05a3466501E3974CA68e5bAe9eAd44C051", + "gt": "0x6A56EeD2cfB035b115E1a0d0c2951A2D7f41F1B4" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "04APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-USDC-cbBTC@04APR2025.json b/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-USDC-cbBTC@04APR2025.json new file mode 100644 index 0000000..c712552 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-USDC-cbBTC@04APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179115", + "timestamp": "1743571451" + }, + "market": "0x94D280677e56356CEee0D6565Bf7318EE9CECdA4", + "collateral": { + "address": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", + "symbol": "cbBTC", + "priceFeed": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x6D367f9b7A7f7462aDae5c7ccF42dA57Ad0a000e", + "xt": "0x469Ead0133e37b99a368D7440Cc7D821c531967E", + "gt": "0x16b794842d3201fd97ce1F6Ec62A5ca90A67996F" + }, + "config": { + "marketSymbol": "USDC/cbBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "04APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-USDC-eUSDe@04APR2025.json b/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-USDC-eUSDe@04APR2025.json new file mode 100644 index 0000000..b2c2a56 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-USDC-eUSDe@04APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179115", + "timestamp": "1743571451" + }, + "market": "0x93194114eED6EB902887CD8EeB8E2E7bD3cEeF96", + "collateral": { + "address": "0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F", + "symbol": "eUSDe", + "priceFeed": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xBAa04A4AB8A2d8d45099B72C384FA505e7aECB67", + "xt": "0x151a451A9988CbAaeA2Ab607B4502DF6a7b3dFd5", + "gt": "0x1bAA684766523D00b7b2B6B2955349E1e5cb8989" + }, + "config": { + "marketSymbol": "USDC/eUSDe@29MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "04APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-USDC-sUSDe@04APR2025.json b/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-USDC-sUSDe@04APR2025.json new file mode 100644 index 0000000..c3c4599 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-USDC-sUSDe@04APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179115", + "timestamp": "1743571451" + }, + "market": "0x7A1E791D1615b82051821FB6DF3FF3D5D382B7C7", + "collateral": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xA11E1Fc792A23D4fCccD9aF58946C3Ee4db53F04", + "xt": "0x7Bbb4337fcDccEbfDD07055A35BA5F6C6211060D", + "gt": "0x2bdE30FE486D828eFa3f738d50b3B379c2C9f310" + }, + "config": { + "marketSymbol": "USDC/sUSDe@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "04APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-USDC-wstETH@04APR2025.json b/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-USDC-wstETH@04APR2025.json new file mode 100644 index 0000000..4c58569 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-USDC-wstETH@04APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179115", + "timestamp": "1743571451" + }, + "market": "0x90b821Cc6E34170d6759175A2328fE8EB767b9D0", + "collateral": { + "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x2507EBcD524A9A50aC8fe5e2Df96d0f645Ae8Ae1", + "xt": "0xB251936aDE3bEb201d949AB8E947816700559F02", + "gt": "0x7793eEA53016B74b2148d1Cc1217e65cDC4D6495" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "04APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-WETH-MCwETH@04APR2025.json b/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-WETH-MCwETH@04APR2025.json new file mode 100644 index 0000000..a0b49d8 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-WETH-MCwETH@04APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179115", + "timestamp": "1743571451" + }, + "market": "0x1eA1a9346Ea4c441Ab2181149E5FF94d2bdd87A2", + "collateral": { + "address": "0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8", + "symbol": "MCwETH", + "priceFeed": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x6AA27775A7534C35bdFb041f72448a90B913c0C1", + "xt": "0xB17887A075021462aa3bFd886030A77409F1eec0", + "gt": "0x487c9aCF35340C7fbe42B08aAd37E15f8787de5C" + }, + "config": { + "marketSymbol": "WETH/MCwETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "04APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-WETH-gtWETH@04APR2025.json b/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-WETH-gtWETH@04APR2025.json new file mode 100644 index 0000000..2d836f9 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-WETH-gtWETH@04APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179115", + "timestamp": "1743571451" + }, + "market": "0x52451856b950170ECAD570A17bdfa3bB15232423", + "collateral": { + "address": "0x2371e134e3455e0593363cBF89d3b6cf53740618", + "symbol": "gtWETH", + "priceFeed": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xEA1f3F709CD6f105467c33aB2cB163aDDE3E0eD2", + "xt": "0x73c309418CDbE792da81a2E5b27512D6638A1DCd", + "gt": "0x624825445983d140920048a1619C8013De0A3d64" + }, + "config": { + "marketSymbol": "WETH/gtWETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "04APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-WETH-pufETH@04APR2025.json b/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-WETH-pufETH@04APR2025.json new file mode 100644 index 0000000..2470f4d --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-WETH-pufETH@04APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179115", + "timestamp": "1743571451" + }, + "market": "0xfC19f3689B3a9FCF33c6A6B26efCB9AF911a875A", + "collateral": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x7D151b3EA3bB134069315D7A0D34BbA887Abd6ac", + "xt": "0x937F1f3209418a9702e016466f7D980D402b59a2", + "gt": "0x838aA82873330eBDf271c3CD0c5De60D9baa8A1a" + }, + "config": { + "marketSymbol": "WETH/pufETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "04APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-WETH-weETH@04APR2025.json b/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-WETH-weETH@04APR2025.json new file mode 100644 index 0000000..3fe68a9 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-WETH-weETH@04APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179115", + "timestamp": "1743571451" + }, + "market": "0xd496715743398Cedd3Da9Dda651568E952Db4B9c", + "collateral": { + "address": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "21600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xe029d0b76060192C2228CCB5d03999acd43E6E2E", + "xt": "0x84Dd6529B88D91Dd13Ae39379e5DA1d709e38E6D", + "gt": "0x394913608fA5B99e76DD0100688029BC40dd7372" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "04APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@04APR2025.json b/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@04APR2025.json new file mode 100644 index 0000000..3f11cc5 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250404-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@04APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179115", + "timestamp": "1743571451" + }, + "market": "0x61b90B8914136F8F74D252AB18b1c35f32a50955", + "collateral": { + "address": "0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D", + "symbol": "PT-pufETH-26JUN2025", + "priceFeed": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xB7821564B0b554678e9A654c12f91Ed711A28020", + "xt": "0x4c9CC7067A4dAbB7289A100848804194b63b0D79", + "gt": "0xC6B6EAd6c809D0193012545A6a520d3AEef3d7D7" + }, + "config": { + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "04APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250405-1200/deploy-eth-mainnet-oracle-aggregator-0401-log.txt b/deployments/eth-mainnet-v1.0.8-20250405-1200/deploy-eth-mainnet-oracle-aggregator-0401-log.txt new file mode 100644 index 0000000..81ca312 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250405-1200/deploy-eth-mainnet-oracle-aggregator-0401-log.txt @@ -0,0 +1,21 @@ +== Logs == + Network: eth-mainnet + Deployer balance: 158879257545733090 + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175070 + Block timestamp: 1743522719 + + ===== Oracle Aggregator Info ===== + Deployer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Admin: 0x8409a9C1A911CED491892c5694E43994c9d47E8f + Oracle Aggregator deployed at: 0xE3a31690392E8E18DC3d862651C079339E2c1ADE + Oracle Timelock: 43200 + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250405-1200/deploy_markets_test_0402_log.txt b/deployments/eth-mainnet-v1.0.8-20250405-1200/deploy_markets_test_0402_log.txt new file mode 100644 index 0000000..236c256 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250405-1200/deploy_markets_test_0402_log.txt @@ -0,0 +1,370 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Enabled--verify +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175185 + Block timestamp: 1743524099 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22175185 + + ===== Market Info - 0 ===== + Market deployed at: 0x4a20DdEB8696b1f542649626889522068cc19438 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x00B210A7f79653A0fe7e2bc31d6Fe3026421195d + XT deployed at: 0x465c30b940E792262Ef65B7Fe7A5bAd3b5b7f034 + GT deployed at: 0xca3F986978ADEf5aA8e4F9e4F3d27f6f4Eb3f47d + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@02APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xC8c3A49b64dB371F96EdC15941e043966297Ea6b + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x19632ff799BA54B54934b52a89964F6cb12D396f + XT deployed at: 0xe459c64a852Df70Ea7D0cc46142A1a0d8BCd4f2A + GT deployed at: 0x9CEA72e4C7Fd1dd0bb2D0AAF98D756B1f85e096D + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@02APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x54ACdb3da45bBDEb1a53e1E3F6DB51C8384c7F9c + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x3ebabb95e4276DD2850666a95037f5EE3bb798Bb + XT deployed at: 0xb7d4329b11Dff286890F4d7e5b10763E09E8804C + GT deployed at: 0x28C108FD44B2E58DD9B07CBE453c0BCF836b8CB7 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@02APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xf2F9b0fDD5D22e574421A7Ee0E29e410E63C70A9 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x594Db033Ade81E0C8182B66d2B07fbc97452d1FA + XT deployed at: 0x544786112d542910634109BcCEF84C3Deb1b65e0 + GT deployed at: 0x81CAc518B14B28570C667A143F801bF2e05b6BEe + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@02APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x10aCD317ebf3F65e30c72720D89c55B7C68a9628 + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xA03710F73585cb5458F43739624611633Bf24173 + XT deployed at: 0x80525c75690102bb024BcEd8bE81D18A56172EC0 + GT deployed at: 0xe2e5403923B0421FA5a9D28c1012aeAFfc820f02 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@02APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x49913B7Bd178e21FaC84C3dED810Ff4CcDcb8403 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x8CDe48E20b5d77C3ec0fbCbf50d0C78B2DE11264 + XT deployed at: 0x8b596614c9ac30bd9DF615c3C18F0f05a97F0779 + GT deployed at: 0xBA03824B38E83B7CBAF3Fcb5aF02EF8342A110d8 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@02APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x69E1A695Ee24e7BcFc55d2dA7DfD479E4C7Eb6A3 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0xc7d5476d361C8d0E5c0478EA320431AD4a49A558 + XT deployed at: 0xe1710D5449241ce311Bfcefb5272594ECD930ec0 + GT deployed at: 0x4B87E9281de9573f2025565E632bdb8F136766E5 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@02APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0x9dA149D4Bc9eF4e6Eb1D131E837270f76dc62e79 + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD667a61e822564e1399f73196c73B2C41bCBda69 + XT deployed at: 0x2348B91F2037799d6AE604D792101534461DB06E + GT deployed at: 0x1aE5482Db2883e1ae8CDBFDbaE95539266F1bF32 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@02APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0x9cde69Ea28c9125060F86eB982305BafaE57f585 + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x4bDD2b0f934EECCE01A8Fc47E3762Ce86C9D061F + XT deployed at: 0x63B96518024b49C8F16104fDFd9d94a79A3d185C + GT deployed at: 0xa78bE568bc5ec42C8E41734dADcb86D3dde73af3 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@02APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x565656a354F6C2953EB2D00DC7e2e0Ab815e19E7 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x1184866Ed937F4605efc100c1f18E028F7CBDD86 + XT deployed at: 0x3F56b53953adf3a65f5Bb8E8Dce1C4926e1D629c + GT deployed at: 0x315f180e74247E01ca0377244Eb6b6D1c7444452 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@02APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x0ed76A80D639E7Bf88524b63429bB841c1633E60 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD4771df4a0f6338f521512A1651D8DB7EF5Af633 + XT deployed at: 0x4bbc10317e5b70B6B491836F5B2b496EE35f5E31 + GT deployed at: 0xFF601c3788236F231a8771cACBbB3087D0Ee7A2c + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@02APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x8c07c10a0a3530a9fB64c65f109A32F7B4b2DB80 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x0469A60F8fbc0c35c4D1D965a50A6Bd29c9dAB8C + XT deployed at: 0xE292927A017d58823957A83ea5EFeAF9C37D6F94 + GT deployed at: 0x7AdE4961Fccba087E8b4De84E8be61098Daf0230 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@02APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 5.079885262 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.087924645429718704 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x4a20ddeb8696b1f542649626889522068cc19438, 0x00b210a7f79653a0fe7e2bc31d6fe3026421195d, 0x465c30b940e792262ef65b7fe7a5bad3b5b7f034, 0xca3f986978adef5aa8e4f9e4f3d27f6f4eb3f47d, 0xc8c3a49b64db371f96edc15941e043966297ea6b, 0x19632ff799ba54b54934b52a89964f6cb12d396f, 0xe459c64a852df70ea7d0cc46142a1a0d8bcd4f2a, 0x9cea72e4c7fd1dd0bb2d0aaf98d756b1f85e096d, 0x54acdb3da45bbdeb1a53e1e3f6db51c8384c7f9c, 0x3ebabb95e4276dd2850666a95037f5ee3bb798bb, 0xb7d4329b11dff286890f4d7e5b10763e09e8804c, 0x28c108fd44b2e58dd9b07cbe453c0bcf836b8cb7, 0xf2f9b0fdd5d22e574421a7ee0e29e410e63c70a9, 0x594db033ade81e0c8182b66d2b07fbc97452d1fa, 0x544786112d542910634109bccef84c3deb1b65e0, 0x81cac518b14b28570c667a143f801bf2e05b6bee, 0x10acd317ebf3f65e30c72720d89c55b7c68a9628, 0xa03710f73585cb5458f43739624611633bf24173, 0x80525c75690102bb024bced8be81d18a56172ec0, 0xe2e5403923b0421fa5a9d28c1012aeaffc820f02, 0x49913b7bd178e21fac84c3ded810ff4ccdcb8403, 0x8cde48e20b5d77c3ec0fbcbf50d0c78b2de11264, 0x8b596614c9ac30bd9df615c3c18f0f05a97f0779, 0xba03824b38e83b7cbaf3fcb5af02ef8342a110d8, 0x69e1a695ee24e7bcfc55d2da7dfd479e4c7eb6a3, 0xc7d5476d361c8d0e5c0478ea320431ad4a49a558, 0xe1710d5449241ce311bfcefb5272594ecd930ec0, 0x4b87e9281de9573f2025565e632bdb8f136766e5, 0x9da149d4bc9ef4e6eb1d131e837270f76dc62e79, 0xd667a61e822564e1399f73196c73b2c41bcbda69, 0x2348b91f2037799d6ae604d792101534461db06e, 0x1ae5482db2883e1ae8cdbfdbae95539266f1bf32, 0x9cde69ea28c9125060f86eb982305bafae57f585, 0x4bdd2b0f934eecce01a8fc47e3762ce86c9d061f, 0x63b96518024b49c8f16104fdfd9d94a79a3d185c, 0xa78be568bc5ec42c8e41734dadcb86d3dde73af3, 0x565656a354f6c2953eb2d00dc7e2e0ab815e19e7, 0x1184866ed937f4605efc100c1f18e028f7cbdd86, 0x3f56b53953adf3a65f5bb8e8dce1c4926e1d629c, 0x315f180e74247e01ca0377244eb6b6d1c7444452, 0x0ed76a80d639e7bf88524b63429bb841c1633e60, 0xd4771df4a0f6338f521512a1651d8db7ef5af633, 0x4bbc10317e5b70b6b491836f5b2b496ee35f5e31, 0xff601c3788236f231a8771cacbbb3087d0ee7a2c, 0x8c07c10a0a3530a9fb64c65f109a32f7b4b2db80, 0x0469a60f8fbc0c35c4d1d965a50a6bd29c9dab8c, 0xe292927a017d58823957a83ea5efeaf9c37d6f94, 0x7ade4961fccba087e8b4de84e8be61098daf0230]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-access-manager.json b/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-access-manager.json new file mode 100644 index 0000000..a1a5b6a --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743155675", + "gitBranch": "deploy/v1.0.5", + "gitCommitHash": "0x0x65c418860c22aecb27054e7a8c3207a4f87ad6af", + "blockInfo": { + "number": "22144647", + "timestamp": "1743155675" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-core.json b/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-core.json new file mode 100644 index 0000000..34b5474 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743518639", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x30f0c30e4edf518e2bf6700837dad2a7624d35df", + "blockInfo": { + "number": "22174730", + "timestamp": "1743518639" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x37Ba9934aAbA7a49cC29d0952C6a91d7c7043dbc", + "vaultFactory": "0x01D8C1e0584751085a876892151Bf8490e862E3E", + "oracleAggregator": "0xE3a31690392E8E18DC3d862651C079339E2c1ADE", + "router": "0xC47591F5c023e44931c78D5A993834875b79FB11", + "swapAdapter": { + "uniswapV3Adapter": "0x34F7b52b0d33959C8351eF95F3523C89b6123C0b", + "odosV2Adapter": "0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779", + "pendleSwapV3Adapter": "0x0B30251FA697A39Fd41813b267b50F03414E82da", + "ERC4626VaultAdapter": "0x85ce30537c14EFB66B673f284bEa7c28351244F6" + }, + "marketViewer": "0x74Dfb95Ae623123ecf82Ba841985fB460bB9d45D" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@05APR2025.json b/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@05APR2025.json new file mode 100644 index 0000000..e1ddfbd --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179562", + "timestamp": "1743576851" + }, + "market": "0x97961b4708ae56d347F28515E0Ce6A13414ad92F", + "collateral": { + "address": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "symbol": "PT-sUSDE-29MAY2025", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xe3AD652Aad5DE36271dfbf197eE9cB9EBcA951B2", + "xt": "0x594B0d025f741685D3323E75454c9C47BD68C513", + "gt": "0x386a19C0219FAEf8D71606880088f53D5080e839" + }, + "config": { + "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-USDC-USUALUSDC+@05APR2025.json b/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-USDC-USUALUSDC+@05APR2025.json new file mode 100644 index 0000000..7803b60 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-USDC-USUALUSDC+@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179562", + "timestamp": "1743576851" + }, + "market": "0x4DcdaD482C1Aef4CedD6F35A4525D0Bb3cb9EEde", + "collateral": { + "address": "0xd63070114470f685b75B74D60EEc7c1113d33a3D", + "symbol": "USUALUSDC+", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xD1ead4c54c99561Ec44c09E88a7fE383fb9F037a", + "xt": "0x731af351aB37DadcaEab8a82D8F98F85f9979FB1", + "gt": "0x79753063a5d742c071ccdB15fbA22591Bb355413" + }, + "config": { + "marketSymbol": "USDC/USUALUSDC+@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-USDC-WBTC@05APR2025.json b/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-USDC-WBTC@05APR2025.json new file mode 100644 index 0000000..19205fd --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-USDC-WBTC@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179562", + "timestamp": "1743576851" + }, + "market": "0x627090fD591BEe51427E8e26EaFcC56ea6d2ad0d", + "collateral": { + "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "symbol": "WBTC", + "priceFeed": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x7EB2BEBdf6151Edc44C0DCFCC2dD951ae0ca408B", + "xt": "0xd4B030d4910D187aD10Fb9832b4Fb678265e2188", + "gt": "0x929aDA93f2b6535062B9Fae3D6C041C2061889f3" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-USDC-cbBTC@05APR2025.json b/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-USDC-cbBTC@05APR2025.json new file mode 100644 index 0000000..c7d8f86 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-USDC-cbBTC@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179562", + "timestamp": "1743576851" + }, + "market": "0x90Ae13BB7ab4F0829B2983B629C72745156cEA87", + "collateral": { + "address": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", + "symbol": "cbBTC", + "priceFeed": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xB13b8317677Ac3dfE765b392937DfF5112D25466", + "xt": "0xD4f3E72Fc4C3dC5753ea6a3612Ffd2253eADDD2a", + "gt": "0xFe818c3ecE29868e7b6A7065698380b15119999B" + }, + "config": { + "marketSymbol": "USDC/cbBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-USDC-eUSDe@05APR2025.json b/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-USDC-eUSDe@05APR2025.json new file mode 100644 index 0000000..7bbd6f7 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-USDC-eUSDe@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179562", + "timestamp": "1743576851" + }, + "market": "0x74aDEB4B0E09FE534beae819A5fA775e8023CcbB", + "collateral": { + "address": "0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F", + "symbol": "eUSDe", + "priceFeed": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xa991D221860187b54cF611f5C3078DdAD34BEA63", + "xt": "0x066BB2400AfAfCF41c270a96FC9cBD745db94830", + "gt": "0xa6e40B874fAc9D600401399D0d61ec66366efBFb" + }, + "config": { + "marketSymbol": "USDC/eUSDe@29MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-USDC-sUSDe@05APR2025.json b/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-USDC-sUSDe@05APR2025.json new file mode 100644 index 0000000..f5a7b5d --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-USDC-sUSDe@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179562", + "timestamp": "1743576851" + }, + "market": "0xe219D84B7f553C084243f40d687A212431c5b104", + "collateral": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x287b1D5A3C680c10f9c50285C3185F0163980A88", + "xt": "0x570986B3Df5fAA46b36D7fA4BB98e7F7214ed195", + "gt": "0xb2b42cB2f9dd63aE879ab0DE368006116E49dDa7" + }, + "config": { + "marketSymbol": "USDC/sUSDe@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-USDC-wstETH@05APR2025.json b/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-USDC-wstETH@05APR2025.json new file mode 100644 index 0000000..a2b25d3 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-USDC-wstETH@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179562", + "timestamp": "1743576851" + }, + "market": "0x468C435D674BD644225348a4736f779fa9B52e92", + "collateral": { + "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x116Fe32267DEdf543Aee17cC9c80005aD061Ece5", + "xt": "0x22519b349735e59f1dEa553051faD6E789412601", + "gt": "0x823f7EF7dAD74A8F2d0F4E004D0DEaAA132D8a75" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-WETH-MCwETH@05APR2025.json b/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-WETH-MCwETH@05APR2025.json new file mode 100644 index 0000000..fde1886 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-WETH-MCwETH@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179562", + "timestamp": "1743576851" + }, + "market": "0x51896173697A5F66E3D523bCFc07B1e3082ED658", + "collateral": { + "address": "0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8", + "symbol": "MCwETH", + "priceFeed": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x1a255A8164Fc8b9229633da9bc65B515f3F27Fd6", + "xt": "0x8dA6c9c459d914E3c0A989804D33bA560Fe910af", + "gt": "0xe39B866884b8709E641E9b88055524Ec15e30cC5" + }, + "config": { + "marketSymbol": "WETH/MCwETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-WETH-gtWETH@05APR2025.json b/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-WETH-gtWETH@05APR2025.json new file mode 100644 index 0000000..f880ebf --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-WETH-gtWETH@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179562", + "timestamp": "1743576851" + }, + "market": "0xd28C7f0cD5711d48F8010c79292073CD767E25f3", + "collateral": { + "address": "0x2371e134e3455e0593363cBF89d3b6cf53740618", + "symbol": "gtWETH", + "priceFeed": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xA1665e453c0A12252Cd9242EBfC6eC3151b015E8", + "xt": "0x29256893DF8BC36018a5Ef904DdaFd3a7fC7fD7F", + "gt": "0xb805E08d8fc36f0c31699DedE640188F4C825382" + }, + "config": { + "marketSymbol": "WETH/gtWETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-WETH-pufETH@05APR2025.json b/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-WETH-pufETH@05APR2025.json new file mode 100644 index 0000000..11e2da9 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-WETH-pufETH@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179562", + "timestamp": "1743576851" + }, + "market": "0xcbFec17391bd81DF22b2236A53C8afa83CaeD380", + "collateral": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x6e5D26089C9E80ab4Ad78a651d681b012D65be33", + "xt": "0x0dfa6Db5FfD88ADb461865E9C43243463771Ae3D", + "gt": "0x28D78CfdDF3c2bea4222157240d5bB6496ea5b0D" + }, + "config": { + "marketSymbol": "WETH/pufETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-WETH-weETH@05APR2025.json b/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-WETH-weETH@05APR2025.json new file mode 100644 index 0000000..6822dda --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-WETH-weETH@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179562", + "timestamp": "1743576851" + }, + "market": "0x99614E78dBf4143FC2ecc4f59345d7a46d703BbD", + "collateral": { + "address": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "21600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x0Ac281cAe9D759040d7Bb4a1a8161329d3c52044", + "xt": "0x6ad41d2E1A01ECd92105c32581bC60A7bD4eAB5c", + "gt": "0xa2056761B48a4FA6bd8376ee0f78e63FefaaEDb5" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@05APR2025.json b/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@05APR2025.json new file mode 100644 index 0000000..f53ee2d --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250405-1200/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179562", + "timestamp": "1743576851" + }, + "market": "0x2aB6C6f48C4e3365B995BE2fdbCc4c1ae7535E6F", + "collateral": { + "address": "0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D", + "symbol": "PT-pufETH-26JUN2025", + "priceFeed": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x84807374340AA1cCdAac08C3a28A959256e7f2B9", + "xt": "0x1ef27f2B71747E1B467145d4ecEF920e0FA8F9d3", + "gt": "0x1420388F4f0644d824e3038Bc086D4Ca8829867B" + }, + "config": { + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250405-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt b/deployments/eth-mainnet-v1.0.8-20250405-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt new file mode 100644 index 0000000..81ca312 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250405-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt @@ -0,0 +1,21 @@ +== Logs == + Network: eth-mainnet + Deployer balance: 158879257545733090 + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175070 + Block timestamp: 1743522719 + + ===== Oracle Aggregator Info ===== + Deployer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Admin: 0x8409a9C1A911CED491892c5694E43994c9d47E8f + Oracle Aggregator deployed at: 0xE3a31690392E8E18DC3d862651C079339E2c1ADE + Oracle Timelock: 43200 + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250405-2000/deploy_markets_test_0402_log.txt b/deployments/eth-mainnet-v1.0.8-20250405-2000/deploy_markets_test_0402_log.txt new file mode 100644 index 0000000..236c256 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250405-2000/deploy_markets_test_0402_log.txt @@ -0,0 +1,370 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Enabled--verify +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175185 + Block timestamp: 1743524099 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22175185 + + ===== Market Info - 0 ===== + Market deployed at: 0x4a20DdEB8696b1f542649626889522068cc19438 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x00B210A7f79653A0fe7e2bc31d6Fe3026421195d + XT deployed at: 0x465c30b940E792262Ef65B7Fe7A5bAd3b5b7f034 + GT deployed at: 0xca3F986978ADEf5aA8e4F9e4F3d27f6f4Eb3f47d + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@02APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xC8c3A49b64dB371F96EdC15941e043966297Ea6b + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x19632ff799BA54B54934b52a89964F6cb12D396f + XT deployed at: 0xe459c64a852Df70Ea7D0cc46142A1a0d8BCd4f2A + GT deployed at: 0x9CEA72e4C7Fd1dd0bb2D0AAF98D756B1f85e096D + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@02APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x54ACdb3da45bBDEb1a53e1E3F6DB51C8384c7F9c + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x3ebabb95e4276DD2850666a95037f5EE3bb798Bb + XT deployed at: 0xb7d4329b11Dff286890F4d7e5b10763E09E8804C + GT deployed at: 0x28C108FD44B2E58DD9B07CBE453c0BCF836b8CB7 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@02APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xf2F9b0fDD5D22e574421A7Ee0E29e410E63C70A9 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x594Db033Ade81E0C8182B66d2B07fbc97452d1FA + XT deployed at: 0x544786112d542910634109BcCEF84C3Deb1b65e0 + GT deployed at: 0x81CAc518B14B28570C667A143F801bF2e05b6BEe + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@02APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x10aCD317ebf3F65e30c72720D89c55B7C68a9628 + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xA03710F73585cb5458F43739624611633Bf24173 + XT deployed at: 0x80525c75690102bb024BcEd8bE81D18A56172EC0 + GT deployed at: 0xe2e5403923B0421FA5a9D28c1012aeAFfc820f02 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@02APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x49913B7Bd178e21FaC84C3dED810Ff4CcDcb8403 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x8CDe48E20b5d77C3ec0fbCbf50d0C78B2DE11264 + XT deployed at: 0x8b596614c9ac30bd9DF615c3C18F0f05a97F0779 + GT deployed at: 0xBA03824B38E83B7CBAF3Fcb5aF02EF8342A110d8 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@02APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x69E1A695Ee24e7BcFc55d2dA7DfD479E4C7Eb6A3 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0xc7d5476d361C8d0E5c0478EA320431AD4a49A558 + XT deployed at: 0xe1710D5449241ce311Bfcefb5272594ECD930ec0 + GT deployed at: 0x4B87E9281de9573f2025565E632bdb8F136766E5 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@02APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0x9dA149D4Bc9eF4e6Eb1D131E837270f76dc62e79 + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD667a61e822564e1399f73196c73B2C41bCBda69 + XT deployed at: 0x2348B91F2037799d6AE604D792101534461DB06E + GT deployed at: 0x1aE5482Db2883e1ae8CDBFDbaE95539266F1bF32 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@02APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0x9cde69Ea28c9125060F86eB982305BafaE57f585 + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x4bDD2b0f934EECCE01A8Fc47E3762Ce86C9D061F + XT deployed at: 0x63B96518024b49C8F16104fDFd9d94a79A3d185C + GT deployed at: 0xa78bE568bc5ec42C8E41734dADcb86D3dde73af3 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@02APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x565656a354F6C2953EB2D00DC7e2e0Ab815e19E7 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x1184866Ed937F4605efc100c1f18E028F7CBDD86 + XT deployed at: 0x3F56b53953adf3a65f5Bb8E8Dce1C4926e1D629c + GT deployed at: 0x315f180e74247E01ca0377244Eb6b6D1c7444452 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@02APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x0ed76A80D639E7Bf88524b63429bB841c1633E60 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD4771df4a0f6338f521512A1651D8DB7EF5Af633 + XT deployed at: 0x4bbc10317e5b70B6B491836F5B2b496EE35f5E31 + GT deployed at: 0xFF601c3788236F231a8771cACBbB3087D0Ee7A2c + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@02APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x8c07c10a0a3530a9fB64c65f109A32F7B4b2DB80 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x0469A60F8fbc0c35c4D1D965a50A6Bd29c9dAB8C + XT deployed at: 0xE292927A017d58823957A83ea5EFeAF9C37D6F94 + GT deployed at: 0x7AdE4961Fccba087E8b4De84E8be61098Daf0230 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@02APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 5.079885262 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.087924645429718704 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x4a20ddeb8696b1f542649626889522068cc19438, 0x00b210a7f79653a0fe7e2bc31d6fe3026421195d, 0x465c30b940e792262ef65b7fe7a5bad3b5b7f034, 0xca3f986978adef5aa8e4f9e4f3d27f6f4eb3f47d, 0xc8c3a49b64db371f96edc15941e043966297ea6b, 0x19632ff799ba54b54934b52a89964f6cb12d396f, 0xe459c64a852df70ea7d0cc46142a1a0d8bcd4f2a, 0x9cea72e4c7fd1dd0bb2d0aaf98d756b1f85e096d, 0x54acdb3da45bbdeb1a53e1e3f6db51c8384c7f9c, 0x3ebabb95e4276dd2850666a95037f5ee3bb798bb, 0xb7d4329b11dff286890f4d7e5b10763e09e8804c, 0x28c108fd44b2e58dd9b07cbe453c0bcf836b8cb7, 0xf2f9b0fdd5d22e574421a7ee0e29e410e63c70a9, 0x594db033ade81e0c8182b66d2b07fbc97452d1fa, 0x544786112d542910634109bccef84c3deb1b65e0, 0x81cac518b14b28570c667a143f801bf2e05b6bee, 0x10acd317ebf3f65e30c72720d89c55b7c68a9628, 0xa03710f73585cb5458f43739624611633bf24173, 0x80525c75690102bb024bced8be81d18a56172ec0, 0xe2e5403923b0421fa5a9d28c1012aeaffc820f02, 0x49913b7bd178e21fac84c3ded810ff4ccdcb8403, 0x8cde48e20b5d77c3ec0fbcbf50d0c78b2de11264, 0x8b596614c9ac30bd9df615c3c18f0f05a97f0779, 0xba03824b38e83b7cbaf3fcb5af02ef8342a110d8, 0x69e1a695ee24e7bcfc55d2da7dfd479e4c7eb6a3, 0xc7d5476d361c8d0e5c0478ea320431ad4a49a558, 0xe1710d5449241ce311bfcefb5272594ecd930ec0, 0x4b87e9281de9573f2025565e632bdb8f136766e5, 0x9da149d4bc9ef4e6eb1d131e837270f76dc62e79, 0xd667a61e822564e1399f73196c73b2c41bcbda69, 0x2348b91f2037799d6ae604d792101534461db06e, 0x1ae5482db2883e1ae8cdbfdbae95539266f1bf32, 0x9cde69ea28c9125060f86eb982305bafae57f585, 0x4bdd2b0f934eecce01a8fc47e3762ce86c9d061f, 0x63b96518024b49c8f16104fdfd9d94a79a3d185c, 0xa78be568bc5ec42c8e41734dadcb86d3dde73af3, 0x565656a354f6c2953eb2d00dc7e2e0ab815e19e7, 0x1184866ed937f4605efc100c1f18e028f7cbdd86, 0x3f56b53953adf3a65f5bb8e8dce1c4926e1d629c, 0x315f180e74247e01ca0377244eb6b6d1c7444452, 0x0ed76a80d639e7bf88524b63429bb841c1633e60, 0xd4771df4a0f6338f521512a1651d8db7ef5af633, 0x4bbc10317e5b70b6b491836f5b2b496ee35f5e31, 0xff601c3788236f231a8771cacbbb3087d0ee7a2c, 0x8c07c10a0a3530a9fb64c65f109a32f7b4b2db80, 0x0469a60f8fbc0c35c4d1d965a50a6bd29c9dab8c, 0xe292927a017d58823957a83ea5efeaf9c37d6f94, 0x7ade4961fccba087e8b4de84e8be61098daf0230]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-access-manager.json b/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-access-manager.json new file mode 100644 index 0000000..a1a5b6a --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743155675", + "gitBranch": "deploy/v1.0.5", + "gitCommitHash": "0x0x65c418860c22aecb27054e7a8c3207a4f87ad6af", + "blockInfo": { + "number": "22144647", + "timestamp": "1743155675" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-core.json b/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-core.json new file mode 100644 index 0000000..34b5474 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743518639", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x30f0c30e4edf518e2bf6700837dad2a7624d35df", + "blockInfo": { + "number": "22174730", + "timestamp": "1743518639" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x37Ba9934aAbA7a49cC29d0952C6a91d7c7043dbc", + "vaultFactory": "0x01D8C1e0584751085a876892151Bf8490e862E3E", + "oracleAggregator": "0xE3a31690392E8E18DC3d862651C079339E2c1ADE", + "router": "0xC47591F5c023e44931c78D5A993834875b79FB11", + "swapAdapter": { + "uniswapV3Adapter": "0x34F7b52b0d33959C8351eF95F3523C89b6123C0b", + "odosV2Adapter": "0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779", + "pendleSwapV3Adapter": "0x0B30251FA697A39Fd41813b267b50F03414E82da", + "ERC4626VaultAdapter": "0x85ce30537c14EFB66B673f284bEa7c28351244F6" + }, + "marketViewer": "0x74Dfb95Ae623123ecf82Ba841985fB460bB9d45D" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@05APR2025.json b/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@05APR2025.json new file mode 100644 index 0000000..92af1d6 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179262", + "timestamp": "1743573227" + }, + "market": "0x45336b991110D868fF0328308148A7B534255E40", + "collateral": { + "address": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "symbol": "PT-sUSDE-29MAY2025", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x616daCd3F697d06069AB0B56199A42179E313A2c", + "xt": "0x8547ce3BD292536Dbd729cBF78954fE5a587a1f0", + "gt": "0x1AFb46A7759f4615C16c4BC0A41FDE7177888b23" + }, + "config": { + "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-USDC-USUALUSDC+@05APR2025.json b/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-USDC-USUALUSDC+@05APR2025.json new file mode 100644 index 0000000..7b1fff1 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-USDC-USUALUSDC+@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179262", + "timestamp": "1743573227" + }, + "market": "0x6a7199771e010dc2CE936270eF62bdA687aC9224", + "collateral": { + "address": "0xd63070114470f685b75B74D60EEc7c1113d33a3D", + "symbol": "USUALUSDC+", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xD5587db2cf719D4E49B848547E1c7CA4d6f74B53", + "xt": "0x9F1D9Ce6eFD0523D078b5B746ddB42B3cfA5FCD9", + "gt": "0x934fDf49633F56605eb0df91E85BF209bdFa961b" + }, + "config": { + "marketSymbol": "USDC/USUALUSDC+@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-USDC-WBTC@05APR2025.json b/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-USDC-WBTC@05APR2025.json new file mode 100644 index 0000000..437ab68 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-USDC-WBTC@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179262", + "timestamp": "1743573227" + }, + "market": "0x9124bA58dDbced552a6D3900055418c989BA8c79", + "collateral": { + "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "symbol": "WBTC", + "priceFeed": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x69d668efDbD946fAC75706F2004E11F8Ea9a37Ba", + "xt": "0x5A9ED30453C6A8435AB717E4a7Bb4643f32e3953", + "gt": "0x928a07C589D8402e17Ecaca78c44842D6B3F7470" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-USDC-cbBTC@05APR2025.json b/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-USDC-cbBTC@05APR2025.json new file mode 100644 index 0000000..1bead8c --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-USDC-cbBTC@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179262", + "timestamp": "1743573227" + }, + "market": "0x5A47B3Ec275e3549276fd2AF31738a3292F9De5d", + "collateral": { + "address": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", + "symbol": "cbBTC", + "priceFeed": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x08B197841CB91E8036f9a4058ed398f6c40f9534", + "xt": "0x70FbfCBD40C4A9D0b9e1c5d61d2Ac047e8650F93", + "gt": "0x132202E4090E8baa1DB6e35786d2C1Cba5A97695" + }, + "config": { + "marketSymbol": "USDC/cbBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-USDC-eUSDe@05APR2025.json b/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-USDC-eUSDe@05APR2025.json new file mode 100644 index 0000000..3e6b215 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-USDC-eUSDe@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179262", + "timestamp": "1743573227" + }, + "market": "0xD03A414f513D0Cc6949D78A732fb3D93A65d483C", + "collateral": { + "address": "0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F", + "symbol": "eUSDe", + "priceFeed": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x21608c030116AbC383f9fD1A8A90457cF96BeD69", + "xt": "0x51f1e670c7b939604863Dc5Ca9a3707efDC59Dfb", + "gt": "0xbb3BdD1c09614B58f855D564b43843194c90C261" + }, + "config": { + "marketSymbol": "USDC/eUSDe@29MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-USDC-sUSDe@05APR2025.json b/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-USDC-sUSDe@05APR2025.json new file mode 100644 index 0000000..78bd67a --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-USDC-sUSDe@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179262", + "timestamp": "1743573227" + }, + "market": "0x24380FB429333C87bF7D9b8C9CC149B8Aa1A385B", + "collateral": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x4d24b65a15Ae8322D9f17B24509796FCD08B8cE6", + "xt": "0x73AaffEbEAf6eFFAC68902A556aE391c3aE7fb7B", + "gt": "0xF69984d5538d4464fEB89dd7Dd791C8F84626BF1" + }, + "config": { + "marketSymbol": "USDC/sUSDe@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-USDC-wstETH@05APR2025.json b/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-USDC-wstETH@05APR2025.json new file mode 100644 index 0000000..5b82e05 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-USDC-wstETH@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179262", + "timestamp": "1743573227" + }, + "market": "0xaFB77FEf3294Fba8ED1eC16082CAC45c487f31d9", + "collateral": { + "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x99A5C26EbF7505d4822a09c51916D599D5d0f033", + "xt": "0x0663AC74ED0f18A16381ef4f56D1D5Fe5E74Ce49", + "gt": "0xc59622939Fbb1aBAB11860Bb1be8b6A8c34f0db5" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-WETH-MCwETH@05APR2025.json b/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-WETH-MCwETH@05APR2025.json new file mode 100644 index 0000000..6ab3094 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-WETH-MCwETH@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179262", + "timestamp": "1743573227" + }, + "market": "0xF4a1eC676A5b95E9f8C17bdD50dD334cE8eb2097", + "collateral": { + "address": "0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8", + "symbol": "MCwETH", + "priceFeed": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x9F94B50E859EFcb1B3fdCDBf95C77E5B2FDC09f3", + "xt": "0x4a6373Aa2B326D1D12C48A64A9f9546CEc850C32", + "gt": "0x84c537cc5bEea6501CcBB6F948CFC2d3E9B8955F" + }, + "config": { + "marketSymbol": "WETH/MCwETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-WETH-gtWETH@05APR2025.json b/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-WETH-gtWETH@05APR2025.json new file mode 100644 index 0000000..2215bc2 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-WETH-gtWETH@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179262", + "timestamp": "1743573227" + }, + "market": "0x53F8DECb9a0BB090B12F74f2C34f8753E6467c65", + "collateral": { + "address": "0x2371e134e3455e0593363cBF89d3b6cf53740618", + "symbol": "gtWETH", + "priceFeed": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x334f8B35893B2ae066b611ec6480B3A2Cfe0AaFE", + "xt": "0xB8d702928c676E54a4528b2955413CFF385C4297", + "gt": "0xfd9032Af4D05639096Ef7Ad6F40A309B0cc3934F" + }, + "config": { + "marketSymbol": "WETH/gtWETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-WETH-pufETH@05APR2025.json b/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-WETH-pufETH@05APR2025.json new file mode 100644 index 0000000..cf89af6 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-WETH-pufETH@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179262", + "timestamp": "1743573227" + }, + "market": "0x946CF019b5854161f06F2c74CC73b244181589a4", + "collateral": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x52f8Cc09A7A93FD030c71110C55BFb96A4435D2D", + "xt": "0x15091c8439fb83D39dCEb796769A3d789E190c73", + "gt": "0x192f38103035665639FA6bd51A51e510b782fcB9" + }, + "config": { + "marketSymbol": "WETH/pufETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-WETH-weETH@05APR2025.json b/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-WETH-weETH@05APR2025.json new file mode 100644 index 0000000..6d0b116 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-WETH-weETH@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179262", + "timestamp": "1743573227" + }, + "market": "0x40F5F4D6C629384aC6661781D4D6a5702dd2A0BC", + "collateral": { + "address": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "21600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xCf0eC2F950fAd732eba8c0765837b15eBBa83a51", + "xt": "0x118172cDfd16E0744951831E2ECB5f1529B0086A", + "gt": "0xC159b14dd3296a5AB3559799cbdaf38FB001a6EC" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@05APR2025.json b/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@05APR2025.json new file mode 100644 index 0000000..cedb5bf --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250405-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@05APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179262", + "timestamp": "1743573227" + }, + "market": "0xeaC61f1A8B3e9F38A53F9DCa6D11b23E64D86d5e", + "collateral": { + "address": "0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D", + "symbol": "PT-pufETH-26JUN2025", + "priceFeed": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xEa3D7Aa3d71E0c74df0ADeCdC01adb4C8Eb8a675", + "xt": "0x09565d32a9CD0fd2FF783851da6c36199D4c00ca", + "gt": "0xFC7831b4DB74D0a08794F5705a3E7B0712401479" + }, + "config": { + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "05APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-1200/deploy-eth-mainnet-oracle-aggregator-0401-log.txt b/deployments/eth-mainnet-v1.0.8-20250406-1200/deploy-eth-mainnet-oracle-aggregator-0401-log.txt new file mode 100644 index 0000000..81ca312 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-1200/deploy-eth-mainnet-oracle-aggregator-0401-log.txt @@ -0,0 +1,21 @@ +== Logs == + Network: eth-mainnet + Deployer balance: 158879257545733090 + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175070 + Block timestamp: 1743522719 + + ===== Oracle Aggregator Info ===== + Deployer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Admin: 0x8409a9C1A911CED491892c5694E43994c9d47E8f + Oracle Aggregator deployed at: 0xE3a31690392E8E18DC3d862651C079339E2c1ADE + Oracle Timelock: 43200 + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-1200/deploy_markets_test_0402_log.txt b/deployments/eth-mainnet-v1.0.8-20250406-1200/deploy_markets_test_0402_log.txt new file mode 100644 index 0000000..236c256 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-1200/deploy_markets_test_0402_log.txt @@ -0,0 +1,370 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Enabled--verify +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175185 + Block timestamp: 1743524099 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22175185 + + ===== Market Info - 0 ===== + Market deployed at: 0x4a20DdEB8696b1f542649626889522068cc19438 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x00B210A7f79653A0fe7e2bc31d6Fe3026421195d + XT deployed at: 0x465c30b940E792262Ef65B7Fe7A5bAd3b5b7f034 + GT deployed at: 0xca3F986978ADEf5aA8e4F9e4F3d27f6f4Eb3f47d + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@02APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xC8c3A49b64dB371F96EdC15941e043966297Ea6b + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x19632ff799BA54B54934b52a89964F6cb12D396f + XT deployed at: 0xe459c64a852Df70Ea7D0cc46142A1a0d8BCd4f2A + GT deployed at: 0x9CEA72e4C7Fd1dd0bb2D0AAF98D756B1f85e096D + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@02APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x54ACdb3da45bBDEb1a53e1E3F6DB51C8384c7F9c + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x3ebabb95e4276DD2850666a95037f5EE3bb798Bb + XT deployed at: 0xb7d4329b11Dff286890F4d7e5b10763E09E8804C + GT deployed at: 0x28C108FD44B2E58DD9B07CBE453c0BCF836b8CB7 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@02APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xf2F9b0fDD5D22e574421A7Ee0E29e410E63C70A9 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x594Db033Ade81E0C8182B66d2B07fbc97452d1FA + XT deployed at: 0x544786112d542910634109BcCEF84C3Deb1b65e0 + GT deployed at: 0x81CAc518B14B28570C667A143F801bF2e05b6BEe + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@02APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x10aCD317ebf3F65e30c72720D89c55B7C68a9628 + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xA03710F73585cb5458F43739624611633Bf24173 + XT deployed at: 0x80525c75690102bb024BcEd8bE81D18A56172EC0 + GT deployed at: 0xe2e5403923B0421FA5a9D28c1012aeAFfc820f02 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@02APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x49913B7Bd178e21FaC84C3dED810Ff4CcDcb8403 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x8CDe48E20b5d77C3ec0fbCbf50d0C78B2DE11264 + XT deployed at: 0x8b596614c9ac30bd9DF615c3C18F0f05a97F0779 + GT deployed at: 0xBA03824B38E83B7CBAF3Fcb5aF02EF8342A110d8 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@02APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x69E1A695Ee24e7BcFc55d2dA7DfD479E4C7Eb6A3 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0xc7d5476d361C8d0E5c0478EA320431AD4a49A558 + XT deployed at: 0xe1710D5449241ce311Bfcefb5272594ECD930ec0 + GT deployed at: 0x4B87E9281de9573f2025565E632bdb8F136766E5 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@02APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0x9dA149D4Bc9eF4e6Eb1D131E837270f76dc62e79 + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD667a61e822564e1399f73196c73B2C41bCBda69 + XT deployed at: 0x2348B91F2037799d6AE604D792101534461DB06E + GT deployed at: 0x1aE5482Db2883e1ae8CDBFDbaE95539266F1bF32 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@02APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0x9cde69Ea28c9125060F86eB982305BafaE57f585 + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x4bDD2b0f934EECCE01A8Fc47E3762Ce86C9D061F + XT deployed at: 0x63B96518024b49C8F16104fDFd9d94a79A3d185C + GT deployed at: 0xa78bE568bc5ec42C8E41734dADcb86D3dde73af3 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@02APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x565656a354F6C2953EB2D00DC7e2e0Ab815e19E7 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x1184866Ed937F4605efc100c1f18E028F7CBDD86 + XT deployed at: 0x3F56b53953adf3a65f5Bb8E8Dce1C4926e1D629c + GT deployed at: 0x315f180e74247E01ca0377244Eb6b6D1c7444452 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@02APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x0ed76A80D639E7Bf88524b63429bB841c1633E60 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD4771df4a0f6338f521512A1651D8DB7EF5Af633 + XT deployed at: 0x4bbc10317e5b70B6B491836F5B2b496EE35f5E31 + GT deployed at: 0xFF601c3788236F231a8771cACBbB3087D0Ee7A2c + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@02APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x8c07c10a0a3530a9fB64c65f109A32F7B4b2DB80 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x0469A60F8fbc0c35c4D1D965a50A6Bd29c9dAB8C + XT deployed at: 0xE292927A017d58823957A83ea5EFeAF9C37D6F94 + GT deployed at: 0x7AdE4961Fccba087E8b4De84E8be61098Daf0230 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@02APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 5.079885262 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.087924645429718704 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x4a20ddeb8696b1f542649626889522068cc19438, 0x00b210a7f79653a0fe7e2bc31d6fe3026421195d, 0x465c30b940e792262ef65b7fe7a5bad3b5b7f034, 0xca3f986978adef5aa8e4f9e4f3d27f6f4eb3f47d, 0xc8c3a49b64db371f96edc15941e043966297ea6b, 0x19632ff799ba54b54934b52a89964f6cb12d396f, 0xe459c64a852df70ea7d0cc46142a1a0d8bcd4f2a, 0x9cea72e4c7fd1dd0bb2d0aaf98d756b1f85e096d, 0x54acdb3da45bbdeb1a53e1e3f6db51c8384c7f9c, 0x3ebabb95e4276dd2850666a95037f5ee3bb798bb, 0xb7d4329b11dff286890f4d7e5b10763e09e8804c, 0x28c108fd44b2e58dd9b07cbe453c0bcf836b8cb7, 0xf2f9b0fdd5d22e574421a7ee0e29e410e63c70a9, 0x594db033ade81e0c8182b66d2b07fbc97452d1fa, 0x544786112d542910634109bccef84c3deb1b65e0, 0x81cac518b14b28570c667a143f801bf2e05b6bee, 0x10acd317ebf3f65e30c72720d89c55b7c68a9628, 0xa03710f73585cb5458f43739624611633bf24173, 0x80525c75690102bb024bced8be81d18a56172ec0, 0xe2e5403923b0421fa5a9d28c1012aeaffc820f02, 0x49913b7bd178e21fac84c3ded810ff4ccdcb8403, 0x8cde48e20b5d77c3ec0fbcbf50d0c78b2de11264, 0x8b596614c9ac30bd9df615c3c18f0f05a97f0779, 0xba03824b38e83b7cbaf3fcb5af02ef8342a110d8, 0x69e1a695ee24e7bcfc55d2da7dfd479e4c7eb6a3, 0xc7d5476d361c8d0e5c0478ea320431ad4a49a558, 0xe1710d5449241ce311bfcefb5272594ecd930ec0, 0x4b87e9281de9573f2025565e632bdb8f136766e5, 0x9da149d4bc9ef4e6eb1d131e837270f76dc62e79, 0xd667a61e822564e1399f73196c73b2c41bcbda69, 0x2348b91f2037799d6ae604d792101534461db06e, 0x1ae5482db2883e1ae8cdbfdbae95539266f1bf32, 0x9cde69ea28c9125060f86eb982305bafae57f585, 0x4bdd2b0f934eecce01a8fc47e3762ce86c9d061f, 0x63b96518024b49c8f16104fdfd9d94a79a3d185c, 0xa78be568bc5ec42c8e41734dadcb86d3dde73af3, 0x565656a354f6c2953eb2d00dc7e2e0ab815e19e7, 0x1184866ed937f4605efc100c1f18e028f7cbdd86, 0x3f56b53953adf3a65f5bb8e8dce1c4926e1d629c, 0x315f180e74247e01ca0377244eb6b6d1c7444452, 0x0ed76a80d639e7bf88524b63429bb841c1633e60, 0xd4771df4a0f6338f521512a1651d8db7ef5af633, 0x4bbc10317e5b70b6b491836f5b2b496ee35f5e31, 0xff601c3788236f231a8771cacbbb3087d0ee7a2c, 0x8c07c10a0a3530a9fb64c65f109a32f7b4b2db80, 0x0469a60f8fbc0c35c4d1d965a50a6bd29c9dab8c, 0xe292927a017d58823957a83ea5efeaf9c37d6f94, 0x7ade4961fccba087e8b4de84e8be61098daf0230]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-access-manager.json b/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-access-manager.json new file mode 100644 index 0000000..a1a5b6a --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743155675", + "gitBranch": "deploy/v1.0.5", + "gitCommitHash": "0x0x65c418860c22aecb27054e7a8c3207a4f87ad6af", + "blockInfo": { + "number": "22144647", + "timestamp": "1743155675" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-core.json b/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-core.json new file mode 100644 index 0000000..34b5474 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743518639", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x30f0c30e4edf518e2bf6700837dad2a7624d35df", + "blockInfo": { + "number": "22174730", + "timestamp": "1743518639" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x37Ba9934aAbA7a49cC29d0952C6a91d7c7043dbc", + "vaultFactory": "0x01D8C1e0584751085a876892151Bf8490e862E3E", + "oracleAggregator": "0xE3a31690392E8E18DC3d862651C079339E2c1ADE", + "router": "0xC47591F5c023e44931c78D5A993834875b79FB11", + "swapAdapter": { + "uniswapV3Adapter": "0x34F7b52b0d33959C8351eF95F3523C89b6123C0b", + "odosV2Adapter": "0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779", + "pendleSwapV3Adapter": "0x0B30251FA697A39Fd41813b267b50F03414E82da", + "ERC4626VaultAdapter": "0x85ce30537c14EFB66B673f284bEa7c28351244F6" + }, + "marketViewer": "0x74Dfb95Ae623123ecf82Ba841985fB460bB9d45D" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@06APR2025.json b/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@06APR2025.json new file mode 100644 index 0000000..adf16b2 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179603", + "timestamp": "1743577343" + }, + "market": "0xc02F3FaDBE868Dc003fe03D5392a4B9AB6B8e5a6", + "collateral": { + "address": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "symbol": "PT-sUSDE-29MAY2025", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x0F3f8B6DFfCC25247A46ee182926a1311D205F17", + "xt": "0xa37CCb7E51Cc8A59383C2f925b672d8A1665AA68", + "gt": "0xF54516fd277e790A07c764fa5fa66E08679c6383" + }, + "config": { + "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-USDC-USUALUSDC+@06APR2025.json b/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-USDC-USUALUSDC+@06APR2025.json new file mode 100644 index 0000000..ee1ba39 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-USDC-USUALUSDC+@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179603", + "timestamp": "1743577343" + }, + "market": "0x56a328391c4D9b3a1e91D8fB3Be54f79345bCF2f", + "collateral": { + "address": "0xd63070114470f685b75B74D60EEc7c1113d33a3D", + "symbol": "USUALUSDC+", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x1bAa2833E0f4B8DA4FA1BFD44B0432b02b21F334", + "xt": "0x59fD91Ecb8d5487d9E85B9c7b9e2b798A1c01a05", + "gt": "0x93ea4FF5751d0590486035b4a4781D0810da8199" + }, + "config": { + "marketSymbol": "USDC/USUALUSDC+@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-USDC-WBTC@06APR2025.json b/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-USDC-WBTC@06APR2025.json new file mode 100644 index 0000000..dcf31e6 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-USDC-WBTC@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179603", + "timestamp": "1743577343" + }, + "market": "0x200B77bc4206E6b8168068DA68081fE6e113f9ed", + "collateral": { + "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "symbol": "WBTC", + "priceFeed": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x0176a0BC988B68F07002Ce0759135B49940Ce1C2", + "xt": "0xEC6d26a652062Fa6562BC02f406148D4d783cD8c", + "gt": "0x1A485e720687b4272Db47588761D2b7896547d68" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-USDC-cbBTC@06APR2025.json b/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-USDC-cbBTC@06APR2025.json new file mode 100644 index 0000000..b089917 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-USDC-cbBTC@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179603", + "timestamp": "1743577343" + }, + "market": "0xd556cFf70aEde97b194CC9E08A07358C9C46EE42", + "collateral": { + "address": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", + "symbol": "cbBTC", + "priceFeed": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x4b9827aFE3b07Ad757C355697E011Ce50e5230a8", + "xt": "0x04EA5c9608679c0Eaa67e6e841f11F8211F8163D", + "gt": "0x3dad4B52977B780dB7728C436c52F2D9D6659C14" + }, + "config": { + "marketSymbol": "USDC/cbBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-USDC-eUSDe@06APR2025.json b/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-USDC-eUSDe@06APR2025.json new file mode 100644 index 0000000..7d709cd --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-USDC-eUSDe@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179603", + "timestamp": "1743577343" + }, + "market": "0x890693cda29914a4B9028699648E1BE5840CbE16", + "collateral": { + "address": "0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F", + "symbol": "eUSDe", + "priceFeed": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x8062cb45291447664044185Aa07E9C4548A70A0B", + "xt": "0x965eD8341d2f1194b45d72DD5A032DC61d3060Bc", + "gt": "0x131cAd954BcF1880Ab9dE4989AE00F1b53c8f271" + }, + "config": { + "marketSymbol": "USDC/eUSDe@29MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-USDC-sUSDe@06APR2025.json b/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-USDC-sUSDe@06APR2025.json new file mode 100644 index 0000000..a18c92f --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-USDC-sUSDe@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179603", + "timestamp": "1743577343" + }, + "market": "0x8a4E3E5c420c60dDA16Df0b3e2E9C7B546CeBddA", + "collateral": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x80C51F779256F97d6da2Dc4B78678dE8e7dd4385", + "xt": "0xa6586c1FB6051C0685680813fcc64C245b873D05", + "gt": "0x5cB011d5b989D590FfA6bc1cED16cBD898fe2e04" + }, + "config": { + "marketSymbol": "USDC/sUSDe@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-USDC-wstETH@06APR2025.json b/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-USDC-wstETH@06APR2025.json new file mode 100644 index 0000000..8a6c710 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-USDC-wstETH@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179603", + "timestamp": "1743577343" + }, + "market": "0xC322cEb1E03C02e26eb6Fed05a39AB438BCD54Ed", + "collateral": { + "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x38cd8bc89Be9AB4754C3811061d665C9F1105bF5", + "xt": "0x136f30611E404Ec25E177265bCe72FBE77294D32", + "gt": "0x654f051Cd77a4C80F4A48D62ec2B43Ece6F0C820" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-WETH-MCwETH@06APR2025.json b/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-WETH-MCwETH@06APR2025.json new file mode 100644 index 0000000..24126e9 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-WETH-MCwETH@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179603", + "timestamp": "1743577343" + }, + "market": "0x9C49987f8fBf5C4E6826577de6137eE66Ada2B43", + "collateral": { + "address": "0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8", + "symbol": "MCwETH", + "priceFeed": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x2f7f3676658328B4AD69209698339FD3685543BC", + "xt": "0x3d0c81b6d1602a0e5Bd878B1a7819b3d8a29776f", + "gt": "0x7a85aAf82BE8E1a17F6cb2fdd576EC45ffA95Bf1" + }, + "config": { + "marketSymbol": "WETH/MCwETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-WETH-gtWETH@06APR2025.json b/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-WETH-gtWETH@06APR2025.json new file mode 100644 index 0000000..e8d14bf --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-WETH-gtWETH@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179603", + "timestamp": "1743577343" + }, + "market": "0x9f73E7958aE095d557e368F4a7a42f34D2B91280", + "collateral": { + "address": "0x2371e134e3455e0593363cBF89d3b6cf53740618", + "symbol": "gtWETH", + "priceFeed": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x08486CaabcF788af93B0d1b40AA88a4971E78476", + "xt": "0x7f5CD1a06755e5F3e44973b54bc53137d3e9286a", + "gt": "0x10D4dCd0fb0e24030d517515Cdfa7A8Dd69F79F8" + }, + "config": { + "marketSymbol": "WETH/gtWETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-WETH-pufETH@06APR2025.json b/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-WETH-pufETH@06APR2025.json new file mode 100644 index 0000000..f0f584b --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-WETH-pufETH@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179603", + "timestamp": "1743577343" + }, + "market": "0x055b67B9781bDe40Dc93AD6B725a00ed5Af3A48e", + "collateral": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x145d244528867fB023Dd0dB3a968E0dBB6d62bCb", + "xt": "0x82CfDeDCA833ab393644e8BE0f2fb89038CE0685", + "gt": "0x05f9E94956903cd05d3FdB4c8546a894ACb521a3" + }, + "config": { + "marketSymbol": "WETH/pufETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-WETH-weETH@06APR2025.json b/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-WETH-weETH@06APR2025.json new file mode 100644 index 0000000..a639ec3 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-WETH-weETH@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179603", + "timestamp": "1743577343" + }, + "market": "0xAFa3E895d557A9Cb54f65a6cb8374b058dF62Bf9", + "collateral": { + "address": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "21600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x2329a0900F54b671E428b14C3b4dB3A8fDB982A7", + "xt": "0x118cc7c9f8eD405cd552F7d3220d9cb40BB9F039", + "gt": "0xEbd4a3403420B05552fEA2D48192B710d3Ff5681" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@06APR2025.json b/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@06APR2025.json new file mode 100644 index 0000000..e7b5c6e --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-1200/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22179603", + "timestamp": "1743577343" + }, + "market": "0xC7E805b6a751236F351aa5De8ffb25E6Cc057b86", + "collateral": { + "address": "0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D", + "symbol": "PT-pufETH-26JUN2025", + "priceFeed": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x2CB074927Bd56B565905Ba2EFD9aFe10B4d3cB94", + "xt": "0x5Fc7A2f8876da22CC5d27410db4C7C15Cea5ee8A", + "gt": "0xA43866c0308039Fd756b8B48d7FB177d18F368D4" + }, + "config": { + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-1400/deploy-eth-mainnet-oracle-aggregator-0401-log.txt b/deployments/eth-mainnet-v1.0.8-20250406-1400/deploy-eth-mainnet-oracle-aggregator-0401-log.txt new file mode 100644 index 0000000..81ca312 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-1400/deploy-eth-mainnet-oracle-aggregator-0401-log.txt @@ -0,0 +1,21 @@ +== Logs == + Network: eth-mainnet + Deployer balance: 158879257545733090 + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175070 + Block timestamp: 1743522719 + + ===== Oracle Aggregator Info ===== + Deployer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Admin: 0x8409a9C1A911CED491892c5694E43994c9d47E8f + Oracle Aggregator deployed at: 0xE3a31690392E8E18DC3d862651C079339E2c1ADE + Oracle Timelock: 43200 + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-1400/deploy-market-eth-mainnet-20250406-1400-log.txt b/deployments/eth-mainnet-v1.0.8-20250406-1400/deploy-market-eth-mainnet-20250406-1400-log.txt new file mode 100644 index 0000000..c461795 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-1400/deploy-market-eth-mainnet-20250406-1400-log.txt @@ -0,0 +1,368 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ETHERSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf7ea840ec163817b51384fcc1d53ee433b758a8b + + ===== Block Info ===== + Block number: 22201211 + Block timestamp: 1743837983 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22201211 + + ===== Market Info - 0 ===== + Market deployed at: 0xBe64F18e4CE7ba48d34205cA0aD824B74e429BEd + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x220d310CEe6Df79D10781D25975e1a4a96b0ECd8 + XT deployed at: 0x771Ee74d0B131f8c7d2D5523d654C96a42FdD0FA + GT deployed at: 0x5f087c6924fc8D597067aa33D6e333d8600E5838 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@06APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0x54F872F2730A4714a7616e2438F314133F173bf1 + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x624E45A6B12492e2fAff9e5288366105Cc34706a + XT deployed at: 0xe8E44aFD5438385562d1Da734538cB361E89bb2A + GT deployed at: 0x44Ee1be018741F00F69754a0935F48297428Eb02 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@06APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0xeda461781D5f2Bd2D5f2Ae148bbF3f92BF068FAE + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xa8EfD3e6dEd1985c0AaF41875C835281207fF5cD + XT deployed at: 0x709D50ef25d095186F502EE3a8a36E41C3EBae84 + GT deployed at: 0xE709DeF1D348917c606f7f7e5Ab08981a9838aE6 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@06APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0x75957c754203f4b7d52ae3fb9bF0c9D42Ad1445a + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x2aa991B5aB2ae746813bae3c844aA68F59C22caA + XT deployed at: 0x799180284252C6994Ccb0f9C32f348646A0B9cdB + GT deployed at: 0x992e23053BD686ABd52883b9951240b29a7362fe + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@06APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0xbe43e259566Aac75b5b0607891Ffab566f005F85 + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xdC0E2cdDe6cB175bA4c2f6D792095e33644A5476 + XT deployed at: 0x71Df22572675bC2C5A8D123c3B056a9b1a177083 + GT deployed at: 0x0ec5149eDc325CA4D1F4f71b64b762e45D3A09b1 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@06APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x4280cE247Ef28e0EaAD9168a870116ACaa931d48 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x24DC6FC9a808D7361b143036FFdA6aE1E865e92a + XT deployed at: 0xAF88df8617A901058903e8D43b9E357a2e389bE4 + GT deployed at: 0x338136A13F9a1C869dAFe5c7fc93E5bB0D8a81C5 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@06APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x221bD390EA25acA05971C17188D28d5e7Aa5B0D1 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0x69227514AC756D227a7C34f17c6C9dC6E91A2Ef2 + XT deployed at: 0x4B4E1612B9Fe9a7FC638f23C71732cBfE76A2e84 + GT deployed at: 0xF3B8220c1f4295D35D37A56Db1DE2FcA01C784D2 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@06APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0x3462977F3c043E6aE0a5f74869d6511b978F78D9 + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x6f8DF50e249927AAAF7Ef0295a373F36DC7b12fF + XT deployed at: 0x5197a03A645B641f649c3374F47D8BD8a19F054D + GT deployed at: 0xC5b8894894fAAC2831fFbFC14a8B95c46A76a571 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@06APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0xf894BF1F8f88Ce3B6d660698732a9740007857fE + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x33557Ffb5bBF124b478d7Bc323C1d1ba225A2DFF + XT deployed at: 0xa540e826e628529e66C10f0655137856C077916b + GT deployed at: 0x870069C749e7E5211476C66Ab3F6FddD849F426C + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@06APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0xc4E697f5d1d2BE6B89882300B8f64B20a3162FB9 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x8869c08A311ee8E5eEC1db79B988318d2594F88D + XT deployed at: 0x84EA0760C6fb0Ca8ec15281Bb09D5b378787FAF2 + GT deployed at: 0x437393b36ef4bC3f7F432Db71a8c53F5888410DD + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@06APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x77D41709B09e678e20af86cC7C334FF6bb5ff159 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x02Eb3AA03d563952487514b0A148617220646bCb + XT deployed at: 0x1D4F3F16Ec342274fDDCd90b9B327b410b5a1190 + GT deployed at: 0x33D4e438FFF6194e7Fb975C6605ef35a81533dD6 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@06APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x2bABFdD294702be83E5d669F9BfF15FA0Fa9eE0f + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0xa3ead879063316397Af8493cdCFB9Edd1A7B21d6 + XT deployed at: 0xfbe8848B9b2da7c6CBb74A8f167B43965dD32102 + GT deployed at: 0x1f884d82fFa3e9E9575d76b662BD33fcc2aea781 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@06APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 0.854286239 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.014786321104817688 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0xbe64f18e4ce7ba48d34205ca0ad824b74e429bed, 0x220d310cee6df79d10781d25975e1a4a96b0ecd8, 0x771ee74d0b131f8c7d2d5523d654c96a42fdd0fa, 0x5f087c6924fc8d597067aa33d6e333d8600e5838, 0x54f872f2730a4714a7616e2438f314133f173bf1, 0x624e45a6b12492e2faff9e5288366105cc34706a, 0xe8e44afd5438385562d1da734538cb361e89bb2a, 0x44ee1be018741f00f69754a0935f48297428eb02, 0xeda461781d5f2bd2d5f2ae148bbf3f92bf068fae, 0xa8efd3e6ded1985c0aaf41875c835281207ff5cd, 0x709d50ef25d095186f502ee3a8a36e41c3ebae84, 0xe709def1d348917c606f7f7e5ab08981a9838ae6, 0x75957c754203f4b7d52ae3fb9bf0c9d42ad1445a, 0x2aa991b5ab2ae746813bae3c844aa68f59c22caa, 0x799180284252c6994ccb0f9c32f348646a0b9cdb, 0x992e23053bd686abd52883b9951240b29a7362fe, 0xbe43e259566aac75b5b0607891ffab566f005f85, 0xdc0e2cdde6cb175ba4c2f6d792095e33644a5476, 0x71df22572675bc2c5a8d123c3b056a9b1a177083, 0x0ec5149edc325ca4d1f4f71b64b762e45d3a09b1, 0x4280ce247ef28e0eaad9168a870116acaa931d48, 0x24dc6fc9a808d7361b143036ffda6ae1e865e92a, 0xaf88df8617a901058903e8d43b9e357a2e389be4, 0x338136a13f9a1c869dafe5c7fc93e5bb0d8a81c5, 0x221bd390ea25aca05971c17188d28d5e7aa5b0d1, 0x69227514ac756d227a7c34f17c6c9dc6e91a2ef2, 0x4b4e1612b9fe9a7fc638f23c71732cbfe76a2e84, 0xf3b8220c1f4295d35d37a56db1de2fca01c784d2, 0x3462977f3c043e6ae0a5f74869d6511b978f78d9, 0x6f8df50e249927aaaf7ef0295a373f36dc7b12ff, 0x5197a03a645b641f649c3374f47d8bd8a19f054d, 0xc5b8894894faac2831ffbfc14a8b95c46a76a571, 0xf894bf1f8f88ce3b6d660698732a9740007857fe, 0x33557ffb5bbf124b478d7bc323c1d1ba225a2dff, 0xa540e826e628529e66c10f0655137856c077916b, 0x870069c749e7e5211476c66ab3f6fddd849f426c, 0xc4e697f5d1d2be6b89882300b8f64b20a3162fb9, 0x8869c08a311ee8e5eec1db79b988318d2594f88d, 0x84ea0760c6fb0ca8ec15281bb09d5b378787faf2, 0x437393b36ef4bc3f7f432db71a8c53f5888410dd, 0x77d41709b09e678e20af86cc7c334ff6bb5ff159, 0x02eb3aa03d563952487514b0a148617220646bcb, 0x1d4f3f16ec342274fddcd90b9b327b410b5a1190, 0x33d4e438fff6194e7fb975c6605ef35a81533dd6, 0x2babfdd294702be83e5d669f9bff15fa0fa9ee0f, 0xa3ead879063316397af8493cdcfb9edd1a7b21d6, 0xfbe8848b9b2da7c6cbb74a8f167b43965dd32102, 0x1f884d82ffa3e9e9575d76b662bd33fcc2aea781]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-20250406-1400/deploy_markets_test_0402_log.txt b/deployments/eth-mainnet-v1.0.8-20250406-1400/deploy_markets_test_0402_log.txt new file mode 100644 index 0000000..236c256 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-1400/deploy_markets_test_0402_log.txt @@ -0,0 +1,370 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Enabled--verify +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175185 + Block timestamp: 1743524099 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22175185 + + ===== Market Info - 0 ===== + Market deployed at: 0x4a20DdEB8696b1f542649626889522068cc19438 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x00B210A7f79653A0fe7e2bc31d6Fe3026421195d + XT deployed at: 0x465c30b940E792262Ef65B7Fe7A5bAd3b5b7f034 + GT deployed at: 0xca3F986978ADEf5aA8e4F9e4F3d27f6f4Eb3f47d + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@02APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xC8c3A49b64dB371F96EdC15941e043966297Ea6b + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x19632ff799BA54B54934b52a89964F6cb12D396f + XT deployed at: 0xe459c64a852Df70Ea7D0cc46142A1a0d8BCd4f2A + GT deployed at: 0x9CEA72e4C7Fd1dd0bb2D0AAF98D756B1f85e096D + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@02APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x54ACdb3da45bBDEb1a53e1E3F6DB51C8384c7F9c + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x3ebabb95e4276DD2850666a95037f5EE3bb798Bb + XT deployed at: 0xb7d4329b11Dff286890F4d7e5b10763E09E8804C + GT deployed at: 0x28C108FD44B2E58DD9B07CBE453c0BCF836b8CB7 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@02APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xf2F9b0fDD5D22e574421A7Ee0E29e410E63C70A9 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x594Db033Ade81E0C8182B66d2B07fbc97452d1FA + XT deployed at: 0x544786112d542910634109BcCEF84C3Deb1b65e0 + GT deployed at: 0x81CAc518B14B28570C667A143F801bF2e05b6BEe + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@02APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x10aCD317ebf3F65e30c72720D89c55B7C68a9628 + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xA03710F73585cb5458F43739624611633Bf24173 + XT deployed at: 0x80525c75690102bb024BcEd8bE81D18A56172EC0 + GT deployed at: 0xe2e5403923B0421FA5a9D28c1012aeAFfc820f02 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@02APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x49913B7Bd178e21FaC84C3dED810Ff4CcDcb8403 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x8CDe48E20b5d77C3ec0fbCbf50d0C78B2DE11264 + XT deployed at: 0x8b596614c9ac30bd9DF615c3C18F0f05a97F0779 + GT deployed at: 0xBA03824B38E83B7CBAF3Fcb5aF02EF8342A110d8 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@02APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x69E1A695Ee24e7BcFc55d2dA7DfD479E4C7Eb6A3 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0xc7d5476d361C8d0E5c0478EA320431AD4a49A558 + XT deployed at: 0xe1710D5449241ce311Bfcefb5272594ECD930ec0 + GT deployed at: 0x4B87E9281de9573f2025565E632bdb8F136766E5 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@02APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0x9dA149D4Bc9eF4e6Eb1D131E837270f76dc62e79 + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD667a61e822564e1399f73196c73B2C41bCBda69 + XT deployed at: 0x2348B91F2037799d6AE604D792101534461DB06E + GT deployed at: 0x1aE5482Db2883e1ae8CDBFDbaE95539266F1bF32 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@02APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0x9cde69Ea28c9125060F86eB982305BafaE57f585 + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x4bDD2b0f934EECCE01A8Fc47E3762Ce86C9D061F + XT deployed at: 0x63B96518024b49C8F16104fDFd9d94a79A3d185C + GT deployed at: 0xa78bE568bc5ec42C8E41734dADcb86D3dde73af3 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@02APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x565656a354F6C2953EB2D00DC7e2e0Ab815e19E7 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x1184866Ed937F4605efc100c1f18E028F7CBDD86 + XT deployed at: 0x3F56b53953adf3a65f5Bb8E8Dce1C4926e1D629c + GT deployed at: 0x315f180e74247E01ca0377244Eb6b6D1c7444452 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@02APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x0ed76A80D639E7Bf88524b63429bB841c1633E60 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD4771df4a0f6338f521512A1651D8DB7EF5Af633 + XT deployed at: 0x4bbc10317e5b70B6B491836F5B2b496EE35f5E31 + GT deployed at: 0xFF601c3788236F231a8771cACBbB3087D0Ee7A2c + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@02APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x8c07c10a0a3530a9fB64c65f109A32F7B4b2DB80 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x0469A60F8fbc0c35c4D1D965a50A6Bd29c9dAB8C + XT deployed at: 0xE292927A017d58823957A83ea5EFeAF9C37D6F94 + GT deployed at: 0x7AdE4961Fccba087E8b4De84E8be61098Daf0230 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@02APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 5.079885262 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.087924645429718704 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x4a20ddeb8696b1f542649626889522068cc19438, 0x00b210a7f79653a0fe7e2bc31d6fe3026421195d, 0x465c30b940e792262ef65b7fe7a5bad3b5b7f034, 0xca3f986978adef5aa8e4f9e4f3d27f6f4eb3f47d, 0xc8c3a49b64db371f96edc15941e043966297ea6b, 0x19632ff799ba54b54934b52a89964f6cb12d396f, 0xe459c64a852df70ea7d0cc46142a1a0d8bcd4f2a, 0x9cea72e4c7fd1dd0bb2d0aaf98d756b1f85e096d, 0x54acdb3da45bbdeb1a53e1e3f6db51c8384c7f9c, 0x3ebabb95e4276dd2850666a95037f5ee3bb798bb, 0xb7d4329b11dff286890f4d7e5b10763e09e8804c, 0x28c108fd44b2e58dd9b07cbe453c0bcf836b8cb7, 0xf2f9b0fdd5d22e574421a7ee0e29e410e63c70a9, 0x594db033ade81e0c8182b66d2b07fbc97452d1fa, 0x544786112d542910634109bccef84c3deb1b65e0, 0x81cac518b14b28570c667a143f801bf2e05b6bee, 0x10acd317ebf3f65e30c72720d89c55b7c68a9628, 0xa03710f73585cb5458f43739624611633bf24173, 0x80525c75690102bb024bced8be81d18a56172ec0, 0xe2e5403923b0421fa5a9d28c1012aeaffc820f02, 0x49913b7bd178e21fac84c3ded810ff4ccdcb8403, 0x8cde48e20b5d77c3ec0fbcbf50d0c78b2de11264, 0x8b596614c9ac30bd9df615c3c18f0f05a97f0779, 0xba03824b38e83b7cbaf3fcb5af02ef8342a110d8, 0x69e1a695ee24e7bcfc55d2da7dfd479e4c7eb6a3, 0xc7d5476d361c8d0e5c0478ea320431ad4a49a558, 0xe1710d5449241ce311bfcefb5272594ecd930ec0, 0x4b87e9281de9573f2025565e632bdb8f136766e5, 0x9da149d4bc9ef4e6eb1d131e837270f76dc62e79, 0xd667a61e822564e1399f73196c73b2c41bcbda69, 0x2348b91f2037799d6ae604d792101534461db06e, 0x1ae5482db2883e1ae8cdbfdbae95539266f1bf32, 0x9cde69ea28c9125060f86eb982305bafae57f585, 0x4bdd2b0f934eecce01a8fc47e3762ce86c9d061f, 0x63b96518024b49c8f16104fdfd9d94a79a3d185c, 0xa78be568bc5ec42c8e41734dadcb86d3dde73af3, 0x565656a354f6c2953eb2d00dc7e2e0ab815e19e7, 0x1184866ed937f4605efc100c1f18e028f7cbdd86, 0x3f56b53953adf3a65f5bb8e8dce1c4926e1d629c, 0x315f180e74247e01ca0377244eb6b6d1c7444452, 0x0ed76a80d639e7bf88524b63429bb841c1633e60, 0xd4771df4a0f6338f521512a1651d8db7ef5af633, 0x4bbc10317e5b70b6b491836f5b2b496ee35f5e31, 0xff601c3788236f231a8771cacbbb3087d0ee7a2c, 0x8c07c10a0a3530a9fb64c65f109a32f7b4b2db80, 0x0469a60f8fbc0c35c4d1d965a50a6bd29c9dab8c, 0xe292927a017d58823957a83ea5efeaf9c37d6f94, 0x7ade4961fccba087e8b4de84e8be61098daf0230]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-access-manager.json b/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-access-manager.json new file mode 100644 index 0000000..a1a5b6a --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743155675", + "gitBranch": "deploy/v1.0.5", + "gitCommitHash": "0x0x65c418860c22aecb27054e7a8c3207a4f87ad6af", + "blockInfo": { + "number": "22144647", + "timestamp": "1743155675" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-core.json b/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-core.json new file mode 100644 index 0000000..34b5474 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743518639", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x30f0c30e4edf518e2bf6700837dad2a7624d35df", + "blockInfo": { + "number": "22174730", + "timestamp": "1743518639" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x37Ba9934aAbA7a49cC29d0952C6a91d7c7043dbc", + "vaultFactory": "0x01D8C1e0584751085a876892151Bf8490e862E3E", + "oracleAggregator": "0xE3a31690392E8E18DC3d862651C079339E2c1ADE", + "router": "0xC47591F5c023e44931c78D5A993834875b79FB11", + "swapAdapter": { + "uniswapV3Adapter": "0x34F7b52b0d33959C8351eF95F3523C89b6123C0b", + "odosV2Adapter": "0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779", + "pendleSwapV3Adapter": "0x0B30251FA697A39Fd41813b267b50F03414E82da", + "ERC4626VaultAdapter": "0x85ce30537c14EFB66B673f284bEa7c28351244F6" + }, + "marketViewer": "0x74Dfb95Ae623123ecf82Ba841985fB460bB9d45D" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@06APR2025.json b/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@06APR2025.json new file mode 100644 index 0000000..bc5ce32 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201211", + "timestamp": "1743837983" + }, + "market": "0x75957c754203f4b7d52ae3fb9bF0c9D42Ad1445a", + "collateral": { + "address": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "symbol": "PT-sUSDE-29MAY2025", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x2aa991B5aB2ae746813bae3c844aA68F59C22caA", + "xt": "0x799180284252C6994Ccb0f9C32f348646A0B9cdB", + "gt": "0x992e23053BD686ABd52883b9951240b29a7362fe" + }, + "config": { + "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-USDC-USUALUSDC+@06APR2025.json b/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-USDC-USUALUSDC+@06APR2025.json new file mode 100644 index 0000000..80de58d --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-USDC-USUALUSDC+@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201211", + "timestamp": "1743837983" + }, + "market": "0xbe43e259566Aac75b5b0607891Ffab566f005F85", + "collateral": { + "address": "0xd63070114470f685b75B74D60EEc7c1113d33a3D", + "symbol": "USUALUSDC+", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xdC0E2cdDe6cB175bA4c2f6D792095e33644A5476", + "xt": "0x71Df22572675bC2C5A8D123c3B056a9b1a177083", + "gt": "0x0ec5149eDc325CA4D1F4f71b64b762e45D3A09b1" + }, + "config": { + "marketSymbol": "USDC/USUALUSDC+@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-USDC-WBTC@06APR2025.json b/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-USDC-WBTC@06APR2025.json new file mode 100644 index 0000000..819dd12 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-USDC-WBTC@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201211", + "timestamp": "1743837983" + }, + "market": "0xc4E697f5d1d2BE6B89882300B8f64B20a3162FB9", + "collateral": { + "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "symbol": "WBTC", + "priceFeed": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x8869c08A311ee8E5eEC1db79B988318d2594F88D", + "xt": "0x84EA0760C6fb0Ca8ec15281Bb09D5b378787FAF2", + "gt": "0x437393b36ef4bC3f7F432Db71a8c53F5888410DD" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-USDC-cbBTC@06APR2025.json b/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-USDC-cbBTC@06APR2025.json new file mode 100644 index 0000000..60063d0 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-USDC-cbBTC@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201211", + "timestamp": "1743837983" + }, + "market": "0x77D41709B09e678e20af86cC7C334FF6bb5ff159", + "collateral": { + "address": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", + "symbol": "cbBTC", + "priceFeed": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x02Eb3AA03d563952487514b0A148617220646bCb", + "xt": "0x1D4F3F16Ec342274fDDCd90b9B327b410b5a1190", + "gt": "0x33D4e438FFF6194e7Fb975C6605ef35a81533dD6" + }, + "config": { + "marketSymbol": "USDC/cbBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-USDC-eUSDe@06APR2025.json b/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-USDC-eUSDe@06APR2025.json new file mode 100644 index 0000000..ecd650c --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-USDC-eUSDe@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201211", + "timestamp": "1743837983" + }, + "market": "0x3462977F3c043E6aE0a5f74869d6511b978F78D9", + "collateral": { + "address": "0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F", + "symbol": "eUSDe", + "priceFeed": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x6f8DF50e249927AAAF7Ef0295a373F36DC7b12fF", + "xt": "0x5197a03A645B641f649c3374F47D8BD8a19F054D", + "gt": "0xC5b8894894fAAC2831fFbFC14a8B95c46A76a571" + }, + "config": { + "marketSymbol": "USDC/eUSDe@29MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-USDC-sUSDe@06APR2025.json b/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-USDC-sUSDe@06APR2025.json new file mode 100644 index 0000000..38a77a8 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-USDC-sUSDe@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201211", + "timestamp": "1743837983" + }, + "market": "0xeda461781D5f2Bd2D5f2Ae148bbF3f92BF068FAE", + "collateral": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xa8EfD3e6dEd1985c0AaF41875C835281207fF5cD", + "xt": "0x709D50ef25d095186F502EE3a8a36E41C3EBae84", + "gt": "0xE709DeF1D348917c606f7f7e5Ab08981a9838aE6" + }, + "config": { + "marketSymbol": "USDC/sUSDe@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-USDC-wstETH@06APR2025.json b/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-USDC-wstETH@06APR2025.json new file mode 100644 index 0000000..cb537e9 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-USDC-wstETH@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201211", + "timestamp": "1743837983" + }, + "market": "0x54F872F2730A4714a7616e2438F314133F173bf1", + "collateral": { + "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x624E45A6B12492e2fAff9e5288366105Cc34706a", + "xt": "0xe8E44aFD5438385562d1Da734538cB361E89bb2A", + "gt": "0x44Ee1be018741F00F69754a0935F48297428Eb02" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-WETH-MCwETH@06APR2025.json b/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-WETH-MCwETH@06APR2025.json new file mode 100644 index 0000000..8a0c2d8 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-WETH-MCwETH@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201211", + "timestamp": "1743837983" + }, + "market": "0x4280cE247Ef28e0EaAD9168a870116ACaa931d48", + "collateral": { + "address": "0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8", + "symbol": "MCwETH", + "priceFeed": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x24DC6FC9a808D7361b143036FFdA6aE1E865e92a", + "xt": "0xAF88df8617A901058903e8D43b9E357a2e389bE4", + "gt": "0x338136A13F9a1C869dAFe5c7fc93E5bB0D8a81C5" + }, + "config": { + "marketSymbol": "WETH/MCwETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-WETH-gtWETH@06APR2025.json b/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-WETH-gtWETH@06APR2025.json new file mode 100644 index 0000000..b729f45 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-WETH-gtWETH@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201211", + "timestamp": "1743837983" + }, + "market": "0x2bABFdD294702be83E5d669F9BfF15FA0Fa9eE0f", + "collateral": { + "address": "0x2371e134e3455e0593363cBF89d3b6cf53740618", + "symbol": "gtWETH", + "priceFeed": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xa3ead879063316397Af8493cdCFB9Edd1A7B21d6", + "xt": "0xfbe8848B9b2da7c6CBb74A8f167B43965dD32102", + "gt": "0x1f884d82fFa3e9E9575d76b662BD33fcc2aea781" + }, + "config": { + "marketSymbol": "WETH/gtWETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-WETH-pufETH@06APR2025.json b/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-WETH-pufETH@06APR2025.json new file mode 100644 index 0000000..df70353 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-WETH-pufETH@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201211", + "timestamp": "1743837983" + }, + "market": "0xf894BF1F8f88Ce3B6d660698732a9740007857fE", + "collateral": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x33557Ffb5bBF124b478d7Bc323C1d1ba225A2DFF", + "xt": "0xa540e826e628529e66C10f0655137856C077916b", + "gt": "0x870069C749e7E5211476C66Ab3F6FddD849F426C" + }, + "config": { + "marketSymbol": "WETH/pufETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-WETH-weETH@06APR2025.json b/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-WETH-weETH@06APR2025.json new file mode 100644 index 0000000..03e42e9 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-WETH-weETH@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201211", + "timestamp": "1743837983" + }, + "market": "0xBe64F18e4CE7ba48d34205cA0aD824B74e429BEd", + "collateral": { + "address": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "21600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x220d310CEe6Df79D10781D25975e1a4a96b0ECd8", + "xt": "0x771Ee74d0B131f8c7d2D5523d654C96a42FdD0FA", + "gt": "0x5f087c6924fc8D597067aa33D6e333d8600E5838" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@06APR2025.json b/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@06APR2025.json new file mode 100644 index 0000000..431eb62 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-1400/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201211", + "timestamp": "1743837983" + }, + "market": "0x221bD390EA25acA05971C17188D28d5e7Aa5B0D1", + "collateral": { + "address": "0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D", + "symbol": "PT-pufETH-26JUN2025", + "priceFeed": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x69227514AC756D227a7C34f17c6C9dC6E91A2Ef2", + "xt": "0x4B4E1612B9Fe9a7FC638f23C71732cBfE76A2e84", + "gt": "0xF3B8220c1f4295D35D37A56Db1DE2FcA01C784D2" + }, + "config": { + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt b/deployments/eth-mainnet-v1.0.8-20250406-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt new file mode 100644 index 0000000..81ca312 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt @@ -0,0 +1,21 @@ +== Logs == + Network: eth-mainnet + Deployer balance: 158879257545733090 + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175070 + Block timestamp: 1743522719 + + ===== Oracle Aggregator Info ===== + Deployer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Admin: 0x8409a9C1A911CED491892c5694E43994c9d47E8f + Oracle Aggregator deployed at: 0xE3a31690392E8E18DC3d862651C079339E2c1ADE + Oracle Timelock: 43200 + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-2000/deploy-market-eth-mainnet-20250406-2000-log.txt b/deployments/eth-mainnet-v1.0.8-20250406-2000/deploy-market-eth-mainnet-20250406-2000-log.txt new file mode 100644 index 0000000..31e028d --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-2000/deploy-market-eth-mainnet-20250406-2000-log.txt @@ -0,0 +1,368 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ETHERSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf7ea840ec163817b51384fcc1d53ee433b758a8b + + ===== Block Info ===== + Block number: 22201261 + Block timestamp: 1743838583 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22201261 + + ===== Market Info - 0 ===== + Market deployed at: 0x5A1Aced30B62C145EBceDB2eddCf35F6eEB8185d + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x10d4e859Ee7d3aD799823d252cA9D86baB798AbA + XT deployed at: 0x9a3A4d5F92A60b8aB6367bEbF8CF9e5B6c2b9c03 + GT deployed at: 0xb39ADF1B242D3de3773d844467B78352B80f8354 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@06APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xc04309249Ac1e7bf7978651A1f25FeACD3496026 + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x0c66fe3746E5B6C755b27F6BDBd29123E4AAAdEB + XT deployed at: 0x4f11e4415CE585125823aD9F90c4850678A0ed02 + GT deployed at: 0x233F5D71F16ae09695Ff34134D31a096cA6F3DB2 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@06APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0xDa97f39c1F12cb3a6e485868a815B825769CDd02 + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x057E9A82771ac48012cf66EDDF6fB464A58ADca1 + XT deployed at: 0x9419e2891e4CBd28967d1352d0D324316bb75DC5 + GT deployed at: 0x67e7B35A25addbC644C43f7C07a2BA97B8edb9d6 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@06APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0x58db34bfD1Eecd0dA9aff41c32dc8F103798251f + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x23198229A4dF93A44CFFA411d1845cebf30a79D9 + XT deployed at: 0xcB4F9318DCFB654ee427D3d427463599f12a6a7b + GT deployed at: 0xBC849F578AD19736484EBb097DF70BD14a419bdA + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@06APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x8380F6b8465e951b2ACF07C34CFfd50c35f13E87 + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x39A5f95F68CAf6c043A86eCbFF5E971a67eAab2a + XT deployed at: 0xe01A0aE209ff8345a11580231431c85dce1883aF + GT deployed at: 0x2af8C838964d819f31b5DFa46487129F926CAa18 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@06APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x8A55169ec83ef9ab0b51088e9136FE1d35e61492 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0xa1246FC0F0b92376f51Ddb4e3cC44B7e2a46403b + XT deployed at: 0xc737e307f2831510dbDc7df65B74a626937a9400 + GT deployed at: 0xf8D28a5B7845E3837dCedab99738407786Fdb1E1 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@06APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0xB7Ce230408160aE14F0C45DBFbE3DE07fB58D3dC + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0x325433656e93EC3166D207EE0beA47B6488A0247 + XT deployed at: 0xe220E36eac1a5A15C25724a46351C2bBd872a255 + GT deployed at: 0x99F1762800BDD74E087E0d1Dae9A879978b295Ca + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@06APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0xb5858D966B38cce7B974091b29DfE58Cc247aebD + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x409dbB11ca5dB63CBBF4f594bf55145a73D2c814 + XT deployed at: 0xc623B9514444D1246A5fAaE3a5219F9fDa8b18a2 + GT deployed at: 0x0953BcfA19C37e4C4931908aE6638a59C2472674 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@06APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0x0d0e15870fA65415ebcFF4C49242DbA48d9dFF8C + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0xEFA62ff07190322537F2B42733607Ab704e0b408 + XT deployed at: 0x895e81Af4CA2b57F3A1e90ef07AB3d28F952a61D + GT deployed at: 0xf214cB3139F744a161D1Bb81Cf90fFaA2C1e7937 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@06APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x443d36dfe1007f8CfcAE10f02bd162A3ce68C90e + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x5Bb274e9054F20d25B826255593B0090a228282C + XT deployed at: 0x9fbA98b0BeEecDBe512CA47726444f2AEB0fB755 + GT deployed at: 0x39923E76D03eA0FB343dB26A9b460e6A44faC166 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@06APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x7Cd53e0f72A72145C7060391531E30e95C95Dd60 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x2e2bCA38268434DfdbC7765952E9FD3BA2451Db0 + XT deployed at: 0xB8359F35726331a1392077F11874C76C0188944b + GT deployed at: 0x445858c8fBd01dee6b95F39C68356Cd28FBb7319 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@06APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x94dF0973A11aF3C59215569B1a0A0eB9F596E628 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x3d7B34bd988D715d905fE47f08CBED7B4Ee85c4C + XT deployed at: 0x95aF580CC96D7E6C7D7003B9bD7D3366df148DB6 + GT deployed at: 0x8aB90BA5172C874882f40CC4Ff604B5f0678CdC4 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 06APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@06APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 0.912450681 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.015793054067414952 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x5a1aced30b62c145ebcedb2eddcf35f6eeb8185d, 0x10d4e859ee7d3ad799823d252ca9d86bab798aba, 0x9a3a4d5f92a60b8ab6367bebf8cf9e5b6c2b9c03, 0xb39adf1b242d3de3773d844467b78352b80f8354, 0xc04309249ac1e7bf7978651a1f25feacd3496026, 0x0c66fe3746e5b6c755b27f6bdbd29123e4aaadeb, 0x4f11e4415ce585125823ad9f90c4850678a0ed02, 0x233f5d71f16ae09695ff34134d31a096ca6f3db2, 0xda97f39c1f12cb3a6e485868a815b825769cdd02, 0x057e9a82771ac48012cf66eddf6fb464a58adca1, 0x9419e2891e4cbd28967d1352d0d324316bb75dc5, 0x67e7b35a25addbc644c43f7c07a2ba97b8edb9d6, 0x58db34bfd1eecd0da9aff41c32dc8f103798251f, 0x23198229a4df93a44cffa411d1845cebf30a79d9, 0xcb4f9318dcfb654ee427d3d427463599f12a6a7b, 0xbc849f578ad19736484ebb097df70bd14a419bda, 0x8380f6b8465e951b2acf07c34cffd50c35f13e87, 0x39a5f95f68caf6c043a86ecbff5e971a67eaab2a, 0xe01a0ae209ff8345a11580231431c85dce1883af, 0x2af8c838964d819f31b5dfa46487129f926caa18, 0x8a55169ec83ef9ab0b51088e9136fe1d35e61492, 0xa1246fc0f0b92376f51ddb4e3cc44b7e2a46403b, 0xc737e307f2831510dbdc7df65b74a626937a9400, 0xf8d28a5b7845e3837dcedab99738407786fdb1e1, 0xb7ce230408160ae14f0c45dbfbe3de07fb58d3dc, 0x325433656e93ec3166d207ee0bea47b6488a0247, 0xe220e36eac1a5a15c25724a46351c2bbd872a255, 0x99f1762800bdd74e087e0d1dae9a879978b295ca, 0xb5858d966b38cce7b974091b29dfe58cc247aebd, 0x409dbb11ca5db63cbbf4f594bf55145a73d2c814, 0xc623b9514444d1246a5faae3a5219f9fda8b18a2, 0x0953bcfa19c37e4c4931908ae6638a59c2472674, 0x0d0e15870fa65415ebcff4c49242dba48d9dff8c, 0xefa62ff07190322537f2b42733607ab704e0b408, 0x895e81af4ca2b57f3a1e90ef07ab3d28f952a61d, 0xf214cb3139f744a161d1bb81cf90ffaa2c1e7937, 0x443d36dfe1007f8cfcae10f02bd162a3ce68c90e, 0x5bb274e9054f20d25b826255593b0090a228282c, 0x9fba98b0beeecdbe512ca47726444f2aeb0fb755, 0x39923e76d03ea0fb343db26a9b460e6a44fac166, 0x7cd53e0f72a72145c7060391531e30e95c95dd60, 0x2e2bca38268434dfdbc7765952e9fd3ba2451db0, 0xb8359f35726331a1392077f11874c76c0188944b, 0x445858c8fbd01dee6b95f39c68356cd28fbb7319, 0x94df0973a11af3c59215569b1a0a0eb9f596e628, 0x3d7b34bd988d715d905fe47f08cbed7b4ee85c4c, 0x95af580cc96d7e6c7d7003b9bd7d3366df148db6, 0x8ab90ba5172c874882f40cc4ff604b5f0678cdc4]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-20250406-2000/deploy_markets_test_0402_log.txt b/deployments/eth-mainnet-v1.0.8-20250406-2000/deploy_markets_test_0402_log.txt new file mode 100644 index 0000000..236c256 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-2000/deploy_markets_test_0402_log.txt @@ -0,0 +1,370 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Enabled--verify +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175185 + Block timestamp: 1743524099 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22175185 + + ===== Market Info - 0 ===== + Market deployed at: 0x4a20DdEB8696b1f542649626889522068cc19438 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x00B210A7f79653A0fe7e2bc31d6Fe3026421195d + XT deployed at: 0x465c30b940E792262Ef65B7Fe7A5bAd3b5b7f034 + GT deployed at: 0xca3F986978ADEf5aA8e4F9e4F3d27f6f4Eb3f47d + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@02APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xC8c3A49b64dB371F96EdC15941e043966297Ea6b + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x19632ff799BA54B54934b52a89964F6cb12D396f + XT deployed at: 0xe459c64a852Df70Ea7D0cc46142A1a0d8BCd4f2A + GT deployed at: 0x9CEA72e4C7Fd1dd0bb2D0AAF98D756B1f85e096D + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@02APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x54ACdb3da45bBDEb1a53e1E3F6DB51C8384c7F9c + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x3ebabb95e4276DD2850666a95037f5EE3bb798Bb + XT deployed at: 0xb7d4329b11Dff286890F4d7e5b10763E09E8804C + GT deployed at: 0x28C108FD44B2E58DD9B07CBE453c0BCF836b8CB7 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@02APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xf2F9b0fDD5D22e574421A7Ee0E29e410E63C70A9 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x594Db033Ade81E0C8182B66d2B07fbc97452d1FA + XT deployed at: 0x544786112d542910634109BcCEF84C3Deb1b65e0 + GT deployed at: 0x81CAc518B14B28570C667A143F801bF2e05b6BEe + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@02APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x10aCD317ebf3F65e30c72720D89c55B7C68a9628 + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xA03710F73585cb5458F43739624611633Bf24173 + XT deployed at: 0x80525c75690102bb024BcEd8bE81D18A56172EC0 + GT deployed at: 0xe2e5403923B0421FA5a9D28c1012aeAFfc820f02 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@02APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x49913B7Bd178e21FaC84C3dED810Ff4CcDcb8403 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x8CDe48E20b5d77C3ec0fbCbf50d0C78B2DE11264 + XT deployed at: 0x8b596614c9ac30bd9DF615c3C18F0f05a97F0779 + GT deployed at: 0xBA03824B38E83B7CBAF3Fcb5aF02EF8342A110d8 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@02APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x69E1A695Ee24e7BcFc55d2dA7DfD479E4C7Eb6A3 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0xc7d5476d361C8d0E5c0478EA320431AD4a49A558 + XT deployed at: 0xe1710D5449241ce311Bfcefb5272594ECD930ec0 + GT deployed at: 0x4B87E9281de9573f2025565E632bdb8F136766E5 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@02APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0x9dA149D4Bc9eF4e6Eb1D131E837270f76dc62e79 + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD667a61e822564e1399f73196c73B2C41bCBda69 + XT deployed at: 0x2348B91F2037799d6AE604D792101534461DB06E + GT deployed at: 0x1aE5482Db2883e1ae8CDBFDbaE95539266F1bF32 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@02APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0x9cde69Ea28c9125060F86eB982305BafaE57f585 + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x4bDD2b0f934EECCE01A8Fc47E3762Ce86C9D061F + XT deployed at: 0x63B96518024b49C8F16104fDFd9d94a79A3d185C + GT deployed at: 0xa78bE568bc5ec42C8E41734dADcb86D3dde73af3 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@02APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x565656a354F6C2953EB2D00DC7e2e0Ab815e19E7 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x1184866Ed937F4605efc100c1f18E028F7CBDD86 + XT deployed at: 0x3F56b53953adf3a65f5Bb8E8Dce1C4926e1D629c + GT deployed at: 0x315f180e74247E01ca0377244Eb6b6D1c7444452 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@02APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x0ed76A80D639E7Bf88524b63429bB841c1633E60 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD4771df4a0f6338f521512A1651D8DB7EF5Af633 + XT deployed at: 0x4bbc10317e5b70B6B491836F5B2b496EE35f5E31 + GT deployed at: 0xFF601c3788236F231a8771cACBbB3087D0Ee7A2c + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@02APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x8c07c10a0a3530a9fB64c65f109A32F7B4b2DB80 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x0469A60F8fbc0c35c4D1D965a50A6Bd29c9dAB8C + XT deployed at: 0xE292927A017d58823957A83ea5EFeAF9C37D6F94 + GT deployed at: 0x7AdE4961Fccba087E8b4De84E8be61098Daf0230 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@02APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 5.079885262 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.087924645429718704 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x4a20ddeb8696b1f542649626889522068cc19438, 0x00b210a7f79653a0fe7e2bc31d6fe3026421195d, 0x465c30b940e792262ef65b7fe7a5bad3b5b7f034, 0xca3f986978adef5aa8e4f9e4f3d27f6f4eb3f47d, 0xc8c3a49b64db371f96edc15941e043966297ea6b, 0x19632ff799ba54b54934b52a89964f6cb12d396f, 0xe459c64a852df70ea7d0cc46142a1a0d8bcd4f2a, 0x9cea72e4c7fd1dd0bb2d0aaf98d756b1f85e096d, 0x54acdb3da45bbdeb1a53e1e3f6db51c8384c7f9c, 0x3ebabb95e4276dd2850666a95037f5ee3bb798bb, 0xb7d4329b11dff286890f4d7e5b10763e09e8804c, 0x28c108fd44b2e58dd9b07cbe453c0bcf836b8cb7, 0xf2f9b0fdd5d22e574421a7ee0e29e410e63c70a9, 0x594db033ade81e0c8182b66d2b07fbc97452d1fa, 0x544786112d542910634109bccef84c3deb1b65e0, 0x81cac518b14b28570c667a143f801bf2e05b6bee, 0x10acd317ebf3f65e30c72720d89c55b7c68a9628, 0xa03710f73585cb5458f43739624611633bf24173, 0x80525c75690102bb024bced8be81d18a56172ec0, 0xe2e5403923b0421fa5a9d28c1012aeaffc820f02, 0x49913b7bd178e21fac84c3ded810ff4ccdcb8403, 0x8cde48e20b5d77c3ec0fbcbf50d0c78b2de11264, 0x8b596614c9ac30bd9df615c3c18f0f05a97f0779, 0xba03824b38e83b7cbaf3fcb5af02ef8342a110d8, 0x69e1a695ee24e7bcfc55d2da7dfd479e4c7eb6a3, 0xc7d5476d361c8d0e5c0478ea320431ad4a49a558, 0xe1710d5449241ce311bfcefb5272594ecd930ec0, 0x4b87e9281de9573f2025565e632bdb8f136766e5, 0x9da149d4bc9ef4e6eb1d131e837270f76dc62e79, 0xd667a61e822564e1399f73196c73b2c41bcbda69, 0x2348b91f2037799d6ae604d792101534461db06e, 0x1ae5482db2883e1ae8cdbfdbae95539266f1bf32, 0x9cde69ea28c9125060f86eb982305bafae57f585, 0x4bdd2b0f934eecce01a8fc47e3762ce86c9d061f, 0x63b96518024b49c8f16104fdfd9d94a79a3d185c, 0xa78be568bc5ec42c8e41734dadcb86d3dde73af3, 0x565656a354f6c2953eb2d00dc7e2e0ab815e19e7, 0x1184866ed937f4605efc100c1f18e028f7cbdd86, 0x3f56b53953adf3a65f5bb8e8dce1c4926e1d629c, 0x315f180e74247e01ca0377244eb6b6d1c7444452, 0x0ed76a80d639e7bf88524b63429bb841c1633e60, 0xd4771df4a0f6338f521512a1651d8db7ef5af633, 0x4bbc10317e5b70b6b491836f5b2b496ee35f5e31, 0xff601c3788236f231a8771cacbbb3087d0ee7a2c, 0x8c07c10a0a3530a9fb64c65f109a32f7b4b2db80, 0x0469a60f8fbc0c35c4d1d965a50a6bd29c9dab8c, 0xe292927a017d58823957a83ea5efeaf9c37d6f94, 0x7ade4961fccba087e8b4de84e8be61098daf0230]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-access-manager.json b/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-access-manager.json new file mode 100644 index 0000000..a1a5b6a --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743155675", + "gitBranch": "deploy/v1.0.5", + "gitCommitHash": "0x0x65c418860c22aecb27054e7a8c3207a4f87ad6af", + "blockInfo": { + "number": "22144647", + "timestamp": "1743155675" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-core.json b/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-core.json new file mode 100644 index 0000000..34b5474 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743518639", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x30f0c30e4edf518e2bf6700837dad2a7624d35df", + "blockInfo": { + "number": "22174730", + "timestamp": "1743518639" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x37Ba9934aAbA7a49cC29d0952C6a91d7c7043dbc", + "vaultFactory": "0x01D8C1e0584751085a876892151Bf8490e862E3E", + "oracleAggregator": "0xE3a31690392E8E18DC3d862651C079339E2c1ADE", + "router": "0xC47591F5c023e44931c78D5A993834875b79FB11", + "swapAdapter": { + "uniswapV3Adapter": "0x34F7b52b0d33959C8351eF95F3523C89b6123C0b", + "odosV2Adapter": "0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779", + "pendleSwapV3Adapter": "0x0B30251FA697A39Fd41813b267b50F03414E82da", + "ERC4626VaultAdapter": "0x85ce30537c14EFB66B673f284bEa7c28351244F6" + }, + "marketViewer": "0x74Dfb95Ae623123ecf82Ba841985fB460bB9d45D" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@06APR2025.json b/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@06APR2025.json new file mode 100644 index 0000000..9a37f81 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201261", + "timestamp": "1743838583" + }, + "market": "0x58db34bfD1Eecd0dA9aff41c32dc8F103798251f", + "collateral": { + "address": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "symbol": "PT-sUSDE-29MAY2025", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x23198229A4dF93A44CFFA411d1845cebf30a79D9", + "xt": "0xcB4F9318DCFB654ee427D3d427463599f12a6a7b", + "gt": "0xBC849F578AD19736484EBb097DF70BD14a419bdA" + }, + "config": { + "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-USDC-USUALUSDC+@06APR2025.json b/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-USDC-USUALUSDC+@06APR2025.json new file mode 100644 index 0000000..0c86a7a --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-USDC-USUALUSDC+@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201261", + "timestamp": "1743838583" + }, + "market": "0x8380F6b8465e951b2ACF07C34CFfd50c35f13E87", + "collateral": { + "address": "0xd63070114470f685b75B74D60EEc7c1113d33a3D", + "symbol": "USUALUSDC+", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x39A5f95F68CAf6c043A86eCbFF5E971a67eAab2a", + "xt": "0xe01A0aE209ff8345a11580231431c85dce1883aF", + "gt": "0x2af8C838964d819f31b5DFa46487129F926CAa18" + }, + "config": { + "marketSymbol": "USDC/USUALUSDC+@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-USDC-WBTC@06APR2025.json b/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-USDC-WBTC@06APR2025.json new file mode 100644 index 0000000..a3d15f9 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-USDC-WBTC@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201261", + "timestamp": "1743838583" + }, + "market": "0x443d36dfe1007f8CfcAE10f02bd162A3ce68C90e", + "collateral": { + "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "symbol": "WBTC", + "priceFeed": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x5Bb274e9054F20d25B826255593B0090a228282C", + "xt": "0x9fbA98b0BeEecDBe512CA47726444f2AEB0fB755", + "gt": "0x39923E76D03eA0FB343dB26A9b460e6A44faC166" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-USDC-cbBTC@06APR2025.json b/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-USDC-cbBTC@06APR2025.json new file mode 100644 index 0000000..7eade32 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-USDC-cbBTC@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201261", + "timestamp": "1743838583" + }, + "market": "0x7Cd53e0f72A72145C7060391531E30e95C95Dd60", + "collateral": { + "address": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", + "symbol": "cbBTC", + "priceFeed": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x2e2bCA38268434DfdbC7765952E9FD3BA2451Db0", + "xt": "0xB8359F35726331a1392077F11874C76C0188944b", + "gt": "0x445858c8fBd01dee6b95F39C68356Cd28FBb7319" + }, + "config": { + "marketSymbol": "USDC/cbBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-USDC-eUSDe@06APR2025.json b/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-USDC-eUSDe@06APR2025.json new file mode 100644 index 0000000..73aa0c3 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-USDC-eUSDe@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201261", + "timestamp": "1743838583" + }, + "market": "0xb5858D966B38cce7B974091b29DfE58Cc247aebD", + "collateral": { + "address": "0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F", + "symbol": "eUSDe", + "priceFeed": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x409dbB11ca5dB63CBBF4f594bf55145a73D2c814", + "xt": "0xc623B9514444D1246A5fAaE3a5219F9fDa8b18a2", + "gt": "0x0953BcfA19C37e4C4931908aE6638a59C2472674" + }, + "config": { + "marketSymbol": "USDC/eUSDe@29MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-USDC-sUSDe@06APR2025.json b/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-USDC-sUSDe@06APR2025.json new file mode 100644 index 0000000..b2ed699 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-USDC-sUSDe@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201261", + "timestamp": "1743838583" + }, + "market": "0xDa97f39c1F12cb3a6e485868a815B825769CDd02", + "collateral": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x057E9A82771ac48012cf66EDDF6fB464A58ADca1", + "xt": "0x9419e2891e4CBd28967d1352d0D324316bb75DC5", + "gt": "0x67e7B35A25addbC644C43f7C07a2BA97B8edb9d6" + }, + "config": { + "marketSymbol": "USDC/sUSDe@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-USDC-wstETH@06APR2025.json b/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-USDC-wstETH@06APR2025.json new file mode 100644 index 0000000..6207bba --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-USDC-wstETH@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201261", + "timestamp": "1743838583" + }, + "market": "0xc04309249Ac1e7bf7978651A1f25FeACD3496026", + "collateral": { + "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x0c66fe3746E5B6C755b27F6BDBd29123E4AAAdEB", + "xt": "0x4f11e4415CE585125823aD9F90c4850678A0ed02", + "gt": "0x233F5D71F16ae09695Ff34134D31a096cA6F3DB2" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-WETH-MCwETH@06APR2025.json b/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-WETH-MCwETH@06APR2025.json new file mode 100644 index 0000000..d16c8e0 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-WETH-MCwETH@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201261", + "timestamp": "1743838583" + }, + "market": "0x8A55169ec83ef9ab0b51088e9136FE1d35e61492", + "collateral": { + "address": "0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8", + "symbol": "MCwETH", + "priceFeed": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xa1246FC0F0b92376f51Ddb4e3cC44B7e2a46403b", + "xt": "0xc737e307f2831510dbDc7df65B74a626937a9400", + "gt": "0xf8D28a5B7845E3837dCedab99738407786Fdb1E1" + }, + "config": { + "marketSymbol": "WETH/MCwETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-WETH-gtWETH@06APR2025.json b/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-WETH-gtWETH@06APR2025.json new file mode 100644 index 0000000..4730b6b --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-WETH-gtWETH@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201261", + "timestamp": "1743838583" + }, + "market": "0x94dF0973A11aF3C59215569B1a0A0eB9F596E628", + "collateral": { + "address": "0x2371e134e3455e0593363cBF89d3b6cf53740618", + "symbol": "gtWETH", + "priceFeed": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x3d7B34bd988D715d905fE47f08CBED7B4Ee85c4C", + "xt": "0x95aF580CC96D7E6C7D7003B9bD7D3366df148DB6", + "gt": "0x8aB90BA5172C874882f40CC4Ff604B5f0678CdC4" + }, + "config": { + "marketSymbol": "WETH/gtWETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-WETH-pufETH@06APR2025.json b/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-WETH-pufETH@06APR2025.json new file mode 100644 index 0000000..a64380e --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-WETH-pufETH@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201261", + "timestamp": "1743838583" + }, + "market": "0x0d0e15870fA65415ebcFF4C49242DbA48d9dFF8C", + "collateral": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xEFA62ff07190322537F2B42733607Ab704e0b408", + "xt": "0x895e81Af4CA2b57F3A1e90ef07AB3d28F952a61D", + "gt": "0xf214cB3139F744a161D1Bb81Cf90fFaA2C1e7937" + }, + "config": { + "marketSymbol": "WETH/pufETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-WETH-weETH@06APR2025.json b/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-WETH-weETH@06APR2025.json new file mode 100644 index 0000000..f1e2710 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-WETH-weETH@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201261", + "timestamp": "1743838583" + }, + "market": "0x5A1Aced30B62C145EBceDB2eddCf35F6eEB8185d", + "collateral": { + "address": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "21600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x10d4e859Ee7d3aD799823d252cA9D86baB798AbA", + "xt": "0x9a3A4d5F92A60b8aB6367bEbF8CF9e5B6c2b9c03", + "gt": "0xb39ADF1B242D3de3773d844467B78352B80f8354" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@06APR2025.json b/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@06APR2025.json new file mode 100644 index 0000000..50f87b9 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250406-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201261", + "timestamp": "1743838583" + }, + "market": "0xB7Ce230408160aE14F0C45DBFbE3DE07fB58D3dC", + "collateral": { + "address": "0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D", + "symbol": "PT-pufETH-26JUN2025", + "priceFeed": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x325433656e93EC3166D207EE0beA47B6488A0247", + "xt": "0xe220E36eac1a5A15C25724a46351C2bBd872a255", + "gt": "0x99F1762800BDD74E087E0d1Dae9A879978b295Ca" + }, + "config": { + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250407-1400/deploy-eth-mainnet-oracle-aggregator-0401-log.txt b/deployments/eth-mainnet-v1.0.8-20250407-1400/deploy-eth-mainnet-oracle-aggregator-0401-log.txt new file mode 100644 index 0000000..81ca312 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250407-1400/deploy-eth-mainnet-oracle-aggregator-0401-log.txt @@ -0,0 +1,21 @@ +== Logs == + Network: eth-mainnet + Deployer balance: 158879257545733090 + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175070 + Block timestamp: 1743522719 + + ===== Oracle Aggregator Info ===== + Deployer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Admin: 0x8409a9C1A911CED491892c5694E43994c9d47E8f + Oracle Aggregator deployed at: 0xE3a31690392E8E18DC3d862651C079339E2c1ADE + Oracle Timelock: 43200 + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250407-1400/deploy-market-eth-mainnet-20250407-1400-log.txt b/deployments/eth-mainnet-v1.0.8-20250407-1400/deploy-market-eth-mainnet-20250407-1400-log.txt new file mode 100644 index 0000000..fb51098 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250407-1400/deploy-market-eth-mainnet-20250407-1400-log.txt @@ -0,0 +1,368 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ETHERSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf7ea840ec163817b51384fcc1d53ee433b758a8b + + ===== Block Info ===== + Block number: 22201302 + Block timestamp: 1743839075 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22201302 + + ===== Market Info - 0 ===== + Market deployed at: 0x135D91F9d7B816F9Dc193976938222401e2A2212 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0xe7374A418D6a277Bb34D66c9D903314AE95277a8 + XT deployed at: 0x37AB7e0981Ded4d2547f763228b7f432301f6895 + GT deployed at: 0x82195140100D9A8eeF8A91dF0300967e6add66cf + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@07APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0x5e1D10bcA69e694Ea519A4D60F3c8B6efD870B04 + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xe97d26316e2318A4931eDd7326bc3A9d9CD99dE8 + XT deployed at: 0x487Cf19B6614633eD6b6e2B8878f9C966274aCCe + GT deployed at: 0x64147CcD08c68aD4711D33C0e17224dc7971a221 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@07APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x7EDF8495fcf656c768FF2603b584149d86b76C0A + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xeD17c6b8c804b6948C3f8af2E04D0bC8b11e86bA + XT deployed at: 0xbb79bd0C43847B8D239770B8bE3F8aDF2D51586E + GT deployed at: 0x67D88A426a6cBC2F273e437da26d4E385C6deA00 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@07APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xa6617dB49C2F506d2B4b7471A890e5eda57E815A + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xd83b1A016bDdE9f077F52e275974e6dD05Ba9090 + XT deployed at: 0xF6C208eD14be203f613EE03831cE91bEe413795D + GT deployed at: 0xBF4d2fDc1e3D9cf92dAB3E7D09C7219e45F3722E + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@07APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0xed2e191e57E3515E4cdd28941b0dd26d15FF179b + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x044A6B8552EaC934d4AD9Be0ceF51eEe0901Bc6F + XT deployed at: 0xDBdbc8368BDF35d6e0C6C8cB8bB6275f2a624F38 + GT deployed at: 0xbd382dAd136950033d86dD1D81EE5f01b8E669Eb + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@07APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x79EeD896A18d40d654579dF09190eAa63d2dd020 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0xDF340Ae12173Ae8fc8a5a656B3971907c88e31f1 + XT deployed at: 0x1f442785b2F0B9549E01308641A56C2E1022Dd77 + GT deployed at: 0xeE68c9Ca078407d73418CBFC078a00f9CE8987b6 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@07APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x48CC44e1f9443C6447784D48823acfc9BDEFA238 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0xAB140f40A8F7ba38b18F3f27b4ee37084F73644E + XT deployed at: 0xB74A2304E74fbC8B1a12755FD247e405df1Ea5E0 + GT deployed at: 0x9664EA95f17F395A8E52232edC1D786c492dE61a + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@07APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0xD9731b244ecCCC3944983C625290eabF274Ed616 + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x57079f1bb0979209EfA75de105936024D9246b0F + XT deployed at: 0x1B9aDE9E6DBB2e059B66Ffa4F65E4A746e3FAb2d + GT deployed at: 0x65CdD8BCE1790EcB3d836cc929362d3A8A125208 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@07APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0x2260f5Ece61f781f2F55a28731002BDe88B9a7E1 + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0xea45F4DcdA4B284D893BAA26983866BA8410A77e + XT deployed at: 0x81Bc5083d814E00Eb441c7AD6331e6f7cfa01dEe + GT deployed at: 0x68a164d64353d9392D0F3737BE4B3dbec6010581 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@07APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0xb68ccbBe2cA868c8444B1c92f3973333324537Cb + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x4359A5A6836133A8B9e35D3B57A943352EF1082E + XT deployed at: 0xfba0FFCa7a14b96016a26684a235fe8fc6Af8CdF + GT deployed at: 0x9567E25fE77c359e392BEe67B76C9F413E39fA98 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@07APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0xfaF070896dF9a0353EDA84dbD4050eA9da0402f6 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x18C96e60A4E6988177cf0451eC42c25f67278791 + XT deployed at: 0x16aA5B6309138de8BC9C81bfC7735858563AB4CF + GT deployed at: 0x0b3c09AB41dE6e2e2c66274aBDb0BBF9D02Aaa95 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@07APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x012D15614E965192a73107fa4ce92F1AE26c7b3a + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x5299aDF94916291a02b1beBC992dd7E157739461 + XT deployed at: 0xD1791D28ed5Fa42676A8475e4CC961Bff5650B64 + GT deployed at: 0x82749A4c2ed2df35e43b2DccE9Fb5983b8e31F0f + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@07APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 0.90072845 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.0155901610981524 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x135d91f9d7b816f9dc193976938222401e2a2212, 0xe7374a418d6a277bb34d66c9d903314ae95277a8, 0x37ab7e0981ded4d2547f763228b7f432301f6895, 0x82195140100d9a8eef8a91df0300967e6add66cf, 0x5e1d10bca69e694ea519a4d60f3c8b6efd870b04, 0xe97d26316e2318a4931edd7326bc3a9d9cd99de8, 0x487cf19b6614633ed6b6e2b8878f9c966274acce, 0x64147ccd08c68ad4711d33c0e17224dc7971a221, 0x7edf8495fcf656c768ff2603b584149d86b76c0a, 0xed17c6b8c804b6948c3f8af2e04d0bc8b11e86ba, 0xbb79bd0c43847b8d239770b8be3f8adf2d51586e, 0x67d88a426a6cbc2f273e437da26d4e385c6dea00, 0xa6617db49c2f506d2b4b7471a890e5eda57e815a, 0xd83b1a016bdde9f077f52e275974e6dd05ba9090, 0xf6c208ed14be203f613ee03831ce91bee413795d, 0xbf4d2fdc1e3d9cf92dab3e7d09c7219e45f3722e, 0xed2e191e57e3515e4cdd28941b0dd26d15ff179b, 0x044a6b8552eac934d4ad9be0cef51eee0901bc6f, 0xdbdbc8368bdf35d6e0c6c8cb8bb6275f2a624f38, 0xbd382dad136950033d86dd1d81ee5f01b8e669eb, 0x79eed896a18d40d654579df09190eaa63d2dd020, 0xdf340ae12173ae8fc8a5a656b3971907c88e31f1, 0x1f442785b2f0b9549e01308641a56c2e1022dd77, 0xee68c9ca078407d73418cbfc078a00f9ce8987b6, 0x48cc44e1f9443c6447784d48823acfc9bdefa238, 0xab140f40a8f7ba38b18f3f27b4ee37084f73644e, 0xb74a2304e74fbc8b1a12755fd247e405df1ea5e0, 0x9664ea95f17f395a8e52232edc1d786c492de61a, 0xd9731b244ecccc3944983c625290eabf274ed616, 0x57079f1bb0979209efa75de105936024d9246b0f, 0x1b9ade9e6dbb2e059b66ffa4f65e4a746e3fab2d, 0x65cdd8bce1790ecb3d836cc929362d3a8a125208, 0x2260f5ece61f781f2f55a28731002bde88b9a7e1, 0xea45f4dcda4b284d893baa26983866ba8410a77e, 0x81bc5083d814e00eb441c7ad6331e6f7cfa01dee, 0x68a164d64353d9392d0f3737be4b3dbec6010581, 0xb68ccbbe2ca868c8444b1c92f3973333324537cb, 0x4359a5a6836133a8b9e35d3b57a943352ef1082e, 0xfba0ffca7a14b96016a26684a235fe8fc6af8cdf, 0x9567e25fe77c359e392bee67b76c9f413e39fa98, 0xfaf070896df9a0353eda84dbd4050ea9da0402f6, 0x18c96e60a4e6988177cf0451ec42c25f67278791, 0x16aa5b6309138de8bc9c81bfc7735858563ab4cf, 0x0b3c09ab41de6e2e2c66274abdb0bbf9d02aaa95, 0x012d15614e965192a73107fa4ce92f1ae26c7b3a, 0x5299adf94916291a02b1bebc992dd7e157739461, 0xd1791d28ed5fa42676a8475e4cc961bff5650b64, 0x82749a4c2ed2df35e43b2dcce9fb5983b8e31f0f]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-20250407-1400/deploy_markets_test_0402_log.txt b/deployments/eth-mainnet-v1.0.8-20250407-1400/deploy_markets_test_0402_log.txt new file mode 100644 index 0000000..236c256 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250407-1400/deploy_markets_test_0402_log.txt @@ -0,0 +1,370 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Enabled--verify +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175185 + Block timestamp: 1743524099 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22175185 + + ===== Market Info - 0 ===== + Market deployed at: 0x4a20DdEB8696b1f542649626889522068cc19438 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x00B210A7f79653A0fe7e2bc31d6Fe3026421195d + XT deployed at: 0x465c30b940E792262Ef65B7Fe7A5bAd3b5b7f034 + GT deployed at: 0xca3F986978ADEf5aA8e4F9e4F3d27f6f4Eb3f47d + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@02APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xC8c3A49b64dB371F96EdC15941e043966297Ea6b + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x19632ff799BA54B54934b52a89964F6cb12D396f + XT deployed at: 0xe459c64a852Df70Ea7D0cc46142A1a0d8BCd4f2A + GT deployed at: 0x9CEA72e4C7Fd1dd0bb2D0AAF98D756B1f85e096D + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@02APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x54ACdb3da45bBDEb1a53e1E3F6DB51C8384c7F9c + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x3ebabb95e4276DD2850666a95037f5EE3bb798Bb + XT deployed at: 0xb7d4329b11Dff286890F4d7e5b10763E09E8804C + GT deployed at: 0x28C108FD44B2E58DD9B07CBE453c0BCF836b8CB7 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@02APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xf2F9b0fDD5D22e574421A7Ee0E29e410E63C70A9 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x594Db033Ade81E0C8182B66d2B07fbc97452d1FA + XT deployed at: 0x544786112d542910634109BcCEF84C3Deb1b65e0 + GT deployed at: 0x81CAc518B14B28570C667A143F801bF2e05b6BEe + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@02APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x10aCD317ebf3F65e30c72720D89c55B7C68a9628 + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xA03710F73585cb5458F43739624611633Bf24173 + XT deployed at: 0x80525c75690102bb024BcEd8bE81D18A56172EC0 + GT deployed at: 0xe2e5403923B0421FA5a9D28c1012aeAFfc820f02 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@02APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x49913B7Bd178e21FaC84C3dED810Ff4CcDcb8403 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x8CDe48E20b5d77C3ec0fbCbf50d0C78B2DE11264 + XT deployed at: 0x8b596614c9ac30bd9DF615c3C18F0f05a97F0779 + GT deployed at: 0xBA03824B38E83B7CBAF3Fcb5aF02EF8342A110d8 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@02APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x69E1A695Ee24e7BcFc55d2dA7DfD479E4C7Eb6A3 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0xc7d5476d361C8d0E5c0478EA320431AD4a49A558 + XT deployed at: 0xe1710D5449241ce311Bfcefb5272594ECD930ec0 + GT deployed at: 0x4B87E9281de9573f2025565E632bdb8F136766E5 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@02APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0x9dA149D4Bc9eF4e6Eb1D131E837270f76dc62e79 + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD667a61e822564e1399f73196c73B2C41bCBda69 + XT deployed at: 0x2348B91F2037799d6AE604D792101534461DB06E + GT deployed at: 0x1aE5482Db2883e1ae8CDBFDbaE95539266F1bF32 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@02APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0x9cde69Ea28c9125060F86eB982305BafaE57f585 + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x4bDD2b0f934EECCE01A8Fc47E3762Ce86C9D061F + XT deployed at: 0x63B96518024b49C8F16104fDFd9d94a79A3d185C + GT deployed at: 0xa78bE568bc5ec42C8E41734dADcb86D3dde73af3 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@02APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x565656a354F6C2953EB2D00DC7e2e0Ab815e19E7 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x1184866Ed937F4605efc100c1f18E028F7CBDD86 + XT deployed at: 0x3F56b53953adf3a65f5Bb8E8Dce1C4926e1D629c + GT deployed at: 0x315f180e74247E01ca0377244Eb6b6D1c7444452 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@02APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x0ed76A80D639E7Bf88524b63429bB841c1633E60 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD4771df4a0f6338f521512A1651D8DB7EF5Af633 + XT deployed at: 0x4bbc10317e5b70B6B491836F5B2b496EE35f5E31 + GT deployed at: 0xFF601c3788236F231a8771cACBbB3087D0Ee7A2c + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@02APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x8c07c10a0a3530a9fB64c65f109A32F7B4b2DB80 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x0469A60F8fbc0c35c4D1D965a50A6Bd29c9dAB8C + XT deployed at: 0xE292927A017d58823957A83ea5EFeAF9C37D6F94 + GT deployed at: 0x7AdE4961Fccba087E8b4De84E8be61098Daf0230 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@02APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 5.079885262 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.087924645429718704 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x4a20ddeb8696b1f542649626889522068cc19438, 0x00b210a7f79653a0fe7e2bc31d6fe3026421195d, 0x465c30b940e792262ef65b7fe7a5bad3b5b7f034, 0xca3f986978adef5aa8e4f9e4f3d27f6f4eb3f47d, 0xc8c3a49b64db371f96edc15941e043966297ea6b, 0x19632ff799ba54b54934b52a89964f6cb12d396f, 0xe459c64a852df70ea7d0cc46142a1a0d8bcd4f2a, 0x9cea72e4c7fd1dd0bb2d0aaf98d756b1f85e096d, 0x54acdb3da45bbdeb1a53e1e3f6db51c8384c7f9c, 0x3ebabb95e4276dd2850666a95037f5ee3bb798bb, 0xb7d4329b11dff286890f4d7e5b10763e09e8804c, 0x28c108fd44b2e58dd9b07cbe453c0bcf836b8cb7, 0xf2f9b0fdd5d22e574421a7ee0e29e410e63c70a9, 0x594db033ade81e0c8182b66d2b07fbc97452d1fa, 0x544786112d542910634109bccef84c3deb1b65e0, 0x81cac518b14b28570c667a143f801bf2e05b6bee, 0x10acd317ebf3f65e30c72720d89c55b7c68a9628, 0xa03710f73585cb5458f43739624611633bf24173, 0x80525c75690102bb024bced8be81d18a56172ec0, 0xe2e5403923b0421fa5a9d28c1012aeaffc820f02, 0x49913b7bd178e21fac84c3ded810ff4ccdcb8403, 0x8cde48e20b5d77c3ec0fbcbf50d0c78b2de11264, 0x8b596614c9ac30bd9df615c3c18f0f05a97f0779, 0xba03824b38e83b7cbaf3fcb5af02ef8342a110d8, 0x69e1a695ee24e7bcfc55d2da7dfd479e4c7eb6a3, 0xc7d5476d361c8d0e5c0478ea320431ad4a49a558, 0xe1710d5449241ce311bfcefb5272594ecd930ec0, 0x4b87e9281de9573f2025565e632bdb8f136766e5, 0x9da149d4bc9ef4e6eb1d131e837270f76dc62e79, 0xd667a61e822564e1399f73196c73b2c41bcbda69, 0x2348b91f2037799d6ae604d792101534461db06e, 0x1ae5482db2883e1ae8cdbfdbae95539266f1bf32, 0x9cde69ea28c9125060f86eb982305bafae57f585, 0x4bdd2b0f934eecce01a8fc47e3762ce86c9d061f, 0x63b96518024b49c8f16104fdfd9d94a79a3d185c, 0xa78be568bc5ec42c8e41734dadcb86d3dde73af3, 0x565656a354f6c2953eb2d00dc7e2e0ab815e19e7, 0x1184866ed937f4605efc100c1f18e028f7cbdd86, 0x3f56b53953adf3a65f5bb8e8dce1c4926e1d629c, 0x315f180e74247e01ca0377244eb6b6d1c7444452, 0x0ed76a80d639e7bf88524b63429bb841c1633e60, 0xd4771df4a0f6338f521512a1651d8db7ef5af633, 0x4bbc10317e5b70b6b491836f5b2b496ee35f5e31, 0xff601c3788236f231a8771cacbbb3087d0ee7a2c, 0x8c07c10a0a3530a9fb64c65f109a32f7b4b2db80, 0x0469a60f8fbc0c35c4d1d965a50a6bd29c9dab8c, 0xe292927a017d58823957a83ea5efeaf9c37d6f94, 0x7ade4961fccba087e8b4de84e8be61098daf0230]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-access-manager.json b/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-access-manager.json new file mode 100644 index 0000000..a1a5b6a --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743155675", + "gitBranch": "deploy/v1.0.5", + "gitCommitHash": "0x0x65c418860c22aecb27054e7a8c3207a4f87ad6af", + "blockInfo": { + "number": "22144647", + "timestamp": "1743155675" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-core.json b/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-core.json new file mode 100644 index 0000000..34b5474 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743518639", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x30f0c30e4edf518e2bf6700837dad2a7624d35df", + "blockInfo": { + "number": "22174730", + "timestamp": "1743518639" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x37Ba9934aAbA7a49cC29d0952C6a91d7c7043dbc", + "vaultFactory": "0x01D8C1e0584751085a876892151Bf8490e862E3E", + "oracleAggregator": "0xE3a31690392E8E18DC3d862651C079339E2c1ADE", + "router": "0xC47591F5c023e44931c78D5A993834875b79FB11", + "swapAdapter": { + "uniswapV3Adapter": "0x34F7b52b0d33959C8351eF95F3523C89b6123C0b", + "odosV2Adapter": "0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779", + "pendleSwapV3Adapter": "0x0B30251FA697A39Fd41813b267b50F03414E82da", + "ERC4626VaultAdapter": "0x85ce30537c14EFB66B673f284bEa7c28351244F6" + }, + "marketViewer": "0x74Dfb95Ae623123ecf82Ba841985fB460bB9d45D" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@07APR2025.json b/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@07APR2025.json new file mode 100644 index 0000000..f717bf8 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201302", + "timestamp": "1743839075" + }, + "market": "0xa6617dB49C2F506d2B4b7471A890e5eda57E815A", + "collateral": { + "address": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "symbol": "PT-sUSDE-29MAY2025", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xd83b1A016bDdE9f077F52e275974e6dD05Ba9090", + "xt": "0xF6C208eD14be203f613EE03831cE91bEe413795D", + "gt": "0xBF4d2fDc1e3D9cf92dAB3E7D09C7219e45F3722E" + }, + "config": { + "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-USDC-USUALUSDC+@07APR2025.json b/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-USDC-USUALUSDC+@07APR2025.json new file mode 100644 index 0000000..4d8d873 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-USDC-USUALUSDC+@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201302", + "timestamp": "1743839075" + }, + "market": "0xed2e191e57E3515E4cdd28941b0dd26d15FF179b", + "collateral": { + "address": "0xd63070114470f685b75B74D60EEc7c1113d33a3D", + "symbol": "USUALUSDC+", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x044A6B8552EaC934d4AD9Be0ceF51eEe0901Bc6F", + "xt": "0xDBdbc8368BDF35d6e0C6C8cB8bB6275f2a624F38", + "gt": "0xbd382dAd136950033d86dD1D81EE5f01b8E669Eb" + }, + "config": { + "marketSymbol": "USDC/USUALUSDC+@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-USDC-WBTC@07APR2025.json b/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-USDC-WBTC@07APR2025.json new file mode 100644 index 0000000..1824c02 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-USDC-WBTC@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201302", + "timestamp": "1743839075" + }, + "market": "0xb68ccbBe2cA868c8444B1c92f3973333324537Cb", + "collateral": { + "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "symbol": "WBTC", + "priceFeed": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x4359A5A6836133A8B9e35D3B57A943352EF1082E", + "xt": "0xfba0FFCa7a14b96016a26684a235fe8fc6Af8CdF", + "gt": "0x9567E25fE77c359e392BEe67B76C9F413E39fA98" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-USDC-cbBTC@07APR2025.json b/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-USDC-cbBTC@07APR2025.json new file mode 100644 index 0000000..1139033 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-USDC-cbBTC@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201302", + "timestamp": "1743839075" + }, + "market": "0xfaF070896dF9a0353EDA84dbD4050eA9da0402f6", + "collateral": { + "address": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", + "symbol": "cbBTC", + "priceFeed": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x18C96e60A4E6988177cf0451eC42c25f67278791", + "xt": "0x16aA5B6309138de8BC9C81bfC7735858563AB4CF", + "gt": "0x0b3c09AB41dE6e2e2c66274aBDb0BBF9D02Aaa95" + }, + "config": { + "marketSymbol": "USDC/cbBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-USDC-eUSDe@07APR2025.json b/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-USDC-eUSDe@07APR2025.json new file mode 100644 index 0000000..dac7fdd --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-USDC-eUSDe@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201302", + "timestamp": "1743839075" + }, + "market": "0xD9731b244ecCCC3944983C625290eabF274Ed616", + "collateral": { + "address": "0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F", + "symbol": "eUSDe", + "priceFeed": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x57079f1bb0979209EfA75de105936024D9246b0F", + "xt": "0x1B9aDE9E6DBB2e059B66Ffa4F65E4A746e3FAb2d", + "gt": "0x65CdD8BCE1790EcB3d836cc929362d3A8A125208" + }, + "config": { + "marketSymbol": "USDC/eUSDe@29MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-USDC-sUSDe@07APR2025.json b/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-USDC-sUSDe@07APR2025.json new file mode 100644 index 0000000..b4f77f3 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-USDC-sUSDe@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201302", + "timestamp": "1743839075" + }, + "market": "0x7EDF8495fcf656c768FF2603b584149d86b76C0A", + "collateral": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xeD17c6b8c804b6948C3f8af2E04D0bC8b11e86bA", + "xt": "0xbb79bd0C43847B8D239770B8bE3F8aDF2D51586E", + "gt": "0x67D88A426a6cBC2F273e437da26d4E385C6deA00" + }, + "config": { + "marketSymbol": "USDC/sUSDe@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-USDC-wstETH@07APR2025.json b/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-USDC-wstETH@07APR2025.json new file mode 100644 index 0000000..0438d18 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-USDC-wstETH@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201302", + "timestamp": "1743839075" + }, + "market": "0x5e1D10bcA69e694Ea519A4D60F3c8B6efD870B04", + "collateral": { + "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xe97d26316e2318A4931eDd7326bc3A9d9CD99dE8", + "xt": "0x487Cf19B6614633eD6b6e2B8878f9C966274aCCe", + "gt": "0x64147CcD08c68aD4711D33C0e17224dc7971a221" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-WETH-MCwETH@07APR2025.json b/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-WETH-MCwETH@07APR2025.json new file mode 100644 index 0000000..2a35fe5 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-WETH-MCwETH@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201302", + "timestamp": "1743839075" + }, + "market": "0x79EeD896A18d40d654579dF09190eAa63d2dd020", + "collateral": { + "address": "0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8", + "symbol": "MCwETH", + "priceFeed": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xDF340Ae12173Ae8fc8a5a656B3971907c88e31f1", + "xt": "0x1f442785b2F0B9549E01308641A56C2E1022Dd77", + "gt": "0xeE68c9Ca078407d73418CBFC078a00f9CE8987b6" + }, + "config": { + "marketSymbol": "WETH/MCwETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-WETH-gtWETH@07APR2025.json b/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-WETH-gtWETH@07APR2025.json new file mode 100644 index 0000000..b17187c --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-WETH-gtWETH@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201302", + "timestamp": "1743839075" + }, + "market": "0x012D15614E965192a73107fa4ce92F1AE26c7b3a", + "collateral": { + "address": "0x2371e134e3455e0593363cBF89d3b6cf53740618", + "symbol": "gtWETH", + "priceFeed": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x5299aDF94916291a02b1beBC992dd7E157739461", + "xt": "0xD1791D28ed5Fa42676A8475e4CC961Bff5650B64", + "gt": "0x82749A4c2ed2df35e43b2DccE9Fb5983b8e31F0f" + }, + "config": { + "marketSymbol": "WETH/gtWETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-WETH-pufETH@07APR2025.json b/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-WETH-pufETH@07APR2025.json new file mode 100644 index 0000000..f1868af --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-WETH-pufETH@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201302", + "timestamp": "1743839075" + }, + "market": "0x2260f5Ece61f781f2F55a28731002BDe88B9a7E1", + "collateral": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xea45F4DcdA4B284D893BAA26983866BA8410A77e", + "xt": "0x81Bc5083d814E00Eb441c7AD6331e6f7cfa01dEe", + "gt": "0x68a164d64353d9392D0F3737BE4B3dbec6010581" + }, + "config": { + "marketSymbol": "WETH/pufETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-WETH-weETH@07APR2025.json b/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-WETH-weETH@07APR2025.json new file mode 100644 index 0000000..89b0fb1 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-WETH-weETH@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201302", + "timestamp": "1743839075" + }, + "market": "0x135D91F9d7B816F9Dc193976938222401e2A2212", + "collateral": { + "address": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "21600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xe7374A418D6a277Bb34D66c9D903314AE95277a8", + "xt": "0x37AB7e0981Ded4d2547f763228b7f432301f6895", + "gt": "0x82195140100D9A8eeF8A91dF0300967e6add66cf" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@07APR2025.json b/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@07APR2025.json new file mode 100644 index 0000000..51c105c --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250407-1400/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201302", + "timestamp": "1743839075" + }, + "market": "0x48CC44e1f9443C6447784D48823acfc9BDEFA238", + "collateral": { + "address": "0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D", + "symbol": "PT-pufETH-26JUN2025", + "priceFeed": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xAB140f40A8F7ba38b18F3f27b4ee37084F73644E", + "xt": "0xB74A2304E74fbC8B1a12755FD247e405df1Ea5E0", + "gt": "0x9664EA95f17F395A8E52232edC1D786c492dE61a" + }, + "config": { + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250407-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt b/deployments/eth-mainnet-v1.0.8-20250407-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt new file mode 100644 index 0000000..81ca312 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250407-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt @@ -0,0 +1,21 @@ +== Logs == + Network: eth-mainnet + Deployer balance: 158879257545733090 + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175070 + Block timestamp: 1743522719 + + ===== Oracle Aggregator Info ===== + Deployer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Admin: 0x8409a9C1A911CED491892c5694E43994c9d47E8f + Oracle Aggregator deployed at: 0xE3a31690392E8E18DC3d862651C079339E2c1ADE + Oracle Timelock: 43200 + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250407-2000/deploy-market-eth-mainnet-20250407-2000-log.txt b/deployments/eth-mainnet-v1.0.8-20250407-2000/deploy-market-eth-mainnet-20250407-2000-log.txt new file mode 100644 index 0000000..29bd3eb --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250407-2000/deploy-market-eth-mainnet-20250407-2000-log.txt @@ -0,0 +1,371 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ETHERSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf7ea840ec163817b51384fcc1d53ee433b758a8b + + ===== Block Info ===== + Block number: 22201345 + Block timestamp: 1743839591 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22201345 + + ===== Market Info - 0 ===== + Market deployed at: 0xbEd77E673b45E0B9bc5cd169447143853ED5715d + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x82e570d2D43fb1b3cec2C4AFF53DafD92AB45d89 + XT deployed at: 0x9f399f647720a0425Af74348c91467598d470202 + GT deployed at: 0x6bE1b28F8E877662A54Ce724716b760b30e09A38 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@07APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xBf668F5475362043eC1aDb5A57a0C7c0BeeBb12C + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xFe4640f6010167ff6F376EAe46acf1d51A9C9839 + XT deployed at: 0x2319fEcE6dbc1fdc4EF6166C2e028238f56e2E1e + GT deployed at: 0x3c63392FCcba8c51D8D56dEf468B71bd236B7fFe + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@07APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0xcE1Ee8A9Ac5F326E4C7F41A47a1AC028D18EDf2B + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x37Cf98db74d2F7126c1E3181aAe3a288f43b5166 + XT deployed at: 0x69cB0E3Ff0E591F0971aF8FbD9B3A79f8647BC99 + GT deployed at: 0x63feDA3DF5DD9d7D2a6745569bCC4A428598676F + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@07APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xc29ae011FE7Fd77023ea174Bd58E68F305B45b46 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xDF9B67da97baB1C0E30DD161E6E02418E339c867 + XT deployed at: 0x3927BfF16E7c094357611c2225d1B527d20F584a + GT deployed at: 0x1BAF3D23C458752649D5c5aFf88FFe8Cf8733A20 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@07APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x4C1a07525ebDd327807b642C214B49C63E6c05ff + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x5f8F5d6729C525B4a4737C70c57a00809c811D1B + XT deployed at: 0x32D05350a0655CA0357A8A5930dbc3D5311C08e8 + GT deployed at: 0x65a6177fE89Bb8a5193bf1324e4B46E91121DDbD + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@07APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0xDf99ec79822550b092261855C1634cbDbdD3de99 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x1414D38b9815A22f03E7255Cd0bC2Ad9c64682EB + XT deployed at: 0x484C904d40E60039188556A1391ba6C072132DaA + GT deployed at: 0x6844781F48B4Eb0D983d07e39d79B571f3c5C6B9 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@07APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x4bcb2F8b3aceA5b572E2397149B4d5B41F396280 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0xE79eCa37E34eFB73E62e3f1c49e53ac1d2AB4755 + XT deployed at: 0x20A8b4fd55172BB4cDd07796b53787D48Ecd2b69 + GT deployed at: 0x365859C5D75b991d0C4DC5d1Cd04E41E6191fD93 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@07APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0x28bBc8229D20007CB5B6183241fe55ED58c2ef2f + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x57108350Ab9F7b82B64951915a07AdfB59BfEA1b + XT deployed at: 0xB4574ddB742a02e94623a7b6d2318099Ca81D022 + GT deployed at: 0xDbeaB9Cd959f813188959d363b66d4c62bCf7258 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@07APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0x437De5103d5A7C5906c882c0B1ABFcF482445edf + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0xAEF0E03531b100a9A3Fe6dc559bb9753d623aDFf + XT deployed at: 0xdc8dD52f3158E298eFDEA763B54f81C6c8BF4f15 + GT deployed at: 0xeEecE78d1933a5c452562c9C204EA03Cb119Af9c + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@07APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x80F7BB6E8e079E4CDEbe0352C371751c2e866214 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x0F096eC4b9D4f4e3e6c04d7A7bd946857779d408 + XT deployed at: 0x3178AEF5f1B4f8707221af937E10A7c37879279A + GT deployed at: 0x839CBF41876616B6e6F09C8A766788423D9AEb9e + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@07APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0xC35210FFE8ff4edd32C9A75bC8579Bd275622Fae + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xea5eC3ECF0947a0Bf07F507d8442474718f82097 + XT deployed at: 0x23E226a217aB9Bef9DA1dcE6bb3c6aF8CDA59026 + GT deployed at: 0x957De9961019fD6F8085307B41fD7c9e99785fE0 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@07APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x113A3d189C7D896A59670211cBbd2702A3AaE33d + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x1CebfB6013B7D220369415728E3033f5C45Fe4c6 + XT deployed at: 0xb09a74bA0D764386C771AC1647754DC836458474 + GT deployed at: 0x697B4e77B950FCaaD31aE4c1F964F5C638b6F679 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 07APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@07APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 1.054159039 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.018245797877355288 ETH + +========================== + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[ERROR] market deployment to eth-mainnet failed! +You can resume the failed deployment by running the same command with the --resume option: +./script.sh eth-mainnet deploy:market --broadcast --resume --verify + + +No files changed, compilation skipped + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + diff --git a/deployments/eth-mainnet-v1.0.8-20250407-2000/deploy_markets_test_0402_log.txt b/deployments/eth-mainnet-v1.0.8-20250407-2000/deploy_markets_test_0402_log.txt new file mode 100644 index 0000000..236c256 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250407-2000/deploy_markets_test_0402_log.txt @@ -0,0 +1,370 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Enabled--verify +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175185 + Block timestamp: 1743524099 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22175185 + + ===== Market Info - 0 ===== + Market deployed at: 0x4a20DdEB8696b1f542649626889522068cc19438 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x00B210A7f79653A0fe7e2bc31d6Fe3026421195d + XT deployed at: 0x465c30b940E792262Ef65B7Fe7A5bAd3b5b7f034 + GT deployed at: 0xca3F986978ADEf5aA8e4F9e4F3d27f6f4Eb3f47d + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@02APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xC8c3A49b64dB371F96EdC15941e043966297Ea6b + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x19632ff799BA54B54934b52a89964F6cb12D396f + XT deployed at: 0xe459c64a852Df70Ea7D0cc46142A1a0d8BCd4f2A + GT deployed at: 0x9CEA72e4C7Fd1dd0bb2D0AAF98D756B1f85e096D + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@02APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x54ACdb3da45bBDEb1a53e1E3F6DB51C8384c7F9c + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x3ebabb95e4276DD2850666a95037f5EE3bb798Bb + XT deployed at: 0xb7d4329b11Dff286890F4d7e5b10763E09E8804C + GT deployed at: 0x28C108FD44B2E58DD9B07CBE453c0BCF836b8CB7 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@02APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xf2F9b0fDD5D22e574421A7Ee0E29e410E63C70A9 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x594Db033Ade81E0C8182B66d2B07fbc97452d1FA + XT deployed at: 0x544786112d542910634109BcCEF84C3Deb1b65e0 + GT deployed at: 0x81CAc518B14B28570C667A143F801bF2e05b6BEe + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@02APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x10aCD317ebf3F65e30c72720D89c55B7C68a9628 + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xA03710F73585cb5458F43739624611633Bf24173 + XT deployed at: 0x80525c75690102bb024BcEd8bE81D18A56172EC0 + GT deployed at: 0xe2e5403923B0421FA5a9D28c1012aeAFfc820f02 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@02APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x49913B7Bd178e21FaC84C3dED810Ff4CcDcb8403 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x8CDe48E20b5d77C3ec0fbCbf50d0C78B2DE11264 + XT deployed at: 0x8b596614c9ac30bd9DF615c3C18F0f05a97F0779 + GT deployed at: 0xBA03824B38E83B7CBAF3Fcb5aF02EF8342A110d8 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@02APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x69E1A695Ee24e7BcFc55d2dA7DfD479E4C7Eb6A3 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0xc7d5476d361C8d0E5c0478EA320431AD4a49A558 + XT deployed at: 0xe1710D5449241ce311Bfcefb5272594ECD930ec0 + GT deployed at: 0x4B87E9281de9573f2025565E632bdb8F136766E5 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@02APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0x9dA149D4Bc9eF4e6Eb1D131E837270f76dc62e79 + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD667a61e822564e1399f73196c73B2C41bCBda69 + XT deployed at: 0x2348B91F2037799d6AE604D792101534461DB06E + GT deployed at: 0x1aE5482Db2883e1ae8CDBFDbaE95539266F1bF32 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@02APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0x9cde69Ea28c9125060F86eB982305BafaE57f585 + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x4bDD2b0f934EECCE01A8Fc47E3762Ce86C9D061F + XT deployed at: 0x63B96518024b49C8F16104fDFd9d94a79A3d185C + GT deployed at: 0xa78bE568bc5ec42C8E41734dADcb86D3dde73af3 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@02APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x565656a354F6C2953EB2D00DC7e2e0Ab815e19E7 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x1184866Ed937F4605efc100c1f18E028F7CBDD86 + XT deployed at: 0x3F56b53953adf3a65f5Bb8E8Dce1C4926e1D629c + GT deployed at: 0x315f180e74247E01ca0377244Eb6b6D1c7444452 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@02APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x0ed76A80D639E7Bf88524b63429bB841c1633E60 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD4771df4a0f6338f521512A1651D8DB7EF5Af633 + XT deployed at: 0x4bbc10317e5b70B6B491836F5B2b496EE35f5E31 + GT deployed at: 0xFF601c3788236F231a8771cACBbB3087D0Ee7A2c + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@02APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x8c07c10a0a3530a9fB64c65f109A32F7B4b2DB80 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x0469A60F8fbc0c35c4D1D965a50A6Bd29c9dAB8C + XT deployed at: 0xE292927A017d58823957A83ea5EFeAF9C37D6F94 + GT deployed at: 0x7AdE4961Fccba087E8b4De84E8be61098Daf0230 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@02APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 5.079885262 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.087924645429718704 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x4a20ddeb8696b1f542649626889522068cc19438, 0x00b210a7f79653a0fe7e2bc31d6fe3026421195d, 0x465c30b940e792262ef65b7fe7a5bad3b5b7f034, 0xca3f986978adef5aa8e4f9e4f3d27f6f4eb3f47d, 0xc8c3a49b64db371f96edc15941e043966297ea6b, 0x19632ff799ba54b54934b52a89964f6cb12d396f, 0xe459c64a852df70ea7d0cc46142a1a0d8bcd4f2a, 0x9cea72e4c7fd1dd0bb2d0aaf98d756b1f85e096d, 0x54acdb3da45bbdeb1a53e1e3f6db51c8384c7f9c, 0x3ebabb95e4276dd2850666a95037f5ee3bb798bb, 0xb7d4329b11dff286890f4d7e5b10763e09e8804c, 0x28c108fd44b2e58dd9b07cbe453c0bcf836b8cb7, 0xf2f9b0fdd5d22e574421a7ee0e29e410e63c70a9, 0x594db033ade81e0c8182b66d2b07fbc97452d1fa, 0x544786112d542910634109bccef84c3deb1b65e0, 0x81cac518b14b28570c667a143f801bf2e05b6bee, 0x10acd317ebf3f65e30c72720d89c55b7c68a9628, 0xa03710f73585cb5458f43739624611633bf24173, 0x80525c75690102bb024bced8be81d18a56172ec0, 0xe2e5403923b0421fa5a9d28c1012aeaffc820f02, 0x49913b7bd178e21fac84c3ded810ff4ccdcb8403, 0x8cde48e20b5d77c3ec0fbcbf50d0c78b2de11264, 0x8b596614c9ac30bd9df615c3c18f0f05a97f0779, 0xba03824b38e83b7cbaf3fcb5af02ef8342a110d8, 0x69e1a695ee24e7bcfc55d2da7dfd479e4c7eb6a3, 0xc7d5476d361c8d0e5c0478ea320431ad4a49a558, 0xe1710d5449241ce311bfcefb5272594ecd930ec0, 0x4b87e9281de9573f2025565e632bdb8f136766e5, 0x9da149d4bc9ef4e6eb1d131e837270f76dc62e79, 0xd667a61e822564e1399f73196c73b2c41bcbda69, 0x2348b91f2037799d6ae604d792101534461db06e, 0x1ae5482db2883e1ae8cdbfdbae95539266f1bf32, 0x9cde69ea28c9125060f86eb982305bafae57f585, 0x4bdd2b0f934eecce01a8fc47e3762ce86c9d061f, 0x63b96518024b49c8f16104fdfd9d94a79a3d185c, 0xa78be568bc5ec42c8e41734dadcb86d3dde73af3, 0x565656a354f6c2953eb2d00dc7e2e0ab815e19e7, 0x1184866ed937f4605efc100c1f18e028f7cbdd86, 0x3f56b53953adf3a65f5bb8e8dce1c4926e1d629c, 0x315f180e74247e01ca0377244eb6b6d1c7444452, 0x0ed76a80d639e7bf88524b63429bb841c1633e60, 0xd4771df4a0f6338f521512a1651d8db7ef5af633, 0x4bbc10317e5b70b6b491836f5b2b496ee35f5e31, 0xff601c3788236f231a8771cacbbb3087d0ee7a2c, 0x8c07c10a0a3530a9fb64c65f109a32f7b4b2db80, 0x0469a60f8fbc0c35c4d1d965a50a6bd29c9dab8c, 0xe292927a017d58823957a83ea5efeaf9c37d6f94, 0x7ade4961fccba087e8b4de84e8be61098daf0230]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-access-manager.json b/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-access-manager.json new file mode 100644 index 0000000..a1a5b6a --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743155675", + "gitBranch": "deploy/v1.0.5", + "gitCommitHash": "0x0x65c418860c22aecb27054e7a8c3207a4f87ad6af", + "blockInfo": { + "number": "22144647", + "timestamp": "1743155675" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-core.json b/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-core.json new file mode 100644 index 0000000..34b5474 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743518639", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x30f0c30e4edf518e2bf6700837dad2a7624d35df", + "blockInfo": { + "number": "22174730", + "timestamp": "1743518639" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x37Ba9934aAbA7a49cC29d0952C6a91d7c7043dbc", + "vaultFactory": "0x01D8C1e0584751085a876892151Bf8490e862E3E", + "oracleAggregator": "0xE3a31690392E8E18DC3d862651C079339E2c1ADE", + "router": "0xC47591F5c023e44931c78D5A993834875b79FB11", + "swapAdapter": { + "uniswapV3Adapter": "0x34F7b52b0d33959C8351eF95F3523C89b6123C0b", + "odosV2Adapter": "0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779", + "pendleSwapV3Adapter": "0x0B30251FA697A39Fd41813b267b50F03414E82da", + "ERC4626VaultAdapter": "0x85ce30537c14EFB66B673f284bEa7c28351244F6" + }, + "marketViewer": "0x74Dfb95Ae623123ecf82Ba841985fB460bB9d45D" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@07APR2025.json b/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@07APR2025.json new file mode 100644 index 0000000..ef6e6f1 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201345", + "timestamp": "1743839591" + }, + "market": "0xc29ae011FE7Fd77023ea174Bd58E68F305B45b46", + "collateral": { + "address": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "symbol": "PT-sUSDE-29MAY2025", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xDF9B67da97baB1C0E30DD161E6E02418E339c867", + "xt": "0x3927BfF16E7c094357611c2225d1B527d20F584a", + "gt": "0x1BAF3D23C458752649D5c5aFf88FFe8Cf8733A20" + }, + "config": { + "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-USDC-USUALUSDC+@07APR2025.json b/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-USDC-USUALUSDC+@07APR2025.json new file mode 100644 index 0000000..2b0b3ac --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-USDC-USUALUSDC+@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201345", + "timestamp": "1743839591" + }, + "market": "0x4C1a07525ebDd327807b642C214B49C63E6c05ff", + "collateral": { + "address": "0xd63070114470f685b75B74D60EEc7c1113d33a3D", + "symbol": "USUALUSDC+", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x5f8F5d6729C525B4a4737C70c57a00809c811D1B", + "xt": "0x32D05350a0655CA0357A8A5930dbc3D5311C08e8", + "gt": "0x65a6177fE89Bb8a5193bf1324e4B46E91121DDbD" + }, + "config": { + "marketSymbol": "USDC/USUALUSDC+@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-USDC-WBTC@07APR2025.json b/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-USDC-WBTC@07APR2025.json new file mode 100644 index 0000000..034ec43 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-USDC-WBTC@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201345", + "timestamp": "1743839591" + }, + "market": "0x80F7BB6E8e079E4CDEbe0352C371751c2e866214", + "collateral": { + "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "symbol": "WBTC", + "priceFeed": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x0F096eC4b9D4f4e3e6c04d7A7bd946857779d408", + "xt": "0x3178AEF5f1B4f8707221af937E10A7c37879279A", + "gt": "0x839CBF41876616B6e6F09C8A766788423D9AEb9e" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-USDC-cbBTC@07APR2025.json b/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-USDC-cbBTC@07APR2025.json new file mode 100644 index 0000000..da9ef0b --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-USDC-cbBTC@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201345", + "timestamp": "1743839591" + }, + "market": "0xC35210FFE8ff4edd32C9A75bC8579Bd275622Fae", + "collateral": { + "address": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", + "symbol": "cbBTC", + "priceFeed": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xea5eC3ECF0947a0Bf07F507d8442474718f82097", + "xt": "0x23E226a217aB9Bef9DA1dcE6bb3c6aF8CDA59026", + "gt": "0x957De9961019fD6F8085307B41fD7c9e99785fE0" + }, + "config": { + "marketSymbol": "USDC/cbBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-USDC-eUSDe@07APR2025.json b/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-USDC-eUSDe@07APR2025.json new file mode 100644 index 0000000..f256847 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-USDC-eUSDe@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201345", + "timestamp": "1743839591" + }, + "market": "0x28bBc8229D20007CB5B6183241fe55ED58c2ef2f", + "collateral": { + "address": "0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F", + "symbol": "eUSDe", + "priceFeed": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x57108350Ab9F7b82B64951915a07AdfB59BfEA1b", + "xt": "0xB4574ddB742a02e94623a7b6d2318099Ca81D022", + "gt": "0xDbeaB9Cd959f813188959d363b66d4c62bCf7258" + }, + "config": { + "marketSymbol": "USDC/eUSDe@29MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-USDC-sUSDe@07APR2025.json b/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-USDC-sUSDe@07APR2025.json new file mode 100644 index 0000000..4e79c34 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-USDC-sUSDe@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201345", + "timestamp": "1743839591" + }, + "market": "0xcE1Ee8A9Ac5F326E4C7F41A47a1AC028D18EDf2B", + "collateral": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x37Cf98db74d2F7126c1E3181aAe3a288f43b5166", + "xt": "0x69cB0E3Ff0E591F0971aF8FbD9B3A79f8647BC99", + "gt": "0x63feDA3DF5DD9d7D2a6745569bCC4A428598676F" + }, + "config": { + "marketSymbol": "USDC/sUSDe@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-USDC-wstETH@07APR2025.json b/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-USDC-wstETH@07APR2025.json new file mode 100644 index 0000000..39ef314 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-USDC-wstETH@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201345", + "timestamp": "1743839591" + }, + "market": "0xBf668F5475362043eC1aDb5A57a0C7c0BeeBb12C", + "collateral": { + "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xFe4640f6010167ff6F376EAe46acf1d51A9C9839", + "xt": "0x2319fEcE6dbc1fdc4EF6166C2e028238f56e2E1e", + "gt": "0x3c63392FCcba8c51D8D56dEf468B71bd236B7fFe" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-WETH-MCwETH@07APR2025.json b/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-WETH-MCwETH@07APR2025.json new file mode 100644 index 0000000..2a13e65 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-WETH-MCwETH@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201345", + "timestamp": "1743839591" + }, + "market": "0xDf99ec79822550b092261855C1634cbDbdD3de99", + "collateral": { + "address": "0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8", + "symbol": "MCwETH", + "priceFeed": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x1414D38b9815A22f03E7255Cd0bC2Ad9c64682EB", + "xt": "0x484C904d40E60039188556A1391ba6C072132DaA", + "gt": "0x6844781F48B4Eb0D983d07e39d79B571f3c5C6B9" + }, + "config": { + "marketSymbol": "WETH/MCwETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-WETH-gtWETH@07APR2025.json b/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-WETH-gtWETH@07APR2025.json new file mode 100644 index 0000000..0f532a9 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-WETH-gtWETH@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201345", + "timestamp": "1743839591" + }, + "market": "0x113A3d189C7D896A59670211cBbd2702A3AaE33d", + "collateral": { + "address": "0x2371e134e3455e0593363cBF89d3b6cf53740618", + "symbol": "gtWETH", + "priceFeed": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x1CebfB6013B7D220369415728E3033f5C45Fe4c6", + "xt": "0xb09a74bA0D764386C771AC1647754DC836458474", + "gt": "0x697B4e77B950FCaaD31aE4c1F964F5C638b6F679" + }, + "config": { + "marketSymbol": "WETH/gtWETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-WETH-pufETH@07APR2025.json b/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-WETH-pufETH@07APR2025.json new file mode 100644 index 0000000..5ac94ed --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-WETH-pufETH@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201345", + "timestamp": "1743839591" + }, + "market": "0x437De5103d5A7C5906c882c0B1ABFcF482445edf", + "collateral": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xAEF0E03531b100a9A3Fe6dc559bb9753d623aDFf", + "xt": "0xdc8dD52f3158E298eFDEA763B54f81C6c8BF4f15", + "gt": "0xeEecE78d1933a5c452562c9C204EA03Cb119Af9c" + }, + "config": { + "marketSymbol": "WETH/pufETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-WETH-weETH@07APR2025.json b/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-WETH-weETH@07APR2025.json new file mode 100644 index 0000000..00ef036 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-WETH-weETH@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201345", + "timestamp": "1743839591" + }, + "market": "0xbEd77E673b45E0B9bc5cd169447143853ED5715d", + "collateral": { + "address": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "21600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x82e570d2D43fb1b3cec2C4AFF53DafD92AB45d89", + "xt": "0x9f399f647720a0425Af74348c91467598d470202", + "gt": "0x6bE1b28F8E877662A54Ce724716b760b30e09A38" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@07APR2025.json b/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@07APR2025.json new file mode 100644 index 0000000..023632b --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250407-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@07APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22201345", + "timestamp": "1743839591" + }, + "market": "0x4bcb2F8b3aceA5b572E2397149B4d5B41F396280", + "collateral": { + "address": "0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D", + "symbol": "PT-pufETH-26JUN2025", + "priceFeed": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xE79eCa37E34eFB73E62e3f1c49e53ac1d2AB4755", + "xt": "0x20A8b4fd55172BB4cDd07796b53787D48Ecd2b69", + "gt": "0x365859C5D75b991d0C4DC5d1Cd04E41E6191fD93" + }, + "config": { + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "07APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250408-1400/deploy-eth-mainnet-oracle-aggregator-0401-log.txt b/deployments/eth-mainnet-v1.0.8-20250408-1400/deploy-eth-mainnet-oracle-aggregator-0401-log.txt new file mode 100644 index 0000000..81ca312 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250408-1400/deploy-eth-mainnet-oracle-aggregator-0401-log.txt @@ -0,0 +1,21 @@ +== Logs == + Network: eth-mainnet + Deployer balance: 158879257545733090 + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175070 + Block timestamp: 1743522719 + + ===== Oracle Aggregator Info ===== + Deployer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Admin: 0x8409a9C1A911CED491892c5694E43994c9d47E8f + Oracle Aggregator deployed at: 0xE3a31690392E8E18DC3d862651C079339E2c1ADE + Oracle Timelock: 43200 + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250408-1400/deploy-market-eth-mainnet-20250408-1400-log.txt b/deployments/eth-mainnet-v1.0.8-20250408-1400/deploy-market-eth-mainnet-20250408-1400-log.txt new file mode 100644 index 0000000..c203255 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250408-1400/deploy-market-eth-mainnet-20250408-1400-log.txt @@ -0,0 +1,375 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ETHERSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0x5a059d3a272b20ad129ffbe37b9903a61a03595e + + ===== Block Info ===== + Block number: 22214356 + Block timestamp: 1743996659 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22214356 + + ===== Market Info - 0 ===== + Market deployed at: 0x6E6a759B9e60ee4aB935d40790a76d17C40Bead0 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x1f55194d52C96678e4099B55D2Dc379EC2CC8E45 + XT deployed at: 0x7de01F4ebaf2C31d8E0Bd1980Cd9A89F02953A3F + GT deployed at: 0x1CfdB2546479D0476189dFA3eb57EE26c81Fa82D + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@08APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xfa0671Ba3E2Ea0F7807B7725B7a892079b347bb7 + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x16dF8ae9eeDe1F66F3a35665958fdE676294243e + XT deployed at: 0x69D3c664e0E77D97A5Cc00a8582dA2d9A9d6cf1c + GT deployed at: 0xb9F4a0A2B88D4b41E7627177bbB5226665518BC0 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@08APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x696de745B378985736D3Cc6ED2c315D097b1d469 + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xB41Aa7887Db308Ac689b0Eee467174dB8C98BA16 + XT deployed at: 0xA039B1407E10F8AdA23EaDBc72724C496c146D99 + GT deployed at: 0x18112906b408867758952709eee3C1E7be015b26 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@08APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0x2c2d1dBFE91076bFD2755d5D3E59b54BEdF0FEe0 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x8aC997550371f353Fcc058B84b537bee5f2c4a4F + XT deployed at: 0x77C388717e2cb4655050682083C5e11e5D65061c + GT deployed at: 0xBD74614186a53d074867a182d940c1D068EECBB4 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@08APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x7a2AC5c749b3b6aa76f6D60E23DDAF08bF04Ee43 + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xcEa5D4f36Ee470d23FFE9826CCF5592CbaE85276 + XT deployed at: 0x1e26301B78DC6a3Fe45688cB3311d045267A05b7 + GT deployed at: 0x365885b7a506C565c6C7F5524c4C2def0d62ff38 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@08APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x94fd0EdD370a061c96D9450ECa260AB3F47dA178 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x9eEF0e286EBc0f3De05A803d9A1EcDB816E1fce0 + XT deployed at: 0x5fb1A720C6E06655362f7f58f3f7107329EfaEdE + GT deployed at: 0x43AfCc5D9669D26D96182a298281E6f1502b9Ae4 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@08APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x973Dc173D8E5F107c707429A3422750ec99277D7 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0x85A0A68812ddB0D3aEFF443d23df603C72654A8b + XT deployed at: 0xc686c01467Eb1A0F65942aAb0f711fE104b4f808 + GT deployed at: 0x870C581f19D7bA80bD60B3A5C10cF2883a08D11c + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@08APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0xD5e0c6683993cea2f8a602B6198c821abA448c7B + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x8455817D5241BE6FC4b1d672d033944aA30e9e67 + XT deployed at: 0xb30050fb207e3CDb461c62Dcc01db28f02DDC327 + GT deployed at: 0xF42479Ac8ed4d900480A5bb1aee3665E127bE5d5 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@08APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0xFE960f863Db62615792e500979427a4846A26Cb0 + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0xdfD578C697AE8DfA55f620c50971a7115e3b7c73 + XT deployed at: 0x230D995106320ff73101d8061ee0b0bDE701FF2d + GT deployed at: 0xA7f0d41db7fD864ab4fD46d7F1b820205Cea095E + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@08APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0xF8CCE0Ae206fCc8a017662D95Cb14346D9F0e4Cf + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x6617Ec1E7AA782AB19DC4E938446e7f4471Ae7E9 + XT deployed at: 0xB7485DCfE5B0e20B3c958703F1DC48A74BEd0ad5 + GT deployed at: 0x90e22bdb10d58E2845d1a4f658c1f826E84a97Eb + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@08APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x716589E75641c0751e987eC2f92Be81C8E430686 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x8673846F426fc920CA6aa4b14643eee58a703974 + XT deployed at: 0x3585dbd668a7AA5a7E4d7abb13805413c6aC4454 + GT deployed at: 0x5Db08775aFE41D07C9d13b13068C1829b2fB5C9d + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@08APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x8B9D36Acd480Aad1eaD67b6d14f3746C12536890 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x443655f2A2C3b2F7b558FA12b0EdC35aE62Ed039 + XT deployed at: 0x4d081668b24093658e62b94E65381febc645D4B4 + GT deployed at: 0x0eCa81D90aA658Ec5BFA1Ef63B0B043c6c52420f + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@08APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 1.250046141 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.021636288626515272 ETH + +========================== + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[ERROR] market deployment to eth-mainnet failed! +You can resume the failed deployment by running the same command with the --resume option: +./script.sh eth-mainnet deploy:market --broadcast --resume --verify +No files changed, compilation skipped + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +No files changed, compilation skipped + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + diff --git a/deployments/eth-mainnet-v1.0.8-20250408-1400/deploy_markets_test_0402_log.txt b/deployments/eth-mainnet-v1.0.8-20250408-1400/deploy_markets_test_0402_log.txt new file mode 100644 index 0000000..236c256 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250408-1400/deploy_markets_test_0402_log.txt @@ -0,0 +1,370 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Enabled--verify +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175185 + Block timestamp: 1743524099 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22175185 + + ===== Market Info - 0 ===== + Market deployed at: 0x4a20DdEB8696b1f542649626889522068cc19438 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x00B210A7f79653A0fe7e2bc31d6Fe3026421195d + XT deployed at: 0x465c30b940E792262Ef65B7Fe7A5bAd3b5b7f034 + GT deployed at: 0xca3F986978ADEf5aA8e4F9e4F3d27f6f4Eb3f47d + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@02APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xC8c3A49b64dB371F96EdC15941e043966297Ea6b + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x19632ff799BA54B54934b52a89964F6cb12D396f + XT deployed at: 0xe459c64a852Df70Ea7D0cc46142A1a0d8BCd4f2A + GT deployed at: 0x9CEA72e4C7Fd1dd0bb2D0AAF98D756B1f85e096D + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@02APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x54ACdb3da45bBDEb1a53e1E3F6DB51C8384c7F9c + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x3ebabb95e4276DD2850666a95037f5EE3bb798Bb + XT deployed at: 0xb7d4329b11Dff286890F4d7e5b10763E09E8804C + GT deployed at: 0x28C108FD44B2E58DD9B07CBE453c0BCF836b8CB7 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@02APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xf2F9b0fDD5D22e574421A7Ee0E29e410E63C70A9 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x594Db033Ade81E0C8182B66d2B07fbc97452d1FA + XT deployed at: 0x544786112d542910634109BcCEF84C3Deb1b65e0 + GT deployed at: 0x81CAc518B14B28570C667A143F801bF2e05b6BEe + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@02APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x10aCD317ebf3F65e30c72720D89c55B7C68a9628 + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xA03710F73585cb5458F43739624611633Bf24173 + XT deployed at: 0x80525c75690102bb024BcEd8bE81D18A56172EC0 + GT deployed at: 0xe2e5403923B0421FA5a9D28c1012aeAFfc820f02 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@02APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x49913B7Bd178e21FaC84C3dED810Ff4CcDcb8403 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x8CDe48E20b5d77C3ec0fbCbf50d0C78B2DE11264 + XT deployed at: 0x8b596614c9ac30bd9DF615c3C18F0f05a97F0779 + GT deployed at: 0xBA03824B38E83B7CBAF3Fcb5aF02EF8342A110d8 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@02APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x69E1A695Ee24e7BcFc55d2dA7DfD479E4C7Eb6A3 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0xc7d5476d361C8d0E5c0478EA320431AD4a49A558 + XT deployed at: 0xe1710D5449241ce311Bfcefb5272594ECD930ec0 + GT deployed at: 0x4B87E9281de9573f2025565E632bdb8F136766E5 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@02APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0x9dA149D4Bc9eF4e6Eb1D131E837270f76dc62e79 + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD667a61e822564e1399f73196c73B2C41bCBda69 + XT deployed at: 0x2348B91F2037799d6AE604D792101534461DB06E + GT deployed at: 0x1aE5482Db2883e1ae8CDBFDbaE95539266F1bF32 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@02APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0x9cde69Ea28c9125060F86eB982305BafaE57f585 + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x4bDD2b0f934EECCE01A8Fc47E3762Ce86C9D061F + XT deployed at: 0x63B96518024b49C8F16104fDFd9d94a79A3d185C + GT deployed at: 0xa78bE568bc5ec42C8E41734dADcb86D3dde73af3 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@02APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x565656a354F6C2953EB2D00DC7e2e0Ab815e19E7 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x1184866Ed937F4605efc100c1f18E028F7CBDD86 + XT deployed at: 0x3F56b53953adf3a65f5Bb8E8Dce1C4926e1D629c + GT deployed at: 0x315f180e74247E01ca0377244Eb6b6D1c7444452 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@02APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x0ed76A80D639E7Bf88524b63429bB841c1633E60 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD4771df4a0f6338f521512A1651D8DB7EF5Af633 + XT deployed at: 0x4bbc10317e5b70B6B491836F5B2b496EE35f5E31 + GT deployed at: 0xFF601c3788236F231a8771cACBbB3087D0Ee7A2c + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@02APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x8c07c10a0a3530a9fB64c65f109A32F7B4b2DB80 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x0469A60F8fbc0c35c4D1D965a50A6Bd29c9dAB8C + XT deployed at: 0xE292927A017d58823957A83ea5EFeAF9C37D6F94 + GT deployed at: 0x7AdE4961Fccba087E8b4De84E8be61098Daf0230 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@02APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 5.079885262 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.087924645429718704 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x4a20ddeb8696b1f542649626889522068cc19438, 0x00b210a7f79653a0fe7e2bc31d6fe3026421195d, 0x465c30b940e792262ef65b7fe7a5bad3b5b7f034, 0xca3f986978adef5aa8e4f9e4f3d27f6f4eb3f47d, 0xc8c3a49b64db371f96edc15941e043966297ea6b, 0x19632ff799ba54b54934b52a89964f6cb12d396f, 0xe459c64a852df70ea7d0cc46142a1a0d8bcd4f2a, 0x9cea72e4c7fd1dd0bb2d0aaf98d756b1f85e096d, 0x54acdb3da45bbdeb1a53e1e3f6db51c8384c7f9c, 0x3ebabb95e4276dd2850666a95037f5ee3bb798bb, 0xb7d4329b11dff286890f4d7e5b10763e09e8804c, 0x28c108fd44b2e58dd9b07cbe453c0bcf836b8cb7, 0xf2f9b0fdd5d22e574421a7ee0e29e410e63c70a9, 0x594db033ade81e0c8182b66d2b07fbc97452d1fa, 0x544786112d542910634109bccef84c3deb1b65e0, 0x81cac518b14b28570c667a143f801bf2e05b6bee, 0x10acd317ebf3f65e30c72720d89c55b7c68a9628, 0xa03710f73585cb5458f43739624611633bf24173, 0x80525c75690102bb024bced8be81d18a56172ec0, 0xe2e5403923b0421fa5a9d28c1012aeaffc820f02, 0x49913b7bd178e21fac84c3ded810ff4ccdcb8403, 0x8cde48e20b5d77c3ec0fbcbf50d0c78b2de11264, 0x8b596614c9ac30bd9df615c3c18f0f05a97f0779, 0xba03824b38e83b7cbaf3fcb5af02ef8342a110d8, 0x69e1a695ee24e7bcfc55d2da7dfd479e4c7eb6a3, 0xc7d5476d361c8d0e5c0478ea320431ad4a49a558, 0xe1710d5449241ce311bfcefb5272594ecd930ec0, 0x4b87e9281de9573f2025565e632bdb8f136766e5, 0x9da149d4bc9ef4e6eb1d131e837270f76dc62e79, 0xd667a61e822564e1399f73196c73b2c41bcbda69, 0x2348b91f2037799d6ae604d792101534461db06e, 0x1ae5482db2883e1ae8cdbfdbae95539266f1bf32, 0x9cde69ea28c9125060f86eb982305bafae57f585, 0x4bdd2b0f934eecce01a8fc47e3762ce86c9d061f, 0x63b96518024b49c8f16104fdfd9d94a79a3d185c, 0xa78be568bc5ec42c8e41734dadcb86d3dde73af3, 0x565656a354f6c2953eb2d00dc7e2e0ab815e19e7, 0x1184866ed937f4605efc100c1f18e028f7cbdd86, 0x3f56b53953adf3a65f5bb8e8dce1c4926e1d629c, 0x315f180e74247e01ca0377244eb6b6d1c7444452, 0x0ed76a80d639e7bf88524b63429bb841c1633e60, 0xd4771df4a0f6338f521512a1651d8db7ef5af633, 0x4bbc10317e5b70b6b491836f5b2b496ee35f5e31, 0xff601c3788236f231a8771cacbbb3087d0ee7a2c, 0x8c07c10a0a3530a9fb64c65f109a32f7b4b2db80, 0x0469a60f8fbc0c35c4d1d965a50a6bd29c9dab8c, 0xe292927a017d58823957a83ea5efeaf9c37d6f94, 0x7ade4961fccba087e8b4de84e8be61098daf0230]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-access-manager.json b/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-access-manager.json new file mode 100644 index 0000000..a1a5b6a --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743155675", + "gitBranch": "deploy/v1.0.5", + "gitCommitHash": "0x0x65c418860c22aecb27054e7a8c3207a4f87ad6af", + "blockInfo": { + "number": "22144647", + "timestamp": "1743155675" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-core.json b/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-core.json new file mode 100644 index 0000000..34b5474 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743518639", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x30f0c30e4edf518e2bf6700837dad2a7624d35df", + "blockInfo": { + "number": "22174730", + "timestamp": "1743518639" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x37Ba9934aAbA7a49cC29d0952C6a91d7c7043dbc", + "vaultFactory": "0x01D8C1e0584751085a876892151Bf8490e862E3E", + "oracleAggregator": "0xE3a31690392E8E18DC3d862651C079339E2c1ADE", + "router": "0xC47591F5c023e44931c78D5A993834875b79FB11", + "swapAdapter": { + "uniswapV3Adapter": "0x34F7b52b0d33959C8351eF95F3523C89b6123C0b", + "odosV2Adapter": "0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779", + "pendleSwapV3Adapter": "0x0B30251FA697A39Fd41813b267b50F03414E82da", + "ERC4626VaultAdapter": "0x85ce30537c14EFB66B673f284bEa7c28351244F6" + }, + "marketViewer": "0x74Dfb95Ae623123ecf82Ba841985fB460bB9d45D" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@08APR2025.json b/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@08APR2025.json new file mode 100644 index 0000000..8809a32 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214356", + "timestamp": "1743996659" + }, + "market": "0x2c2d1dBFE91076bFD2755d5D3E59b54BEdF0FEe0", + "collateral": { + "address": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "symbol": "PT-sUSDE-29MAY2025", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x8aC997550371f353Fcc058B84b537bee5f2c4a4F", + "xt": "0x77C388717e2cb4655050682083C5e11e5D65061c", + "gt": "0xBD74614186a53d074867a182d940c1D068EECBB4" + }, + "config": { + "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-USDC-USUALUSDC+@08APR2025.json b/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-USDC-USUALUSDC+@08APR2025.json new file mode 100644 index 0000000..da47e8d --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-USDC-USUALUSDC+@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214356", + "timestamp": "1743996659" + }, + "market": "0x7a2AC5c749b3b6aa76f6D60E23DDAF08bF04Ee43", + "collateral": { + "address": "0xd63070114470f685b75B74D60EEc7c1113d33a3D", + "symbol": "USUALUSDC+", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xcEa5D4f36Ee470d23FFE9826CCF5592CbaE85276", + "xt": "0x1e26301B78DC6a3Fe45688cB3311d045267A05b7", + "gt": "0x365885b7a506C565c6C7F5524c4C2def0d62ff38" + }, + "config": { + "marketSymbol": "USDC/USUALUSDC+@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-USDC-WBTC@08APR2025.json b/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-USDC-WBTC@08APR2025.json new file mode 100644 index 0000000..072411d --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-USDC-WBTC@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214356", + "timestamp": "1743996659" + }, + "market": "0xF8CCE0Ae206fCc8a017662D95Cb14346D9F0e4Cf", + "collateral": { + "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "symbol": "WBTC", + "priceFeed": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x6617Ec1E7AA782AB19DC4E938446e7f4471Ae7E9", + "xt": "0xB7485DCfE5B0e20B3c958703F1DC48A74BEd0ad5", + "gt": "0x90e22bdb10d58E2845d1a4f658c1f826E84a97Eb" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-USDC-cbBTC@08APR2025.json b/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-USDC-cbBTC@08APR2025.json new file mode 100644 index 0000000..0fdc37a --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-USDC-cbBTC@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214356", + "timestamp": "1743996659" + }, + "market": "0x716589E75641c0751e987eC2f92Be81C8E430686", + "collateral": { + "address": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", + "symbol": "cbBTC", + "priceFeed": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x8673846F426fc920CA6aa4b14643eee58a703974", + "xt": "0x3585dbd668a7AA5a7E4d7abb13805413c6aC4454", + "gt": "0x5Db08775aFE41D07C9d13b13068C1829b2fB5C9d" + }, + "config": { + "marketSymbol": "USDC/cbBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-USDC-eUSDe@08APR2025.json b/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-USDC-eUSDe@08APR2025.json new file mode 100644 index 0000000..e981a8f --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-USDC-eUSDe@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214356", + "timestamp": "1743996659" + }, + "market": "0xD5e0c6683993cea2f8a602B6198c821abA448c7B", + "collateral": { + "address": "0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F", + "symbol": "eUSDe", + "priceFeed": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x8455817D5241BE6FC4b1d672d033944aA30e9e67", + "xt": "0xb30050fb207e3CDb461c62Dcc01db28f02DDC327", + "gt": "0xF42479Ac8ed4d900480A5bb1aee3665E127bE5d5" + }, + "config": { + "marketSymbol": "USDC/eUSDe@29MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-USDC-sUSDe@08APR2025.json b/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-USDC-sUSDe@08APR2025.json new file mode 100644 index 0000000..732a206 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-USDC-sUSDe@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214356", + "timestamp": "1743996659" + }, + "market": "0x696de745B378985736D3Cc6ED2c315D097b1d469", + "collateral": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xB41Aa7887Db308Ac689b0Eee467174dB8C98BA16", + "xt": "0xA039B1407E10F8AdA23EaDBc72724C496c146D99", + "gt": "0x18112906b408867758952709eee3C1E7be015b26" + }, + "config": { + "marketSymbol": "USDC/sUSDe@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-USDC-wstETH@08APR2025.json b/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-USDC-wstETH@08APR2025.json new file mode 100644 index 0000000..3a2a243 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-USDC-wstETH@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214356", + "timestamp": "1743996659" + }, + "market": "0xfa0671Ba3E2Ea0F7807B7725B7a892079b347bb7", + "collateral": { + "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x16dF8ae9eeDe1F66F3a35665958fdE676294243e", + "xt": "0x69D3c664e0E77D97A5Cc00a8582dA2d9A9d6cf1c", + "gt": "0xb9F4a0A2B88D4b41E7627177bbB5226665518BC0" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-WETH-MCwETH@08APR2025.json b/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-WETH-MCwETH@08APR2025.json new file mode 100644 index 0000000..ff1e555 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-WETH-MCwETH@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214356", + "timestamp": "1743996659" + }, + "market": "0x94fd0EdD370a061c96D9450ECa260AB3F47dA178", + "collateral": { + "address": "0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8", + "symbol": "MCwETH", + "priceFeed": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x9eEF0e286EBc0f3De05A803d9A1EcDB816E1fce0", + "xt": "0x5fb1A720C6E06655362f7f58f3f7107329EfaEdE", + "gt": "0x43AfCc5D9669D26D96182a298281E6f1502b9Ae4" + }, + "config": { + "marketSymbol": "WETH/MCwETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-WETH-gtWETH@08APR2025.json b/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-WETH-gtWETH@08APR2025.json new file mode 100644 index 0000000..f24da44 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-WETH-gtWETH@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214356", + "timestamp": "1743996659" + }, + "market": "0x8B9D36Acd480Aad1eaD67b6d14f3746C12536890", + "collateral": { + "address": "0x2371e134e3455e0593363cBF89d3b6cf53740618", + "symbol": "gtWETH", + "priceFeed": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x443655f2A2C3b2F7b558FA12b0EdC35aE62Ed039", + "xt": "0x4d081668b24093658e62b94E65381febc645D4B4", + "gt": "0x0eCa81D90aA658Ec5BFA1Ef63B0B043c6c52420f" + }, + "config": { + "marketSymbol": "WETH/gtWETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-WETH-pufETH@08APR2025.json b/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-WETH-pufETH@08APR2025.json new file mode 100644 index 0000000..17864d9 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-WETH-pufETH@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214356", + "timestamp": "1743996659" + }, + "market": "0xFE960f863Db62615792e500979427a4846A26Cb0", + "collateral": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xdfD578C697AE8DfA55f620c50971a7115e3b7c73", + "xt": "0x230D995106320ff73101d8061ee0b0bDE701FF2d", + "gt": "0xA7f0d41db7fD864ab4fD46d7F1b820205Cea095E" + }, + "config": { + "marketSymbol": "WETH/pufETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-WETH-weETH@08APR2025.json b/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-WETH-weETH@08APR2025.json new file mode 100644 index 0000000..ef643ee --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-WETH-weETH@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214356", + "timestamp": "1743996659" + }, + "market": "0x6E6a759B9e60ee4aB935d40790a76d17C40Bead0", + "collateral": { + "address": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "21600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x1f55194d52C96678e4099B55D2Dc379EC2CC8E45", + "xt": "0x7de01F4ebaf2C31d8E0Bd1980Cd9A89F02953A3F", + "gt": "0x1CfdB2546479D0476189dFA3eb57EE26c81Fa82D" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@08APR2025.json b/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@08APR2025.json new file mode 100644 index 0000000..8404d17 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250408-1400/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214356", + "timestamp": "1743996659" + }, + "market": "0x973Dc173D8E5F107c707429A3422750ec99277D7", + "collateral": { + "address": "0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D", + "symbol": "PT-pufETH-26JUN2025", + "priceFeed": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x85A0A68812ddB0D3aEFF443d23df603C72654A8b", + "xt": "0xc686c01467Eb1A0F65942aAb0f711fE104b4f808", + "gt": "0x870C581f19D7bA80bD60B3A5C10cF2883a08D11c" + }, + "config": { + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250408-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt b/deployments/eth-mainnet-v1.0.8-20250408-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt new file mode 100644 index 0000000..81ca312 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250408-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt @@ -0,0 +1,21 @@ +== Logs == + Network: eth-mainnet + Deployer balance: 158879257545733090 + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175070 + Block timestamp: 1743522719 + + ===== Oracle Aggregator Info ===== + Deployer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Admin: 0x8409a9C1A911CED491892c5694E43994c9d47E8f + Oracle Aggregator deployed at: 0xE3a31690392E8E18DC3d862651C079339E2c1ADE + Oracle Timelock: 43200 + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250408-2000/deploy-market-eth-mainnet-20250408-2000-log.txt b/deployments/eth-mainnet-v1.0.8-20250408-2000/deploy-market-eth-mainnet-20250408-2000-log.txt new file mode 100644 index 0000000..88ccde0 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250408-2000/deploy-market-eth-mainnet-20250408-2000-log.txt @@ -0,0 +1,368 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ETHERSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0x5a059d3a272b20ad129ffbe37b9903a61a03595e + + ===== Block Info ===== + Block number: 22214462 + Block timestamp: 1743997931 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22214462 + + ===== Market Info - 0 ===== + Market deployed at: 0x6e7cb4195e6A565D8199630ad1AAd6FEc14c607E + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x3032Da66f091CfBdE48f7d3FdC55cf4aaeAF12Bf + XT deployed at: 0x8799eB4bE88da5d150e7102188468eb53A78DC09 + GT deployed at: 0xDD6b9BC5a48e46446B9df71A35fc4de99040d9D9 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@08APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0x91071b54100DE31F771e5400Fc3a9F9A2277431a + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xdF4421fF3389474a12Ab2cF62a5520BaDC8fC911 + XT deployed at: 0x87062B9DFaa8E04aF36ceC89Cdc7875967330a62 + GT deployed at: 0x2634dA53442A678B948fb749c5821Ff6d7580971 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@08APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0xfAE287BC5fe76185b02ac7134de12e5ef9da1e0e + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xf987eE7dc0221dF9bC68beD65c72601276B7586a + XT deployed at: 0x03D3276DB0655e28938D375E74C1738E2A0e1beb + GT deployed at: 0x783F9d6B8bF0881b63BEea0877f0273099A8C7Fd + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@08APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0x9d9750F32276B0CDBAF90E2d7D4dF5374D4Ce4D7 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xE1F6b7Cb67FB32A94e32A4B70B748c3a0546E8cc + XT deployed at: 0x4C36C0b10703a787515852AcF50c9b38fFF28965 + GT deployed at: 0xB13c059D0dfA03495e5AFF3630B6924204800CA4 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@08APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0xfc4EF8d5156f06613492821ee65fe94aB6fEc554 + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x7575677dDa5141E48e8FA6239F805F7BAaA8d369 + XT deployed at: 0xeC098c6073EEC06CF5413A40529F6f87491654fd + GT deployed at: 0x27134b09545487Bc06671B3460a05f720F85c117 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@08APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0xdEE71DC2dB65faa883e7a377882C04806Ae5F997 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x80E332b72CFA74a2FE30AaBC4bC270d4BD61F284 + XT deployed at: 0xe2F8adBB49b485AbE63870AF7C30ff68e9b69225 + GT deployed at: 0x45C5E300f5d6bc6e89Ba6A2b8F58c2D30b888EfD + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@08APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x343045EFf770ce642Fe9dFfdAd740fE722E5E6e8 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0x1605FCabd82509b6A511b594E02B783bE1B3FbB0 + XT deployed at: 0xDF16977Cfd5C5Fc828a5D8B638C17D11c92d6B1D + GT deployed at: 0x71fFB93f30D6a214643Cb46408b7b81B8Ee60FDe + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@08APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0xF15E645e8a464C54C3fECbC9e2fFbF5C8F6d77a1 + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x0ccE74Fce4bB2D56b657E16ccf0a632245327805 + XT deployed at: 0x0e9935960FF29bE2C8edC862B6553774E8BE4A9e + GT deployed at: 0x1896c9825802Bd9F365b4FfE97e2190cE29d1957 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@08APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0x4aA92567D7c68E280a45AbEa45b3947D498D5FE6 + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x81c7F765E3f2C9B64aAF13042b160797623c51b9 + XT deployed at: 0x5cc67eB15aAB9e4d7d01D6e98aD0c21524c10775 + GT deployed at: 0xfF3b4D264bcDe80d6ddaA3aCa4DeF91878503279 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@08APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x6D07c731F0025b4071057ecbFd40929F10eEF4fB + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x33290658C3f4F1740E2110C87f4C82B34926f231 + XT deployed at: 0x69F1dEff91b8c65C069a1dbB4534535dE3262f94 + GT deployed at: 0x29ccF28ADe49A75c27c57A266979B428ef4e4f52 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@08APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0xD1e0FF35a365ec1e15f8801F40bE5CD2520D66DA + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xA55AB3f45Aa93B87BC2e534d5962442d76D1DaDe + XT deployed at: 0x417Db6690e4051E722F9D844002bFd9E88b0b595 + GT deployed at: 0xB7ad1ae6d9298F33225442765a479517DA3250eA + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@08APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x0633EA00ca63C953d1B116D484D515f8532f682A + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0xd813405d44Cd63d0b7B913186b5c714A05554034 + XT deployed at: 0xBCD6e330AB69c9F8435A1af90e59831ecd7D7283 + GT deployed at: 0x87Fa5A4E94C9CA57140dA2D8d939C1933F459fe0 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 08APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@08APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 6.807511224 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.117827072809391808 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x6e7cb4195e6a565d8199630ad1aad6fec14c607e, 0x3032da66f091cfbde48f7d3fdc55cf4aaeaf12bf, 0x8799eb4be88da5d150e7102188468eb53a78dc09, 0xdd6b9bc5a48e46446b9df71a35fc4de99040d9d9, 0x91071b54100de31f771e5400fc3a9f9a2277431a, 0xdf4421ff3389474a12ab2cf62a5520badc8fc911, 0x87062b9dfaa8e04af36cec89cdc7875967330a62, 0x2634da53442a678b948fb749c5821ff6d7580971, 0xfae287bc5fe76185b02ac7134de12e5ef9da1e0e, 0xf987ee7dc0221df9bc68bed65c72601276b7586a, 0x03d3276db0655e28938d375e74c1738e2a0e1beb, 0x783f9d6b8bf0881b63beea0877f0273099a8c7fd, 0x9d9750f32276b0cdbaf90e2d7d4df5374d4ce4d7, 0xe1f6b7cb67fb32a94e32a4b70b748c3a0546e8cc, 0x4c36c0b10703a787515852acf50c9b38fff28965, 0xb13c059d0dfa03495e5aff3630b6924204800ca4, 0xfc4ef8d5156f06613492821ee65fe94ab6fec554, 0x7575677dda5141e48e8fa6239f805f7baaa8d369, 0xec098c6073eec06cf5413a40529f6f87491654fd, 0x27134b09545487bc06671b3460a05f720f85c117, 0xdee71dc2db65faa883e7a377882c04806ae5f997, 0x80e332b72cfa74a2fe30aabc4bc270d4bd61f284, 0xe2f8adbb49b485abe63870af7c30ff68e9b69225, 0x45c5e300f5d6bc6e89ba6a2b8f58c2d30b888efd, 0x343045eff770ce642fe9dffdad740fe722e5e6e8, 0x1605fcabd82509b6a511b594e02b783be1b3fbb0, 0xdf16977cfd5c5fc828a5d8b638c17d11c92d6b1d, 0x71ffb93f30d6a214643cb46408b7b81b8ee60fde, 0xf15e645e8a464c54c3fecbc9e2ffbf5c8f6d77a1, 0x0cce74fce4bb2d56b657e16ccf0a632245327805, 0x0e9935960ff29be2c8edc862b6553774e8be4a9e, 0x1896c9825802bd9f365b4ffe97e2190ce29d1957, 0x4aa92567d7c68e280a45abea45b3947d498d5fe6, 0x81c7f765e3f2c9b64aaf13042b160797623c51b9, 0x5cc67eb15aab9e4d7d01d6e98ad0c21524c10775, 0xff3b4d264bcde80d6ddaa3aca4def91878503279, 0x6d07c731f0025b4071057ecbfd40929f10eef4fb, 0x33290658c3f4f1740e2110c87f4c82b34926f231, 0x69f1deff91b8c65c069a1dbb4534535de3262f94, 0x29ccf28ade49a75c27c57a266979b428ef4e4f52, 0xd1e0ff35a365ec1e15f8801f40be5cd2520d66da, 0xa55ab3f45aa93b87bc2e534d5962442d76d1dade, 0x417db6690e4051e722f9d844002bfd9e88b0b595, 0xb7ad1ae6d9298f33225442765a479517da3250ea, 0x0633ea00ca63c953d1b116d484d515f8532f682a, 0xd813405d44cd63d0b7b913186b5c714a05554034, 0xbcd6e330ab69c9f8435a1af90e59831ecd7d7283, 0x87fa5a4e94c9ca57140da2d8d939c1933f459fe0]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-20250408-2000/deploy_markets_test_0402_log.txt b/deployments/eth-mainnet-v1.0.8-20250408-2000/deploy_markets_test_0402_log.txt new file mode 100644 index 0000000..236c256 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250408-2000/deploy_markets_test_0402_log.txt @@ -0,0 +1,370 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Enabled--verify +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175185 + Block timestamp: 1743524099 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22175185 + + ===== Market Info - 0 ===== + Market deployed at: 0x4a20DdEB8696b1f542649626889522068cc19438 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x00B210A7f79653A0fe7e2bc31d6Fe3026421195d + XT deployed at: 0x465c30b940E792262Ef65B7Fe7A5bAd3b5b7f034 + GT deployed at: 0xca3F986978ADEf5aA8e4F9e4F3d27f6f4Eb3f47d + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@02APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xC8c3A49b64dB371F96EdC15941e043966297Ea6b + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x19632ff799BA54B54934b52a89964F6cb12D396f + XT deployed at: 0xe459c64a852Df70Ea7D0cc46142A1a0d8BCd4f2A + GT deployed at: 0x9CEA72e4C7Fd1dd0bb2D0AAF98D756B1f85e096D + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@02APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x54ACdb3da45bBDEb1a53e1E3F6DB51C8384c7F9c + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x3ebabb95e4276DD2850666a95037f5EE3bb798Bb + XT deployed at: 0xb7d4329b11Dff286890F4d7e5b10763E09E8804C + GT deployed at: 0x28C108FD44B2E58DD9B07CBE453c0BCF836b8CB7 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@02APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xf2F9b0fDD5D22e574421A7Ee0E29e410E63C70A9 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x594Db033Ade81E0C8182B66d2B07fbc97452d1FA + XT deployed at: 0x544786112d542910634109BcCEF84C3Deb1b65e0 + GT deployed at: 0x81CAc518B14B28570C667A143F801bF2e05b6BEe + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@02APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x10aCD317ebf3F65e30c72720D89c55B7C68a9628 + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xA03710F73585cb5458F43739624611633Bf24173 + XT deployed at: 0x80525c75690102bb024BcEd8bE81D18A56172EC0 + GT deployed at: 0xe2e5403923B0421FA5a9D28c1012aeAFfc820f02 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@02APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x49913B7Bd178e21FaC84C3dED810Ff4CcDcb8403 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x8CDe48E20b5d77C3ec0fbCbf50d0C78B2DE11264 + XT deployed at: 0x8b596614c9ac30bd9DF615c3C18F0f05a97F0779 + GT deployed at: 0xBA03824B38E83B7CBAF3Fcb5aF02EF8342A110d8 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@02APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x69E1A695Ee24e7BcFc55d2dA7DfD479E4C7Eb6A3 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0xc7d5476d361C8d0E5c0478EA320431AD4a49A558 + XT deployed at: 0xe1710D5449241ce311Bfcefb5272594ECD930ec0 + GT deployed at: 0x4B87E9281de9573f2025565E632bdb8F136766E5 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@02APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0x9dA149D4Bc9eF4e6Eb1D131E837270f76dc62e79 + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD667a61e822564e1399f73196c73B2C41bCBda69 + XT deployed at: 0x2348B91F2037799d6AE604D792101534461DB06E + GT deployed at: 0x1aE5482Db2883e1ae8CDBFDbaE95539266F1bF32 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@02APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0x9cde69Ea28c9125060F86eB982305BafaE57f585 + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x4bDD2b0f934EECCE01A8Fc47E3762Ce86C9D061F + XT deployed at: 0x63B96518024b49C8F16104fDFd9d94a79A3d185C + GT deployed at: 0xa78bE568bc5ec42C8E41734dADcb86D3dde73af3 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@02APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x565656a354F6C2953EB2D00DC7e2e0Ab815e19E7 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x1184866Ed937F4605efc100c1f18E028F7CBDD86 + XT deployed at: 0x3F56b53953adf3a65f5Bb8E8Dce1C4926e1D629c + GT deployed at: 0x315f180e74247E01ca0377244Eb6b6D1c7444452 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@02APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x0ed76A80D639E7Bf88524b63429bB841c1633E60 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD4771df4a0f6338f521512A1651D8DB7EF5Af633 + XT deployed at: 0x4bbc10317e5b70B6B491836F5B2b496EE35f5E31 + GT deployed at: 0xFF601c3788236F231a8771cACBbB3087D0Ee7A2c + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@02APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x8c07c10a0a3530a9fB64c65f109A32F7B4b2DB80 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x0469A60F8fbc0c35c4D1D965a50A6Bd29c9dAB8C + XT deployed at: 0xE292927A017d58823957A83ea5EFeAF9C37D6F94 + GT deployed at: 0x7AdE4961Fccba087E8b4De84E8be61098Daf0230 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@02APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 5.079885262 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.087924645429718704 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x4a20ddeb8696b1f542649626889522068cc19438, 0x00b210a7f79653a0fe7e2bc31d6fe3026421195d, 0x465c30b940e792262ef65b7fe7a5bad3b5b7f034, 0xca3f986978adef5aa8e4f9e4f3d27f6f4eb3f47d, 0xc8c3a49b64db371f96edc15941e043966297ea6b, 0x19632ff799ba54b54934b52a89964f6cb12d396f, 0xe459c64a852df70ea7d0cc46142a1a0d8bcd4f2a, 0x9cea72e4c7fd1dd0bb2d0aaf98d756b1f85e096d, 0x54acdb3da45bbdeb1a53e1e3f6db51c8384c7f9c, 0x3ebabb95e4276dd2850666a95037f5ee3bb798bb, 0xb7d4329b11dff286890f4d7e5b10763e09e8804c, 0x28c108fd44b2e58dd9b07cbe453c0bcf836b8cb7, 0xf2f9b0fdd5d22e574421a7ee0e29e410e63c70a9, 0x594db033ade81e0c8182b66d2b07fbc97452d1fa, 0x544786112d542910634109bccef84c3deb1b65e0, 0x81cac518b14b28570c667a143f801bf2e05b6bee, 0x10acd317ebf3f65e30c72720d89c55b7c68a9628, 0xa03710f73585cb5458f43739624611633bf24173, 0x80525c75690102bb024bced8be81d18a56172ec0, 0xe2e5403923b0421fa5a9d28c1012aeaffc820f02, 0x49913b7bd178e21fac84c3ded810ff4ccdcb8403, 0x8cde48e20b5d77c3ec0fbcbf50d0c78b2de11264, 0x8b596614c9ac30bd9df615c3c18f0f05a97f0779, 0xba03824b38e83b7cbaf3fcb5af02ef8342a110d8, 0x69e1a695ee24e7bcfc55d2da7dfd479e4c7eb6a3, 0xc7d5476d361c8d0e5c0478ea320431ad4a49a558, 0xe1710d5449241ce311bfcefb5272594ecd930ec0, 0x4b87e9281de9573f2025565e632bdb8f136766e5, 0x9da149d4bc9ef4e6eb1d131e837270f76dc62e79, 0xd667a61e822564e1399f73196c73b2c41bcbda69, 0x2348b91f2037799d6ae604d792101534461db06e, 0x1ae5482db2883e1ae8cdbfdbae95539266f1bf32, 0x9cde69ea28c9125060f86eb982305bafae57f585, 0x4bdd2b0f934eecce01a8fc47e3762ce86c9d061f, 0x63b96518024b49c8f16104fdfd9d94a79a3d185c, 0xa78be568bc5ec42c8e41734dadcb86d3dde73af3, 0x565656a354f6c2953eb2d00dc7e2e0ab815e19e7, 0x1184866ed937f4605efc100c1f18e028f7cbdd86, 0x3f56b53953adf3a65f5bb8e8dce1c4926e1d629c, 0x315f180e74247e01ca0377244eb6b6d1c7444452, 0x0ed76a80d639e7bf88524b63429bb841c1633e60, 0xd4771df4a0f6338f521512a1651d8db7ef5af633, 0x4bbc10317e5b70b6b491836f5b2b496ee35f5e31, 0xff601c3788236f231a8771cacbbb3087d0ee7a2c, 0x8c07c10a0a3530a9fb64c65f109a32f7b4b2db80, 0x0469a60f8fbc0c35c4d1d965a50a6bd29c9dab8c, 0xe292927a017d58823957a83ea5efeaf9c37d6f94, 0x7ade4961fccba087e8b4de84e8be61098daf0230]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-access-manager.json b/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-access-manager.json new file mode 100644 index 0000000..a1a5b6a --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743155675", + "gitBranch": "deploy/v1.0.5", + "gitCommitHash": "0x0x65c418860c22aecb27054e7a8c3207a4f87ad6af", + "blockInfo": { + "number": "22144647", + "timestamp": "1743155675" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-core.json b/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-core.json new file mode 100644 index 0000000..34b5474 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743518639", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x30f0c30e4edf518e2bf6700837dad2a7624d35df", + "blockInfo": { + "number": "22174730", + "timestamp": "1743518639" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x37Ba9934aAbA7a49cC29d0952C6a91d7c7043dbc", + "vaultFactory": "0x01D8C1e0584751085a876892151Bf8490e862E3E", + "oracleAggregator": "0xE3a31690392E8E18DC3d862651C079339E2c1ADE", + "router": "0xC47591F5c023e44931c78D5A993834875b79FB11", + "swapAdapter": { + "uniswapV3Adapter": "0x34F7b52b0d33959C8351eF95F3523C89b6123C0b", + "odosV2Adapter": "0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779", + "pendleSwapV3Adapter": "0x0B30251FA697A39Fd41813b267b50F03414E82da", + "ERC4626VaultAdapter": "0x85ce30537c14EFB66B673f284bEa7c28351244F6" + }, + "marketViewer": "0x74Dfb95Ae623123ecf82Ba841985fB460bB9d45D" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@08APR2025.json b/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@08APR2025.json new file mode 100644 index 0000000..435c5d8 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214462", + "timestamp": "1743997931" + }, + "market": "0x9d9750F32276B0CDBAF90E2d7D4dF5374D4Ce4D7", + "collateral": { + "address": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "symbol": "PT-sUSDE-29MAY2025", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xE1F6b7Cb67FB32A94e32A4B70B748c3a0546E8cc", + "xt": "0x4C36C0b10703a787515852AcF50c9b38fFF28965", + "gt": "0xB13c059D0dfA03495e5AFF3630B6924204800CA4" + }, + "config": { + "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-USDC-USUALUSDC+@08APR2025.json b/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-USDC-USUALUSDC+@08APR2025.json new file mode 100644 index 0000000..d1789ae --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-USDC-USUALUSDC+@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214462", + "timestamp": "1743997931" + }, + "market": "0xfc4EF8d5156f06613492821ee65fe94aB6fEc554", + "collateral": { + "address": "0xd63070114470f685b75B74D60EEc7c1113d33a3D", + "symbol": "USUALUSDC+", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x7575677dDa5141E48e8FA6239F805F7BAaA8d369", + "xt": "0xeC098c6073EEC06CF5413A40529F6f87491654fd", + "gt": "0x27134b09545487Bc06671B3460a05f720F85c117" + }, + "config": { + "marketSymbol": "USDC/USUALUSDC+@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-USDC-WBTC@08APR2025.json b/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-USDC-WBTC@08APR2025.json new file mode 100644 index 0000000..e4142f7 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-USDC-WBTC@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214462", + "timestamp": "1743997931" + }, + "market": "0x6D07c731F0025b4071057ecbFd40929F10eEF4fB", + "collateral": { + "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "symbol": "WBTC", + "priceFeed": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x33290658C3f4F1740E2110C87f4C82B34926f231", + "xt": "0x69F1dEff91b8c65C069a1dbB4534535dE3262f94", + "gt": "0x29ccF28ADe49A75c27c57A266979B428ef4e4f52" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-USDC-cbBTC@08APR2025.json b/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-USDC-cbBTC@08APR2025.json new file mode 100644 index 0000000..5b5fd3a --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-USDC-cbBTC@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214462", + "timestamp": "1743997931" + }, + "market": "0xD1e0FF35a365ec1e15f8801F40bE5CD2520D66DA", + "collateral": { + "address": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", + "symbol": "cbBTC", + "priceFeed": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xA55AB3f45Aa93B87BC2e534d5962442d76D1DaDe", + "xt": "0x417Db6690e4051E722F9D844002bFd9E88b0b595", + "gt": "0xB7ad1ae6d9298F33225442765a479517DA3250eA" + }, + "config": { + "marketSymbol": "USDC/cbBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-USDC-eUSDe@08APR2025.json b/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-USDC-eUSDe@08APR2025.json new file mode 100644 index 0000000..66c510b --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-USDC-eUSDe@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214462", + "timestamp": "1743997931" + }, + "market": "0xF15E645e8a464C54C3fECbC9e2fFbF5C8F6d77a1", + "collateral": { + "address": "0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F", + "symbol": "eUSDe", + "priceFeed": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x0ccE74Fce4bB2D56b657E16ccf0a632245327805", + "xt": "0x0e9935960FF29bE2C8edC862B6553774E8BE4A9e", + "gt": "0x1896c9825802Bd9F365b4FfE97e2190cE29d1957" + }, + "config": { + "marketSymbol": "USDC/eUSDe@29MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-USDC-sUSDe@08APR2025.json b/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-USDC-sUSDe@08APR2025.json new file mode 100644 index 0000000..1818800 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-USDC-sUSDe@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214462", + "timestamp": "1743997931" + }, + "market": "0xfAE287BC5fe76185b02ac7134de12e5ef9da1e0e", + "collateral": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xf987eE7dc0221dF9bC68beD65c72601276B7586a", + "xt": "0x03D3276DB0655e28938D375E74C1738E2A0e1beb", + "gt": "0x783F9d6B8bF0881b63BEea0877f0273099A8C7Fd" + }, + "config": { + "marketSymbol": "USDC/sUSDe@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-USDC-wstETH@08APR2025.json b/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-USDC-wstETH@08APR2025.json new file mode 100644 index 0000000..79de7f2 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-USDC-wstETH@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214462", + "timestamp": "1743997931" + }, + "market": "0x91071b54100DE31F771e5400Fc3a9F9A2277431a", + "collateral": { + "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xdF4421fF3389474a12Ab2cF62a5520BaDC8fC911", + "xt": "0x87062B9DFaa8E04aF36ceC89Cdc7875967330a62", + "gt": "0x2634dA53442A678B948fb749c5821Ff6d7580971" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-WETH-MCwETH@08APR2025.json b/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-WETH-MCwETH@08APR2025.json new file mode 100644 index 0000000..65316d1 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-WETH-MCwETH@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214462", + "timestamp": "1743997931" + }, + "market": "0xdEE71DC2dB65faa883e7a377882C04806Ae5F997", + "collateral": { + "address": "0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8", + "symbol": "MCwETH", + "priceFeed": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x80E332b72CFA74a2FE30AaBC4bC270d4BD61F284", + "xt": "0xe2F8adBB49b485AbE63870AF7C30ff68e9b69225", + "gt": "0x45C5E300f5d6bc6e89Ba6A2b8F58c2D30b888EfD" + }, + "config": { + "marketSymbol": "WETH/MCwETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-WETH-gtWETH@08APR2025.json b/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-WETH-gtWETH@08APR2025.json new file mode 100644 index 0000000..5d95304 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-WETH-gtWETH@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214462", + "timestamp": "1743997931" + }, + "market": "0x0633EA00ca63C953d1B116D484D515f8532f682A", + "collateral": { + "address": "0x2371e134e3455e0593363cBF89d3b6cf53740618", + "symbol": "gtWETH", + "priceFeed": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xd813405d44Cd63d0b7B913186b5c714A05554034", + "xt": "0xBCD6e330AB69c9F8435A1af90e59831ecd7D7283", + "gt": "0x87Fa5A4E94C9CA57140dA2D8d939C1933F459fe0" + }, + "config": { + "marketSymbol": "WETH/gtWETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-WETH-pufETH@08APR2025.json b/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-WETH-pufETH@08APR2025.json new file mode 100644 index 0000000..0da99fe --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-WETH-pufETH@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214462", + "timestamp": "1743997931" + }, + "market": "0x4aA92567D7c68E280a45AbEa45b3947D498D5FE6", + "collateral": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x81c7F765E3f2C9B64aAF13042b160797623c51b9", + "xt": "0x5cc67eB15aAB9e4d7d01D6e98aD0c21524c10775", + "gt": "0xfF3b4D264bcDe80d6ddaA3aCa4DeF91878503279" + }, + "config": { + "marketSymbol": "WETH/pufETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-WETH-weETH@08APR2025.json b/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-WETH-weETH@08APR2025.json new file mode 100644 index 0000000..480f0b8 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-WETH-weETH@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214462", + "timestamp": "1743997931" + }, + "market": "0x6e7cb4195e6A565D8199630ad1AAd6FEc14c607E", + "collateral": { + "address": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "21600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x3032Da66f091CfBdE48f7d3FdC55cf4aaeAF12Bf", + "xt": "0x8799eB4bE88da5d150e7102188468eb53A78DC09", + "gt": "0xDD6b9BC5a48e46446B9df71A35fc4de99040d9D9" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@08APR2025.json b/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@08APR2025.json new file mode 100644 index 0000000..863e8a9 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250408-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@08APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214462", + "timestamp": "1743997931" + }, + "market": "0x343045EFf770ce642Fe9dFfdAd740fE722E5E6e8", + "collateral": { + "address": "0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D", + "symbol": "PT-pufETH-26JUN2025", + "priceFeed": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x1605FCabd82509b6A511b594E02B783bE1B3FbB0", + "xt": "0xDF16977Cfd5C5Fc828a5D8B638C17D11c92d6B1D", + "gt": "0x71fFB93f30D6a214643Cb46408b7b81B8Ee60FDe" + }, + "config": { + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "08APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250409-1400/deploy-eth-mainnet-oracle-aggregator-0401-log.txt b/deployments/eth-mainnet-v1.0.8-20250409-1400/deploy-eth-mainnet-oracle-aggregator-0401-log.txt new file mode 100644 index 0000000..81ca312 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250409-1400/deploy-eth-mainnet-oracle-aggregator-0401-log.txt @@ -0,0 +1,21 @@ +== Logs == + Network: eth-mainnet + Deployer balance: 158879257545733090 + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175070 + Block timestamp: 1743522719 + + ===== Oracle Aggregator Info ===== + Deployer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Admin: 0x8409a9C1A911CED491892c5694E43994c9d47E8f + Oracle Aggregator deployed at: 0xE3a31690392E8E18DC3d862651C079339E2c1ADE + Oracle Timelock: 43200 + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250409-1400/deploy-market-eth-mainnet-20250409-1400-log.txt b/deployments/eth-mainnet-v1.0.8-20250409-1400/deploy-market-eth-mainnet-20250409-1400-log.txt new file mode 100644 index 0000000..9be17b6 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250409-1400/deploy-market-eth-mainnet-20250409-1400-log.txt @@ -0,0 +1,368 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ETHERSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0x5a059d3a272b20ad129ffbe37b9903a61a03595e + + ===== Block Info ===== + Block number: 22214508 + Block timestamp: 1743998495 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22214508 + + ===== Market Info - 0 ===== + Market deployed at: 0x81bfB882FC53B2BEe8665e8e038F1b5dAD668152 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x99607D36aBa4C4B1b3fAD5a53c59dc7BD5690C44 + XT deployed at: 0xd9f1F61ED6331003cf7af06a9049A36eB436b61e + GT deployed at: 0x8bf877dab38cBAFa4eAB1d182f0d0F5B0C1373B0 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@09APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xFEf50aE2Ecf1C9360A1E4401e73349F69Bd82937 + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x02aacc1CCe8209bd11BA9bBd85c35f5deeCC6fF7 + XT deployed at: 0x07474286f52c7798B8c5Af3350fc1cd1c7e817b7 + GT deployed at: 0xEc6e6eD60588598FDEE32907BF8390Bc95122C22 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@09APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0xDe37D78dD580E1c032666F0bc4cf6C6687FFBb06 + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x6c897E423a36712a18f00096e33252306EB86E0F + XT deployed at: 0x7f86776a080521d770454Fb4d09353e8FB7A5B96 + GT deployed at: 0x009C06aD4208fC9Bf91dAf3E2f8D26b889f80d58 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@09APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0x1A6Ce72390A88f0d31e433c6AacE331c5efF9780 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x017756bfb727adf566cEf4A344683314194E5533 + XT deployed at: 0x84607274D60cFe12f8c78502148Fc33c5707Bb7B + GT deployed at: 0xD1Cf5D4e051334b7992690cFC83f3651E8EBA310 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@09APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0xF7c68B682D3171432eab59278950863De35f239d + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x31A9CFB870E3A12B26312D53Ba18585901a4E63a + XT deployed at: 0x9231B31f1d94b009F3Eb8FCBcc8E175BAA1A6B4D + GT deployed at: 0xd1415aF85Ba1ab247a87f0EE5bd3eeee7c3B4A39 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@09APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x035Ef165eBF6607BCb772FD483115889F8E2f0eF + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x91DEa6e3Cfa762FAaA6337712C083ed9722b1665 + XT deployed at: 0xaFe279F0cBB46B5beB89959bb79d1E3b13Bc4435 + GT deployed at: 0x241d27c65eF0aaD6d8096E9DC3B35b33B8b3bAc6 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@09APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x485D886748E3a0CD84904bbf436B3Be77037Ba56 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0x4Fd9B96E8Ff22957305eeE69A6A2841eFc1A0682 + XT deployed at: 0xc236Dcc5dF373E1330D519EC71673D05465288fF + GT deployed at: 0xC34c3fcB6305c2228DA8EF9c402b475Aff07BDf4 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@09APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0x1930F3ae7144dA4075cF23e3115636b2296ad568 + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x5D7269570666400D891e575145D2532C8Ba0a83c + XT deployed at: 0x36Ed1d58f01cCf3d1B323F2721DcC6aE71FD7287 + GT deployed at: 0x9562dE84913aB4a18f17ec83b82c3BD195BF92e0 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@09APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0xefea0bAcd45416728460443019dCCF89c009a6C0 + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x1c1303b9FebE8478F9C77DD0d739eA670D37FAA4 + XT deployed at: 0xad201CF6874F7839b0FE66a69d46DF2970a4059F + GT deployed at: 0x42C64BE1C1c24bCe5BC40444Cb00765789ddaf05 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@09APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x29286e025C433D75262F0232e37C6403eeF5763D + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x5f68Cc09418DAe5C64340E506E0B86254E3010b3 + XT deployed at: 0x57C3Fb7D2397e769652A30A01fC7D71b418EC608 + GT deployed at: 0xa199cEc12E02a9e7Ec761cD78C32b58f7f8A4dAd + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@09APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x1dD72578D0B5085Ca1dC9575AE921415D9041939 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x904Dd3E2117d754389c22BB91C2894f747A34E60 + XT deployed at: 0xF91CCB59a8350963CBdc1eF6DFFdE35D87869567 + GT deployed at: 0xd99986A4a62aF578220d66FFE759a47D9cC28000 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@09APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0xE68F0cCeC52bF850C11c51f31d1a103E02D87a36 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x64d99D2dD7d9bd204668e39be174B00ab0A59933 + XT deployed at: 0x7A504c315070476bCD73a358b081f388Cb189e87 + GT deployed at: 0x721CCF70e2b126D3cdB2DF8eA3e04e5576AE24a3 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@09APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 5.647008366 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.097740634426007472 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x81bfb882fc53b2bee8665e8e038f1b5dad668152, 0x99607d36aba4c4b1b3fad5a53c59dc7bd5690c44, 0xd9f1f61ed6331003cf7af06a9049a36eb436b61e, 0x8bf877dab38cbafa4eab1d182f0d0f5b0c1373b0, 0xfef50ae2ecf1c9360a1e4401e73349f69bd82937, 0x02aacc1cce8209bd11ba9bbd85c35f5deecc6ff7, 0x07474286f52c7798b8c5af3350fc1cd1c7e817b7, 0xec6e6ed60588598fdee32907bf8390bc95122c22, 0xde37d78dd580e1c032666f0bc4cf6c6687ffbb06, 0x6c897e423a36712a18f00096e33252306eb86e0f, 0x7f86776a080521d770454fb4d09353e8fb7a5b96, 0x009c06ad4208fc9bf91daf3e2f8d26b889f80d58, 0x1a6ce72390a88f0d31e433c6aace331c5eff9780, 0x017756bfb727adf566cef4a344683314194e5533, 0x84607274d60cfe12f8c78502148fc33c5707bb7b, 0xd1cf5d4e051334b7992690cfc83f3651e8eba310, 0xf7c68b682d3171432eab59278950863de35f239d, 0x31a9cfb870e3a12b26312d53ba18585901a4e63a, 0x9231b31f1d94b009f3eb8fcbcc8e175baa1a6b4d, 0xd1415af85ba1ab247a87f0ee5bd3eeee7c3b4a39, 0x035ef165ebf6607bcb772fd483115889f8e2f0ef, 0x91dea6e3cfa762faaa6337712c083ed9722b1665, 0xafe279f0cbb46b5beb89959bb79d1e3b13bc4435, 0x241d27c65ef0aad6d8096e9dc3b35b33b8b3bac6, 0x485d886748e3a0cd84904bbf436b3be77037ba56, 0x4fd9b96e8ff22957305eee69a6a2841efc1a0682, 0xc236dcc5df373e1330d519ec71673d05465288ff, 0xc34c3fcb6305c2228da8ef9c402b475aff07bdf4, 0x1930f3ae7144da4075cf23e3115636b2296ad568, 0x5d7269570666400d891e575145d2532c8ba0a83c, 0x36ed1d58f01ccf3d1b323f2721dcc6ae71fd7287, 0x9562de84913ab4a18f17ec83b82c3bd195bf92e0, 0xefea0bacd45416728460443019dccf89c009a6c0, 0x1c1303b9febe8478f9c77dd0d739ea670d37faa4, 0xad201cf6874f7839b0fe66a69d46df2970a4059f, 0x42c64be1c1c24bce5bc40444cb00765789ddaf05, 0x29286e025c433d75262f0232e37c6403eef5763d, 0x5f68cc09418dae5c64340e506e0b86254e3010b3, 0x57c3fb7d2397e769652a30a01fc7d71b418ec608, 0xa199cec12e02a9e7ec761cd78c32b58f7f8a4dad, 0x1dd72578d0b5085ca1dc9575ae921415d9041939, 0x904dd3e2117d754389c22bb91c2894f747a34e60, 0xf91ccb59a8350963cbdc1ef6dffde35d87869567, 0xd99986a4a62af578220d66ffe759a47d9cc28000, 0xe68f0ccec52bf850c11c51f31d1a103e02d87a36, 0x64d99d2dd7d9bd204668e39be174b00ab0a59933, 0x7a504c315070476bcd73a358b081f388cb189e87, 0x721ccf70e2b126d3cdb2df8ea3e04e5576ae24a3]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-20250409-1400/deploy_markets_test_0402_log.txt b/deployments/eth-mainnet-v1.0.8-20250409-1400/deploy_markets_test_0402_log.txt new file mode 100644 index 0000000..236c256 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250409-1400/deploy_markets_test_0402_log.txt @@ -0,0 +1,370 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Enabled--verify +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175185 + Block timestamp: 1743524099 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22175185 + + ===== Market Info - 0 ===== + Market deployed at: 0x4a20DdEB8696b1f542649626889522068cc19438 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x00B210A7f79653A0fe7e2bc31d6Fe3026421195d + XT deployed at: 0x465c30b940E792262Ef65B7Fe7A5bAd3b5b7f034 + GT deployed at: 0xca3F986978ADEf5aA8e4F9e4F3d27f6f4Eb3f47d + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@02APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xC8c3A49b64dB371F96EdC15941e043966297Ea6b + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x19632ff799BA54B54934b52a89964F6cb12D396f + XT deployed at: 0xe459c64a852Df70Ea7D0cc46142A1a0d8BCd4f2A + GT deployed at: 0x9CEA72e4C7Fd1dd0bb2D0AAF98D756B1f85e096D + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@02APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x54ACdb3da45bBDEb1a53e1E3F6DB51C8384c7F9c + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x3ebabb95e4276DD2850666a95037f5EE3bb798Bb + XT deployed at: 0xb7d4329b11Dff286890F4d7e5b10763E09E8804C + GT deployed at: 0x28C108FD44B2E58DD9B07CBE453c0BCF836b8CB7 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@02APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xf2F9b0fDD5D22e574421A7Ee0E29e410E63C70A9 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x594Db033Ade81E0C8182B66d2B07fbc97452d1FA + XT deployed at: 0x544786112d542910634109BcCEF84C3Deb1b65e0 + GT deployed at: 0x81CAc518B14B28570C667A143F801bF2e05b6BEe + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@02APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x10aCD317ebf3F65e30c72720D89c55B7C68a9628 + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xA03710F73585cb5458F43739624611633Bf24173 + XT deployed at: 0x80525c75690102bb024BcEd8bE81D18A56172EC0 + GT deployed at: 0xe2e5403923B0421FA5a9D28c1012aeAFfc820f02 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@02APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x49913B7Bd178e21FaC84C3dED810Ff4CcDcb8403 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x8CDe48E20b5d77C3ec0fbCbf50d0C78B2DE11264 + XT deployed at: 0x8b596614c9ac30bd9DF615c3C18F0f05a97F0779 + GT deployed at: 0xBA03824B38E83B7CBAF3Fcb5aF02EF8342A110d8 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@02APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x69E1A695Ee24e7BcFc55d2dA7DfD479E4C7Eb6A3 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0xc7d5476d361C8d0E5c0478EA320431AD4a49A558 + XT deployed at: 0xe1710D5449241ce311Bfcefb5272594ECD930ec0 + GT deployed at: 0x4B87E9281de9573f2025565E632bdb8F136766E5 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@02APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0x9dA149D4Bc9eF4e6Eb1D131E837270f76dc62e79 + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD667a61e822564e1399f73196c73B2C41bCBda69 + XT deployed at: 0x2348B91F2037799d6AE604D792101534461DB06E + GT deployed at: 0x1aE5482Db2883e1ae8CDBFDbaE95539266F1bF32 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@02APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0x9cde69Ea28c9125060F86eB982305BafaE57f585 + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x4bDD2b0f934EECCE01A8Fc47E3762Ce86C9D061F + XT deployed at: 0x63B96518024b49C8F16104fDFd9d94a79A3d185C + GT deployed at: 0xa78bE568bc5ec42C8E41734dADcb86D3dde73af3 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@02APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x565656a354F6C2953EB2D00DC7e2e0Ab815e19E7 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x1184866Ed937F4605efc100c1f18E028F7CBDD86 + XT deployed at: 0x3F56b53953adf3a65f5Bb8E8Dce1C4926e1D629c + GT deployed at: 0x315f180e74247E01ca0377244Eb6b6D1c7444452 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@02APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x0ed76A80D639E7Bf88524b63429bB841c1633E60 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD4771df4a0f6338f521512A1651D8DB7EF5Af633 + XT deployed at: 0x4bbc10317e5b70B6B491836F5B2b496EE35f5E31 + GT deployed at: 0xFF601c3788236F231a8771cACBbB3087D0Ee7A2c + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@02APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x8c07c10a0a3530a9fB64c65f109A32F7B4b2DB80 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x0469A60F8fbc0c35c4D1D965a50A6Bd29c9dAB8C + XT deployed at: 0xE292927A017d58823957A83ea5EFeAF9C37D6F94 + GT deployed at: 0x7AdE4961Fccba087E8b4De84E8be61098Daf0230 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@02APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 5.079885262 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.087924645429718704 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x4a20ddeb8696b1f542649626889522068cc19438, 0x00b210a7f79653a0fe7e2bc31d6fe3026421195d, 0x465c30b940e792262ef65b7fe7a5bad3b5b7f034, 0xca3f986978adef5aa8e4f9e4f3d27f6f4eb3f47d, 0xc8c3a49b64db371f96edc15941e043966297ea6b, 0x19632ff799ba54b54934b52a89964f6cb12d396f, 0xe459c64a852df70ea7d0cc46142a1a0d8bcd4f2a, 0x9cea72e4c7fd1dd0bb2d0aaf98d756b1f85e096d, 0x54acdb3da45bbdeb1a53e1e3f6db51c8384c7f9c, 0x3ebabb95e4276dd2850666a95037f5ee3bb798bb, 0xb7d4329b11dff286890f4d7e5b10763e09e8804c, 0x28c108fd44b2e58dd9b07cbe453c0bcf836b8cb7, 0xf2f9b0fdd5d22e574421a7ee0e29e410e63c70a9, 0x594db033ade81e0c8182b66d2b07fbc97452d1fa, 0x544786112d542910634109bccef84c3deb1b65e0, 0x81cac518b14b28570c667a143f801bf2e05b6bee, 0x10acd317ebf3f65e30c72720d89c55b7c68a9628, 0xa03710f73585cb5458f43739624611633bf24173, 0x80525c75690102bb024bced8be81d18a56172ec0, 0xe2e5403923b0421fa5a9d28c1012aeaffc820f02, 0x49913b7bd178e21fac84c3ded810ff4ccdcb8403, 0x8cde48e20b5d77c3ec0fbcbf50d0c78b2de11264, 0x8b596614c9ac30bd9df615c3c18f0f05a97f0779, 0xba03824b38e83b7cbaf3fcb5af02ef8342a110d8, 0x69e1a695ee24e7bcfc55d2da7dfd479e4c7eb6a3, 0xc7d5476d361c8d0e5c0478ea320431ad4a49a558, 0xe1710d5449241ce311bfcefb5272594ecd930ec0, 0x4b87e9281de9573f2025565e632bdb8f136766e5, 0x9da149d4bc9ef4e6eb1d131e837270f76dc62e79, 0xd667a61e822564e1399f73196c73b2c41bcbda69, 0x2348b91f2037799d6ae604d792101534461db06e, 0x1ae5482db2883e1ae8cdbfdbae95539266f1bf32, 0x9cde69ea28c9125060f86eb982305bafae57f585, 0x4bdd2b0f934eecce01a8fc47e3762ce86c9d061f, 0x63b96518024b49c8f16104fdfd9d94a79a3d185c, 0xa78be568bc5ec42c8e41734dadcb86d3dde73af3, 0x565656a354f6c2953eb2d00dc7e2e0ab815e19e7, 0x1184866ed937f4605efc100c1f18e028f7cbdd86, 0x3f56b53953adf3a65f5bb8e8dce1c4926e1d629c, 0x315f180e74247e01ca0377244eb6b6d1c7444452, 0x0ed76a80d639e7bf88524b63429bb841c1633e60, 0xd4771df4a0f6338f521512a1651d8db7ef5af633, 0x4bbc10317e5b70b6b491836f5b2b496ee35f5e31, 0xff601c3788236f231a8771cacbbb3087d0ee7a2c, 0x8c07c10a0a3530a9fb64c65f109a32f7b4b2db80, 0x0469a60f8fbc0c35c4d1d965a50a6bd29c9dab8c, 0xe292927a017d58823957a83ea5efeaf9c37d6f94, 0x7ade4961fccba087e8b4de84e8be61098daf0230]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-access-manager.json b/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-access-manager.json new file mode 100644 index 0000000..a1a5b6a --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743155675", + "gitBranch": "deploy/v1.0.5", + "gitCommitHash": "0x0x65c418860c22aecb27054e7a8c3207a4f87ad6af", + "blockInfo": { + "number": "22144647", + "timestamp": "1743155675" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-core.json b/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-core.json new file mode 100644 index 0000000..34b5474 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743518639", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x30f0c30e4edf518e2bf6700837dad2a7624d35df", + "blockInfo": { + "number": "22174730", + "timestamp": "1743518639" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x37Ba9934aAbA7a49cC29d0952C6a91d7c7043dbc", + "vaultFactory": "0x01D8C1e0584751085a876892151Bf8490e862E3E", + "oracleAggregator": "0xE3a31690392E8E18DC3d862651C079339E2c1ADE", + "router": "0xC47591F5c023e44931c78D5A993834875b79FB11", + "swapAdapter": { + "uniswapV3Adapter": "0x34F7b52b0d33959C8351eF95F3523C89b6123C0b", + "odosV2Adapter": "0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779", + "pendleSwapV3Adapter": "0x0B30251FA697A39Fd41813b267b50F03414E82da", + "ERC4626VaultAdapter": "0x85ce30537c14EFB66B673f284bEa7c28351244F6" + }, + "marketViewer": "0x74Dfb95Ae623123ecf82Ba841985fB460bB9d45D" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@09APR2025.json b/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@09APR2025.json new file mode 100644 index 0000000..498e15b --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214508", + "timestamp": "1743998495" + }, + "market": "0x1A6Ce72390A88f0d31e433c6AacE331c5efF9780", + "collateral": { + "address": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "symbol": "PT-sUSDE-29MAY2025", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x017756bfb727adf566cEf4A344683314194E5533", + "xt": "0x84607274D60cFe12f8c78502148Fc33c5707Bb7B", + "gt": "0xD1Cf5D4e051334b7992690cFC83f3651E8EBA310" + }, + "config": { + "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-USDC-USUALUSDC+@09APR2025.json b/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-USDC-USUALUSDC+@09APR2025.json new file mode 100644 index 0000000..997e739 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-USDC-USUALUSDC+@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214508", + "timestamp": "1743998495" + }, + "market": "0xF7c68B682D3171432eab59278950863De35f239d", + "collateral": { + "address": "0xd63070114470f685b75B74D60EEc7c1113d33a3D", + "symbol": "USUALUSDC+", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x31A9CFB870E3A12B26312D53Ba18585901a4E63a", + "xt": "0x9231B31f1d94b009F3Eb8FCBcc8E175BAA1A6B4D", + "gt": "0xd1415aF85Ba1ab247a87f0EE5bd3eeee7c3B4A39" + }, + "config": { + "marketSymbol": "USDC/USUALUSDC+@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-USDC-WBTC@09APR2025.json b/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-USDC-WBTC@09APR2025.json new file mode 100644 index 0000000..0491aed --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-USDC-WBTC@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214508", + "timestamp": "1743998495" + }, + "market": "0x29286e025C433D75262F0232e37C6403eeF5763D", + "collateral": { + "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "symbol": "WBTC", + "priceFeed": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x5f68Cc09418DAe5C64340E506E0B86254E3010b3", + "xt": "0x57C3Fb7D2397e769652A30A01fC7D71b418EC608", + "gt": "0xa199cEc12E02a9e7Ec761cD78C32b58f7f8A4dAd" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-USDC-cbBTC@09APR2025.json b/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-USDC-cbBTC@09APR2025.json new file mode 100644 index 0000000..daf9aed --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-USDC-cbBTC@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214508", + "timestamp": "1743998495" + }, + "market": "0x1dD72578D0B5085Ca1dC9575AE921415D9041939", + "collateral": { + "address": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", + "symbol": "cbBTC", + "priceFeed": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x904Dd3E2117d754389c22BB91C2894f747A34E60", + "xt": "0xF91CCB59a8350963CBdc1eF6DFFdE35D87869567", + "gt": "0xd99986A4a62aF578220d66FFE759a47D9cC28000" + }, + "config": { + "marketSymbol": "USDC/cbBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-USDC-eUSDe@09APR2025.json b/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-USDC-eUSDe@09APR2025.json new file mode 100644 index 0000000..6db0ede --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-USDC-eUSDe@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214508", + "timestamp": "1743998495" + }, + "market": "0x1930F3ae7144dA4075cF23e3115636b2296ad568", + "collateral": { + "address": "0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F", + "symbol": "eUSDe", + "priceFeed": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x5D7269570666400D891e575145D2532C8Ba0a83c", + "xt": "0x36Ed1d58f01cCf3d1B323F2721DcC6aE71FD7287", + "gt": "0x9562dE84913aB4a18f17ec83b82c3BD195BF92e0" + }, + "config": { + "marketSymbol": "USDC/eUSDe@29MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-USDC-sUSDe@09APR2025.json b/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-USDC-sUSDe@09APR2025.json new file mode 100644 index 0000000..fc1d5f4 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-USDC-sUSDe@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214508", + "timestamp": "1743998495" + }, + "market": "0xDe37D78dD580E1c032666F0bc4cf6C6687FFBb06", + "collateral": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x6c897E423a36712a18f00096e33252306EB86E0F", + "xt": "0x7f86776a080521d770454Fb4d09353e8FB7A5B96", + "gt": "0x009C06aD4208fC9Bf91dAf3E2f8D26b889f80d58" + }, + "config": { + "marketSymbol": "USDC/sUSDe@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-USDC-wstETH@09APR2025.json b/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-USDC-wstETH@09APR2025.json new file mode 100644 index 0000000..b4a442d --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-USDC-wstETH@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214508", + "timestamp": "1743998495" + }, + "market": "0xFEf50aE2Ecf1C9360A1E4401e73349F69Bd82937", + "collateral": { + "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x02aacc1CCe8209bd11BA9bBd85c35f5deeCC6fF7", + "xt": "0x07474286f52c7798B8c5Af3350fc1cd1c7e817b7", + "gt": "0xEc6e6eD60588598FDEE32907BF8390Bc95122C22" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-WETH-MCwETH@09APR2025.json b/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-WETH-MCwETH@09APR2025.json new file mode 100644 index 0000000..0f145fc --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-WETH-MCwETH@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214508", + "timestamp": "1743998495" + }, + "market": "0x035Ef165eBF6607BCb772FD483115889F8E2f0eF", + "collateral": { + "address": "0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8", + "symbol": "MCwETH", + "priceFeed": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x91DEa6e3Cfa762FAaA6337712C083ed9722b1665", + "xt": "0xaFe279F0cBB46B5beB89959bb79d1E3b13Bc4435", + "gt": "0x241d27c65eF0aaD6d8096E9DC3B35b33B8b3bAc6" + }, + "config": { + "marketSymbol": "WETH/MCwETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-WETH-gtWETH@09APR2025.json b/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-WETH-gtWETH@09APR2025.json new file mode 100644 index 0000000..1dda396 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-WETH-gtWETH@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214508", + "timestamp": "1743998495" + }, + "market": "0xE68F0cCeC52bF850C11c51f31d1a103E02D87a36", + "collateral": { + "address": "0x2371e134e3455e0593363cBF89d3b6cf53740618", + "symbol": "gtWETH", + "priceFeed": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x64d99D2dD7d9bd204668e39be174B00ab0A59933", + "xt": "0x7A504c315070476bCD73a358b081f388Cb189e87", + "gt": "0x721CCF70e2b126D3cdB2DF8eA3e04e5576AE24a3" + }, + "config": { + "marketSymbol": "WETH/gtWETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-WETH-pufETH@09APR2025.json b/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-WETH-pufETH@09APR2025.json new file mode 100644 index 0000000..86cb06e --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-WETH-pufETH@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214508", + "timestamp": "1743998495" + }, + "market": "0xefea0bAcd45416728460443019dCCF89c009a6C0", + "collateral": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x1c1303b9FebE8478F9C77DD0d739eA670D37FAA4", + "xt": "0xad201CF6874F7839b0FE66a69d46DF2970a4059F", + "gt": "0x42C64BE1C1c24bCe5BC40444Cb00765789ddaf05" + }, + "config": { + "marketSymbol": "WETH/pufETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-WETH-weETH@09APR2025.json b/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-WETH-weETH@09APR2025.json new file mode 100644 index 0000000..378ff5f --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-WETH-weETH@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214508", + "timestamp": "1743998495" + }, + "market": "0x81bfB882FC53B2BEe8665e8e038F1b5dAD668152", + "collateral": { + "address": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "21600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x99607D36aBa4C4B1b3fAD5a53c59dc7BD5690C44", + "xt": "0xd9f1F61ED6331003cf7af06a9049A36eB436b61e", + "gt": "0x8bf877dab38cBAFa4eAB1d182f0d0F5B0C1373B0" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@09APR2025.json b/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@09APR2025.json new file mode 100644 index 0000000..7302ebf --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250409-1400/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214508", + "timestamp": "1743998495" + }, + "market": "0x485D886748E3a0CD84904bbf436B3Be77037Ba56", + "collateral": { + "address": "0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D", + "symbol": "PT-pufETH-26JUN2025", + "priceFeed": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x4Fd9B96E8Ff22957305eeE69A6A2841eFc1A0682", + "xt": "0xc236Dcc5dF373E1330D519EC71673D05465288fF", + "gt": "0xC34c3fcB6305c2228DA8EF9c402b475Aff07BDf4" + }, + "config": { + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250409-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt b/deployments/eth-mainnet-v1.0.8-20250409-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt new file mode 100644 index 0000000..81ca312 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250409-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt @@ -0,0 +1,21 @@ +== Logs == + Network: eth-mainnet + Deployer balance: 158879257545733090 + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175070 + Block timestamp: 1743522719 + + ===== Oracle Aggregator Info ===== + Deployer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Admin: 0x8409a9C1A911CED491892c5694E43994c9d47E8f + Oracle Aggregator deployed at: 0xE3a31690392E8E18DC3d862651C079339E2c1ADE + Oracle Timelock: 43200 + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250409-2000/deploy-market-eth-mainnet-20250409-2000-log.txt b/deployments/eth-mainnet-v1.0.8-20250409-2000/deploy-market-eth-mainnet-20250409-2000-log.txt new file mode 100644 index 0000000..2db75bd --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250409-2000/deploy-market-eth-mainnet-20250409-2000-log.txt @@ -0,0 +1,368 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ETHERSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0x5a059d3a272b20ad129ffbe37b9903a61a03595e + + ===== Block Info ===== + Block number: 22214581 + Block timestamp: 1743999383 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22214581 + + ===== Market Info - 0 ===== + Market deployed at: 0x1D398AD3B3fD7a7B539c4ba82e85d25bD900BC88 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0xf9E89859624FA7680b8fcA2757549bf29498F254 + XT deployed at: 0x69D8F8F19e69011724b9C3A34e343D19fF23A0Cb + GT deployed at: 0x9C71510DFBFb185A21357257F7aC61114DD4d71e + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@09APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0x29f30087809EdFe8f899e75fb36Dd2b1C074eaFD + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xbe045Db0a804C1911606F22d033Ed2F0Bcc3412a + XT deployed at: 0xf4829BA2d0e9Ed386b8D40cDcc05C78567797225 + GT deployed at: 0xeF29652159dC1Fc60bc297b1159f746942eF0F6a + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@09APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0xfa5813da819f86Cc493F55Fe75541f1E5F4e0999 + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x6A7D6613686Dea278E04f7311c05bBF584f69F7a + XT deployed at: 0x655fA0e1161cc45f964831D0f1724B950e7087F8 + GT deployed at: 0x10B4C055a975E0a5b0B7CCB7D90C36a2A13E3B54 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@09APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0x58D60b36f31AAc6FCab9A1425b816947dc421694 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x88DF7A1561D783b9EAa3fD93F845dAc587E11cAE + XT deployed at: 0xC169Ef6e48BDdC5a756A1fFDfaACD12884e786FB + GT deployed at: 0x68648117139CD16F1E3f99431bb568f9eaa2DDd5 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@09APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x3674F00a72E9E5b0689F5B0db7e574315A0E7d3c + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x7309c50c36df4645E6309217Cc0a5fC20D3C2B16 + XT deployed at: 0xDF0E22075554d06Fe86E318a500102f7047c99e4 + GT deployed at: 0x39ED1deDfD4b9a0cbddDb4d588CD1704aD6bD61f + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@09APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x5a0DeDD0466559dd8eb3591c6b060a920AEe10cb + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x59Caaf9278674cea9Ee35e1b4a0DAE948b85A77C + XT deployed at: 0x89c82CcD8b32D0EF460DAE8A40F5B96e94A606CD + GT deployed at: 0xDA99AC42429354Fc24E3726A44897d11b756640B + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@09APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x16eea39e611eB70d4Cd1E0e034bb1F47f6448e9E + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0x219CADC8DbeB82aeb1Ab34588e09a3c7B25Ce027 + XT deployed at: 0x626a40191748bf3D16E17A66f08440D9602E269d + GT deployed at: 0x9611Bb3a272d15858c8803F519479FAd1d53a9Ec + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@09APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0xcc18B36D8d7Da3be8A94C3f7c18A8dFbc916F361 + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x786B1Be6E09E535145e786145ea67a37f493e36a + XT deployed at: 0x491fB43c23494151250232E5AFeA9C28F6816d28 + GT deployed at: 0x660A72cd80Ea2836e53fF50Fd91588034dA5F37e + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@09APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0x44f07715acFa1Cc5B93A7D84F6653163ae0d65e1 + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x2f011e024C801968227C6dFF03f106812aAd8c4f + XT deployed at: 0x6cF29753e5BB1ef4bBae9BE7A5Ed52c3b3C13280 + GT deployed at: 0xA66eDfe00224a50578FAEC6b16eA65436622a251 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@09APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x56b8767614B9213e0487E23319242d3B03CB506d + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x5ac386B9129d0482437a3ad7aB3DC41eb8484DbD + XT deployed at: 0xBEa33BCD725CC90cCE06b503936bf403D1c8AbF8 + GT deployed at: 0xBaBc34fee407ABDf0ec3212A95EFB218Bce18468 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@09APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x07452fE9A0feF596EE95250434Ed2b3e88B85E9e + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xbcc66AFA01DdCBAe154836A5a5C20195943c3DC7 + XT deployed at: 0xaDD09Fc3DA81066D760dF74a12BA2572F1401441 + GT deployed at: 0x4bA98652D64B36faDb6406F590BE5a82dD4531B5 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@09APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0xe49566230b9Cdb882DBEA334dD17B1e6065EF49f + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x5E721DF3afF05114FF09B0632C84E6d38a204ad1 + XT deployed at: 0xEbabF22f41411b832c3B5fD9729bF7C4aBc077DA + GT deployed at: 0x5469eb70182688278709f6233C653171313B864a + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 09APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@09APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 4.050877988 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.070114184160475296 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x1d398ad3b3fd7a7b539c4ba82e85d25bd900bc88, 0xf9e89859624fa7680b8fca2757549bf29498f254, 0x69d8f8f19e69011724b9c3a34e343d19ff23a0cb, 0x9c71510dfbfb185a21357257f7ac61114dd4d71e, 0x29f30087809edfe8f899e75fb36dd2b1c074eafd, 0xbe045db0a804c1911606f22d033ed2f0bcc3412a, 0xf4829ba2d0e9ed386b8d40cdcc05c78567797225, 0xef29652159dc1fc60bc297b1159f746942ef0f6a, 0xfa5813da819f86cc493f55fe75541f1e5f4e0999, 0x6a7d6613686dea278e04f7311c05bbf584f69f7a, 0x655fa0e1161cc45f964831d0f1724b950e7087f8, 0x10b4c055a975e0a5b0b7ccb7d90c36a2a13e3b54, 0x58d60b36f31aac6fcab9a1425b816947dc421694, 0x88df7a1561d783b9eaa3fd93f845dac587e11cae, 0xc169ef6e48bddc5a756a1ffdfaacd12884e786fb, 0x68648117139cd16f1e3f99431bb568f9eaa2ddd5, 0x3674f00a72e9e5b0689f5b0db7e574315a0e7d3c, 0x7309c50c36df4645e6309217cc0a5fc20d3c2b16, 0xdf0e22075554d06fe86e318a500102f7047c99e4, 0x39ed1dedfd4b9a0cbdddb4d588cd1704ad6bd61f, 0x5a0dedd0466559dd8eb3591c6b060a920aee10cb, 0x59caaf9278674cea9ee35e1b4a0dae948b85a77c, 0x89c82ccd8b32d0ef460dae8a40f5b96e94a606cd, 0xda99ac42429354fc24e3726a44897d11b756640b, 0x16eea39e611eb70d4cd1e0e034bb1f47f6448e9e, 0x219cadc8dbeb82aeb1ab34588e09a3c7b25ce027, 0x626a40191748bf3d16e17a66f08440d9602e269d, 0x9611bb3a272d15858c8803f519479fad1d53a9ec, 0xcc18b36d8d7da3be8a94c3f7c18a8dfbc916f361, 0x786b1be6e09e535145e786145ea67a37f493e36a, 0x491fb43c23494151250232e5afea9c28f6816d28, 0x660a72cd80ea2836e53ff50fd91588034da5f37e, 0x44f07715acfa1cc5b93a7d84f6653163ae0d65e1, 0x2f011e024c801968227c6dff03f106812aad8c4f, 0x6cf29753e5bb1ef4bbae9be7a5ed52c3b3c13280, 0xa66edfe00224a50578faec6b16ea65436622a251, 0x56b8767614b9213e0487e23319242d3b03cb506d, 0x5ac386b9129d0482437a3ad7ab3dc41eb8484dbd, 0xbea33bcd725cc90cce06b503936bf403d1c8abf8, 0xbabc34fee407abdf0ec3212a95efb218bce18468, 0x07452fe9a0fef596ee95250434ed2b3e88b85e9e, 0xbcc66afa01ddcbae154836a5a5c20195943c3dc7, 0xadd09fc3da81066d760df74a12ba2572f1401441, 0x4ba98652d64b36fadb6406f590be5a82dd4531b5, 0xe49566230b9cdb882dbea334dd17b1e6065ef49f, 0x5e721df3aff05114ff09b0632c84e6d38a204ad1, 0xebabf22f41411b832c3b5fd9729bf7c4abc077da, 0x5469eb70182688278709f6233c653171313b864a]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-20250409-2000/deploy_markets_test_0402_log.txt b/deployments/eth-mainnet-v1.0.8-20250409-2000/deploy_markets_test_0402_log.txt new file mode 100644 index 0000000..236c256 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250409-2000/deploy_markets_test_0402_log.txt @@ -0,0 +1,370 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Enabled--verify +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175185 + Block timestamp: 1743524099 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22175185 + + ===== Market Info - 0 ===== + Market deployed at: 0x4a20DdEB8696b1f542649626889522068cc19438 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x00B210A7f79653A0fe7e2bc31d6Fe3026421195d + XT deployed at: 0x465c30b940E792262Ef65B7Fe7A5bAd3b5b7f034 + GT deployed at: 0xca3F986978ADEf5aA8e4F9e4F3d27f6f4Eb3f47d + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@02APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xC8c3A49b64dB371F96EdC15941e043966297Ea6b + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x19632ff799BA54B54934b52a89964F6cb12D396f + XT deployed at: 0xe459c64a852Df70Ea7D0cc46142A1a0d8BCd4f2A + GT deployed at: 0x9CEA72e4C7Fd1dd0bb2D0AAF98D756B1f85e096D + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@02APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x54ACdb3da45bBDEb1a53e1E3F6DB51C8384c7F9c + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x3ebabb95e4276DD2850666a95037f5EE3bb798Bb + XT deployed at: 0xb7d4329b11Dff286890F4d7e5b10763E09E8804C + GT deployed at: 0x28C108FD44B2E58DD9B07CBE453c0BCF836b8CB7 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@02APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xf2F9b0fDD5D22e574421A7Ee0E29e410E63C70A9 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x594Db033Ade81E0C8182B66d2B07fbc97452d1FA + XT deployed at: 0x544786112d542910634109BcCEF84C3Deb1b65e0 + GT deployed at: 0x81CAc518B14B28570C667A143F801bF2e05b6BEe + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@02APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x10aCD317ebf3F65e30c72720D89c55B7C68a9628 + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xA03710F73585cb5458F43739624611633Bf24173 + XT deployed at: 0x80525c75690102bb024BcEd8bE81D18A56172EC0 + GT deployed at: 0xe2e5403923B0421FA5a9D28c1012aeAFfc820f02 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@02APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x49913B7Bd178e21FaC84C3dED810Ff4CcDcb8403 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x8CDe48E20b5d77C3ec0fbCbf50d0C78B2DE11264 + XT deployed at: 0x8b596614c9ac30bd9DF615c3C18F0f05a97F0779 + GT deployed at: 0xBA03824B38E83B7CBAF3Fcb5aF02EF8342A110d8 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@02APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x69E1A695Ee24e7BcFc55d2dA7DfD479E4C7Eb6A3 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0xc7d5476d361C8d0E5c0478EA320431AD4a49A558 + XT deployed at: 0xe1710D5449241ce311Bfcefb5272594ECD930ec0 + GT deployed at: 0x4B87E9281de9573f2025565E632bdb8F136766E5 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@02APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0x9dA149D4Bc9eF4e6Eb1D131E837270f76dc62e79 + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD667a61e822564e1399f73196c73B2C41bCBda69 + XT deployed at: 0x2348B91F2037799d6AE604D792101534461DB06E + GT deployed at: 0x1aE5482Db2883e1ae8CDBFDbaE95539266F1bF32 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@02APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0x9cde69Ea28c9125060F86eB982305BafaE57f585 + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x4bDD2b0f934EECCE01A8Fc47E3762Ce86C9D061F + XT deployed at: 0x63B96518024b49C8F16104fDFd9d94a79A3d185C + GT deployed at: 0xa78bE568bc5ec42C8E41734dADcb86D3dde73af3 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@02APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x565656a354F6C2953EB2D00DC7e2e0Ab815e19E7 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x1184866Ed937F4605efc100c1f18E028F7CBDD86 + XT deployed at: 0x3F56b53953adf3a65f5Bb8E8Dce1C4926e1D629c + GT deployed at: 0x315f180e74247E01ca0377244Eb6b6D1c7444452 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@02APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x0ed76A80D639E7Bf88524b63429bB841c1633E60 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD4771df4a0f6338f521512A1651D8DB7EF5Af633 + XT deployed at: 0x4bbc10317e5b70B6B491836F5B2b496EE35f5E31 + GT deployed at: 0xFF601c3788236F231a8771cACBbB3087D0Ee7A2c + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@02APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x8c07c10a0a3530a9fB64c65f109A32F7B4b2DB80 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x0469A60F8fbc0c35c4D1D965a50A6Bd29c9dAB8C + XT deployed at: 0xE292927A017d58823957A83ea5EFeAF9C37D6F94 + GT deployed at: 0x7AdE4961Fccba087E8b4De84E8be61098Daf0230 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@02APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 5.079885262 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.087924645429718704 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x4a20ddeb8696b1f542649626889522068cc19438, 0x00b210a7f79653a0fe7e2bc31d6fe3026421195d, 0x465c30b940e792262ef65b7fe7a5bad3b5b7f034, 0xca3f986978adef5aa8e4f9e4f3d27f6f4eb3f47d, 0xc8c3a49b64db371f96edc15941e043966297ea6b, 0x19632ff799ba54b54934b52a89964f6cb12d396f, 0xe459c64a852df70ea7d0cc46142a1a0d8bcd4f2a, 0x9cea72e4c7fd1dd0bb2d0aaf98d756b1f85e096d, 0x54acdb3da45bbdeb1a53e1e3f6db51c8384c7f9c, 0x3ebabb95e4276dd2850666a95037f5ee3bb798bb, 0xb7d4329b11dff286890f4d7e5b10763e09e8804c, 0x28c108fd44b2e58dd9b07cbe453c0bcf836b8cb7, 0xf2f9b0fdd5d22e574421a7ee0e29e410e63c70a9, 0x594db033ade81e0c8182b66d2b07fbc97452d1fa, 0x544786112d542910634109bccef84c3deb1b65e0, 0x81cac518b14b28570c667a143f801bf2e05b6bee, 0x10acd317ebf3f65e30c72720d89c55b7c68a9628, 0xa03710f73585cb5458f43739624611633bf24173, 0x80525c75690102bb024bced8be81d18a56172ec0, 0xe2e5403923b0421fa5a9d28c1012aeaffc820f02, 0x49913b7bd178e21fac84c3ded810ff4ccdcb8403, 0x8cde48e20b5d77c3ec0fbcbf50d0c78b2de11264, 0x8b596614c9ac30bd9df615c3c18f0f05a97f0779, 0xba03824b38e83b7cbaf3fcb5af02ef8342a110d8, 0x69e1a695ee24e7bcfc55d2da7dfd479e4c7eb6a3, 0xc7d5476d361c8d0e5c0478ea320431ad4a49a558, 0xe1710d5449241ce311bfcefb5272594ecd930ec0, 0x4b87e9281de9573f2025565e632bdb8f136766e5, 0x9da149d4bc9ef4e6eb1d131e837270f76dc62e79, 0xd667a61e822564e1399f73196c73b2c41bcbda69, 0x2348b91f2037799d6ae604d792101534461db06e, 0x1ae5482db2883e1ae8cdbfdbae95539266f1bf32, 0x9cde69ea28c9125060f86eb982305bafae57f585, 0x4bdd2b0f934eecce01a8fc47e3762ce86c9d061f, 0x63b96518024b49c8f16104fdfd9d94a79a3d185c, 0xa78be568bc5ec42c8e41734dadcb86d3dde73af3, 0x565656a354f6c2953eb2d00dc7e2e0ab815e19e7, 0x1184866ed937f4605efc100c1f18e028f7cbdd86, 0x3f56b53953adf3a65f5bb8e8dce1c4926e1d629c, 0x315f180e74247e01ca0377244eb6b6d1c7444452, 0x0ed76a80d639e7bf88524b63429bb841c1633e60, 0xd4771df4a0f6338f521512a1651d8db7ef5af633, 0x4bbc10317e5b70b6b491836f5b2b496ee35f5e31, 0xff601c3788236f231a8771cacbbb3087d0ee7a2c, 0x8c07c10a0a3530a9fb64c65f109a32f7b4b2db80, 0x0469a60f8fbc0c35c4d1d965a50a6bd29c9dab8c, 0xe292927a017d58823957a83ea5efeaf9c37d6f94, 0x7ade4961fccba087e8b4de84e8be61098daf0230]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-access-manager.json b/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-access-manager.json new file mode 100644 index 0000000..a1a5b6a --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743155675", + "gitBranch": "deploy/v1.0.5", + "gitCommitHash": "0x0x65c418860c22aecb27054e7a8c3207a4f87ad6af", + "blockInfo": { + "number": "22144647", + "timestamp": "1743155675" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-core.json b/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-core.json new file mode 100644 index 0000000..34b5474 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743518639", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x30f0c30e4edf518e2bf6700837dad2a7624d35df", + "blockInfo": { + "number": "22174730", + "timestamp": "1743518639" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x37Ba9934aAbA7a49cC29d0952C6a91d7c7043dbc", + "vaultFactory": "0x01D8C1e0584751085a876892151Bf8490e862E3E", + "oracleAggregator": "0xE3a31690392E8E18DC3d862651C079339E2c1ADE", + "router": "0xC47591F5c023e44931c78D5A993834875b79FB11", + "swapAdapter": { + "uniswapV3Adapter": "0x34F7b52b0d33959C8351eF95F3523C89b6123C0b", + "odosV2Adapter": "0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779", + "pendleSwapV3Adapter": "0x0B30251FA697A39Fd41813b267b50F03414E82da", + "ERC4626VaultAdapter": "0x85ce30537c14EFB66B673f284bEa7c28351244F6" + }, + "marketViewer": "0x74Dfb95Ae623123ecf82Ba841985fB460bB9d45D" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@09APR2025.json b/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@09APR2025.json new file mode 100644 index 0000000..281ae5c --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214581", + "timestamp": "1743999383" + }, + "market": "0x58D60b36f31AAc6FCab9A1425b816947dc421694", + "collateral": { + "address": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "symbol": "PT-sUSDE-29MAY2025", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x88DF7A1561D783b9EAa3fD93F845dAc587E11cAE", + "xt": "0xC169Ef6e48BDdC5a756A1fFDfaACD12884e786FB", + "gt": "0x68648117139CD16F1E3f99431bb568f9eaa2DDd5" + }, + "config": { + "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-USDC-USUALUSDC+@09APR2025.json b/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-USDC-USUALUSDC+@09APR2025.json new file mode 100644 index 0000000..16e6a32 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-USDC-USUALUSDC+@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214581", + "timestamp": "1743999383" + }, + "market": "0x3674F00a72E9E5b0689F5B0db7e574315A0E7d3c", + "collateral": { + "address": "0xd63070114470f685b75B74D60EEc7c1113d33a3D", + "symbol": "USUALUSDC+", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x7309c50c36df4645E6309217Cc0a5fC20D3C2B16", + "xt": "0xDF0E22075554d06Fe86E318a500102f7047c99e4", + "gt": "0x39ED1deDfD4b9a0cbddDb4d588CD1704aD6bD61f" + }, + "config": { + "marketSymbol": "USDC/USUALUSDC+@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-USDC-WBTC@09APR2025.json b/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-USDC-WBTC@09APR2025.json new file mode 100644 index 0000000..f5deda9 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-USDC-WBTC@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214581", + "timestamp": "1743999383" + }, + "market": "0x56b8767614B9213e0487E23319242d3B03CB506d", + "collateral": { + "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "symbol": "WBTC", + "priceFeed": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x5ac386B9129d0482437a3ad7aB3DC41eb8484DbD", + "xt": "0xBEa33BCD725CC90cCE06b503936bf403D1c8AbF8", + "gt": "0xBaBc34fee407ABDf0ec3212A95EFB218Bce18468" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-USDC-cbBTC@09APR2025.json b/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-USDC-cbBTC@09APR2025.json new file mode 100644 index 0000000..19e98b1 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-USDC-cbBTC@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214581", + "timestamp": "1743999383" + }, + "market": "0x07452fE9A0feF596EE95250434Ed2b3e88B85E9e", + "collateral": { + "address": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", + "symbol": "cbBTC", + "priceFeed": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xbcc66AFA01DdCBAe154836A5a5C20195943c3DC7", + "xt": "0xaDD09Fc3DA81066D760dF74a12BA2572F1401441", + "gt": "0x4bA98652D64B36faDb6406F590BE5a82dD4531B5" + }, + "config": { + "marketSymbol": "USDC/cbBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-USDC-eUSDe@09APR2025.json b/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-USDC-eUSDe@09APR2025.json new file mode 100644 index 0000000..66142da --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-USDC-eUSDe@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214581", + "timestamp": "1743999383" + }, + "market": "0xcc18B36D8d7Da3be8A94C3f7c18A8dFbc916F361", + "collateral": { + "address": "0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F", + "symbol": "eUSDe", + "priceFeed": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x786B1Be6E09E535145e786145ea67a37f493e36a", + "xt": "0x491fB43c23494151250232E5AFeA9C28F6816d28", + "gt": "0x660A72cd80Ea2836e53fF50Fd91588034dA5F37e" + }, + "config": { + "marketSymbol": "USDC/eUSDe@29MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-USDC-sUSDe@09APR2025.json b/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-USDC-sUSDe@09APR2025.json new file mode 100644 index 0000000..d4db43b --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-USDC-sUSDe@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214581", + "timestamp": "1743999383" + }, + "market": "0xfa5813da819f86Cc493F55Fe75541f1E5F4e0999", + "collateral": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x6A7D6613686Dea278E04f7311c05bBF584f69F7a", + "xt": "0x655fA0e1161cc45f964831D0f1724B950e7087F8", + "gt": "0x10B4C055a975E0a5b0B7CCB7D90C36a2A13E3B54" + }, + "config": { + "marketSymbol": "USDC/sUSDe@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-USDC-wstETH@09APR2025.json b/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-USDC-wstETH@09APR2025.json new file mode 100644 index 0000000..d9bc113 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-USDC-wstETH@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214581", + "timestamp": "1743999383" + }, + "market": "0x29f30087809EdFe8f899e75fb36Dd2b1C074eaFD", + "collateral": { + "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xbe045Db0a804C1911606F22d033Ed2F0Bcc3412a", + "xt": "0xf4829BA2d0e9Ed386b8D40cDcc05C78567797225", + "gt": "0xeF29652159dC1Fc60bc297b1159f746942eF0F6a" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-WETH-MCwETH@09APR2025.json b/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-WETH-MCwETH@09APR2025.json new file mode 100644 index 0000000..b6127f6 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-WETH-MCwETH@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214581", + "timestamp": "1743999383" + }, + "market": "0x5a0DeDD0466559dd8eb3591c6b060a920AEe10cb", + "collateral": { + "address": "0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8", + "symbol": "MCwETH", + "priceFeed": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x59Caaf9278674cea9Ee35e1b4a0DAE948b85A77C", + "xt": "0x89c82CcD8b32D0EF460DAE8A40F5B96e94A606CD", + "gt": "0xDA99AC42429354Fc24E3726A44897d11b756640B" + }, + "config": { + "marketSymbol": "WETH/MCwETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-WETH-gtWETH@09APR2025.json b/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-WETH-gtWETH@09APR2025.json new file mode 100644 index 0000000..de8af3d --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-WETH-gtWETH@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214581", + "timestamp": "1743999383" + }, + "market": "0xe49566230b9Cdb882DBEA334dD17B1e6065EF49f", + "collateral": { + "address": "0x2371e134e3455e0593363cBF89d3b6cf53740618", + "symbol": "gtWETH", + "priceFeed": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x5E721DF3afF05114FF09B0632C84E6d38a204ad1", + "xt": "0xEbabF22f41411b832c3B5fD9729bF7C4aBc077DA", + "gt": "0x5469eb70182688278709f6233C653171313B864a" + }, + "config": { + "marketSymbol": "WETH/gtWETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-WETH-pufETH@09APR2025.json b/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-WETH-pufETH@09APR2025.json new file mode 100644 index 0000000..22cb157 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-WETH-pufETH@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214581", + "timestamp": "1743999383" + }, + "market": "0x44f07715acFa1Cc5B93A7D84F6653163ae0d65e1", + "collateral": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x2f011e024C801968227C6dFF03f106812aAd8c4f", + "xt": "0x6cF29753e5BB1ef4bBae9BE7A5Ed52c3b3C13280", + "gt": "0xA66eDfe00224a50578FAEC6b16eA65436622a251" + }, + "config": { + "marketSymbol": "WETH/pufETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-WETH-weETH@09APR2025.json b/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-WETH-weETH@09APR2025.json new file mode 100644 index 0000000..8377c71 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-WETH-weETH@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214581", + "timestamp": "1743999383" + }, + "market": "0x1D398AD3B3fD7a7B539c4ba82e85d25bD900BC88", + "collateral": { + "address": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "21600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xf9E89859624FA7680b8fcA2757549bf29498F254", + "xt": "0x69D8F8F19e69011724b9C3A34e343D19fF23A0Cb", + "gt": "0x9C71510DFBFb185A21357257F7aC61114DD4d71e" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@09APR2025.json b/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@09APR2025.json new file mode 100644 index 0000000..bd2999f --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250409-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@09APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214581", + "timestamp": "1743999383" + }, + "market": "0x16eea39e611eB70d4Cd1E0e034bb1F47f6448e9E", + "collateral": { + "address": "0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D", + "symbol": "PT-pufETH-26JUN2025", + "priceFeed": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x219CADC8DbeB82aeb1Ab34588e09a3c7B25Ce027", + "xt": "0x626a40191748bf3D16E17A66f08440D9602E269d", + "gt": "0x9611Bb3a272d15858c8803F519479FAd1d53a9Ec" + }, + "config": { + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "09APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250410-1400/deploy-eth-mainnet-oracle-aggregator-0401-log.txt b/deployments/eth-mainnet-v1.0.8-20250410-1400/deploy-eth-mainnet-oracle-aggregator-0401-log.txt new file mode 100644 index 0000000..81ca312 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250410-1400/deploy-eth-mainnet-oracle-aggregator-0401-log.txt @@ -0,0 +1,21 @@ +== Logs == + Network: eth-mainnet + Deployer balance: 158879257545733090 + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175070 + Block timestamp: 1743522719 + + ===== Oracle Aggregator Info ===== + Deployer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Admin: 0x8409a9C1A911CED491892c5694E43994c9d47E8f + Oracle Aggregator deployed at: 0xE3a31690392E8E18DC3d862651C079339E2c1ADE + Oracle Timelock: 43200 + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250410-1400/deploy-market-eth-mainnet-20250410-1400-log.txt b/deployments/eth-mainnet-v1.0.8-20250410-1400/deploy-market-eth-mainnet-20250410-1400-log.txt new file mode 100644 index 0000000..f549b7e --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250410-1400/deploy-market-eth-mainnet-20250410-1400-log.txt @@ -0,0 +1,368 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ETHERSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0x5a059d3a272b20ad129ffbe37b9903a61a03595e + + ===== Block Info ===== + Block number: 22214655 + Block timestamp: 1744000271 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22214655 + + ===== Market Info - 0 ===== + Market deployed at: 0xA4D14471FeD74B1664Fb888bcbA398dcBEBA2890 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0xbc6b184b468A9B7e2d165AdeA77b58773Db2a8c3 + XT deployed at: 0xA9D9Cc4471D68433751691b2AbCbFad95A0330e2 + GT deployed at: 0xE68AB0a7C0BE3d4c9149A8601c7Df566276CB11A + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@10APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0x663e9f58e9ce3231A95a137F30E934ff6473bF9f + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x44E07a9c79a15Cc743C7e04B55064A8bc596B752 + XT deployed at: 0xE383f7f99D7F28A0EEDA31B20E8092E6534AA192 + GT deployed at: 0x4AE866FfA4c8B5173E2239694bE5515C63C5DCfd + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@10APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x37EA82A997Bb160291a05c1c86F869fAb1c4163A + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x60a11DA2Cc690F69F57ee57C12Ff8D599D1609bA + XT deployed at: 0x5086224274b1f38436B16C1Da5b9c5829F66E25C + GT deployed at: 0x79151612e7Ccc54fbCf0048f1Be93EB5aBf7E74d + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@10APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0x1B5596B24823109352d6c9FeF8c3186df68AFeE7 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x1B1Ef48a948696Ed367aDac232A28C5F1205918b + XT deployed at: 0xFA8627D4219eAAEB10F93419872294F09f9D72D7 + GT deployed at: 0xfcCAe4a1B02E160010Ba7d0D97299456C8fb57C0 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@10APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0xdD1f122F075438De597487494A3acb9C98601e0F + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x0dE1b0cd455139F162699847973AF08ebbd98c0B + XT deployed at: 0xB67E81A0CE4834FdC0B7Fef2A52A2DCe4D00756C + GT deployed at: 0x1db01Bb963Ea7f69DedabB148CDD253A23Fd3C86 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@10APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x06ca18bD6DC9dBDe841315A503AFA11Bd68c7DC8 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0xeBAfB711848c01271A9bd7A1A76A0bF4a5AaE193 + XT deployed at: 0xe298937ac37A2DAA0ECe8C495c6F2ceeaED1795B + GT deployed at: 0x4Fd71e0D3d96D3B732Dc217CE9aca75acB17Fe62 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@10APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x9647aa6Bd43D004Ff709737cc49Dae17a39Fd9d4 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0x64cAa30d514b255bde2B3a39AAda58cFdE0C7bA6 + XT deployed at: 0xf3c804B5F13ce6E6831687b5ace4d26B495Db588 + GT deployed at: 0x6c6F9757BAD25b6A0091A1E83dbF8f3313d25FE0 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@10APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0x411cC697dC35362B1b2b87a1FBefD762CA017ed0 + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x4dBb4b99b98D7dE3E4335bC3B638D480546A0158 + XT deployed at: 0x3E0cC1C776BCEFea410f95d78B7D4cc9c558aa52 + GT deployed at: 0x4A9AeB1398DD87AA1449df58e8EE8578FCE2900f + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@10APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0x9d813574687cb3B4b5C8F2311eEBa7382D5b229c + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0xD2b14ca4Dc6cb7741752Ef9178ed4D5c094b6229 + XT deployed at: 0x183F35437746cC8bCa62868B17d16Ab576EF1Cbf + GT deployed at: 0xcdec35492939e4c254Eec4492A4E9E7D1D939DAB + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@10APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0xFB9Bd7Fa2a707eCC618a5DEc78a916AF3Bc27f8F + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x601D83443eb61f8C8FC6115C937f32855FdcfdbF + XT deployed at: 0xEcbe342E80da2439535440b412DD74D790372179 + GT deployed at: 0xF6654f28D2e92E0Bc03438b3590D56a8380a47D6 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@10APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x68eb044886980d657B48094F9daB6CaCc4208Ba5 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD0c19bF74d47E17404EdF8D57aDE39Ed0944f110 + XT deployed at: 0x72e9052DFD7d4a3393956D32616cc53471f47093 + GT deployed at: 0x3a1778527145d0C6B259055d5DBA2601F5AE1e19 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@10APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0xe27E75967c162F97Ab99cE4b0A881D5CB2ABec85 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x48Ba7d3Bb5A604c4e06bbAdb985aCF27a45Cb8d7 + XT deployed at: 0xb76DFE249B9653A2C77216bf310438e6B2a8BdC5 + GT deployed at: 0x200D174855f706e40B75eC5399fbdfAFEEFD02C2 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@10APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 1.931674392 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.033434177593097664 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0xa4d14471fed74b1664fb888bcba398dcbeba2890, 0xbc6b184b468a9b7e2d165adea77b58773db2a8c3, 0xa9d9cc4471d68433751691b2abcbfad95a0330e2, 0xe68ab0a7c0be3d4c9149a8601c7df566276cb11a, 0x663e9f58e9ce3231a95a137f30e934ff6473bf9f, 0x44e07a9c79a15cc743c7e04b55064a8bc596b752, 0xe383f7f99d7f28a0eeda31b20e8092e6534aa192, 0x4ae866ffa4c8b5173e2239694be5515c63c5dcfd, 0x37ea82a997bb160291a05c1c86f869fab1c4163a, 0x60a11da2cc690f69f57ee57c12ff8d599d1609ba, 0x5086224274b1f38436b16c1da5b9c5829f66e25c, 0x79151612e7ccc54fbcf0048f1be93eb5abf7e74d, 0x1b5596b24823109352d6c9fef8c3186df68afee7, 0x1b1ef48a948696ed367adac232a28c5f1205918b, 0xfa8627d4219eaaeb10f93419872294f09f9d72d7, 0xfccae4a1b02e160010ba7d0d97299456c8fb57c0, 0xdd1f122f075438de597487494a3acb9c98601e0f, 0x0de1b0cd455139f162699847973af08ebbd98c0b, 0xb67e81a0ce4834fdc0b7fef2a52a2dce4d00756c, 0x1db01bb963ea7f69dedabb148cdd253a23fd3c86, 0x06ca18bd6dc9dbde841315a503afa11bd68c7dc8, 0xebafb711848c01271a9bd7a1a76a0bf4a5aae193, 0xe298937ac37a2daa0ece8c495c6f2ceeaed1795b, 0x4fd71e0d3d96d3b732dc217ce9aca75acb17fe62, 0x9647aa6bd43d004ff709737cc49dae17a39fd9d4, 0x64caa30d514b255bde2b3a39aada58cfde0c7ba6, 0xf3c804b5f13ce6e6831687b5ace4d26b495db588, 0x6c6f9757bad25b6a0091a1e83dbf8f3313d25fe0, 0x411cc697dc35362b1b2b87a1fbefd762ca017ed0, 0x4dbb4b99b98d7de3e4335bc3b638d480546a0158, 0x3e0cc1c776bcefea410f95d78b7d4cc9c558aa52, 0x4a9aeb1398dd87aa1449df58e8ee8578fce2900f, 0x9d813574687cb3b4b5c8f2311eeba7382d5b229c, 0xd2b14ca4dc6cb7741752ef9178ed4d5c094b6229, 0x183f35437746cc8bca62868b17d16ab576ef1cbf, 0xcdec35492939e4c254eec4492a4e9e7d1d939dab, 0xfb9bd7fa2a707ecc618a5dec78a916af3bc27f8f, 0x601d83443eb61f8c8fc6115c937f32855fdcfdbf, 0xecbe342e80da2439535440b412dd74d790372179, 0xf6654f28d2e92e0bc03438b3590d56a8380a47d6, 0x68eb044886980d657b48094f9dab6cacc4208ba5, 0xd0c19bf74d47e17404edf8d57ade39ed0944f110, 0x72e9052dfd7d4a3393956d32616cc53471f47093, 0x3a1778527145d0c6b259055d5dba2601f5ae1e19, 0xe27e75967c162f97ab99ce4b0a881d5cb2abec85, 0x48ba7d3bb5a604c4e06bbadb985acf27a45cb8d7, 0xb76dfe249b9653a2c77216bf310438e6b2a8bdc5, 0x200d174855f706e40b75ec5399fbdfafeefd02c2]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-20250410-1400/deploy_markets_test_0402_log.txt b/deployments/eth-mainnet-v1.0.8-20250410-1400/deploy_markets_test_0402_log.txt new file mode 100644 index 0000000..236c256 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250410-1400/deploy_markets_test_0402_log.txt @@ -0,0 +1,370 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Enabled--verify +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175185 + Block timestamp: 1743524099 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22175185 + + ===== Market Info - 0 ===== + Market deployed at: 0x4a20DdEB8696b1f542649626889522068cc19438 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x00B210A7f79653A0fe7e2bc31d6Fe3026421195d + XT deployed at: 0x465c30b940E792262Ef65B7Fe7A5bAd3b5b7f034 + GT deployed at: 0xca3F986978ADEf5aA8e4F9e4F3d27f6f4Eb3f47d + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@02APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xC8c3A49b64dB371F96EdC15941e043966297Ea6b + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x19632ff799BA54B54934b52a89964F6cb12D396f + XT deployed at: 0xe459c64a852Df70Ea7D0cc46142A1a0d8BCd4f2A + GT deployed at: 0x9CEA72e4C7Fd1dd0bb2D0AAF98D756B1f85e096D + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@02APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x54ACdb3da45bBDEb1a53e1E3F6DB51C8384c7F9c + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x3ebabb95e4276DD2850666a95037f5EE3bb798Bb + XT deployed at: 0xb7d4329b11Dff286890F4d7e5b10763E09E8804C + GT deployed at: 0x28C108FD44B2E58DD9B07CBE453c0BCF836b8CB7 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@02APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xf2F9b0fDD5D22e574421A7Ee0E29e410E63C70A9 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x594Db033Ade81E0C8182B66d2B07fbc97452d1FA + XT deployed at: 0x544786112d542910634109BcCEF84C3Deb1b65e0 + GT deployed at: 0x81CAc518B14B28570C667A143F801bF2e05b6BEe + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@02APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x10aCD317ebf3F65e30c72720D89c55B7C68a9628 + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xA03710F73585cb5458F43739624611633Bf24173 + XT deployed at: 0x80525c75690102bb024BcEd8bE81D18A56172EC0 + GT deployed at: 0xe2e5403923B0421FA5a9D28c1012aeAFfc820f02 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@02APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x49913B7Bd178e21FaC84C3dED810Ff4CcDcb8403 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x8CDe48E20b5d77C3ec0fbCbf50d0C78B2DE11264 + XT deployed at: 0x8b596614c9ac30bd9DF615c3C18F0f05a97F0779 + GT deployed at: 0xBA03824B38E83B7CBAF3Fcb5aF02EF8342A110d8 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@02APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x69E1A695Ee24e7BcFc55d2dA7DfD479E4C7Eb6A3 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0xc7d5476d361C8d0E5c0478EA320431AD4a49A558 + XT deployed at: 0xe1710D5449241ce311Bfcefb5272594ECD930ec0 + GT deployed at: 0x4B87E9281de9573f2025565E632bdb8F136766E5 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@02APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0x9dA149D4Bc9eF4e6Eb1D131E837270f76dc62e79 + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD667a61e822564e1399f73196c73B2C41bCBda69 + XT deployed at: 0x2348B91F2037799d6AE604D792101534461DB06E + GT deployed at: 0x1aE5482Db2883e1ae8CDBFDbaE95539266F1bF32 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@02APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0x9cde69Ea28c9125060F86eB982305BafaE57f585 + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x4bDD2b0f934EECCE01A8Fc47E3762Ce86C9D061F + XT deployed at: 0x63B96518024b49C8F16104fDFd9d94a79A3d185C + GT deployed at: 0xa78bE568bc5ec42C8E41734dADcb86D3dde73af3 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@02APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x565656a354F6C2953EB2D00DC7e2e0Ab815e19E7 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x1184866Ed937F4605efc100c1f18E028F7CBDD86 + XT deployed at: 0x3F56b53953adf3a65f5Bb8E8Dce1C4926e1D629c + GT deployed at: 0x315f180e74247E01ca0377244Eb6b6D1c7444452 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@02APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x0ed76A80D639E7Bf88524b63429bB841c1633E60 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD4771df4a0f6338f521512A1651D8DB7EF5Af633 + XT deployed at: 0x4bbc10317e5b70B6B491836F5B2b496EE35f5E31 + GT deployed at: 0xFF601c3788236F231a8771cACBbB3087D0Ee7A2c + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@02APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x8c07c10a0a3530a9fB64c65f109A32F7B4b2DB80 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x0469A60F8fbc0c35c4D1D965a50A6Bd29c9dAB8C + XT deployed at: 0xE292927A017d58823957A83ea5EFeAF9C37D6F94 + GT deployed at: 0x7AdE4961Fccba087E8b4De84E8be61098Daf0230 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@02APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 5.079885262 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.087924645429718704 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x4a20ddeb8696b1f542649626889522068cc19438, 0x00b210a7f79653a0fe7e2bc31d6fe3026421195d, 0x465c30b940e792262ef65b7fe7a5bad3b5b7f034, 0xca3f986978adef5aa8e4f9e4f3d27f6f4eb3f47d, 0xc8c3a49b64db371f96edc15941e043966297ea6b, 0x19632ff799ba54b54934b52a89964f6cb12d396f, 0xe459c64a852df70ea7d0cc46142a1a0d8bcd4f2a, 0x9cea72e4c7fd1dd0bb2d0aaf98d756b1f85e096d, 0x54acdb3da45bbdeb1a53e1e3f6db51c8384c7f9c, 0x3ebabb95e4276dd2850666a95037f5ee3bb798bb, 0xb7d4329b11dff286890f4d7e5b10763e09e8804c, 0x28c108fd44b2e58dd9b07cbe453c0bcf836b8cb7, 0xf2f9b0fdd5d22e574421a7ee0e29e410e63c70a9, 0x594db033ade81e0c8182b66d2b07fbc97452d1fa, 0x544786112d542910634109bccef84c3deb1b65e0, 0x81cac518b14b28570c667a143f801bf2e05b6bee, 0x10acd317ebf3f65e30c72720d89c55b7c68a9628, 0xa03710f73585cb5458f43739624611633bf24173, 0x80525c75690102bb024bced8be81d18a56172ec0, 0xe2e5403923b0421fa5a9d28c1012aeaffc820f02, 0x49913b7bd178e21fac84c3ded810ff4ccdcb8403, 0x8cde48e20b5d77c3ec0fbcbf50d0c78b2de11264, 0x8b596614c9ac30bd9df615c3c18f0f05a97f0779, 0xba03824b38e83b7cbaf3fcb5af02ef8342a110d8, 0x69e1a695ee24e7bcfc55d2da7dfd479e4c7eb6a3, 0xc7d5476d361c8d0e5c0478ea320431ad4a49a558, 0xe1710d5449241ce311bfcefb5272594ecd930ec0, 0x4b87e9281de9573f2025565e632bdb8f136766e5, 0x9da149d4bc9ef4e6eb1d131e837270f76dc62e79, 0xd667a61e822564e1399f73196c73b2c41bcbda69, 0x2348b91f2037799d6ae604d792101534461db06e, 0x1ae5482db2883e1ae8cdbfdbae95539266f1bf32, 0x9cde69ea28c9125060f86eb982305bafae57f585, 0x4bdd2b0f934eecce01a8fc47e3762ce86c9d061f, 0x63b96518024b49c8f16104fdfd9d94a79a3d185c, 0xa78be568bc5ec42c8e41734dadcb86d3dde73af3, 0x565656a354f6c2953eb2d00dc7e2e0ab815e19e7, 0x1184866ed937f4605efc100c1f18e028f7cbdd86, 0x3f56b53953adf3a65f5bb8e8dce1c4926e1d629c, 0x315f180e74247e01ca0377244eb6b6d1c7444452, 0x0ed76a80d639e7bf88524b63429bb841c1633e60, 0xd4771df4a0f6338f521512a1651d8db7ef5af633, 0x4bbc10317e5b70b6b491836f5b2b496ee35f5e31, 0xff601c3788236f231a8771cacbbb3087d0ee7a2c, 0x8c07c10a0a3530a9fb64c65f109a32f7b4b2db80, 0x0469a60f8fbc0c35c4d1d965a50a6bd29c9dab8c, 0xe292927a017d58823957a83ea5efeaf9c37d6f94, 0x7ade4961fccba087e8b4de84e8be61098daf0230]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-access-manager.json b/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-access-manager.json new file mode 100644 index 0000000..a1a5b6a --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743155675", + "gitBranch": "deploy/v1.0.5", + "gitCommitHash": "0x0x65c418860c22aecb27054e7a8c3207a4f87ad6af", + "blockInfo": { + "number": "22144647", + "timestamp": "1743155675" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-core.json b/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-core.json new file mode 100644 index 0000000..34b5474 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743518639", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x30f0c30e4edf518e2bf6700837dad2a7624d35df", + "blockInfo": { + "number": "22174730", + "timestamp": "1743518639" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x37Ba9934aAbA7a49cC29d0952C6a91d7c7043dbc", + "vaultFactory": "0x01D8C1e0584751085a876892151Bf8490e862E3E", + "oracleAggregator": "0xE3a31690392E8E18DC3d862651C079339E2c1ADE", + "router": "0xC47591F5c023e44931c78D5A993834875b79FB11", + "swapAdapter": { + "uniswapV3Adapter": "0x34F7b52b0d33959C8351eF95F3523C89b6123C0b", + "odosV2Adapter": "0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779", + "pendleSwapV3Adapter": "0x0B30251FA697A39Fd41813b267b50F03414E82da", + "ERC4626VaultAdapter": "0x85ce30537c14EFB66B673f284bEa7c28351244F6" + }, + "marketViewer": "0x74Dfb95Ae623123ecf82Ba841985fB460bB9d45D" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@10APR2025.json b/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@10APR2025.json new file mode 100644 index 0000000..5081ad1 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214655", + "timestamp": "1744000271" + }, + "market": "0x1B5596B24823109352d6c9FeF8c3186df68AFeE7", + "collateral": { + "address": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "symbol": "PT-sUSDE-29MAY2025", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x1B1Ef48a948696Ed367aDac232A28C5F1205918b", + "xt": "0xFA8627D4219eAAEB10F93419872294F09f9D72D7", + "gt": "0xfcCAe4a1B02E160010Ba7d0D97299456C8fb57C0" + }, + "config": { + "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-USDC-USUALUSDC+@10APR2025.json b/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-USDC-USUALUSDC+@10APR2025.json new file mode 100644 index 0000000..c9e7ee7 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-USDC-USUALUSDC+@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214655", + "timestamp": "1744000271" + }, + "market": "0xdD1f122F075438De597487494A3acb9C98601e0F", + "collateral": { + "address": "0xd63070114470f685b75B74D60EEc7c1113d33a3D", + "symbol": "USUALUSDC+", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x0dE1b0cd455139F162699847973AF08ebbd98c0B", + "xt": "0xB67E81A0CE4834FdC0B7Fef2A52A2DCe4D00756C", + "gt": "0x1db01Bb963Ea7f69DedabB148CDD253A23Fd3C86" + }, + "config": { + "marketSymbol": "USDC/USUALUSDC+@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-USDC-WBTC@10APR2025.json b/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-USDC-WBTC@10APR2025.json new file mode 100644 index 0000000..3c6d8c1 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-USDC-WBTC@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214655", + "timestamp": "1744000271" + }, + "market": "0xFB9Bd7Fa2a707eCC618a5DEc78a916AF3Bc27f8F", + "collateral": { + "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "symbol": "WBTC", + "priceFeed": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x601D83443eb61f8C8FC6115C937f32855FdcfdbF", + "xt": "0xEcbe342E80da2439535440b412DD74D790372179", + "gt": "0xF6654f28D2e92E0Bc03438b3590D56a8380a47D6" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-USDC-cbBTC@10APR2025.json b/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-USDC-cbBTC@10APR2025.json new file mode 100644 index 0000000..d6bdbd0 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-USDC-cbBTC@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214655", + "timestamp": "1744000271" + }, + "market": "0x68eb044886980d657B48094F9daB6CaCc4208Ba5", + "collateral": { + "address": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", + "symbol": "cbBTC", + "priceFeed": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xD0c19bF74d47E17404EdF8D57aDE39Ed0944f110", + "xt": "0x72e9052DFD7d4a3393956D32616cc53471f47093", + "gt": "0x3a1778527145d0C6B259055d5DBA2601F5AE1e19" + }, + "config": { + "marketSymbol": "USDC/cbBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-USDC-eUSDe@10APR2025.json b/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-USDC-eUSDe@10APR2025.json new file mode 100644 index 0000000..d9c0e34 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-USDC-eUSDe@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214655", + "timestamp": "1744000271" + }, + "market": "0x411cC697dC35362B1b2b87a1FBefD762CA017ed0", + "collateral": { + "address": "0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F", + "symbol": "eUSDe", + "priceFeed": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x4dBb4b99b98D7dE3E4335bC3B638D480546A0158", + "xt": "0x3E0cC1C776BCEFea410f95d78B7D4cc9c558aa52", + "gt": "0x4A9AeB1398DD87AA1449df58e8EE8578FCE2900f" + }, + "config": { + "marketSymbol": "USDC/eUSDe@29MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-USDC-sUSDe@10APR2025.json b/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-USDC-sUSDe@10APR2025.json new file mode 100644 index 0000000..12d8c3f --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-USDC-sUSDe@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214655", + "timestamp": "1744000271" + }, + "market": "0x37EA82A997Bb160291a05c1c86F869fAb1c4163A", + "collateral": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x60a11DA2Cc690F69F57ee57C12Ff8D599D1609bA", + "xt": "0x5086224274b1f38436B16C1Da5b9c5829F66E25C", + "gt": "0x79151612e7Ccc54fbCf0048f1Be93EB5aBf7E74d" + }, + "config": { + "marketSymbol": "USDC/sUSDe@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-USDC-wstETH@10APR2025.json b/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-USDC-wstETH@10APR2025.json new file mode 100644 index 0000000..f3cde9e --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-USDC-wstETH@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214655", + "timestamp": "1744000271" + }, + "market": "0x663e9f58e9ce3231A95a137F30E934ff6473bF9f", + "collateral": { + "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x44E07a9c79a15Cc743C7e04B55064A8bc596B752", + "xt": "0xE383f7f99D7F28A0EEDA31B20E8092E6534AA192", + "gt": "0x4AE866FfA4c8B5173E2239694bE5515C63C5DCfd" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-WETH-MCwETH@10APR2025.json b/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-WETH-MCwETH@10APR2025.json new file mode 100644 index 0000000..1c1408b --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-WETH-MCwETH@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214655", + "timestamp": "1744000271" + }, + "market": "0x06ca18bD6DC9dBDe841315A503AFA11Bd68c7DC8", + "collateral": { + "address": "0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8", + "symbol": "MCwETH", + "priceFeed": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xeBAfB711848c01271A9bd7A1A76A0bF4a5AaE193", + "xt": "0xe298937ac37A2DAA0ECe8C495c6F2ceeaED1795B", + "gt": "0x4Fd71e0D3d96D3B732Dc217CE9aca75acB17Fe62" + }, + "config": { + "marketSymbol": "WETH/MCwETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-WETH-gtWETH@10APR2025.json b/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-WETH-gtWETH@10APR2025.json new file mode 100644 index 0000000..f1e9236 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-WETH-gtWETH@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214655", + "timestamp": "1744000271" + }, + "market": "0xe27E75967c162F97Ab99cE4b0A881D5CB2ABec85", + "collateral": { + "address": "0x2371e134e3455e0593363cBF89d3b6cf53740618", + "symbol": "gtWETH", + "priceFeed": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x48Ba7d3Bb5A604c4e06bbAdb985aCF27a45Cb8d7", + "xt": "0xb76DFE249B9653A2C77216bf310438e6B2a8BdC5", + "gt": "0x200D174855f706e40B75eC5399fbdfAFEEFD02C2" + }, + "config": { + "marketSymbol": "WETH/gtWETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-WETH-pufETH@10APR2025.json b/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-WETH-pufETH@10APR2025.json new file mode 100644 index 0000000..2819ab3 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-WETH-pufETH@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214655", + "timestamp": "1744000271" + }, + "market": "0x9d813574687cb3B4b5C8F2311eEBa7382D5b229c", + "collateral": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xD2b14ca4Dc6cb7741752Ef9178ed4D5c094b6229", + "xt": "0x183F35437746cC8bCa62868B17d16Ab576EF1Cbf", + "gt": "0xcdec35492939e4c254Eec4492A4E9E7D1D939DAB" + }, + "config": { + "marketSymbol": "WETH/pufETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-WETH-weETH@10APR2025.json b/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-WETH-weETH@10APR2025.json new file mode 100644 index 0000000..d73c72d --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-WETH-weETH@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214655", + "timestamp": "1744000271" + }, + "market": "0xA4D14471FeD74B1664Fb888bcbA398dcBEBA2890", + "collateral": { + "address": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "21600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xbc6b184b468A9B7e2d165AdeA77b58773Db2a8c3", + "xt": "0xA9D9Cc4471D68433751691b2AbCbFad95A0330e2", + "gt": "0xE68AB0a7C0BE3d4c9149A8601c7Df566276CB11A" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@10APR2025.json b/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@10APR2025.json new file mode 100644 index 0000000..7bbb3ac --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250410-1400/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214655", + "timestamp": "1744000271" + }, + "market": "0x9647aa6Bd43D004Ff709737cc49Dae17a39Fd9d4", + "collateral": { + "address": "0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D", + "symbol": "PT-pufETH-26JUN2025", + "priceFeed": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x64cAa30d514b255bde2B3a39AAda58cFdE0C7bA6", + "xt": "0xf3c804B5F13ce6E6831687b5ace4d26B495Db588", + "gt": "0x6c6F9757BAD25b6A0091A1E83dbF8f3313d25FE0" + }, + "config": { + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250410-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt b/deployments/eth-mainnet-v1.0.8-20250410-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt new file mode 100644 index 0000000..81ca312 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250410-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt @@ -0,0 +1,21 @@ +== Logs == + Network: eth-mainnet + Deployer balance: 158879257545733090 + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175070 + Block timestamp: 1743522719 + + ===== Oracle Aggregator Info ===== + Deployer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Admin: 0x8409a9C1A911CED491892c5694E43994c9d47E8f + Oracle Aggregator deployed at: 0xE3a31690392E8E18DC3d862651C079339E2c1ADE + Oracle Timelock: 43200 + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250410-2000/deploy-market-eth-mainnet-20250410-2000-log.txt b/deployments/eth-mainnet-v1.0.8-20250410-2000/deploy-market-eth-mainnet-20250410-2000-log.txt new file mode 100644 index 0000000..387a918 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250410-2000/deploy-market-eth-mainnet-20250410-2000-log.txt @@ -0,0 +1,358 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ETHERSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0x5a059d3a272b20ad129ffbe37b9903a61a03595e + + ===== Block Info ===== + Block number: 22214690 + Block timestamp: 1744000691 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22214690 + + ===== Market Info - 0 ===== + Market deployed at: 0xBa22413143811e2863AdB9815c3c1beeAe8766ab + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x0E6A7700D64FCD7af9a4dF1A9D3cd00A06Ab193b + XT deployed at: 0xFb1F5B3EC13cA546112647340B7EF1Ca0b0eA2A8 + GT deployed at: 0xf45422F01FFEA4872EbBA68830b3BCf87B961975 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@10APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0x927F8fEF0F79cD65E03eaE5a9A644dAE45025804 + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x942898481a41431F9d3E0C6335b1b5B2A8cdC5d8 + XT deployed at: 0xe09782b410Cfeff541e96270f52f6e9C763CB551 + GT deployed at: 0xECF42B12940301Ed76DeF6580aAC4358d5bFC2B2 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@10APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0xf2f146797cEFC1E7B9f0dD3E858e3477cE29Dc6C + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x5fC681DeD819162eb51370b5e6F69EDB65656991 + XT deployed at: 0xB7AFC487446849C149E5d556F4bC2BDe413c055B + GT deployed at: 0xCAF9975c52590A6F793Bb7605c8431258942a323 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@10APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0x882e11F79Cf4967D5001ee6a375b323019f7a121 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xf063F502ddaA20AC85f8769af29E459bA0F8CB12 + XT deployed at: 0xe1c68d41862D0361369776972f112Fb37bf857Bd + GT deployed at: 0xFDa44d8e4Ba523b12EB87D1b66a5151fD419FC96 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@10APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x98f897cAa0ebB36797a5227D04Ce63CD35e38D2b + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x5f616EcF521d994C7C2FAe20517eCB751fafaCB7 + XT deployed at: 0xfCbF76b53CC9693B49400765e4e47371C99cd95F + GT deployed at: 0xF6620EaFDBD0169Bf2707c76AbDCDd1574F7024A + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@10APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x07c0846373017f2886A981c8847F077Ba2B8e2a9 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x2A1B7F154F9713719f9919edB5713CfE45cab80c + XT deployed at: 0xb80cB5a396874e24F50C0bd1B8bc77fa5a5f8F39 + GT deployed at: 0xa0562755Dc317c3E5da0a53bce37580F3bb67CF9 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@10APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0xd60adA320AE619549036411E7fb218835780f612 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0x4B33fA7073306E44B73B8D34B6562dF7f2C4dF23 + XT deployed at: 0xf7A8a1D12Cc3A676Dd83B580A084E365CEEE5238 + GT deployed at: 0xefc0d28E52460e1322A8Acee02E75873B8E2Df8f + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@10APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0xF94988fB79d47e50E2c5B7d1fc5F990358FBFce8 + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x0814D14829b503d331A4902D42918E3fcE320c04 + XT deployed at: 0x771F2a25D79f9C219BB34778571Ee735a49F3cBb + GT deployed at: 0x9d3C7afF92BB93A3FEFB302e3f9bE0ba99bCcD6E + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@10APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0xe02bF089843f5F53388a2269e8bcEA9933F89607 + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0xF4E47Ad40eBAA4200Ae031F861B6dCeCC220db4B + XT deployed at: 0x265037D05637093D5F61DE3476720896097ED0c3 + GT deployed at: 0x2A7A396EC323723d46C4c97Abd5cbC0A53c2a69c + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@10APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x56729807526bcEc3B55a635addD0ae59f748b202 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xB7Cfc2363c5695C6D029eee78Bb5A5353c15cb6e + XT deployed at: 0x548BbA937F8714e3303a57Ab4a61f72b7bd33FbE + GT deployed at: 0x5578295b2A30B901Ee5C6cdc1B2243Bf0590176F + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@10APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x825Cac9B7a5E5B9Eb2BCEAe75F163f2988e37CAC + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x7e0919cB1b09FA528f44Feea98Bb039fdE3a8D67 + XT deployed at: 0x5ADc52de3e7C6828c88B8911A3F2eF4A72e23d56 + GT deployed at: 0xE14FB406A99F1D67318a6Df128fef6A9C4a38359 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@10APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x0B0f1F8D08621ae44691541519022CdbaeE59e42 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0xCf717D019CCeAC3AF1b818bbC39D926209Ad8d0b + XT deployed at: 0x5309E4507f19a21a699cEb2968a4e12620a77686 + GT deployed at: 0xd7f068fCe893c2C54C2CAd638a3701Ac551509c2 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 10APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@10APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 2.39365893 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.04143038707474056 ETH + +========================== + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[ERROR] market deployment to eth-mainnet failed! +You can resume the failed deployment by running the same command with the --resume option: +./script.sh eth-mainnet deploy:market --broadcast --resume --verify diff --git a/deployments/eth-mainnet-v1.0.8-20250410-2000/deploy_markets_test_0402_log.txt b/deployments/eth-mainnet-v1.0.8-20250410-2000/deploy_markets_test_0402_log.txt new file mode 100644 index 0000000..236c256 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250410-2000/deploy_markets_test_0402_log.txt @@ -0,0 +1,370 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Enabled--verify +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175185 + Block timestamp: 1743524099 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22175185 + + ===== Market Info - 0 ===== + Market deployed at: 0x4a20DdEB8696b1f542649626889522068cc19438 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x00B210A7f79653A0fe7e2bc31d6Fe3026421195d + XT deployed at: 0x465c30b940E792262Ef65B7Fe7A5bAd3b5b7f034 + GT deployed at: 0xca3F986978ADEf5aA8e4F9e4F3d27f6f4Eb3f47d + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@02APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xC8c3A49b64dB371F96EdC15941e043966297Ea6b + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x19632ff799BA54B54934b52a89964F6cb12D396f + XT deployed at: 0xe459c64a852Df70Ea7D0cc46142A1a0d8BCd4f2A + GT deployed at: 0x9CEA72e4C7Fd1dd0bb2D0AAF98D756B1f85e096D + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@02APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x54ACdb3da45bBDEb1a53e1E3F6DB51C8384c7F9c + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x3ebabb95e4276DD2850666a95037f5EE3bb798Bb + XT deployed at: 0xb7d4329b11Dff286890F4d7e5b10763E09E8804C + GT deployed at: 0x28C108FD44B2E58DD9B07CBE453c0BCF836b8CB7 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@02APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xf2F9b0fDD5D22e574421A7Ee0E29e410E63C70A9 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x594Db033Ade81E0C8182B66d2B07fbc97452d1FA + XT deployed at: 0x544786112d542910634109BcCEF84C3Deb1b65e0 + GT deployed at: 0x81CAc518B14B28570C667A143F801bF2e05b6BEe + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@02APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x10aCD317ebf3F65e30c72720D89c55B7C68a9628 + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xA03710F73585cb5458F43739624611633Bf24173 + XT deployed at: 0x80525c75690102bb024BcEd8bE81D18A56172EC0 + GT deployed at: 0xe2e5403923B0421FA5a9D28c1012aeAFfc820f02 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@02APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x49913B7Bd178e21FaC84C3dED810Ff4CcDcb8403 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x8CDe48E20b5d77C3ec0fbCbf50d0C78B2DE11264 + XT deployed at: 0x8b596614c9ac30bd9DF615c3C18F0f05a97F0779 + GT deployed at: 0xBA03824B38E83B7CBAF3Fcb5aF02EF8342A110d8 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@02APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x69E1A695Ee24e7BcFc55d2dA7DfD479E4C7Eb6A3 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0xc7d5476d361C8d0E5c0478EA320431AD4a49A558 + XT deployed at: 0xe1710D5449241ce311Bfcefb5272594ECD930ec0 + GT deployed at: 0x4B87E9281de9573f2025565E632bdb8F136766E5 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@02APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0x9dA149D4Bc9eF4e6Eb1D131E837270f76dc62e79 + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD667a61e822564e1399f73196c73B2C41bCBda69 + XT deployed at: 0x2348B91F2037799d6AE604D792101534461DB06E + GT deployed at: 0x1aE5482Db2883e1ae8CDBFDbaE95539266F1bF32 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@02APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0x9cde69Ea28c9125060F86eB982305BafaE57f585 + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x4bDD2b0f934EECCE01A8Fc47E3762Ce86C9D061F + XT deployed at: 0x63B96518024b49C8F16104fDFd9d94a79A3d185C + GT deployed at: 0xa78bE568bc5ec42C8E41734dADcb86D3dde73af3 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@02APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x565656a354F6C2953EB2D00DC7e2e0Ab815e19E7 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x1184866Ed937F4605efc100c1f18E028F7CBDD86 + XT deployed at: 0x3F56b53953adf3a65f5Bb8E8Dce1C4926e1D629c + GT deployed at: 0x315f180e74247E01ca0377244Eb6b6D1c7444452 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@02APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x0ed76A80D639E7Bf88524b63429bB841c1633E60 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD4771df4a0f6338f521512A1651D8DB7EF5Af633 + XT deployed at: 0x4bbc10317e5b70B6B491836F5B2b496EE35f5E31 + GT deployed at: 0xFF601c3788236F231a8771cACBbB3087D0Ee7A2c + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@02APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x8c07c10a0a3530a9fB64c65f109A32F7B4b2DB80 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x0469A60F8fbc0c35c4D1D965a50A6Bd29c9dAB8C + XT deployed at: 0xE292927A017d58823957A83ea5EFeAF9C37D6F94 + GT deployed at: 0x7AdE4961Fccba087E8b4De84E8be61098Daf0230 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@02APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 5.079885262 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.087924645429718704 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x4a20ddeb8696b1f542649626889522068cc19438, 0x00b210a7f79653a0fe7e2bc31d6fe3026421195d, 0x465c30b940e792262ef65b7fe7a5bad3b5b7f034, 0xca3f986978adef5aa8e4f9e4f3d27f6f4eb3f47d, 0xc8c3a49b64db371f96edc15941e043966297ea6b, 0x19632ff799ba54b54934b52a89964f6cb12d396f, 0xe459c64a852df70ea7d0cc46142a1a0d8bcd4f2a, 0x9cea72e4c7fd1dd0bb2d0aaf98d756b1f85e096d, 0x54acdb3da45bbdeb1a53e1e3f6db51c8384c7f9c, 0x3ebabb95e4276dd2850666a95037f5ee3bb798bb, 0xb7d4329b11dff286890f4d7e5b10763e09e8804c, 0x28c108fd44b2e58dd9b07cbe453c0bcf836b8cb7, 0xf2f9b0fdd5d22e574421a7ee0e29e410e63c70a9, 0x594db033ade81e0c8182b66d2b07fbc97452d1fa, 0x544786112d542910634109bccef84c3deb1b65e0, 0x81cac518b14b28570c667a143f801bf2e05b6bee, 0x10acd317ebf3f65e30c72720d89c55b7c68a9628, 0xa03710f73585cb5458f43739624611633bf24173, 0x80525c75690102bb024bced8be81d18a56172ec0, 0xe2e5403923b0421fa5a9d28c1012aeaffc820f02, 0x49913b7bd178e21fac84c3ded810ff4ccdcb8403, 0x8cde48e20b5d77c3ec0fbcbf50d0c78b2de11264, 0x8b596614c9ac30bd9df615c3c18f0f05a97f0779, 0xba03824b38e83b7cbaf3fcb5af02ef8342a110d8, 0x69e1a695ee24e7bcfc55d2da7dfd479e4c7eb6a3, 0xc7d5476d361c8d0e5c0478ea320431ad4a49a558, 0xe1710d5449241ce311bfcefb5272594ecd930ec0, 0x4b87e9281de9573f2025565e632bdb8f136766e5, 0x9da149d4bc9ef4e6eb1d131e837270f76dc62e79, 0xd667a61e822564e1399f73196c73b2c41bcbda69, 0x2348b91f2037799d6ae604d792101534461db06e, 0x1ae5482db2883e1ae8cdbfdbae95539266f1bf32, 0x9cde69ea28c9125060f86eb982305bafae57f585, 0x4bdd2b0f934eecce01a8fc47e3762ce86c9d061f, 0x63b96518024b49c8f16104fdfd9d94a79a3d185c, 0xa78be568bc5ec42c8e41734dadcb86d3dde73af3, 0x565656a354f6c2953eb2d00dc7e2e0ab815e19e7, 0x1184866ed937f4605efc100c1f18e028f7cbdd86, 0x3f56b53953adf3a65f5bb8e8dce1c4926e1d629c, 0x315f180e74247e01ca0377244eb6b6d1c7444452, 0x0ed76a80d639e7bf88524b63429bb841c1633e60, 0xd4771df4a0f6338f521512a1651d8db7ef5af633, 0x4bbc10317e5b70b6b491836f5b2b496ee35f5e31, 0xff601c3788236f231a8771cacbbb3087d0ee7a2c, 0x8c07c10a0a3530a9fb64c65f109a32f7b4b2db80, 0x0469a60f8fbc0c35c4d1d965a50a6bd29c9dab8c, 0xe292927a017d58823957a83ea5efeaf9c37d6f94, 0x7ade4961fccba087e8b4de84e8be61098daf0230]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-access-manager.json b/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-access-manager.json new file mode 100644 index 0000000..a1a5b6a --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743155675", + "gitBranch": "deploy/v1.0.5", + "gitCommitHash": "0x0x65c418860c22aecb27054e7a8c3207a4f87ad6af", + "blockInfo": { + "number": "22144647", + "timestamp": "1743155675" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-core.json b/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-core.json new file mode 100644 index 0000000..34b5474 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743518639", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x30f0c30e4edf518e2bf6700837dad2a7624d35df", + "blockInfo": { + "number": "22174730", + "timestamp": "1743518639" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x37Ba9934aAbA7a49cC29d0952C6a91d7c7043dbc", + "vaultFactory": "0x01D8C1e0584751085a876892151Bf8490e862E3E", + "oracleAggregator": "0xE3a31690392E8E18DC3d862651C079339E2c1ADE", + "router": "0xC47591F5c023e44931c78D5A993834875b79FB11", + "swapAdapter": { + "uniswapV3Adapter": "0x34F7b52b0d33959C8351eF95F3523C89b6123C0b", + "odosV2Adapter": "0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779", + "pendleSwapV3Adapter": "0x0B30251FA697A39Fd41813b267b50F03414E82da", + "ERC4626VaultAdapter": "0x85ce30537c14EFB66B673f284bEa7c28351244F6" + }, + "marketViewer": "0x74Dfb95Ae623123ecf82Ba841985fB460bB9d45D" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@10APR2025.json b/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@10APR2025.json new file mode 100644 index 0000000..4ffedfd --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214690", + "timestamp": "1744000691" + }, + "market": "0x882e11F79Cf4967D5001ee6a375b323019f7a121", + "collateral": { + "address": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "symbol": "PT-sUSDE-29MAY2025", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xf063F502ddaA20AC85f8769af29E459bA0F8CB12", + "xt": "0xe1c68d41862D0361369776972f112Fb37bf857Bd", + "gt": "0xFDa44d8e4Ba523b12EB87D1b66a5151fD419FC96" + }, + "config": { + "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-USDC-USUALUSDC+@10APR2025.json b/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-USDC-USUALUSDC+@10APR2025.json new file mode 100644 index 0000000..aeba8b7 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-USDC-USUALUSDC+@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214690", + "timestamp": "1744000691" + }, + "market": "0x98f897cAa0ebB36797a5227D04Ce63CD35e38D2b", + "collateral": { + "address": "0xd63070114470f685b75B74D60EEc7c1113d33a3D", + "symbol": "USUALUSDC+", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x5f616EcF521d994C7C2FAe20517eCB751fafaCB7", + "xt": "0xfCbF76b53CC9693B49400765e4e47371C99cd95F", + "gt": "0xF6620EaFDBD0169Bf2707c76AbDCDd1574F7024A" + }, + "config": { + "marketSymbol": "USDC/USUALUSDC+@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-USDC-WBTC@10APR2025.json b/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-USDC-WBTC@10APR2025.json new file mode 100644 index 0000000..4ca66a2 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-USDC-WBTC@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214690", + "timestamp": "1744000691" + }, + "market": "0x56729807526bcEc3B55a635addD0ae59f748b202", + "collateral": { + "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "symbol": "WBTC", + "priceFeed": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xB7Cfc2363c5695C6D029eee78Bb5A5353c15cb6e", + "xt": "0x548BbA937F8714e3303a57Ab4a61f72b7bd33FbE", + "gt": "0x5578295b2A30B901Ee5C6cdc1B2243Bf0590176F" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-USDC-cbBTC@10APR2025.json b/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-USDC-cbBTC@10APR2025.json new file mode 100644 index 0000000..ae0f472 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-USDC-cbBTC@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214690", + "timestamp": "1744000691" + }, + "market": "0x825Cac9B7a5E5B9Eb2BCEAe75F163f2988e37CAC", + "collateral": { + "address": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", + "symbol": "cbBTC", + "priceFeed": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x7e0919cB1b09FA528f44Feea98Bb039fdE3a8D67", + "xt": "0x5ADc52de3e7C6828c88B8911A3F2eF4A72e23d56", + "gt": "0xE14FB406A99F1D67318a6Df128fef6A9C4a38359" + }, + "config": { + "marketSymbol": "USDC/cbBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-USDC-eUSDe@10APR2025.json b/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-USDC-eUSDe@10APR2025.json new file mode 100644 index 0000000..1e28bec --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-USDC-eUSDe@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214690", + "timestamp": "1744000691" + }, + "market": "0xF94988fB79d47e50E2c5B7d1fc5F990358FBFce8", + "collateral": { + "address": "0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F", + "symbol": "eUSDe", + "priceFeed": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x0814D14829b503d331A4902D42918E3fcE320c04", + "xt": "0x771F2a25D79f9C219BB34778571Ee735a49F3cBb", + "gt": "0x9d3C7afF92BB93A3FEFB302e3f9bE0ba99bCcD6E" + }, + "config": { + "marketSymbol": "USDC/eUSDe@29MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-USDC-sUSDe@10APR2025.json b/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-USDC-sUSDe@10APR2025.json new file mode 100644 index 0000000..7ffaa1e --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-USDC-sUSDe@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214690", + "timestamp": "1744000691" + }, + "market": "0xf2f146797cEFC1E7B9f0dD3E858e3477cE29Dc6C", + "collateral": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x5fC681DeD819162eb51370b5e6F69EDB65656991", + "xt": "0xB7AFC487446849C149E5d556F4bC2BDe413c055B", + "gt": "0xCAF9975c52590A6F793Bb7605c8431258942a323" + }, + "config": { + "marketSymbol": "USDC/sUSDe@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-USDC-wstETH@10APR2025.json b/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-USDC-wstETH@10APR2025.json new file mode 100644 index 0000000..2564740 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-USDC-wstETH@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214690", + "timestamp": "1744000691" + }, + "market": "0x927F8fEF0F79cD65E03eaE5a9A644dAE45025804", + "collateral": { + "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x942898481a41431F9d3E0C6335b1b5B2A8cdC5d8", + "xt": "0xe09782b410Cfeff541e96270f52f6e9C763CB551", + "gt": "0xECF42B12940301Ed76DeF6580aAC4358d5bFC2B2" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-WETH-MCwETH@10APR2025.json b/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-WETH-MCwETH@10APR2025.json new file mode 100644 index 0000000..c7939bb --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-WETH-MCwETH@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214690", + "timestamp": "1744000691" + }, + "market": "0x07c0846373017f2886A981c8847F077Ba2B8e2a9", + "collateral": { + "address": "0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8", + "symbol": "MCwETH", + "priceFeed": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x2A1B7F154F9713719f9919edB5713CfE45cab80c", + "xt": "0xb80cB5a396874e24F50C0bd1B8bc77fa5a5f8F39", + "gt": "0xa0562755Dc317c3E5da0a53bce37580F3bb67CF9" + }, + "config": { + "marketSymbol": "WETH/MCwETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-WETH-gtWETH@10APR2025.json b/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-WETH-gtWETH@10APR2025.json new file mode 100644 index 0000000..d434f6a --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-WETH-gtWETH@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214690", + "timestamp": "1744000691" + }, + "market": "0x0B0f1F8D08621ae44691541519022CdbaeE59e42", + "collateral": { + "address": "0x2371e134e3455e0593363cBF89d3b6cf53740618", + "symbol": "gtWETH", + "priceFeed": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xCf717D019CCeAC3AF1b818bbC39D926209Ad8d0b", + "xt": "0x5309E4507f19a21a699cEb2968a4e12620a77686", + "gt": "0xd7f068fCe893c2C54C2CAd638a3701Ac551509c2" + }, + "config": { + "marketSymbol": "WETH/gtWETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-WETH-pufETH@10APR2025.json b/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-WETH-pufETH@10APR2025.json new file mode 100644 index 0000000..db3ed33 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-WETH-pufETH@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214690", + "timestamp": "1744000691" + }, + "market": "0xe02bF089843f5F53388a2269e8bcEA9933F89607", + "collateral": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xF4E47Ad40eBAA4200Ae031F861B6dCeCC220db4B", + "xt": "0x265037D05637093D5F61DE3476720896097ED0c3", + "gt": "0x2A7A396EC323723d46C4c97Abd5cbC0A53c2a69c" + }, + "config": { + "marketSymbol": "WETH/pufETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-WETH-weETH@10APR2025.json b/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-WETH-weETH@10APR2025.json new file mode 100644 index 0000000..a138639 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-WETH-weETH@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214690", + "timestamp": "1744000691" + }, + "market": "0xBa22413143811e2863AdB9815c3c1beeAe8766ab", + "collateral": { + "address": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "21600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x0E6A7700D64FCD7af9a4dF1A9D3cd00A06Ab193b", + "xt": "0xFb1F5B3EC13cA546112647340B7EF1Ca0b0eA2A8", + "gt": "0xf45422F01FFEA4872EbBA68830b3BCf87B961975" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@10APR2025.json b/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@10APR2025.json new file mode 100644 index 0000000..2ea9af9 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250410-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@10APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22214690", + "timestamp": "1744000691" + }, + "market": "0xd60adA320AE619549036411E7fb218835780f612", + "collateral": { + "address": "0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D", + "symbol": "PT-pufETH-26JUN2025", + "priceFeed": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x4B33fA7073306E44B73B8D34B6562dF7f2C4dF23", + "xt": "0xf7A8a1D12Cc3A676Dd83B580A084E365CEEE5238", + "gt": "0xefc0d28E52460e1322A8Acee02E75873B8E2Df8f" + }, + "config": { + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "10APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/accept-oracles-20250418-log.txt b/deployments/eth-mainnet-v1.0.8-20250530/accept-oracles-20250418-log.txt new file mode 100644 index 0000000..65cd055 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/accept-oracles-20250418-log.txt @@ -0,0 +1,77 @@ + ./script.sh eth-mainnet script:AcceptOracles --broadcast --verify +Running on eth-mainnet... +=== Configuration === +Operation: Script Execution +Network: eth-mainnet +Script: AcceptOracles.s.sol +Path: script/AcceptOracles.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Enabled--verify +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting script execution... +Executing: forge script script/AcceptOracles.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify +warning: Found unknown config section in foundry.toml: [soldeer] +This notation for profiles has been deprecated and may result in the profile not being registered in future versions. +Please use [profile.soldeer] instead or run `forge config --fix`. +[⠒] Compiling... +No files changed, compilation skipped +Script ran successfully. + +== Logs == + === Checking Pending Oracles === + Oracle Aggregator Address: 0xE3a31690392E8E18DC3d862651C079339E2c1ADE + Network: eth-mainnet + Current Block Timestamp: 1744907987 + + Accepted oracle for token: + Token Symbol: MC_USDCP + Token Address: 0xf1fd8AC6346eC7BC4116Ba7aDc81102B2BC4C52D + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x4cF5F12c6c0D48F0d335DdB25e11cd526EAfD322 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: gtusdcf + Token Address: 0xc582F04d8a82795aa2Ff9c8bb4c1c889fe7b754e + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x81195F8A79f6553A4078f89eF87b21a7d3C2855A + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: mhyETH + Token Address: 0x701907283a57FF77E255C3f1aAD790466B8CE4ef + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x0221cd3fA8B1Bea16293fb0cD6B60977d531c931 + Heartbeat: 86400 + -------------------------------- + + === Oracle Acceptance Summary === + Total tokens checked: 5 + Oracles accepted: 3 + Oracles not ready: 2 + + === Oracles Not Ready for Acceptance === + 1. USDC (0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48) + Price Feed: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Backup Price Feed: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Heartbeat: 86400 + Status: Oracle is already configured with the correct values + --- + 2. WETH (0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2) + Price Feed: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Backup Price Feed: 0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4 + Heartbeat: 86400 + Status: Oracle is already configured with the correct values + --- + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/deploy-eth-mainnet-oracle-aggregator-0401-log.txt b/deployments/eth-mainnet-v1.0.8-20250530/deploy-eth-mainnet-oracle-aggregator-0401-log.txt new file mode 100644 index 0000000..81ca312 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/deploy-eth-mainnet-oracle-aggregator-0401-log.txt @@ -0,0 +1,21 @@ +== Logs == + Network: eth-mainnet + Deployer balance: 158879257545733090 + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175070 + Block timestamp: 1743522719 + + ===== Oracle Aggregator Info ===== + Deployer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Admin: 0x8409a9C1A911CED491892c5694E43994c9d47E8f + Oracle Aggregator deployed at: 0xE3a31690392E8E18DC3d862651C079339E2c1ADE + Oracle Timelock: 43200 + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/deploy-eth-markets-20250530.txt b/deployments/eth-mainnet-v1.0.8-20250530/deploy-eth-markets-20250530.txt new file mode 100644 index 0000000..e448f27 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/deploy-eth-markets-20250530.txt @@ -0,0 +1,396 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ETHERSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0x561b96a021112cba8323e544ec0268dd640b4a22 + + ===== Block Info ===== + Block number: 22232653 + Block timestamp: 1744217435 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22232653 + + ===== Market Info - 0 ===== + Market deployed at: 0x0B7eFE5DE3c3B5d75de33e25965b193d6Ba79f52 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x409E45a47629F45B91607Bb87bcD8D043f32Bc9a + XT deployed at: 0x21aD8e3b575b65f2c937b201749a738ec53786E8 + GT deployed at: 0x02DA4fdA501396e036DCB591827e938E25Fe3DD4 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 30MAY2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@30MAY2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xEd7cD45E5e6ef68261929B58539805bA3c061f14 + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x94b0b2679bDEe922039D8B0Bb952F5048FF8B87f + XT deployed at: 0xbD99501360FFe943C60546C422f4885Ea022FcbC + GT deployed at: 0xEF15C2C9D5213FE471d9d28a8908cd3b007c4539 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 30MAY2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@30MAY2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x6f5c8838E618448e43385E4C401006822Aa15142 + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x1be1A3B4A052F669F521F5966a37B49171AEF57C + XT deployed at: 0x7705d2B0990192c3b3d1ea6C3A7908250605120A + GT deployed at: 0x1bb662b38EC6ff531DeF9CAa37a3489c7F5e2f98 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 30MAY2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@30MAY2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xe867255dC0c3a27c90f756ECC566a5292ce19492 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x07Ef01ba0947eb64df31A826C8a084Ca005e545d + XT deployed at: 0xb58036be9723Ba7766161ddb8d4050B3c44dc273 + GT deployed at: 0x3A888cb50b4b1BfCB61507D4a453eF67BA1E4055 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 30MAY2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@30MAY2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x352D81f954C37C2defAaD1B43531a1131983043F + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x00996971EFEC45402b0F135468C3dEe00bDAF44f + XT deployed at: 0xC034b54C49843185c6b328847abaB31eEB12DA27 + GT deployed at: 0x76318548169af6d6df07544E7E75e8cB07b31927 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 30MAY2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@30MAY2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x09722C9CB389f6Ebf5ac9C33eB0067949a3a063a + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x5365f147fCA4298380947edD4919b8814e5eb6ec + XT deployed at: 0x01792484Eb39399921663Ddd814d241fA69425Fd + GT deployed at: 0xF601D19D6285741D9Abd6D1E37f32A1533622A29 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 30MAY2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@30MAY2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0xBebB5CEe893110cF477901AF7FA94E4840606421 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0x5db7A477dEdE7d12feA665312282E052e0207FC1 + XT deployed at: 0xE8a7A6dD9218202996D9cF825426Ab283b3396eD + GT deployed at: 0x69cf2ACd3499dF9b322d3B3Fb579E1Af420f601d + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 30MAY2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@30MAY2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0x403863917316Bf8AA1966F9D90b393Cec98F991b + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x7E5dA817e4cD2f2a897c997FB6EB3506d9861432 + XT deployed at: 0x9C4ef4476130f92CEF4b661f99130157d35129CD + GT deployed at: 0xe09Ad59438A1EA4041217cd1Ee018589DB508268 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 29MAY2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@29MAY2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0x484CDece3FC951a7D009b9dBAC66EC287eC1f58e + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0xc74Af187D844dC35998271B5696053CF57816413 + XT deployed at: 0x1f2f2af9FbBa146CB03B4eAFD8C8aE9ed5B91F60 + GT deployed at: 0x89BCE5e162cdB10ea0d0B84B5E7Aff8F51036E89 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 30MAY2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@30MAY2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0xd699EFC4162d76BfD3cB553D65f850c882C29F5F + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x0297807b6f251431BC60D96E74DADDAaaCD8533E + XT deployed at: 0x68f2E8b2B09122475c5208456A39CAF87a097fE4 + GT deployed at: 0xBe53610FD2870BA0f221c40ed734f173685e3666 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 30MAY2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@30MAY2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x03f2Af12aE4eb5533c3f7773BE826e8da56F6E1a + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x970D02242B8339Fc3148643A00e0a1e52c1eb5Eb + XT deployed at: 0xf1f31F2668ADa8400d91BfC00f9a3c316c538cB3 + GT deployed at: 0x49d06206055e0cbDcbE94257782284B69b4B15Fd + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 30MAY2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@30MAY2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0xc68a2fbD7cb560c71CcAfbDeE971824Ed9bF4556 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0xD31d16770d10fEee37FEc90777697546F5388F85 + XT deployed at: 0xa7DbC90d2959E40EB093Abe75C7405Ff26ac3fE3 + GT deployed at: 0x9BdD5071f150d02Af43A65e56A0622d03E846DdB + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 30MAY2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@30MAY2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 2.158515108 gwei + +Estimated total gas used for script: 17548228 + +Estimated amount required: 0.037878115256628624 ETH + +========================== + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[ERROR] market deployment to eth-mainnet failed! +You can resume the failed deployment by running the same command with the --resume option: +./script.sh eth-mainnet deploy:market --broadcast --resume --verify +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Enabled (will resume from last broadcasted transaction) +Verification: Enabled--verify +Using API Key: ETHERSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --resume --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x0b7efe5de3c3b5d75de33e25965b193d6ba79f52, 0x409e45a47629f45b91607bb87bcd8d043f32bc9a, 0x21ad8e3b575b65f2c937b201749a738ec53786e8, 0x02da4fda501396e036dcb591827e938e25fe3dd4, 0xed7cd45e5e6ef68261929b58539805ba3c061f14, 0x94b0b2679bdee922039d8b0bb952f5048ff8b87f, 0xbd99501360ffe943c60546c422f4885ea022fcbc, 0xef15c2c9d5213fe471d9d28a8908cd3b007c4539, 0x6f5c8838e618448e43385e4c401006822aa15142, 0x1be1a3b4a052f669f521f5966a37b49171aef57c, 0x7705d2b0990192c3b3d1ea6c3a7908250605120a, 0x1bb662b38ec6ff531def9caa37a3489c7f5e2f98, 0xe867255dc0c3a27c90f756ecc566a5292ce19492, 0x07ef01ba0947eb64df31a826c8a084ca005e545d, 0xb58036be9723ba7766161ddb8d4050b3c44dc273, 0x3a888cb50b4b1bfcb61507d4a453ef67ba1e4055, 0x352d81f954c37c2defaad1b43531a1131983043f, 0x00996971efec45402b0f135468c3dee00bdaf44f, 0xc034b54c49843185c6b328847abab31eeb12da27, 0x76318548169af6d6df07544e7e75e8cb07b31927, 0x09722c9cb389f6ebf5ac9c33eb0067949a3a063a, 0x5365f147fca4298380947edd4919b8814e5eb6ec, 0x01792484eb39399921663ddd814d241fa69425fd, 0xf601d19d6285741d9abd6d1e37f32a1533622a29, 0xbebb5cee893110cf477901af7fa94e4840606421, 0x5db7a477dede7d12fea665312282e052e0207fc1, 0xe8a7a6dd9218202996d9cf825426ab283b3396ed, 0x69cf2acd3499df9b322d3b3fb579e1af420f601d, 0x403863917316bf8aa1966f9d90b393cec98f991b, 0x7e5da817e4cd2f2a897c997fb6eb3506d9861432, 0x9c4ef4476130f92cef4b661f99130157d35129cd, 0xe09ad59438a1ea4041217cd1ee018589db508268, 0x484cdece3fc951a7d009b9dbac66ec287ec1f58e, 0xc74af187d844dc35998271b5696053cf57816413, 0x1f2f2af9fbba146cb03b4eafd8c8ae9ed5b91f60, 0x89bce5e162cdb10ea0d0b84b5e7aff8f51036e89, 0xd699efc4162d76bfd3cb553d65f850c882c29f5f, 0x0297807b6f251431bc60d96e74daddaaacd8533e, 0x68f2e8b2b09122475c5208456a39caf87a097fe4, 0xbe53610fd2870ba0f221c40ed734f173685e3666, 0x03f2af12ae4eb5533c3f7773be826e8da56f6e1a, 0x970d02242b8339fc3148643a00e0a1e52c1eb5eb, 0xf1f31f2668ada8400d91bfc00f9a3c316c538cb3, 0x49d06206055e0cbdcbe94257782284b69b4b15fd, 0xc68a2fbd7cb560c71ccafbdee971824ed9bf4556, 0xd31d16770d10feee37fec90777697546f5388f85, 0xa7dbc90d2959e40eb093abe75c7405ff26ac3fe3, 0x9bdd5071f150d02af43a65e56a0622d03e846ddb]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-20250530/deploy-markets-20250417-log.txt b/deployments/eth-mainnet-v1.0.8-20250530/deploy-markets-20250417-log.txt new file mode 100644 index 0000000..4dcb173 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/deploy-markets-20250417-log.txt @@ -0,0 +1,122 @@ +./script.sh eth-mainnet deploy:market --broadcast --verify +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Enabled--verify +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify +warning: Found unknown config section in foundry.toml: [soldeer] +This notation for profiles has been deprecated and may result in the profile not being registered in future versions. +Please use [profile.soldeer] instead or run `forge config --fix`. +[⠒] Compiling... +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.9 + Git commit hash: + 0x4402458004a3655ec11709e2f86118ae7bfd0d18 + + ===== Block Info ===== + Block number: 22286356 + Block timestamp: 1744864451 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22286356 + + ===== Market Info - 0 ===== + Market deployed at: 0xf4924D6189552ae5A7818088dA6f23Bd33281C1b + Market name: USDC/MC_USDCP@30MAY2025 + Market symbol: USDC/MC_USDCP@30MAY2025 + Collateral (MC_USDCP) address: 0xf1fd8AC6346eC7BC4116Ba7aDc81102B2BC4C52D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x4cF5F12c6c0D48F0d335DdB25e11cd526EAfD322 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xe7b3c858FF8031DC6c84D899aEeC343c89A246e0 + XT deployed at: 0x2568d2B892b5c761e1155F4f1c05E5b61961f126 + GT deployed at: 0x5C4db8DB0CA1d040e7fD6FB2AfAA81032df0a4f7 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 30MAY2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-MC_USDCP@30MAY2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0x2EaafFbCdE68337341C0eC65A862e648A413dc14 + Market name: USDC/gtusdcf@30MAY2025 + Market symbol: USDC/gtusdcf@30MAY2025 + Collateral (gtusdcf) address: 0xc582F04d8a82795aa2Ff9c8bb4c1c889fe7b754e + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x81195F8A79f6553A4078f89eF87b21a7d3C2855A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x09ec4BE9869BfAbF9fF6652fe7703276D6F5E5d8 + XT deployed at: 0x9c7fBdd0055604bbf7736B153407e9513C818C22 + GT deployed at: 0x8Ee590224c6cddE0d27FB60B37B05784dD794E59 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 30MAY2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-gtusdcf@30MAY2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0xb9919eE2169a7dA664AD024C6dDCF0ccD4121C26 + Market name: WETH/mhyETH@30MAY2025 + Market symbol: WETH/mhyETH@30MAY2025 + Collateral (mhyETH) address: 0x701907283a57FF77E255C3f1aAD790466B8CE4ef + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0x0221cd3fA8B1Bea16293fb0cD6B60977d531c931 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 86400 + FT deployed at: 0xbC9c191613c6e77c03A3F792579520d455e852a6 + XT deployed at: 0x1aA1fF0D8c47066C72902040716F91Df18090ADc + GT deployed at: 0x489f04a08d6ee13789cd59c5ce241494b063b3DB + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 30MAY2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-mhyETH@30MAY2025.json + + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/deploy-price-feeds-morpho-20250417-log.txt b/deployments/eth-mainnet-v1.0.8-20250530/deploy-price-feeds-morpho-20250417-log.txt new file mode 100644 index 0000000..02bf798 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/deploy-price-feeds-morpho-20250417-log.txt @@ -0,0 +1,21 @@ +% forge script script/deploy/DeployPriceFeedsMorpho.s.sol --rpc-url $ETH_MAINNET_RPC_URL --broadcast --verify +warning: Found unknown config section in foundry.toml: [soldeer] +This notation for profiles has been deprecated and may result in the profile not being registered in future versions. +Please use [profile.soldeer] instead or run `forge config --fix`. +[⠒] Compiling... +No files changed, compilation skipped +Script ran successfully. + +== Logs == + gtusdcf price feed address 0x81195F8A79f6553A4078f89eF87b21a7d3C2855A + gtusdcf last answer 101266087 + mhyETH price feed address 0x0221cd3fA8B1Bea16293fb0cD6B60977d531c931 + mhyETH last answer 161205311756 + mhyETHBackup price feed address 0x00B96F0eBf39158cb4E3F801073966bD6Db7959C + mhyETHBackup last answer 162030447776 + mevUsdcPrime price feed address 0x4cF5F12c6c0D48F0d335DdB25e11cd526EAfD322 + mevUsdcPrime last answer 99992088 + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/deploy_markets_test_0402_log.txt b/deployments/eth-mainnet-v1.0.8-20250530/deploy_markets_test_0402_log.txt new file mode 100644 index 0000000..236c256 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/deploy_markets_test_0402_log.txt @@ -0,0 +1,370 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Enabled--verify +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175185 + Block timestamp: 1743524099 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22175185 + + ===== Market Info - 0 ===== + Market deployed at: 0x4a20DdEB8696b1f542649626889522068cc19438 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x00B210A7f79653A0fe7e2bc31d6Fe3026421195d + XT deployed at: 0x465c30b940E792262Ef65B7Fe7A5bAd3b5b7f034 + GT deployed at: 0xca3F986978ADEf5aA8e4F9e4F3d27f6f4Eb3f47d + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@02APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xC8c3A49b64dB371F96EdC15941e043966297Ea6b + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x19632ff799BA54B54934b52a89964F6cb12D396f + XT deployed at: 0xe459c64a852Df70Ea7D0cc46142A1a0d8BCd4f2A + GT deployed at: 0x9CEA72e4C7Fd1dd0bb2D0AAF98D756B1f85e096D + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@02APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x54ACdb3da45bBDEb1a53e1E3F6DB51C8384c7F9c + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x3ebabb95e4276DD2850666a95037f5EE3bb798Bb + XT deployed at: 0xb7d4329b11Dff286890F4d7e5b10763E09E8804C + GT deployed at: 0x28C108FD44B2E58DD9B07CBE453c0BCF836b8CB7 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@02APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xf2F9b0fDD5D22e574421A7Ee0E29e410E63C70A9 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x594Db033Ade81E0C8182B66d2B07fbc97452d1FA + XT deployed at: 0x544786112d542910634109BcCEF84C3Deb1b65e0 + GT deployed at: 0x81CAc518B14B28570C667A143F801bF2e05b6BEe + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@02APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x10aCD317ebf3F65e30c72720D89c55B7C68a9628 + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xA03710F73585cb5458F43739624611633Bf24173 + XT deployed at: 0x80525c75690102bb024BcEd8bE81D18A56172EC0 + GT deployed at: 0xe2e5403923B0421FA5a9D28c1012aeAFfc820f02 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@02APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x49913B7Bd178e21FaC84C3dED810Ff4CcDcb8403 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x8CDe48E20b5d77C3ec0fbCbf50d0C78B2DE11264 + XT deployed at: 0x8b596614c9ac30bd9DF615c3C18F0f05a97F0779 + GT deployed at: 0xBA03824B38E83B7CBAF3Fcb5aF02EF8342A110d8 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@02APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x69E1A695Ee24e7BcFc55d2dA7DfD479E4C7Eb6A3 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0xc7d5476d361C8d0E5c0478EA320431AD4a49A558 + XT deployed at: 0xe1710D5449241ce311Bfcefb5272594ECD930ec0 + GT deployed at: 0x4B87E9281de9573f2025565E632bdb8F136766E5 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@02APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0x9dA149D4Bc9eF4e6Eb1D131E837270f76dc62e79 + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD667a61e822564e1399f73196c73B2C41bCBda69 + XT deployed at: 0x2348B91F2037799d6AE604D792101534461DB06E + GT deployed at: 0x1aE5482Db2883e1ae8CDBFDbaE95539266F1bF32 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@02APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0x9cde69Ea28c9125060F86eB982305BafaE57f585 + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x4bDD2b0f934EECCE01A8Fc47E3762Ce86C9D061F + XT deployed at: 0x63B96518024b49C8F16104fDFd9d94a79A3d185C + GT deployed at: 0xa78bE568bc5ec42C8E41734dADcb86D3dde73af3 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@02APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x565656a354F6C2953EB2D00DC7e2e0Ab815e19E7 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x1184866Ed937F4605efc100c1f18E028F7CBDD86 + XT deployed at: 0x3F56b53953adf3a65f5Bb8E8Dce1C4926e1D629c + GT deployed at: 0x315f180e74247E01ca0377244Eb6b6D1c7444452 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@02APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x0ed76A80D639E7Bf88524b63429bB841c1633E60 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD4771df4a0f6338f521512A1651D8DB7EF5Af633 + XT deployed at: 0x4bbc10317e5b70B6B491836F5B2b496EE35f5E31 + GT deployed at: 0xFF601c3788236F231a8771cACBbB3087D0Ee7A2c + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@02APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x8c07c10a0a3530a9fB64c65f109A32F7B4b2DB80 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x0469A60F8fbc0c35c4D1D965a50A6Bd29c9dAB8C + XT deployed at: 0xE292927A017d58823957A83ea5EFeAF9C37D6F94 + GT deployed at: 0x7AdE4961Fccba087E8b4De84E8be61098Daf0230 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@02APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 5.079885262 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.087924645429718704 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x4a20ddeb8696b1f542649626889522068cc19438, 0x00b210a7f79653a0fe7e2bc31d6fe3026421195d, 0x465c30b940e792262ef65b7fe7a5bad3b5b7f034, 0xca3f986978adef5aa8e4f9e4f3d27f6f4eb3f47d, 0xc8c3a49b64db371f96edc15941e043966297ea6b, 0x19632ff799ba54b54934b52a89964f6cb12d396f, 0xe459c64a852df70ea7d0cc46142a1a0d8bcd4f2a, 0x9cea72e4c7fd1dd0bb2d0aaf98d756b1f85e096d, 0x54acdb3da45bbdeb1a53e1e3f6db51c8384c7f9c, 0x3ebabb95e4276dd2850666a95037f5ee3bb798bb, 0xb7d4329b11dff286890f4d7e5b10763e09e8804c, 0x28c108fd44b2e58dd9b07cbe453c0bcf836b8cb7, 0xf2f9b0fdd5d22e574421a7ee0e29e410e63c70a9, 0x594db033ade81e0c8182b66d2b07fbc97452d1fa, 0x544786112d542910634109bccef84c3deb1b65e0, 0x81cac518b14b28570c667a143f801bf2e05b6bee, 0x10acd317ebf3f65e30c72720d89c55b7c68a9628, 0xa03710f73585cb5458f43739624611633bf24173, 0x80525c75690102bb024bced8be81d18a56172ec0, 0xe2e5403923b0421fa5a9d28c1012aeaffc820f02, 0x49913b7bd178e21fac84c3ded810ff4ccdcb8403, 0x8cde48e20b5d77c3ec0fbcbf50d0c78b2de11264, 0x8b596614c9ac30bd9df615c3c18f0f05a97f0779, 0xba03824b38e83b7cbaf3fcb5af02ef8342a110d8, 0x69e1a695ee24e7bcfc55d2da7dfd479e4c7eb6a3, 0xc7d5476d361c8d0e5c0478ea320431ad4a49a558, 0xe1710d5449241ce311bfcefb5272594ecd930ec0, 0x4b87e9281de9573f2025565e632bdb8f136766e5, 0x9da149d4bc9ef4e6eb1d131e837270f76dc62e79, 0xd667a61e822564e1399f73196c73b2c41bcbda69, 0x2348b91f2037799d6ae604d792101534461db06e, 0x1ae5482db2883e1ae8cdbfdbae95539266f1bf32, 0x9cde69ea28c9125060f86eb982305bafae57f585, 0x4bdd2b0f934eecce01a8fc47e3762ce86c9d061f, 0x63b96518024b49c8f16104fdfd9d94a79a3d185c, 0xa78be568bc5ec42c8e41734dadcb86d3dde73af3, 0x565656a354f6c2953eb2d00dc7e2e0ab815e19e7, 0x1184866ed937f4605efc100c1f18e028f7cbdd86, 0x3f56b53953adf3a65f5bb8e8dce1c4926e1d629c, 0x315f180e74247e01ca0377244eb6b6d1c7444452, 0x0ed76a80d639e7bf88524b63429bb841c1633e60, 0xd4771df4a0f6338f521512a1651d8db7ef5af633, 0x4bbc10317e5b70b6b491836f5b2b496ee35f5e31, 0xff601c3788236f231a8771cacbbb3087d0ee7a2c, 0x8c07c10a0a3530a9fb64c65f109a32f7b4b2db80, 0x0469a60f8fbc0c35c4d1d965a50a6bd29c9dab8c, 0xe292927a017d58823957a83ea5efeaf9c37d6f94, 0x7ade4961fccba087e8b4de84e8be61098daf0230]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-access-manager.json b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-access-manager.json new file mode 100644 index 0000000..a1a5b6a --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743155675", + "gitBranch": "deploy/v1.0.5", + "gitCommitHash": "0x0x65c418860c22aecb27054e7a8c3207a4f87ad6af", + "blockInfo": { + "number": "22144647", + "timestamp": "1743155675" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-accumulated.json b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-accumulated.json new file mode 100644 index 0000000..baeda6a --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-accumulated.json @@ -0,0 +1,743 @@ +{ + "configNum": "18", + "configs": { + "configs_0": { + "salt": 0, + "collateralCapForGt": "594347733812822000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "priceFeedAddr": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "backupPriceFeedAddr": "0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4", + "heartBeat": "86400", + "name": "Wrapped ETH", + "symbol": "WETH", + "decimals": "18", + "initialPrice": "158359710000" + }, + "collateralConfig": { + "tokenAddr": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", + "priceFeedAddr": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "backupPriceFeedAddr": "0x24CFEf73A30b2CEEC23d3659fA98B491D996F152", + "heartBeat": "86400", + "name": "Wrapped eETH", + "symbol": "weETH", + "decimals": "18", + "initialPrice": "168251670000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "WETH/weETH@30MAY2025", + "marketSymbol": "WETH/weETH@30MAY2025" + }, + "configs_1": { + "salt": 0, + "collateralCapForGt": "527664486788797000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "85000000", + "maxLtv": "81000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "priceFeedAddr": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "backupPriceFeedAddr": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400", + "name": "Wrapped liquid staked Ether 2.0", + "symbol": "wstETH", + "decimals": "18", + "initialPrice": "189514360000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/wstETH@30MAY2025", + "marketSymbol": "USDC/wstETH@30MAY2025" + }, + "configs_2": { + "salt": 0, + "collateralCapForGt": "862068965517241000000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "90000000", + "maxLtv": "86000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "priceFeedAddr": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "backupPriceFeedAddr": "0xb99D174ED06c83588Af997c8859F93E83dD4733f", + "heartBeat": "86400", + "name": "Staked USDe", + "symbol": "sUSDe", + "decimals": "18", + "initialPrice": "115999999", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/sUSDe@30MAY2025", + "marketSymbol": "USDC/sUSDe@30MAY2025" + }, + "configs_3": { + "salt": 0, + "collateralCapForGt": "1025010250102500000000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "90000000", + "maxLtv": "86000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "priceFeedAddr": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "backupPriceFeedAddr": "0x333651c5710Fc8C4fe65E5D15E5639348F267D7c", + "heartBeat": "86400", + "name": "PT Ethena sUSDE 29MAY2025", + "symbol": "PT-sUSDE-29MAY2025", + "decimals": "18", + "initialPrice": "97560000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025" + }, + "configs_4": { + "salt": 0, + "collateralCapForGt": "952380952380952000000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0xd63070114470f685b75B74D60EEc7c1113d33a3D", + "priceFeedAddr": "0xF8f79b5b527e2cb3900956eB0D17A4D4aA6ae220", + "backupPriceFeedAddr": "0xF8f79b5b527e2cb3900956eB0D17A4D4aA6ae220", + "heartBeat": "86400", + "name": "USUAL Boosted USDC", + "symbol": "USUALUSDC+", + "decimals": "18", + "initialPrice": "105000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/USUALUSDC+@30MAY2025", + "marketSymbol": "USDC/USUALUSDC+@30MAY2025" + }, + "configs_5": { + "salt": 0, + "collateralCapForGt": "613081294525419000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "priceFeedAddr": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "backupPriceFeedAddr": "0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4", + "heartBeat": "86400", + "name": "Wrapped ETH", + "symbol": "WETH", + "decimals": "18", + "initialPrice": "158359710000" + }, + "collateralConfig": { + "tokenAddr": "0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8", + "priceFeedAddr": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", + "backupPriceFeedAddr": "0x3b82860EC8815Fc2A1dcC53580bd647b0042C93e", + "heartBeat": "86400", + "name": "MEV Capital wETH", + "symbol": "MCwETH", + "decimals": "18", + "initialPrice": "163110510000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "WETH/MCwETH@30MAY2025", + "marketSymbol": "WETH/MCwETH@30MAY2025" + }, + "configs_6": { + "salt": 0, + "collateralCapForGt": "678858023394089000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "92000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "priceFeedAddr": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "backupPriceFeedAddr": "0x5F08C227deAe74D8e5Ec0d743FB0744AB1B6c984", + "heartBeat": "86400", + "name": "pufETH", + "symbol": "pufETH", + "decimals": "18", + "initialPrice": "183668000000" + }, + "collateralConfig": { + "tokenAddr": "0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D", + "priceFeedAddr": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "backupPriceFeedAddr": "0x5D18F4cB3c95568F315cb1C1eF48261a5A4D6053", + "heartBeat": "86400", + "name": "PT Puffer ETH 26JUN2025", + "symbol": "PT-pufETH-26JUN2025", + "decimals": "18", + "initialPrice": "147306210000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025" + }, + "configs_7": { + "salt": 0, + "collateralCapForGt": "1000000000000000000000000", + "marketConfig": { + "maturity": "1748476800", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "92000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F", + "priceFeedAddr": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "backupPriceFeedAddr": "0x6B09d473dB784D840E307Cb3Da63CbA79D300CAc", + "heartBeat": "86400", + "name": "Ethereal Pre-deposit Vault", + "symbol": "eUSDe", + "decimals": "18", + "initialPrice": "100000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/eUSDe@29MAY2025", + "marketSymbol": "USDC/eUSDe@29MAY2025" + }, + "configs_8": { + "salt": 0, + "collateralCapForGt": "604886995192922000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "priceFeedAddr": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "backupPriceFeedAddr": "0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4", + "heartBeat": "86400", + "name": "Wrapped ETH", + "symbol": "WETH", + "decimals": "18", + "initialPrice": "158359710000" + }, + "collateralConfig": { + "tokenAddr": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "priceFeedAddr": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "backupPriceFeedAddr": "0x5F08C227deAe74D8e5Ec0d743FB0744AB1B6c984", + "heartBeat": "86400", + "name": "pufETH", + "symbol": "pufETH", + "decimals": "18", + "initialPrice": "165320140000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "WETH/pufETH@30MAY2025", + "marketSymbol": "WETH/pufETH@30MAY2025" + }, + "configs_9": { + "salt": 0, + "collateralCapForGt": "1191418262", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "85000000", + "maxLtv": "81000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "priceFeedAddr": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "backupPriceFeedAddr": "0xAB7f623fb2F6fea6601D4350FA0E2290663C28Fc", + "heartBeat": "86400", + "name": "Wrapped BTC", + "symbol": "WBTC", + "decimals": "8", + "initialPrice": "8393358000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/WBTC@30MAY2025", + "marketSymbol": "USDC/WBTC@30MAY2025" + }, + "configs_10": { + "salt": 0, + "collateralCapForGt": "1191418262", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "85000000", + "maxLtv": "81000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", + "priceFeedAddr": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "backupPriceFeedAddr": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "heartBeat": "86400", + "name": "Coinbase Wrapped BTC", + "symbol": "cbBTC", + "decimals": "8", + "initialPrice": "8393358000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/cbBTC@30MAY2025", + "marketSymbol": "USDC/cbBTC@30MAY2025" + }, + "configs_11": { + "salt": 0, + "collateralCapForGt": "617578223336119000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "priceFeedAddr": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "backupPriceFeedAddr": "0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4", + "heartBeat": "86400", + "name": "Wrapped ETH", + "symbol": "WETH", + "decimals": "18", + "initialPrice": "158359710000" + }, + "collateralConfig": { + "tokenAddr": "0x2371e134e3455e0593363cBF89d3b6cf53740618", + "priceFeedAddr": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", + "backupPriceFeedAddr": "0x3A44454F173b082F1dbbA9587b046Dc90B2F0AE7", + "heartBeat": "86400", + "name": "Gauntlet WETH Prime", + "symbol": "gtWETH", + "decimals": "18", + "initialPrice": "161922810000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "WETH/gtWETH@30MAY2025", + "marketSymbol": "WETH/gtWETH@30MAY2025" + }, + "configs_12": { + "salt": 0, + "collateralCapForGt": "1025010250102500000000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "96000000", + "maxLtv": "94000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "priceFeedAddr": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "backupPriceFeedAddr": "0xb99D174ED06c83588Af997c8859F93E83dD4733f", + "heartBeat": "86400", + "name": "Staked USDe", + "symbol": "sUSDe", + "decimals": "18", + "initialPrice": "115999999" + }, + "collateralConfig": { + "tokenAddr": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "priceFeedAddr": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "backupPriceFeedAddr": "0x333651c5710Fc8C4fe65E5D15E5639348F267D7c", + "heartBeat": "86400", + "name": "PT Ethena sUSDE 29MAY2025", + "symbol": "PT-sUSDE-29MAY2025", + "decimals": "18", + "initialPrice": "97560000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "sUSDe/PT-sUSDE-29MAY2025@30MAY2025", + "marketSymbol": "sUSDe/PT-sUSDE-29MAY2025@30MAY2025" + }, + "configs_13": { + "salt": 0, + "collateralCapForGt": "941442289587648000000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "90000000", + "maxLtv": "86000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0x7C1156E515aA1A2E851674120074968C905aAF37", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "Level USD", + "symbol": "lvlUSD", + "decimals": "18", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x4737d9b4592b40d51e110b94c9c043c6654067ae", + "priceFeedAddr": "0x3Bc7dD457901A41509fc0Bd47Dc3Da42D45Ce030", + "backupPriceFeedAddr": "0x3Bc7dD457901A41509fc0Bd47Dc3Da42D45Ce030", + "heartBeat": "86400", + "name": "Staked lvlUSD", + "symbol": "slvlUSD", + "decimals": "18", + "initialPrice": "106220000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "lvlUSD/slvlUSD@30MAY2025", + "marketSymbol": "lvlUSD/slvlUSD@30MAY2025" + }, + "configs_14": { + "salt": 0, + "collateralCapForGt": "1014919313914540000000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "90000000", + "maxLtv": "86000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x9BcA74F805AB0a22DDD0886dB0942199a0feBa71", + "priceFeedAddr": "0x57eAfDF2c9B47425042Be735ff47dea7Ef965726", + "backupPriceFeedAddr": "0x57eAfDF2c9B47425042Be735ff47dea7Ef965726", + "heartBeat": "86400", + "name": "PT lvlUSD 29MAY2025", + "symbol": "PT-lvlUSD-29MAY2025", + "decimals": "18", + "initialPrice": "98530000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/PT-lvlUSD-29MAY2025@30MAY2025", + "marketSymbol": "USDC/PT-lvlUSD-29MAY2025@30MAY2025" + }, + "configs_15": { + "salt": 0, + "collateralCapForGt": "1000000000000000000000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0xf1fd8AC6346eC7BC4116Ba7aDc81102B2BC4C52D", + "priceFeedAddr": "0x4cF5F12c6c0D48F0d335DdB25e11cd526EAfD322", + "backupPriceFeedAddr": "0x4cF5F12c6c0D48F0d335DdB25e11cd526EAfD322", + "heartBeat": "86400", + "name": "MEV Capital USDC Prime", + "symbol": "MC_USDCP", + "decimals": "18", + "initialPrice": "100000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/MC_USDCP@30MAY2025", + "marketSymbol": "USDC/MC_USDCP@30MAY2025" + }, + "configs_16": { + "salt": 0, + "collateralCapForGt": "1000000000000000000000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0xc582F04d8a82795aa2Ff9c8bb4c1c889fe7b754e", + "priceFeedAddr": "0x81195F8A79f6553A4078f89eF87b21a7d3C2855A", + "backupPriceFeedAddr": "0x81195F8A79f6553A4078f89eF87b21a7d3C2855A", + "heartBeat": "86400", + "name": "Gauntlet USDC Frontier", + "symbol": "gtusdcf", + "decimals": "18", + "initialPrice": "100000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/gtusdcf@30MAY2025", + "marketSymbol": "USDC/gtusdcf@30MAY2025" + }, + "configs_17": { + "salt": 0, + "collateralCapForGt": "624356074116256000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "priceFeedAddr": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "backupPriceFeedAddr": "0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4", + "heartBeat": "86400", + "name": "Wrapped ETH", + "symbol": "WETH", + "decimals": "18", + "initialPrice": "158359710000" + }, + "collateralConfig": { + "tokenAddr": "0x701907283a57FF77E255C3f1aAD790466B8CE4ef", + "priceFeedAddr": "0x0221cd3fA8B1Bea16293fb0cD6B60977d531c931", + "backupPriceFeedAddr": "0x00B96F0eBf39158cb4E3F801073966bD6Db7959C", + "heartBeat": "86400", + "name": "IndexCoop hyETH", + "symbol": "mhyETH", + "decimals": "18", + "initialPrice": "160165020000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "WETH/mhyETH@30MAY2025", + "marketSymbol": "WETH/mhyETH@30MAY2025" + } + } + } \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-core-before-change-pendle-swap-adapter.json b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-core-before-change-pendle-swap-adapter.json new file mode 100644 index 0000000..34b5474 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-core-before-change-pendle-swap-adapter.json @@ -0,0 +1,25 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743518639", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x30f0c30e4edf518e2bf6700837dad2a7624d35df", + "blockInfo": { + "number": "22174730", + "timestamp": "1743518639" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x37Ba9934aAbA7a49cC29d0952C6a91d7c7043dbc", + "vaultFactory": "0x01D8C1e0584751085a876892151Bf8490e862E3E", + "oracleAggregator": "0xE3a31690392E8E18DC3d862651C079339E2c1ADE", + "router": "0xC47591F5c023e44931c78D5A993834875b79FB11", + "swapAdapter": { + "uniswapV3Adapter": "0x34F7b52b0d33959C8351eF95F3523C89b6123C0b", + "odosV2Adapter": "0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779", + "pendleSwapV3Adapter": "0x0B30251FA697A39Fd41813b267b50F03414E82da", + "ERC4626VaultAdapter": "0x85ce30537c14EFB66B673f284bEa7c28351244F6" + }, + "marketViewer": "0x74Dfb95Ae623123ecf82Ba841985fB460bB9d45D" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-core-before-change-vault-factory.json b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-core-before-change-vault-factory.json new file mode 100644 index 0000000..34b5474 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-core-before-change-vault-factory.json @@ -0,0 +1,25 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743518639", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x30f0c30e4edf518e2bf6700837dad2a7624d35df", + "blockInfo": { + "number": "22174730", + "timestamp": "1743518639" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x37Ba9934aAbA7a49cC29d0952C6a91d7c7043dbc", + "vaultFactory": "0x01D8C1e0584751085a876892151Bf8490e862E3E", + "oracleAggregator": "0xE3a31690392E8E18DC3d862651C079339E2c1ADE", + "router": "0xC47591F5c023e44931c78D5A993834875b79FB11", + "swapAdapter": { + "uniswapV3Adapter": "0x34F7b52b0d33959C8351eF95F3523C89b6123C0b", + "odosV2Adapter": "0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779", + "pendleSwapV3Adapter": "0x0B30251FA697A39Fd41813b267b50F03414E82da", + "ERC4626VaultAdapter": "0x85ce30537c14EFB66B673f284bEa7c28351244F6" + }, + "marketViewer": "0x74Dfb95Ae623123ecf82Ba841985fB460bB9d45D" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-core.json b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-core.json new file mode 100644 index 0000000..ce54c6c --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743518639", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x30f0c30e4edf518e2bf6700837dad2a7624d35df", + "blockInfo": { + "number": "22174730", + "timestamp": "1743518639" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x37Ba9934aAbA7a49cC29d0952C6a91d7c7043dbc", + "vaultFactory": "0x01D8C1e0584751085a876892151Bf8490e862E3E", + "oracleAggregator": "0xE3a31690392E8E18DC3d862651C079339E2c1ADE", + "router": "0xC47591F5c023e44931c78D5A993834875b79FB11", + "swapAdapter": { + "uniswapV3Adapter": "0x34F7b52b0d33959C8351eF95F3523C89b6123C0b", + "odosV2Adapter": "0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779", + "pendleSwapV3Adapter": "0x4c51a1595a1887932858b2a3C6b34BA6AEeAD899", + "ERC4626VaultAdapter": "0x85ce30537c14EFB66B673f284bEa7c28351244F6" + }, + "marketViewer": "0x74Dfb95Ae623123ecf82Ba841985fB460bB9d45D" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-MC_USDCP@30MAY2025.json b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-MC_USDCP@30MAY2025.json new file mode 100644 index 0000000..d1f41c8 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-MC_USDCP@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22286356", + "timestamp": "1744864451" + }, + "market": "0xf4924D6189552ae5A7818088dA6f23Bd33281C1b", + "collateral": { + "address": "0xf1fd8AC6346eC7BC4116Ba7aDc81102B2BC4C52D", + "symbol": "MC_USDCP", + "priceFeed": "0x4cF5F12c6c0D48F0d335DdB25e11cd526EAfD322", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xe7b3c858FF8031DC6c84D899aEeC343c89A246e0", + "xt": "0x2568d2B892b5c761e1155F4f1c05E5b61961f126", + "gt": "0x5C4db8DB0CA1d040e7fD6FB2AfAA81032df0a4f7" + }, + "config": { + "marketSymbol": "USDC/MC_USDCP@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-PT-lvlUSD-29MAY2025@14APR2025.json b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-PT-lvlUSD-29MAY2025@14APR2025.json new file mode 100644 index 0000000..e3a396b --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-PT-lvlUSD-29MAY2025@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22266244", + "timestamp": "1744621823" + }, + "market": "0x305349b7D1Deba03950D71Ae1C8673cDA1463116", + "collateral": { + "address": "0x9BcA74F805AB0a22DDD0886dB0942199a0feBa71", + "symbol": "PT-lvlUSD-29MAY2025", + "priceFeed": "0x57eAfDF2c9B47425042Be735ff47dea7Ef965726", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x9a52c9303914B68692380d8bFF20F981BD2fF47B", + "xt": "0x4953dD3c3cADA884Ae07eB91E51aa2FC5EC70E35", + "gt": "0x35Ba6CF0ac6b1a1D9D44ec5A479b2602D12Ad690" + }, + "config": { + "marketSymbol": "USDC/PT-lvlUSD-29MAY2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-PT-lvlUSD-29MAY2025@30MAY2025.json b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-PT-lvlUSD-29MAY2025@30MAY2025.json new file mode 100644 index 0000000..e3757f8 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-PT-lvlUSD-29MAY2025@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22266137", + "timestamp": "1744620539" + }, + "market": "0x2524D9a55C2D18A3F257A7F67AfD552B285de34E", + "collateral": { + "address": "0x9BcA74F805AB0a22DDD0886dB0942199a0feBa71", + "symbol": "PT-lvlUSD-29MAY2025", + "priceFeed": "0x57eAfDF2c9B47425042Be735ff47dea7Ef965726", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x3448d6883c7762ed95f59b4A9780b07981b6afee", + "xt": "0xfFD2743Ca5FCDd97b690C33434ef456be9885D20", + "gt": "0x581577E0b27Fc695B21089A08be962Ae3F60aa2f" + }, + "config": { + "marketSymbol": "USDC/PT-lvlUSD-29MAY2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@30MAY2025.json b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@30MAY2025.json new file mode 100644 index 0000000..8ff5af1 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22232653", + "timestamp": "1744217435" + }, + "market": "0xe867255dC0c3a27c90f756ECC566a5292ce19492", + "collateral": { + "address": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "symbol": "PT-sUSDE-29MAY2025", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x07Ef01ba0947eb64df31A826C8a084Ca005e545d", + "xt": "0xb58036be9723Ba7766161ddb8d4050B3c44dc273", + "gt": "0x3A888cb50b4b1BfCB61507D4a453eF67BA1E4055" + }, + "config": { + "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-USUALUSDC+@30MAY2025.json b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-USUALUSDC+@30MAY2025.json new file mode 100644 index 0000000..325c9d2 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-USUALUSDC+@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22232653", + "timestamp": "1744217435" + }, + "market": "0x352D81f954C37C2defAaD1B43531a1131983043F", + "collateral": { + "address": "0xd63070114470f685b75B74D60EEc7c1113d33a3D", + "symbol": "USUALUSDC+", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x00996971EFEC45402b0F135468C3dEe00bDAF44f", + "xt": "0xC034b54C49843185c6b328847abaB31eEB12DA27", + "gt": "0x76318548169af6d6df07544E7E75e8cB07b31927" + }, + "config": { + "marketSymbol": "USDC/USUALUSDC+@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-WBTC@30MAY2025.json b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-WBTC@30MAY2025.json new file mode 100644 index 0000000..e5dc807 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-WBTC@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22232653", + "timestamp": "1744217435" + }, + "market": "0xd699EFC4162d76BfD3cB553D65f850c882C29F5F", + "collateral": { + "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "symbol": "WBTC", + "priceFeed": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x0297807b6f251431BC60D96E74DADDAaaCD8533E", + "xt": "0x68f2E8b2B09122475c5208456A39CAF87a097fE4", + "gt": "0xBe53610FD2870BA0f221c40ed734f173685e3666" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-cbBTC@30MAY2025.json b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-cbBTC@30MAY2025.json new file mode 100644 index 0000000..0e979c0 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-cbBTC@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22232653", + "timestamp": "1744217435" + }, + "market": "0x03f2Af12aE4eb5533c3f7773BE826e8da56F6E1a", + "collateral": { + "address": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", + "symbol": "cbBTC", + "priceFeed": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x970D02242B8339Fc3148643A00e0a1e52c1eb5Eb", + "xt": "0xf1f31F2668ADa8400d91BfC00f9a3c316c538cB3", + "gt": "0x49d06206055e0cbDcbE94257782284B69b4B15Fd" + }, + "config": { + "marketSymbol": "USDC/cbBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-eUSDe@29MAY2025.json b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-eUSDe@29MAY2025.json new file mode 100644 index 0000000..42ddd1f --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-eUSDe@29MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22232653", + "timestamp": "1744217435" + }, + "market": "0x403863917316Bf8AA1966F9D90b393Cec98F991b", + "collateral": { + "address": "0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F", + "symbol": "eUSDe", + "priceFeed": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x7E5dA817e4cD2f2a897c997FB6EB3506d9861432", + "xt": "0x9C4ef4476130f92CEF4b661f99130157d35129CD", + "gt": "0xe09Ad59438A1EA4041217cd1Ee018589DB508268" + }, + "config": { + "marketSymbol": "USDC/eUSDe@29MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "29MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-gtusdcf@30MAY2025.json b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-gtusdcf@30MAY2025.json new file mode 100644 index 0000000..6f270dd --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-gtusdcf@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22286356", + "timestamp": "1744864451" + }, + "market": "0x2EaafFbCdE68337341C0eC65A862e648A413dc14", + "collateral": { + "address": "0xc582F04d8a82795aa2Ff9c8bb4c1c889fe7b754e", + "symbol": "gtusdcf", + "priceFeed": "0x81195F8A79f6553A4078f89eF87b21a7d3C2855A", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x09ec4BE9869BfAbF9fF6652fe7703276D6F5E5d8", + "xt": "0x9c7fBdd0055604bbf7736B153407e9513C818C22", + "gt": "0x8Ee590224c6cddE0d27FB60B37B05784dD794E59" + }, + "config": { + "marketSymbol": "USDC/gtusdcf@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-sUSDe@30MAY2025.json b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-sUSDe@30MAY2025.json new file mode 100644 index 0000000..6970e59 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-sUSDe@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22232653", + "timestamp": "1744217435" + }, + "market": "0x6f5c8838E618448e43385E4C401006822Aa15142", + "collateral": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x1be1A3B4A052F669F521F5966a37B49171AEF57C", + "xt": "0x7705d2B0990192c3b3d1ea6C3A7908250605120A", + "gt": "0x1bb662b38EC6ff531DeF9CAa37a3489c7F5e2f98" + }, + "config": { + "marketSymbol": "USDC/sUSDe@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-wstETH@30MAY2025.json b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-wstETH@30MAY2025.json new file mode 100644 index 0000000..f2772e1 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-USDC-wstETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22232653", + "timestamp": "1744217435" + }, + "market": "0xEd7cD45E5e6ef68261929B58539805bA3c061f14", + "collateral": { + "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x94b0b2679bDEe922039D8B0Bb952F5048FF8B87f", + "xt": "0xbD99501360FFe943C60546C422f4885Ea022FcbC", + "gt": "0xEF15C2C9D5213FE471d9d28a8908cd3b007c4539" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-WETH-MCwETH@30MAY2025.json b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-WETH-MCwETH@30MAY2025.json new file mode 100644 index 0000000..82a207e --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-WETH-MCwETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22232653", + "timestamp": "1744217435" + }, + "market": "0x09722C9CB389f6Ebf5ac9C33eB0067949a3a063a", + "collateral": { + "address": "0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8", + "symbol": "MCwETH", + "priceFeed": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x5365f147fCA4298380947edD4919b8814e5eb6ec", + "xt": "0x01792484Eb39399921663Ddd814d241fA69425Fd", + "gt": "0xF601D19D6285741D9Abd6D1E37f32A1533622A29" + }, + "config": { + "marketSymbol": "WETH/MCwETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-WETH-gtWETH@30MAY2025.json b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-WETH-gtWETH@30MAY2025.json new file mode 100644 index 0000000..c33fc1f --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-WETH-gtWETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22232653", + "timestamp": "1744217435" + }, + "market": "0xc68a2fbD7cb560c71CcAfbDeE971824Ed9bF4556", + "collateral": { + "address": "0x2371e134e3455e0593363cBF89d3b6cf53740618", + "symbol": "gtWETH", + "priceFeed": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xD31d16770d10fEee37FEc90777697546F5388F85", + "xt": "0xa7DbC90d2959E40EB093Abe75C7405Ff26ac3fE3", + "gt": "0x9BdD5071f150d02Af43A65e56A0622d03E846DdB" + }, + "config": { + "marketSymbol": "WETH/gtWETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-WETH-mhyETH@30MAY2025.json b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-WETH-mhyETH@30MAY2025.json new file mode 100644 index 0000000..26c31af --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-WETH-mhyETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22286356", + "timestamp": "1744864451" + }, + "market": "0xb9919eE2169a7dA664AD024C6dDCF0ccD4121C26", + "collateral": { + "address": "0x701907283a57FF77E255C3f1aAD790466B8CE4ef", + "symbol": "mhyETH", + "priceFeed": "0x0221cd3fA8B1Bea16293fb0cD6B60977d531c931", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xbC9c191613c6e77c03A3F792579520d455e852a6", + "xt": "0x1aA1fF0D8c47066C72902040716F91Df18090ADc", + "gt": "0x489f04a08d6ee13789cd59c5ce241494b063b3DB" + }, + "config": { + "marketSymbol": "WETH/mhyETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-WETH-pufETH@30MAY2025.json b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-WETH-pufETH@30MAY2025.json new file mode 100644 index 0000000..0f393f3 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-WETH-pufETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22232653", + "timestamp": "1744217435" + }, + "market": "0x484CDece3FC951a7D009b9dBAC66EC287eC1f58e", + "collateral": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xc74Af187D844dC35998271B5696053CF57816413", + "xt": "0x1f2f2af9FbBa146CB03B4eAFD8C8aE9ed5B91F60", + "gt": "0x89BCE5e162cdB10ea0d0B84B5E7Aff8F51036E89" + }, + "config": { + "marketSymbol": "WETH/pufETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-WETH-weETH@30MAY2025.json b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-WETH-weETH@30MAY2025.json new file mode 100644 index 0000000..041745d --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-WETH-weETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22232653", + "timestamp": "1744217435" + }, + "market": "0x0B7eFE5DE3c3B5d75de33e25965b193d6Ba79f52", + "collateral": { + "address": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "21600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x409E45a47629F45B91607Bb87bcD8D043f32Bc9a", + "xt": "0x21aD8e3b575b65f2c937b201749a738ec53786E8", + "gt": "0x02DA4fdA501396e036DCB591827e938E25Fe3DD4" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-lvlUSD-slvlUSD@14APR2025.json b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-lvlUSD-slvlUSD@14APR2025.json new file mode 100644 index 0000000..02a2d81 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-lvlUSD-slvlUSD@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22266244", + "timestamp": "1744621823" + }, + "market": "0x9B6D377027d36146D1C734e02B8808568D002179", + "collateral": { + "address": "0x4737D9b4592B40d51e110b94c9C043c6654067Ae", + "symbol": "slvlUSD", + "priceFeed": "0x3Bc7dD457901A41509fc0Bd47Dc3Da42D45Ce030", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x7C1156E515aA1A2E851674120074968C905aAF37", + "symbol": "lvlUSD", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x82Fa71444c041eA40bD565F622a00A6509562544", + "xt": "0xD16353C409d80B7FA4B80F4832aa28F323A0F1bb", + "gt": "0x2EB9Ef9967d108132c289975674AD0D4328C1A8a" + }, + "config": { + "marketSymbol": "lvlUSD/slvlUSD@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-lvlUSD-slvlUSD@30MAY2025.json b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-lvlUSD-slvlUSD@30MAY2025.json new file mode 100644 index 0000000..eacf7ce --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-lvlUSD-slvlUSD@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22266137", + "timestamp": "1744620539" + }, + "market": "0xa1ed39C786eea298925DD6FcC33199C3fF06765E", + "collateral": { + "address": "0x4737D9b4592B40d51e110b94c9C043c6654067Ae", + "symbol": "slvlUSD", + "priceFeed": "0x3Bc7dD457901A41509fc0Bd47Dc3Da42D45Ce030", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x7C1156E515aA1A2E851674120074968C905aAF37", + "symbol": "lvlUSD", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x5623695881DB8cFc84ee1f40a1F4A0999D1552f6", + "xt": "0x453dFD4db1a92Bf8D84b4E4Fa6381019370d0C5d", + "gt": "0xE1e045a8a238994703ec0dD7e4E2aD6f97c5F186" + }, + "config": { + "marketSymbol": "lvlUSD/slvlUSD@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@30MAY2025.json b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@30MAY2025.json new file mode 100644 index 0000000..5de0634 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22232653", + "timestamp": "1744217435" + }, + "market": "0xBebB5CEe893110cF477901AF7FA94E4840606421", + "collateral": { + "address": "0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D", + "symbol": "PT-pufETH-26JUN2025", + "priceFeed": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x5db7A477dEdE7d12feA665312282E052e0207FC1", + "xt": "0xE8a7A6dD9218202996D9cF825426Ab283b3396eD", + "gt": "0x69cf2ACd3499dF9b322d3B3Fb579E1Af420f601d" + }, + "config": { + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-sUSDe-PT-sUSDE-29MAY2025@14APR2025.json b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-sUSDe-PT-sUSDE-29MAY2025@14APR2025.json new file mode 100644 index 0000000..66cee1f --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-sUSDe-PT-sUSDE-29MAY2025@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22266244", + "timestamp": "1744621823" + }, + "market": "0x7A28a1a4d54F5a74BC87471B9EE4Ba41B07a4cD3", + "collateral": { + "address": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "symbol": "PT-sUSDE-29MAY2025", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x6CD5968D8703E40bdaD77F40722ead51cF3DFEe6", + "xt": "0x81ac31e4f598f3d0C455aD27C38686B8c1A3256E", + "gt": "0xF147cfD201930840ec8E9424E447dB22f67D6Ef1" + }, + "config": { + "marketSymbol": "sUSDe/PT-sUSDE-29MAY2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-sUSDe-PT-sUSDE-29MAY2025@30MAY2025.json b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-sUSDe-PT-sUSDE-29MAY2025@30MAY2025.json new file mode 100644 index 0000000..3c4775c --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-sUSDe-PT-sUSDE-29MAY2025@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22266137", + "timestamp": "1744620539" + }, + "market": "0x37877773B1289c27Bb6159b86613Efd0d15cADaE", + "collateral": { + "address": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "symbol": "PT-sUSDE-29MAY2025", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x6fbE672e148dB5374a17dcfe78c22a31751b0F5F", + "xt": "0x9b23666F665aA6B280d1f5C3a580EEad7414DcAC", + "gt": "0x4f1B12bFe07534C68ECd6a971d3f6295b423CD09" + }, + "config": { + "marketSymbol": "sUSDe/PT-sUSDE-29MAY2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-wstETH-inwstETHs@30MAY2025.json b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-wstETH-inwstETHs@30MAY2025.json new file mode 100644 index 0000000..935cebc --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-market-wstETH-inwstETHs@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22325579", + "timestamp": "1745337359" + }, + "market": "0x918D8Ecba4C683EF3004b1C313cfEF5e3b9E1146", + "collateral": { + "address": "0x8E0789d39db454DBE9f4a77aCEF6dc7c69f6D552", + "symbol": "inwstETHs", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xC4CE5aA3caBaB5525d838f3095105e68764a4863", + "xt": "0xD54417D73FEdBBFa242E296A9199D401c377A23f", + "gt": "0x79614885F2b286A20a18315A9963e9e7A5eF0824" + }, + "config": { + "marketSymbol": "wstETH/inwstETHs@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "4000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-pendle-swap-v3-adapter.json b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-pendle-swap-v3-adapter.json new file mode 100644 index 0000000..2a27d62 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-pendle-swap-v3-adapter.json @@ -0,0 +1,14 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1744434875", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x1b19b284f4f6a7ffebcb90e1d9af5058a71d0ab5", + "blockInfo": { + "number": "22250716", + "timestamp": "1744434875" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "contracts": { + "pendleSwapV3Adapter": "0x4c51a1595a1887932858b2a3C6b34BA6AEeAD899" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-vault-TMX-USDC-PRIME.json b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-vault-TMX-USDC-PRIME.json new file mode 100644 index 0000000..1ca2367 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-vault-TMX-USDC-PRIME.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.9", + "commit": "0x0x9ccea93c0ceff6a76f38270be9ea3d3aad9552d7" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22283141", + "timestamp": "1744825595" + }, + "vaultInfo": { + "name": "TermMax USDC Prime", + "symbol": "TMX-USDC-PRIME", + "address": "0x13e361dC94459a01bc4991F9e681033Dc2b0fA5A", + "asset": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "performanceFeeRate": 0, + "maxCapacity": "50000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-vault-TMX-USDC.json b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-vault-TMX-USDC.json new file mode 100644 index 0000000..56904bc --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-vault-TMX-USDC.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22232838", + "timestamp": "1744219655" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TMX-USDC", + "address": "0x984408C88a9B042BF3e2ddf921Cd1fAFB4b735D1", + "asset": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "performanceFeeRate": 0, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-vault-TMX-WETH.json b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-vault-TMX-WETH.json new file mode 100644 index 0000000..c096a93 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-vault-TMX-WETH.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22232798", + "timestamp": "1744219175" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TMX-WETH", + "address": "0xDEB8a9C0546A01b7e5CeE8e44Fd0C8D8B96a1f6e", + "asset": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "performanceFeeRate": 0, + "maxCapacity": "5000000000000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-vault-TMX-wstETH-Vault.json b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-vault-TMX-wstETH-Vault.json new file mode 100644 index 0000000..0fc28cf --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-vault-TMX-wstETH-Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.9", + "commit": "0x0x3b6b686d5080fff47dc1aaa51357454b9614490d" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22325729", + "timestamp": "1745339159" + }, + "vaultInfo": { + "name": "TermMax wstETH Vault", + "symbol": "TMX-wstETH-Vault", + "address": "0xDAdeAcC03a59639C0ecE5ec4fF3BC0d9920A47eC", + "asset": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "performanceFeeRate": 0, + "maxCapacity": "25000000000000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-vault-Weiting USDC Vault.json b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-vault-Weiting USDC Vault.json new file mode 100644 index 0000000..31301e4 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-vault-Weiting USDC Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xb07dca68abfa0915501a9f9b5e5f8ae686c02d95" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22215681", + "timestamp": "1744012679" + }, + "vaultInfo": { + "name": "Weiting USDC Vault", + "symbol": "Weiting USDC Vault", + "address": "0x5C16d84e998c661D9F6C7Cc23e1144E4b7f39759", + "asset": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "performanceFeeRate": 10000000, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x1c59f7A0AA3f01DDACd17c0EF7Bc00c3D18feD0A", + "guardian": "0x1c59f7A0AA3f01DDACd17c0EF7Bc00c3D18feD0A", + "allocator": "0x1c59f7A0AA3f01DDACd17c0EF7Bc00c3D18feD0A" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-vault-factory.json b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-vault-factory.json new file mode 100644 index 0000000..8f8ecb5 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-20250530/eth-mainnet-vault-factory.json @@ -0,0 +1,14 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1744824947", + "gitBranch": "deploy/v1.0.9", + "gitCommitHash": "0x0x9ccea93c0ceff6a76f38270be9ea3d3aad9552d7", + "blockInfo": { + "number": "22283087", + "timestamp": "1744824947" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "contracts": { + "vaultFactory": "0x4778CBf91d8369843281c8f5a2D7b56d1420dFF5" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-1500/deploy-eth-mainnet-oracle-aggregator-0401-log.txt b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/deploy-eth-mainnet-oracle-aggregator-0401-log.txt new file mode 100644 index 0000000..81ca312 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/deploy-eth-mainnet-oracle-aggregator-0401-log.txt @@ -0,0 +1,21 @@ +== Logs == + Network: eth-mainnet + Deployer balance: 158879257545733090 + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175070 + Block timestamp: 1743522719 + + ===== Oracle Aggregator Info ===== + Deployer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Admin: 0x8409a9C1A911CED491892c5694E43994c9d47E8f + Oracle Aggregator deployed at: 0xE3a31690392E8E18DC3d862651C079339E2c1ADE + Oracle Timelock: 43200 + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-1500/deploy-eth-markets-test-20250411-1500-log.txt b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/deploy-eth-markets-test-20250411-1500-log.txt new file mode 100644 index 0000000..055d7ca --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/deploy-eth-markets-test-20250411-1500-log.txt @@ -0,0 +1,368 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ETHERSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xbca66c3c7c82ed859143ed822fee071f5be097df + + ===== Block Info ===== + Block number: 22242879 + Block timestamp: 1744340555 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22242879 + + ===== Market Info - 0 ===== + Market deployed at: 0x56997E6e199A70AEc8AB4db23577E624c089d2f2 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x89BfE4525Ee4c0c64C30CDFB6617dBCee7EaDBaD + XT deployed at: 0x0B17f2Cc037731b7B6Df067E2bDB62A9fd235959 + GT deployed at: 0x0CC0f90739FFc1b6E42b9Cb9C0FC068cc9F82Eb8 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@11APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xfbEd00590F747dfCCA69A8034295BD3ac1d94cA4 + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x99B073F2aE5c427e265Cb197a56F6C6186bA389c + XT deployed at: 0xc5bca99b3D360f46bc09924C92F8e1032B2D3374 + GT deployed at: 0x859e98297aB9b73995FB55eE644c55661a6bdbD0 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@11APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x8A7E21b9D73db83bc28F606dC230BDBa573c1E7B + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD2D76A31EdC312eBef2F9F6dEf759A29160D2cAb + XT deployed at: 0x016dE2309722d31355C501626DdE3696d22854d1 + GT deployed at: 0x1e9E69321Dd8E881206298038EA777791B29C2eA + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@11APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xFf4B82316c054361c21bAb197be39e98f54b7a40 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x023318E476088E693403c9fbB851d69655305802 + XT deployed at: 0xBC490A47ED19feC718c65d40AF4B25dF4d0e2f3f + GT deployed at: 0x52e2F493269Fd8a3DF8282A91928fBf167E39b43 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@11APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x87A7c4C85d203B07C137E52EC93322158Fafc406 + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x4a315696D9ebAF5Fd2cCbc290aF9EfcD2266881d + XT deployed at: 0x6F4BBE042f05e53C862C392f7fD9BED7e6cCB1c5 + GT deployed at: 0xE779663041bcd63675990FaDE6BA91E0756DD5bf + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@11APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x35cCd7d1448660a34aa89972d4dcd40544Da98Cb + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x9618A90C4497D883E19a72e7Afc93f2740Fdfc84 + XT deployed at: 0xC717cE996BFa22A11CDd1f95B3843DD3EDa5C755 + GT deployed at: 0x8C641328781268E62992Ac0CeA79907C56f06ad0 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@11APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x8479D1b5555D4f0065cb14B9b8c8a81C40d6C704 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0x8Ef8b5c727F69F9c13FFa5E788eD0742e9206E47 + XT deployed at: 0x6222B9E51c3Dfa3c6e718b2Bac39cA4Ce1274a90 + GT deployed at: 0xb1c0e92D47eE1c5A52E33AD4a3D955cd7D6cF5B3 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@11APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0xa52c8526BF27d9186Af3E7dcBF46dE2CbE2ecF6c + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x797d3EAa8Ff67b4862cc920f237dB13fd9FDC2bE + XT deployed at: 0xCb5467766D87644a7F736f375906122bD6Df8fb6 + GT deployed at: 0xF063800D8cB183f61EC05C90AAdD1416d247A7D8 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@11APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0x174E707467D7A399dFB0f8475ec89F839CF98979 + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0xb265640d1a426D3e7b2A14ea49a410583ff1cf52 + XT deployed at: 0x62Eb22cDb54aD5FdDBE710457d6F1D8792Af7d0c + GT deployed at: 0xdC9c6B88c68a0FBf75d3f1a788bf576da4Ac10B1 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@11APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x80052bE24fF76DeC4B2AAd90F21d726EA1734232 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x05fc0a8d8776B69d35d5737ef0dBac0eE07d1C57 + XT deployed at: 0xcF68e9b1ACC151D3e9977a54260B156eb1132459 + GT deployed at: 0x792c3A8B7d405e2dF35D3fAe0971935ec034F55B + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@11APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x66C1C3843E517192EBc587115Ac4c80219cE0D97 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xAB4498B12D847f70DEb45FBeFa8325e7508C369F + XT deployed at: 0x3D4aeA73e92f92ec9e325aF601719155C05672EA + GT deployed at: 0x499cFb6c70D6f6DBB5FBA3248A4B7520C23D8390 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@11APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x39FCb93db01aB37695C51d33aCcb36DBFE4cBac3 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x616F8094c591540df0d635F543A1c4CD60575226 + XT deployed at: 0xaBA04dA83763C10D6A7C66a1B217d7445301Ea92 + GT deployed at: 0xE62880FCF0a02ddF46417E062C5300d4165Db5e3 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@11APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 0.945397614 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.016363312498976688 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x56997e6e199a70aec8ab4db23577e624c089d2f2, 0x89bfe4525ee4c0c64c30cdfb6617dbcee7eadbad, 0x0b17f2cc037731b7b6df067e2bdb62a9fd235959, 0x0cc0f90739ffc1b6e42b9cb9c0fc068cc9f82eb8, 0xfbed00590f747dfcca69a8034295bd3ac1d94ca4, 0x99b073f2ae5c427e265cb197a56f6c6186ba389c, 0xc5bca99b3d360f46bc09924c92f8e1032b2d3374, 0x859e98297ab9b73995fb55ee644c55661a6bdbd0, 0x8a7e21b9d73db83bc28f606dc230bdba573c1e7b, 0xd2d76a31edc312ebef2f9f6def759a29160d2cab, 0x016de2309722d31355c501626dde3696d22854d1, 0x1e9e69321dd8e881206298038ea777791b29c2ea, 0xff4b82316c054361c21bab197be39e98f54b7a40, 0x023318e476088e693403c9fbb851d69655305802, 0xbc490a47ed19fec718c65d40af4b25df4d0e2f3f, 0x52e2f493269fd8a3df8282a91928fbf167e39b43, 0x87a7c4c85d203b07c137e52ec93322158fafc406, 0x4a315696d9ebaf5fd2ccbc290af9efcd2266881d, 0x6f4bbe042f05e53c862c392f7fd9bed7e6ccb1c5, 0xe779663041bcd63675990fade6ba91e0756dd5bf, 0x35ccd7d1448660a34aa89972d4dcd40544da98cb, 0x9618a90c4497d883e19a72e7afc93f2740fdfc84, 0xc717ce996bfa22a11cdd1f95b3843dd3eda5c755, 0x8c641328781268e62992ac0cea79907c56f06ad0, 0x8479d1b5555d4f0065cb14b9b8c8a81c40d6c704, 0x8ef8b5c727f69f9c13ffa5e788ed0742e9206e47, 0x6222b9e51c3dfa3c6e718b2bac39ca4ce1274a90, 0xb1c0e92d47ee1c5a52e33ad4a3d955cd7d6cf5b3, 0xa52c8526bf27d9186af3e7dcbf46de2cbe2ecf6c, 0x797d3eaa8ff67b4862cc920f237db13fd9fdc2be, 0xcb5467766d87644a7f736f375906122bd6df8fb6, 0xf063800d8cb183f61ec05c90aadd1416d247a7d8, 0x174e707467d7a399dfb0f8475ec89f839cf98979, 0xb265640d1a426d3e7b2a14ea49a410583ff1cf52, 0x62eb22cdb54ad5fddbe710457d6f1d8792af7d0c, 0xdc9c6b88c68a0fbf75d3f1a788bf576da4ac10b1, 0x80052be24ff76dec4b2aad90f21d726ea1734232, 0x05fc0a8d8776b69d35d5737ef0dbac0ee07d1c57, 0xcf68e9b1acc151d3e9977a54260b156eb1132459, 0x792c3a8b7d405e2df35d3fae0971935ec034f55b, 0x66c1c3843e517192ebc587115ac4c80219ce0d97, 0xab4498b12d847f70deb45fbefa8325e7508c369f, 0x3d4aea73e92f92ec9e325af601719155c05672ea, 0x499cfb6c70d6f6dbb5fba3248a4b7520c23d8390, 0x39fcb93db01ab37695c51d33accb36dbfe4cbac3, 0x616f8094c591540df0d635f543a1c4cd60575226, 0xaba04da83763c10d6a7c66a1b217d7445301ea92, 0xe62880fcf0a02ddf46417e062c5300d4165db5e3]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-1500/deploy_markets_test_0402_log.txt b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/deploy_markets_test_0402_log.txt new file mode 100644 index 0000000..236c256 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/deploy_markets_test_0402_log.txt @@ -0,0 +1,370 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Enabled--verify +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175185 + Block timestamp: 1743524099 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22175185 + + ===== Market Info - 0 ===== + Market deployed at: 0x4a20DdEB8696b1f542649626889522068cc19438 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x00B210A7f79653A0fe7e2bc31d6Fe3026421195d + XT deployed at: 0x465c30b940E792262Ef65B7Fe7A5bAd3b5b7f034 + GT deployed at: 0xca3F986978ADEf5aA8e4F9e4F3d27f6f4Eb3f47d + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@02APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xC8c3A49b64dB371F96EdC15941e043966297Ea6b + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x19632ff799BA54B54934b52a89964F6cb12D396f + XT deployed at: 0xe459c64a852Df70Ea7D0cc46142A1a0d8BCd4f2A + GT deployed at: 0x9CEA72e4C7Fd1dd0bb2D0AAF98D756B1f85e096D + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@02APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x54ACdb3da45bBDEb1a53e1E3F6DB51C8384c7F9c + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x3ebabb95e4276DD2850666a95037f5EE3bb798Bb + XT deployed at: 0xb7d4329b11Dff286890F4d7e5b10763E09E8804C + GT deployed at: 0x28C108FD44B2E58DD9B07CBE453c0BCF836b8CB7 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@02APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xf2F9b0fDD5D22e574421A7Ee0E29e410E63C70A9 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x594Db033Ade81E0C8182B66d2B07fbc97452d1FA + XT deployed at: 0x544786112d542910634109BcCEF84C3Deb1b65e0 + GT deployed at: 0x81CAc518B14B28570C667A143F801bF2e05b6BEe + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@02APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x10aCD317ebf3F65e30c72720D89c55B7C68a9628 + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xA03710F73585cb5458F43739624611633Bf24173 + XT deployed at: 0x80525c75690102bb024BcEd8bE81D18A56172EC0 + GT deployed at: 0xe2e5403923B0421FA5a9D28c1012aeAFfc820f02 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@02APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x49913B7Bd178e21FaC84C3dED810Ff4CcDcb8403 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x8CDe48E20b5d77C3ec0fbCbf50d0C78B2DE11264 + XT deployed at: 0x8b596614c9ac30bd9DF615c3C18F0f05a97F0779 + GT deployed at: 0xBA03824B38E83B7CBAF3Fcb5aF02EF8342A110d8 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@02APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x69E1A695Ee24e7BcFc55d2dA7DfD479E4C7Eb6A3 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0xc7d5476d361C8d0E5c0478EA320431AD4a49A558 + XT deployed at: 0xe1710D5449241ce311Bfcefb5272594ECD930ec0 + GT deployed at: 0x4B87E9281de9573f2025565E632bdb8F136766E5 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@02APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0x9dA149D4Bc9eF4e6Eb1D131E837270f76dc62e79 + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD667a61e822564e1399f73196c73B2C41bCBda69 + XT deployed at: 0x2348B91F2037799d6AE604D792101534461DB06E + GT deployed at: 0x1aE5482Db2883e1ae8CDBFDbaE95539266F1bF32 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@02APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0x9cde69Ea28c9125060F86eB982305BafaE57f585 + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x4bDD2b0f934EECCE01A8Fc47E3762Ce86C9D061F + XT deployed at: 0x63B96518024b49C8F16104fDFd9d94a79A3d185C + GT deployed at: 0xa78bE568bc5ec42C8E41734dADcb86D3dde73af3 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@02APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x565656a354F6C2953EB2D00DC7e2e0Ab815e19E7 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x1184866Ed937F4605efc100c1f18E028F7CBDD86 + XT deployed at: 0x3F56b53953adf3a65f5Bb8E8Dce1C4926e1D629c + GT deployed at: 0x315f180e74247E01ca0377244Eb6b6D1c7444452 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@02APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x0ed76A80D639E7Bf88524b63429bB841c1633E60 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD4771df4a0f6338f521512A1651D8DB7EF5Af633 + XT deployed at: 0x4bbc10317e5b70B6B491836F5B2b496EE35f5E31 + GT deployed at: 0xFF601c3788236F231a8771cACBbB3087D0Ee7A2c + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@02APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x8c07c10a0a3530a9fB64c65f109A32F7B4b2DB80 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x0469A60F8fbc0c35c4D1D965a50A6Bd29c9dAB8C + XT deployed at: 0xE292927A017d58823957A83ea5EFeAF9C37D6F94 + GT deployed at: 0x7AdE4961Fccba087E8b4De84E8be61098Daf0230 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@02APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 5.079885262 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.087924645429718704 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x4a20ddeb8696b1f542649626889522068cc19438, 0x00b210a7f79653a0fe7e2bc31d6fe3026421195d, 0x465c30b940e792262ef65b7fe7a5bad3b5b7f034, 0xca3f986978adef5aa8e4f9e4f3d27f6f4eb3f47d, 0xc8c3a49b64db371f96edc15941e043966297ea6b, 0x19632ff799ba54b54934b52a89964f6cb12d396f, 0xe459c64a852df70ea7d0cc46142a1a0d8bcd4f2a, 0x9cea72e4c7fd1dd0bb2d0aaf98d756b1f85e096d, 0x54acdb3da45bbdeb1a53e1e3f6db51c8384c7f9c, 0x3ebabb95e4276dd2850666a95037f5ee3bb798bb, 0xb7d4329b11dff286890f4d7e5b10763e09e8804c, 0x28c108fd44b2e58dd9b07cbe453c0bcf836b8cb7, 0xf2f9b0fdd5d22e574421a7ee0e29e410e63c70a9, 0x594db033ade81e0c8182b66d2b07fbc97452d1fa, 0x544786112d542910634109bccef84c3deb1b65e0, 0x81cac518b14b28570c667a143f801bf2e05b6bee, 0x10acd317ebf3f65e30c72720d89c55b7c68a9628, 0xa03710f73585cb5458f43739624611633bf24173, 0x80525c75690102bb024bced8be81d18a56172ec0, 0xe2e5403923b0421fa5a9d28c1012aeaffc820f02, 0x49913b7bd178e21fac84c3ded810ff4ccdcb8403, 0x8cde48e20b5d77c3ec0fbcbf50d0c78b2de11264, 0x8b596614c9ac30bd9df615c3c18f0f05a97f0779, 0xba03824b38e83b7cbaf3fcb5af02ef8342a110d8, 0x69e1a695ee24e7bcfc55d2da7dfd479e4c7eb6a3, 0xc7d5476d361c8d0e5c0478ea320431ad4a49a558, 0xe1710d5449241ce311bfcefb5272594ecd930ec0, 0x4b87e9281de9573f2025565e632bdb8f136766e5, 0x9da149d4bc9ef4e6eb1d131e837270f76dc62e79, 0xd667a61e822564e1399f73196c73b2c41bcbda69, 0x2348b91f2037799d6ae604d792101534461db06e, 0x1ae5482db2883e1ae8cdbfdbae95539266f1bf32, 0x9cde69ea28c9125060f86eb982305bafae57f585, 0x4bdd2b0f934eecce01a8fc47e3762ce86c9d061f, 0x63b96518024b49c8f16104fdfd9d94a79a3d185c, 0xa78be568bc5ec42c8e41734dadcb86d3dde73af3, 0x565656a354f6c2953eb2d00dc7e2e0ab815e19e7, 0x1184866ed937f4605efc100c1f18e028f7cbdd86, 0x3f56b53953adf3a65f5bb8e8dce1c4926e1d629c, 0x315f180e74247e01ca0377244eb6b6d1c7444452, 0x0ed76a80d639e7bf88524b63429bb841c1633e60, 0xd4771df4a0f6338f521512a1651d8db7ef5af633, 0x4bbc10317e5b70b6b491836f5b2b496ee35f5e31, 0xff601c3788236f231a8771cacbbb3087d0ee7a2c, 0x8c07c10a0a3530a9fb64c65f109a32f7b4b2db80, 0x0469a60f8fbc0c35c4d1d965a50a6bd29c9dab8c, 0xe292927a017d58823957a83ea5efeaf9c37d6f94, 0x7ade4961fccba087e8b4de84e8be61098daf0230]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-access-manager.json b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-access-manager.json new file mode 100644 index 0000000..a1a5b6a --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743155675", + "gitBranch": "deploy/v1.0.5", + "gitCommitHash": "0x0x65c418860c22aecb27054e7a8c3207a4f87ad6af", + "blockInfo": { + "number": "22144647", + "timestamp": "1743155675" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-core.json b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-core.json new file mode 100644 index 0000000..34b5474 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743518639", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x30f0c30e4edf518e2bf6700837dad2a7624d35df", + "blockInfo": { + "number": "22174730", + "timestamp": "1743518639" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x37Ba9934aAbA7a49cC29d0952C6a91d7c7043dbc", + "vaultFactory": "0x01D8C1e0584751085a876892151Bf8490e862E3E", + "oracleAggregator": "0xE3a31690392E8E18DC3d862651C079339E2c1ADE", + "router": "0xC47591F5c023e44931c78D5A993834875b79FB11", + "swapAdapter": { + "uniswapV3Adapter": "0x34F7b52b0d33959C8351eF95F3523C89b6123C0b", + "odosV2Adapter": "0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779", + "pendleSwapV3Adapter": "0x0B30251FA697A39Fd41813b267b50F03414E82da", + "ERC4626VaultAdapter": "0x85ce30537c14EFB66B673f284bEa7c28351244F6" + }, + "marketViewer": "0x74Dfb95Ae623123ecf82Ba841985fB460bB9d45D" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@11APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@11APR2025.json new file mode 100644 index 0000000..894ebbc --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22242879", + "timestamp": "1744340555" + }, + "market": "0xFf4B82316c054361c21bAb197be39e98f54b7a40", + "collateral": { + "address": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "symbol": "PT-sUSDE-29MAY2025", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x023318E476088E693403c9fbB851d69655305802", + "xt": "0xBC490A47ED19feC718c65d40AF4B25dF4d0e2f3f", + "gt": "0x52e2F493269Fd8a3DF8282A91928fBf167E39b43" + }, + "config": { + "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-USDC-USUALUSDC+@11APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-USDC-USUALUSDC+@11APR2025.json new file mode 100644 index 0000000..8cfa95a --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-USDC-USUALUSDC+@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22242879", + "timestamp": "1744340555" + }, + "market": "0x87A7c4C85d203B07C137E52EC93322158Fafc406", + "collateral": { + "address": "0xd63070114470f685b75B74D60EEc7c1113d33a3D", + "symbol": "USUALUSDC+", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x4a315696D9ebAF5Fd2cCbc290aF9EfcD2266881d", + "xt": "0x6F4BBE042f05e53C862C392f7fD9BED7e6cCB1c5", + "gt": "0xE779663041bcd63675990FaDE6BA91E0756DD5bf" + }, + "config": { + "marketSymbol": "USDC/USUALUSDC+@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-USDC-WBTC@11APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-USDC-WBTC@11APR2025.json new file mode 100644 index 0000000..c68296a --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-USDC-WBTC@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22242879", + "timestamp": "1744340555" + }, + "market": "0x80052bE24fF76DeC4B2AAd90F21d726EA1734232", + "collateral": { + "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "symbol": "WBTC", + "priceFeed": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x05fc0a8d8776B69d35d5737ef0dBac0eE07d1C57", + "xt": "0xcF68e9b1ACC151D3e9977a54260B156eb1132459", + "gt": "0x792c3A8B7d405e2dF35D3fAe0971935ec034F55B" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-USDC-cbBTC@11APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-USDC-cbBTC@11APR2025.json new file mode 100644 index 0000000..f7dbe7b --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-USDC-cbBTC@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22242879", + "timestamp": "1744340555" + }, + "market": "0x66C1C3843E517192EBc587115Ac4c80219cE0D97", + "collateral": { + "address": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", + "symbol": "cbBTC", + "priceFeed": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xAB4498B12D847f70DEb45FBeFa8325e7508C369F", + "xt": "0x3D4aeA73e92f92ec9e325aF601719155C05672EA", + "gt": "0x499cFb6c70D6f6DBB5FBA3248A4B7520C23D8390" + }, + "config": { + "marketSymbol": "USDC/cbBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-USDC-eUSDe@11APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-USDC-eUSDe@11APR2025.json new file mode 100644 index 0000000..232173d --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-USDC-eUSDe@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22242879", + "timestamp": "1744340555" + }, + "market": "0xa52c8526BF27d9186Af3E7dcBF46dE2CbE2ecF6c", + "collateral": { + "address": "0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F", + "symbol": "eUSDe", + "priceFeed": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x797d3EAa8Ff67b4862cc920f237dB13fd9FDC2bE", + "xt": "0xCb5467766D87644a7F736f375906122bD6Df8fb6", + "gt": "0xF063800D8cB183f61EC05C90AAdD1416d247A7D8" + }, + "config": { + "marketSymbol": "USDC/eUSDe@29MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-USDC-sUSDe@11APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-USDC-sUSDe@11APR2025.json new file mode 100644 index 0000000..6fef5d0 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-USDC-sUSDe@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22242879", + "timestamp": "1744340555" + }, + "market": "0x8A7E21b9D73db83bc28F606dC230BDBa573c1E7B", + "collateral": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xD2D76A31EdC312eBef2F9F6dEf759A29160D2cAb", + "xt": "0x016dE2309722d31355C501626DdE3696d22854d1", + "gt": "0x1e9E69321Dd8E881206298038EA777791B29C2eA" + }, + "config": { + "marketSymbol": "USDC/sUSDe@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-USDC-wstETH@11APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-USDC-wstETH@11APR2025.json new file mode 100644 index 0000000..cb92b37 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-USDC-wstETH@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22242879", + "timestamp": "1744340555" + }, + "market": "0xfbEd00590F747dfCCA69A8034295BD3ac1d94cA4", + "collateral": { + "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x99B073F2aE5c427e265Cb197a56F6C6186bA389c", + "xt": "0xc5bca99b3D360f46bc09924C92F8e1032B2D3374", + "gt": "0x859e98297aB9b73995FB55eE644c55661a6bdbD0" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-WETH-MCwETH@11APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-WETH-MCwETH@11APR2025.json new file mode 100644 index 0000000..af4ee31 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-WETH-MCwETH@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22242879", + "timestamp": "1744340555" + }, + "market": "0x35cCd7d1448660a34aa89972d4dcd40544Da98Cb", + "collateral": { + "address": "0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8", + "symbol": "MCwETH", + "priceFeed": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x9618A90C4497D883E19a72e7Afc93f2740Fdfc84", + "xt": "0xC717cE996BFa22A11CDd1f95B3843DD3EDa5C755", + "gt": "0x8C641328781268E62992Ac0CeA79907C56f06ad0" + }, + "config": { + "marketSymbol": "WETH/MCwETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-WETH-gtWETH@11APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-WETH-gtWETH@11APR2025.json new file mode 100644 index 0000000..440a531 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-WETH-gtWETH@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22242879", + "timestamp": "1744340555" + }, + "market": "0x39FCb93db01aB37695C51d33aCcb36DBFE4cBac3", + "collateral": { + "address": "0x2371e134e3455e0593363cBF89d3b6cf53740618", + "symbol": "gtWETH", + "priceFeed": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x616F8094c591540df0d635F543A1c4CD60575226", + "xt": "0xaBA04dA83763C10D6A7C66a1B217d7445301Ea92", + "gt": "0xE62880FCF0a02ddF46417E062C5300d4165Db5e3" + }, + "config": { + "marketSymbol": "WETH/gtWETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-WETH-pufETH@11APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-WETH-pufETH@11APR2025.json new file mode 100644 index 0000000..aef252e --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-WETH-pufETH@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22242879", + "timestamp": "1744340555" + }, + "market": "0x174E707467D7A399dFB0f8475ec89F839CF98979", + "collateral": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xb265640d1a426D3e7b2A14ea49a410583ff1cf52", + "xt": "0x62Eb22cDb54aD5FdDBE710457d6F1D8792Af7d0c", + "gt": "0xdC9c6B88c68a0FBf75d3f1a788bf576da4Ac10B1" + }, + "config": { + "marketSymbol": "WETH/pufETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-WETH-weETH@11APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-WETH-weETH@11APR2025.json new file mode 100644 index 0000000..3f1160f --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-WETH-weETH@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22242879", + "timestamp": "1744340555" + }, + "market": "0x56997E6e199A70AEc8AB4db23577E624c089d2f2", + "collateral": { + "address": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "21600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x89BfE4525Ee4c0c64C30CDFB6617dBCee7EaDBaD", + "xt": "0x0B17f2Cc037731b7B6Df067E2bDB62A9fd235959", + "gt": "0x0CC0f90739FFc1b6E42b9Cb9C0FC068cc9F82Eb8" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@11APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@11APR2025.json new file mode 100644 index 0000000..6b8d563 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22242879", + "timestamp": "1744340555" + }, + "market": "0x8479D1b5555D4f0065cb14B9b8c8a81C40d6C704", + "collateral": { + "address": "0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D", + "symbol": "PT-pufETH-26JUN2025", + "priceFeed": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x8Ef8b5c727F69F9c13FFa5E788eD0742e9206E47", + "xt": "0x6222B9E51c3Dfa3c6e718b2Bac39cA4Ce1274a90", + "gt": "0xb1c0e92D47eE1c5A52E33AD4a3D955cd7D6cF5B3" + }, + "config": { + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-vault-TMX-USDC.json b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-vault-TMX-USDC.json new file mode 100644 index 0000000..56904bc --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-vault-TMX-USDC.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22232838", + "timestamp": "1744219655" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TMX-USDC", + "address": "0x984408C88a9B042BF3e2ddf921Cd1fAFB4b735D1", + "asset": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "performanceFeeRate": 0, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-vault-TMX-WETH.json b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-vault-TMX-WETH.json new file mode 100644 index 0000000..c096a93 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-vault-TMX-WETH.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22232798", + "timestamp": "1744219175" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TMX-WETH", + "address": "0xDEB8a9C0546A01b7e5CeE8e44Fd0C8D8B96a1f6e", + "asset": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "performanceFeeRate": 0, + "maxCapacity": "5000000000000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-vault-Weiting USDC Vault.json b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-vault-Weiting USDC Vault.json new file mode 100644 index 0000000..31301e4 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-1500/eth-mainnet-vault-Weiting USDC Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xb07dca68abfa0915501a9f9b5e5f8ae686c02d95" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22215681", + "timestamp": "1744012679" + }, + "vaultInfo": { + "name": "Weiting USDC Vault", + "symbol": "Weiting USDC Vault", + "address": "0x5C16d84e998c661D9F6C7Cc23e1144E4b7f39759", + "asset": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "performanceFeeRate": 10000000, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x1c59f7A0AA3f01DDACd17c0EF7Bc00c3D18feD0A", + "guardian": "0x1c59f7A0AA3f01DDACd17c0EF7Bc00c3D18feD0A", + "allocator": "0x1c59f7A0AA3f01DDACd17c0EF7Bc00c3D18feD0A" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt new file mode 100644 index 0000000..81ca312 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt @@ -0,0 +1,21 @@ +== Logs == + Network: eth-mainnet + Deployer balance: 158879257545733090 + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175070 + Block timestamp: 1743522719 + + ===== Oracle Aggregator Info ===== + Deployer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Admin: 0x8409a9C1A911CED491892c5694E43994c9d47E8f + Oracle Aggregator deployed at: 0xE3a31690392E8E18DC3d862651C079339E2c1ADE + Oracle Timelock: 43200 + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-2000/deploy-eth-markets-test-20250411-2000-log.txt b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/deploy-eth-markets-test-20250411-2000-log.txt new file mode 100644 index 0000000..e1d9fd1 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/deploy-eth-markets-test-20250411-2000-log.txt @@ -0,0 +1,368 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ETHERSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xbca66c3c7c82ed859143ed822fee071f5be097df + + ===== Block Info ===== + Block number: 22242960 + Block timestamp: 1744341539 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22242960 + + ===== Market Info - 0 ===== + Market deployed at: 0x7459F5E02aA9b751C71b1af202b7B249C70E0886 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0xC7B3c4c7Fd51F47949E5732db2CaE6fB56F16c8E + XT deployed at: 0x72e40Ac9C2e937078BE717c62b2B6D2Df33A2b6C + GT deployed at: 0xE2988a97D4fF062ec3ADAbA0DBE8F9BeeE049F1d + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@11APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xCf6e91C22014F80cF9d47026d96481ccfd5F069b + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x461f2Da3954F9bbb76594Cd6f054438EFcd4e1B6 + XT deployed at: 0x57322fF9A8387308B96830a37A619960DDA55B54 + GT deployed at: 0x661712C8297949F8444Ada97c5a7D302A14E7A40 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@11APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x1BB62059ebDb5c2f09870D3078c3541E1dE01466 + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xA9D1a6DE856d650bf842257c8043a25ca12810a0 + XT deployed at: 0x56fB1b6b7B36eCFB2D68d5b6ba2Ea4643e9C9179 + GT deployed at: 0xb07f6Ac43053476a475093f10A9C6F04556d6066 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@11APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xECB4f5a6e8FE7dfe2Fc6Bd5659b7D4F8511320c5 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xC6aC78180B37853FD1C04E616554184766FF70B9 + XT deployed at: 0x6581A9F61C75A4cb43485CBB3A01C0C2Ada7ac2C + GT deployed at: 0x50D61D6171E48777949f235b2ac90bEDc2069bc8 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@11APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x3Bd0AFdC947B0Fc98181636590759Cc899b82c28 + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xA58590Df49d4eF69A39B29763cc2294f608aA417 + XT deployed at: 0xB19eb7596CfD71e359453d40b8f27F24247b31A2 + GT deployed at: 0x7E2Eee9b4C57370d68DB04eFfF50F76EBa70B7Cc + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@11APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x39fcF484849844996C2BdFdBC3424C186115C55A + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0xF1383899664116Fa965d744Df7054bf250799248 + XT deployed at: 0x57ceeA893b138cab4e964683C7B9bbf5a5bcb089 + GT deployed at: 0xcE02c85656467D888A938d7480C22593634e29BD + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@11APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0xcBB56d3978Be480358938Ac7dE6d92400e37ff6B + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0x9d3bD34323Ce8C999Dea6b998F4B6F8b3aF0DDB3 + XT deployed at: 0xf448c05b099FDA6d9B9D2b62524ed6Ca4Cd6C67a + GT deployed at: 0x4a674822E59e8d7d2De36DC9fB4A55cA9f577A4e + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@11APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0x480a10Af30358bbf8A9Bb8bAe8A310Ac9d2e2d58 + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x179Efa7aaCa2Fb1d4a1bE18a1CdAA614A0c16d13 + XT deployed at: 0x3fe1EcAA6d25B754a193ffD59e7d00985D08D93D + GT deployed at: 0x02B0dF8F37239af567E1E141b72a215C16c084f3 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@11APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0xb0d1787BBcC0AF39AB457e00f16E2f1317FF0287 + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x38d24cc0fdCce376FE2d7F20BAC0f7dB7eDb7987 + XT deployed at: 0x22017d37A8aE978E1dBD4b509732c7DbA67b5b29 + GT deployed at: 0xc87fDfd8304d2eaa892baEFF077850A13176bA16 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@11APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0xeead29C4cD1B8E0666eEa2b0207fCCde7cFf92E5 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x7dB5424DA6d89591398783F006D7d784178AbB8F + XT deployed at: 0x8C9C0d8cdA1a7FD6Eec26B7B1167740bdF885047 + GT deployed at: 0x86C7B4c9D290CfC4740926b539FA1354c80Fe5Cc + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@11APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x15FA6a5E3eFbE2F9a0EdC47d3fe4A74C27A687eA + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x5f0d3F32e6085B018102ac6645Ae342286a706Af + XT deployed at: 0xF566aa665714151D6fDEe7Be73dE573f87173b58 + GT deployed at: 0x922481086cfac73697db1838f8b84f404DDDbC87 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@11APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x9C3883dd81f171376bDD5D00A7efD9470b8d25AC + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x6384afFD4C8465E6701E248386638931e9027618 + XT deployed at: 0x89eAacB3c02343AA72f9CC95BC63bd8231185093 + GT deployed at: 0xCf21507a39aF04532202C53dC45FB04bB58DB17B + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 11APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@11APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 0.945460868 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.016364407324004256 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x7459f5e02aa9b751c71b1af202b7b249c70e0886, 0xc7b3c4c7fd51f47949e5732db2cae6fb56f16c8e, 0x72e40ac9c2e937078be717c62b2b6d2df33a2b6c, 0xe2988a97d4ff062ec3adaba0dbe8f9beee049f1d, 0xcf6e91c22014f80cf9d47026d96481ccfd5f069b, 0x461f2da3954f9bbb76594cd6f054438efcd4e1b6, 0x57322ff9a8387308b96830a37a619960dda55b54, 0x661712c8297949f8444ada97c5a7d302a14e7a40, 0x1bb62059ebdb5c2f09870d3078c3541e1de01466, 0xa9d1a6de856d650bf842257c8043a25ca12810a0, 0x56fb1b6b7b36ecfb2d68d5b6ba2ea4643e9c9179, 0xb07f6ac43053476a475093f10a9c6f04556d6066, 0xecb4f5a6e8fe7dfe2fc6bd5659b7d4f8511320c5, 0xc6ac78180b37853fd1c04e616554184766ff70b9, 0x6581a9f61c75a4cb43485cbb3a01c0c2ada7ac2c, 0x50d61d6171e48777949f235b2ac90bedc2069bc8, 0x3bd0afdc947b0fc98181636590759cc899b82c28, 0xa58590df49d4ef69a39b29763cc2294f608aa417, 0xb19eb7596cfd71e359453d40b8f27f24247b31a2, 0x7e2eee9b4c57370d68db04efff50f76eba70b7cc, 0x39fcf484849844996c2bdfdbc3424c186115c55a, 0xf1383899664116fa965d744df7054bf250799248, 0x57ceea893b138cab4e964683c7b9bbf5a5bcb089, 0xce02c85656467d888a938d7480c22593634e29bd, 0xcbb56d3978be480358938ac7de6d92400e37ff6b, 0x9d3bd34323ce8c999dea6b998f4b6f8b3af0ddb3, 0xf448c05b099fda6d9b9d2b62524ed6ca4cd6c67a, 0x4a674822e59e8d7d2de36dc9fb4a55ca9f577a4e, 0x480a10af30358bbf8a9bb8bae8a310ac9d2e2d58, 0x179efa7aaca2fb1d4a1be18a1cdaa614a0c16d13, 0x3fe1ecaa6d25b754a193ffd59e7d00985d08d93d, 0x02b0df8f37239af567e1e141b72a215c16c084f3, 0xb0d1787bbcc0af39ab457e00f16e2f1317ff0287, 0x38d24cc0fdcce376fe2d7f20bac0f7db7edb7987, 0x22017d37a8ae978e1dbd4b509732c7dba67b5b29, 0xc87fdfd8304d2eaa892baeff077850a13176ba16, 0xeead29c4cd1b8e0666eea2b0207fccde7cff92e5, 0x7db5424da6d89591398783f006d7d784178abb8f, 0x8c9c0d8cda1a7fd6eec26b7b1167740bdf885047, 0x86c7b4c9d290cfc4740926b539fa1354c80fe5cc, 0x15fa6a5e3efbe2f9a0edc47d3fe4a74c27a687ea, 0x5f0d3f32e6085b018102ac6645ae342286a706af, 0xf566aa665714151d6fdee7be73de573f87173b58, 0x922481086cfac73697db1838f8b84f404dddbc87, 0x9c3883dd81f171376bdd5d00a7efd9470b8d25ac, 0x6384affd4c8465e6701e248386638931e9027618, 0x89eaacb3c02343aa72f9cc95bc63bd8231185093, 0xcf21507a39af04532202c53dc45fb04bb58db17b]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-2000/deploy_markets_test_0402_log.txt b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/deploy_markets_test_0402_log.txt new file mode 100644 index 0000000..236c256 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/deploy_markets_test_0402_log.txt @@ -0,0 +1,370 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Enabled--verify +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175185 + Block timestamp: 1743524099 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22175185 + + ===== Market Info - 0 ===== + Market deployed at: 0x4a20DdEB8696b1f542649626889522068cc19438 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x00B210A7f79653A0fe7e2bc31d6Fe3026421195d + XT deployed at: 0x465c30b940E792262Ef65B7Fe7A5bAd3b5b7f034 + GT deployed at: 0xca3F986978ADEf5aA8e4F9e4F3d27f6f4Eb3f47d + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@02APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xC8c3A49b64dB371F96EdC15941e043966297Ea6b + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x19632ff799BA54B54934b52a89964F6cb12D396f + XT deployed at: 0xe459c64a852Df70Ea7D0cc46142A1a0d8BCd4f2A + GT deployed at: 0x9CEA72e4C7Fd1dd0bb2D0AAF98D756B1f85e096D + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@02APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x54ACdb3da45bBDEb1a53e1E3F6DB51C8384c7F9c + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x3ebabb95e4276DD2850666a95037f5EE3bb798Bb + XT deployed at: 0xb7d4329b11Dff286890F4d7e5b10763E09E8804C + GT deployed at: 0x28C108FD44B2E58DD9B07CBE453c0BCF836b8CB7 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@02APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xf2F9b0fDD5D22e574421A7Ee0E29e410E63C70A9 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x594Db033Ade81E0C8182B66d2B07fbc97452d1FA + XT deployed at: 0x544786112d542910634109BcCEF84C3Deb1b65e0 + GT deployed at: 0x81CAc518B14B28570C667A143F801bF2e05b6BEe + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@02APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x10aCD317ebf3F65e30c72720D89c55B7C68a9628 + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xA03710F73585cb5458F43739624611633Bf24173 + XT deployed at: 0x80525c75690102bb024BcEd8bE81D18A56172EC0 + GT deployed at: 0xe2e5403923B0421FA5a9D28c1012aeAFfc820f02 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@02APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x49913B7Bd178e21FaC84C3dED810Ff4CcDcb8403 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x8CDe48E20b5d77C3ec0fbCbf50d0C78B2DE11264 + XT deployed at: 0x8b596614c9ac30bd9DF615c3C18F0f05a97F0779 + GT deployed at: 0xBA03824B38E83B7CBAF3Fcb5aF02EF8342A110d8 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@02APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x69E1A695Ee24e7BcFc55d2dA7DfD479E4C7Eb6A3 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0xc7d5476d361C8d0E5c0478EA320431AD4a49A558 + XT deployed at: 0xe1710D5449241ce311Bfcefb5272594ECD930ec0 + GT deployed at: 0x4B87E9281de9573f2025565E632bdb8F136766E5 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@02APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0x9dA149D4Bc9eF4e6Eb1D131E837270f76dc62e79 + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD667a61e822564e1399f73196c73B2C41bCBda69 + XT deployed at: 0x2348B91F2037799d6AE604D792101534461DB06E + GT deployed at: 0x1aE5482Db2883e1ae8CDBFDbaE95539266F1bF32 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@02APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0x9cde69Ea28c9125060F86eB982305BafaE57f585 + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x4bDD2b0f934EECCE01A8Fc47E3762Ce86C9D061F + XT deployed at: 0x63B96518024b49C8F16104fDFd9d94a79A3d185C + GT deployed at: 0xa78bE568bc5ec42C8E41734dADcb86D3dde73af3 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@02APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x565656a354F6C2953EB2D00DC7e2e0Ab815e19E7 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x1184866Ed937F4605efc100c1f18E028F7CBDD86 + XT deployed at: 0x3F56b53953adf3a65f5Bb8E8Dce1C4926e1D629c + GT deployed at: 0x315f180e74247E01ca0377244Eb6b6D1c7444452 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@02APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x0ed76A80D639E7Bf88524b63429bB841c1633E60 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD4771df4a0f6338f521512A1651D8DB7EF5Af633 + XT deployed at: 0x4bbc10317e5b70B6B491836F5B2b496EE35f5E31 + GT deployed at: 0xFF601c3788236F231a8771cACBbB3087D0Ee7A2c + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@02APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x8c07c10a0a3530a9fB64c65f109A32F7B4b2DB80 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x0469A60F8fbc0c35c4D1D965a50A6Bd29c9dAB8C + XT deployed at: 0xE292927A017d58823957A83ea5EFeAF9C37D6F94 + GT deployed at: 0x7AdE4961Fccba087E8b4De84E8be61098Daf0230 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@02APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 5.079885262 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.087924645429718704 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x4a20ddeb8696b1f542649626889522068cc19438, 0x00b210a7f79653a0fe7e2bc31d6fe3026421195d, 0x465c30b940e792262ef65b7fe7a5bad3b5b7f034, 0xca3f986978adef5aa8e4f9e4f3d27f6f4eb3f47d, 0xc8c3a49b64db371f96edc15941e043966297ea6b, 0x19632ff799ba54b54934b52a89964f6cb12d396f, 0xe459c64a852df70ea7d0cc46142a1a0d8bcd4f2a, 0x9cea72e4c7fd1dd0bb2d0aaf98d756b1f85e096d, 0x54acdb3da45bbdeb1a53e1e3f6db51c8384c7f9c, 0x3ebabb95e4276dd2850666a95037f5ee3bb798bb, 0xb7d4329b11dff286890f4d7e5b10763e09e8804c, 0x28c108fd44b2e58dd9b07cbe453c0bcf836b8cb7, 0xf2f9b0fdd5d22e574421a7ee0e29e410e63c70a9, 0x594db033ade81e0c8182b66d2b07fbc97452d1fa, 0x544786112d542910634109bccef84c3deb1b65e0, 0x81cac518b14b28570c667a143f801bf2e05b6bee, 0x10acd317ebf3f65e30c72720d89c55b7c68a9628, 0xa03710f73585cb5458f43739624611633bf24173, 0x80525c75690102bb024bced8be81d18a56172ec0, 0xe2e5403923b0421fa5a9d28c1012aeaffc820f02, 0x49913b7bd178e21fac84c3ded810ff4ccdcb8403, 0x8cde48e20b5d77c3ec0fbcbf50d0c78b2de11264, 0x8b596614c9ac30bd9df615c3c18f0f05a97f0779, 0xba03824b38e83b7cbaf3fcb5af02ef8342a110d8, 0x69e1a695ee24e7bcfc55d2da7dfd479e4c7eb6a3, 0xc7d5476d361c8d0e5c0478ea320431ad4a49a558, 0xe1710d5449241ce311bfcefb5272594ecd930ec0, 0x4b87e9281de9573f2025565e632bdb8f136766e5, 0x9da149d4bc9ef4e6eb1d131e837270f76dc62e79, 0xd667a61e822564e1399f73196c73b2c41bcbda69, 0x2348b91f2037799d6ae604d792101534461db06e, 0x1ae5482db2883e1ae8cdbfdbae95539266f1bf32, 0x9cde69ea28c9125060f86eb982305bafae57f585, 0x4bdd2b0f934eecce01a8fc47e3762ce86c9d061f, 0x63b96518024b49c8f16104fdfd9d94a79a3d185c, 0xa78be568bc5ec42c8e41734dadcb86d3dde73af3, 0x565656a354f6c2953eb2d00dc7e2e0ab815e19e7, 0x1184866ed937f4605efc100c1f18e028f7cbdd86, 0x3f56b53953adf3a65f5bb8e8dce1c4926e1d629c, 0x315f180e74247e01ca0377244eb6b6d1c7444452, 0x0ed76a80d639e7bf88524b63429bb841c1633e60, 0xd4771df4a0f6338f521512a1651d8db7ef5af633, 0x4bbc10317e5b70b6b491836f5b2b496ee35f5e31, 0xff601c3788236f231a8771cacbbb3087d0ee7a2c, 0x8c07c10a0a3530a9fb64c65f109a32f7b4b2db80, 0x0469a60f8fbc0c35c4d1d965a50a6bd29c9dab8c, 0xe292927a017d58823957a83ea5efeaf9c37d6f94, 0x7ade4961fccba087e8b4de84e8be61098daf0230]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-access-manager.json b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-access-manager.json new file mode 100644 index 0000000..a1a5b6a --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743155675", + "gitBranch": "deploy/v1.0.5", + "gitCommitHash": "0x0x65c418860c22aecb27054e7a8c3207a4f87ad6af", + "blockInfo": { + "number": "22144647", + "timestamp": "1743155675" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-core.json b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-core.json new file mode 100644 index 0000000..34b5474 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743518639", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x30f0c30e4edf518e2bf6700837dad2a7624d35df", + "blockInfo": { + "number": "22174730", + "timestamp": "1743518639" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x37Ba9934aAbA7a49cC29d0952C6a91d7c7043dbc", + "vaultFactory": "0x01D8C1e0584751085a876892151Bf8490e862E3E", + "oracleAggregator": "0xE3a31690392E8E18DC3d862651C079339E2c1ADE", + "router": "0xC47591F5c023e44931c78D5A993834875b79FB11", + "swapAdapter": { + "uniswapV3Adapter": "0x34F7b52b0d33959C8351eF95F3523C89b6123C0b", + "odosV2Adapter": "0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779", + "pendleSwapV3Adapter": "0x0B30251FA697A39Fd41813b267b50F03414E82da", + "ERC4626VaultAdapter": "0x85ce30537c14EFB66B673f284bEa7c28351244F6" + }, + "marketViewer": "0x74Dfb95Ae623123ecf82Ba841985fB460bB9d45D" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@11APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@11APR2025.json new file mode 100644 index 0000000..4a62097 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22242960", + "timestamp": "1744341539" + }, + "market": "0xECB4f5a6e8FE7dfe2Fc6Bd5659b7D4F8511320c5", + "collateral": { + "address": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "symbol": "PT-sUSDE-29MAY2025", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xC6aC78180B37853FD1C04E616554184766FF70B9", + "xt": "0x6581A9F61C75A4cb43485CBB3A01C0C2Ada7ac2C", + "gt": "0x50D61D6171E48777949f235b2ac90bEDc2069bc8" + }, + "config": { + "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-USDC-USUALUSDC+@11APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-USDC-USUALUSDC+@11APR2025.json new file mode 100644 index 0000000..4d0db96 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-USDC-USUALUSDC+@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22242960", + "timestamp": "1744341539" + }, + "market": "0x3Bd0AFdC947B0Fc98181636590759Cc899b82c28", + "collateral": { + "address": "0xd63070114470f685b75B74D60EEc7c1113d33a3D", + "symbol": "USUALUSDC+", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xA58590Df49d4eF69A39B29763cc2294f608aA417", + "xt": "0xB19eb7596CfD71e359453d40b8f27F24247b31A2", + "gt": "0x7E2Eee9b4C57370d68DB04eFfF50F76EBa70B7Cc" + }, + "config": { + "marketSymbol": "USDC/USUALUSDC+@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-USDC-WBTC@11APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-USDC-WBTC@11APR2025.json new file mode 100644 index 0000000..cb3d010 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-USDC-WBTC@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22242960", + "timestamp": "1744341539" + }, + "market": "0xeead29C4cD1B8E0666eEa2b0207fCCde7cFf92E5", + "collateral": { + "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "symbol": "WBTC", + "priceFeed": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x7dB5424DA6d89591398783F006D7d784178AbB8F", + "xt": "0x8C9C0d8cdA1a7FD6Eec26B7B1167740bdF885047", + "gt": "0x86C7B4c9D290CfC4740926b539FA1354c80Fe5Cc" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-USDC-cbBTC@11APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-USDC-cbBTC@11APR2025.json new file mode 100644 index 0000000..63bb54b --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-USDC-cbBTC@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22242960", + "timestamp": "1744341539" + }, + "market": "0x15FA6a5E3eFbE2F9a0EdC47d3fe4A74C27A687eA", + "collateral": { + "address": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", + "symbol": "cbBTC", + "priceFeed": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x5f0d3F32e6085B018102ac6645Ae342286a706Af", + "xt": "0xF566aa665714151D6fDEe7Be73dE573f87173b58", + "gt": "0x922481086cfac73697db1838f8b84f404DDDbC87" + }, + "config": { + "marketSymbol": "USDC/cbBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-USDC-eUSDe@11APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-USDC-eUSDe@11APR2025.json new file mode 100644 index 0000000..9e9ffbe --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-USDC-eUSDe@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22242960", + "timestamp": "1744341539" + }, + "market": "0x480a10Af30358bbf8A9Bb8bAe8A310Ac9d2e2d58", + "collateral": { + "address": "0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F", + "symbol": "eUSDe", + "priceFeed": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x179Efa7aaCa2Fb1d4a1bE18a1CdAA614A0c16d13", + "xt": "0x3fe1EcAA6d25B754a193ffD59e7d00985D08D93D", + "gt": "0x02B0dF8F37239af567E1E141b72a215C16c084f3" + }, + "config": { + "marketSymbol": "USDC/eUSDe@29MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-USDC-sUSDe@11APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-USDC-sUSDe@11APR2025.json new file mode 100644 index 0000000..eff1577 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-USDC-sUSDe@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22242960", + "timestamp": "1744341539" + }, + "market": "0x1BB62059ebDb5c2f09870D3078c3541E1dE01466", + "collateral": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xA9D1a6DE856d650bf842257c8043a25ca12810a0", + "xt": "0x56fB1b6b7B36eCFB2D68d5b6ba2Ea4643e9C9179", + "gt": "0xb07f6Ac43053476a475093f10A9C6F04556d6066" + }, + "config": { + "marketSymbol": "USDC/sUSDe@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-USDC-wstETH@11APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-USDC-wstETH@11APR2025.json new file mode 100644 index 0000000..edbfff5 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-USDC-wstETH@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22242960", + "timestamp": "1744341539" + }, + "market": "0xCf6e91C22014F80cF9d47026d96481ccfd5F069b", + "collateral": { + "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x461f2Da3954F9bbb76594Cd6f054438EFcd4e1B6", + "xt": "0x57322fF9A8387308B96830a37A619960DDA55B54", + "gt": "0x661712C8297949F8444Ada97c5a7D302A14E7A40" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-WETH-MCwETH@11APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-WETH-MCwETH@11APR2025.json new file mode 100644 index 0000000..50e30ff --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-WETH-MCwETH@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22242960", + "timestamp": "1744341539" + }, + "market": "0x39fcF484849844996C2BdFdBC3424C186115C55A", + "collateral": { + "address": "0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8", + "symbol": "MCwETH", + "priceFeed": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xF1383899664116Fa965d744Df7054bf250799248", + "xt": "0x57ceeA893b138cab4e964683C7B9bbf5a5bcb089", + "gt": "0xcE02c85656467D888A938d7480C22593634e29BD" + }, + "config": { + "marketSymbol": "WETH/MCwETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-WETH-gtWETH@11APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-WETH-gtWETH@11APR2025.json new file mode 100644 index 0000000..30cb094 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-WETH-gtWETH@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22242960", + "timestamp": "1744341539" + }, + "market": "0x9C3883dd81f171376bDD5D00A7efD9470b8d25AC", + "collateral": { + "address": "0x2371e134e3455e0593363cBF89d3b6cf53740618", + "symbol": "gtWETH", + "priceFeed": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x6384afFD4C8465E6701E248386638931e9027618", + "xt": "0x89eAacB3c02343AA72f9CC95BC63bd8231185093", + "gt": "0xCf21507a39aF04532202C53dC45FB04bB58DB17B" + }, + "config": { + "marketSymbol": "WETH/gtWETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-WETH-pufETH@11APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-WETH-pufETH@11APR2025.json new file mode 100644 index 0000000..17a5655 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-WETH-pufETH@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22242960", + "timestamp": "1744341539" + }, + "market": "0xb0d1787BBcC0AF39AB457e00f16E2f1317FF0287", + "collateral": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x38d24cc0fdCce376FE2d7F20BAC0f7dB7eDb7987", + "xt": "0x22017d37A8aE978E1dBD4b509732c7DbA67b5b29", + "gt": "0xc87fDfd8304d2eaa892baEFF077850A13176bA16" + }, + "config": { + "marketSymbol": "WETH/pufETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-WETH-weETH@11APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-WETH-weETH@11APR2025.json new file mode 100644 index 0000000..8b78184 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-WETH-weETH@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22242960", + "timestamp": "1744341539" + }, + "market": "0x7459F5E02aA9b751C71b1af202b7B249C70E0886", + "collateral": { + "address": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "21600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xC7B3c4c7Fd51F47949E5732db2CaE6fB56F16c8E", + "xt": "0x72e40Ac9C2e937078BE717c62b2B6D2Df33A2b6C", + "gt": "0xE2988a97D4fF062ec3ADAbA0DBE8F9BeeE049F1d" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@11APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@11APR2025.json new file mode 100644 index 0000000..cd92885 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22242960", + "timestamp": "1744341539" + }, + "market": "0xcBB56d3978Be480358938Ac7dE6d92400e37ff6B", + "collateral": { + "address": "0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D", + "symbol": "PT-pufETH-26JUN2025", + "priceFeed": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x9d3bD34323Ce8C999Dea6b998F4B6F8b3aF0DDB3", + "xt": "0xf448c05b099FDA6d9B9D2b62524ed6Ca4Cd6C67a", + "gt": "0x4a674822E59e8d7d2De36DC9fB4A55cA9f577A4e" + }, + "config": { + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-vault-TMX-USDC.json b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-vault-TMX-USDC.json new file mode 100644 index 0000000..56904bc --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-vault-TMX-USDC.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22232838", + "timestamp": "1744219655" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TMX-USDC", + "address": "0x984408C88a9B042BF3e2ddf921Cd1fAFB4b735D1", + "asset": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "performanceFeeRate": 0, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-vault-TMX-WETH.json b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-vault-TMX-WETH.json new file mode 100644 index 0000000..c096a93 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-vault-TMX-WETH.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22232798", + "timestamp": "1744219175" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TMX-WETH", + "address": "0xDEB8a9C0546A01b7e5CeE8e44Fd0C8D8B96a1f6e", + "asset": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "performanceFeeRate": 0, + "maxCapacity": "5000000000000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-vault-Weiting USDC Vault.json b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-vault-Weiting USDC Vault.json new file mode 100644 index 0000000..31301e4 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250411-2000/eth-mainnet-vault-Weiting USDC Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xb07dca68abfa0915501a9f9b5e5f8ae686c02d95" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22215681", + "timestamp": "1744012679" + }, + "vaultInfo": { + "name": "Weiting USDC Vault", + "symbol": "Weiting USDC Vault", + "address": "0x5C16d84e998c661D9F6C7Cc23e1144E4b7f39759", + "asset": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "performanceFeeRate": 10000000, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x1c59f7A0AA3f01DDACd17c0EF7Bc00c3D18feD0A", + "guardian": "0x1c59f7A0AA3f01DDACd17c0EF7Bc00c3D18feD0A", + "allocator": "0x1c59f7A0AA3f01DDACd17c0EF7Bc00c3D18feD0A" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-1500/deploy-eth-mainnet-oracle-aggregator-0401-log.txt b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/deploy-eth-mainnet-oracle-aggregator-0401-log.txt new file mode 100644 index 0000000..81ca312 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/deploy-eth-mainnet-oracle-aggregator-0401-log.txt @@ -0,0 +1,21 @@ +== Logs == + Network: eth-mainnet + Deployer balance: 158879257545733090 + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175070 + Block timestamp: 1743522719 + + ===== Oracle Aggregator Info ===== + Deployer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Admin: 0x8409a9C1A911CED491892c5694E43994c9d47E8f + Oracle Aggregator deployed at: 0xE3a31690392E8E18DC3d862651C079339E2c1ADE + Oracle Timelock: 43200 + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-1500/deploy-eth-markets-test-20250412-1500-log.txt b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/deploy-eth-markets-test-20250412-1500-log.txt new file mode 100644 index 0000000..fd3815e --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/deploy-eth-markets-test-20250412-1500-log.txt @@ -0,0 +1,368 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ETHERSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xbca66c3c7c82ed859143ed822fee071f5be097df + + ===== Block Info ===== + Block number: 22243104 + Block timestamp: 1744343279 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22243104 + + ===== Market Info - 0 ===== + Market deployed at: 0xEe334D273ACbA047D53E3b99e8B1Ff825B17BC63 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0xff3ABE4a024246d4253CeBf989a52a11C706F5C8 + XT deployed at: 0x3eD770710cbd1D7935a09486413BEf8F4Adc439d + GT deployed at: 0xA2dCEb6F5Cb1fA7e2886688c523b785f7090b9fA + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@12APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0x08A7909436a3aa171a49A1ab4F81cAb10fBd8F74 + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xCFDb7768202AD455Ac8650E20cB85aA22EEC7FFb + XT deployed at: 0x76B4f3a642916e7c69117Fe01B91d98E107a26A3 + GT deployed at: 0x4823DA259ae433bD2d38827Da07B8273285A5Aa3 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@12APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0xC7423B364321A570CC88081AE52c53F461653E9f + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x23944658b8648738cBE587eea8aB8c808117bbe0 + XT deployed at: 0x9932bF095Bb863E42C748A7BA0E36A59676cF34C + GT deployed at: 0x3910f5F1fA92B7A0f4a2eF3ec3a7043F5a73a66B + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@12APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0x613edfBa1B7e42509d5Ed03C609332cA26489B25 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xFBa6228712E44a3dc5BfFA024aF053733F272deC + XT deployed at: 0x2E7627052A4b59bF95925aA5a63b8cD9B6682Cdb + GT deployed at: 0x7A58a019f945Bb3C0e8e796F11baa5b323cF1c86 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@12APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x3e8e1D4f920875fe17B51885d364A5b0E3F30D9f + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xEaceB75C60e2E2Bd43C1047420128069A466238c + XT deployed at: 0xe132C634E064b108afBE8501B5ceEc7b58A956ea + GT deployed at: 0xDA816e80e99e5F11695Ee905083Fc7a6519296a2 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@12APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0xA153C910FA9C31A26626EFd0ef2055F688bAF391 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x55E7cD260bD7991047d221556B8e9bDEDe7784eC + XT deployed at: 0xD930622B63FA8136467F883b8FA06bf9Ce386eb7 + GT deployed at: 0xEc82CEe8Ce6a8103290062B6B0430Bb2b4F7886B + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@12APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x8a4253b8884a990ee5b0B9B8e21aD00B913DdcAD + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0x21e34C7CBf8CdA0d4F3677Db358d5B6b1a44C3C4 + XT deployed at: 0xc0072b17D740dac4e98E6cb7746D520b80dABa32 + GT deployed at: 0xAc6E6400BA555effCB380F89dd60eDabf02BA944 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@12APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0x1920F2a997984596b966E6ff3A5379fA4795CD0b + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x993E69a147afE51269BDC90b456370600799AFDC + XT deployed at: 0x882cb586Eeb4EB557FA2BD3A389aCA3cD82FEe92 + GT deployed at: 0x70e1fB6F88606Df1537236fE31a60542Dc188AdE + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@12APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0xE09B216DE2c223243adDCf887488d904d4F84aBF + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x83a8E15258fa69b346042940E5a335BA6b03ab30 + XT deployed at: 0xB3473464E022F81656A52b79f5d6C6495613484d + GT deployed at: 0x17ff5EB311Eb4507cD594D648f8131cA2619c0b6 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@12APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x9f4Ee159d7d38fA9b5f6A3c5D448D898180E8789 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD71b68c0a0E8d97F32dDd671941F5eb9D2835cF8 + XT deployed at: 0xF9D87d221bCFe91Bb43fF8bff97C08Bb16d1AF8e + GT deployed at: 0x49E8822196afEC087914348B9ad901E99E067086 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@12APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x820E2CAE027dD3C55B444146BE737d698C81d791 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x6dc0947843c42df4A2f39A7a32591EE3D27a11eC + XT deployed at: 0x4C8e43681582aCe73087e944c7Fc72b91987cF76 + GT deployed at: 0xf292D6B9023D9E643EFddF07Bb57E9d997704BbB + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@12APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x60bf77fB6775cD6C3BC2caf61Aa6d61c820ac4c4 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0xFa8aF4bbE413F0819B8d14aeF565F17b115Db97e + XT deployed at: 0xdF7e0b628DEB1c26162e6787ced0f882ED705397 + GT deployed at: 0xA63010405020939D1c5653C3Ff211653b806d3B3 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@12APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 0.892029377 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.015439594132631784 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0xee334d273acba047d53e3b99e8b1ff825b17bc63, 0xff3abe4a024246d4253cebf989a52a11c706f5c8, 0x3ed770710cbd1d7935a09486413bef8f4adc439d, 0xa2dceb6f5cb1fa7e2886688c523b785f7090b9fa, 0x08a7909436a3aa171a49a1ab4f81cab10fbd8f74, 0xcfdb7768202ad455ac8650e20cb85aa22eec7ffb, 0x76b4f3a642916e7c69117fe01b91d98e107a26a3, 0x4823da259ae433bd2d38827da07b8273285a5aa3, 0xc7423b364321a570cc88081ae52c53f461653e9f, 0x23944658b8648738cbe587eea8ab8c808117bbe0, 0x9932bf095bb863e42c748a7ba0e36a59676cf34c, 0x3910f5f1fa92b7a0f4a2ef3ec3a7043f5a73a66b, 0x613edfba1b7e42509d5ed03c609332ca26489b25, 0xfba6228712e44a3dc5bffa024af053733f272dec, 0x2e7627052a4b59bf95925aa5a63b8cd9b6682cdb, 0x7a58a019f945bb3c0e8e796f11baa5b323cf1c86, 0x3e8e1d4f920875fe17b51885d364a5b0e3f30d9f, 0xeaceb75c60e2e2bd43c1047420128069a466238c, 0xe132c634e064b108afbe8501b5ceec7b58a956ea, 0xda816e80e99e5f11695ee905083fc7a6519296a2, 0xa153c910fa9c31a26626efd0ef2055f688baf391, 0x55e7cd260bd7991047d221556b8e9bdede7784ec, 0xd930622b63fa8136467f883b8fa06bf9ce386eb7, 0xec82cee8ce6a8103290062b6b0430bb2b4f7886b, 0x8a4253b8884a990ee5b0b9b8e21ad00b913ddcad, 0x21e34c7cbf8cda0d4f3677db358d5b6b1a44c3c4, 0xc0072b17d740dac4e98e6cb7746d520b80daba32, 0xac6e6400ba555effcb380f89dd60edabf02ba944, 0x1920f2a997984596b966e6ff3a5379fa4795cd0b, 0x993e69a147afe51269bdc90b456370600799afdc, 0x882cb586eeb4eb557fa2bd3a389aca3cd82fee92, 0x70e1fb6f88606df1537236fe31a60542dc188ade, 0xe09b216de2c223243addcf887488d904d4f84abf, 0x83a8e15258fa69b346042940e5a335ba6b03ab30, 0xb3473464e022f81656a52b79f5d6c6495613484d, 0x17ff5eb311eb4507cd594d648f8131ca2619c0b6, 0x9f4ee159d7d38fa9b5f6a3c5d448d898180e8789, 0xd71b68c0a0e8d97f32ddd671941f5eb9d2835cf8, 0xf9d87d221bcfe91bb43ff8bff97c08bb16d1af8e, 0x49e8822196afec087914348b9ad901e99e067086, 0x820e2cae027dd3c55b444146be737d698c81d791, 0x6dc0947843c42df4a2f39a7a32591ee3d27a11ec, 0x4c8e43681582ace73087e944c7fc72b91987cf76, 0xf292d6b9023d9e643efddf07bb57e9d997704bbb, 0x60bf77fb6775cd6c3bc2caf61aa6d61c820ac4c4, 0xfa8af4bbe413f0819b8d14aef565f17b115db97e, 0xdf7e0b628deb1c26162e6787ced0f882ed705397, 0xa63010405020939d1c5653c3ff211653b806d3b3]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-1500/deploy_markets_test_0402_log.txt b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/deploy_markets_test_0402_log.txt new file mode 100644 index 0000000..236c256 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/deploy_markets_test_0402_log.txt @@ -0,0 +1,370 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Enabled--verify +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175185 + Block timestamp: 1743524099 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22175185 + + ===== Market Info - 0 ===== + Market deployed at: 0x4a20DdEB8696b1f542649626889522068cc19438 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x00B210A7f79653A0fe7e2bc31d6Fe3026421195d + XT deployed at: 0x465c30b940E792262Ef65B7Fe7A5bAd3b5b7f034 + GT deployed at: 0xca3F986978ADEf5aA8e4F9e4F3d27f6f4Eb3f47d + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@02APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xC8c3A49b64dB371F96EdC15941e043966297Ea6b + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x19632ff799BA54B54934b52a89964F6cb12D396f + XT deployed at: 0xe459c64a852Df70Ea7D0cc46142A1a0d8BCd4f2A + GT deployed at: 0x9CEA72e4C7Fd1dd0bb2D0AAF98D756B1f85e096D + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@02APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x54ACdb3da45bBDEb1a53e1E3F6DB51C8384c7F9c + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x3ebabb95e4276DD2850666a95037f5EE3bb798Bb + XT deployed at: 0xb7d4329b11Dff286890F4d7e5b10763E09E8804C + GT deployed at: 0x28C108FD44B2E58DD9B07CBE453c0BCF836b8CB7 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@02APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xf2F9b0fDD5D22e574421A7Ee0E29e410E63C70A9 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x594Db033Ade81E0C8182B66d2B07fbc97452d1FA + XT deployed at: 0x544786112d542910634109BcCEF84C3Deb1b65e0 + GT deployed at: 0x81CAc518B14B28570C667A143F801bF2e05b6BEe + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@02APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x10aCD317ebf3F65e30c72720D89c55B7C68a9628 + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xA03710F73585cb5458F43739624611633Bf24173 + XT deployed at: 0x80525c75690102bb024BcEd8bE81D18A56172EC0 + GT deployed at: 0xe2e5403923B0421FA5a9D28c1012aeAFfc820f02 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@02APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x49913B7Bd178e21FaC84C3dED810Ff4CcDcb8403 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x8CDe48E20b5d77C3ec0fbCbf50d0C78B2DE11264 + XT deployed at: 0x8b596614c9ac30bd9DF615c3C18F0f05a97F0779 + GT deployed at: 0xBA03824B38E83B7CBAF3Fcb5aF02EF8342A110d8 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@02APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x69E1A695Ee24e7BcFc55d2dA7DfD479E4C7Eb6A3 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0xc7d5476d361C8d0E5c0478EA320431AD4a49A558 + XT deployed at: 0xe1710D5449241ce311Bfcefb5272594ECD930ec0 + GT deployed at: 0x4B87E9281de9573f2025565E632bdb8F136766E5 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@02APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0x9dA149D4Bc9eF4e6Eb1D131E837270f76dc62e79 + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD667a61e822564e1399f73196c73B2C41bCBda69 + XT deployed at: 0x2348B91F2037799d6AE604D792101534461DB06E + GT deployed at: 0x1aE5482Db2883e1ae8CDBFDbaE95539266F1bF32 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@02APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0x9cde69Ea28c9125060F86eB982305BafaE57f585 + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x4bDD2b0f934EECCE01A8Fc47E3762Ce86C9D061F + XT deployed at: 0x63B96518024b49C8F16104fDFd9d94a79A3d185C + GT deployed at: 0xa78bE568bc5ec42C8E41734dADcb86D3dde73af3 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@02APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x565656a354F6C2953EB2D00DC7e2e0Ab815e19E7 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x1184866Ed937F4605efc100c1f18E028F7CBDD86 + XT deployed at: 0x3F56b53953adf3a65f5Bb8E8Dce1C4926e1D629c + GT deployed at: 0x315f180e74247E01ca0377244Eb6b6D1c7444452 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@02APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x0ed76A80D639E7Bf88524b63429bB841c1633E60 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD4771df4a0f6338f521512A1651D8DB7EF5Af633 + XT deployed at: 0x4bbc10317e5b70B6B491836F5B2b496EE35f5E31 + GT deployed at: 0xFF601c3788236F231a8771cACBbB3087D0Ee7A2c + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@02APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x8c07c10a0a3530a9fB64c65f109A32F7B4b2DB80 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x0469A60F8fbc0c35c4D1D965a50A6Bd29c9dAB8C + XT deployed at: 0xE292927A017d58823957A83ea5EFeAF9C37D6F94 + GT deployed at: 0x7AdE4961Fccba087E8b4De84E8be61098Daf0230 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@02APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 5.079885262 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.087924645429718704 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x4a20ddeb8696b1f542649626889522068cc19438, 0x00b210a7f79653a0fe7e2bc31d6fe3026421195d, 0x465c30b940e792262ef65b7fe7a5bad3b5b7f034, 0xca3f986978adef5aa8e4f9e4f3d27f6f4eb3f47d, 0xc8c3a49b64db371f96edc15941e043966297ea6b, 0x19632ff799ba54b54934b52a89964f6cb12d396f, 0xe459c64a852df70ea7d0cc46142a1a0d8bcd4f2a, 0x9cea72e4c7fd1dd0bb2d0aaf98d756b1f85e096d, 0x54acdb3da45bbdeb1a53e1e3f6db51c8384c7f9c, 0x3ebabb95e4276dd2850666a95037f5ee3bb798bb, 0xb7d4329b11dff286890f4d7e5b10763e09e8804c, 0x28c108fd44b2e58dd9b07cbe453c0bcf836b8cb7, 0xf2f9b0fdd5d22e574421a7ee0e29e410e63c70a9, 0x594db033ade81e0c8182b66d2b07fbc97452d1fa, 0x544786112d542910634109bccef84c3deb1b65e0, 0x81cac518b14b28570c667a143f801bf2e05b6bee, 0x10acd317ebf3f65e30c72720d89c55b7c68a9628, 0xa03710f73585cb5458f43739624611633bf24173, 0x80525c75690102bb024bced8be81d18a56172ec0, 0xe2e5403923b0421fa5a9d28c1012aeaffc820f02, 0x49913b7bd178e21fac84c3ded810ff4ccdcb8403, 0x8cde48e20b5d77c3ec0fbcbf50d0c78b2de11264, 0x8b596614c9ac30bd9df615c3c18f0f05a97f0779, 0xba03824b38e83b7cbaf3fcb5af02ef8342a110d8, 0x69e1a695ee24e7bcfc55d2da7dfd479e4c7eb6a3, 0xc7d5476d361c8d0e5c0478ea320431ad4a49a558, 0xe1710d5449241ce311bfcefb5272594ecd930ec0, 0x4b87e9281de9573f2025565e632bdb8f136766e5, 0x9da149d4bc9ef4e6eb1d131e837270f76dc62e79, 0xd667a61e822564e1399f73196c73b2c41bcbda69, 0x2348b91f2037799d6ae604d792101534461db06e, 0x1ae5482db2883e1ae8cdbfdbae95539266f1bf32, 0x9cde69ea28c9125060f86eb982305bafae57f585, 0x4bdd2b0f934eecce01a8fc47e3762ce86c9d061f, 0x63b96518024b49c8f16104fdfd9d94a79a3d185c, 0xa78be568bc5ec42c8e41734dadcb86d3dde73af3, 0x565656a354f6c2953eb2d00dc7e2e0ab815e19e7, 0x1184866ed937f4605efc100c1f18e028f7cbdd86, 0x3f56b53953adf3a65f5bb8e8dce1c4926e1d629c, 0x315f180e74247e01ca0377244eb6b6d1c7444452, 0x0ed76a80d639e7bf88524b63429bb841c1633e60, 0xd4771df4a0f6338f521512a1651d8db7ef5af633, 0x4bbc10317e5b70b6b491836f5b2b496ee35f5e31, 0xff601c3788236f231a8771cacbbb3087d0ee7a2c, 0x8c07c10a0a3530a9fb64c65f109a32f7b4b2db80, 0x0469a60f8fbc0c35c4d1d965a50a6bd29c9dab8c, 0xe292927a017d58823957a83ea5efeaf9c37d6f94, 0x7ade4961fccba087e8b4de84e8be61098daf0230]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-access-manager.json b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-access-manager.json new file mode 100644 index 0000000..a1a5b6a --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743155675", + "gitBranch": "deploy/v1.0.5", + "gitCommitHash": "0x0x65c418860c22aecb27054e7a8c3207a4f87ad6af", + "blockInfo": { + "number": "22144647", + "timestamp": "1743155675" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-core.json b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-core.json new file mode 100644 index 0000000..34b5474 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743518639", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x30f0c30e4edf518e2bf6700837dad2a7624d35df", + "blockInfo": { + "number": "22174730", + "timestamp": "1743518639" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x37Ba9934aAbA7a49cC29d0952C6a91d7c7043dbc", + "vaultFactory": "0x01D8C1e0584751085a876892151Bf8490e862E3E", + "oracleAggregator": "0xE3a31690392E8E18DC3d862651C079339E2c1ADE", + "router": "0xC47591F5c023e44931c78D5A993834875b79FB11", + "swapAdapter": { + "uniswapV3Adapter": "0x34F7b52b0d33959C8351eF95F3523C89b6123C0b", + "odosV2Adapter": "0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779", + "pendleSwapV3Adapter": "0x0B30251FA697A39Fd41813b267b50F03414E82da", + "ERC4626VaultAdapter": "0x85ce30537c14EFB66B673f284bEa7c28351244F6" + }, + "marketViewer": "0x74Dfb95Ae623123ecf82Ba841985fB460bB9d45D" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@12APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@12APR2025.json new file mode 100644 index 0000000..e71cdbb --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243104", + "timestamp": "1744343279" + }, + "market": "0x613edfBa1B7e42509d5Ed03C609332cA26489B25", + "collateral": { + "address": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "symbol": "PT-sUSDE-29MAY2025", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xFBa6228712E44a3dc5BfFA024aF053733F272deC", + "xt": "0x2E7627052A4b59bF95925aA5a63b8cD9B6682Cdb", + "gt": "0x7A58a019f945Bb3C0e8e796F11baa5b323cF1c86" + }, + "config": { + "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-USDC-USUALUSDC+@12APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-USDC-USUALUSDC+@12APR2025.json new file mode 100644 index 0000000..0f591f5 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-USDC-USUALUSDC+@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243104", + "timestamp": "1744343279" + }, + "market": "0x3e8e1D4f920875fe17B51885d364A5b0E3F30D9f", + "collateral": { + "address": "0xd63070114470f685b75B74D60EEc7c1113d33a3D", + "symbol": "USUALUSDC+", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xEaceB75C60e2E2Bd43C1047420128069A466238c", + "xt": "0xe132C634E064b108afBE8501B5ceEc7b58A956ea", + "gt": "0xDA816e80e99e5F11695Ee905083Fc7a6519296a2" + }, + "config": { + "marketSymbol": "USDC/USUALUSDC+@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-USDC-WBTC@12APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-USDC-WBTC@12APR2025.json new file mode 100644 index 0000000..59076ad --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-USDC-WBTC@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243104", + "timestamp": "1744343279" + }, + "market": "0x9f4Ee159d7d38fA9b5f6A3c5D448D898180E8789", + "collateral": { + "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "symbol": "WBTC", + "priceFeed": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xD71b68c0a0E8d97F32dDd671941F5eb9D2835cF8", + "xt": "0xF9D87d221bCFe91Bb43fF8bff97C08Bb16d1AF8e", + "gt": "0x49E8822196afEC087914348B9ad901E99E067086" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-USDC-cbBTC@12APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-USDC-cbBTC@12APR2025.json new file mode 100644 index 0000000..6cb82ae --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-USDC-cbBTC@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243104", + "timestamp": "1744343279" + }, + "market": "0x820E2CAE027dD3C55B444146BE737d698C81d791", + "collateral": { + "address": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", + "symbol": "cbBTC", + "priceFeed": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x6dc0947843c42df4A2f39A7a32591EE3D27a11eC", + "xt": "0x4C8e43681582aCe73087e944c7Fc72b91987cF76", + "gt": "0xf292D6B9023D9E643EFddF07Bb57E9d997704BbB" + }, + "config": { + "marketSymbol": "USDC/cbBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-USDC-eUSDe@12APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-USDC-eUSDe@12APR2025.json new file mode 100644 index 0000000..43ce099 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-USDC-eUSDe@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243104", + "timestamp": "1744343279" + }, + "market": "0x1920F2a997984596b966E6ff3A5379fA4795CD0b", + "collateral": { + "address": "0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F", + "symbol": "eUSDe", + "priceFeed": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x993E69a147afE51269BDC90b456370600799AFDC", + "xt": "0x882cb586Eeb4EB557FA2BD3A389aCA3cD82FEe92", + "gt": "0x70e1fB6F88606Df1537236fE31a60542Dc188AdE" + }, + "config": { + "marketSymbol": "USDC/eUSDe@29MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-USDC-sUSDe@12APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-USDC-sUSDe@12APR2025.json new file mode 100644 index 0000000..05e536b --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-USDC-sUSDe@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243104", + "timestamp": "1744343279" + }, + "market": "0xC7423B364321A570CC88081AE52c53F461653E9f", + "collateral": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x23944658b8648738cBE587eea8aB8c808117bbe0", + "xt": "0x9932bF095Bb863E42C748A7BA0E36A59676cF34C", + "gt": "0x3910f5F1fA92B7A0f4a2eF3ec3a7043F5a73a66B" + }, + "config": { + "marketSymbol": "USDC/sUSDe@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-USDC-wstETH@12APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-USDC-wstETH@12APR2025.json new file mode 100644 index 0000000..0ba8992 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-USDC-wstETH@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243104", + "timestamp": "1744343279" + }, + "market": "0x08A7909436a3aa171a49A1ab4F81cAb10fBd8F74", + "collateral": { + "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xCFDb7768202AD455Ac8650E20cB85aA22EEC7FFb", + "xt": "0x76B4f3a642916e7c69117Fe01B91d98E107a26A3", + "gt": "0x4823DA259ae433bD2d38827Da07B8273285A5Aa3" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-WETH-MCwETH@12APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-WETH-MCwETH@12APR2025.json new file mode 100644 index 0000000..ec27231 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-WETH-MCwETH@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243104", + "timestamp": "1744343279" + }, + "market": "0xA153C910FA9C31A26626EFd0ef2055F688bAF391", + "collateral": { + "address": "0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8", + "symbol": "MCwETH", + "priceFeed": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x55E7cD260bD7991047d221556B8e9bDEDe7784eC", + "xt": "0xD930622B63FA8136467F883b8FA06bf9Ce386eb7", + "gt": "0xEc82CEe8Ce6a8103290062B6B0430Bb2b4F7886B" + }, + "config": { + "marketSymbol": "WETH/MCwETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-WETH-gtWETH@12APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-WETH-gtWETH@12APR2025.json new file mode 100644 index 0000000..177ad61 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-WETH-gtWETH@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243104", + "timestamp": "1744343279" + }, + "market": "0x60bf77fB6775cD6C3BC2caf61Aa6d61c820ac4c4", + "collateral": { + "address": "0x2371e134e3455e0593363cBF89d3b6cf53740618", + "symbol": "gtWETH", + "priceFeed": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xFa8aF4bbE413F0819B8d14aeF565F17b115Db97e", + "xt": "0xdF7e0b628DEB1c26162e6787ced0f882ED705397", + "gt": "0xA63010405020939D1c5653C3Ff211653b806d3B3" + }, + "config": { + "marketSymbol": "WETH/gtWETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-WETH-pufETH@12APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-WETH-pufETH@12APR2025.json new file mode 100644 index 0000000..781273c --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-WETH-pufETH@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243104", + "timestamp": "1744343279" + }, + "market": "0xE09B216DE2c223243adDCf887488d904d4F84aBF", + "collateral": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x83a8E15258fa69b346042940E5a335BA6b03ab30", + "xt": "0xB3473464E022F81656A52b79f5d6C6495613484d", + "gt": "0x17ff5EB311Eb4507cD594D648f8131cA2619c0b6" + }, + "config": { + "marketSymbol": "WETH/pufETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-WETH-weETH@12APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-WETH-weETH@12APR2025.json new file mode 100644 index 0000000..182e487 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-WETH-weETH@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243104", + "timestamp": "1744343279" + }, + "market": "0xEe334D273ACbA047D53E3b99e8B1Ff825B17BC63", + "collateral": { + "address": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "21600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xff3ABE4a024246d4253CeBf989a52a11C706F5C8", + "xt": "0x3eD770710cbd1D7935a09486413BEf8F4Adc439d", + "gt": "0xA2dCEb6F5Cb1fA7e2886688c523b785f7090b9fA" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@12APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@12APR2025.json new file mode 100644 index 0000000..d447a3f --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243104", + "timestamp": "1744343279" + }, + "market": "0x8a4253b8884a990ee5b0B9B8e21aD00B913DdcAD", + "collateral": { + "address": "0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D", + "symbol": "PT-pufETH-26JUN2025", + "priceFeed": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x21e34C7CBf8CdA0d4F3677Db358d5B6b1a44C3C4", + "xt": "0xc0072b17D740dac4e98E6cb7746D520b80dABa32", + "gt": "0xAc6E6400BA555effCB380F89dd60eDabf02BA944" + }, + "config": { + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-vault-TMX-USDC.json b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-vault-TMX-USDC.json new file mode 100644 index 0000000..56904bc --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-vault-TMX-USDC.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22232838", + "timestamp": "1744219655" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TMX-USDC", + "address": "0x984408C88a9B042BF3e2ddf921Cd1fAFB4b735D1", + "asset": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "performanceFeeRate": 0, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-vault-TMX-WETH.json b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-vault-TMX-WETH.json new file mode 100644 index 0000000..c096a93 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-vault-TMX-WETH.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22232798", + "timestamp": "1744219175" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TMX-WETH", + "address": "0xDEB8a9C0546A01b7e5CeE8e44Fd0C8D8B96a1f6e", + "asset": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "performanceFeeRate": 0, + "maxCapacity": "5000000000000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-vault-Weiting USDC Vault.json b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-vault-Weiting USDC Vault.json new file mode 100644 index 0000000..31301e4 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-1500/eth-mainnet-vault-Weiting USDC Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xb07dca68abfa0915501a9f9b5e5f8ae686c02d95" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22215681", + "timestamp": "1744012679" + }, + "vaultInfo": { + "name": "Weiting USDC Vault", + "symbol": "Weiting USDC Vault", + "address": "0x5C16d84e998c661D9F6C7Cc23e1144E4b7f39759", + "asset": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "performanceFeeRate": 10000000, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x1c59f7A0AA3f01DDACd17c0EF7Bc00c3D18feD0A", + "guardian": "0x1c59f7A0AA3f01DDACd17c0EF7Bc00c3D18feD0A", + "allocator": "0x1c59f7A0AA3f01DDACd17c0EF7Bc00c3D18feD0A" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt new file mode 100644 index 0000000..81ca312 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt @@ -0,0 +1,21 @@ +== Logs == + Network: eth-mainnet + Deployer balance: 158879257545733090 + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175070 + Block timestamp: 1743522719 + + ===== Oracle Aggregator Info ===== + Deployer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Admin: 0x8409a9C1A911CED491892c5694E43994c9d47E8f + Oracle Aggregator deployed at: 0xE3a31690392E8E18DC3d862651C079339E2c1ADE + Oracle Timelock: 43200 + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-2000/deploy-eth-markets-test-20250412-2000-log.txt b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/deploy-eth-markets-test-20250412-2000-log.txt new file mode 100644 index 0000000..42bb694 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/deploy-eth-markets-test-20250412-2000-log.txt @@ -0,0 +1,368 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ETHERSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xbca66c3c7c82ed859143ed822fee071f5be097df + + ===== Block Info ===== + Block number: 22243149 + Block timestamp: 1744343819 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22243149 + + ===== Market Info - 0 ===== + Market deployed at: 0x206B965b0201C9db8cbF360801A822E56FCd7DBd + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x1a32fa2B60fb913e14a4Dd71eE9a2B5B3CaA330c + XT deployed at: 0x1B890F505442b7dDFbEa43C3fe1f18fD73Ce64ca + GT deployed at: 0xEeFDcF4dD432E57D33b77CEaB6A398C00018Bf34 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@12APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xd264fD9ED7094B2aA52a43D939B90F645FAf3269 + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x0FeadBc171bc18d6e9933d91D29d5567506C777D + XT deployed at: 0x496fF4f33f202c990a210560D5d88EdE70295D3C + GT deployed at: 0xc89d1a74b072Ed2053EbDf3066202e0E2D74aAFA + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@12APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x36b473202bFB68bE0C40d4497679050554fC2f51 + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xd3722A7b5d8e639FF194682075329E9aeC4feA25 + XT deployed at: 0xDcEb3ab4E74872787cD0db3c9aFaAb82342ca6F7 + GT deployed at: 0x1A997891D2d8ff180C00f0A0b2Df3F039bb1809d + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@12APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0x22F537697aD1f9aC2F39088ab93eA8065F2c5356 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xCB655D961B4e45BC0291d9C670AeCEbBdB6dFAdd + XT deployed at: 0x84e19bfAfd150F18Ae837ecFD94732a7d4D1dBd1 + GT deployed at: 0xF76a0d8f59a150b72D5A424b1bAC8148376263A2 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@12APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0xBC3fd25F73b978713d4E3C022c9e7D01d0892F50 + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x0dBB260439216921fae35Cd67dF242ceec97c49c + XT deployed at: 0x51eb734ACBd2228b50865766618f34e2191bB12E + GT deployed at: 0x12D869A3dF8F9A3b34a3f6C0A4F103514218fb03 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@12APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x163a6068FCcbE407CbbF640C40374a08f67DDb61 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x94afEf173240ae59d815eC3A0a52b10d2B7DB082 + XT deployed at: 0x0E5f7DC2198d67A604c1dee32acA4c6ED3eF20a9 + GT deployed at: 0x336DF173ef7e32b5A974D2698640A590c42F1450 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@12APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x4CF733d2BC4a56Bd0b16bfA32537Cc6BE2c3D4AF + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0xeE5Ec32Ab26037E51c1D539533bc6B4F261EA57C + XT deployed at: 0x96635e1Ef5F9ECe88b77883C892EFef72779D0b1 + GT deployed at: 0x956caE1907F5Fefe2C46dbF06Ab80a9B3748b5f9 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@12APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0xd53684d38a5B199A149CA39AFc48305669a0962f + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x7566577F31751E0370B63bdDe1955F254fc87e25 + XT deployed at: 0xc386d5D3046fe8B6CEE581f25D1b9787a5F66206 + GT deployed at: 0x681Cfb9159a59407E18362A4fb798040788c1c74 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@12APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0xA461955e9ccBE5f7F76019BfbBE171FeF2E2E65a + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0xE6e92DD4a8bcB99F2F2d7948eAb833132718D352 + XT deployed at: 0xa189c5194c97AbEFAB262C4047308C9009d347Ad + GT deployed at: 0x2f2b74Fbe6b68c348F8cdF0C116036F31EbFA13c + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@12APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x6759B1180929d206ac12799618c1CCA45ADF8db8 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x41BE708b3D3a703e5ec77902aCCD02eb08623E5d + XT deployed at: 0x272f39b3170625E5e375749c3fE2ae61c6E615C7 + GT deployed at: 0x2bbe92918e372568b675a1D4477e4b264702a48A + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@12APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0xbDbB23aE4cfF68188d2c092253775CbBf19aA24C + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x1019D260A295Ca4d57e06276F6F0e8D5Efa87a6a + XT deployed at: 0x85a195400f0088e283e226348934Bc88b2fb9F15 + GT deployed at: 0x0abCc3841C7f33C1ff2d8f339cAd4BD56B17C7F2 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@12APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x87BBB0E5CC1b923269e922C70b4027D5E5116D41 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x9d74ED435C6fCc77722A7C46888d31B8792d2d80 + XT deployed at: 0x3DD6A7b04e03b01D3AB359218B26acCFBd1F29c4 + GT deployed at: 0x9432Bf8a0a8D81c5902FB7b6a294c3B31Cc5c061 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 12APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@12APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 0.738585046 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.012783719501506032 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x206b965b0201c9db8cbf360801a822e56fcd7dbd, 0x1a32fa2b60fb913e14a4dd71ee9a2b5b3caa330c, 0x1b890f505442b7ddfbea43c3fe1f18fd73ce64ca, 0xeefdcf4dd432e57d33b77ceab6a398c00018bf34, 0xd264fd9ed7094b2aa52a43d939b90f645faf3269, 0x0feadbc171bc18d6e9933d91d29d5567506c777d, 0x496ff4f33f202c990a210560d5d88ede70295d3c, 0xc89d1a74b072ed2053ebdf3066202e0e2d74aafa, 0x36b473202bfb68be0c40d4497679050554fc2f51, 0xd3722a7b5d8e639ff194682075329e9aec4fea25, 0xdceb3ab4e74872787cd0db3c9afaab82342ca6f7, 0x1a997891d2d8ff180c00f0a0b2df3f039bb1809d, 0x22f537697ad1f9ac2f39088ab93ea8065f2c5356, 0xcb655d961b4e45bc0291d9c670aecebbdb6dfadd, 0x84e19bfafd150f18ae837ecfd94732a7d4d1dbd1, 0xf76a0d8f59a150b72d5a424b1bac8148376263a2, 0xbc3fd25f73b978713d4e3c022c9e7d01d0892f50, 0x0dbb260439216921fae35cd67df242ceec97c49c, 0x51eb734acbd2228b50865766618f34e2191bb12e, 0x12d869a3df8f9a3b34a3f6c0a4f103514218fb03, 0x163a6068fccbe407cbbf640c40374a08f67ddb61, 0x94afef173240ae59d815ec3a0a52b10d2b7db082, 0x0e5f7dc2198d67a604c1dee32aca4c6ed3ef20a9, 0x336df173ef7e32b5a974d2698640a590c42f1450, 0x4cf733d2bc4a56bd0b16bfa32537cc6be2c3d4af, 0xee5ec32ab26037e51c1d539533bc6b4f261ea57c, 0x96635e1ef5f9ece88b77883c892efef72779d0b1, 0x956cae1907f5fefe2c46dbf06ab80a9b3748b5f9, 0xd53684d38a5b199a149ca39afc48305669a0962f, 0x7566577f31751e0370b63bdde1955f254fc87e25, 0xc386d5d3046fe8b6cee581f25d1b9787a5f66206, 0x681cfb9159a59407e18362a4fb798040788c1c74, 0xa461955e9ccbe5f7f76019bfbbe171fef2e2e65a, 0xe6e92dd4a8bcb99f2f2d7948eab833132718d352, 0xa189c5194c97abefab262c4047308c9009d347ad, 0x2f2b74fbe6b68c348f8cdf0c116036f31ebfa13c, 0x6759b1180929d206ac12799618c1cca45adf8db8, 0x41be708b3d3a703e5ec77902accd02eb08623e5d, 0x272f39b3170625e5e375749c3fe2ae61c6e615c7, 0x2bbe92918e372568b675a1d4477e4b264702a48a, 0xbdbb23ae4cff68188d2c092253775cbbf19aa24c, 0x1019d260a295ca4d57e06276f6f0e8d5efa87a6a, 0x85a195400f0088e283e226348934bc88b2fb9f15, 0x0abcc3841c7f33c1ff2d8f339cad4bd56b17c7f2, 0x87bbb0e5cc1b923269e922c70b4027d5e5116d41, 0x9d74ed435c6fcc77722a7c46888d31b8792d2d80, 0x3dd6a7b04e03b01d3ab359218b26accfbd1f29c4, 0x9432bf8a0a8d81c5902fb7b6a294c3b31cc5c061]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-2000/deploy_markets_test_0402_log.txt b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/deploy_markets_test_0402_log.txt new file mode 100644 index 0000000..236c256 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/deploy_markets_test_0402_log.txt @@ -0,0 +1,370 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Enabled--verify +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175185 + Block timestamp: 1743524099 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22175185 + + ===== Market Info - 0 ===== + Market deployed at: 0x4a20DdEB8696b1f542649626889522068cc19438 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x00B210A7f79653A0fe7e2bc31d6Fe3026421195d + XT deployed at: 0x465c30b940E792262Ef65B7Fe7A5bAd3b5b7f034 + GT deployed at: 0xca3F986978ADEf5aA8e4F9e4F3d27f6f4Eb3f47d + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@02APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xC8c3A49b64dB371F96EdC15941e043966297Ea6b + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x19632ff799BA54B54934b52a89964F6cb12D396f + XT deployed at: 0xe459c64a852Df70Ea7D0cc46142A1a0d8BCd4f2A + GT deployed at: 0x9CEA72e4C7Fd1dd0bb2D0AAF98D756B1f85e096D + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@02APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x54ACdb3da45bBDEb1a53e1E3F6DB51C8384c7F9c + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x3ebabb95e4276DD2850666a95037f5EE3bb798Bb + XT deployed at: 0xb7d4329b11Dff286890F4d7e5b10763E09E8804C + GT deployed at: 0x28C108FD44B2E58DD9B07CBE453c0BCF836b8CB7 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@02APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xf2F9b0fDD5D22e574421A7Ee0E29e410E63C70A9 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x594Db033Ade81E0C8182B66d2B07fbc97452d1FA + XT deployed at: 0x544786112d542910634109BcCEF84C3Deb1b65e0 + GT deployed at: 0x81CAc518B14B28570C667A143F801bF2e05b6BEe + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@02APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x10aCD317ebf3F65e30c72720D89c55B7C68a9628 + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xA03710F73585cb5458F43739624611633Bf24173 + XT deployed at: 0x80525c75690102bb024BcEd8bE81D18A56172EC0 + GT deployed at: 0xe2e5403923B0421FA5a9D28c1012aeAFfc820f02 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@02APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x49913B7Bd178e21FaC84C3dED810Ff4CcDcb8403 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x8CDe48E20b5d77C3ec0fbCbf50d0C78B2DE11264 + XT deployed at: 0x8b596614c9ac30bd9DF615c3C18F0f05a97F0779 + GT deployed at: 0xBA03824B38E83B7CBAF3Fcb5aF02EF8342A110d8 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@02APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x69E1A695Ee24e7BcFc55d2dA7DfD479E4C7Eb6A3 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0xc7d5476d361C8d0E5c0478EA320431AD4a49A558 + XT deployed at: 0xe1710D5449241ce311Bfcefb5272594ECD930ec0 + GT deployed at: 0x4B87E9281de9573f2025565E632bdb8F136766E5 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@02APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0x9dA149D4Bc9eF4e6Eb1D131E837270f76dc62e79 + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD667a61e822564e1399f73196c73B2C41bCBda69 + XT deployed at: 0x2348B91F2037799d6AE604D792101534461DB06E + GT deployed at: 0x1aE5482Db2883e1ae8CDBFDbaE95539266F1bF32 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@02APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0x9cde69Ea28c9125060F86eB982305BafaE57f585 + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x4bDD2b0f934EECCE01A8Fc47E3762Ce86C9D061F + XT deployed at: 0x63B96518024b49C8F16104fDFd9d94a79A3d185C + GT deployed at: 0xa78bE568bc5ec42C8E41734dADcb86D3dde73af3 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@02APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x565656a354F6C2953EB2D00DC7e2e0Ab815e19E7 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x1184866Ed937F4605efc100c1f18E028F7CBDD86 + XT deployed at: 0x3F56b53953adf3a65f5Bb8E8Dce1C4926e1D629c + GT deployed at: 0x315f180e74247E01ca0377244Eb6b6D1c7444452 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@02APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x0ed76A80D639E7Bf88524b63429bB841c1633E60 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD4771df4a0f6338f521512A1651D8DB7EF5Af633 + XT deployed at: 0x4bbc10317e5b70B6B491836F5B2b496EE35f5E31 + GT deployed at: 0xFF601c3788236F231a8771cACBbB3087D0Ee7A2c + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@02APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x8c07c10a0a3530a9fB64c65f109A32F7B4b2DB80 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x0469A60F8fbc0c35c4D1D965a50A6Bd29c9dAB8C + XT deployed at: 0xE292927A017d58823957A83ea5EFeAF9C37D6F94 + GT deployed at: 0x7AdE4961Fccba087E8b4De84E8be61098Daf0230 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@02APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 5.079885262 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.087924645429718704 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x4a20ddeb8696b1f542649626889522068cc19438, 0x00b210a7f79653a0fe7e2bc31d6fe3026421195d, 0x465c30b940e792262ef65b7fe7a5bad3b5b7f034, 0xca3f986978adef5aa8e4f9e4f3d27f6f4eb3f47d, 0xc8c3a49b64db371f96edc15941e043966297ea6b, 0x19632ff799ba54b54934b52a89964f6cb12d396f, 0xe459c64a852df70ea7d0cc46142a1a0d8bcd4f2a, 0x9cea72e4c7fd1dd0bb2d0aaf98d756b1f85e096d, 0x54acdb3da45bbdeb1a53e1e3f6db51c8384c7f9c, 0x3ebabb95e4276dd2850666a95037f5ee3bb798bb, 0xb7d4329b11dff286890f4d7e5b10763e09e8804c, 0x28c108fd44b2e58dd9b07cbe453c0bcf836b8cb7, 0xf2f9b0fdd5d22e574421a7ee0e29e410e63c70a9, 0x594db033ade81e0c8182b66d2b07fbc97452d1fa, 0x544786112d542910634109bccef84c3deb1b65e0, 0x81cac518b14b28570c667a143f801bf2e05b6bee, 0x10acd317ebf3f65e30c72720d89c55b7c68a9628, 0xa03710f73585cb5458f43739624611633bf24173, 0x80525c75690102bb024bced8be81d18a56172ec0, 0xe2e5403923b0421fa5a9d28c1012aeaffc820f02, 0x49913b7bd178e21fac84c3ded810ff4ccdcb8403, 0x8cde48e20b5d77c3ec0fbcbf50d0c78b2de11264, 0x8b596614c9ac30bd9df615c3c18f0f05a97f0779, 0xba03824b38e83b7cbaf3fcb5af02ef8342a110d8, 0x69e1a695ee24e7bcfc55d2da7dfd479e4c7eb6a3, 0xc7d5476d361c8d0e5c0478ea320431ad4a49a558, 0xe1710d5449241ce311bfcefb5272594ecd930ec0, 0x4b87e9281de9573f2025565e632bdb8f136766e5, 0x9da149d4bc9ef4e6eb1d131e837270f76dc62e79, 0xd667a61e822564e1399f73196c73b2c41bcbda69, 0x2348b91f2037799d6ae604d792101534461db06e, 0x1ae5482db2883e1ae8cdbfdbae95539266f1bf32, 0x9cde69ea28c9125060f86eb982305bafae57f585, 0x4bdd2b0f934eecce01a8fc47e3762ce86c9d061f, 0x63b96518024b49c8f16104fdfd9d94a79a3d185c, 0xa78be568bc5ec42c8e41734dadcb86d3dde73af3, 0x565656a354f6c2953eb2d00dc7e2e0ab815e19e7, 0x1184866ed937f4605efc100c1f18e028f7cbdd86, 0x3f56b53953adf3a65f5bb8e8dce1c4926e1d629c, 0x315f180e74247e01ca0377244eb6b6d1c7444452, 0x0ed76a80d639e7bf88524b63429bb841c1633e60, 0xd4771df4a0f6338f521512a1651d8db7ef5af633, 0x4bbc10317e5b70b6b491836f5b2b496ee35f5e31, 0xff601c3788236f231a8771cacbbb3087d0ee7a2c, 0x8c07c10a0a3530a9fb64c65f109a32f7b4b2db80, 0x0469a60f8fbc0c35c4d1d965a50a6bd29c9dab8c, 0xe292927a017d58823957a83ea5efeaf9c37d6f94, 0x7ade4961fccba087e8b4de84e8be61098daf0230]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-access-manager.json b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-access-manager.json new file mode 100644 index 0000000..a1a5b6a --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743155675", + "gitBranch": "deploy/v1.0.5", + "gitCommitHash": "0x0x65c418860c22aecb27054e7a8c3207a4f87ad6af", + "blockInfo": { + "number": "22144647", + "timestamp": "1743155675" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-core.json b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-core.json new file mode 100644 index 0000000..34b5474 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743518639", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x30f0c30e4edf518e2bf6700837dad2a7624d35df", + "blockInfo": { + "number": "22174730", + "timestamp": "1743518639" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x37Ba9934aAbA7a49cC29d0952C6a91d7c7043dbc", + "vaultFactory": "0x01D8C1e0584751085a876892151Bf8490e862E3E", + "oracleAggregator": "0xE3a31690392E8E18DC3d862651C079339E2c1ADE", + "router": "0xC47591F5c023e44931c78D5A993834875b79FB11", + "swapAdapter": { + "uniswapV3Adapter": "0x34F7b52b0d33959C8351eF95F3523C89b6123C0b", + "odosV2Adapter": "0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779", + "pendleSwapV3Adapter": "0x0B30251FA697A39Fd41813b267b50F03414E82da", + "ERC4626VaultAdapter": "0x85ce30537c14EFB66B673f284bEa7c28351244F6" + }, + "marketViewer": "0x74Dfb95Ae623123ecf82Ba841985fB460bB9d45D" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@12APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@12APR2025.json new file mode 100644 index 0000000..ec501e6 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243149", + "timestamp": "1744343819" + }, + "market": "0x22F537697aD1f9aC2F39088ab93eA8065F2c5356", + "collateral": { + "address": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "symbol": "PT-sUSDE-29MAY2025", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xCB655D961B4e45BC0291d9C670AeCEbBdB6dFAdd", + "xt": "0x84e19bfAfd150F18Ae837ecFD94732a7d4D1dBd1", + "gt": "0xF76a0d8f59a150b72D5A424b1bAC8148376263A2" + }, + "config": { + "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-USDC-USUALUSDC+@12APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-USDC-USUALUSDC+@12APR2025.json new file mode 100644 index 0000000..485de46 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-USDC-USUALUSDC+@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243149", + "timestamp": "1744343819" + }, + "market": "0xBC3fd25F73b978713d4E3C022c9e7D01d0892F50", + "collateral": { + "address": "0xd63070114470f685b75B74D60EEc7c1113d33a3D", + "symbol": "USUALUSDC+", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x0dBB260439216921fae35Cd67dF242ceec97c49c", + "xt": "0x51eb734ACBd2228b50865766618f34e2191bB12E", + "gt": "0x12D869A3dF8F9A3b34a3f6C0A4F103514218fb03" + }, + "config": { + "marketSymbol": "USDC/USUALUSDC+@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-USDC-WBTC@12APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-USDC-WBTC@12APR2025.json new file mode 100644 index 0000000..d6c4cec --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-USDC-WBTC@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243149", + "timestamp": "1744343819" + }, + "market": "0x6759B1180929d206ac12799618c1CCA45ADF8db8", + "collateral": { + "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "symbol": "WBTC", + "priceFeed": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x41BE708b3D3a703e5ec77902aCCD02eb08623E5d", + "xt": "0x272f39b3170625E5e375749c3fE2ae61c6E615C7", + "gt": "0x2bbe92918e372568b675a1D4477e4b264702a48A" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-USDC-cbBTC@12APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-USDC-cbBTC@12APR2025.json new file mode 100644 index 0000000..bfe6f95 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-USDC-cbBTC@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243149", + "timestamp": "1744343819" + }, + "market": "0xbDbB23aE4cfF68188d2c092253775CbBf19aA24C", + "collateral": { + "address": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", + "symbol": "cbBTC", + "priceFeed": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x1019D260A295Ca4d57e06276F6F0e8D5Efa87a6a", + "xt": "0x85a195400f0088e283e226348934Bc88b2fb9F15", + "gt": "0x0abCc3841C7f33C1ff2d8f339cAd4BD56B17C7F2" + }, + "config": { + "marketSymbol": "USDC/cbBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-USDC-eUSDe@12APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-USDC-eUSDe@12APR2025.json new file mode 100644 index 0000000..16715ed --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-USDC-eUSDe@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243149", + "timestamp": "1744343819" + }, + "market": "0xd53684d38a5B199A149CA39AFc48305669a0962f", + "collateral": { + "address": "0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F", + "symbol": "eUSDe", + "priceFeed": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x7566577F31751E0370B63bdDe1955F254fc87e25", + "xt": "0xc386d5D3046fe8B6CEE581f25D1b9787a5F66206", + "gt": "0x681Cfb9159a59407E18362A4fb798040788c1c74" + }, + "config": { + "marketSymbol": "USDC/eUSDe@29MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-USDC-sUSDe@12APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-USDC-sUSDe@12APR2025.json new file mode 100644 index 0000000..69aa055 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-USDC-sUSDe@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243149", + "timestamp": "1744343819" + }, + "market": "0x36b473202bFB68bE0C40d4497679050554fC2f51", + "collateral": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xd3722A7b5d8e639FF194682075329E9aeC4feA25", + "xt": "0xDcEb3ab4E74872787cD0db3c9aFaAb82342ca6F7", + "gt": "0x1A997891D2d8ff180C00f0A0b2Df3F039bb1809d" + }, + "config": { + "marketSymbol": "USDC/sUSDe@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-USDC-wstETH@12APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-USDC-wstETH@12APR2025.json new file mode 100644 index 0000000..81e9370 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-USDC-wstETH@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243149", + "timestamp": "1744343819" + }, + "market": "0xd264fD9ED7094B2aA52a43D939B90F645FAf3269", + "collateral": { + "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x0FeadBc171bc18d6e9933d91D29d5567506C777D", + "xt": "0x496fF4f33f202c990a210560D5d88EdE70295D3C", + "gt": "0xc89d1a74b072Ed2053EbDf3066202e0E2D74aAFA" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-WETH-MCwETH@12APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-WETH-MCwETH@12APR2025.json new file mode 100644 index 0000000..b008791 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-WETH-MCwETH@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243149", + "timestamp": "1744343819" + }, + "market": "0x163a6068FCcbE407CbbF640C40374a08f67DDb61", + "collateral": { + "address": "0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8", + "symbol": "MCwETH", + "priceFeed": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x94afEf173240ae59d815eC3A0a52b10d2B7DB082", + "xt": "0x0E5f7DC2198d67A604c1dee32acA4c6ED3eF20a9", + "gt": "0x336DF173ef7e32b5A974D2698640A590c42F1450" + }, + "config": { + "marketSymbol": "WETH/MCwETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-WETH-gtWETH@12APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-WETH-gtWETH@12APR2025.json new file mode 100644 index 0000000..4ef2f27 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-WETH-gtWETH@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243149", + "timestamp": "1744343819" + }, + "market": "0x87BBB0E5CC1b923269e922C70b4027D5E5116D41", + "collateral": { + "address": "0x2371e134e3455e0593363cBF89d3b6cf53740618", + "symbol": "gtWETH", + "priceFeed": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x9d74ED435C6fCc77722A7C46888d31B8792d2d80", + "xt": "0x3DD6A7b04e03b01D3AB359218B26acCFBd1F29c4", + "gt": "0x9432Bf8a0a8D81c5902FB7b6a294c3B31Cc5c061" + }, + "config": { + "marketSymbol": "WETH/gtWETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-WETH-pufETH@12APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-WETH-pufETH@12APR2025.json new file mode 100644 index 0000000..550f035 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-WETH-pufETH@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243149", + "timestamp": "1744343819" + }, + "market": "0xA461955e9ccBE5f7F76019BfbBE171FeF2E2E65a", + "collateral": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xE6e92DD4a8bcB99F2F2d7948eAb833132718D352", + "xt": "0xa189c5194c97AbEFAB262C4047308C9009d347Ad", + "gt": "0x2f2b74Fbe6b68c348F8cdF0C116036F31EbFA13c" + }, + "config": { + "marketSymbol": "WETH/pufETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-WETH-weETH@12APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-WETH-weETH@12APR2025.json new file mode 100644 index 0000000..e49793f --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-WETH-weETH@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243149", + "timestamp": "1744343819" + }, + "market": "0x206B965b0201C9db8cbF360801A822E56FCd7DBd", + "collateral": { + "address": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "21600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x1a32fa2B60fb913e14a4Dd71eE9a2B5B3CaA330c", + "xt": "0x1B890F505442b7dDFbEa43C3fe1f18fD73Ce64ca", + "gt": "0xEeFDcF4dD432E57D33b77CEaB6A398C00018Bf34" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@12APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@12APR2025.json new file mode 100644 index 0000000..2f409fd --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@12APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243149", + "timestamp": "1744343819" + }, + "market": "0x4CF733d2BC4a56Bd0b16bfA32537Cc6BE2c3D4AF", + "collateral": { + "address": "0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D", + "symbol": "PT-pufETH-26JUN2025", + "priceFeed": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xeE5Ec32Ab26037E51c1D539533bc6B4F261EA57C", + "xt": "0x96635e1Ef5F9ECe88b77883C892EFef72779D0b1", + "gt": "0x956caE1907F5Fefe2C46dbF06Ab80a9B3748b5f9" + }, + "config": { + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "12APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-vault-TMX-USDC.json b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-vault-TMX-USDC.json new file mode 100644 index 0000000..56904bc --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-vault-TMX-USDC.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22232838", + "timestamp": "1744219655" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TMX-USDC", + "address": "0x984408C88a9B042BF3e2ddf921Cd1fAFB4b735D1", + "asset": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "performanceFeeRate": 0, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-vault-TMX-WETH.json b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-vault-TMX-WETH.json new file mode 100644 index 0000000..c096a93 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-vault-TMX-WETH.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22232798", + "timestamp": "1744219175" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TMX-WETH", + "address": "0xDEB8a9C0546A01b7e5CeE8e44Fd0C8D8B96a1f6e", + "asset": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "performanceFeeRate": 0, + "maxCapacity": "5000000000000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-vault-Weiting USDC Vault.json b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-vault-Weiting USDC Vault.json new file mode 100644 index 0000000..31301e4 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250412-2000/eth-mainnet-vault-Weiting USDC Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xb07dca68abfa0915501a9f9b5e5f8ae686c02d95" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22215681", + "timestamp": "1744012679" + }, + "vaultInfo": { + "name": "Weiting USDC Vault", + "symbol": "Weiting USDC Vault", + "address": "0x5C16d84e998c661D9F6C7Cc23e1144E4b7f39759", + "asset": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "performanceFeeRate": 10000000, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x1c59f7A0AA3f01DDACd17c0EF7Bc00c3D18feD0A", + "guardian": "0x1c59f7A0AA3f01DDACd17c0EF7Bc00c3D18feD0A", + "allocator": "0x1c59f7A0AA3f01DDACd17c0EF7Bc00c3D18feD0A" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-1500/deploy-eth-mainnet-oracle-aggregator-0401-log.txt b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/deploy-eth-mainnet-oracle-aggregator-0401-log.txt new file mode 100644 index 0000000..81ca312 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/deploy-eth-mainnet-oracle-aggregator-0401-log.txt @@ -0,0 +1,21 @@ +== Logs == + Network: eth-mainnet + Deployer balance: 158879257545733090 + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175070 + Block timestamp: 1743522719 + + ===== Oracle Aggregator Info ===== + Deployer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Admin: 0x8409a9C1A911CED491892c5694E43994c9d47E8f + Oracle Aggregator deployed at: 0xE3a31690392E8E18DC3d862651C079339E2c1ADE + Oracle Timelock: 43200 + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-1500/deploy-eth-markets-test-20250413-1500-log.txt b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/deploy-eth-markets-test-20250413-1500-log.txt new file mode 100644 index 0000000..ed0fac4 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/deploy-eth-markets-test-20250413-1500-log.txt @@ -0,0 +1,368 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ETHERSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xbca66c3c7c82ed859143ed822fee071f5be097df + + ===== Block Info ===== + Block number: 22243196 + Block timestamp: 1744344383 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22243196 + + ===== Market Info - 0 ===== + Market deployed at: 0x177D9c755C474e19bc35cf42E57E2a857C6ae166 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0xfF3FFb56FB65a65e41e9DA5ddc8b5C1805d37A14 + XT deployed at: 0x505C69BEaFeC61B32269621d16fEe3e3D6CA4A66 + GT deployed at: 0xC431dB076237A542d11e9dBE76623d4232D37BBF + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@13APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0x91c83bc9BBCB5AA22121e0F7Fb5C9E56c80A2E4D + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x514436CC23f153f07e2bF38c96fF7ffA3ce9Da26 + XT deployed at: 0x911a0f5c1DC90e000CC2219C28EC24bE11c9bc2B + GT deployed at: 0xe2fB0AC0e75e93E82D9432Ea5EB7DF5b9870833D + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@13APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0xbA17d51cC68317A17EdE461D3a6e5545067AbF92 + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xfF49D0377B2Fbd015C33Bd70C76EB82D44019A31 + XT deployed at: 0x4Ed14F7724fcD1281873E43CEcAbCC46502e8DD7 + GT deployed at: 0x98901d84688F3987A3A6aB136a96fb98bcaC360D + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@13APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0x32Deef77d205889FAD1715E48d2A2f5293974EB8 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x0C3A4c6CA30711A9A2F0B2E19bc9Ed48B8D46fBE + XT deployed at: 0xca6601f22c29af175E7792a1b32F4577670d4ab6 + GT deployed at: 0x9536f0b339A51B80eA8157DE5499350F9E4F8235 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@13APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0xE9Bd653ff5A333cDc9685f3Ee1FF8529881E6116 + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x519A04e23135bc8cCAfA00AA041369D1a2eeaa7D + XT deployed at: 0xF80EAdc98B7237Aa7d994fb2aDcc5D83D8C6bC2D + GT deployed at: 0x4c9490f8E3b653EbEc938842B5DAdD4c5a0aEc00 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@13APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0xD6148DBB8664E0801cC7A14a0Dc3238bA6cC0b87 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0xad8a54dD460E7ef9FDB641337182b1821FAC424B + XT deployed at: 0xE7a5FDc611B02C5D1A424aaeD96daE168b20bC8c + GT deployed at: 0x0ae08CA900A124025F7485b87340a45F01B2727C + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@13APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0xbaC160DCC2bDe67D4A3Ac363946EA7ed43eBF48a + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0x1fD3604E7FE6266eE79969Aca1F24b5Ed7EEa1eF + XT deployed at: 0x496008DD5242E107Df1749f3A724d9287484DD71 + GT deployed at: 0xC433Fa7ACb1170145ffF4A0De4d17C0edBe9b523 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@13APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0xA06723A966B41824316976EdfA9Bb518CA4159c7 + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xb8a815134E82F0875394Fa64eba24359FC91E637 + XT deployed at: 0xf90D85D9C7670b3fE0Ab57C56aEAa131C0cFCb7e + GT deployed at: 0x542e59a3887885dFb0E2bBaaaA253ADf643988F5 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@13APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0x74A93faA07E343E40b956e300865F04b0FDD5A3b + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0xfcf9F40Ea4b83507d0f650b519CBc947f79bb171 + XT deployed at: 0x7a205421ABFb630e5eE70df3CDC37d9f7522CcF4 + GT deployed at: 0x8E8589D6BffC0e404a0c8fa8cF811d204452c7D2 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@13APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x099d361cAa0CF3C2198447fBB16301E1D8cc4d66 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x3ce6DA32f8667aF6abDF21eDeCD8bB83f5479C9B + XT deployed at: 0x01189027b5cdE5f50c3eF17860644390787eE94c + GT deployed at: 0x318Bf410525d79656AD8078cb44F95e456d94CAc + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@13APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x5ebaEd480A6C753691B56891a90950001E330eC1 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x653956361C81684B850A6B1C91D6ad29392401d5 + XT deployed at: 0x03D2Dd64c045ba9D7F39bF6dbE25BDe80e7C1874 + GT deployed at: 0xd293d1B9af776CA6459B947972d4FeC9031Ac749 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@13APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x528698fB9fAb2d0C17DFa0d2461582BEa0dDf3d5 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0xc6FF8f6AC083b12D62F299BeAf7e3D4580D2Cc9a + XT deployed at: 0x494F799553ca86FA5Dbad217C97a59f06EA80Db7 + GT deployed at: 0x887F16BedFE1EF55610Fc06ddBd0eF2b61794849 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@13APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 1.019497839 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.017645868240564888 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x177d9c755c474e19bc35cf42e57e2a857c6ae166, 0xff3ffb56fb65a65e41e9da5ddc8b5c1805d37a14, 0x505c69beafec61b32269621d16fee3e3d6ca4a66, 0xc431db076237a542d11e9dbe76623d4232d37bbf, 0x91c83bc9bbcb5aa22121e0f7fb5c9e56c80a2e4d, 0x514436cc23f153f07e2bf38c96ff7ffa3ce9da26, 0x911a0f5c1dc90e000cc2219c28ec24be11c9bc2b, 0xe2fb0ac0e75e93e82d9432ea5eb7df5b9870833d, 0xba17d51cc68317a17ede461d3a6e5545067abf92, 0xff49d0377b2fbd015c33bd70c76eb82d44019a31, 0x4ed14f7724fcd1281873e43cecabcc46502e8dd7, 0x98901d84688f3987a3a6ab136a96fb98bcac360d, 0x32deef77d205889fad1715e48d2a2f5293974eb8, 0x0c3a4c6ca30711a9a2f0b2e19bc9ed48b8d46fbe, 0xca6601f22c29af175e7792a1b32f4577670d4ab6, 0x9536f0b339a51b80ea8157de5499350f9e4f8235, 0xe9bd653ff5a333cdc9685f3ee1ff8529881e6116, 0x519a04e23135bc8ccafa00aa041369d1a2eeaa7d, 0xf80eadc98b7237aa7d994fb2adcc5d83d8c6bc2d, 0x4c9490f8e3b653ebec938842b5dadd4c5a0aec00, 0xd6148dbb8664e0801cc7a14a0dc3238ba6cc0b87, 0xad8a54dd460e7ef9fdb641337182b1821fac424b, 0xe7a5fdc611b02c5d1a424aaed96dae168b20bc8c, 0x0ae08ca900a124025f7485b87340a45f01b2727c, 0xbac160dcc2bde67d4a3ac363946ea7ed43ebf48a, 0x1fd3604e7fe6266ee79969aca1f24b5ed7eea1ef, 0x496008dd5242e107df1749f3a724d9287484dd71, 0xc433fa7acb1170145fff4a0de4d17c0edbe9b523, 0xa06723a966b41824316976edfa9bb518ca4159c7, 0xb8a815134e82f0875394fa64eba24359fc91e637, 0xf90d85d9c7670b3fe0ab57c56aeaa131c0cfcb7e, 0x542e59a3887885dfb0e2bbaaaa253adf643988f5, 0x74a93faa07e343e40b956e300865f04b0fdd5a3b, 0xfcf9f40ea4b83507d0f650b519cbc947f79bb171, 0x7a205421abfb630e5ee70df3cdc37d9f7522ccf4, 0x8e8589d6bffc0e404a0c8fa8cf811d204452c7d2, 0x099d361caa0cf3c2198447fbb16301e1d8cc4d66, 0x3ce6da32f8667af6abdf21edecd8bb83f5479c9b, 0x01189027b5cde5f50c3ef17860644390787ee94c, 0x318bf410525d79656ad8078cb44f95e456d94cac, 0x5ebaed480a6c753691b56891a90950001e330ec1, 0x653956361c81684b850a6b1c91d6ad29392401d5, 0x03d2dd64c045ba9d7f39bf6dbe25bde80e7c1874, 0xd293d1b9af776ca6459b947972d4fec9031ac749, 0x528698fb9fab2d0c17dfa0d2461582bea0ddf3d5, 0xc6ff8f6ac083b12d62f299beaf7e3d4580d2cc9a, 0x494f799553ca86fa5dbad217c97a59f06ea80db7, 0x887f16bedfe1ef55610fc06ddbd0ef2b61794849]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-1500/deploy_markets_test_0402_log.txt b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/deploy_markets_test_0402_log.txt new file mode 100644 index 0000000..236c256 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/deploy_markets_test_0402_log.txt @@ -0,0 +1,370 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Enabled--verify +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175185 + Block timestamp: 1743524099 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22175185 + + ===== Market Info - 0 ===== + Market deployed at: 0x4a20DdEB8696b1f542649626889522068cc19438 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x00B210A7f79653A0fe7e2bc31d6Fe3026421195d + XT deployed at: 0x465c30b940E792262Ef65B7Fe7A5bAd3b5b7f034 + GT deployed at: 0xca3F986978ADEf5aA8e4F9e4F3d27f6f4Eb3f47d + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@02APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xC8c3A49b64dB371F96EdC15941e043966297Ea6b + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x19632ff799BA54B54934b52a89964F6cb12D396f + XT deployed at: 0xe459c64a852Df70Ea7D0cc46142A1a0d8BCd4f2A + GT deployed at: 0x9CEA72e4C7Fd1dd0bb2D0AAF98D756B1f85e096D + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@02APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x54ACdb3da45bBDEb1a53e1E3F6DB51C8384c7F9c + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x3ebabb95e4276DD2850666a95037f5EE3bb798Bb + XT deployed at: 0xb7d4329b11Dff286890F4d7e5b10763E09E8804C + GT deployed at: 0x28C108FD44B2E58DD9B07CBE453c0BCF836b8CB7 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@02APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xf2F9b0fDD5D22e574421A7Ee0E29e410E63C70A9 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x594Db033Ade81E0C8182B66d2B07fbc97452d1FA + XT deployed at: 0x544786112d542910634109BcCEF84C3Deb1b65e0 + GT deployed at: 0x81CAc518B14B28570C667A143F801bF2e05b6BEe + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@02APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x10aCD317ebf3F65e30c72720D89c55B7C68a9628 + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xA03710F73585cb5458F43739624611633Bf24173 + XT deployed at: 0x80525c75690102bb024BcEd8bE81D18A56172EC0 + GT deployed at: 0xe2e5403923B0421FA5a9D28c1012aeAFfc820f02 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@02APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x49913B7Bd178e21FaC84C3dED810Ff4CcDcb8403 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x8CDe48E20b5d77C3ec0fbCbf50d0C78B2DE11264 + XT deployed at: 0x8b596614c9ac30bd9DF615c3C18F0f05a97F0779 + GT deployed at: 0xBA03824B38E83B7CBAF3Fcb5aF02EF8342A110d8 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@02APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x69E1A695Ee24e7BcFc55d2dA7DfD479E4C7Eb6A3 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0xc7d5476d361C8d0E5c0478EA320431AD4a49A558 + XT deployed at: 0xe1710D5449241ce311Bfcefb5272594ECD930ec0 + GT deployed at: 0x4B87E9281de9573f2025565E632bdb8F136766E5 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@02APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0x9dA149D4Bc9eF4e6Eb1D131E837270f76dc62e79 + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD667a61e822564e1399f73196c73B2C41bCBda69 + XT deployed at: 0x2348B91F2037799d6AE604D792101534461DB06E + GT deployed at: 0x1aE5482Db2883e1ae8CDBFDbaE95539266F1bF32 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@02APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0x9cde69Ea28c9125060F86eB982305BafaE57f585 + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x4bDD2b0f934EECCE01A8Fc47E3762Ce86C9D061F + XT deployed at: 0x63B96518024b49C8F16104fDFd9d94a79A3d185C + GT deployed at: 0xa78bE568bc5ec42C8E41734dADcb86D3dde73af3 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@02APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x565656a354F6C2953EB2D00DC7e2e0Ab815e19E7 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x1184866Ed937F4605efc100c1f18E028F7CBDD86 + XT deployed at: 0x3F56b53953adf3a65f5Bb8E8Dce1C4926e1D629c + GT deployed at: 0x315f180e74247E01ca0377244Eb6b6D1c7444452 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@02APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x0ed76A80D639E7Bf88524b63429bB841c1633E60 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD4771df4a0f6338f521512A1651D8DB7EF5Af633 + XT deployed at: 0x4bbc10317e5b70B6B491836F5B2b496EE35f5E31 + GT deployed at: 0xFF601c3788236F231a8771cACBbB3087D0Ee7A2c + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@02APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x8c07c10a0a3530a9fB64c65f109A32F7B4b2DB80 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x0469A60F8fbc0c35c4D1D965a50A6Bd29c9dAB8C + XT deployed at: 0xE292927A017d58823957A83ea5EFeAF9C37D6F94 + GT deployed at: 0x7AdE4961Fccba087E8b4De84E8be61098Daf0230 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@02APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 5.079885262 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.087924645429718704 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x4a20ddeb8696b1f542649626889522068cc19438, 0x00b210a7f79653a0fe7e2bc31d6fe3026421195d, 0x465c30b940e792262ef65b7fe7a5bad3b5b7f034, 0xca3f986978adef5aa8e4f9e4f3d27f6f4eb3f47d, 0xc8c3a49b64db371f96edc15941e043966297ea6b, 0x19632ff799ba54b54934b52a89964f6cb12d396f, 0xe459c64a852df70ea7d0cc46142a1a0d8bcd4f2a, 0x9cea72e4c7fd1dd0bb2d0aaf98d756b1f85e096d, 0x54acdb3da45bbdeb1a53e1e3f6db51c8384c7f9c, 0x3ebabb95e4276dd2850666a95037f5ee3bb798bb, 0xb7d4329b11dff286890f4d7e5b10763e09e8804c, 0x28c108fd44b2e58dd9b07cbe453c0bcf836b8cb7, 0xf2f9b0fdd5d22e574421a7ee0e29e410e63c70a9, 0x594db033ade81e0c8182b66d2b07fbc97452d1fa, 0x544786112d542910634109bccef84c3deb1b65e0, 0x81cac518b14b28570c667a143f801bf2e05b6bee, 0x10acd317ebf3f65e30c72720d89c55b7c68a9628, 0xa03710f73585cb5458f43739624611633bf24173, 0x80525c75690102bb024bced8be81d18a56172ec0, 0xe2e5403923b0421fa5a9d28c1012aeaffc820f02, 0x49913b7bd178e21fac84c3ded810ff4ccdcb8403, 0x8cde48e20b5d77c3ec0fbcbf50d0c78b2de11264, 0x8b596614c9ac30bd9df615c3c18f0f05a97f0779, 0xba03824b38e83b7cbaf3fcb5af02ef8342a110d8, 0x69e1a695ee24e7bcfc55d2da7dfd479e4c7eb6a3, 0xc7d5476d361c8d0e5c0478ea320431ad4a49a558, 0xe1710d5449241ce311bfcefb5272594ecd930ec0, 0x4b87e9281de9573f2025565e632bdb8f136766e5, 0x9da149d4bc9ef4e6eb1d131e837270f76dc62e79, 0xd667a61e822564e1399f73196c73b2c41bcbda69, 0x2348b91f2037799d6ae604d792101534461db06e, 0x1ae5482db2883e1ae8cdbfdbae95539266f1bf32, 0x9cde69ea28c9125060f86eb982305bafae57f585, 0x4bdd2b0f934eecce01a8fc47e3762ce86c9d061f, 0x63b96518024b49c8f16104fdfd9d94a79a3d185c, 0xa78be568bc5ec42c8e41734dadcb86d3dde73af3, 0x565656a354f6c2953eb2d00dc7e2e0ab815e19e7, 0x1184866ed937f4605efc100c1f18e028f7cbdd86, 0x3f56b53953adf3a65f5bb8e8dce1c4926e1d629c, 0x315f180e74247e01ca0377244eb6b6d1c7444452, 0x0ed76a80d639e7bf88524b63429bb841c1633e60, 0xd4771df4a0f6338f521512a1651d8db7ef5af633, 0x4bbc10317e5b70b6b491836f5b2b496ee35f5e31, 0xff601c3788236f231a8771cacbbb3087d0ee7a2c, 0x8c07c10a0a3530a9fb64c65f109a32f7b4b2db80, 0x0469a60f8fbc0c35c4d1d965a50a6bd29c9dab8c, 0xe292927a017d58823957a83ea5efeaf9c37d6f94, 0x7ade4961fccba087e8b4de84e8be61098daf0230]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-access-manager.json b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-access-manager.json new file mode 100644 index 0000000..a1a5b6a --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743155675", + "gitBranch": "deploy/v1.0.5", + "gitCommitHash": "0x0x65c418860c22aecb27054e7a8c3207a4f87ad6af", + "blockInfo": { + "number": "22144647", + "timestamp": "1743155675" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-core.json b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-core.json new file mode 100644 index 0000000..34b5474 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743518639", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x30f0c30e4edf518e2bf6700837dad2a7624d35df", + "blockInfo": { + "number": "22174730", + "timestamp": "1743518639" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x37Ba9934aAbA7a49cC29d0952C6a91d7c7043dbc", + "vaultFactory": "0x01D8C1e0584751085a876892151Bf8490e862E3E", + "oracleAggregator": "0xE3a31690392E8E18DC3d862651C079339E2c1ADE", + "router": "0xC47591F5c023e44931c78D5A993834875b79FB11", + "swapAdapter": { + "uniswapV3Adapter": "0x34F7b52b0d33959C8351eF95F3523C89b6123C0b", + "odosV2Adapter": "0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779", + "pendleSwapV3Adapter": "0x0B30251FA697A39Fd41813b267b50F03414E82da", + "ERC4626VaultAdapter": "0x85ce30537c14EFB66B673f284bEa7c28351244F6" + }, + "marketViewer": "0x74Dfb95Ae623123ecf82Ba841985fB460bB9d45D" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@13APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@13APR2025.json new file mode 100644 index 0000000..b4ae63d --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243196", + "timestamp": "1744344383" + }, + "market": "0x32Deef77d205889FAD1715E48d2A2f5293974EB8", + "collateral": { + "address": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "symbol": "PT-sUSDE-29MAY2025", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x0C3A4c6CA30711A9A2F0B2E19bc9Ed48B8D46fBE", + "xt": "0xca6601f22c29af175E7792a1b32F4577670d4ab6", + "gt": "0x9536f0b339A51B80eA8157DE5499350F9E4F8235" + }, + "config": { + "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-USDC-USUALUSDC+@13APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-USDC-USUALUSDC+@13APR2025.json new file mode 100644 index 0000000..44208f2 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-USDC-USUALUSDC+@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243196", + "timestamp": "1744344383" + }, + "market": "0xE9Bd653ff5A333cDc9685f3Ee1FF8529881E6116", + "collateral": { + "address": "0xd63070114470f685b75B74D60EEc7c1113d33a3D", + "symbol": "USUALUSDC+", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x519A04e23135bc8cCAfA00AA041369D1a2eeaa7D", + "xt": "0xF80EAdc98B7237Aa7d994fb2aDcc5D83D8C6bC2D", + "gt": "0x4c9490f8E3b653EbEc938842B5DAdD4c5a0aEc00" + }, + "config": { + "marketSymbol": "USDC/USUALUSDC+@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-USDC-WBTC@13APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-USDC-WBTC@13APR2025.json new file mode 100644 index 0000000..322e01e --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-USDC-WBTC@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243196", + "timestamp": "1744344383" + }, + "market": "0x099d361cAa0CF3C2198447fBB16301E1D8cc4d66", + "collateral": { + "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "symbol": "WBTC", + "priceFeed": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x3ce6DA32f8667aF6abDF21eDeCD8bB83f5479C9B", + "xt": "0x01189027b5cdE5f50c3eF17860644390787eE94c", + "gt": "0x318Bf410525d79656AD8078cb44F95e456d94CAc" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-USDC-cbBTC@13APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-USDC-cbBTC@13APR2025.json new file mode 100644 index 0000000..52a0368 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-USDC-cbBTC@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243196", + "timestamp": "1744344383" + }, + "market": "0x5ebaEd480A6C753691B56891a90950001E330eC1", + "collateral": { + "address": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", + "symbol": "cbBTC", + "priceFeed": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x653956361C81684B850A6B1C91D6ad29392401d5", + "xt": "0x03D2Dd64c045ba9D7F39bF6dbE25BDe80e7C1874", + "gt": "0xd293d1B9af776CA6459B947972d4FeC9031Ac749" + }, + "config": { + "marketSymbol": "USDC/cbBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-USDC-eUSDe@13APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-USDC-eUSDe@13APR2025.json new file mode 100644 index 0000000..56e9c75 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-USDC-eUSDe@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243196", + "timestamp": "1744344383" + }, + "market": "0xA06723A966B41824316976EdfA9Bb518CA4159c7", + "collateral": { + "address": "0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F", + "symbol": "eUSDe", + "priceFeed": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xb8a815134E82F0875394Fa64eba24359FC91E637", + "xt": "0xf90D85D9C7670b3fE0Ab57C56aEAa131C0cFCb7e", + "gt": "0x542e59a3887885dFb0E2bBaaaA253ADf643988F5" + }, + "config": { + "marketSymbol": "USDC/eUSDe@29MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-USDC-sUSDe@13APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-USDC-sUSDe@13APR2025.json new file mode 100644 index 0000000..25e0804 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-USDC-sUSDe@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243196", + "timestamp": "1744344383" + }, + "market": "0xbA17d51cC68317A17EdE461D3a6e5545067AbF92", + "collateral": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xfF49D0377B2Fbd015C33Bd70C76EB82D44019A31", + "xt": "0x4Ed14F7724fcD1281873E43CEcAbCC46502e8DD7", + "gt": "0x98901d84688F3987A3A6aB136a96fb98bcaC360D" + }, + "config": { + "marketSymbol": "USDC/sUSDe@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-USDC-wstETH@13APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-USDC-wstETH@13APR2025.json new file mode 100644 index 0000000..432019e --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-USDC-wstETH@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243196", + "timestamp": "1744344383" + }, + "market": "0x91c83bc9BBCB5AA22121e0F7Fb5C9E56c80A2E4D", + "collateral": { + "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x514436CC23f153f07e2bF38c96fF7ffA3ce9Da26", + "xt": "0x911a0f5c1DC90e000CC2219C28EC24bE11c9bc2B", + "gt": "0xe2fB0AC0e75e93E82D9432Ea5EB7DF5b9870833D" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-WETH-MCwETH@13APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-WETH-MCwETH@13APR2025.json new file mode 100644 index 0000000..de5091c --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-WETH-MCwETH@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243196", + "timestamp": "1744344383" + }, + "market": "0xD6148DBB8664E0801cC7A14a0Dc3238bA6cC0b87", + "collateral": { + "address": "0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8", + "symbol": "MCwETH", + "priceFeed": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xad8a54dD460E7ef9FDB641337182b1821FAC424B", + "xt": "0xE7a5FDc611B02C5D1A424aaeD96daE168b20bC8c", + "gt": "0x0ae08CA900A124025F7485b87340a45F01B2727C" + }, + "config": { + "marketSymbol": "WETH/MCwETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-WETH-gtWETH@13APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-WETH-gtWETH@13APR2025.json new file mode 100644 index 0000000..80c6770 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-WETH-gtWETH@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243196", + "timestamp": "1744344383" + }, + "market": "0x528698fB9fAb2d0C17DFa0d2461582BEa0dDf3d5", + "collateral": { + "address": "0x2371e134e3455e0593363cBF89d3b6cf53740618", + "symbol": "gtWETH", + "priceFeed": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xc6FF8f6AC083b12D62F299BeAf7e3D4580D2Cc9a", + "xt": "0x494F799553ca86FA5Dbad217C97a59f06EA80Db7", + "gt": "0x887F16BedFE1EF55610Fc06ddBd0eF2b61794849" + }, + "config": { + "marketSymbol": "WETH/gtWETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-WETH-pufETH@13APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-WETH-pufETH@13APR2025.json new file mode 100644 index 0000000..f79c2b2 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-WETH-pufETH@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243196", + "timestamp": "1744344383" + }, + "market": "0x74A93faA07E343E40b956e300865F04b0FDD5A3b", + "collateral": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xfcf9F40Ea4b83507d0f650b519CBc947f79bb171", + "xt": "0x7a205421ABFb630e5eE70df3CDC37d9f7522CcF4", + "gt": "0x8E8589D6BffC0e404a0c8fa8cF811d204452c7D2" + }, + "config": { + "marketSymbol": "WETH/pufETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-WETH-weETH@13APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-WETH-weETH@13APR2025.json new file mode 100644 index 0000000..988d884 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-WETH-weETH@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243196", + "timestamp": "1744344383" + }, + "market": "0x177D9c755C474e19bc35cf42E57E2a857C6ae166", + "collateral": { + "address": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "21600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xfF3FFb56FB65a65e41e9DA5ddc8b5C1805d37A14", + "xt": "0x505C69BEaFeC61B32269621d16fEe3e3D6CA4A66", + "gt": "0xC431dB076237A542d11e9dBE76623d4232D37BBF" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@13APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@13APR2025.json new file mode 100644 index 0000000..ea0ce50 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243196", + "timestamp": "1744344383" + }, + "market": "0xbaC160DCC2bDe67D4A3Ac363946EA7ed43eBF48a", + "collateral": { + "address": "0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D", + "symbol": "PT-pufETH-26JUN2025", + "priceFeed": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x1fD3604E7FE6266eE79969Aca1F24b5Ed7EEa1eF", + "xt": "0x496008DD5242E107Df1749f3A724d9287484DD71", + "gt": "0xC433Fa7ACb1170145ffF4A0De4d17C0edBe9b523" + }, + "config": { + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-vault-TMX-USDC.json b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-vault-TMX-USDC.json new file mode 100644 index 0000000..56904bc --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-vault-TMX-USDC.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22232838", + "timestamp": "1744219655" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TMX-USDC", + "address": "0x984408C88a9B042BF3e2ddf921Cd1fAFB4b735D1", + "asset": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "performanceFeeRate": 0, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-vault-TMX-WETH.json b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-vault-TMX-WETH.json new file mode 100644 index 0000000..c096a93 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-vault-TMX-WETH.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22232798", + "timestamp": "1744219175" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TMX-WETH", + "address": "0xDEB8a9C0546A01b7e5CeE8e44Fd0C8D8B96a1f6e", + "asset": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "performanceFeeRate": 0, + "maxCapacity": "5000000000000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-vault-Weiting USDC Vault.json b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-vault-Weiting USDC Vault.json new file mode 100644 index 0000000..31301e4 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-1500/eth-mainnet-vault-Weiting USDC Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xb07dca68abfa0915501a9f9b5e5f8ae686c02d95" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22215681", + "timestamp": "1744012679" + }, + "vaultInfo": { + "name": "Weiting USDC Vault", + "symbol": "Weiting USDC Vault", + "address": "0x5C16d84e998c661D9F6C7Cc23e1144E4b7f39759", + "asset": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "performanceFeeRate": 10000000, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x1c59f7A0AA3f01DDACd17c0EF7Bc00c3D18feD0A", + "guardian": "0x1c59f7A0AA3f01DDACd17c0EF7Bc00c3D18feD0A", + "allocator": "0x1c59f7A0AA3f01DDACd17c0EF7Bc00c3D18feD0A" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt new file mode 100644 index 0000000..81ca312 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt @@ -0,0 +1,21 @@ +== Logs == + Network: eth-mainnet + Deployer balance: 158879257545733090 + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175070 + Block timestamp: 1743522719 + + ===== Oracle Aggregator Info ===== + Deployer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Admin: 0x8409a9C1A911CED491892c5694E43994c9d47E8f + Oracle Aggregator deployed at: 0xE3a31690392E8E18DC3d862651C079339E2c1ADE + Oracle Timelock: 43200 + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-2000/deploy-eth-markets-test-20250413-2000-log.txt b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/deploy-eth-markets-test-20250413-2000-log.txt new file mode 100644 index 0000000..47285ce --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/deploy-eth-markets-test-20250413-2000-log.txt @@ -0,0 +1,452 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ETHERSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xbca66c3c7c82ed859143ed822fee071f5be097df + + ===== Block Info ===== + Block number: 22243244 + Block timestamp: 1744344959 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22243244 + + ===== Market Info - 0 ===== + Market deployed at: 0x2259f8438e4BD4440867478D8D7cf1BB34b927fe + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0xe007112761B49CA8967470856709aFec79678779 + XT deployed at: 0x5Bb01FB8E42C702C2CA3Ad1B3ca0abcB6504F5d3 + GT deployed at: 0xE48475C8cB73BBed168A7D504f57052C4a37772f + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@13APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0x803e1E969B4aFED1302afF237bBE131cA9D83B19 + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x0620e5a01d979318Eaa56FaeEb56Bedf8FCa198A + XT deployed at: 0x090D77D57c49cADd9ce4C38b3C2d87C190d4b9A2 + GT deployed at: 0xFfB480840205bc1f0bD8F4EcE18200072a86225d + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@13APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0xF27106E6178EB95791ca11162A5F273a5a139D9e + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x8047efD9Eb4412B91F4A8E92340A9EF8334B5459 + XT deployed at: 0x979253D67AfCB30517e1C11ED53e6AA20228E167 + GT deployed at: 0x48dc2f63127D90FC5d76856Ed0d9A2209250AAB5 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@13APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xDCfB75a0F37cee909f7E69E15afbA2bF01345577 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x9A648b27a18D48Be872e74E5c1Ab589E026862B1 + XT deployed at: 0xa64a2101dC13A8C50E82542f52288A1B70FadBD8 + GT deployed at: 0xF22B5302aD24312243798F16570C7fE566C79eF6 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@13APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0xf54eD138E194130aA6ee02919F87d1b6d55c92B0 + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x4B498E6280313821d149F0C6F38602a1D6126412 + XT deployed at: 0x22CfCe5f3CAFF192f69171d83ed9075f77F53bF7 + GT deployed at: 0xfa729265A8A51c6eB0943d8B44565813D42773A9 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@13APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0xeA91bf7EBD1352aD54fb1aaDd05849B2dff5b2c0 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x6CBA68fA687332F3dB063E08115c561D87B42268 + XT deployed at: 0x1548d94c3c59C1a39e0B02689D2844D584676808 + GT deployed at: 0x444D0FB322Eb03Cd7EdC3E5D513B354DB3A4De93 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@13APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x050c7011929b3516AbDCaE9128EdCDD5ebea7090 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0xcC860adF804229576ad7BF4f2978aC51C5c870Cb + XT deployed at: 0xA4a7A631EBD9992DB395682805a16E3dFC00189A + GT deployed at: 0x058a5f599017130E9949040C1d8E9C1a54dD606b + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@13APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0x51d2e305168adF87F814259e2d9f6308fE667f8e + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x9d8fb7415c3cbE9F3ABCA0E67ca08d1f73684712 + XT deployed at: 0x6364bdf3A0833803bA6F357ceD0857B54Be2126B + GT deployed at: 0xe346887540B7447ED9ab279464E10ad12967e9C6 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@13APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0xb0f5CE0D01a0E627728D7864893410d40831C41b + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x3A5545aFDbE7d1A9Db074ADC57790d5629A91BFC + XT deployed at: 0x01121cE872095E548d66422B37a08573b188Eefc + GT deployed at: 0xD0d9D7f690771517756abaf1F12350b2FF9C33E2 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@13APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x3cC1cA355fD16476a38061BE04D7c55557E93dE9 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x3646D895B2C2c6B7974d4D191447b84327fCb8a4 + XT deployed at: 0xfc31ECe6A14ceCdbB243FAD505e154acdf1BB875 + GT deployed at: 0x50d898b7B7367a459565dAF3876f9EbF775e72FE + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@13APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x159867e725D718c7DcaA6e231Bd1497860d6397f + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x6b8fA8809c9a2EBa06c60EC0BeC404579d32cfd0 + XT deployed at: 0x44976616379dEe591c538E6f38B41B9C3EbE575e + GT deployed at: 0x2bAbE2b2A5AA4Ab0AB2F826BB1eD4B603d2EA0AF + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@13APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x1Ac9A6Bf2F569F57E2a823FDF7690e94f089d828 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0xb7dA63AE7f99dbd0dA4500cbDF2b1e90A3026997 + XT deployed at: 0x480615f979996924E122A3a67A5daea4e4c856b1 + GT deployed at: 0xCA2Edd3ee1c62782DDb9AB2Bdc213FC762e6106E + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 13APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@13APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 1.222183026 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.021154022909754192 ETH + +========================== + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[ERROR] market deployment to eth-mainnet failed! +You can resume the failed deployment by running the same command with the --resume option: +./script.sh eth-mainnet deploy:market --broadcast --resume --verify +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Enabled (will resume from last broadcasted transaction) +Verification: Enabled--verify +Using API Key: ETHERSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --resume --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[ERROR] market deployment to eth-mainnet failed! +You can resume the failed deployment by running the same command with the --resume option: +./script.sh eth-mainnet deploy:market --broadcast --resume --verify +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Enabled (will resume from last broadcasted transaction) +Verification: Enabled--verify +Using API Key: ETHERSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --resume --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[ERROR] market deployment to eth-mainnet failed! +You can resume the failed deployment by running the same command with the --resume option: +./script.sh eth-mainnet deploy:market --broadcast --resume --verify +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Enabled (will resume from last broadcasted transaction) +Verification: Enabled--verify +Using API Key: ETHERSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --resume --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x2259f8438e4bd4440867478d8d7cf1bb34b927fe, 0xe007112761b49ca8967470856709afec79678779, 0x5bb01fb8e42c702c2ca3ad1b3ca0abcb6504f5d3, 0xe48475c8cb73bbed168a7d504f57052c4a37772f, 0x803e1e969b4afed1302aff237bbe131ca9d83b19, 0x0620e5a01d979318eaa56faeeb56bedf8fca198a, 0x090d77d57c49cadd9ce4c38b3c2d87c190d4b9a2, 0xffb480840205bc1f0bd8f4ece18200072a86225d, 0xf27106e6178eb95791ca11162a5f273a5a139d9e, 0x8047efd9eb4412b91f4a8e92340a9ef8334b5459, 0x979253d67afcb30517e1c11ed53e6aa20228e167, 0x48dc2f63127d90fc5d76856ed0d9a2209250aab5, 0xdcfb75a0f37cee909f7e69e15afba2bf01345577, 0x9a648b27a18d48be872e74e5c1ab589e026862b1, 0xa64a2101dc13a8c50e82542f52288a1b70fadbd8, 0xf22b5302ad24312243798f16570c7fe566c79ef6, 0xf54ed138e194130aa6ee02919f87d1b6d55c92b0, 0x4b498e6280313821d149f0c6f38602a1d6126412, 0x22cfce5f3caff192f69171d83ed9075f77f53bf7, 0xfa729265a8a51c6eb0943d8b44565813d42773a9, 0xea91bf7ebd1352ad54fb1aadd05849b2dff5b2c0, 0x6cba68fa687332f3db063e08115c561d87b42268, 0x1548d94c3c59c1a39e0b02689d2844d584676808, 0x444d0fb322eb03cd7edc3e5d513b354db3a4de93, 0x050c7011929b3516abdcae9128edcdd5ebea7090, 0xcc860adf804229576ad7bf4f2978ac51c5c870cb, 0xa4a7a631ebd9992db395682805a16e3dfc00189a, 0x058a5f599017130e9949040c1d8e9c1a54dd606b, 0x51d2e305168adf87f814259e2d9f6308fe667f8e, 0x9d8fb7415c3cbe9f3abca0e67ca08d1f73684712, 0x6364bdf3a0833803ba6f357ced0857b54be2126b, 0xe346887540b7447ed9ab279464e10ad12967e9c6, 0xb0f5ce0d01a0e627728d7864893410d40831c41b, 0x3a5545afdbe7d1a9db074adc57790d5629a91bfc, 0x01121ce872095e548d66422b37a08573b188eefc, 0xd0d9d7f690771517756abaf1f12350b2ff9c33e2, 0x3cc1ca355fd16476a38061be04d7c55557e93de9, 0x3646d895b2c2c6b7974d4d191447b84327fcb8a4, 0xfc31ece6a14cecdbb243fad505e154acdf1bb875, 0x50d898b7b7367a459565daf3876f9ebf775e72fe, 0x159867e725d718c7dcaa6e231bd1497860d6397f, 0x6b8fa8809c9a2eba06c60ec0bec404579d32cfd0, 0x44976616379dee591c538e6f38b41b9c3ebe575e, 0x2babe2b2a5aa4ab0ab2f826bb1ed4b603d2ea0af, 0x1ac9a6bf2f569f57e2a823fdf7690e94f089d828, 0xb7da63ae7f99dbd0da4500cbdf2b1e90a3026997, 0x480615f979996924e122a3a67a5daea4e4c856b1, 0xca2edd3ee1c62782ddb9ab2bdc213fc762e6106e]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-2000/deploy_markets_test_0402_log.txt b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/deploy_markets_test_0402_log.txt new file mode 100644 index 0000000..236c256 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/deploy_markets_test_0402_log.txt @@ -0,0 +1,370 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Enabled--verify +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175185 + Block timestamp: 1743524099 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22175185 + + ===== Market Info - 0 ===== + Market deployed at: 0x4a20DdEB8696b1f542649626889522068cc19438 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x00B210A7f79653A0fe7e2bc31d6Fe3026421195d + XT deployed at: 0x465c30b940E792262Ef65B7Fe7A5bAd3b5b7f034 + GT deployed at: 0xca3F986978ADEf5aA8e4F9e4F3d27f6f4Eb3f47d + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@02APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xC8c3A49b64dB371F96EdC15941e043966297Ea6b + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x19632ff799BA54B54934b52a89964F6cb12D396f + XT deployed at: 0xe459c64a852Df70Ea7D0cc46142A1a0d8BCd4f2A + GT deployed at: 0x9CEA72e4C7Fd1dd0bb2D0AAF98D756B1f85e096D + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@02APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x54ACdb3da45bBDEb1a53e1E3F6DB51C8384c7F9c + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x3ebabb95e4276DD2850666a95037f5EE3bb798Bb + XT deployed at: 0xb7d4329b11Dff286890F4d7e5b10763E09E8804C + GT deployed at: 0x28C108FD44B2E58DD9B07CBE453c0BCF836b8CB7 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@02APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xf2F9b0fDD5D22e574421A7Ee0E29e410E63C70A9 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x594Db033Ade81E0C8182B66d2B07fbc97452d1FA + XT deployed at: 0x544786112d542910634109BcCEF84C3Deb1b65e0 + GT deployed at: 0x81CAc518B14B28570C667A143F801bF2e05b6BEe + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@02APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x10aCD317ebf3F65e30c72720D89c55B7C68a9628 + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xA03710F73585cb5458F43739624611633Bf24173 + XT deployed at: 0x80525c75690102bb024BcEd8bE81D18A56172EC0 + GT deployed at: 0xe2e5403923B0421FA5a9D28c1012aeAFfc820f02 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@02APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x49913B7Bd178e21FaC84C3dED810Ff4CcDcb8403 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x8CDe48E20b5d77C3ec0fbCbf50d0C78B2DE11264 + XT deployed at: 0x8b596614c9ac30bd9DF615c3C18F0f05a97F0779 + GT deployed at: 0xBA03824B38E83B7CBAF3Fcb5aF02EF8342A110d8 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@02APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x69E1A695Ee24e7BcFc55d2dA7DfD479E4C7Eb6A3 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0xc7d5476d361C8d0E5c0478EA320431AD4a49A558 + XT deployed at: 0xe1710D5449241ce311Bfcefb5272594ECD930ec0 + GT deployed at: 0x4B87E9281de9573f2025565E632bdb8F136766E5 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@02APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0x9dA149D4Bc9eF4e6Eb1D131E837270f76dc62e79 + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD667a61e822564e1399f73196c73B2C41bCBda69 + XT deployed at: 0x2348B91F2037799d6AE604D792101534461DB06E + GT deployed at: 0x1aE5482Db2883e1ae8CDBFDbaE95539266F1bF32 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@02APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0x9cde69Ea28c9125060F86eB982305BafaE57f585 + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x4bDD2b0f934EECCE01A8Fc47E3762Ce86C9D061F + XT deployed at: 0x63B96518024b49C8F16104fDFd9d94a79A3d185C + GT deployed at: 0xa78bE568bc5ec42C8E41734dADcb86D3dde73af3 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@02APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x565656a354F6C2953EB2D00DC7e2e0Ab815e19E7 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x1184866Ed937F4605efc100c1f18E028F7CBDD86 + XT deployed at: 0x3F56b53953adf3a65f5Bb8E8Dce1C4926e1D629c + GT deployed at: 0x315f180e74247E01ca0377244Eb6b6D1c7444452 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@02APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x0ed76A80D639E7Bf88524b63429bB841c1633E60 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD4771df4a0f6338f521512A1651D8DB7EF5Af633 + XT deployed at: 0x4bbc10317e5b70B6B491836F5B2b496EE35f5E31 + GT deployed at: 0xFF601c3788236F231a8771cACBbB3087D0Ee7A2c + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@02APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x8c07c10a0a3530a9fB64c65f109A32F7B4b2DB80 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x0469A60F8fbc0c35c4D1D965a50A6Bd29c9dAB8C + XT deployed at: 0xE292927A017d58823957A83ea5EFeAF9C37D6F94 + GT deployed at: 0x7AdE4961Fccba087E8b4De84E8be61098Daf0230 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@02APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 5.079885262 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.087924645429718704 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x4a20ddeb8696b1f542649626889522068cc19438, 0x00b210a7f79653a0fe7e2bc31d6fe3026421195d, 0x465c30b940e792262ef65b7fe7a5bad3b5b7f034, 0xca3f986978adef5aa8e4f9e4f3d27f6f4eb3f47d, 0xc8c3a49b64db371f96edc15941e043966297ea6b, 0x19632ff799ba54b54934b52a89964f6cb12d396f, 0xe459c64a852df70ea7d0cc46142a1a0d8bcd4f2a, 0x9cea72e4c7fd1dd0bb2d0aaf98d756b1f85e096d, 0x54acdb3da45bbdeb1a53e1e3f6db51c8384c7f9c, 0x3ebabb95e4276dd2850666a95037f5ee3bb798bb, 0xb7d4329b11dff286890f4d7e5b10763e09e8804c, 0x28c108fd44b2e58dd9b07cbe453c0bcf836b8cb7, 0xf2f9b0fdd5d22e574421a7ee0e29e410e63c70a9, 0x594db033ade81e0c8182b66d2b07fbc97452d1fa, 0x544786112d542910634109bccef84c3deb1b65e0, 0x81cac518b14b28570c667a143f801bf2e05b6bee, 0x10acd317ebf3f65e30c72720d89c55b7c68a9628, 0xa03710f73585cb5458f43739624611633bf24173, 0x80525c75690102bb024bced8be81d18a56172ec0, 0xe2e5403923b0421fa5a9d28c1012aeaffc820f02, 0x49913b7bd178e21fac84c3ded810ff4ccdcb8403, 0x8cde48e20b5d77c3ec0fbcbf50d0c78b2de11264, 0x8b596614c9ac30bd9df615c3c18f0f05a97f0779, 0xba03824b38e83b7cbaf3fcb5af02ef8342a110d8, 0x69e1a695ee24e7bcfc55d2da7dfd479e4c7eb6a3, 0xc7d5476d361c8d0e5c0478ea320431ad4a49a558, 0xe1710d5449241ce311bfcefb5272594ecd930ec0, 0x4b87e9281de9573f2025565e632bdb8f136766e5, 0x9da149d4bc9ef4e6eb1d131e837270f76dc62e79, 0xd667a61e822564e1399f73196c73b2c41bcbda69, 0x2348b91f2037799d6ae604d792101534461db06e, 0x1ae5482db2883e1ae8cdbfdbae95539266f1bf32, 0x9cde69ea28c9125060f86eb982305bafae57f585, 0x4bdd2b0f934eecce01a8fc47e3762ce86c9d061f, 0x63b96518024b49c8f16104fdfd9d94a79a3d185c, 0xa78be568bc5ec42c8e41734dadcb86d3dde73af3, 0x565656a354f6c2953eb2d00dc7e2e0ab815e19e7, 0x1184866ed937f4605efc100c1f18e028f7cbdd86, 0x3f56b53953adf3a65f5bb8e8dce1c4926e1d629c, 0x315f180e74247e01ca0377244eb6b6d1c7444452, 0x0ed76a80d639e7bf88524b63429bb841c1633e60, 0xd4771df4a0f6338f521512a1651d8db7ef5af633, 0x4bbc10317e5b70b6b491836f5b2b496ee35f5e31, 0xff601c3788236f231a8771cacbbb3087d0ee7a2c, 0x8c07c10a0a3530a9fb64c65f109a32f7b4b2db80, 0x0469a60f8fbc0c35c4d1d965a50a6bd29c9dab8c, 0xe292927a017d58823957a83ea5efeaf9c37d6f94, 0x7ade4961fccba087e8b4de84e8be61098daf0230]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-access-manager.json b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-access-manager.json new file mode 100644 index 0000000..a1a5b6a --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743155675", + "gitBranch": "deploy/v1.0.5", + "gitCommitHash": "0x0x65c418860c22aecb27054e7a8c3207a4f87ad6af", + "blockInfo": { + "number": "22144647", + "timestamp": "1743155675" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-core.json b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-core.json new file mode 100644 index 0000000..34b5474 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743518639", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x30f0c30e4edf518e2bf6700837dad2a7624d35df", + "blockInfo": { + "number": "22174730", + "timestamp": "1743518639" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x37Ba9934aAbA7a49cC29d0952C6a91d7c7043dbc", + "vaultFactory": "0x01D8C1e0584751085a876892151Bf8490e862E3E", + "oracleAggregator": "0xE3a31690392E8E18DC3d862651C079339E2c1ADE", + "router": "0xC47591F5c023e44931c78D5A993834875b79FB11", + "swapAdapter": { + "uniswapV3Adapter": "0x34F7b52b0d33959C8351eF95F3523C89b6123C0b", + "odosV2Adapter": "0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779", + "pendleSwapV3Adapter": "0x0B30251FA697A39Fd41813b267b50F03414E82da", + "ERC4626VaultAdapter": "0x85ce30537c14EFB66B673f284bEa7c28351244F6" + }, + "marketViewer": "0x74Dfb95Ae623123ecf82Ba841985fB460bB9d45D" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@13APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@13APR2025.json new file mode 100644 index 0000000..1e16285 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243244", + "timestamp": "1744344959" + }, + "market": "0xDCfB75a0F37cee909f7E69E15afbA2bF01345577", + "collateral": { + "address": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "symbol": "PT-sUSDE-29MAY2025", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x9A648b27a18D48Be872e74E5c1Ab589E026862B1", + "xt": "0xa64a2101dC13A8C50E82542f52288A1B70FadBD8", + "gt": "0xF22B5302aD24312243798F16570C7fE566C79eF6" + }, + "config": { + "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-USDC-USUALUSDC+@13APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-USDC-USUALUSDC+@13APR2025.json new file mode 100644 index 0000000..d71b653 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-USDC-USUALUSDC+@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243244", + "timestamp": "1744344959" + }, + "market": "0xf54eD138E194130aA6ee02919F87d1b6d55c92B0", + "collateral": { + "address": "0xd63070114470f685b75B74D60EEc7c1113d33a3D", + "symbol": "USUALUSDC+", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x4B498E6280313821d149F0C6F38602a1D6126412", + "xt": "0x22CfCe5f3CAFF192f69171d83ed9075f77F53bF7", + "gt": "0xfa729265A8A51c6eB0943d8B44565813D42773A9" + }, + "config": { + "marketSymbol": "USDC/USUALUSDC+@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-USDC-WBTC@13APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-USDC-WBTC@13APR2025.json new file mode 100644 index 0000000..7ba7828 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-USDC-WBTC@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243244", + "timestamp": "1744344959" + }, + "market": "0x3cC1cA355fD16476a38061BE04D7c55557E93dE9", + "collateral": { + "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "symbol": "WBTC", + "priceFeed": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x3646D895B2C2c6B7974d4D191447b84327fCb8a4", + "xt": "0xfc31ECe6A14ceCdbB243FAD505e154acdf1BB875", + "gt": "0x50d898b7B7367a459565dAF3876f9EbF775e72FE" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-USDC-cbBTC@13APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-USDC-cbBTC@13APR2025.json new file mode 100644 index 0000000..a8f8d21 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-USDC-cbBTC@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243244", + "timestamp": "1744344959" + }, + "market": "0x159867e725D718c7DcaA6e231Bd1497860d6397f", + "collateral": { + "address": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", + "symbol": "cbBTC", + "priceFeed": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x6b8fA8809c9a2EBa06c60EC0BeC404579d32cfd0", + "xt": "0x44976616379dEe591c538E6f38B41B9C3EbE575e", + "gt": "0x2bAbE2b2A5AA4Ab0AB2F826BB1eD4B603d2EA0AF" + }, + "config": { + "marketSymbol": "USDC/cbBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-USDC-eUSDe@13APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-USDC-eUSDe@13APR2025.json new file mode 100644 index 0000000..f2a4ae4 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-USDC-eUSDe@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243244", + "timestamp": "1744344959" + }, + "market": "0x51d2e305168adF87F814259e2d9f6308fE667f8e", + "collateral": { + "address": "0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F", + "symbol": "eUSDe", + "priceFeed": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x9d8fb7415c3cbE9F3ABCA0E67ca08d1f73684712", + "xt": "0x6364bdf3A0833803bA6F357ceD0857B54Be2126B", + "gt": "0xe346887540B7447ED9ab279464E10ad12967e9C6" + }, + "config": { + "marketSymbol": "USDC/eUSDe@29MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-USDC-sUSDe@13APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-USDC-sUSDe@13APR2025.json new file mode 100644 index 0000000..94c171b --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-USDC-sUSDe@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243244", + "timestamp": "1744344959" + }, + "market": "0xF27106E6178EB95791ca11162A5F273a5a139D9e", + "collateral": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x8047efD9Eb4412B91F4A8E92340A9EF8334B5459", + "xt": "0x979253D67AfCB30517e1C11ED53e6AA20228E167", + "gt": "0x48dc2f63127D90FC5d76856Ed0d9A2209250AAB5" + }, + "config": { + "marketSymbol": "USDC/sUSDe@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-USDC-wstETH@13APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-USDC-wstETH@13APR2025.json new file mode 100644 index 0000000..12fb07b --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-USDC-wstETH@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243244", + "timestamp": "1744344959" + }, + "market": "0x803e1E969B4aFED1302afF237bBE131cA9D83B19", + "collateral": { + "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x0620e5a01d979318Eaa56FaeEb56Bedf8FCa198A", + "xt": "0x090D77D57c49cADd9ce4C38b3C2d87C190d4b9A2", + "gt": "0xFfB480840205bc1f0bD8F4EcE18200072a86225d" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-WETH-MCwETH@13APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-WETH-MCwETH@13APR2025.json new file mode 100644 index 0000000..5d0fb94 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-WETH-MCwETH@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243244", + "timestamp": "1744344959" + }, + "market": "0xeA91bf7EBD1352aD54fb1aaDd05849B2dff5b2c0", + "collateral": { + "address": "0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8", + "symbol": "MCwETH", + "priceFeed": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x6CBA68fA687332F3dB063E08115c561D87B42268", + "xt": "0x1548d94c3c59C1a39e0B02689D2844D584676808", + "gt": "0x444D0FB322Eb03Cd7EdC3E5D513B354DB3A4De93" + }, + "config": { + "marketSymbol": "WETH/MCwETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-WETH-gtWETH@13APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-WETH-gtWETH@13APR2025.json new file mode 100644 index 0000000..f78a648 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-WETH-gtWETH@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243244", + "timestamp": "1744344959" + }, + "market": "0x1Ac9A6Bf2F569F57E2a823FDF7690e94f089d828", + "collateral": { + "address": "0x2371e134e3455e0593363cBF89d3b6cf53740618", + "symbol": "gtWETH", + "priceFeed": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xb7dA63AE7f99dbd0dA4500cbDF2b1e90A3026997", + "xt": "0x480615f979996924E122A3a67A5daea4e4c856b1", + "gt": "0xCA2Edd3ee1c62782DDb9AB2Bdc213FC762e6106E" + }, + "config": { + "marketSymbol": "WETH/gtWETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-WETH-pufETH@13APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-WETH-pufETH@13APR2025.json new file mode 100644 index 0000000..2d958cd --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-WETH-pufETH@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243244", + "timestamp": "1744344959" + }, + "market": "0xb0f5CE0D01a0E627728D7864893410d40831C41b", + "collateral": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x3A5545aFDbE7d1A9Db074ADC57790d5629A91BFC", + "xt": "0x01121cE872095E548d66422B37a08573b188Eefc", + "gt": "0xD0d9D7f690771517756abaf1F12350b2FF9C33E2" + }, + "config": { + "marketSymbol": "WETH/pufETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-WETH-weETH@13APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-WETH-weETH@13APR2025.json new file mode 100644 index 0000000..ae62f59 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-WETH-weETH@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243244", + "timestamp": "1744344959" + }, + "market": "0x2259f8438e4BD4440867478D8D7cf1BB34b927fe", + "collateral": { + "address": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "21600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xe007112761B49CA8967470856709aFec79678779", + "xt": "0x5Bb01FB8E42C702C2CA3Ad1B3ca0abcB6504F5d3", + "gt": "0xE48475C8cB73BBed168A7D504f57052C4a37772f" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@13APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@13APR2025.json new file mode 100644 index 0000000..daf7b8b --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@13APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22243244", + "timestamp": "1744344959" + }, + "market": "0x050c7011929b3516AbDCaE9128EdCDD5ebea7090", + "collateral": { + "address": "0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D", + "symbol": "PT-pufETH-26JUN2025", + "priceFeed": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xcC860adF804229576ad7BF4f2978aC51C5c870Cb", + "xt": "0xA4a7A631EBD9992DB395682805a16E3dFC00189A", + "gt": "0x058a5f599017130E9949040C1d8E9C1a54dD606b" + }, + "config": { + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "13APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-vault-TMX-USDC.json b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-vault-TMX-USDC.json new file mode 100644 index 0000000..56904bc --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-vault-TMX-USDC.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22232838", + "timestamp": "1744219655" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TMX-USDC", + "address": "0x984408C88a9B042BF3e2ddf921Cd1fAFB4b735D1", + "asset": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "performanceFeeRate": 0, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-vault-TMX-WETH.json b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-vault-TMX-WETH.json new file mode 100644 index 0000000..c096a93 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-vault-TMX-WETH.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22232798", + "timestamp": "1744219175" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TMX-WETH", + "address": "0xDEB8a9C0546A01b7e5CeE8e44Fd0C8D8B96a1f6e", + "asset": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "performanceFeeRate": 0, + "maxCapacity": "5000000000000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-vault-Weiting USDC Vault.json b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-vault-Weiting USDC Vault.json new file mode 100644 index 0000000..31301e4 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250413-2000/eth-mainnet-vault-Weiting USDC Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xb07dca68abfa0915501a9f9b5e5f8ae686c02d95" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22215681", + "timestamp": "1744012679" + }, + "vaultInfo": { + "name": "Weiting USDC Vault", + "symbol": "Weiting USDC Vault", + "address": "0x5C16d84e998c661D9F6C7Cc23e1144E4b7f39759", + "asset": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "performanceFeeRate": 10000000, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x1c59f7A0AA3f01DDACd17c0EF7Bc00c3D18feD0A", + "guardian": "0x1c59f7A0AA3f01DDACd17c0EF7Bc00c3D18feD0A", + "allocator": "0x1c59f7A0AA3f01DDACd17c0EF7Bc00c3D18feD0A" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-1500/deploy-eth-mainnet-oracle-aggregator-0401-log.txt b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/deploy-eth-mainnet-oracle-aggregator-0401-log.txt new file mode 100644 index 0000000..81ca312 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/deploy-eth-mainnet-oracle-aggregator-0401-log.txt @@ -0,0 +1,21 @@ +== Logs == + Network: eth-mainnet + Deployer balance: 158879257545733090 + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175070 + Block timestamp: 1743522719 + + ===== Oracle Aggregator Info ===== + Deployer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Admin: 0x8409a9C1A911CED491892c5694E43994c9d47E8f + Oracle Aggregator deployed at: 0xE3a31690392E8E18DC3d862651C079339E2c1ADE + Oracle Timelock: 43200 + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-1500/deploy-eth-markets-test-20250414-1500-log.txt b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/deploy-eth-markets-test-20250414-1500-log.txt new file mode 100644 index 0000000..0de3c35 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/deploy-eth-markets-test-20250414-1500-log.txt @@ -0,0 +1,368 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ETHERSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xde1cdb58961941699a119629baed0334da2512a3 + + ===== Block Info ===== + Block number: 22244768 + Block timestamp: 1744363271 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22244768 + + ===== Market Info - 0 ===== + Market deployed at: 0xa8B6a7f5A853085E10fB1ed9023b9f868077ac81 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x60355895A4d9bb2Ade15647F3351D73763DE1cc3 + XT deployed at: 0xb1579c61AeedabA073639dD8EBdacBBb30Da53f9 + GT deployed at: 0x2A00633b3390F0281d8889b099450983Fd99D481 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@14APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xeC116dFbaf4327156eF4aAA978D8dde983aE44fd + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x4053C31D425EB56D74A8Fb78231D9778534f2810 + XT deployed at: 0xfDEEA1bE41a69ED7A7f9842389cb235856E856e3 + GT deployed at: 0x4f40A08f9CEC422a74bE4C8D4709675E05057ACC + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@14APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x9FB634a5F0681bd0F763417c8fD2Aa3725cB90C2 + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x5c7C1B0A2D266cAa66187877FA95A4F69046Aa2C + XT deployed at: 0xb0809583db7DF4F2f0D90AABaA9bD0c356d31567 + GT deployed at: 0x9142698C62107239016Df746F8e977DeF441E270 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@14APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0x8EA27065DD2eEbb368F7343cB91Bca95Dc20d147 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x86710187BbC10Db9C7FBaf25aDC74Bfa5926dB47 + XT deployed at: 0x7723E0fb69d67410209c5d99eBD33e775E4A5fa9 + GT deployed at: 0x41c333f478574357781f8b0576FBFf0930b4FfC4 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@14APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0xA09831705b1A8E49841d9eFa02B5252Db222602e + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x92014746188a35BD34c00182aCCf55F0e62B6572 + XT deployed at: 0x4ac9988d93b66068EfD4eB43e4ABCF2eb694A6cA + GT deployed at: 0x7ef2297c4A99f717578657824f363D78Be150D38 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@14APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0xA5fd6674ADD172Fb7F81caDD017F062e47605900 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0xd33D52b813640b7254fAC6a2f286801605E7ad6F + XT deployed at: 0xEba70e9d5cD9F9b87722eab0A3c09913C5101A46 + GT deployed at: 0x6da7aa264b0Eb83F3579396460e5F4CB4bc5e4CF + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@14APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x7b3F3353C9ebDaD3B0A33063031e8409e2A79F87 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0x8fbd04b0Ae9482625AF39c8dED017187dAa9F626 + XT deployed at: 0xc468BD06e6Fc4A67e1c652Bdd9041c753D564675 + GT deployed at: 0xa640EC44c7ff412c2e24f0782786F16e6129851d + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@14APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0xE030A25Dd4e51BD2963C8DD50B1CE95F75E0E435 + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xa7480B0E347241e5238dAE50157676a26EC03f03 + XT deployed at: 0x4ED04f07532047E2bB11077c1C4C77A474814832 + GT deployed at: 0x85c3346EF9be9Ca2f17f236582572c720287979C + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@14APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0xbEB41E083482Fa6cdb17A6F28Ab5B7E3FF423280 + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x2ad6A8959c0856326D2d634a138433Fe77708fc4 + XT deployed at: 0x8ffc593cd32b39b9D505Ec98b81EFE4a72c2B0FE + GT deployed at: 0x28AF6A1a90e408738933f6c4f8857a159bB8333B + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@14APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x0754AA18e80cC4ede02209C21DF5093570587A4f + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xB3009e7ed1444e92BCeC1e4385129f84762D08bC + XT deployed at: 0xE047Ca0DA3e9dB30d3Cc2b47c9a22F077558BC7F + GT deployed at: 0x56F6FD38Cd0e82F77bFC4c0312770d0809f257e9 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@14APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x4425eBD492e4B017fCeA53B67078eF3410267602 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x345d3A0fD229CE18E3a0964e5eC9F56F7C196246 + XT deployed at: 0xdD3dc5838a3f1FC58ea2AE4B153D0a740Ef50735 + GT deployed at: 0xefdDd66b6bf1a66B49Fd9F29BAFdcd6d208D2411 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@14APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0xffD597D836d57D63a6fAa834618B867eA0FC7CEe + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0xD4b2EB2E56A7EAbEAdfbD5C79787aF4463536621 + XT deployed at: 0xA4BfD21943CA970C5583EDA382C83a1d867c963d + GT deployed at: 0xc1F353062499BF1B9199d6A8Db9E79e208811F75 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@14APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 1.059580224 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.018339629872439808 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0xa8b6a7f5a853085e10fb1ed9023b9f868077ac81, 0x60355895a4d9bb2ade15647f3351d73763de1cc3, 0xb1579c61aeedaba073639dd8ebdacbbb30da53f9, 0x2a00633b3390f0281d8889b099450983fd99d481, 0xec116dfbaf4327156ef4aaa978d8dde983ae44fd, 0x4053c31d425eb56d74a8fb78231d9778534f2810, 0xfdeea1be41a69ed7a7f9842389cb235856e856e3, 0x4f40a08f9cec422a74be4c8d4709675e05057acc, 0x9fb634a5f0681bd0f763417c8fd2aa3725cb90c2, 0x5c7c1b0a2d266caa66187877fa95a4f69046aa2c, 0xb0809583db7df4f2f0d90aabaa9bd0c356d31567, 0x9142698c62107239016df746f8e977def441e270, 0x8ea27065dd2eebb368f7343cb91bca95dc20d147, 0x86710187bbc10db9c7fbaf25adc74bfa5926db47, 0x7723e0fb69d67410209c5d99ebd33e775e4a5fa9, 0x41c333f478574357781f8b0576fbff0930b4ffc4, 0xa09831705b1a8e49841d9efa02b5252db222602e, 0x92014746188a35bd34c00182accf55f0e62b6572, 0x4ac9988d93b66068efd4eb43e4abcf2eb694a6ca, 0x7ef2297c4a99f717578657824f363d78be150d38, 0xa5fd6674add172fb7f81cadd017f062e47605900, 0xd33d52b813640b7254fac6a2f286801605e7ad6f, 0xeba70e9d5cd9f9b87722eab0a3c09913c5101a46, 0x6da7aa264b0eb83f3579396460e5f4cb4bc5e4cf, 0x7b3f3353c9ebdad3b0a33063031e8409e2a79f87, 0x8fbd04b0ae9482625af39c8ded017187daa9f626, 0xc468bd06e6fc4a67e1c652bdd9041c753d564675, 0xa640ec44c7ff412c2e24f0782786f16e6129851d, 0xe030a25dd4e51bd2963c8dd50b1ce95f75e0e435, 0xa7480b0e347241e5238dae50157676a26ec03f03, 0x4ed04f07532047e2bb11077c1c4c77a474814832, 0x85c3346ef9be9ca2f17f236582572c720287979c, 0xbeb41e083482fa6cdb17a6f28ab5b7e3ff423280, 0x2ad6a8959c0856326d2d634a138433fe77708fc4, 0x8ffc593cd32b39b9d505ec98b81efe4a72c2b0fe, 0x28af6a1a90e408738933f6c4f8857a159bb8333b, 0x0754aa18e80cc4ede02209c21df5093570587a4f, 0xb3009e7ed1444e92bcec1e4385129f84762d08bc, 0xe047ca0da3e9db30d3cc2b47c9a22f077558bc7f, 0x56f6fd38cd0e82f77bfc4c0312770d0809f257e9, 0x4425ebd492e4b017fcea53b67078ef3410267602, 0x345d3a0fd229ce18e3a0964e5ec9f56f7c196246, 0xdd3dc5838a3f1fc58ea2ae4b153d0a740ef50735, 0xefddd66b6bf1a66b49fd9f29bafdcd6d208d2411, 0xffd597d836d57d63a6faa834618b867ea0fc7cee, 0xd4b2eb2e56a7eabeadfbd5c79787af4463536621, 0xa4bfd21943ca970c5583eda382c83a1d867c963d, 0xc1f353062499bf1b9199d6a8db9e79e208811f75]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-1500/deploy_markets_test_0402_log.txt b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/deploy_markets_test_0402_log.txt new file mode 100644 index 0000000..236c256 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/deploy_markets_test_0402_log.txt @@ -0,0 +1,370 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Enabled--verify +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175185 + Block timestamp: 1743524099 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22175185 + + ===== Market Info - 0 ===== + Market deployed at: 0x4a20DdEB8696b1f542649626889522068cc19438 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x00B210A7f79653A0fe7e2bc31d6Fe3026421195d + XT deployed at: 0x465c30b940E792262Ef65B7Fe7A5bAd3b5b7f034 + GT deployed at: 0xca3F986978ADEf5aA8e4F9e4F3d27f6f4Eb3f47d + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@02APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xC8c3A49b64dB371F96EdC15941e043966297Ea6b + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x19632ff799BA54B54934b52a89964F6cb12D396f + XT deployed at: 0xe459c64a852Df70Ea7D0cc46142A1a0d8BCd4f2A + GT deployed at: 0x9CEA72e4C7Fd1dd0bb2D0AAF98D756B1f85e096D + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@02APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x54ACdb3da45bBDEb1a53e1E3F6DB51C8384c7F9c + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x3ebabb95e4276DD2850666a95037f5EE3bb798Bb + XT deployed at: 0xb7d4329b11Dff286890F4d7e5b10763E09E8804C + GT deployed at: 0x28C108FD44B2E58DD9B07CBE453c0BCF836b8CB7 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@02APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xf2F9b0fDD5D22e574421A7Ee0E29e410E63C70A9 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x594Db033Ade81E0C8182B66d2B07fbc97452d1FA + XT deployed at: 0x544786112d542910634109BcCEF84C3Deb1b65e0 + GT deployed at: 0x81CAc518B14B28570C667A143F801bF2e05b6BEe + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@02APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x10aCD317ebf3F65e30c72720D89c55B7C68a9628 + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xA03710F73585cb5458F43739624611633Bf24173 + XT deployed at: 0x80525c75690102bb024BcEd8bE81D18A56172EC0 + GT deployed at: 0xe2e5403923B0421FA5a9D28c1012aeAFfc820f02 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@02APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x49913B7Bd178e21FaC84C3dED810Ff4CcDcb8403 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x8CDe48E20b5d77C3ec0fbCbf50d0C78B2DE11264 + XT deployed at: 0x8b596614c9ac30bd9DF615c3C18F0f05a97F0779 + GT deployed at: 0xBA03824B38E83B7CBAF3Fcb5aF02EF8342A110d8 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@02APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x69E1A695Ee24e7BcFc55d2dA7DfD479E4C7Eb6A3 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0xc7d5476d361C8d0E5c0478EA320431AD4a49A558 + XT deployed at: 0xe1710D5449241ce311Bfcefb5272594ECD930ec0 + GT deployed at: 0x4B87E9281de9573f2025565E632bdb8F136766E5 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@02APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0x9dA149D4Bc9eF4e6Eb1D131E837270f76dc62e79 + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD667a61e822564e1399f73196c73B2C41bCBda69 + XT deployed at: 0x2348B91F2037799d6AE604D792101534461DB06E + GT deployed at: 0x1aE5482Db2883e1ae8CDBFDbaE95539266F1bF32 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@02APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0x9cde69Ea28c9125060F86eB982305BafaE57f585 + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x4bDD2b0f934EECCE01A8Fc47E3762Ce86C9D061F + XT deployed at: 0x63B96518024b49C8F16104fDFd9d94a79A3d185C + GT deployed at: 0xa78bE568bc5ec42C8E41734dADcb86D3dde73af3 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@02APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x565656a354F6C2953EB2D00DC7e2e0Ab815e19E7 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x1184866Ed937F4605efc100c1f18E028F7CBDD86 + XT deployed at: 0x3F56b53953adf3a65f5Bb8E8Dce1C4926e1D629c + GT deployed at: 0x315f180e74247E01ca0377244Eb6b6D1c7444452 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@02APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x0ed76A80D639E7Bf88524b63429bB841c1633E60 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD4771df4a0f6338f521512A1651D8DB7EF5Af633 + XT deployed at: 0x4bbc10317e5b70B6B491836F5B2b496EE35f5E31 + GT deployed at: 0xFF601c3788236F231a8771cACBbB3087D0Ee7A2c + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@02APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x8c07c10a0a3530a9fB64c65f109A32F7B4b2DB80 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x0469A60F8fbc0c35c4D1D965a50A6Bd29c9dAB8C + XT deployed at: 0xE292927A017d58823957A83ea5EFeAF9C37D6F94 + GT deployed at: 0x7AdE4961Fccba087E8b4De84E8be61098Daf0230 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@02APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 5.079885262 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.087924645429718704 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x4a20ddeb8696b1f542649626889522068cc19438, 0x00b210a7f79653a0fe7e2bc31d6fe3026421195d, 0x465c30b940e792262ef65b7fe7a5bad3b5b7f034, 0xca3f986978adef5aa8e4f9e4f3d27f6f4eb3f47d, 0xc8c3a49b64db371f96edc15941e043966297ea6b, 0x19632ff799ba54b54934b52a89964f6cb12d396f, 0xe459c64a852df70ea7d0cc46142a1a0d8bcd4f2a, 0x9cea72e4c7fd1dd0bb2d0aaf98d756b1f85e096d, 0x54acdb3da45bbdeb1a53e1e3f6db51c8384c7f9c, 0x3ebabb95e4276dd2850666a95037f5ee3bb798bb, 0xb7d4329b11dff286890f4d7e5b10763e09e8804c, 0x28c108fd44b2e58dd9b07cbe453c0bcf836b8cb7, 0xf2f9b0fdd5d22e574421a7ee0e29e410e63c70a9, 0x594db033ade81e0c8182b66d2b07fbc97452d1fa, 0x544786112d542910634109bccef84c3deb1b65e0, 0x81cac518b14b28570c667a143f801bf2e05b6bee, 0x10acd317ebf3f65e30c72720d89c55b7c68a9628, 0xa03710f73585cb5458f43739624611633bf24173, 0x80525c75690102bb024bced8be81d18a56172ec0, 0xe2e5403923b0421fa5a9d28c1012aeaffc820f02, 0x49913b7bd178e21fac84c3ded810ff4ccdcb8403, 0x8cde48e20b5d77c3ec0fbcbf50d0c78b2de11264, 0x8b596614c9ac30bd9df615c3c18f0f05a97f0779, 0xba03824b38e83b7cbaf3fcb5af02ef8342a110d8, 0x69e1a695ee24e7bcfc55d2da7dfd479e4c7eb6a3, 0xc7d5476d361c8d0e5c0478ea320431ad4a49a558, 0xe1710d5449241ce311bfcefb5272594ecd930ec0, 0x4b87e9281de9573f2025565e632bdb8f136766e5, 0x9da149d4bc9ef4e6eb1d131e837270f76dc62e79, 0xd667a61e822564e1399f73196c73b2c41bcbda69, 0x2348b91f2037799d6ae604d792101534461db06e, 0x1ae5482db2883e1ae8cdbfdbae95539266f1bf32, 0x9cde69ea28c9125060f86eb982305bafae57f585, 0x4bdd2b0f934eecce01a8fc47e3762ce86c9d061f, 0x63b96518024b49c8f16104fdfd9d94a79a3d185c, 0xa78be568bc5ec42c8e41734dadcb86d3dde73af3, 0x565656a354f6c2953eb2d00dc7e2e0ab815e19e7, 0x1184866ed937f4605efc100c1f18e028f7cbdd86, 0x3f56b53953adf3a65f5bb8e8dce1c4926e1d629c, 0x315f180e74247e01ca0377244eb6b6d1c7444452, 0x0ed76a80d639e7bf88524b63429bb841c1633e60, 0xd4771df4a0f6338f521512a1651d8db7ef5af633, 0x4bbc10317e5b70b6b491836f5b2b496ee35f5e31, 0xff601c3788236f231a8771cacbbb3087d0ee7a2c, 0x8c07c10a0a3530a9fb64c65f109a32f7b4b2db80, 0x0469a60f8fbc0c35c4d1d965a50a6bd29c9dab8c, 0xe292927a017d58823957a83ea5efeaf9c37d6f94, 0x7ade4961fccba087e8b4de84e8be61098daf0230]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-access-manager.json b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-access-manager.json new file mode 100644 index 0000000..a1a5b6a --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743155675", + "gitBranch": "deploy/v1.0.5", + "gitCommitHash": "0x0x65c418860c22aecb27054e7a8c3207a4f87ad6af", + "blockInfo": { + "number": "22144647", + "timestamp": "1743155675" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-core.json b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-core.json new file mode 100644 index 0000000..34b5474 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743518639", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x30f0c30e4edf518e2bf6700837dad2a7624d35df", + "blockInfo": { + "number": "22174730", + "timestamp": "1743518639" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x37Ba9934aAbA7a49cC29d0952C6a91d7c7043dbc", + "vaultFactory": "0x01D8C1e0584751085a876892151Bf8490e862E3E", + "oracleAggregator": "0xE3a31690392E8E18DC3d862651C079339E2c1ADE", + "router": "0xC47591F5c023e44931c78D5A993834875b79FB11", + "swapAdapter": { + "uniswapV3Adapter": "0x34F7b52b0d33959C8351eF95F3523C89b6123C0b", + "odosV2Adapter": "0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779", + "pendleSwapV3Adapter": "0x0B30251FA697A39Fd41813b267b50F03414E82da", + "ERC4626VaultAdapter": "0x85ce30537c14EFB66B673f284bEa7c28351244F6" + }, + "marketViewer": "0x74Dfb95Ae623123ecf82Ba841985fB460bB9d45D" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@14APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@14APR2025.json new file mode 100644 index 0000000..d989d44 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22244768", + "timestamp": "1744363271" + }, + "market": "0x8EA27065DD2eEbb368F7343cB91Bca95Dc20d147", + "collateral": { + "address": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "symbol": "PT-sUSDE-29MAY2025", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x86710187BbC10Db9C7FBaf25aDC74Bfa5926dB47", + "xt": "0x7723E0fb69d67410209c5d99eBD33e775E4A5fa9", + "gt": "0x41c333f478574357781f8b0576FBFf0930b4FfC4" + }, + "config": { + "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-USDC-USUALUSDC+@14APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-USDC-USUALUSDC+@14APR2025.json new file mode 100644 index 0000000..46244ab --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-USDC-USUALUSDC+@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22244768", + "timestamp": "1744363271" + }, + "market": "0xA09831705b1A8E49841d9eFa02B5252Db222602e", + "collateral": { + "address": "0xd63070114470f685b75B74D60EEc7c1113d33a3D", + "symbol": "USUALUSDC+", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x92014746188a35BD34c00182aCCf55F0e62B6572", + "xt": "0x4ac9988d93b66068EfD4eB43e4ABCF2eb694A6cA", + "gt": "0x7ef2297c4A99f717578657824f363D78Be150D38" + }, + "config": { + "marketSymbol": "USDC/USUALUSDC+@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-USDC-WBTC@14APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-USDC-WBTC@14APR2025.json new file mode 100644 index 0000000..74fa1d6 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-USDC-WBTC@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22244768", + "timestamp": "1744363271" + }, + "market": "0x0754AA18e80cC4ede02209C21DF5093570587A4f", + "collateral": { + "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "symbol": "WBTC", + "priceFeed": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xB3009e7ed1444e92BCeC1e4385129f84762D08bC", + "xt": "0xE047Ca0DA3e9dB30d3Cc2b47c9a22F077558BC7F", + "gt": "0x56F6FD38Cd0e82F77bFC4c0312770d0809f257e9" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-USDC-cbBTC@14APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-USDC-cbBTC@14APR2025.json new file mode 100644 index 0000000..1a33425 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-USDC-cbBTC@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22244768", + "timestamp": "1744363271" + }, + "market": "0x4425eBD492e4B017fCeA53B67078eF3410267602", + "collateral": { + "address": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", + "symbol": "cbBTC", + "priceFeed": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x345d3A0fD229CE18E3a0964e5eC9F56F7C196246", + "xt": "0xdD3dc5838a3f1FC58ea2AE4B153D0a740Ef50735", + "gt": "0xefdDd66b6bf1a66B49Fd9F29BAFdcd6d208D2411" + }, + "config": { + "marketSymbol": "USDC/cbBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-USDC-eUSDe@14APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-USDC-eUSDe@14APR2025.json new file mode 100644 index 0000000..d69e791 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-USDC-eUSDe@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22244768", + "timestamp": "1744363271" + }, + "market": "0xE030A25Dd4e51BD2963C8DD50B1CE95F75E0E435", + "collateral": { + "address": "0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F", + "symbol": "eUSDe", + "priceFeed": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xa7480B0E347241e5238dAE50157676a26EC03f03", + "xt": "0x4ED04f07532047E2bB11077c1C4C77A474814832", + "gt": "0x85c3346EF9be9Ca2f17f236582572c720287979C" + }, + "config": { + "marketSymbol": "USDC/eUSDe@29MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-USDC-sUSDe@14APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-USDC-sUSDe@14APR2025.json new file mode 100644 index 0000000..0948819 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-USDC-sUSDe@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22244768", + "timestamp": "1744363271" + }, + "market": "0x9FB634a5F0681bd0F763417c8fD2Aa3725cB90C2", + "collateral": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x5c7C1B0A2D266cAa66187877FA95A4F69046Aa2C", + "xt": "0xb0809583db7DF4F2f0D90AABaA9bD0c356d31567", + "gt": "0x9142698C62107239016Df746F8e977DeF441E270" + }, + "config": { + "marketSymbol": "USDC/sUSDe@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-USDC-wstETH@14APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-USDC-wstETH@14APR2025.json new file mode 100644 index 0000000..5b1b69e --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-USDC-wstETH@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22244768", + "timestamp": "1744363271" + }, + "market": "0xeC116dFbaf4327156eF4aAA978D8dde983aE44fd", + "collateral": { + "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x4053C31D425EB56D74A8Fb78231D9778534f2810", + "xt": "0xfDEEA1bE41a69ED7A7f9842389cb235856E856e3", + "gt": "0x4f40A08f9CEC422a74bE4C8D4709675E05057ACC" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-WETH-MCwETH@14APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-WETH-MCwETH@14APR2025.json new file mode 100644 index 0000000..80bc99e --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-WETH-MCwETH@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22244768", + "timestamp": "1744363271" + }, + "market": "0xA5fd6674ADD172Fb7F81caDD017F062e47605900", + "collateral": { + "address": "0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8", + "symbol": "MCwETH", + "priceFeed": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xd33D52b813640b7254fAC6a2f286801605E7ad6F", + "xt": "0xEba70e9d5cD9F9b87722eab0A3c09913C5101A46", + "gt": "0x6da7aa264b0Eb83F3579396460e5F4CB4bc5e4CF" + }, + "config": { + "marketSymbol": "WETH/MCwETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-WETH-gtWETH@14APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-WETH-gtWETH@14APR2025.json new file mode 100644 index 0000000..167feb1 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-WETH-gtWETH@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22244768", + "timestamp": "1744363271" + }, + "market": "0xffD597D836d57D63a6fAa834618B867eA0FC7CEe", + "collateral": { + "address": "0x2371e134e3455e0593363cBF89d3b6cf53740618", + "symbol": "gtWETH", + "priceFeed": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xD4b2EB2E56A7EAbEAdfbD5C79787aF4463536621", + "xt": "0xA4BfD21943CA970C5583EDA382C83a1d867c963d", + "gt": "0xc1F353062499BF1B9199d6A8Db9E79e208811F75" + }, + "config": { + "marketSymbol": "WETH/gtWETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-WETH-pufETH@14APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-WETH-pufETH@14APR2025.json new file mode 100644 index 0000000..68b4bd7 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-WETH-pufETH@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22244768", + "timestamp": "1744363271" + }, + "market": "0xbEB41E083482Fa6cdb17A6F28Ab5B7E3FF423280", + "collateral": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x2ad6A8959c0856326D2d634a138433Fe77708fc4", + "xt": "0x8ffc593cd32b39b9D505Ec98b81EFE4a72c2B0FE", + "gt": "0x28AF6A1a90e408738933f6c4f8857a159bB8333B" + }, + "config": { + "marketSymbol": "WETH/pufETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-WETH-weETH@14APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-WETH-weETH@14APR2025.json new file mode 100644 index 0000000..67a0ea7 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-WETH-weETH@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22244768", + "timestamp": "1744363271" + }, + "market": "0xa8B6a7f5A853085E10fB1ed9023b9f868077ac81", + "collateral": { + "address": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "21600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x60355895A4d9bb2Ade15647F3351D73763DE1cc3", + "xt": "0xb1579c61AeedabA073639dD8EBdacBBb30Da53f9", + "gt": "0x2A00633b3390F0281d8889b099450983Fd99D481" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@14APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@14APR2025.json new file mode 100644 index 0000000..dcd1107 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22244768", + "timestamp": "1744363271" + }, + "market": "0x7b3F3353C9ebDaD3B0A33063031e8409e2A79F87", + "collateral": { + "address": "0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D", + "symbol": "PT-pufETH-26JUN2025", + "priceFeed": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x8fbd04b0Ae9482625AF39c8dED017187dAa9F626", + "xt": "0xc468BD06e6Fc4A67e1c652Bdd9041c753D564675", + "gt": "0xa640EC44c7ff412c2e24f0782786F16e6129851d" + }, + "config": { + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-vault-TMX-USDC.json b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-vault-TMX-USDC.json new file mode 100644 index 0000000..56904bc --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-vault-TMX-USDC.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22232838", + "timestamp": "1744219655" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TMX-USDC", + "address": "0x984408C88a9B042BF3e2ddf921Cd1fAFB4b735D1", + "asset": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "performanceFeeRate": 0, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-vault-TMX-WETH.json b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-vault-TMX-WETH.json new file mode 100644 index 0000000..c096a93 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-vault-TMX-WETH.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22232798", + "timestamp": "1744219175" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TMX-WETH", + "address": "0xDEB8a9C0546A01b7e5CeE8e44Fd0C8D8B96a1f6e", + "asset": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "performanceFeeRate": 0, + "maxCapacity": "5000000000000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-vault-Weiting USDC Vault.json b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-vault-Weiting USDC Vault.json new file mode 100644 index 0000000..31301e4 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-1500/eth-mainnet-vault-Weiting USDC Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xb07dca68abfa0915501a9f9b5e5f8ae686c02d95" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22215681", + "timestamp": "1744012679" + }, + "vaultInfo": { + "name": "Weiting USDC Vault", + "symbol": "Weiting USDC Vault", + "address": "0x5C16d84e998c661D9F6C7Cc23e1144E4b7f39759", + "asset": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "performanceFeeRate": 10000000, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x1c59f7A0AA3f01DDACd17c0EF7Bc00c3D18feD0A", + "guardian": "0x1c59f7A0AA3f01DDACd17c0EF7Bc00c3D18feD0A", + "allocator": "0x1c59f7A0AA3f01DDACd17c0EF7Bc00c3D18feD0A" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt new file mode 100644 index 0000000..81ca312 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/deploy-eth-mainnet-oracle-aggregator-0401-log.txt @@ -0,0 +1,21 @@ +== Logs == + Network: eth-mainnet + Deployer balance: 158879257545733090 + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175070 + Block timestamp: 1743522719 + + ===== Oracle Aggregator Info ===== + Deployer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Admin: 0x8409a9C1A911CED491892c5694E43994c9d47E8f + Oracle Aggregator deployed at: 0xE3a31690392E8E18DC3d862651C079339E2c1ADE + Oracle Timelock: 43200 + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-2000/deploy-eth-markets-test-20250414-2000-log.txt b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/deploy-eth-markets-test-20250414-2000-log.txt new file mode 100644 index 0000000..aad21cd --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/deploy-eth-markets-test-20250414-2000-log.txt @@ -0,0 +1,368 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Resume: Disabled +Verification: Enabled--verify +Using API Key: ETHERSCAN_API_KEY +Tenderly Verification: Disabled +Debug Mode: Disabled +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xde1cdb58961941699a119629baed0334da2512a3 + + ===== Block Info ===== + Block number: 22244815 + Block timestamp: 1744363835 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22244815 + + ===== Market Info - 0 ===== + Market deployed at: 0x661FC2119f708bb44E420D473670C4cc70e95E24 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x3258711670B86998a63CAFEB4D02Ff7d7b2d3641 + XT deployed at: 0x37a93f9BEe52ef0a36Bc78f5C3B7E46027E9C64d + GT deployed at: 0xaFcC9d9fABb2AbE3ED8D6411B87A6f4fC1AEA79A + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@14APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xa526df5B6C4a3085016430B80739dDBCe97EBCAd + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xfBfE5bA1d79cbA976FBAf6889a903410ACf0BFb2 + XT deployed at: 0x80c192d365df3AEdBF5b9b7CDC08A72A2EDa698b + GT deployed at: 0x8B6fE07b0708e61080BAFB39606a7559bA7b1289 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@14APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x681C23bAd298e6B56a9F56D95D69a3D8a07F5f0f + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x692E74f580E18628D37EBb68dA85e22C8281f22b + XT deployed at: 0x7D64e0d8fA9ee82598702D42D07d0358d461D2b9 + GT deployed at: 0x5A75fcE3595416638138be5bd577F010036164A1 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@14APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xAB0977943637E842d47A8d356cB705d9f4A59dCD + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xfA1A4d597C66635c99B0b67b1ba02da71AEE0F11 + XT deployed at: 0x2b01FE36d7c4Ec9e3C2F53a49B741384c660e8A9 + GT deployed at: 0x6FA40feEce7EF0254A24823140837Ec8E8589B21 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@14APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x19587686e3041f9555C78F2ad2A43773788681A6 + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xb7485B1591A227fa73fb63EB5c4F9399278ab3f5 + XT deployed at: 0xd7fE6F90B9873B355252f7D5d5d19F7F2b7Ba84f + GT deployed at: 0xdAC684D26662a76EA23A6844344a7F3e95c63F1B + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@14APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0xe88889FE441453750b39D619b0210aa40Bdb538C + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0xF3307795fEb5b1229505264eF16488f0BDc77fba + XT deployed at: 0x353Fc2F80F2Ebe51b8818D77d8c85Bf813A05C27 + GT deployed at: 0xc0B9C46Dd1618ab1c26C0E63014d55050Ef97b35 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@14APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x77836614fD70413FA99a804e15b5F2033BefA016 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0xD5cB4308809A33eDDE9585D53F1820287C1Cb4c1 + XT deployed at: 0xA98c16Fff65B9801D272F6565a77f9eE9a7E3eF4 + GT deployed at: 0x6465702a2570f373ed83c8f0546a11E9d3f35E48 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@14APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0xC4012dB1F028f95Db4f797531A35Dbef08e61E5D + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x0b14cD4D922aEeaCA2FcB1ED31f7230284457Bf5 + XT deployed at: 0xBfF9B8935e98369c89733c4C5A0215236626f829 + GT deployed at: 0x308C581f5cAa7feA63C1C69041ffc3dd0eFAd58a + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@14APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0x031094122f036f89d9AAa216dFE50e3fcCE10379 + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x64a50dCB8b16bF3d6A754463E55D7D9a54BA3a4d + XT deployed at: 0xa6aD3CE64fFA18c15BF33E07afc031AABD47460D + GT deployed at: 0xB752cEd15121C4Fc536fBD371763E45A31997cD2 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@14APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x396a8466a83f745ce4787e402Fc9948E263EbBf0 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x4445fa588F1F4DBe5Aa919f1f6d87f7D333EE2a5 + XT deployed at: 0x2482121a55D707F0254804010Ed6e7D6E439829c + GT deployed at: 0xdC37255D20fE1c81174Fc32C5F04D5b5694039a8 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@14APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x9F3Fb39085F6B1819c49D4D2D43B7A8f48562498 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xf01740239Bf5BCA436ea609115C181334287DC92 + XT deployed at: 0xF04020C13c175abbeC424B18522c021315648335 + GT deployed at: 0xcd003E964c8C48B7FBe95a78656EE2BF33FF189b + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@14APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x9D855Ed97CeDF0f715790C98B881A22dD916E912 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x6404782C16aEFDd720954b7654c37bC8aa8A7Bf2 + XT deployed at: 0x0f553395664cf582B0FcCDD71d07ab79a8442aa1 + GT deployed at: 0xAC79dd69ef1E6Fb47D572a90048b1A99B1cdB889 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 14APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@14APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 0.966124683 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.016722064734239736 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x661fc2119f708bb44e420d473670c4cc70e95e24, 0x3258711670b86998a63cafeb4d02ff7d7b2d3641, 0x37a93f9bee52ef0a36bc78f5c3b7e46027e9c64d, 0xafcc9d9fabb2abe3ed8d6411b87a6f4fc1aea79a, 0xa526df5b6c4a3085016430b80739ddbce97ebcad, 0xfbfe5ba1d79cba976fbaf6889a903410acf0bfb2, 0x80c192d365df3aedbf5b9b7cdc08a72a2eda698b, 0x8b6fe07b0708e61080bafb39606a7559ba7b1289, 0x681c23bad298e6b56a9f56d95d69a3d8a07f5f0f, 0x692e74f580e18628d37ebb68da85e22c8281f22b, 0x7d64e0d8fa9ee82598702d42d07d0358d461d2b9, 0x5a75fce3595416638138be5bd577f010036164a1, 0xab0977943637e842d47a8d356cb705d9f4a59dcd, 0xfa1a4d597c66635c99b0b67b1ba02da71aee0f11, 0x2b01fe36d7c4ec9e3c2f53a49b741384c660e8a9, 0x6fa40feece7ef0254a24823140837ec8e8589b21, 0x19587686e3041f9555c78f2ad2a43773788681a6, 0xb7485b1591a227fa73fb63eb5c4f9399278ab3f5, 0xd7fe6f90b9873b355252f7d5d5d19f7f2b7ba84f, 0xdac684d26662a76ea23a6844344a7f3e95c63f1b, 0xe88889fe441453750b39d619b0210aa40bdb538c, 0xf3307795feb5b1229505264ef16488f0bdc77fba, 0x353fc2f80f2ebe51b8818d77d8c85bf813a05c27, 0xc0b9c46dd1618ab1c26c0e63014d55050ef97b35, 0x77836614fd70413fa99a804e15b5f2033befa016, 0xd5cb4308809a33edde9585d53f1820287c1cb4c1, 0xa98c16fff65b9801d272f6565a77f9ee9a7e3ef4, 0x6465702a2570f373ed83c8f0546a11e9d3f35e48, 0xc4012db1f028f95db4f797531a35dbef08e61e5d, 0x0b14cd4d922aeeaca2fcb1ed31f7230284457bf5, 0xbff9b8935e98369c89733c4c5a0215236626f829, 0x308c581f5caa7fea63c1c69041ffc3dd0efad58a, 0x031094122f036f89d9aaa216dfe50e3fcce10379, 0x64a50dcb8b16bf3d6a754463e55d7d9a54ba3a4d, 0xa6ad3ce64ffa18c15bf33e07afc031aabd47460d, 0xb752ced15121c4fc536fbd371763e45a31997cd2, 0x396a8466a83f745ce4787e402fc9948e263ebbf0, 0x4445fa588f1f4dbe5aa919f1f6d87f7d333ee2a5, 0x2482121a55d707f0254804010ed6e7d6e439829c, 0xdc37255d20fe1c81174fc32c5f04d5b5694039a8, 0x9f3fb39085f6b1819c49d4d2d43b7a8f48562498, 0xf01740239bf5bca436ea609115c181334287dc92, 0xf04020c13c175abbec424b18522c021315648335, 0xcd003e964c8c48b7fbe95a78656ee2bf33ff189b, 0x9d855ed97cedf0f715790c98b881a22dd916e912, 0x6404782c16aefdd720954b7654c37bc8aa8a7bf2, 0x0f553395664cf582b0fccdd71d07ab79a8442aa1, 0xac79dd69ef1e6fb47d572a90048b1a99b1cdb889]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-2000/deploy_markets_test_0402_log.txt b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/deploy_markets_test_0402_log.txt new file mode 100644 index 0000000..236c256 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/deploy_markets_test_0402_log.txt @@ -0,0 +1,370 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Enabled--verify +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175185 + Block timestamp: 1743524099 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22175185 + + ===== Market Info - 0 ===== + Market deployed at: 0x4a20DdEB8696b1f542649626889522068cc19438 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x00B210A7f79653A0fe7e2bc31d6Fe3026421195d + XT deployed at: 0x465c30b940E792262Ef65B7Fe7A5bAd3b5b7f034 + GT deployed at: 0xca3F986978ADEf5aA8e4F9e4F3d27f6f4Eb3f47d + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@02APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xC8c3A49b64dB371F96EdC15941e043966297Ea6b + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x19632ff799BA54B54934b52a89964F6cb12D396f + XT deployed at: 0xe459c64a852Df70Ea7D0cc46142A1a0d8BCd4f2A + GT deployed at: 0x9CEA72e4C7Fd1dd0bb2D0AAF98D756B1f85e096D + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@02APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x54ACdb3da45bBDEb1a53e1E3F6DB51C8384c7F9c + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x3ebabb95e4276DD2850666a95037f5EE3bb798Bb + XT deployed at: 0xb7d4329b11Dff286890F4d7e5b10763E09E8804C + GT deployed at: 0x28C108FD44B2E58DD9B07CBE453c0BCF836b8CB7 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@02APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xf2F9b0fDD5D22e574421A7Ee0E29e410E63C70A9 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x594Db033Ade81E0C8182B66d2B07fbc97452d1FA + XT deployed at: 0x544786112d542910634109BcCEF84C3Deb1b65e0 + GT deployed at: 0x81CAc518B14B28570C667A143F801bF2e05b6BEe + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@02APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x10aCD317ebf3F65e30c72720D89c55B7C68a9628 + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xA03710F73585cb5458F43739624611633Bf24173 + XT deployed at: 0x80525c75690102bb024BcEd8bE81D18A56172EC0 + GT deployed at: 0xe2e5403923B0421FA5a9D28c1012aeAFfc820f02 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@02APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x49913B7Bd178e21FaC84C3dED810Ff4CcDcb8403 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x8CDe48E20b5d77C3ec0fbCbf50d0C78B2DE11264 + XT deployed at: 0x8b596614c9ac30bd9DF615c3C18F0f05a97F0779 + GT deployed at: 0xBA03824B38E83B7CBAF3Fcb5aF02EF8342A110d8 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@02APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x69E1A695Ee24e7BcFc55d2dA7DfD479E4C7Eb6A3 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0xc7d5476d361C8d0E5c0478EA320431AD4a49A558 + XT deployed at: 0xe1710D5449241ce311Bfcefb5272594ECD930ec0 + GT deployed at: 0x4B87E9281de9573f2025565E632bdb8F136766E5 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@02APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0x9dA149D4Bc9eF4e6Eb1D131E837270f76dc62e79 + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD667a61e822564e1399f73196c73B2C41bCBda69 + XT deployed at: 0x2348B91F2037799d6AE604D792101534461DB06E + GT deployed at: 0x1aE5482Db2883e1ae8CDBFDbaE95539266F1bF32 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@02APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0x9cde69Ea28c9125060F86eB982305BafaE57f585 + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x4bDD2b0f934EECCE01A8Fc47E3762Ce86C9D061F + XT deployed at: 0x63B96518024b49C8F16104fDFd9d94a79A3d185C + GT deployed at: 0xa78bE568bc5ec42C8E41734dADcb86D3dde73af3 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@02APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x565656a354F6C2953EB2D00DC7e2e0Ab815e19E7 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x1184866Ed937F4605efc100c1f18E028F7CBDD86 + XT deployed at: 0x3F56b53953adf3a65f5Bb8E8Dce1C4926e1D629c + GT deployed at: 0x315f180e74247E01ca0377244Eb6b6D1c7444452 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@02APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x0ed76A80D639E7Bf88524b63429bB841c1633E60 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD4771df4a0f6338f521512A1651D8DB7EF5Af633 + XT deployed at: 0x4bbc10317e5b70B6B491836F5B2b496EE35f5E31 + GT deployed at: 0xFF601c3788236F231a8771cACBbB3087D0Ee7A2c + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@02APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x8c07c10a0a3530a9fB64c65f109A32F7B4b2DB80 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x0469A60F8fbc0c35c4D1D965a50A6Bd29c9dAB8C + XT deployed at: 0xE292927A017d58823957A83ea5EFeAF9C37D6F94 + GT deployed at: 0x7AdE4961Fccba087E8b4De84E8be61098Daf0230 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@02APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 5.079885262 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.087924645429718704 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x4a20ddeb8696b1f542649626889522068cc19438, 0x00b210a7f79653a0fe7e2bc31d6fe3026421195d, 0x465c30b940e792262ef65b7fe7a5bad3b5b7f034, 0xca3f986978adef5aa8e4f9e4f3d27f6f4eb3f47d, 0xc8c3a49b64db371f96edc15941e043966297ea6b, 0x19632ff799ba54b54934b52a89964f6cb12d396f, 0xe459c64a852df70ea7d0cc46142a1a0d8bcd4f2a, 0x9cea72e4c7fd1dd0bb2d0aaf98d756b1f85e096d, 0x54acdb3da45bbdeb1a53e1e3f6db51c8384c7f9c, 0x3ebabb95e4276dd2850666a95037f5ee3bb798bb, 0xb7d4329b11dff286890f4d7e5b10763e09e8804c, 0x28c108fd44b2e58dd9b07cbe453c0bcf836b8cb7, 0xf2f9b0fdd5d22e574421a7ee0e29e410e63c70a9, 0x594db033ade81e0c8182b66d2b07fbc97452d1fa, 0x544786112d542910634109bccef84c3deb1b65e0, 0x81cac518b14b28570c667a143f801bf2e05b6bee, 0x10acd317ebf3f65e30c72720d89c55b7c68a9628, 0xa03710f73585cb5458f43739624611633bf24173, 0x80525c75690102bb024bced8be81d18a56172ec0, 0xe2e5403923b0421fa5a9d28c1012aeaffc820f02, 0x49913b7bd178e21fac84c3ded810ff4ccdcb8403, 0x8cde48e20b5d77c3ec0fbcbf50d0c78b2de11264, 0x8b596614c9ac30bd9df615c3c18f0f05a97f0779, 0xba03824b38e83b7cbaf3fcb5af02ef8342a110d8, 0x69e1a695ee24e7bcfc55d2da7dfd479e4c7eb6a3, 0xc7d5476d361c8d0e5c0478ea320431ad4a49a558, 0xe1710d5449241ce311bfcefb5272594ecd930ec0, 0x4b87e9281de9573f2025565e632bdb8f136766e5, 0x9da149d4bc9ef4e6eb1d131e837270f76dc62e79, 0xd667a61e822564e1399f73196c73b2c41bcbda69, 0x2348b91f2037799d6ae604d792101534461db06e, 0x1ae5482db2883e1ae8cdbfdbae95539266f1bf32, 0x9cde69ea28c9125060f86eb982305bafae57f585, 0x4bdd2b0f934eecce01a8fc47e3762ce86c9d061f, 0x63b96518024b49c8f16104fdfd9d94a79a3d185c, 0xa78be568bc5ec42c8e41734dadcb86d3dde73af3, 0x565656a354f6c2953eb2d00dc7e2e0ab815e19e7, 0x1184866ed937f4605efc100c1f18e028f7cbdd86, 0x3f56b53953adf3a65f5bb8e8dce1c4926e1d629c, 0x315f180e74247e01ca0377244eb6b6d1c7444452, 0x0ed76a80d639e7bf88524b63429bb841c1633e60, 0xd4771df4a0f6338f521512a1651d8db7ef5af633, 0x4bbc10317e5b70b6b491836f5b2b496ee35f5e31, 0xff601c3788236f231a8771cacbbb3087d0ee7a2c, 0x8c07c10a0a3530a9fb64c65f109a32f7b4b2db80, 0x0469a60f8fbc0c35c4d1d965a50a6bd29c9dab8c, 0xe292927a017d58823957a83ea5efeaf9c37d6f94, 0x7ade4961fccba087e8b4de84e8be61098daf0230]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-access-manager.json b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-access-manager.json new file mode 100644 index 0000000..a1a5b6a --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743155675", + "gitBranch": "deploy/v1.0.5", + "gitCommitHash": "0x0x65c418860c22aecb27054e7a8c3207a4f87ad6af", + "blockInfo": { + "number": "22144647", + "timestamp": "1743155675" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-core.json b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-core.json new file mode 100644 index 0000000..34b5474 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743518639", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x30f0c30e4edf518e2bf6700837dad2a7624d35df", + "blockInfo": { + "number": "22174730", + "timestamp": "1743518639" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x37Ba9934aAbA7a49cC29d0952C6a91d7c7043dbc", + "vaultFactory": "0x01D8C1e0584751085a876892151Bf8490e862E3E", + "oracleAggregator": "0xE3a31690392E8E18DC3d862651C079339E2c1ADE", + "router": "0xC47591F5c023e44931c78D5A993834875b79FB11", + "swapAdapter": { + "uniswapV3Adapter": "0x34F7b52b0d33959C8351eF95F3523C89b6123C0b", + "odosV2Adapter": "0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779", + "pendleSwapV3Adapter": "0x0B30251FA697A39Fd41813b267b50F03414E82da", + "ERC4626VaultAdapter": "0x85ce30537c14EFB66B673f284bEa7c28351244F6" + }, + "marketViewer": "0x74Dfb95Ae623123ecf82Ba841985fB460bB9d45D" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@14APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@14APR2025.json new file mode 100644 index 0000000..4013c54 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22244815", + "timestamp": "1744363835" + }, + "market": "0xAB0977943637E842d47A8d356cB705d9f4A59dCD", + "collateral": { + "address": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "symbol": "PT-sUSDE-29MAY2025", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xfA1A4d597C66635c99B0b67b1ba02da71AEE0F11", + "xt": "0x2b01FE36d7c4Ec9e3C2F53a49B741384c660e8A9", + "gt": "0x6FA40feEce7EF0254A24823140837Ec8E8589B21" + }, + "config": { + "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-USDC-USUALUSDC+@14APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-USDC-USUALUSDC+@14APR2025.json new file mode 100644 index 0000000..63cf121 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-USDC-USUALUSDC+@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22244815", + "timestamp": "1744363835" + }, + "market": "0x19587686e3041f9555C78F2ad2A43773788681A6", + "collateral": { + "address": "0xd63070114470f685b75B74D60EEc7c1113d33a3D", + "symbol": "USUALUSDC+", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xb7485B1591A227fa73fb63EB5c4F9399278ab3f5", + "xt": "0xd7fE6F90B9873B355252f7D5d5d19F7F2b7Ba84f", + "gt": "0xdAC684D26662a76EA23A6844344a7F3e95c63F1B" + }, + "config": { + "marketSymbol": "USDC/USUALUSDC+@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-USDC-WBTC@14APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-USDC-WBTC@14APR2025.json new file mode 100644 index 0000000..a77341d --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-USDC-WBTC@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22244815", + "timestamp": "1744363835" + }, + "market": "0x396a8466a83f745ce4787e402Fc9948E263EbBf0", + "collateral": { + "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "symbol": "WBTC", + "priceFeed": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x4445fa588F1F4DBe5Aa919f1f6d87f7D333EE2a5", + "xt": "0x2482121a55D707F0254804010Ed6e7D6E439829c", + "gt": "0xdC37255D20fE1c81174Fc32C5F04D5b5694039a8" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-USDC-cbBTC@14APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-USDC-cbBTC@14APR2025.json new file mode 100644 index 0000000..8b273b6 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-USDC-cbBTC@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22244815", + "timestamp": "1744363835" + }, + "market": "0x9F3Fb39085F6B1819c49D4D2D43B7A8f48562498", + "collateral": { + "address": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", + "symbol": "cbBTC", + "priceFeed": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xf01740239Bf5BCA436ea609115C181334287DC92", + "xt": "0xF04020C13c175abbeC424B18522c021315648335", + "gt": "0xcd003E964c8C48B7FBe95a78656EE2BF33FF189b" + }, + "config": { + "marketSymbol": "USDC/cbBTC@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-USDC-eUSDe@14APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-USDC-eUSDe@14APR2025.json new file mode 100644 index 0000000..a26f563 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-USDC-eUSDe@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22244815", + "timestamp": "1744363835" + }, + "market": "0xC4012dB1F028f95Db4f797531A35Dbef08e61E5D", + "collateral": { + "address": "0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F", + "symbol": "eUSDe", + "priceFeed": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x0b14cD4D922aEeaCA2FcB1ED31f7230284457Bf5", + "xt": "0xBfF9B8935e98369c89733c4C5A0215236626f829", + "gt": "0x308C581f5cAa7feA63C1C69041ffc3dd0eFAd58a" + }, + "config": { + "marketSymbol": "USDC/eUSDe@29MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-USDC-sUSDe@14APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-USDC-sUSDe@14APR2025.json new file mode 100644 index 0000000..1f614cf --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-USDC-sUSDe@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22244815", + "timestamp": "1744363835" + }, + "market": "0x681C23bAd298e6B56a9F56D95D69a3D8a07F5f0f", + "collateral": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x692E74f580E18628D37EBb68dA85e22C8281f22b", + "xt": "0x7D64e0d8fA9ee82598702D42D07d0358d461D2b9", + "gt": "0x5A75fcE3595416638138be5bd577F010036164A1" + }, + "config": { + "marketSymbol": "USDC/sUSDe@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-USDC-wstETH@14APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-USDC-wstETH@14APR2025.json new file mode 100644 index 0000000..00d1b1e --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-USDC-wstETH@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22244815", + "timestamp": "1744363835" + }, + "market": "0xa526df5B6C4a3085016430B80739dDBCe97EBCAd", + "collateral": { + "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xfBfE5bA1d79cbA976FBAf6889a903410ACf0BFb2", + "xt": "0x80c192d365df3AEdBF5b9b7CDC08A72A2EDa698b", + "gt": "0x8B6fE07b0708e61080BAFB39606a7559bA7b1289" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-WETH-MCwETH@14APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-WETH-MCwETH@14APR2025.json new file mode 100644 index 0000000..105089f --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-WETH-MCwETH@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22244815", + "timestamp": "1744363835" + }, + "market": "0xe88889FE441453750b39D619b0210aa40Bdb538C", + "collateral": { + "address": "0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8", + "symbol": "MCwETH", + "priceFeed": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xF3307795fEb5b1229505264eF16488f0BDc77fba", + "xt": "0x353Fc2F80F2Ebe51b8818D77d8c85Bf813A05C27", + "gt": "0xc0B9C46Dd1618ab1c26C0E63014d55050Ef97b35" + }, + "config": { + "marketSymbol": "WETH/MCwETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-WETH-gtWETH@14APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-WETH-gtWETH@14APR2025.json new file mode 100644 index 0000000..6202367 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-WETH-gtWETH@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22244815", + "timestamp": "1744363835" + }, + "market": "0x9D855Ed97CeDF0f715790C98B881A22dD916E912", + "collateral": { + "address": "0x2371e134e3455e0593363cBF89d3b6cf53740618", + "symbol": "gtWETH", + "priceFeed": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x6404782C16aEFDd720954b7654c37bC8aa8A7Bf2", + "xt": "0x0f553395664cf582B0FcCDD71d07ab79a8442aa1", + "gt": "0xAC79dd69ef1E6Fb47D572a90048b1A99B1cdB889" + }, + "config": { + "marketSymbol": "WETH/gtWETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-WETH-pufETH@14APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-WETH-pufETH@14APR2025.json new file mode 100644 index 0000000..81516c2 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-WETH-pufETH@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22244815", + "timestamp": "1744363835" + }, + "market": "0x031094122f036f89d9AAa216dFE50e3fcCE10379", + "collateral": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x64a50dCB8b16bF3d6A754463E55D7D9a54BA3a4d", + "xt": "0xa6aD3CE64fFA18c15BF33E07afc031AABD47460D", + "gt": "0xB752cEd15121C4Fc536fBD371763E45A31997cD2" + }, + "config": { + "marketSymbol": "WETH/pufETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-WETH-weETH@14APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-WETH-weETH@14APR2025.json new file mode 100644 index 0000000..2787f1d --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-WETH-weETH@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22244815", + "timestamp": "1744363835" + }, + "market": "0x661FC2119f708bb44E420D473670C4cc70e95E24", + "collateral": { + "address": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "21600" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x3258711670B86998a63CAFEB4D02Ff7d7b2d3641", + "xt": "0x37a93f9BEe52ef0a36Bc78f5C3B7E46027E9C64d", + "gt": "0xaFcC9d9fABb2AbE3ED8D6411B87A6f4fC1AEA79A" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@14APR2025.json b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@14APR2025.json new file mode 100644 index 0000000..141e657 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22244815", + "timestamp": "1744363835" + }, + "market": "0x77836614fD70413FA99a804e15b5F2033BefA016", + "collateral": { + "address": "0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D", + "symbol": "PT-pufETH-26JUN2025", + "priceFeed": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xD5cB4308809A33eDDE9585D53F1820287C1Cb4c1", + "xt": "0xA98c16Fff65B9801D272F6565a77f9eE9a7E3eF4", + "gt": "0x6465702a2570f373ed83c8f0546a11E9d3f35E48" + }, + "config": { + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-vault-TMX-USDC.json b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-vault-TMX-USDC.json new file mode 100644 index 0000000..56904bc --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-vault-TMX-USDC.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22232838", + "timestamp": "1744219655" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TMX-USDC", + "address": "0x984408C88a9B042BF3e2ddf921Cd1fAFB4b735D1", + "asset": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "performanceFeeRate": 0, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-vault-TMX-WETH.json b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-vault-TMX-WETH.json new file mode 100644 index 0000000..c096a93 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-vault-TMX-WETH.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22232798", + "timestamp": "1744219175" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TMX-WETH", + "address": "0xDEB8a9C0546A01b7e5CeE8e44Fd0C8D8B96a1f6e", + "asset": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "performanceFeeRate": 0, + "maxCapacity": "5000000000000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-vault-Weiting USDC Vault.json b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-vault-Weiting USDC Vault.json new file mode 100644 index 0000000..31301e4 --- /dev/null +++ b/deployments/eth-mainnet-v1.0.8-test-20250414-2000/eth-mainnet-vault-Weiting USDC Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xb07dca68abfa0915501a9f9b5e5f8ae686c02d95" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22215681", + "timestamp": "1744012679" + }, + "vaultInfo": { + "name": "Weiting USDC Vault", + "symbol": "Weiting USDC Vault", + "address": "0x5C16d84e998c661D9F6C7Cc23e1144E4b7f39759", + "asset": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "performanceFeeRate": 10000000, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x1c59f7A0AA3f01DDACd17c0EF7Bc00c3D18feD0A", + "guardian": "0x1c59f7A0AA3f01DDACd17c0EF7Bc00c3D18feD0A", + "allocator": "0x1c59f7A0AA3f01DDACd17c0EF7Bc00c3D18feD0A" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/accept-oracle-PT-USDS-log.txt b/deployments/eth-mainnet/accept-oracle-PT-USDS-log.txt new file mode 100644 index 0000000..0c11e6c --- /dev/null +++ b/deployments/eth-mainnet/accept-oracle-PT-USDS-log.txt @@ -0,0 +1,73 @@ +Running on eth-mainnet... +=== Configuration === +Operation: Script Execution +Network: eth-mainnet +Script: AcceptOracles.s.sol +Path: script/AcceptOracles.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Disabled +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting script execution... +Executing: forge script script/AcceptOracles.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow +No files changed, compilation skipped +Script ran successfully. + +== Logs == + === Checking Pending Oracles === + Oracle Aggregator Address: 0xE3a31690392E8E18DC3d862651C079339E2c1ADE + Network: eth-mainnet + Current Block Timestamp: 1748397779 + + Accepted oracle for token: + Token Symbol: PT-USDS-14AUG2025 + Token Address: 0xFfEc096c087C13Cc268497B89A613cACE4DF9A48 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x4599f532E03458017Fa55F7DCF7A296267637B74 + Heartbeat: 86400 + -------------------------------- + + === Oracle Acceptance Summary === + Total tokens checked: 2 + Oracles accepted: 1 + Oracles not ready: 1 + + === Oracles Not Ready for Acceptance === + 1. USDC (0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48) + Price Feed: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Backup Price Feed: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Heartbeat: 86400 + Status: Oracle is already configured with the correct values + --- + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 2.208132754 gwei + +Estimated total gas used for script: 111038 + +Estimated amount required: 0.000245186644738652 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/AcceptOracles.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/AcceptOracles.s.sol/1/run-latest.json + +[SUCCESS] Script AcceptOracles executed successfully on eth-mainnet (Broadcast mode)! diff --git a/deployments/eth-mainnet/accept-oracles-20250418-log.txt b/deployments/eth-mainnet/accept-oracles-20250418-log.txt new file mode 100644 index 0000000..65cd055 --- /dev/null +++ b/deployments/eth-mainnet/accept-oracles-20250418-log.txt @@ -0,0 +1,77 @@ + ./script.sh eth-mainnet script:AcceptOracles --broadcast --verify +Running on eth-mainnet... +=== Configuration === +Operation: Script Execution +Network: eth-mainnet +Script: AcceptOracles.s.sol +Path: script/AcceptOracles.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Enabled--verify +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting script execution... +Executing: forge script script/AcceptOracles.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify +warning: Found unknown config section in foundry.toml: [soldeer] +This notation for profiles has been deprecated and may result in the profile not being registered in future versions. +Please use [profile.soldeer] instead or run `forge config --fix`. +[⠒] Compiling... +No files changed, compilation skipped +Script ran successfully. + +== Logs == + === Checking Pending Oracles === + Oracle Aggregator Address: 0xE3a31690392E8E18DC3d862651C079339E2c1ADE + Network: eth-mainnet + Current Block Timestamp: 1744907987 + + Accepted oracle for token: + Token Symbol: MC_USDCP + Token Address: 0xf1fd8AC6346eC7BC4116Ba7aDc81102B2BC4C52D + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x4cF5F12c6c0D48F0d335DdB25e11cd526EAfD322 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: gtusdcf + Token Address: 0xc582F04d8a82795aa2Ff9c8bb4c1c889fe7b754e + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x81195F8A79f6553A4078f89eF87b21a7d3C2855A + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: mhyETH + Token Address: 0x701907283a57FF77E255C3f1aAD790466B8CE4ef + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x0221cd3fA8B1Bea16293fb0cD6B60977d531c931 + Heartbeat: 86400 + -------------------------------- + + === Oracle Acceptance Summary === + Total tokens checked: 5 + Oracles accepted: 3 + Oracles not ready: 2 + + === Oracles Not Ready for Acceptance === + 1. USDC (0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48) + Price Feed: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Backup Price Feed: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Heartbeat: 86400 + Status: Oracle is already configured with the correct values + --- + 2. WETH (0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2) + Price Feed: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Backup Price Feed: 0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4 + Heartbeat: 86400 + Status: Oracle is already configured with the correct values + --- + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet/accept-oracles-20250515-log.txt b/deployments/eth-mainnet/accept-oracles-20250515-log.txt new file mode 100644 index 0000000..28b24b6 --- /dev/null +++ b/deployments/eth-mainnet/accept-oracles-20250515-log.txt @@ -0,0 +1,28 @@ +Accepted oracle for token: + Token Symbol: PT-slvlUSD-25SEP2025 + Token Address: 0x2CA5f2C4300450D53214B00546795c1c07B89acB + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x5042768E83E2b5F9A7251A41C4E66855DD65fe31 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: PT-mMEV-31JUL2025 + Token Address: 0x1132065009850C72E27B7950C0f9285d1D103589 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x6BE2Bb4FFBb9FE1975A419D144750E604e1D37a1 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: mMEV + Token Address: 0x030b69280892c888670EDCDCD8B69Fd8026A0BF3 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x5f09Aff8B9b1f488B7d1bbaD4D89648579e55d61 + Heartbeat: 86400 + -------------------------------- + Accepted oracle for token: + Token Symbol: XAUM + Token Address: 0x2103E845C5E135493Bb6c2A4f0B8651956eA8682 + Previous Oracle: 0x0000000000000000000000000000000000000000 + New Oracle: 0x214eD9Da11D2fbe465a6fc601a91E62EbEc1a0D6 + Heartbeat: 86400 + -------------------------------- \ No newline at end of file diff --git a/deployments/eth-mainnet/accept-oracles-20250516-log.txt b/deployments/eth-mainnet/accept-oracles-20250516-log.txt new file mode 100644 index 0000000..cf9e631 --- /dev/null +++ b/deployments/eth-mainnet/accept-oracles-20250516-log.txt @@ -0,0 +1,21 @@ +=== Checking Pending Oracles === + Oracle Aggregator Address: 0xE3a31690392E8E18DC3d862651C079339E2c1ADE + Network: eth-mainnet + Current Block Timestamp: 1747362275 + + Accepted oracle for token: + Token Symbol: PT-mMEV-31JUL2025 + Token Address: 0x1132065009850C72E27B7950C0f9285d1D103589 + Previous Oracle: 0x6BE2Bb4FFBb9FE1975A419D144750E604e1D37a1 + New Oracle: 0x6BE2Bb4FFBb9FE1975A419D144750E604e1D37a1 + Heartbeat: 432000 + -------------------------------- + Accepted oracle for token: + Token Symbol: mMEV + Token Address: 0x030b69280892c888670EDCDCD8B69Fd8026A0BF3 + Previous Oracle: 0x5f09Aff8B9b1f488B7d1bbaD4D89648579e55d61 + New Oracle: 0x5f09Aff8B9b1f488B7d1bbaD4D89648579e55d61 + Heartbeat: 432000 + -------------------------------- + + === Oracle Acceptance Summary === \ No newline at end of file diff --git a/deployments/eth-mainnet/deploy-PT-cUSDO-PT-lvlUSD-markets-log.txt b/deployments/eth-mainnet/deploy-PT-cUSDO-PT-lvlUSD-markets-log.txt new file mode 100644 index 0000000..950795a --- /dev/null +++ b/deployments/eth-mainnet/deploy-PT-cUSDO-PT-lvlUSD-markets-log.txt @@ -0,0 +1,145 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Enabled--verify +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.9 + Git commit hash: + 0xef905ec00b1a193aa7ed7d51a9b9e0a2688ae56f + + ===== Block Info ===== + Block number: 22451097 + Block timestamp: 1746857087 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22451097 + + ===== Market Info - 0 ===== + Market deployed at: 0xCE511791715D1A84cD2f7BfA279F92c187bb9d93 + Market name: USDC/PT-cUSDO-19JUN2025@20JUN2025 + Market symbol: USDC/PT-cUSDO-19JUN2025@20JUN2025 + Collateral (PT-cUSDO-19JUN2025) address: 0x933B9FfEE0Ad3Ef8E4DBb52688ea905826D73755 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x1B4A4208d6AfD76332206F2Aefd977aeEf108575 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x89D6CD335090d67E6A18A63F97b55d7d177D2A1B + XT deployed at: 0xC1A89e8c63f5162e78f339F138f3585F4372ece0 + GT deployed at: 0xD08C49be9063512c49DC113f1F7C00cD2519c654 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 20JUN2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 10000000 + Issue FT Fee Ref: 10000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-cUSDO-19JUN2025@20JUN2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xd017E469d22AB7FfB097b9aA329391874954523b + Market name: USDC/PT-lvlUSD-25SEP2025@25JUL2025 + Market symbol: USDC/PT-lvlUSD-25SEP2025@25JUL2025 + Collateral (PT-lvlUSD-25SEP2025) address: 0x207F7205fd6c4b602Fa792C8b2B60e6006D4a0b8 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x32401387EDCB60CD74E2FCae50B3C542E03B1ec5 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xc53C94AaeECc2f58aC64f97eF26F6947B8a1fa49 + XT deployed at: 0x13Dd004a37cD8E35ECEA7379Ab45BD03c1F4E249 + GT deployed at: 0x022E7d8585f9214bBE29077501Ce938e552F8D5e + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 25JUL2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 10000000 + Issue FT Fee Ref: 10000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-lvlUSD-25SEP2025@25JUL2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x7526D036cDDbD3bdFDd8370D75304b822740b291 + Market name: USDC/PT-lvlUSD-25SEP2025@26SEP2025 + Market symbol: USDC/PT-lvlUSD-25SEP2025@26SEP2025 + Collateral (PT-lvlUSD-25SEP2025) address: 0x207F7205fd6c4b602Fa792C8b2B60e6006D4a0b8 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x32401387EDCB60CD74E2FCae50B3C542E03B1ec5 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x51Ae9eF7395A46E2861fE6b93F97728f9595e6e5 + XT deployed at: 0xA95cDaaC1Bf0aF025CEd0F259ac74cdec7503450 + GT deployed at: 0x6fA797c9675880654f098B554AE5B9CFdd6B2310 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 26SEP2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 10000000 + Issue FT Fee Ref: 10000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-lvlUSD-25SEP2025@26SEP2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 3.943883546 gwei + +Estimated total gas used for script: 5214161 + +Estimated amount required: 0.020564043774094906 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0xce511791715d1a84cd2f7bfa279f92c187bb9d93, 0x89d6cd335090d67e6a18a63f97b55d7d177d2a1b, 0xc1a89e8c63f5162e78f339f138f3585f4372ece0, 0xd08c49be9063512c49dc113f1f7c00cd2519c654, 0xd017e469d22ab7ffb097b9aa329391874954523b, 0xc53c94aaeecc2f58ac64f97ef26f6947b8a1fa49, 0x13dd004a37cd8e35ecea7379ab45bd03c1f4e249, 0x022e7d8585f9214bbe29077501ce938e552f8d5e, 0x7526d036cddbd3bdfdd8370d75304b822740b291, 0x51ae9ef7395a46e2861fe6b93f97728f9595e6e5, 0xa95cdaac1bf0af025ced0f259ac74cdec7503450, 0x6fa797c9675880654f098b554ae5b9cfdd6b2310]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet/deploy-eth-mainnet-oracle-aggregator-0401-log.txt b/deployments/eth-mainnet/deploy-eth-mainnet-oracle-aggregator-0401-log.txt new file mode 100644 index 0000000..81ca312 --- /dev/null +++ b/deployments/eth-mainnet/deploy-eth-mainnet-oracle-aggregator-0401-log.txt @@ -0,0 +1,21 @@ +== Logs == + Network: eth-mainnet + Deployer balance: 158879257545733090 + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175070 + Block timestamp: 1743522719 + + ===== Oracle Aggregator Info ===== + Deployer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Admin: 0x8409a9C1A911CED491892c5694E43994c9d47E8f + Oracle Aggregator deployed at: 0xE3a31690392E8E18DC3d862651C079339E2c1ADE + Oracle Timelock: 43200 + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet/deploy-eth-markets-20250515-log.txt b/deployments/eth-mainnet/deploy-eth-markets-20250515-log.txt new file mode 100644 index 0000000..8ca0649 --- /dev/null +++ b/deployments/eth-mainnet/deploy-eth-markets-20250515-log.txt @@ -0,0 +1,197 @@ +./script.sh eth-mainnet deploy:market --broadcast --verify +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Enabled--verify +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +warning: Found unknown config section in foundry.toml: [soldeer] +This notation for profiles has been deprecated and may result in the profile not being registered in future versions. +Please use [profile.soldeer] instead or run `forge config --fix`. +[⠒] Compiling... +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.9 + Git commit hash: + 0x468bc0ff42983731ee2c257bd0d26cff9cd7447b + + ===== Block Info ===== + Block number: 22482505 + Block timestamp: 1747239083 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22482505 + + ===== Market Info - 0 ===== + Market deployed at: 0x9D7386F68d9001a809860B4D88EC8E2cc3DD81B0 + Market name: USDC/PT-slvlUSD-25SEP2025@26SEP2025 + Market symbol: USDC/PT-slvlUSD-25SEP2025@26SEP2025 + Collateral (PT-slvlUSD-25SEP2025) address: 0x2CA5f2C4300450D53214B00546795c1c07B89acB + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x5042768E83E2b5F9A7251A41C4E66855DD65fe31 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x831a11a25a98715e632A51D46A6296dA47883743 + XT deployed at: 0x733F08C07fe2d37c86516aBE830Fc2756E56ac1C + GT deployed at: 0x68DCe038aF76f907617A0E648e23011143774e8A + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 26SEP2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 10000000 + Issue FT Fee Ref: 6000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-slvlUSD-25SEP2025@26SEP2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0x08d6E7D4F49f6e34878a6f35DB96F3130c43245F + Market name: USDC/PT-mMEV-31JUL2025@01AUG2025 + Market symbol: USDC/PT-mMEV-31JUL2025@01AUG2025 + Collateral (PT-mMEV-31JUL2025) address: 0x1132065009850C72E27B7950C0f9285d1D103589 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x6BE2Bb4FFBb9FE1975A419D144750E604e1D37a1 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x8445C7A468Bc74D9A6Af8006F36fE5703ccae230 + XT deployed at: 0x38636a20a312094aC71D73481A2FC51E691c5680 + GT deployed at: 0x94257D83ba7B89A53F6bb4dfa282D1C992118986 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 01AUG2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 10000000 + Issue FT Fee Ref: 6000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-mMEV-31JUL2025@01AUG2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x6C7B36f0a2136CB0da7b38293925d9af06895C20 + Market name: USDC/mMEV@01AUG2025 + Market symbol: USDC/mMEV@01AUG2025 + Collateral (mMEV) address: 0x030b69280892c888670EDCDCD8B69Fd8026A0BF3 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x5f09Aff8B9b1f488B7d1bbaD4D89648579e55d61 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xFc97e7b4728d81b275DAd8701F2a53b72e5A0898 + XT deployed at: 0x56c7334191D0CC03043f5e6203C56245de3D9bCa + GT deployed at: 0x4bdf64B59A1cadaB0ff34E18cDee225435D0479E + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 01AUG2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 10000000 + Issue FT Fee Ref: 6000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-mMEV@01AUG2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0x975CBA8Bad13EF86BC4d2BBb3Eb7497327c640d1 + Market name: USDC/XAUm@27JUN2025 + Market symbol: USDC/XAUm@27JUN2025 + Collateral (XAUM) address: 0x2103E845C5E135493Bb6c2A4f0B8651956eA8682 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x214eD9Da11D2fbe465a6fc601a91E62EbEc1a0D6 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xF8c1CdA465071665D3ECAf906732899186fD4856 + XT deployed at: 0xf7e8F91286E3D4685A4D8e4F2a7413FE273DB503 + GT deployed at: 0x6216D113CbBC1c4a1017699E691E949D1Dee8812 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 27JUN2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 10000000 + Issue FT Fee Ref: 6000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-XAUM@27JUN2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x7D042A2800C2Bf66A2Af99014c96513Bc4CEfeda + Market name: WBTC/sUSDe@27JUN2025 + Market symbol: WBTC/sUSDe@27JUN2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Underlying heartbeat: 86400 + FT deployed at: 0x775157A35b1EfB4D86c5bC732f047758085d2127 + XT deployed at: 0x91BC1c8dDe63ec666397a7e1500aCbD9b028fEA3 + GT deployed at: 0xe173C8D8192d20D820061D04323c3E89Aa836a4c + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 27JUN2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 10000000 + Issue FT Fee Ref: 3000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WBTC-sUSDe@27JUN2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0xc7559e952666fac90206758e664f86D09e7f1f72 + Market name: WETH/sUSDe@27JUN2025 + Market symbol: WETH/sUSDe@27JUN2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 86400 + FT deployed at: 0x7337261Cf19cc2D2146F6A30Dd4Fb186e31728cC + XT deployed at: 0x0fE1a8E392F4c03eedb805260C12716B4B4Ed68F + GT deployed at: 0xdf7E3C6BA0239E1933E431ad68Be7861ea51387e + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 27JUN2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 10000000 + Issue FT Fee Ref: 3000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-sUSDe@27JUN2025.json + + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet/deploy-eth-markets-mature-20250627-log.txt b/deployments/eth-mainnet/deploy-eth-markets-mature-20250627-log.txt new file mode 100644 index 0000000..24387c4 --- /dev/null +++ b/deployments/eth-mainnet/deploy-eth-markets-mature-20250627-log.txt @@ -0,0 +1,270 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Enabled--verify +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.9 + Git commit hash: + 0x60cf3b55c07eb0c4735685b95514e2fe1a55d2e5 + + ===== Block Info ===== + Block number: 22430551 + Block timestamp: 1746605843 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22430551 + + ===== Market Info - 0 ===== + Market deployed at: 0xf0dE37189366F0f3AAe2795160763F3F34797B11 + Market name: WETH/weETH@27JUN2025 + Market symbol: WETH/weETH@27JUN2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 86400 + FT deployed at: 0xe8503FFEcc5D4065ba0eB11DCbdcD47A4F752572 + XT deployed at: 0xf98042dD2ca30440d27373ECA2727e9540897EBf + GT deployed at: 0x272f222de90ADF7B1cCA859d685beC738993bA6C + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 27JUN2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 10000000 + Issue FT Fee Ref: 4000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@27JUN2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0x22Cd4c59eD4bb2ad852892518073056441c55BFE + Market name: USDC/wstETH@27JUN2025 + Market symbol: USDC/wstETH@27JUN2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x285a4618d3349e2Fff63f750FCaC94Fb002f932e + XT deployed at: 0x874AdBD54F7bA2cF46f97BB569AB7BA4cB8f89C9 + GT deployed at: 0xec4Aa75e5C4b09eb65761f8328252d3509F232C0 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 27JUN2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 10000000 + Issue FT Fee Ref: 10000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@27JUN2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x988a287c4340B18665cC5E128DC76906A5C839e6 + Market name: USDC/sUSDe@27JUN2025 + Market symbol: USDC/sUSDe@27JUN2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xcE7decb042927EC42DB8ECc75A8E526824376A3e + XT deployed at: 0x13b29958f0F6eB39a587704034E531E4090E9D59 + GT deployed at: 0xDBa3379F0406F5c90eb74D27e511e4FB4D10B6B3 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 27JUN2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 10000000 + Issue FT Fee Ref: 10000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@27JUN2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xaBE8ab2223c846466Eb30f5137A7f05106c9d0c4 + Market name: WETH/pufETH@27JUN2025 + Market symbol: WETH/pufETH@27JUN2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 86400 + FT deployed at: 0x23Ed558080CEB4755a24d841E24558e85B1DDb18 + XT deployed at: 0xA97Ba034797386d9987c88Beff430B40c4fDc6c5 + GT deployed at: 0xb4a859d44470F0168464a5DB99f058CF9A7B4df1 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 27JUN2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 10000000 + Issue FT Fee Ref: 4000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@27JUN2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x9904F3b879385033faa31B50d1D63cb80b3495A3 + Market name: USDC/WBTC@27JUN2025 + Market symbol: USDC/WBTC@27JUN2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x75b8ea5178baA489c9ab208Ec80AF10780927890 + XT deployed at: 0x6182feffC89A170154a991fe09c31765bA5441C8 + GT deployed at: 0x42C57cDE40B26c5E68c28e687eACa7B83dC48377 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 27JUN2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 10000000 + Issue FT Fee Ref: 10000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@27JUN2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x1A69127188B72A155165255270017b4c78f31b88 + Market name: USDC/cbBTC@27JUN2025 + Market symbol: USDC/cbBTC@27JUN2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x0f8A293C6f7E578d46B1da2A44A5A65ce874da2d + XT deployed at: 0x5ba653575Ea036d734d703EAF9dE2Fe8936A6979 + GT deployed at: 0xe81E8F37aC256253c78f5D880AD3d1CFCd00a5B2 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 27JUN2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 10000000 + Issue FT Fee Ref: 10000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@27JUN2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x8d501c7640595EC9D2A39Fbd30dED7672e9631BD + Market name: lvlUSD/slvlUSD@27JUN2025 + Market symbol: lvlUSD/slvlUSD@27JUN2025 + Collateral (slvlUSD) address: 0x4737D9b4592B40d51e110b94c9C043c6654067Ae + Underlying (lvlUSD) address: 0x7C1156E515aA1A2E851674120074968C905aAF37 + Collateral price feed address: 0x3Bc7dD457901A41509fc0Bd47Dc3Da42D45Ce030 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x53b52637923839676F6441C7e824D91478F882D3 + XT deployed at: 0xc5421aAD009F200b60a8cC67B60cF6f774a1E693 + GT deployed at: 0xC03746e7441A523686D93C5282557e3970065d6a + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 27JUN2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 10000000 + Issue FT Fee Ref: 10000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-lvlUSD-slvlUSD@27JUN2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0xD316d4494c840F8A758FB6184e9b60281e35cC02 + Market name: wstETH/inwstETHs@27JUN2025 + Market symbol: wstETH/inwstETHs@27JUN2025 + Collateral (inwstETHs) address: 0x8E0789d39db454DBE9f4a77aCEF6dc7c69f6D552 + Underlying (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Collateral price feed address: 0xbfA4F6a74c7F02FE3B52e570D782033011270CEb + Collateral heartbeat: 86400 + Underlying price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Underlying heartbeat: 86400 + FT deployed at: 0x6B3aaAB883d2B5A42276206B18C62dBd2F075B73 + XT deployed at: 0x1Ad25fC3fAD6B5fb2744Ec684c74BC301A3a26dC + GT deployed at: 0xcE6Df2c8A6B5d7f70f73a71f78c64F54bDA4DbED + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 27JUN2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 10000000 + Issue FT Fee Ref: 4000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-wstETH-inwstETHs@27JUN2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 0.812900011 gwei + +Estimated total gas used for script: 11103430 + +Estimated amount required: 0.00902597836913773 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0xf0de37189366f0f3aae2795160763f3f34797b11, 0xe8503ffecc5d4065ba0eb11dcbdcd47a4f752572, 0xf98042dd2ca30440d27373eca2727e9540897ebf, 0x272f222de90adf7b1cca859d685bec738993ba6c, 0x22cd4c59ed4bb2ad852892518073056441c55bfe, 0x285a4618d3349e2fff63f750fcac94fb002f932e, 0x874adbd54f7ba2cf46f97bb569ab7ba4cb8f89c9, 0xec4aa75e5c4b09eb65761f8328252d3509f232c0, 0x988a287c4340b18665cc5e128dc76906a5c839e6, 0xce7decb042927ec42db8ecc75a8e526824376a3e, 0x13b29958f0f6eb39a587704034e531e4090e9d59, 0xdba3379f0406f5c90eb74d27e511e4fb4d10b6b3, 0xabe8ab2223c846466eb30f5137a7f05106c9d0c4, 0x23ed558080ceb4755a24d841e24558e85b1ddb18, 0xa97ba034797386d9987c88beff430b40c4fdc6c5, 0xb4a859d44470f0168464a5db99f058cf9a7b4df1, 0x9904f3b879385033faa31b50d1d63cb80b3495a3, 0x75b8ea5178baa489c9ab208ec80af10780927890, 0x6182feffc89a170154a991fe09c31765ba5441c8, 0x42c57cde40b26c5e68c28e687eaca7b83dc48377, 0x1a69127188b72a155165255270017b4c78f31b88, 0x0f8a293c6f7e578d46b1da2a44a5a65ce874da2d, 0x5ba653575ea036d734d703eaf9de2fe8936a6979, 0xe81e8f37ac256253c78f5d880ad3d1cfcd00a5b2, 0x8d501c7640595ec9d2a39fbd30ded7672e9631bd, 0x53b52637923839676f6441c7e824d91478f882d3, 0xc5421aad009f200b60a8cc67b60cf6f774a1e693, 0xc03746e7441a523686d93c5282557e3970065d6a, 0xd316d4494c840f8a758fb6184e9b60281e35cc02, 0x6b3aaab883d2b5a42276206b18c62dbd2f075b73, 0x1ad25fc3fad6b5fb2744ec684c74bc301a3a26dc, 0xce6df2c8a6b5d7f70f73a71f78c64f54bda4dbed]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet/deploy-inwsteth-price-feed-log.txt b/deployments/eth-mainnet/deploy-inwsteth-price-feed-log.txt new file mode 100644 index 0000000..df8b900 --- /dev/null +++ b/deployments/eth-mainnet/deploy-inwsteth-price-feed-log.txt @@ -0,0 +1,16 @@ + forge script script/deploy/DeployPriceFeedsEthInWstETH.s.sol --rpc-url $ETH_MAINNET_RPC_URL --broadcast --verify +warning: Found unknown config section in foundry.toml: [soldeer] +This notation for profiles has been deprecated and may result in the profile not being registered in future versions. +Please use [profile.soldeer] instead or run `forge config --fix`. +[⠆] Compiling... +No files changed, compilation skipped +Script ran successfully. + +== Logs == + PriceFeedFactory deployed at 0xA40239B024012E427D3981c3DA055c4C5A58D0b3 + inwstETH price feed address 0x4dDD3d3F3a92939BF352d503aFd4666773fEfa1B + inwstETH last answer 213780497802 + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet/deploy-markets-20250417-log.txt b/deployments/eth-mainnet/deploy-markets-20250417-log.txt new file mode 100644 index 0000000..4dcb173 --- /dev/null +++ b/deployments/eth-mainnet/deploy-markets-20250417-log.txt @@ -0,0 +1,122 @@ +./script.sh eth-mainnet deploy:market --broadcast --verify +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Enabled--verify +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify +warning: Found unknown config section in foundry.toml: [soldeer] +This notation for profiles has been deprecated and may result in the profile not being registered in future versions. +Please use [profile.soldeer] instead or run `forge config --fix`. +[⠒] Compiling... +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.9 + Git commit hash: + 0x4402458004a3655ec11709e2f86118ae7bfd0d18 + + ===== Block Info ===== + Block number: 22286356 + Block timestamp: 1744864451 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22286356 + + ===== Market Info - 0 ===== + Market deployed at: 0xf4924D6189552ae5A7818088dA6f23Bd33281C1b + Market name: USDC/MC_USDCP@30MAY2025 + Market symbol: USDC/MC_USDCP@30MAY2025 + Collateral (MC_USDCP) address: 0xf1fd8AC6346eC7BC4116Ba7aDc81102B2BC4C52D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x4cF5F12c6c0D48F0d335DdB25e11cd526EAfD322 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xe7b3c858FF8031DC6c84D899aEeC343c89A246e0 + XT deployed at: 0x2568d2B892b5c761e1155F4f1c05E5b61961f126 + GT deployed at: 0x5C4db8DB0CA1d040e7fD6FB2AfAA81032df0a4f7 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 30MAY2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-MC_USDCP@30MAY2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0x2EaafFbCdE68337341C0eC65A862e648A413dc14 + Market name: USDC/gtusdcf@30MAY2025 + Market symbol: USDC/gtusdcf@30MAY2025 + Collateral (gtusdcf) address: 0xc582F04d8a82795aa2Ff9c8bb4c1c889fe7b754e + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x81195F8A79f6553A4078f89eF87b21a7d3C2855A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x09ec4BE9869BfAbF9fF6652fe7703276D6F5E5d8 + XT deployed at: 0x9c7fBdd0055604bbf7736B153407e9513C818C22 + GT deployed at: 0x8Ee590224c6cddE0d27FB60B37B05784dD794E59 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 30MAY2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-gtusdcf@30MAY2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0xb9919eE2169a7dA664AD024C6dDCF0ccD4121C26 + Market name: WETH/mhyETH@30MAY2025 + Market symbol: WETH/mhyETH@30MAY2025 + Collateral (mhyETH) address: 0x701907283a57FF77E255C3f1aAD790466B8CE4ef + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0x0221cd3fA8B1Bea16293fb0cD6B60977d531c931 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 86400 + FT deployed at: 0xbC9c191613c6e77c03A3F792579520d455e852a6 + XT deployed at: 0x1aA1fF0D8c47066C72902040716F91Df18090ADc + GT deployed at: 0x489f04a08d6ee13789cd59c5ce241494b063b3DB + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 30MAY2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-mhyETH@30MAY2025.json + + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet/deploy-markets-pt-susde-and-pt-pufeth-log.txt b/deployments/eth-mainnet/deploy-markets-pt-susde-and-pt-pufeth-log.txt new file mode 100644 index 0000000..7380a37 --- /dev/null +++ b/deployments/eth-mainnet/deploy-markets-pt-susde-and-pt-pufeth-log.txt @@ -0,0 +1,120 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Enabled--verify +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify --etherscan-api-key [MASKED] +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.9 + Git commit hash: + 0x64011b4d4413cf97574d431e77a79602064cae38 + + ===== Block Info ===== + Block number: 22439649 + Block timestamp: 1746717503 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22439649 + + ===== Market Info - 0 ===== + Market deployed at: 0xdBB2D44c238c459cCB820De886ABF721EF6E6941 + Market name: USDC/PT-sUSDE-31JUL2025@01AUG2025 + Market symbol: USDC/PT-sUSDE-31JUL2025@01AUG2025 + Collateral (PT-sUSDE-31JUL2025) address: 0x3b3fB9C57858EF816833dC91565EFcd85D96f634 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x53399c17DbB2Ba67BB3B6E5bf692251267A3F861 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x39815280F3804a860a09B0FfbcCAF8a0679FF5BA + XT deployed at: 0x6CfA4b8506736dD838DCbEC5187d777801160684 + GT deployed at: 0xa7793d67dcbcc16ef92eD455Bc17594311d58d55 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 01AUG2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 10000000 + Issue FT Fee Ref: 10000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-31JUL2025@01AUG2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xC898Fa3A26CEAcAE25cCffF6003B087948dEDE2a + Market name: WETH/PT-pufETH-26JUN2025@27JUN2025 + Market symbol: WETH/PT-pufETH-26JUN2025@27JUN2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 86400 + FT deployed at: 0x0ad67BB21bE025f9C47ceb0DB3ac490e473Afd9a + XT deployed at: 0x0E960CFde8730DA71e72b52bb1BC8ef4F4F5a9Bb + GT deployed at: 0xAB490460b78c481fdf4d10Ed85378cFa1dd342f1 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 27JUN2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 10000000 + Issue FT Fee Ref: 4000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-PT-pufETH-26JUN2025@27JUN2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 37.958381628 gwei + +Estimated total gas used for script: 3465107 + +Estimated amount required: 0.131529853887854196 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0xdbb2d44c238c459ccb820de886abf721ef6e6941, 0x39815280f3804a860a09b0ffbccaf8a0679ff5ba, 0x6cfa4b8506736dd838dcbec5187d777801160684, 0xa7793d67dcbcc16ef92ed455bc17594311d58d55, 0xc898fa3a26ceacae25ccfff6003b087948dede2a, 0x0ad67bb21be025f9c47ceb0db3ac490e473afd9a, 0x0e960cfde8730da71e72b52bb1bc8ef4f4f5a9bb, 0xab490460b78c481fdf4d10ed85378cfa1dd342f1]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet/deploy-price-feeds-20250508-log.txt b/deployments/eth-mainnet/deploy-price-feeds-20250508-log.txt new file mode 100644 index 0000000..93eed0e --- /dev/null +++ b/deployments/eth-mainnet/deploy-price-feeds-20250508-log.txt @@ -0,0 +1,34 @@ +% ./script.sh eth-mainnet script:DeployPriceFeedsEth_20250508 --broadcast --verify +== Logs == + PriceFeedFactory deployed at 0xcac930B240163fDB71b74514E8FAA113ec0dA844 + pt_sUsde_31JUL2025 price feed address 0x53399c17DbB2Ba67BB3B6E5bf692251267A3F861 + pt_sUsde_31JUL2025 last answer 98096991 + pt_lvlUSD_25SEP2025 price feed address 0x32401387EDCB60CD74E2FCae50B3C542E03B1ec5 + pt_lvlUSD_25SEP2025 last answer 97019308 + cUSDO price feed address 0xf158000de86899b5EB5E6fA3BB78F32A072bD14b + cUSDO last answer 101257254 + pt_cUSDO_19JUN2025 price feed address 0x1B4A4208d6AfD76332206F2Aefd977aeEf108575 + pt_cUSDO_19JUN2025 last answer 98917556 + wstUsr price feed address 0xD14a49eDF484ce994C3dD61c4eF36CC33C96179A + wstUsr last answer 107803645 + pt_wstUSR_25SEP2025 price feed address 0xB94D176656220Ee22CAEA8e5827BE5854cB42035 + pt_wstUSR_25SEP2025 last answer 97198117 + +## Setting up 1 EVM. + +========================== + + +% ./script.sh eth-mainnet script:DeployPriceFeedsEth_20250508_Backup --broadcast --verify +== Logs == + PriceFeedFactory deployed at 0xcac930B240163fDB71b74514E8FAA113ec0dA844 + pt_sUsde_31JUL2025 price feed address 0x28eBF137e6659f9037b2393D7f52D37CD963B51a + pt_sUsde_31JUL2025 last answer 98307229 + wstUsr price feed address 0xc7c005753d649a432EbC858f82B7bDd4338Fa333 + wstUsr last answer 107785311 + pt_wstUSR_25SEP2025 price feed address 0xBA06F387B245aE60289f16FE208867C1eE38934D + pt_wstUSR_25SEP2025 last answer 97181714 + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet/deploy-price-feeds-morpho-20250417-log.txt b/deployments/eth-mainnet/deploy-price-feeds-morpho-20250417-log.txt new file mode 100644 index 0000000..02bf798 --- /dev/null +++ b/deployments/eth-mainnet/deploy-price-feeds-morpho-20250417-log.txt @@ -0,0 +1,21 @@ +% forge script script/deploy/DeployPriceFeedsMorpho.s.sol --rpc-url $ETH_MAINNET_RPC_URL --broadcast --verify +warning: Found unknown config section in foundry.toml: [soldeer] +This notation for profiles has been deprecated and may result in the profile not being registered in future versions. +Please use [profile.soldeer] instead or run `forge config --fix`. +[⠒] Compiling... +No files changed, compilation skipped +Script ran successfully. + +== Logs == + gtusdcf price feed address 0x81195F8A79f6553A4078f89eF87b21a7d3C2855A + gtusdcf last answer 101266087 + mhyETH price feed address 0x0221cd3fA8B1Bea16293fb0cD6B60977d531c931 + mhyETH last answer 161205311756 + mhyETHBackup price feed address 0x00B96F0eBf39158cb4E3F801073966bD6Db7959C + mhyETHBackup last answer 162030447776 + mevUsdcPrime price feed address 0x4cF5F12c6c0D48F0d335DdB25e11cd526EAfD322 + mevUsdcPrime last answer 99992088 + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet/deploy_markets_test_0402_log.txt b/deployments/eth-mainnet/deploy_markets_test_0402_log.txt new file mode 100644 index 0000000..236c256 --- /dev/null +++ b/deployments/eth-mainnet/deploy_markets_test_0402_log.txt @@ -0,0 +1,370 @@ +Running on eth-mainnet... +Deployment type: market +=== Configuration === +Operation: Deployment +Type: market +Network: eth-mainnet +Script: DeployMarket.s.sol +Path: script/deploy/DeployMarket.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Enabled--verify +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting deployment... +Executing: forge script script/deploy/DeployMarket.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify +No files changed, compilation skipped +Script ran successfully. + +== Logs == + ===== Git Info ===== + Git branch: deploy/v1.0.8 + Git commit hash: + 0xf0e7aead33f178cc18e33b5c6e07f406fb95194d + + ===== Block Info ===== + Block number: 22175185 + Block timestamp: 1743524099 + + ===== Address Info ===== + Deplyer: 0x56E3665038C5F0b56Cc7D81aC66C86521274B251 + Deployed at block number: 22175185 + + ===== Market Info - 0 ===== + Market deployed at: 0x4a20DdEB8696b1f542649626889522068cc19438 + Market name: WETH/weETH@30MAY2025 + Market symbol: WETH/weETH@30MAY2025 + Collateral (weETH) address: 0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 + Collateral heartbeat: 21600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x00B210A7f79653A0fe7e2bc31d6Fe3026421195d + XT deployed at: 0x465c30b940E792262Ef65B7Fe7A5bAd3b5b7f034 + GT deployed at: 0xca3F986978ADEf5aA8e4F9e4F3d27f6f4Eb3f47d + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@02APR2025.json + + ===== Market Info - 1 ===== + Market deployed at: 0xC8c3A49b64dB371F96EdC15941e043966297Ea6b + Market name: USDC/wstETH@30MAY2025 + Market symbol: USDC/wstETH@30MAY2025 + Collateral (wstETH) address: 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x164b276057258d81941e97B0a900D4C7B358bCe0 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x19632ff799BA54B54934b52a89964F6cb12D396f + XT deployed at: 0xe459c64a852Df70Ea7D0cc46142A1a0d8BCd4f2A + GT deployed at: 0x9CEA72e4C7Fd1dd0bb2D0AAF98D756B1f85e096D + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@02APR2025.json + + ===== Market Info - 2 ===== + Market deployed at: 0x54ACdb3da45bBDEb1a53e1E3F6DB51C8384c7F9c + Market name: USDC/sUSDe@30MAY2025 + Market symbol: USDC/sUSDe@30MAY2025 + Collateral (sUSDe) address: 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x3ebabb95e4276DD2850666a95037f5EE3bb798Bb + XT deployed at: 0xb7d4329b11Dff286890F4d7e5b10763E09E8804C + GT deployed at: 0x28C108FD44B2E58DD9B07CBE453c0BCF836b8CB7 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@02APR2025.json + + ===== Market Info - 3 ===== + Market deployed at: 0xf2F9b0fDD5D22e574421A7Ee0E29e410E63C70A9 + Market name: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Market symbol: USDC/PT-sUSDE-29MAY2025@30MAY2025 + Collateral (PT-sUSDE-29MAY2025) address: 0xb7de5dFCb74d25c2f21841fbd6230355C50d9308 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x594Db033Ade81E0C8182B66d2B07fbc97452d1FA + XT deployed at: 0x544786112d542910634109BcCEF84C3Deb1b65e0 + GT deployed at: 0x81CAc518B14B28570C667A143F801bF2e05b6BEe + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-29MAY2025@02APR2025.json + + ===== Market Info - 4 ===== + Market deployed at: 0x10aCD317ebf3F65e30c72720D89c55B7C68a9628 + Market name: USDC/USUALUSDC+@30MAY2025 + Market symbol: USDC/USUALUSDC+@30MAY2025 + Collateral (USUALUSDC+) address: 0xd63070114470f685b75B74D60EEc7c1113d33a3D + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2a2a0e32c54670045256EBcA681887E32e689E97 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xA03710F73585cb5458F43739624611633Bf24173 + XT deployed at: 0x80525c75690102bb024BcEd8bE81D18A56172EC0 + GT deployed at: 0xe2e5403923B0421FA5a9D28c1012aeAFfc820f02 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-USUALUSDC+@02APR2025.json + + ===== Market Info - 5 ===== + Market deployed at: 0x49913B7Bd178e21FaC84C3dED810Ff4CcDcb8403 + Market name: WETH/MCwETH@30MAY2025 + Market symbol: WETH/MCwETH@30MAY2025 + Collateral (MCwETH) address: 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x8CDe48E20b5d77C3ec0fbCbf50d0C78B2DE11264 + XT deployed at: 0x8b596614c9ac30bd9DF615c3C18F0f05a97F0779 + GT deployed at: 0xBA03824B38E83B7CBAF3Fcb5aF02EF8342A110d8 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-MCwETH@02APR2025.json + + ===== Market Info - 6 ===== + Market deployed at: 0x69E1A695Ee24e7BcFc55d2dA7DfD479E4C7Eb6A3 + Market name: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Market symbol: pufETH/PT-pufETH-26JUN2025@30MAY2025 + Collateral (PT-pufETH-26JUN2025) address: 0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D + Underlying (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Collateral price feed address: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 + Collateral heartbeat: 86400 + Underlying price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Underlying heartbeat: 86400 + FT deployed at: 0xc7d5476d361C8d0E5c0478EA320431AD4a49A558 + XT deployed at: 0xe1710D5449241ce311Bfcefb5272594ECD930ec0 + GT deployed at: 0x4B87E9281de9573f2025565E632bdb8F136766E5 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@02APR2025.json + + ===== Market Info - 7 ===== + Market deployed at: 0x9dA149D4Bc9eF4e6Eb1D131E837270f76dc62e79 + Market name: USDC/eUSDe@29MAY2025 + Market symbol: USDC/eUSDe@29MAY2025 + Collateral (eUSDe) address: 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD667a61e822564e1399f73196c73B2C41bCBda69 + XT deployed at: 0x2348B91F2037799d6AE604D792101534461DB06E + GT deployed at: 0x1aE5482Db2883e1ae8CDBFDbaE95539266F1bF32 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@02APR2025.json + + ===== Market Info - 8 ===== + Market deployed at: 0x9cde69Ea28c9125060F86eB982305BafaE57f585 + Market name: WETH/pufETH@30MAY2025 + Market symbol: WETH/pufETH@30MAY2025 + Collateral (pufETH) address: 0xD9A442856C234a39a81a089C06451EBAa4306a72 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 + Collateral heartbeat: 86400 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x4bDD2b0f934EECCE01A8Fc47E3762Ce86C9D061F + XT deployed at: 0x63B96518024b49C8F16104fDFd9d94a79A3d185C + GT deployed at: 0xa78bE568bc5ec42C8E41734dADcb86D3dde73af3 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@02APR2025.json + + ===== Market Info - 9 ===== + Market deployed at: 0x565656a354F6C2953EB2D00DC7e2e0Ab815e19E7 + Market name: USDC/WBTC@30MAY2025 + Market symbol: USDC/WBTC@30MAY2025 + Collateral (WBTC) address: 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c + Collateral heartbeat: 3600 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0x1184866Ed937F4605efc100c1f18E028F7CBDD86 + XT deployed at: 0x3F56b53953adf3a65f5Bb8E8Dce1C4926e1D629c + GT deployed at: 0x315f180e74247E01ca0377244Eb6b6D1c7444452 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@02APR2025.json + + ===== Market Info - 10 ===== + Market deployed at: 0x0ed76A80D639E7Bf88524b63429bB841c1633E60 + Market name: USDC/cbBTC@30MAY2025 + Market symbol: USDC/cbBTC@30MAY2025 + Collateral (cbBTC) address: 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf + Underlying (USDC) address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + Collateral price feed address: 0x2665701293fCbEB223D11A08D826563EDcCE423A + Collateral heartbeat: 86400 + Underlying price feed address: 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6 + Underlying heartbeat: 86400 + FT deployed at: 0xD4771df4a0f6338f521512A1651D8DB7EF5Af633 + XT deployed at: 0x4bbc10317e5b70B6B491836F5B2b496EE35f5E31 + GT deployed at: 0xFF601c3788236F231a8771cACBbB3087D0Ee7A2c + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 2000000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@02APR2025.json + + ===== Market Info - 11 ===== + Market deployed at: 0x8c07c10a0a3530a9fB64c65f109A32F7B4b2DB80 + Market name: WETH/gtWETH@30MAY2025 + Market symbol: WETH/gtWETH@30MAY2025 + Collateral (gtWETH) address: 0x2371e134e3455e0593363cBF89d3b6cf53740618 + Underlying (WETH) address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 + Collateral price feed address: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d + Collateral heartbeat: 3600 + Underlying price feed address: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 + Underlying heartbeat: 3600 + FT deployed at: 0x0469A60F8fbc0c35c4D1D965a50A6Bd29c9dAB8C + XT deployed at: 0xE292927A017d58823957A83ea5EFeAF9C37D6F94 + GT deployed at: 0x7AdE4961Fccba087E8b4De84E8be61098Daf0230 + + Treasurer: 0x719e77027952929ed3060dbFFC5D43EC50c1cf79 + Maturity: 02APR2025 + Salt: 0 + Lend Taker Fee Ratio: 2000000 + Lend Maker Fee Ratio: 2000000 + Borrow Taker Fee Ratio: 3000000 + Borrow Maker Fee Ratio: 3000000 + Mint GT Fee Ratio: 1000000 + Issue FT Fee Ref: 400000 + Market config written to: /Users/vincent/Documents/ts-codes/termmax-contract/deployments/eth-mainnet/eth-mainnet-market-WETH-gtWETH@02APR2025.json + + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 5.079885262 gwei + +Estimated total gas used for script: 17308392 + +Estimated amount required: 0.087924645429718704 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. + +We haven't found any matching bytecode for the following contracts: [0x4a20ddeb8696b1f542649626889522068cc19438, 0x00b210a7f79653a0fe7e2bc31d6fe3026421195d, 0x465c30b940e792262ef65b7fe7a5bad3b5b7f034, 0xca3f986978adef5aa8e4f9e4f3d27f6f4eb3f47d, 0xc8c3a49b64db371f96edc15941e043966297ea6b, 0x19632ff799ba54b54934b52a89964f6cb12d396f, 0xe459c64a852df70ea7d0cc46142a1a0d8bcd4f2a, 0x9cea72e4c7fd1dd0bb2d0aaf98d756b1f85e096d, 0x54acdb3da45bbdeb1a53e1e3f6db51c8384c7f9c, 0x3ebabb95e4276dd2850666a95037f5ee3bb798bb, 0xb7d4329b11dff286890f4d7e5b10763e09e8804c, 0x28c108fd44b2e58dd9b07cbe453c0bcf836b8cb7, 0xf2f9b0fdd5d22e574421a7ee0e29e410e63c70a9, 0x594db033ade81e0c8182b66d2b07fbc97452d1fa, 0x544786112d542910634109bccef84c3deb1b65e0, 0x81cac518b14b28570c667a143f801bf2e05b6bee, 0x10acd317ebf3f65e30c72720d89c55b7c68a9628, 0xa03710f73585cb5458f43739624611633bf24173, 0x80525c75690102bb024bced8be81d18a56172ec0, 0xe2e5403923b0421fa5a9d28c1012aeaffc820f02, 0x49913b7bd178e21fac84c3ded810ff4ccdcb8403, 0x8cde48e20b5d77c3ec0fbcbf50d0c78b2de11264, 0x8b596614c9ac30bd9df615c3c18f0f05a97f0779, 0xba03824b38e83b7cbaf3fcb5af02ef8342a110d8, 0x69e1a695ee24e7bcfc55d2da7dfd479e4c7eb6a3, 0xc7d5476d361c8d0e5c0478ea320431ad4a49a558, 0xe1710d5449241ce311bfcefb5272594ecd930ec0, 0x4b87e9281de9573f2025565e632bdb8f136766e5, 0x9da149d4bc9ef4e6eb1d131e837270f76dc62e79, 0xd667a61e822564e1399f73196c73b2c41bcbda69, 0x2348b91f2037799d6ae604d792101534461db06e, 0x1ae5482db2883e1ae8cdbfdbae95539266f1bf32, 0x9cde69ea28c9125060f86eb982305bafae57f585, 0x4bdd2b0f934eecce01a8fc47e3762ce86c9d061f, 0x63b96518024b49c8f16104fdfd9d94a79a3d185c, 0xa78be568bc5ec42c8e41734dadcb86d3dde73af3, 0x565656a354f6c2953eb2d00dc7e2e0ab815e19e7, 0x1184866ed937f4605efc100c1f18e028f7cbdd86, 0x3f56b53953adf3a65f5bb8e8dce1c4926e1d629c, 0x315f180e74247e01ca0377244eb6b6d1c7444452, 0x0ed76a80d639e7bf88524b63429bb841c1633e60, 0xd4771df4a0f6338f521512a1651d8db7ef5af633, 0x4bbc10317e5b70b6b491836f5b2b496ee35f5e31, 0xff601c3788236f231a8771cacbbb3087d0ee7a2c, 0x8c07c10a0a3530a9fb64c65f109a32f7b4b2db80, 0x0469a60f8fbc0c35c4d1d965a50a6bd29c9dab8c, 0xe292927a017d58823957a83ea5efeaf9c37d6f94, 0x7ade4961fccba087e8b4de84e8be61098daf0230]. + +This may occur when resuming a verification, but the underlying source code or compiler version has changed. +## +Start verification for (0) contracts +All (0) contracts were verified! + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployMarket.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployMarket.s.sol/1/run-latest.json + +[SUCCESS] market deployment to eth-mainnet completed successfully! diff --git a/deployments/eth-mainnet/eth-mainnet-V2-adapters-03JUN2025.json b/deployments/eth-mainnet/eth-mainnet-V2-adapters-03JUN2025.json new file mode 100644 index 0000000..cf31edf --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-V2-adapters-03JUN2025.json @@ -0,0 +1,26 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1748946155", + "dateString": "03JUN2025", + "gitBranch": "deploy/v1.0.9", + "gitCommitHash": "0x0x0489591746b16bb969ea123423e618e76b7e2dcb", + "blockInfo": { + "number": "22623501", + "timestamp": "1748946155" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x0000000000000000000000000000000000000000", + "accessManager": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "router": "0xC47591F5c023e44931c78D5A993834875b79FB11", + "contracts": { + "odosV2Adapter": "0xDDBDF3B7e314A806aC296E6932135Db026B11a85", + "pendleSwapV3Adapter": "0x01D3BAb30674740b3d3A323f0Bac067a82c4FC9c", + "uniswapV3Adapter": "0xCCf64e1A69273ACb15eAd25BC60D436a047F404f", + "erc4626VaultAdapter": "0xb57dd1092390eDd37EC91e86d11BA530D748D63C" + }, + "routerAddresses": { + "uniswapV3Router": "0xE592427A0AEce92De3Edee1F18E0157C05861564", + "odosV2Router": "0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559", + "pendleSwapV3Router": "0x888888888889758F76e7103c6CbF23ABbF58F946" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-access-manager.json b/deployments/eth-mainnet/eth-mainnet-access-manager.json new file mode 100644 index 0000000..a1a5b6a --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743155675", + "gitBranch": "deploy/v1.0.5", + "gitCommitHash": "0x0x65c418860c22aecb27054e7a8c3207a4f87ad6af", + "blockInfo": { + "number": "22144647", + "timestamp": "1743155675" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "accessManager": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-accumulated.json b/deployments/eth-mainnet/eth-mainnet-accumulated.json new file mode 100644 index 0000000..baeda6a --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-accumulated.json @@ -0,0 +1,743 @@ +{ + "configNum": "18", + "configs": { + "configs_0": { + "salt": 0, + "collateralCapForGt": "594347733812822000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "priceFeedAddr": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "backupPriceFeedAddr": "0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4", + "heartBeat": "86400", + "name": "Wrapped ETH", + "symbol": "WETH", + "decimals": "18", + "initialPrice": "158359710000" + }, + "collateralConfig": { + "tokenAddr": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", + "priceFeedAddr": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "backupPriceFeedAddr": "0x24CFEf73A30b2CEEC23d3659fA98B491D996F152", + "heartBeat": "86400", + "name": "Wrapped eETH", + "symbol": "weETH", + "decimals": "18", + "initialPrice": "168251670000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "WETH/weETH@30MAY2025", + "marketSymbol": "WETH/weETH@30MAY2025" + }, + "configs_1": { + "salt": 0, + "collateralCapForGt": "527664486788797000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "85000000", + "maxLtv": "81000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "priceFeedAddr": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "backupPriceFeedAddr": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400", + "name": "Wrapped liquid staked Ether 2.0", + "symbol": "wstETH", + "decimals": "18", + "initialPrice": "189514360000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/wstETH@30MAY2025", + "marketSymbol": "USDC/wstETH@30MAY2025" + }, + "configs_2": { + "salt": 0, + "collateralCapForGt": "862068965517241000000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "90000000", + "maxLtv": "86000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "priceFeedAddr": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "backupPriceFeedAddr": "0xb99D174ED06c83588Af997c8859F93E83dD4733f", + "heartBeat": "86400", + "name": "Staked USDe", + "symbol": "sUSDe", + "decimals": "18", + "initialPrice": "115999999", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/sUSDe@30MAY2025", + "marketSymbol": "USDC/sUSDe@30MAY2025" + }, + "configs_3": { + "salt": 0, + "collateralCapForGt": "1025010250102500000000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "90000000", + "maxLtv": "86000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "priceFeedAddr": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "backupPriceFeedAddr": "0x333651c5710Fc8C4fe65E5D15E5639348F267D7c", + "heartBeat": "86400", + "name": "PT Ethena sUSDE 29MAY2025", + "symbol": "PT-sUSDE-29MAY2025", + "decimals": "18", + "initialPrice": "97560000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025" + }, + "configs_4": { + "salt": 0, + "collateralCapForGt": "952380952380952000000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0xd63070114470f685b75B74D60EEc7c1113d33a3D", + "priceFeedAddr": "0xF8f79b5b527e2cb3900956eB0D17A4D4aA6ae220", + "backupPriceFeedAddr": "0xF8f79b5b527e2cb3900956eB0D17A4D4aA6ae220", + "heartBeat": "86400", + "name": "USUAL Boosted USDC", + "symbol": "USUALUSDC+", + "decimals": "18", + "initialPrice": "105000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/USUALUSDC+@30MAY2025", + "marketSymbol": "USDC/USUALUSDC+@30MAY2025" + }, + "configs_5": { + "salt": 0, + "collateralCapForGt": "613081294525419000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "priceFeedAddr": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "backupPriceFeedAddr": "0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4", + "heartBeat": "86400", + "name": "Wrapped ETH", + "symbol": "WETH", + "decimals": "18", + "initialPrice": "158359710000" + }, + "collateralConfig": { + "tokenAddr": "0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8", + "priceFeedAddr": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", + "backupPriceFeedAddr": "0x3b82860EC8815Fc2A1dcC53580bd647b0042C93e", + "heartBeat": "86400", + "name": "MEV Capital wETH", + "symbol": "MCwETH", + "decimals": "18", + "initialPrice": "163110510000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "WETH/MCwETH@30MAY2025", + "marketSymbol": "WETH/MCwETH@30MAY2025" + }, + "configs_6": { + "salt": 0, + "collateralCapForGt": "678858023394089000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "92000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "priceFeedAddr": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "backupPriceFeedAddr": "0x5F08C227deAe74D8e5Ec0d743FB0744AB1B6c984", + "heartBeat": "86400", + "name": "pufETH", + "symbol": "pufETH", + "decimals": "18", + "initialPrice": "183668000000" + }, + "collateralConfig": { + "tokenAddr": "0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D", + "priceFeedAddr": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "backupPriceFeedAddr": "0x5D18F4cB3c95568F315cb1C1eF48261a5A4D6053", + "heartBeat": "86400", + "name": "PT Puffer ETH 26JUN2025", + "symbol": "PT-pufETH-26JUN2025", + "decimals": "18", + "initialPrice": "147306210000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025" + }, + "configs_7": { + "salt": 0, + "collateralCapForGt": "1000000000000000000000000", + "marketConfig": { + "maturity": "1748476800", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "92000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F", + "priceFeedAddr": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "backupPriceFeedAddr": "0x6B09d473dB784D840E307Cb3Da63CbA79D300CAc", + "heartBeat": "86400", + "name": "Ethereal Pre-deposit Vault", + "symbol": "eUSDe", + "decimals": "18", + "initialPrice": "100000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/eUSDe@29MAY2025", + "marketSymbol": "USDC/eUSDe@29MAY2025" + }, + "configs_8": { + "salt": 0, + "collateralCapForGt": "604886995192922000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "priceFeedAddr": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "backupPriceFeedAddr": "0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4", + "heartBeat": "86400", + "name": "Wrapped ETH", + "symbol": "WETH", + "decimals": "18", + "initialPrice": "158359710000" + }, + "collateralConfig": { + "tokenAddr": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "priceFeedAddr": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "backupPriceFeedAddr": "0x5F08C227deAe74D8e5Ec0d743FB0744AB1B6c984", + "heartBeat": "86400", + "name": "pufETH", + "symbol": "pufETH", + "decimals": "18", + "initialPrice": "165320140000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "WETH/pufETH@30MAY2025", + "marketSymbol": "WETH/pufETH@30MAY2025" + }, + "configs_9": { + "salt": 0, + "collateralCapForGt": "1191418262", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "85000000", + "maxLtv": "81000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "priceFeedAddr": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "backupPriceFeedAddr": "0xAB7f623fb2F6fea6601D4350FA0E2290663C28Fc", + "heartBeat": "86400", + "name": "Wrapped BTC", + "symbol": "WBTC", + "decimals": "8", + "initialPrice": "8393358000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/WBTC@30MAY2025", + "marketSymbol": "USDC/WBTC@30MAY2025" + }, + "configs_10": { + "salt": 0, + "collateralCapForGt": "1191418262", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "85000000", + "maxLtv": "81000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", + "priceFeedAddr": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "backupPriceFeedAddr": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "heartBeat": "86400", + "name": "Coinbase Wrapped BTC", + "symbol": "cbBTC", + "decimals": "8", + "initialPrice": "8393358000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/cbBTC@30MAY2025", + "marketSymbol": "USDC/cbBTC@30MAY2025" + }, + "configs_11": { + "salt": 0, + "collateralCapForGt": "617578223336119000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "priceFeedAddr": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "backupPriceFeedAddr": "0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4", + "heartBeat": "86400", + "name": "Wrapped ETH", + "symbol": "WETH", + "decimals": "18", + "initialPrice": "158359710000" + }, + "collateralConfig": { + "tokenAddr": "0x2371e134e3455e0593363cBF89d3b6cf53740618", + "priceFeedAddr": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", + "backupPriceFeedAddr": "0x3A44454F173b082F1dbbA9587b046Dc90B2F0AE7", + "heartBeat": "86400", + "name": "Gauntlet WETH Prime", + "symbol": "gtWETH", + "decimals": "18", + "initialPrice": "161922810000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "WETH/gtWETH@30MAY2025", + "marketSymbol": "WETH/gtWETH@30MAY2025" + }, + "configs_12": { + "salt": 0, + "collateralCapForGt": "1025010250102500000000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "96000000", + "maxLtv": "94000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "priceFeedAddr": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "backupPriceFeedAddr": "0xb99D174ED06c83588Af997c8859F93E83dD4733f", + "heartBeat": "86400", + "name": "Staked USDe", + "symbol": "sUSDe", + "decimals": "18", + "initialPrice": "115999999" + }, + "collateralConfig": { + "tokenAddr": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "priceFeedAddr": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "backupPriceFeedAddr": "0x333651c5710Fc8C4fe65E5D15E5639348F267D7c", + "heartBeat": "86400", + "name": "PT Ethena sUSDE 29MAY2025", + "symbol": "PT-sUSDE-29MAY2025", + "decimals": "18", + "initialPrice": "97560000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "sUSDe/PT-sUSDE-29MAY2025@30MAY2025", + "marketSymbol": "sUSDe/PT-sUSDE-29MAY2025@30MAY2025" + }, + "configs_13": { + "salt": 0, + "collateralCapForGt": "941442289587648000000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "90000000", + "maxLtv": "86000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0x7C1156E515aA1A2E851674120074968C905aAF37", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "Level USD", + "symbol": "lvlUSD", + "decimals": "18", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x4737d9b4592b40d51e110b94c9c043c6654067ae", + "priceFeedAddr": "0x3Bc7dD457901A41509fc0Bd47Dc3Da42D45Ce030", + "backupPriceFeedAddr": "0x3Bc7dD457901A41509fc0Bd47Dc3Da42D45Ce030", + "heartBeat": "86400", + "name": "Staked lvlUSD", + "symbol": "slvlUSD", + "decimals": "18", + "initialPrice": "106220000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "lvlUSD/slvlUSD@30MAY2025", + "marketSymbol": "lvlUSD/slvlUSD@30MAY2025" + }, + "configs_14": { + "salt": 0, + "collateralCapForGt": "1014919313914540000000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "90000000", + "maxLtv": "86000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x9BcA74F805AB0a22DDD0886dB0942199a0feBa71", + "priceFeedAddr": "0x57eAfDF2c9B47425042Be735ff47dea7Ef965726", + "backupPriceFeedAddr": "0x57eAfDF2c9B47425042Be735ff47dea7Ef965726", + "heartBeat": "86400", + "name": "PT lvlUSD 29MAY2025", + "symbol": "PT-lvlUSD-29MAY2025", + "decimals": "18", + "initialPrice": "98530000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/PT-lvlUSD-29MAY2025@30MAY2025", + "marketSymbol": "USDC/PT-lvlUSD-29MAY2025@30MAY2025" + }, + "configs_15": { + "salt": 0, + "collateralCapForGt": "1000000000000000000000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0xf1fd8AC6346eC7BC4116Ba7aDc81102B2BC4C52D", + "priceFeedAddr": "0x4cF5F12c6c0D48F0d335DdB25e11cd526EAfD322", + "backupPriceFeedAddr": "0x4cF5F12c6c0D48F0d335DdB25e11cd526EAfD322", + "heartBeat": "86400", + "name": "MEV Capital USDC Prime", + "symbol": "MC_USDCP", + "decimals": "18", + "initialPrice": "100000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/MC_USDCP@30MAY2025", + "marketSymbol": "USDC/MC_USDCP@30MAY2025" + }, + "configs_16": { + "salt": 0, + "collateralCapForGt": "1000000000000000000000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0xc582F04d8a82795aa2Ff9c8bb4c1c889fe7b754e", + "priceFeedAddr": "0x81195F8A79f6553A4078f89eF87b21a7d3C2855A", + "backupPriceFeedAddr": "0x81195F8A79f6553A4078f89eF87b21a7d3C2855A", + "heartBeat": "86400", + "name": "Gauntlet USDC Frontier", + "symbol": "gtusdcf", + "decimals": "18", + "initialPrice": "100000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/gtusdcf@30MAY2025", + "marketSymbol": "USDC/gtusdcf@30MAY2025" + }, + "configs_17": { + "salt": 0, + "collateralCapForGt": "624356074116256000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "priceFeedAddr": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "backupPriceFeedAddr": "0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4", + "heartBeat": "86400", + "name": "Wrapped ETH", + "symbol": "WETH", + "decimals": "18", + "initialPrice": "158359710000" + }, + "collateralConfig": { + "tokenAddr": "0x701907283a57FF77E255C3f1aAD790466B8CE4ef", + "priceFeedAddr": "0x0221cd3fA8B1Bea16293fb0cD6B60977d531c931", + "backupPriceFeedAddr": "0x00B96F0eBf39158cb4E3F801073966bD6Db7959C", + "heartBeat": "86400", + "name": "IndexCoop hyETH", + "symbol": "mhyETH", + "decimals": "18", + "initialPrice": "160165020000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "WETH/mhyETH@30MAY2025", + "marketSymbol": "WETH/mhyETH@30MAY2025" + } + } + } \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-core-before-change-pendle-swap-adapter.json b/deployments/eth-mainnet/eth-mainnet-core-before-change-pendle-swap-adapter.json new file mode 100644 index 0000000..34b5474 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-core-before-change-pendle-swap-adapter.json @@ -0,0 +1,25 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743518639", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x30f0c30e4edf518e2bf6700837dad2a7624d35df", + "blockInfo": { + "number": "22174730", + "timestamp": "1743518639" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x37Ba9934aAbA7a49cC29d0952C6a91d7c7043dbc", + "vaultFactory": "0x01D8C1e0584751085a876892151Bf8490e862E3E", + "oracleAggregator": "0xE3a31690392E8E18DC3d862651C079339E2c1ADE", + "router": "0xC47591F5c023e44931c78D5A993834875b79FB11", + "swapAdapter": { + "uniswapV3Adapter": "0x34F7b52b0d33959C8351eF95F3523C89b6123C0b", + "odosV2Adapter": "0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779", + "pendleSwapV3Adapter": "0x0B30251FA697A39Fd41813b267b50F03414E82da", + "ERC4626VaultAdapter": "0x85ce30537c14EFB66B673f284bEa7c28351244F6" + }, + "marketViewer": "0x74Dfb95Ae623123ecf82Ba841985fB460bB9d45D" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-core-before-change-vault-factory.json b/deployments/eth-mainnet/eth-mainnet-core-before-change-vault-factory.json new file mode 100644 index 0000000..34b5474 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-core-before-change-vault-factory.json @@ -0,0 +1,25 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743518639", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x30f0c30e4edf518e2bf6700837dad2a7624d35df", + "blockInfo": { + "number": "22174730", + "timestamp": "1743518639" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x37Ba9934aAbA7a49cC29d0952C6a91d7c7043dbc", + "vaultFactory": "0x01D8C1e0584751085a876892151Bf8490e862E3E", + "oracleAggregator": "0xE3a31690392E8E18DC3d862651C079339E2c1ADE", + "router": "0xC47591F5c023e44931c78D5A993834875b79FB11", + "swapAdapter": { + "uniswapV3Adapter": "0x34F7b52b0d33959C8351eF95F3523C89b6123C0b", + "odosV2Adapter": "0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779", + "pendleSwapV3Adapter": "0x0B30251FA697A39Fd41813b267b50F03414E82da", + "ERC4626VaultAdapter": "0x85ce30537c14EFB66B673f284bEa7c28351244F6" + }, + "marketViewer": "0x74Dfb95Ae623123ecf82Ba841985fB460bB9d45D" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-core.json b/deployments/eth-mainnet/eth-mainnet-core.json new file mode 100644 index 0000000..1219632 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-core.json @@ -0,0 +1,25 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1743518639", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x30f0c30e4edf518e2bf6700837dad2a7624d35df", + "blockInfo": { + "number": "22174730", + "timestamp": "1743518639" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "contracts": { + "factory": "0x37Ba9934aAbA7a49cC29d0952C6a91d7c7043dbc", + "vaultFactory": "0x4778CBf91d8369843281c8f5a2D7b56d1420dFF5", + "oracleAggregator": "0xE3a31690392E8E18DC3d862651C079339E2c1ADE", + "router": "0xC47591F5c023e44931c78D5A993834875b79FB11", + "swapAdapter": { + "uniswapV3Adapter": "0x34F7b52b0d33959C8351eF95F3523C89b6123C0b", + "odosV2Adapter": "0x2aFEf28a8Ab57d2F5A5663Ef69351e9d3abf1779", + "pendleSwapV3Adapter": "0x0B30251FA697A39Fd41813b267b50F03414E82da", + "ERC4626VaultAdapter": "0x85ce30537c14EFB66B673f284bEa7c28351244F6" + }, + "marketViewer": "0x74Dfb95Ae623123ecf82Ba841985fB460bB9d45D" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-USDC-MC_PTs@15SEP2025.json b/deployments/eth-mainnet/eth-mainnet-market-USDC-MC_PTs@15SEP2025.json new file mode 100644 index 0000000..6fb2346 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-USDC-MC_PTs@15SEP2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22635749", + "timestamp": "1749094211" + }, + "market": "0xce37de7F6b2d9171F6B9Fd3B4c52FAc7895Dd18a", + "collateral": { + "address": "0xd41830d88dfD08678b0B886E0122193d54b02Acc", + "symbol": "MC_PTs", + "priceFeed": "0xe594f0E0013d304c63012F3C14fCf523Fd98613D", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xdf974145c8b86405dd8436b993169A3DABA7448e", + "xt": "0xcED405D1a4c0e71Ba4C2bA43b28e7e6bB415DF1c", + "gt": "0xbCc70FfC8373DA483DC384F69e45930D1b161699" + }, + "config": { + "marketSymbol": "USDC/MC_PTs@15SEP2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "15SEP2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "6000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-USDC-MC_USDCP@29AUG2025.json b/deployments/eth-mainnet/eth-mainnet-market-USDC-MC_USDCP@29AUG2025.json new file mode 100644 index 0000000..c8c9437 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-USDC-MC_USDCP@29AUG2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22565662", + "timestamp": "1748246735" + }, + "market": "0xeBa58Eb4dAf0b89F7669314EE783Dc0243801E83", + "collateral": { + "address": "0xf1fd8AC6346eC7BC4116Ba7aDc81102B2BC4C52D", + "symbol": "MC_USDCP", + "priceFeed": "0x4cF5F12c6c0D48F0d335DdB25e11cd526EAfD322", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x131C0d3dF32680aFB388736E6a2E14a42c75E6CE", + "xt": "0xf237F81Ed834Ce38c5994b969252b04A8C15B39d", + "gt": "0x4327608EB0D183846ab583eFa02a5C2f3B175416" + }, + "config": { + "marketSymbol": "USDC/MC_USDCP@29AUG2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "29AUG2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "6000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-USDC-MC_USDCP@30MAY2025.json b/deployments/eth-mainnet/eth-mainnet-market-USDC-MC_USDCP@30MAY2025.json new file mode 100644 index 0000000..d1f41c8 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-USDC-MC_USDCP@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22286356", + "timestamp": "1744864451" + }, + "market": "0xf4924D6189552ae5A7818088dA6f23Bd33281C1b", + "collateral": { + "address": "0xf1fd8AC6346eC7BC4116Ba7aDc81102B2BC4C52D", + "symbol": "MC_USDCP", + "priceFeed": "0x4cF5F12c6c0D48F0d335DdB25e11cd526EAfD322", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xe7b3c858FF8031DC6c84D899aEeC343c89A246e0", + "xt": "0x2568d2B892b5c761e1155F4f1c05E5b61961f126", + "gt": "0x5C4db8DB0CA1d040e7fD6FB2AfAA81032df0a4f7" + }, + "config": { + "marketSymbol": "USDC/MC_USDCP@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-USDS-14AUG2025@15AUG2025.json b/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-USDS-14AUG2025@15AUG2025.json new file mode 100644 index 0000000..a04733a --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-USDS-14AUG2025@15AUG2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22573449", + "timestamp": "1748340791" + }, + "market": "0x485305178358b0c367802FC2DcdAdDa5D079e848", + "collateral": { + "address": "0xFfEc096c087C13Cc268497B89A613cACE4DF9A48", + "symbol": "PT-USDS-14AUG2025", + "priceFeed": "0x4599f532E03458017Fa55F7DCF7A296267637B74", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x1e9a8e3eB8EDb5c1448ce1Aa837807D20eb07830", + "xt": "0xC3853fCFb3F831C1dbE00552C54500e50c6ADd65", + "gt": "0x268cC19Da828606E9DacDAD95a38c6C2B619fc65" + }, + "config": { + "marketSymbol": "USDC/PT-USDS-14AUG2025@15AUG2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "15AUG2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "6000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-cUSDO-19JUN2025@20JUN2025.json b/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-cUSDO-19JUN2025@20JUN2025.json new file mode 100644 index 0000000..dc54d85 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-cUSDO-19JUN2025@20JUN2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22451097", + "timestamp": "1746857087" + }, + "market": "0xCE511791715D1A84cD2f7BfA279F92c187bb9d93", + "collateral": { + "address": "0x933B9FfEE0Ad3Ef8E4DBb52688ea905826D73755", + "symbol": "PT-cUSDO-19JUN2025", + "priceFeed": "0x1B4A4208d6AfD76332206F2Aefd977aeEf108575", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x89D6CD335090d67E6A18A63F97b55d7d177D2A1B", + "xt": "0xC1A89e8c63f5162e78f339F138f3585F4372ece0", + "gt": "0xD08C49be9063512c49DC113f1F7C00cD2519c654" + }, + "config": { + "marketSymbol": "USDC/PT-cUSDO-19JUN2025@20JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "20JUN2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "10000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-lvlUSD-25SEP2025@25JUL2025.json b/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-lvlUSD-25SEP2025@25JUL2025.json new file mode 100644 index 0000000..54ec566 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-lvlUSD-25SEP2025@25JUL2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22451097", + "timestamp": "1746857087" + }, + "market": "0xd017E469d22AB7FfB097b9aA329391874954523b", + "collateral": { + "address": "0x207F7205fd6c4b602Fa792C8b2B60e6006D4a0b8", + "symbol": "PT-lvlUSD-25SEP2025", + "priceFeed": "0x32401387EDCB60CD74E2FCae50B3C542E03B1ec5", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xc53C94AaeECc2f58aC64f97eF26F6947B8a1fa49", + "xt": "0x13Dd004a37cD8E35ECEA7379Ab45BD03c1F4E249", + "gt": "0x022E7d8585f9214bBE29077501Ce938e552F8D5e" + }, + "config": { + "marketSymbol": "USDC/PT-lvlUSD-25SEP2025@25JUL2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "25JUL2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "10000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-lvlUSD-25SEP2025@26SEP2025.json b/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-lvlUSD-25SEP2025@26SEP2025.json new file mode 100644 index 0000000..591322e --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-lvlUSD-25SEP2025@26SEP2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22451097", + "timestamp": "1746857087" + }, + "market": "0x7526D036cDDbD3bdFDd8370D75304b822740b291", + "collateral": { + "address": "0x207F7205fd6c4b602Fa792C8b2B60e6006D4a0b8", + "symbol": "PT-lvlUSD-25SEP2025", + "priceFeed": "0x32401387EDCB60CD74E2FCae50B3C542E03B1ec5", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x51Ae9eF7395A46E2861fE6b93F97728f9595e6e5", + "xt": "0xA95cDaaC1Bf0aF025CEd0F259ac74cdec7503450", + "gt": "0x6fA797c9675880654f098B554AE5B9CFdd6B2310" + }, + "config": { + "marketSymbol": "USDC/PT-lvlUSD-25SEP2025@26SEP2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "26SEP2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "10000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-lvlUSD-29MAY2025@14APR2025.json b/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-lvlUSD-29MAY2025@14APR2025.json new file mode 100644 index 0000000..e3a396b --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-lvlUSD-29MAY2025@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22266244", + "timestamp": "1744621823" + }, + "market": "0x305349b7D1Deba03950D71Ae1C8673cDA1463116", + "collateral": { + "address": "0x9BcA74F805AB0a22DDD0886dB0942199a0feBa71", + "symbol": "PT-lvlUSD-29MAY2025", + "priceFeed": "0x57eAfDF2c9B47425042Be735ff47dea7Ef965726", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x9a52c9303914B68692380d8bFF20F981BD2fF47B", + "xt": "0x4953dD3c3cADA884Ae07eB91E51aa2FC5EC70E35", + "gt": "0x35Ba6CF0ac6b1a1D9D44ec5A479b2602D12Ad690" + }, + "config": { + "marketSymbol": "USDC/PT-lvlUSD-29MAY2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-lvlUSD-29MAY2025@30MAY2025.json b/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-lvlUSD-29MAY2025@30MAY2025.json new file mode 100644 index 0000000..e3757f8 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-lvlUSD-29MAY2025@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22266137", + "timestamp": "1744620539" + }, + "market": "0x2524D9a55C2D18A3F257A7F67AfD552B285de34E", + "collateral": { + "address": "0x9BcA74F805AB0a22DDD0886dB0942199a0feBa71", + "symbol": "PT-lvlUSD-29MAY2025", + "priceFeed": "0x57eAfDF2c9B47425042Be735ff47dea7Ef965726", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x3448d6883c7762ed95f59b4A9780b07981b6afee", + "xt": "0xfFD2743Ca5FCDd97b690C33434ef456be9885D20", + "gt": "0x581577E0b27Fc695B21089A08be962Ae3F60aa2f" + }, + "config": { + "marketSymbol": "USDC/PT-lvlUSD-29MAY2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-mMEV-31JUL2025@01AUG2025.json b/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-mMEV-31JUL2025@01AUG2025.json new file mode 100644 index 0000000..9fe6208 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-mMEV-31JUL2025@01AUG2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22482505", + "timestamp": "1747239083" + }, + "market": "0x08d6E7D4F49f6e34878a6f35DB96F3130c43245F", + "collateral": { + "address": "0x1132065009850C72E27B7950C0f9285d1D103589", + "symbol": "PT-mMEV-31JUL2025", + "priceFeed": "0x6BE2Bb4FFBb9FE1975A419D144750E604e1D37a1", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x8445C7A468Bc74D9A6Af8006F36fE5703ccae230", + "xt": "0x38636a20a312094aC71D73481A2FC51E691c5680", + "gt": "0x94257D83ba7B89A53F6bb4dfa282D1C992118986" + }, + "config": { + "marketSymbol": "USDC/PT-mMEV-31JUL2025@01AUG2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "01AUG2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "6000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-31JUL2025@01AUG2025.json b/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-31JUL2025@01AUG2025.json new file mode 100644 index 0000000..82c494c --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-sUSDE-31JUL2025@01AUG2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22439649", + "timestamp": "1746717503" + }, + "market": "0xdBB2D44c238c459cCB820De886ABF721EF6E6941", + "collateral": { + "address": "0x3b3fB9C57858EF816833dC91565EFcd85D96f634", + "symbol": "PT-sUSDE-31JUL2025", + "priceFeed": "0x53399c17DbB2Ba67BB3B6E5bf692251267A3F861", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x39815280F3804a860a09B0FfbcCAF8a0679FF5BA", + "xt": "0x6CfA4b8506736dD838DCbEC5187d777801160684", + "gt": "0xa7793d67dcbcc16ef92eD455Bc17594311d58d55" + }, + "config": { + "marketSymbol": "USDC/PT-sUSDE-31JUL2025@01AUG2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "01AUG2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "10000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-slvlUSD-25SEP2025@26SEP2025.json b/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-slvlUSD-25SEP2025@26SEP2025.json new file mode 100644 index 0000000..f9efcc8 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-slvlUSD-25SEP2025@26SEP2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22482505", + "timestamp": "1747239083" + }, + "market": "0x9D7386F68d9001a809860B4D88EC8E2cc3DD81B0", + "collateral": { + "address": "0x2CA5f2C4300450D53214B00546795c1c07B89acB", + "symbol": "PT-slvlUSD-25SEP2025", + "priceFeed": "0x5042768E83E2b5F9A7251A41C4E66855DD65fe31", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x831a11a25a98715e632A51D46A6296dA47883743", + "xt": "0x733F08C07fe2d37c86516aBE830Fc2756E56ac1C", + "gt": "0x68DCe038aF76f907617A0E648e23011143774e8A" + }, + "config": { + "marketSymbol": "USDC/PT-slvlUSD-25SEP2025@26SEP2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "26SEP2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "6000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@26SEP2025.json b/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@26SEP2025.json new file mode 100644 index 0000000..3141d1c --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@26SEP2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22678811", + "timestamp": "1749614639" + }, + "market": "0xEdA710f383646c3F5e2AAf1728037e5C9CA3dDdd", + "collateral": { + "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "symbol": "WBTC", + "priceFeed": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x04EE27695CdD9772314DE5cb0F9619Dc0e93693d", + "xt": "0x97d563387b858d61EDceCAf70e304b464085aD47", + "gt": "0x777C76d2f9EaCeb09290403701Fca92DFB1FdEd9" + }, + "config": { + "marketSymbol": "USDC/WBTC@26SEP2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "26SEP2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "6000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@27JUN2025.json b/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@27JUN2025.json new file mode 100644 index 0000000..1e2d1a9 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-USDC-WBTC@27JUN2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22430551", + "timestamp": "1746605843" + }, + "market": "0x9904F3b879385033faa31B50d1D63cb80b3495A3", + "collateral": { + "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "symbol": "WBTC", + "priceFeed": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x75b8ea5178baA489c9ab208Ec80AF10780927890", + "xt": "0x6182feffC89A170154a991fe09c31765bA5441C8", + "gt": "0x42C57cDE40B26c5E68c28e687eACa7B83dC48377" + }, + "config": { + "marketSymbol": "USDC/WBTC@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "27JUN2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "10000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-USDC-XAUM@27JUN2025.json b/deployments/eth-mainnet/eth-mainnet-market-USDC-XAUM@27JUN2025.json new file mode 100644 index 0000000..aa19176 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-USDC-XAUM@27JUN2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22482505", + "timestamp": "1747239083" + }, + "market": "0x975CBA8Bad13EF86BC4d2BBb3Eb7497327c640d1", + "collateral": { + "address": "0x2103E845C5E135493Bb6c2A4f0B8651956eA8682", + "symbol": "XAUM", + "priceFeed": "0x214eD9Da11D2fbe465a6fc601a91E62EbEc1a0D6", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xF8c1CdA465071665D3ECAf906732899186fD4856", + "xt": "0xf7e8F91286E3D4685A4D8e4F2a7413FE273DB503", + "gt": "0x6216D113CbBC1c4a1017699E691E949D1Dee8812" + }, + "config": { + "marketSymbol": "USDC/XAUm@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "27JUN2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "6000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-USDC-cUSDO@25JUL2025.json b/deployments/eth-mainnet/eth-mainnet-market-USDC-cUSDO@25JUL2025.json new file mode 100644 index 0000000..e4fab2e --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-USDC-cUSDO@25JUL2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22539398", + "timestamp": "1747928783" + }, + "market": "0x466d9d8a49B68151de52A0fD7676a6E49e630EFE", + "collateral": { + "address": "0xaD55aebc9b8c03FC43cd9f62260391c13c23e7c0", + "symbol": "cUSDO", + "priceFeed": "0xf158000de86899b5EB5E6fA3BB78F32A072bD14b", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xf02fc191356E725329e04996eF88C5b070E17f8b", + "xt": "0x84D36D6CCe4B9f5fa89dce996d439Fe63b6E1Bca", + "gt": "0xB95401F96029f505414f3209C6Ee11315A119629" + }, + "config": { + "marketSymbol": "USDC/cUSDO@25JUL2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "25JUL2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "6000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@27JUN2025.json b/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@27JUN2025.json new file mode 100644 index 0000000..34a1484 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-USDC-cbBTC@27JUN2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22430551", + "timestamp": "1746605843" + }, + "market": "0x1A69127188B72A155165255270017b4c78f31b88", + "collateral": { + "address": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", + "symbol": "cbBTC", + "priceFeed": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x0f8A293C6f7E578d46B1da2A44A5A65ce874da2d", + "xt": "0x5ba653575Ea036d734d703EAF9dE2Fe8936A6979", + "gt": "0xe81E8F37aC256253c78f5D880AD3d1CFCd00a5B2" + }, + "config": { + "marketSymbol": "USDC/cbBTC@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "27JUN2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "10000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@15AUG2025.json b/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@15AUG2025.json new file mode 100644 index 0000000..f061e81 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-USDC-eUSDe@15AUG2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22537449", + "timestamp": "1747905251" + }, + "market": "0x80305Dc3968B3c8E895027B1cd05eDD9cff1C504", + "collateral": { + "address": "0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F", + "symbol": "eUSDe", + "priceFeed": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x5A6615DeEa32CCd9f58d8Ae902be0F936eC3e384", + "xt": "0x7B66f1D0A74cECee6b2c384FD76D5E041d5FFa8E", + "gt": "0x48Ec1a69850e44EB838408d655471a059B72ef00" + }, + "config": { + "marketSymbol": "USDC/eUSDe@15AUG2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "15AUG2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "6000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-USDC-gtusdcf@30MAY2025.json b/deployments/eth-mainnet/eth-mainnet-market-USDC-gtusdcf@30MAY2025.json new file mode 100644 index 0000000..6f270dd --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-USDC-gtusdcf@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22286356", + "timestamp": "1744864451" + }, + "market": "0x2EaafFbCdE68337341C0eC65A862e648A413dc14", + "collateral": { + "address": "0xc582F04d8a82795aa2Ff9c8bb4c1c889fe7b754e", + "symbol": "gtusdcf", + "priceFeed": "0x81195F8A79f6553A4078f89eF87b21a7d3C2855A", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x09ec4BE9869BfAbF9fF6652fe7703276D6F5E5d8", + "xt": "0x9c7fBdd0055604bbf7736B153407e9513C818C22", + "gt": "0x8Ee590224c6cddE0d27FB60B37B05784dD794E59" + }, + "config": { + "marketSymbol": "USDC/gtusdcf@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-USDC-mMEV@01AUG2025.json b/deployments/eth-mainnet/eth-mainnet-market-USDC-mMEV@01AUG2025.json new file mode 100644 index 0000000..ed8dbd9 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-USDC-mMEV@01AUG2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22482505", + "timestamp": "1747239083" + }, + "market": "0x6C7B36f0a2136CB0da7b38293925d9af06895C20", + "collateral": { + "address": "0x030b69280892c888670EDCDCD8B69Fd8026A0BF3", + "symbol": "mMEV", + "priceFeed": "0x5f09Aff8B9b1f488B7d1bbaD4D89648579e55d61", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xFc97e7b4728d81b275DAd8701F2a53b72e5A0898", + "xt": "0x56c7334191D0CC03043f5e6203C56245de3D9bCa", + "gt": "0x4bdf64B59A1cadaB0ff34E18cDee225435D0479E" + }, + "config": { + "marketSymbol": "USDC/mMEV@01AUG2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "01AUG2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "6000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@26SEP2025.json b/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@26SEP2025.json new file mode 100644 index 0000000..ed3a863 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@26SEP2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22678811", + "timestamp": "1749614639" + }, + "market": "0x794173535173B5c44B58ad2DbE8415dC6529b942", + "collateral": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x111e0726772Fd700D4D7Ee0a5b8bF7529A5FE7c8", + "xt": "0x3f73E622c05a25Ecfb2388d7e5E68b4dcC14e8fC", + "gt": "0xCe9d8fD19fccB14e523809309217c3B5112056F7" + }, + "config": { + "marketSymbol": "USDC/sUSDe@26SEP2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "26SEP2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "6000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@27JUN2025.json b/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@27JUN2025.json new file mode 100644 index 0000000..9fab5c6 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-USDC-sUSDe@27JUN2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22430551", + "timestamp": "1746605843" + }, + "market": "0x988a287c4340B18665cC5E128DC76906A5C839e6", + "collateral": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xcE7decb042927EC42DB8ECc75A8E526824376A3e", + "xt": "0x13b29958f0F6eB39a587704034E531E4090E9D59", + "gt": "0xDBa3379F0406F5c90eb74D27e511e4FB4D10B6B3" + }, + "config": { + "marketSymbol": "USDC/sUSDe@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "27JUN2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "10000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@27JUN2025.json b/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@27JUN2025.json new file mode 100644 index 0000000..50d9cd9 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-USDC-wstETH@27JUN2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22430551", + "timestamp": "1746605843" + }, + "market": "0x22Cd4c59eD4bb2ad852892518073056441c55BFE", + "collateral": { + "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x285a4618d3349e2Fff63f750FCaC94Fb002f932e", + "xt": "0x874AdBD54F7bA2cF46f97BB569AB7BA4cB8f89C9", + "gt": "0xec4Aa75e5C4b09eb65761f8328252d3509F232C0" + }, + "config": { + "marketSymbol": "USDC/wstETH@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "27JUN2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "10000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-USDC-xUSD@26SEP2025.json b/deployments/eth-mainnet/eth-mainnet-market-USDC-xUSD@26SEP2025.json new file mode 100644 index 0000000..994a734 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-USDC-xUSD@26SEP2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22701265", + "timestamp": "1749885683" + }, + "market": "0x017BA8e72619460359e35B57358A8bd08171e62B", + "collateral": { + "address": "0xE2Fc85BfB48C4cF147921fBE110cf92Ef9f26F94", + "symbol": "xUSD", + "priceFeed": "0x91F37A3058A7fD3f4f66ED87d715CF05bB4fbfBd", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x7BC22Da8Cd3631A916EC55E0a6eD473522CD100E", + "xt": "0x14f027A17D0E7b33F0E2077D9A58C8B850feD92C", + "gt": "0x465e0666335e52235a8152309A00f0f61890f924" + }, + "config": { + "marketSymbol": "USDC/xUSD@26SEP2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "26SEP2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "6000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-USDC-xUSD@29AUG2025.json b/deployments/eth-mainnet/eth-mainnet-market-USDC-xUSD@29AUG2025.json new file mode 100644 index 0000000..3bc3a4b --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-USDC-xUSD@29AUG2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22701265", + "timestamp": "1749885683" + }, + "market": "0x613ED6f663A5697A38B3F59B67BE5174d92fF9E2", + "collateral": { + "address": "0xE2Fc85BfB48C4cF147921fBE110cf92Ef9f26F94", + "symbol": "xUSD", + "priceFeed": "0x91F37A3058A7fD3f4f66ED87d715CF05bB4fbfBd", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xb2822cb1FA9a69926Bc636a102F5A359f42C7733", + "xt": "0xf70C592c3EAF45885d5d5A9e76254cD0Ca2f2965", + "gt": "0xABA25990c1A593bda360430E0dA7a834B7c1F0Ff" + }, + "config": { + "marketSymbol": "USDC/xUSD@29AUG2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "29AUG2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "6000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-WBTC-sUSDe@26SEP2025.json b/deployments/eth-mainnet/eth-mainnet-market-WBTC-sUSDe@26SEP2025.json new file mode 100644 index 0000000..ba4b7f0 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-WBTC-sUSDe@26SEP2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22678811", + "timestamp": "1749614639" + }, + "market": "0xf0bca0d267eac9f5bf1b364345FE439d29e9a601", + "collateral": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "symbol": "WBTC", + "priceFeed": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x4c282fC94977717b293BAA7c3B489a3290AC72A2", + "xt": "0x41479a29A7BB3B56b60E59282A9cF45789AF2927", + "gt": "0x0B146abb57Ba63617F0c8EF34F38dB7E6f203476" + }, + "config": { + "marketSymbol": "WBTC/sUSDe@26SEP2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "26SEP2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "3000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-WBTC-sUSDe@27JUN2025.json b/deployments/eth-mainnet/eth-mainnet-market-WBTC-sUSDe@27JUN2025.json new file mode 100644 index 0000000..0bf6a2a --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-WBTC-sUSDe@27JUN2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22482505", + "timestamp": "1747239083" + }, + "market": "0x7D042A2800C2Bf66A2Af99014c96513Bc4CEfeda", + "collateral": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "symbol": "WBTC", + "priceFeed": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x775157A35b1EfB4D86c5bC732f047758085d2127", + "xt": "0x91BC1c8dDe63ec666397a7e1500aCbD9b028fEA3", + "gt": "0xe173C8D8192d20D820061D04323c3E89Aa836a4c" + }, + "config": { + "marketSymbol": "WBTC/sUSDe@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "27JUN2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "3000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-WETH-PT-pufETH-26JUN2025@27JUN2025.json b/deployments/eth-mainnet/eth-mainnet-market-WETH-PT-pufETH-26JUN2025@27JUN2025.json new file mode 100644 index 0000000..004f489 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-WETH-PT-pufETH-26JUN2025@27JUN2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22439649", + "timestamp": "1746717503" + }, + "market": "0xC898Fa3A26CEAcAE25cCffF6003B087948dEDE2a", + "collateral": { + "address": "0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D", + "symbol": "PT-pufETH-26JUN2025", + "priceFeed": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x0ad67BB21bE025f9C47ceb0DB3ac490e473Afd9a", + "xt": "0x0E960CFde8730DA71e72b52bb1BC8ef4F4F5a9Bb", + "gt": "0xAB490460b78c481fdf4d10Ed85378cFa1dd342f1" + }, + "config": { + "marketSymbol": "WETH/PT-pufETH-26JUN2025@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "27JUN2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "4000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-WETH-mhyETH@30MAY2025.json b/deployments/eth-mainnet/eth-mainnet-market-WETH-mhyETH@30MAY2025.json new file mode 100644 index 0000000..26c31af --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-WETH-mhyETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22286356", + "timestamp": "1744864451" + }, + "market": "0xb9919eE2169a7dA664AD024C6dDCF0ccD4121C26", + "collateral": { + "address": "0x701907283a57FF77E255C3f1aAD790466B8CE4ef", + "symbol": "mhyETH", + "priceFeed": "0x0221cd3fA8B1Bea16293fb0cD6B60977d531c931", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xbC9c191613c6e77c03A3F792579520d455e852a6", + "xt": "0x1aA1fF0D8c47066C72902040716F91Df18090ADc", + "gt": "0x489f04a08d6ee13789cd59c5ce241494b063b3DB" + }, + "config": { + "marketSymbol": "WETH/mhyETH@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@27JUN2025.json b/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@27JUN2025.json new file mode 100644 index 0000000..39bcf8a --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@27JUN2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22430551", + "timestamp": "1746605843" + }, + "market": "0xaBE8ab2223c846466Eb30f5137A7f05106c9d0c4", + "collateral": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x23Ed558080CEB4755a24d841E24558e85B1DDb18", + "xt": "0xA97Ba034797386d9987c88Beff430B40c4fDc6c5", + "gt": "0xb4a859d44470F0168464a5DB99f058CF9A7B4df1" + }, + "config": { + "marketSymbol": "WETH/pufETH@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "27JUN2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "4000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@29AUG2025.json b/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@29AUG2025.json new file mode 100644 index 0000000..4e58261 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-WETH-pufETH@29AUG2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22678811", + "timestamp": "1749614639" + }, + "market": "0xD75DEfEB9Fbff0c6f41CA54a42bc6cEb344363C8", + "collateral": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x7e1827722E812e29258e197F9F8dD508146a51ef", + "xt": "0xE34e455d978B522bCD6f478ee262F25Edafa5030", + "gt": "0x05b8e2477971DcdECAA839D25f265e9Fc78d41bc" + }, + "config": { + "marketSymbol": "WETH/pufETH@29AUG2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "29AUG2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "3000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-WETH-sUSDe@26SEP2025.json b/deployments/eth-mainnet/eth-mainnet-market-WETH-sUSDe@26SEP2025.json new file mode 100644 index 0000000..3e02781 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-WETH-sUSDe@26SEP2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22678811", + "timestamp": "1749614639" + }, + "market": "0xbc55152b15c24f47Ef0B753B262ac07F7f504E69", + "collateral": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x69C761463102Ca47796C2b9F6D9F9f91d7acAA85", + "xt": "0xB018275840C1076fA87E86E29E855D3Ec0b77CeB", + "gt": "0x2D8f6Ff917A727e1a429A8711d86d6Ecd93A7a60" + }, + "config": { + "marketSymbol": "WETH/sUSDe@26SEP2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "26SEP2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "3000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-WETH-sUSDe@27JUN2025.json b/deployments/eth-mainnet/eth-mainnet-market-WETH-sUSDe@27JUN2025.json new file mode 100644 index 0000000..c0daaeb --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-WETH-sUSDe@27JUN2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22482505", + "timestamp": "1747239083" + }, + "market": "0xc7559e952666fac90206758e664f86D09e7f1f72", + "collateral": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x7337261Cf19cc2D2146F6A30Dd4Fb186e31728cC", + "xt": "0x0fE1a8E392F4c03eedb805260C12716B4B4Ed68F", + "gt": "0xdf7E3C6BA0239E1933E431ad68Be7861ea51387e" + }, + "config": { + "marketSymbol": "WETH/sUSDe@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "27JUN2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "3000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@26SEP2025.json b/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@26SEP2025.json new file mode 100644 index 0000000..70e65e5 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@26SEP2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22678811", + "timestamp": "1749614639" + }, + "market": "0xD4c468f76ac06980EcDD28499383ae64461FfcDb", + "collateral": { + "address": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xcb16CD4204ACA54b761820a538060716B1716D7D", + "xt": "0xC206Ba4E6F159caFA32A6e15fA93cf7BC58bCa5D", + "gt": "0x49a793165B2b60afe0EE2bd6Ce69b743AA3b8cD5" + }, + "config": { + "marketSymbol": "WETH/weETH@26SEP2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "26SEP2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "3000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@27JUN2025.json b/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@27JUN2025.json new file mode 100644 index 0000000..e13e1c1 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-WETH-weETH@27JUN2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22430551", + "timestamp": "1746605843" + }, + "market": "0xf0dE37189366F0f3AAe2795160763F3F34797B11", + "collateral": { + "address": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xe8503FFEcc5D4065ba0eB11DCbdcD47A4F752572", + "xt": "0xf98042dD2ca30440d27373ECA2727e9540897EBf", + "gt": "0x272f222de90ADF7B1cCA859d685beC738993bA6C" + }, + "config": { + "marketSymbol": "WETH/weETH@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "27JUN2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "4000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-WETH-wstETH@26SEP2025.json b/deployments/eth-mainnet/eth-mainnet-market-WETH-wstETH@26SEP2025.json new file mode 100644 index 0000000..18f4240 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-WETH-wstETH@26SEP2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22678811", + "timestamp": "1749614639" + }, + "market": "0x4AF4b1E5b05C4759F316A5201e6571F9B97406A2", + "collateral": { + "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x453DB840338AcB3835E7A215ACaE4ab9d8A4eB2E", + "xt": "0x73E4a17bd8Bb7aFb2Bcd13E9d60C446b3CC1D171", + "gt": "0x6aCEef5E46590a4E3f4F201641c468Eb570111fe" + }, + "config": { + "marketSymbol": "WETH/wstETH@26SEP2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "26SEP2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "3000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-WETH-ynETHx@29AUG2025.json b/deployments/eth-mainnet/eth-mainnet-market-WETH-ynETHx@29AUG2025.json new file mode 100644 index 0000000..34e5a55 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-WETH-ynETHx@29AUG2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22565662", + "timestamp": "1748246735" + }, + "market": "0x369f628DcAD1c5F0f7A4EEf7a22fE550D193ef36", + "collateral": { + "address": "0x657d9ABA1DBb59e53f9F3eCAA878447dCfC96dCb", + "symbol": "ynETHx", + "priceFeed": "0x5FDaa369D623d86191105435c7DA03F25417753a", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x621aFe2B3CC5F1A841F03164769b0C3bcDdB092e", + "xt": "0x82992FBD095Ce85273d50147568975EF277a87dc", + "gt": "0xd4d60b4Cd0aC8682a9a800176d7dc0Ef3e1D6090" + }, + "config": { + "marketSymbol": "WETH/ynETHx@29AUG2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "29AUG2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "3000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-lvlUSD-slvlUSD@14APR2025.json b/deployments/eth-mainnet/eth-mainnet-market-lvlUSD-slvlUSD@14APR2025.json new file mode 100644 index 0000000..02a2d81 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-lvlUSD-slvlUSD@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22266244", + "timestamp": "1744621823" + }, + "market": "0x9B6D377027d36146D1C734e02B8808568D002179", + "collateral": { + "address": "0x4737D9b4592B40d51e110b94c9C043c6654067Ae", + "symbol": "slvlUSD", + "priceFeed": "0x3Bc7dD457901A41509fc0Bd47Dc3Da42D45Ce030", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x7C1156E515aA1A2E851674120074968C905aAF37", + "symbol": "lvlUSD", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x82Fa71444c041eA40bD565F622a00A6509562544", + "xt": "0xD16353C409d80B7FA4B80F4832aa28F323A0F1bb", + "gt": "0x2EB9Ef9967d108132c289975674AD0D4328C1A8a" + }, + "config": { + "marketSymbol": "lvlUSD/slvlUSD@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-lvlUSD-slvlUSD@27JUN2025.json b/deployments/eth-mainnet/eth-mainnet-market-lvlUSD-slvlUSD@27JUN2025.json new file mode 100644 index 0000000..4686781 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-lvlUSD-slvlUSD@27JUN2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22430551", + "timestamp": "1746605843" + }, + "market": "0x8d501c7640595EC9D2A39Fbd30dED7672e9631BD", + "collateral": { + "address": "0x4737D9b4592B40d51e110b94c9C043c6654067Ae", + "symbol": "slvlUSD", + "priceFeed": "0x3Bc7dD457901A41509fc0Bd47Dc3Da42D45Ce030", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x7C1156E515aA1A2E851674120074968C905aAF37", + "symbol": "lvlUSD", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x53b52637923839676F6441C7e824D91478F882D3", + "xt": "0xc5421aAD009F200b60a8cC67B60cF6f774a1E693", + "gt": "0xC03746e7441A523686D93C5282557e3970065d6a" + }, + "config": { + "marketSymbol": "lvlUSD/slvlUSD@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "27JUN2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "10000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-lvlUSD-slvlUSD@30MAY2025.json b/deployments/eth-mainnet/eth-mainnet-market-lvlUSD-slvlUSD@30MAY2025.json new file mode 100644 index 0000000..eacf7ce --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-lvlUSD-slvlUSD@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22266137", + "timestamp": "1744620539" + }, + "market": "0xa1ed39C786eea298925DD6FcC33199C3fF06765E", + "collateral": { + "address": "0x4737D9b4592B40d51e110b94c9C043c6654067Ae", + "symbol": "slvlUSD", + "priceFeed": "0x3Bc7dD457901A41509fc0Bd47Dc3Da42D45Ce030", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x7C1156E515aA1A2E851674120074968C905aAF37", + "symbol": "lvlUSD", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x5623695881DB8cFc84ee1f40a1F4A0999D1552f6", + "xt": "0x453dFD4db1a92Bf8D84b4E4Fa6381019370d0C5d", + "gt": "0xE1e045a8a238994703ec0dD7e4E2aD6f97c5F186" + }, + "config": { + "marketSymbol": "lvlUSD/slvlUSD@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@27JUN2025.json b/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@27JUN2025.json new file mode 100644 index 0000000..3f0d0af --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-pufETH-PT-pufETH-26JUN2025@27JUN2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22537449", + "timestamp": "1747905251" + }, + "market": "0x23ce4AD98eCB62258AD2aCE43aDbC63aa50Df2e1", + "collateral": { + "address": "0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D", + "symbol": "PT-pufETH-26JUN2025", + "priceFeed": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x69967F15A2aCdA92040353b3b3C85F2BE613Fc31", + "xt": "0xB0c6f823d2Cfe89c708d393aE8079871F764D634", + "gt": "0x05c67446e26C478F89615688ad107C9601F49205" + }, + "config": { + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "27JUN2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "3000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-sUSDe-PT-sUSDE-29MAY2025@14APR2025.json b/deployments/eth-mainnet/eth-mainnet-market-sUSDe-PT-sUSDE-29MAY2025@14APR2025.json new file mode 100644 index 0000000..66cee1f --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-sUSDe-PT-sUSDE-29MAY2025@14APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22266244", + "timestamp": "1744621823" + }, + "market": "0x7A28a1a4d54F5a74BC87471B9EE4Ba41B07a4cD3", + "collateral": { + "address": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "symbol": "PT-sUSDE-29MAY2025", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x6CD5968D8703E40bdaD77F40722ead51cF3DFEe6", + "xt": "0x81ac31e4f598f3d0C455aD27C38686B8c1A3256E", + "gt": "0xF147cfD201930840ec8E9424E447dB22f67D6Ef1" + }, + "config": { + "marketSymbol": "sUSDe/PT-sUSDE-29MAY2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "14APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-sUSDe-PT-sUSDE-29MAY2025@30MAY2025.json b/deployments/eth-mainnet/eth-mainnet-market-sUSDe-PT-sUSDE-29MAY2025@30MAY2025.json new file mode 100644 index 0000000..3c4775c --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-sUSDe-PT-sUSDE-29MAY2025@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22266137", + "timestamp": "1744620539" + }, + "market": "0x37877773B1289c27Bb6159b86613Efd0d15cADaE", + "collateral": { + "address": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "symbol": "PT-sUSDE-29MAY2025", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x6fbE672e148dB5374a17dcfe78c22a31751b0F5F", + "xt": "0x9b23666F665aA6B280d1f5C3a580EEad7414DcAC", + "gt": "0x4f1B12bFe07534C68ECd6a971d3f6295b423CD09" + }, + "config": { + "marketSymbol": "sUSDe/PT-sUSDE-29MAY2025@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-sUSDe-PT-sUSDE-31JUL2025@01AUG2025.json b/deployments/eth-mainnet/eth-mainnet-market-sUSDe-PT-sUSDE-31JUL2025@01AUG2025.json new file mode 100644 index 0000000..87be1fa --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-sUSDe-PT-sUSDE-31JUL2025@01AUG2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22627923", + "timestamp": "1748999531" + }, + "market": "0xa00874Aebe73B4b9867d733eFa1b11640FC17EbA", + "collateral": { + "address": "0x3b3fB9C57858EF816833dC91565EFcd85D96f634", + "symbol": "PT-sUSDE-31JUL2025", + "priceFeed": "0x53399c17DbB2Ba67BB3B6E5bf692251267A3F861", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x1CD288C5D5373B6a62FA693B8D6dA0333Ac9d85E", + "xt": "0xCf7e55080155F1bb3E81b80B2D5016ac80aA4Ee3", + "gt": "0xD710FD59085704A2D2e64ce0274d051f077F5865" + }, + "config": { + "marketSymbol": "sUSDe/PT-sUSDE-31JUL2025@01AUG2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "01AUG2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "6000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-wstETH-ETH+@15AUG2025.json b/deployments/eth-mainnet/eth-mainnet-market-wstETH-ETH+@15AUG2025.json new file mode 100644 index 0000000..7ada265 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-wstETH-ETH+@15AUG2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22700737", + "timestamp": "1749879299" + }, + "market": "0x7EF98154058C61f391F4C2CBe9Ee497900957b66", + "collateral": { + "address": "0xE72B141DF173b999AE7c1aDcbF60Cc9833Ce56a8", + "symbol": "ETH+", + "priceFeed": "0x1d309F2E29b0b30dbB536a8100fCCCe3bd90F776", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x0687cFcA987F873aCc0F8B0219beff8d8cAa55c3", + "xt": "0x8c2A76d6ea3a7E2bA47DDa62Fa5738b5b1B4D48C", + "gt": "0x5fB1D1Dc57b32464321E82Da1D525A51Bb795f53" + }, + "config": { + "marketSymbol": "wstETH/ETH+@15AUG2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "15AUG2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "3000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-wstETH-ETH+@15SEP2025.json b/deployments/eth-mainnet/eth-mainnet-market-wstETH-ETH+@15SEP2025.json new file mode 100644 index 0000000..0456832 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-wstETH-ETH+@15SEP2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22700737", + "timestamp": "1749879299" + }, + "market": "0x6FFA08eC4aD912451c9c1315cC3CEa5e211d8f04", + "collateral": { + "address": "0xE72B141DF173b999AE7c1aDcbF60Cc9833Ce56a8", + "symbol": "ETH+", + "priceFeed": "0x1d309F2E29b0b30dbB536a8100fCCCe3bd90F776", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x9dff60c3f47b0C4A2447bf3419c1d8992bf4509d", + "xt": "0x589b20BE4323b786fe1d09E2016A7cbebe610e0a", + "gt": "0x71009A2d946392ec40baD687a8c0Dbd6eD5a363B" + }, + "config": { + "marketSymbol": "wstETH/ETH+@15SEP2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "15SEP2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "3000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-wstETH-inwstETHs@25JUL2025.json b/deployments/eth-mainnet/eth-mainnet-market-wstETH-inwstETHs@25JUL2025.json new file mode 100644 index 0000000..e589b14 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-wstETH-inwstETHs@25JUL2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22678811", + "timestamp": "1749614639" + }, + "market": "0x976DC6902d311Bab27A56EAbE00999CA46048550", + "collateral": { + "address": "0x8E0789d39db454DBE9f4a77aCEF6dc7c69f6D552", + "symbol": "inwstETHs", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x70159fE9D204f760c4828a2518e92965A75cD4Cf", + "xt": "0x9D2c06ea6b857E432535155a99E9c46bc715fE01", + "gt": "0x72f598dd676E6c9361FbCd0a82115D6E6CB8658B" + }, + "config": { + "marketSymbol": "wstETH/inwstETHs@25JUL2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "25JUL2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "3000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-wstETH-inwstETHs@27JUN2025.json b/deployments/eth-mainnet/eth-mainnet-market-wstETH-inwstETHs@27JUN2025.json new file mode 100644 index 0000000..65df224 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-wstETH-inwstETHs@27JUN2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22430551", + "timestamp": "1746605843" + }, + "market": "0xD316d4494c840F8A758FB6184e9b60281e35cC02", + "collateral": { + "address": "0x8E0789d39db454DBE9f4a77aCEF6dc7c69f6D552", + "symbol": "inwstETHs", + "priceFeed": "0xbfA4F6a74c7F02FE3B52e570D782033011270CEb", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x6B3aaAB883d2B5A42276206B18C62dBd2F075B73", + "xt": "0x1Ad25fC3fAD6B5fb2744Ec684c74BC301A3a26dC", + "gt": "0xcE6Df2c8A6B5d7f70f73a71f78c64F54bDA4DbED" + }, + "config": { + "marketSymbol": "wstETH/inwstETHs@27JUN2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "27JUN2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "4000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-wstETH-inwstETHs@30MAY2025.json b/deployments/eth-mainnet/eth-mainnet-market-wstETH-inwstETHs@30MAY2025.json new file mode 100644 index 0000000..935cebc --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-wstETH-inwstETHs@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22325579", + "timestamp": "1745337359" + }, + "market": "0x918D8Ecba4C683EF3004b1C313cfEF5e3b9E1146", + "collateral": { + "address": "0x8E0789d39db454DBE9f4a77aCEF6dc7c69f6D552", + "symbol": "inwstETHs", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xC4CE5aA3caBaB5525d838f3095105e68764a4863", + "xt": "0xD54417D73FEdBBFa242E296A9199D401c377A23f", + "gt": "0x79614885F2b286A20a18315A9963e9e7A5eF0824" + }, + "config": { + "marketSymbol": "wstETH/inwstETHs@30MAY2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "4000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-pendle-swap-v3-adapter.json b/deployments/eth-mainnet/eth-mainnet-pendle-swap-v3-adapter.json new file mode 100644 index 0000000..2a27d62 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-pendle-swap-v3-adapter.json @@ -0,0 +1,14 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1744434875", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x1b19b284f4f6a7ffebcb90e1d9af5058a71d0ab5", + "blockInfo": { + "number": "22250716", + "timestamp": "1744434875" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "contracts": { + "pendleSwapV3Adapter": "0x4c51a1595a1887932858b2a3C6b34BA6AEeAD899" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-vault-TMX-LBTC-Vault.json b/deployments/eth-mainnet/eth-mainnet-vault-TMX-LBTC-Vault.json new file mode 100644 index 0000000..cc2a69a --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-vault-TMX-LBTC-Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.9", + "commit": "0x0xde6187269321ebd08b5d536ff89f9bb4a54c3a39" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22503704", + "timestamp": "1747496375" + }, + "vaultInfo": { + "name": "TermMax LBTC Vault", + "symbol": "TMX-LBTC-Vault", + "address": "0xBc33ECf9113268BaAc561e9f0d9Df0FB8b1A5922", + "asset": "0x8236a87084f8B84306f72007F36F2618A5634494", + "performanceFeeRate": 0, + "maxCapacity": "10000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-vault-TMX-USDC-Delivery-Vault.json b/deployments/eth-mainnet/eth-mainnet-vault-TMX-USDC-Delivery-Vault.json new file mode 100644 index 0000000..39191eb --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-vault-TMX-USDC-Delivery-Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.9", + "commit": "0x0xde6187269321ebd08b5d536ff89f9bb4a54c3a39" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22503803", + "timestamp": "1747497575" + }, + "vaultInfo": { + "name": "TermMax USDC Coll-Deliverable Vault", + "symbol": "TMX-USDC-Delivery-Vault", + "address": "0xf841f6974A84dBcE954227975A1bb7BAD7C3Df3D", + "asset": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "performanceFeeRate": 0, + "maxCapacity": "10000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-vault-TMX-USDC-PRIME.json b/deployments/eth-mainnet/eth-mainnet-vault-TMX-USDC-PRIME.json new file mode 100644 index 0000000..1ca2367 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-vault-TMX-USDC-PRIME.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.9", + "commit": "0x0x9ccea93c0ceff6a76f38270be9ea3d3aad9552d7" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22283141", + "timestamp": "1744825595" + }, + "vaultInfo": { + "name": "TermMax USDC Prime", + "symbol": "TMX-USDC-PRIME", + "address": "0x13e361dC94459a01bc4991F9e681033Dc2b0fA5A", + "asset": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "performanceFeeRate": 0, + "maxCapacity": "50000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-vault-TMX-USDC.json b/deployments/eth-mainnet/eth-mainnet-vault-TMX-USDC.json new file mode 100644 index 0000000..56904bc --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-vault-TMX-USDC.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22232838", + "timestamp": "1744219655" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TMX-USDC", + "address": "0x984408C88a9B042BF3e2ddf921Cd1fAFB4b735D1", + "asset": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "performanceFeeRate": 0, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-vault-TMX-WBTC-Vault.json b/deployments/eth-mainnet/eth-mainnet-vault-TMX-WBTC-Vault.json new file mode 100644 index 0000000..6124612 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-vault-TMX-WBTC-Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.9", + "commit": "0x0xde6187269321ebd08b5d536ff89f9bb4a54c3a39" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22503649", + "timestamp": "1747495715" + }, + "vaultInfo": { + "name": "TermMax WBTC Vault", + "symbol": "TMX-WBTC-Vault", + "address": "0x8Df27B83B447Efde8fE58B60F12cFB5dF98Ac211", + "asset": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "performanceFeeRate": 0, + "maxCapacity": "10000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-vault-TMX-WETH-Delivery-Vault.json b/deployments/eth-mainnet/eth-mainnet-vault-TMX-WETH-Delivery-Vault.json new file mode 100644 index 0000000..fb668c4 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-vault-TMX-WETH-Delivery-Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.9", + "commit": "0x0xde6187269321ebd08b5d536ff89f9bb4a54c3a39" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22503817", + "timestamp": "1747497743" + }, + "vaultInfo": { + "name": "TermMax WETH Coll-Deliverable Vault", + "symbol": "TMX-WETH-Delivery-Vault", + "address": "0x3CaB0abCb93C81D7f6B8Ca23EB9e9C717AEEf5Ea", + "asset": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "performanceFeeRate": 0, + "maxCapacity": "4000000000000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-vault-TMX-WETH.json b/deployments/eth-mainnet/eth-mainnet-vault-TMX-WETH.json new file mode 100644 index 0000000..c096a93 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-vault-TMX-WETH.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x561b96a021112cba8323e544ec0268dd640b4a22" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22232798", + "timestamp": "1744219175" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TMX-WETH", + "address": "0xDEB8a9C0546A01b7e5CeE8e44Fd0C8D8B96a1f6e", + "asset": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "performanceFeeRate": 0, + "maxCapacity": "5000000000000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-vault-TMX-XAU-USDC-Vault.json b/deployments/eth-mainnet/eth-mainnet-vault-TMX-XAU-USDC-Vault.json new file mode 100644 index 0000000..332266f --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-vault-TMX-XAU-USDC-Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.9", + "commit": "0x0xfd23dc00fb2079de90aa13e1378b438b30951d85" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22495773", + "timestamp": "1747400171" + }, + "vaultInfo": { + "name": "TermMax XAU USDC vault", + "symbol": "TMX-XAU-USDC-Vault", + "address": "0x240Dd52089899a71454942b6Ba3ef4dbcBAd57fd", + "asset": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "performanceFeeRate": 0, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-vault-TMX-eUSDe-Vault.json b/deployments/eth-mainnet/eth-mainnet-vault-TMX-eUSDe-Vault.json new file mode 100644 index 0000000..30b809b --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-vault-TMX-eUSDe-Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.9", + "commit": "0x0xde6187269321ebd08b5d536ff89f9bb4a54c3a39" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22503765", + "timestamp": "1747497119" + }, + "vaultInfo": { + "name": "TermMax eUSDe Vault", + "symbol": "TMX-eUSDe-Vault", + "address": "0x23EA636813B308EfA0Af35F556d3410104E88e5c", + "asset": "0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F", + "performanceFeeRate": 0, + "maxCapacity": "10000000000000000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-vault-TMX-pufETH-Vault.json b/deployments/eth-mainnet/eth-mainnet-vault-TMX-pufETH-Vault.json new file mode 100644 index 0000000..2c70e1c --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-vault-TMX-pufETH-Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.9", + "commit": "0x0xde6187269321ebd08b5d536ff89f9bb4a54c3a39" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22503786", + "timestamp": "1747497371" + }, + "vaultInfo": { + "name": "TermMax pufETH Vault", + "symbol": "TMX-pufETH-Vault", + "address": "0xdC4d99aB6c69943b4E17431357AbC5b54B4C2F56", + "asset": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "performanceFeeRate": 0, + "maxCapacity": "4000000000000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-vault-TMX-sUSDe-Vault.json b/deployments/eth-mainnet/eth-mainnet-vault-TMX-sUSDe-Vault.json new file mode 100644 index 0000000..da8515e --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-vault-TMX-sUSDe-Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.9", + "commit": "0x0xde6187269321ebd08b5d536ff89f9bb4a54c3a39" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22503669", + "timestamp": "1747495955" + }, + "vaultInfo": { + "name": "TermMax sUSDe Vault", + "symbol": "TMX-sUSDe-Vault", + "address": "0xb12e979a021635Df56277d67D57f76D1c01388ca", + "asset": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "performanceFeeRate": 0, + "maxCapacity": "10000000000000000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-vault-TMX-uniBTC-Vault.json b/deployments/eth-mainnet/eth-mainnet-vault-TMX-uniBTC-Vault.json new file mode 100644 index 0000000..9ebc677 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-vault-TMX-uniBTC-Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.9", + "commit": "0x0xde6187269321ebd08b5d536ff89f9bb4a54c3a39" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22503727", + "timestamp": "1747496651" + }, + "vaultInfo": { + "name": "TermMax uniBTC Vault", + "symbol": "TMX-uniBTC-Vault", + "address": "0xCD2291be7d2D71425A612C1d5837893de38a953B", + "asset": "0x004E9C3EF86bc1ca1f0bB5C7662861Ee93350568", + "performanceFeeRate": 0, + "maxCapacity": "10000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-vault-TMX-wstETH-Vault.json b/deployments/eth-mainnet/eth-mainnet-vault-TMX-wstETH-Vault.json new file mode 100644 index 0000000..0fc28cf --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-vault-TMX-wstETH-Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.9", + "commit": "0x0x3b6b686d5080fff47dc1aaa51357454b9614490d" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22325729", + "timestamp": "1745339159" + }, + "vaultInfo": { + "name": "TermMax wstETH Vault", + "symbol": "TMX-wstETH-Vault", + "address": "0xDAdeAcC03a59639C0ecE5ec4fF3BC0d9920A47eC", + "asset": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "performanceFeeRate": 0, + "maxCapacity": "25000000000000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-vault-TMX-wstUSR-Vault.json b/deployments/eth-mainnet/eth-mainnet-vault-TMX-wstUSR-Vault.json new file mode 100644 index 0000000..68b85a8 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-vault-TMX-wstUSR-Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.9", + "commit": "0x0xde6187269321ebd08b5d536ff89f9bb4a54c3a39" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22503686", + "timestamp": "1747496159" + }, + "vaultInfo": { + "name": "TermMax wstUSR Vault", + "symbol": "TMX-wstUSR-Vault", + "address": "0xb1717d2fE0e20f584194c3E8808450817f52d620", + "asset": "0x1202F5C7b4B9E47a1A484E8B270be34dbbC75055", + "performanceFeeRate": 0, + "maxCapacity": "10000000000000000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x008c7DC790fA31E6CA19D8Cb6d11C53f6A88DF6c", + "guardian": "0x6383EDe871F8B0167905C2466505381CDcD9cC78", + "allocator": "0x518C292A86450808E593Bcf26Fc29A7a7b682198" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-vault-Weiting USDC Vault.json b/deployments/eth-mainnet/eth-mainnet-vault-Weiting USDC Vault.json new file mode 100644 index 0000000..31301e4 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-vault-Weiting USDC Vault.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xb07dca68abfa0915501a9f9b5e5f8ae686c02d95" + }, + "blockInfo": { + "network": "eth-mainnet", + "blockNumber": "22215681", + "timestamp": "1744012679" + }, + "vaultInfo": { + "name": "Weiting USDC Vault", + "symbol": "Weiting USDC Vault", + "address": "0x5C16d84e998c661D9F6C7Cc23e1144E4b7f39759", + "asset": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "performanceFeeRate": 10000000, + "maxCapacity": "1000000000000", + "timelock": 86400, + "admin": "0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF", + "curator": "0x1c59f7A0AA3f01DDACd17c0EF7Bc00c3D18feD0A", + "guardian": "0x1c59f7A0AA3f01DDACd17c0EF7Bc00c3D18feD0A", + "allocator": "0x1c59f7A0AA3f01DDACd17c0EF7Bc00c3D18feD0A" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-vault-factory.json b/deployments/eth-mainnet/eth-mainnet-vault-factory.json new file mode 100644 index 0000000..8f8ecb5 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-vault-factory.json @@ -0,0 +1,14 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1744824947", + "gitBranch": "deploy/v1.0.9", + "gitCommitHash": "0x0x9ccea93c0ceff6a76f38270be9ea3d3aad9552d7", + "blockInfo": { + "number": "22283087", + "timestamp": "1744824947" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "contracts": { + "vaultFactory": "0x4778CBf91d8369843281c8f5a2D7b56d1420dFF5" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/submit-eth-mainnet-pt-susde-31jul2025-log.txt b/deployments/eth-mainnet/submit-eth-mainnet-pt-susde-31jul2025-log.txt new file mode 100644 index 0000000..9223436 --- /dev/null +++ b/deployments/eth-mainnet/submit-eth-mainnet-pt-susde-31jul2025-log.txt @@ -0,0 +1,12 @@ +./script.sh eth-mainnet script:SubmitOracles --broadcast + +== Logs == + Submitted oracle for collateral: PT-sUSDE-31JUL2025 + Price feed: 0x53399c17DbB2Ba67BB3B6E5bf692251267A3F861 + Backup price feed: 0x28eBF137e6659f9037b2393D7f52D37CD963B51a + Heartbeat: 86400 + -------------------------------- + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet/submit-inwsteth-oracle-log.txt b/deployments/eth-mainnet/submit-inwsteth-oracle-log.txt new file mode 100644 index 0000000..1b59063 --- /dev/null +++ b/deployments/eth-mainnet/submit-inwsteth-oracle-log.txt @@ -0,0 +1,37 @@ +./script.sh eth-mainnet script:SubmitOracles --broadcast +Running on eth-mainnet... +=== Configuration === +Operation: Script Execution +Network: eth-mainnet +Script: SubmitOracles.s.sol +Path: script/SubmitOracles.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Disabled +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting script execution... +Executing: forge script script/SubmitOracles.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow +warning: Found unknown config section in foundry.toml: [soldeer] +This notation for profiles has been deprecated and may result in the profile not being registered in future versions. +Please use [profile.soldeer] instead or run `forge config --fix`. +[⠒] Compiling... +No files changed, compilation skipped +Script ran successfully. + +== Logs == + Submitted oracle for collateral: inwstETHs + Price feed: 0x4dDD3d3F3a92939BF352d503aFd4666773fEfa1B + Backup price feed: 0x4dDD3d3F3a92939BF352d503aFd4666773fEfa1B + Heartbeat: 86400 + -------------------------------- + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet/submit-oracles-20250417-log.txt b/deployments/eth-mainnet/submit-oracles-20250417-log.txt new file mode 100644 index 0000000..519b533 --- /dev/null +++ b/deployments/eth-mainnet/submit-oracles-20250417-log.txt @@ -0,0 +1,47 @@ + ./script.sh eth-mainnet script:SubmitOracles --broadcast --verify +Running on eth-mainnet... +=== Configuration === +Operation: Script Execution +Network: eth-mainnet +Script: SubmitOracles.s.sol +Path: script/SubmitOracles.s.sol +RPC URL: http*****://eth-main*****.g.alch*****.com/v2/u8Dd*****-2C-AIUn***** +Admin Address: 0x8409a9C1A911CED491892c5694E43994c9d47E8f +Mode: Live Broadcast--broadcast +Verification: Enabled--verify +Tenderly Verification: Disabled +Debug Mode: Disabled +Uniswap V3 Router: 0xE592427A0AEce92De3Edee1F18E0157C05861564 +Odos V2 Router: 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559 +Pendle Swap V3 Router: 0x888888888889758F76e7103c6CbF23ABbF58F946 +Oracle Timelock: 43200 +=============================== +Starting script execution... +Executing: forge script script/SubmitOracles.s.sol --private-key [MASKED] --rpc-url [MASKED] --broadcast --slow --verify +warning: Found unknown config section in foundry.toml: [soldeer] +This notation for profiles has been deprecated and may result in the profile not being registered in future versions. +Please use [profile.soldeer] instead or run `forge config --fix`. +[⠒] Compiling... +No files changed, compilation skipped +Script ran successfully. + +== Logs == + Submitted oracle for collateral: MC_USDCP + Price feed: 0x4cF5F12c6c0D48F0d335DdB25e11cd526EAfD322 + Backup price feed: 0x4cF5F12c6c0D48F0d335DdB25e11cd526EAfD322 + Heartbeat: 86400 + -------------------------------- + Submitted oracle for collateral: gtusdcf + Price feed: 0x81195F8A79f6553A4078f89eF87b21a7d3C2855A + Backup price feed: 0x81195F8A79f6553A4078f89eF87b21a7d3C2855A + Heartbeat: 86400 + -------------------------------- + Submitted oracle for collateral: mhyETH + Price feed: 0x0221cd3fA8B1Bea16293fb0cD6B60977d531c931 + Backup price feed: 0x00B96F0eBf39158cb4E3F801073966bD6Db7959C + Heartbeat: 86400 + -------------------------------- + +## Setting up 1 EVM. + +========================== \ No newline at end of file diff --git a/deployments/eth-mainnet/submit-oracles-20250515-log.txt b/deployments/eth-mainnet/submit-oracles-20250515-log.txt new file mode 100644 index 0000000..2d1ce45 --- /dev/null +++ b/deployments/eth-mainnet/submit-oracles-20250515-log.txt @@ -0,0 +1,23 @@ +== Logs == + Submitted oracle for collateral: PT-slvlUSD-25SEP2025 + Price feed: 0x5042768E83E2b5F9A7251A41C4E66855DD65fe31 + Backup price feed: 0x5042768E83E2b5F9A7251A41C4E66855DD65fe31 + Heartbeat: 86400 + -------------------------------- + Submitted oracle for collateral: PT-mMEV-31JUL2025 + Price feed: 0x6BE2Bb4FFBb9FE1975A419D144750E604e1D37a1 + Backup price feed: 0x6BE2Bb4FFBb9FE1975A419D144750E604e1D37a1 + Heartbeat: 86400 + -------------------------------- + Submitted oracle for collateral: mMEV + Price feed: 0x5f09Aff8B9b1f488B7d1bbaD4D89648579e55d61 + Backup price feed: 0x5f09Aff8B9b1f488B7d1bbaD4D89648579e55d61 + Heartbeat: 86400 + -------------------------------- + Submitted oracle for collateral: XAUM + Price feed: 0x214eD9Da11D2fbe465a6fc601a91E62EbEc1a0D6 + Backup price feed: 0x214eD9Da11D2fbe465a6fc601a91E62EbEc1a0D6 + Heartbeat: 86400 + -------------------------------- + +## Setting up 1 EVM. diff --git a/deployments/eth-mainnet/submit-price-feed-20250522-log.txt b/deployments/eth-mainnet/submit-price-feed-20250522-log.txt new file mode 100644 index 0000000..939c78b --- /dev/null +++ b/deployments/eth-mainnet/submit-price-feed-20250522-log.txt @@ -0,0 +1,120 @@ +No files changed, compilation skipped +Script ran successfully. + +== Logs == + PriceFeedFactory deployed at 0xcac930B240163fDB71b74514E8FAA113ec0dA844 + PT-eUSDE-14AUG2025 primary price feed address 0x1db66D3BAc8d405643716BF6605D1a045a4AC56C + PT-eUSDE-14AUG2025 primary last answer 98051069 + PT-eUSDE-14AUG2025 secondary price feed address 0x00d14fD4D4525bBe8D6C7d67535df0FAf348f405 + PT-eUSDE-14AUG2025 secondary last answer 98005405 + lbtc primary price feed address 0x68D619f8a4E21c4CC0EAb3c4572ec0c9FeD78D3C + lbtc primary last answer 11033548163381 + lbtc secondary price feed address 0xf338eA0349a717F665842752FabA755B741ee9CA + lbtc secondary last answer 11050039009139 + PT-LBTC-26JUN2025 primary price feed address 0x592a2ef26E70663359514da51F9E2DA62Cfa65e9 + PT-LBTC-26JUN2025 primary last answer 11013920137787 + PT-LBTC-26JUN2025 secondary price feed address 0xEf3E4F385BeB78be528b67560e9E72f96B2Eee99 + PT-LBTC-26JUN2025 secondary last answer 11030381647312 + ynEthx primary price feed address 0x5FDaa369D623d86191105435c7DA03F25417753a + ynEthx primary last answer 278062302772 + ynEthx secondary price feed address 0x2D9f82CcF2068686B46218B7A5Ad47177aF2ef7a + ynEthx secondary last answer 277746919835 + PT-USDS-14AUG2025 primary price feed address 0x4599f532E03458017Fa55F7DCF7A296267637B74 + PT-USDS-14AUG2025 primary last answer 97928861 + +## Setting up 1 EVM. + +========================== + +Chain 1 + +Estimated gas price: 5.73982903 gwei + +Estimated total gas used for script: 9105328 + +Estimated amount required: 0.05226302598207184 ETH + +========================== + + +========================== + +ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. +## +Start verification for (9) contracts +Start verifying contract `0x1db66D3BAc8d405643716BF6605D1a045a4AC56C` deployed on mainnet + +Submitting verification for [contracts/extensions/PTWithPriceFeed.sol:PTWithPriceFeed] 0x1db66D3BAc8d405643716BF6605D1a045a4AC56C. +Submitted contract for verification: + Response: `OK` + GUID: `f3rbjgkxtzhwnkyrhagn6mgc9qrj3vexgxbbx4zfvhl4s8mv5t` + URL: https://etherscan.io/address/0x1db66d3bac8d405643716bf6605d1a045a4ac56c +Start verifying contract `0x00d14fD4D4525bBe8D6C7d67535df0FAf348f405` deployed on mainnet + +Submitting verification for [contracts/extensions/PTWithPriceFeed.sol:PTWithPriceFeed] 0x00d14fD4D4525bBe8D6C7d67535df0FAf348f405. +Submitted contract for verification: + Response: `OK` + GUID: `fmpygyj8xvjhn5lnq5s7gzszpnpv2juapf79gut3itctzzr5wk` + URL: https://etherscan.io/address/0x00d14fd4d4525bbe8d6c7d67535df0faf348f405 +Contract source code already verified +Start verifying contract `0x68D619f8a4E21c4CC0EAb3c4572ec0c9FeD78D3C` deployed on mainnet + +Submitting verification for [contracts/extensions/PriceFeedConverter.sol:PriceFeedConverter] 0x68D619f8a4E21c4CC0EAb3c4572ec0c9FeD78D3C. +Submitted contract for verification: + Response: `OK` + GUID: `bg9phpmkxq138idcd8ztybgdbrfvrvpuh8agca2julfcganrwd` + URL: https://etherscan.io/address/0x68d619f8a4e21c4cc0eab3c4572ec0c9fed78d3c +Contract source code already verified +Start verifying contract `0xf338eA0349a717F665842752FabA755B741ee9CA` deployed on mainnet + +Submitting verification for [contracts/extensions/PriceFeedConverter.sol:PriceFeedConverter] 0xf338eA0349a717F665842752FabA755B741ee9CA. +Submitted contract for verification: + Response: `OK` + GUID: `izz7sz1veq9qu217kz8yzd7qqdw4yrup2cdpkbgbggkbadrdcz` + URL: https://etherscan.io/address/0xf338ea0349a717f665842752faba755b741ee9ca +Contract source code already verified +Start verifying contract `0x592a2ef26E70663359514da51F9E2DA62Cfa65e9` deployed on mainnet + +Submitting verification for [contracts/extensions/PTWithPriceFeed.sol:PTWithPriceFeed] 0x592a2ef26E70663359514da51F9E2DA62Cfa65e9. +Submitted contract for verification: + Response: `OK` + GUID: `wldppnkfympazxzu2uubmjtgjufukvdxv6fvcygyu6w7wndvve` + URL: https://etherscan.io/address/0x592a2ef26e70663359514da51f9e2da62cfa65e9 +Contract source code already verified +Start verifying contract `0xEf3E4F385BeB78be528b67560e9E72f96B2Eee99` deployed on mainnet + +Submitting verification for [contracts/extensions/PTWithPriceFeed.sol:PTWithPriceFeed] 0xEf3E4F385BeB78be528b67560e9E72f96B2Eee99. +Submitted contract for verification: + Response: `OK` + GUID: `avsyilixfu8sjtahftidhwnvgffkkwhjphwh6nnudfslrtl2ye` + URL: https://etherscan.io/address/0xef3e4f385beb78be528b67560e9e72f96b2eee99 +Contract source code already verified +Start verifying contract `0x5FDaa369D623d86191105435c7DA03F25417753a` deployed on mainnet + +Submitting verification for [contracts/extensions/PriceFeedWithERC4626.sol:PriceFeedWithERC4626] 0x5FDaa369D623d86191105435c7DA03F25417753a. +Submitted contract for verification: + Response: `OK` + GUID: `rnhweftihe3wppmjnipblajxrihvflmjsy17y5yywcuc9khxpg` + URL: https://etherscan.io/address/0x5fdaa369d623d86191105435c7da03f25417753a +Contract source code already verified +Start verifying contract `0x2D9f82CcF2068686B46218B7A5Ad47177aF2ef7a` deployed on mainnet + +Submitting verification for [contracts/extensions/PriceFeedWithERC4626.sol:PriceFeedWithERC4626] 0x2D9f82CcF2068686B46218B7A5Ad47177aF2ef7a. +Submitted contract for verification: + Response: `OK` + GUID: `q9q1nqek5vnyuwhi4rpfljjgfa77n71l6zwdjrbatdz4bx9xkq` + URL: https://etherscan.io/address/0x2d9f82ccf2068686b46218b7a5ad47177af2ef7a +Contract source code already verified +Start verifying contract `0x4599f532E03458017Fa55F7DCF7A296267637B74` deployed on mainnet + +Submitting verification for [contracts/extensions/PTWithPriceFeed.sol:PTWithPriceFeed] 0x4599f532E03458017Fa55F7DCF7A296267637B74. +Submitted contract for verification: + Response: `OK` + GUID: `8adtm68vr3xycjcq4dxhbiee1dc25ewdngn8xwmq9avlxf49at` + URL: https://etherscan.io/address/0x4599f532e03458017fa55f7dcf7a296267637b74 +Contract successfully verified + +Transactions saved to: /Users/vincent/Documents/ts-codes/termmax-contract/broadcast/DeployPriceFeedsEth_20250522.s.sol/1/run-latest.json + +Sensitive values saved to: /Users/vincent/Documents/ts-codes/termmax-contract/cache/DeployPriceFeedsEth_20250522.s.sol/1/run-latest.json + diff --git a/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-access-manager.json b/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-access-manager.json new file mode 100644 index 0000000..6088188 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "eth-sepolia", + "deployedAt": "1743741852", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x02fff1d6d797ed5e62117eb2d07b7f4f25d0e281", + "blockInfo": { + "number": "8046695", + "timestamp": "1743741852" + }, + "deployer": "0xE355d5D8aa52EF0FbbD037C4a3C5E6Fd659cf46B", + "admin": "0x81f314f70702Bbe89FEd0F2cFe6841950275E0b7", + "contracts": { + "accessManager": "0x593320B6222A31850FA4AB911EdDf9f1Ad15dad1" + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-core.json b/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-core.json new file mode 100644 index 0000000..8253e56 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-core.json @@ -0,0 +1,21 @@ +{ + "network": "eth-sepolia", + "deployedAt": "1743742452", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x02fff1d6d797ed5e62117eb2d07b7f4f25d0e281", + "blockInfo": { + "number": "8046744", + "timestamp": "1743742452" + }, + "deployer": "0xE355d5D8aa52EF0FbbD037C4a3C5E6Fd659cf46B", + "admin": "0x81f314f70702Bbe89FEd0F2cFe6841950275E0b7", + "contracts": { + "factory": "0x04031181e1d5860DEA665e43E29749b341817edc", + "vaultFactory": "0x7594f6f6807d277094539d164B89918a62C07DeB", + "oracleAggregator": "0xcc63A183778281d4DB937A1d02E7f8f7C96a8F91", + "router": "0x7730c2fA4F4A17A53705BD1a471ceC305b6421e4", + "swapAdapter": "0xA7218B54C3781F2E77019e3F179455Bd3Da68EDc", + "faucet": "0x9C6300161351626a3B91a64f02174eC14917347c", + "marketViewer": "0x784647f66D8156Ab4942649940469A73Da10Efb0" + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-USDC-PT-sUSDE-29MAY2025@06APR2025.json b/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-USDC-PT-sUSDE-29MAY2025@06APR2025.json new file mode 100644 index 0000000..c367f45 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-USDC-PT-sUSDE-29MAY2025@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8046796", + "timestamp": "1743743112" + }, + "market": "0x66A109Cbf4D89FE09595B8CC15d2d7a459Eca99c", + "collateral": { + "address": "0xADCa62Ad0F7D3645a196833b0b51E77D685fF238", + "symbol": "PT-sUSDE-29MAY2025", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x412e037E092E5dc77d4D7DffdC105132eCb9AB62", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x0fD365C479bd2b5CECC2eca2Cab0100D838d0f97", + "xt": "0xd93fbf89601A986A84Fc941C9084853f5D85b530", + "gt": "0x4Db48db538F2d0511ab645041dbdC987FDbE0F32" + }, + "config": { + "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-USDC-USUALUSDC+@06APR2025.json b/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-USDC-USUALUSDC+@06APR2025.json new file mode 100644 index 0000000..f3a1a3c --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-USDC-USUALUSDC+@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8046796", + "timestamp": "1743743112" + }, + "market": "0x42186bb9250DBcD8a582d07192Eb567CC27582A1", + "collateral": { + "address": "0xEC04d3c184114000f9d7dE9C74b52B17DaACCa20", + "symbol": "USUALUSDC+", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x412e037E092E5dc77d4D7DffdC105132eCb9AB62", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xdac41ADd721c0dAe6257e6759909454DeD73f0d6", + "xt": "0x70AD6a4e480d1236d47C6FEC92558d3eaC88120a", + "gt": "0x4D7CE3bCd82DEBDBa1E7f29404B793176A40361C" + }, + "config": { + "marketSymbol": "USDC/USUALUSDC+@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-USDC-WBTC@06APR2025.json b/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-USDC-WBTC@06APR2025.json new file mode 100644 index 0000000..6e15fb6 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-USDC-WBTC@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8046796", + "timestamp": "1743743112" + }, + "market": "0x14d0210Be617e05101B127fCEA72FC884b2c16EF", + "collateral": { + "address": "0xbb96F91E8D9108015242F018E89dEf1f3e0c3bA4", + "symbol": "WBTC", + "priceFeed": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "heartBeat": "3600" + }, + "underlying": { + "address": "0x412e037E092E5dc77d4D7DffdC105132eCb9AB62", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x2c99be0a4A188B62AF74AB233cA6E7aEe34f57b3", + "xt": "0xBE1C2c1e39a1B195B72cc2F69968EB9D4264E89B", + "gt": "0x4fcA326cE27f8EB6A50410795817f905D43B6a92" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-USDC-cbBTC@06APR2025.json b/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-USDC-cbBTC@06APR2025.json new file mode 100644 index 0000000..230a407 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-USDC-cbBTC@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8046796", + "timestamp": "1743743112" + }, + "market": "0xa9CA6Ae9C447aC8C6fc9dcBC6b0530C33cF6EF68", + "collateral": { + "address": "0x11b90630189Cf88699d5b642E1dCc295EE3519A6", + "symbol": "cbBTC", + "priceFeed": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x412e037E092E5dc77d4D7DffdC105132eCb9AB62", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xC90788d0A26215376E2Dc09E15F801bd4D81cE18", + "xt": "0x99A9D2eaa682E1C5BDe22857d417f691f7F97d3a", + "gt": "0x9dEDbcbE19477Fb344bFe0EAEB4e2a8B71224011" + }, + "config": { + "marketSymbol": "USDC/cbBTC@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-USDC-eUSDe@06APR2025.json b/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-USDC-eUSDe@06APR2025.json new file mode 100644 index 0000000..828ce28 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-USDC-eUSDe@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8046796", + "timestamp": "1743743112" + }, + "market": "0x93aa2855328C2648A0Ff920204ceb598C1151Cb1", + "collateral": { + "address": "0xD7C8D7F7971e0ca111c59ea60b007236bC143e49", + "symbol": "eUSDe", + "priceFeed": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x412e037E092E5dc77d4D7DffdC105132eCb9AB62", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x58F7761aE5990e92107e9B6d78a9B3240206C93c", + "xt": "0x2bCfffb78b544496c86F49afD4539eABB33E0Acb", + "gt": "0x0e38524019992056dA89340BBa8f0CC9900Fd8A1" + }, + "config": { + "marketSymbol": "USDC/eUSDe@29MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-USDC-sUSDe@06APR2025.json b/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-USDC-sUSDe@06APR2025.json new file mode 100644 index 0000000..b784172 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-USDC-sUSDe@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8046796", + "timestamp": "1743743112" + }, + "market": "0x3141f0839113dFB6e81fdedB2D9C495F93A1F5c3", + "collateral": { + "address": "0x75748B0B25a5076d7D1441b8667af99284fBbDF8", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x412e037E092E5dc77d4D7DffdC105132eCb9AB62", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xb71e2F953DD20c1F7dd0362C09dbf741857043AB", + "xt": "0xF47eb1809a11c688dabfFD384417F1FBbda535dA", + "gt": "0x8303D51AE712f0188661f8a07479891041eb45d9" + }, + "config": { + "marketSymbol": "USDC/sUSDe@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-USDC-wstETH@06APR2025.json b/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-USDC-wstETH@06APR2025.json new file mode 100644 index 0000000..e244038 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-USDC-wstETH@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8046796", + "timestamp": "1743743112" + }, + "market": "0x01BB77Be04b452BFc74F99Ec75F8B929BB8A73a0", + "collateral": { + "address": "0xf155CF40d6c0f1099757706BFaA84E2F8a77f8ef", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x412e037E092E5dc77d4D7DffdC105132eCb9AB62", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x548EA2246877f93069bf09E2995d97b9e02d3acf", + "xt": "0xd0Efe8009bB566fc1A53951DfDAa1C54666D3e94", + "gt": "0x1a00628decFecF5E326229ca169519e462880256" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-WETH-MCwETH@06APR2025.json b/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-WETH-MCwETH@06APR2025.json new file mode 100644 index 0000000..a85a565 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-WETH-MCwETH@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8046796", + "timestamp": "1743743112" + }, + "market": "0x4D0dbba1062AD039E31f6a7Bc2Cb27154fcC54a1", + "collateral": { + "address": "0x20043D6bf20f29a4b22D9a094A74469d47481976", + "symbol": "MCwETH", + "priceFeed": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", + "heartBeat": "3600" + }, + "underlying": { + "address": "0x61ccFfB89b22859cB970D2580715Fe219a151B25", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xF696089a74d66aC705b575438665A39515aa370B", + "xt": "0x570752307BAFa979be030D41bAC77B9947eB9738", + "gt": "0x7F098EEf0543FB08B9A7057d225bA075fdAF9475" + }, + "config": { + "marketSymbol": "WETH/MCwETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-WETH-gtWETH@06APR2025.json b/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-WETH-gtWETH@06APR2025.json new file mode 100644 index 0000000..35261e1 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-WETH-gtWETH@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8046796", + "timestamp": "1743743112" + }, + "market": "0x818e016050Ec7d40B9bc58728Fe6D18De6807a31", + "collateral": { + "address": "0x854421001374da9113BB51F7dc0DeAEf31be691e", + "symbol": "gtWETH", + "priceFeed": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", + "heartBeat": "3600" + }, + "underlying": { + "address": "0x61ccFfB89b22859cB970D2580715Fe219a151B25", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0xd5faEdD923c39e25839874883067dE85f15f273D", + "xt": "0xf1a8F361AEA15f226C6619f5C4bE2234A48D9Ec9", + "gt": "0x86acC70f85579B2f840F33dC08d492eaaF8234Cd" + }, + "config": { + "marketSymbol": "WETH/gtWETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-WETH-pufETH@06APR2025.json b/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-WETH-pufETH@06APR2025.json new file mode 100644 index 0000000..48c9dc3 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-WETH-pufETH@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8046796", + "timestamp": "1743743112" + }, + "market": "0x6B697AaCe1c228051166f6a82d8eF54bB476D0DD", + "collateral": { + "address": "0x4CdA4bDEf6bD54a59F4FB35cF8041e44e861Dd15", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x61ccFfB89b22859cB970D2580715Fe219a151B25", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x044D2bD3A83Be02a0c16C96eA8587c95d36d256a", + "xt": "0x73f9Bf61ab3B2f0557ff189C4d5E17E6567BfbBC", + "gt": "0x75bb96bBeAE7e2DD424859ca4b7E0151b980E47C" + }, + "config": { + "marketSymbol": "WETH/pufETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-WETH-weETH@06APR2025.json b/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-WETH-weETH@06APR2025.json new file mode 100644 index 0000000..faf1b44 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-WETH-weETH@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8046796", + "timestamp": "1743743112" + }, + "market": "0x6886860b4EC95fd8373E698c3031c59796F0b2Ea", + "collateral": { + "address": "0x79d81c5Bdb4bc98ac31B25D1B5790f84F04b2542", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "21600" + }, + "underlying": { + "address": "0x61ccFfB89b22859cB970D2580715Fe219a151B25", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x9BD1fFe8dCFA66a81585AEfDEC877044B5Fb54DA", + "xt": "0x853Bc8eA1884a68502dD61790A3676211bad21A0", + "gt": "0x9C1B7C8f2D44ef1d866F38aF12edb27FF38b1bcA" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-pufETH-PT-pufETH-26JUN2025@06APR2025.json b/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-pufETH-PT-pufETH-26JUN2025@06APR2025.json new file mode 100644 index 0000000..c43b9e0 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-sandbox-20250404/eth-sepolia-market-pufETH-PT-pufETH-26JUN2025@06APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8046796", + "timestamp": "1743743112" + }, + "market": "0x11a1Ac00C0069E8f05E50926888c3cdeE673d676", + "collateral": { + "address": "0x75D7C7d49147688F3704e5bd80e6166896F0fd65", + "symbol": "PT-pufETH-26JUN2025", + "priceFeed": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x4CdA4bDEf6bD54a59F4FB35cF8041e44e861Dd15", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x3F13C05019b903C6395E467bf8a5121BB62fa07e", + "xt": "0x5862b0ae0d868e1dDb7A1d4b2b12187Eb452A139", + "gt": "0x7e88697feBa219837AcD6a2e4B7e217150bC1d2F" + }, + "config": { + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "06APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-access-manager.json b/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-access-manager.json new file mode 100644 index 0000000..cded3a2 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "eth-sepolia", + "deployedAt": "1744523760", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x1b19b284f4f6a7ffebcb90e1d9af5058a71d0ab5", + "blockInfo": { + "number": "8108621", + "timestamp": "1744523760" + }, + "deployer": "0xE355d5D8aa52EF0FbbD037C4a3C5E6Fd659cf46B", + "admin": "0x81f314f70702Bbe89FEd0F2cFe6841950275E0b7", + "contracts": { + "accessManager": "0x1b020ed8272AADe274a25Aa46E20bEEe00115995" + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-core.json b/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-core.json new file mode 100644 index 0000000..8fd4a4a --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-core.json @@ -0,0 +1,21 @@ +{ + "network": "eth-sepolia", + "deployedAt": "1744524012", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x1b19b284f4f6a7ffebcb90e1d9af5058a71d0ab5", + "blockInfo": { + "number": "8108640", + "timestamp": "1744524012" + }, + "deployer": "0xE355d5D8aa52EF0FbbD037C4a3C5E6Fd659cf46B", + "admin": "0x81f314f70702Bbe89FEd0F2cFe6841950275E0b7", + "contracts": { + "factory": "0xd5c4Ac6F6Adc283e74005E5691F0DC1D41f18738", + "vaultFactory": "0x62D2c0171A5D20af57f19EFb29C07C1AB5fEE1f0", + "oracleAggregator": "0x8D1b01CBD98352c6f85c4f583a143C6507e23545", + "router": "0x52bcBa6FF60d1f4f5b2460Ed2c1Ed278fCdfA776", + "swapAdapter": "0x78854923503eF5183426891d580CA586Dd1F69b7", + "faucet": "0xBFADf85c4aaf2E57EB814ce7195BAE27ED0097c7", + "marketViewer": "0xd8be21e186bfcCFcD78801436B2c4d1fbF8C2101" + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-USDC-PT-sUSDE-29MAY2025@30MAY2025.json b/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-USDC-PT-sUSDE-29MAY2025@30MAY2025.json new file mode 100644 index 0000000..f4b2119 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-USDC-PT-sUSDE-29MAY2025@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8108682", + "timestamp": "1744524624" + }, + "market": "0x4Baa6798534fFEf42F9B8C413908F15FcC8220d5", + "collateral": { + "address": "0x7E0145c0a969889eD1c2aFb1e4133FB85771f302", + "symbol": "PT-sUSDE-29MAY2025", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x1D82d84c77903611825915682224b8a6008277dF", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x0230cE501E03559ae7822BDC499a8C01256B1ca9", + "xt": "0x03027C4e72Fe79F75Db5996Cbe48e623b28e58ba", + "gt": "0x0e52b4733F0D5a352cBcd45bD9B44AeFF8Bf9586" + }, + "config": { + "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-USDC-USUALUSDC+@30MAY2025.json b/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-USDC-USUALUSDC+@30MAY2025.json new file mode 100644 index 0000000..5794795 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-USDC-USUALUSDC+@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8108682", + "timestamp": "1744524624" + }, + "market": "0xD8C7491a568774Ff0B00542bCF399493AD0713e4", + "collateral": { + "address": "0xC34365d7Ec59b3348688081cf4A0C5CAf79fcfF8", + "symbol": "USUALUSDC+", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x1D82d84c77903611825915682224b8a6008277dF", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x0790d6a0CfC66529cfAcEeD296DE2d48e105c2fF", + "xt": "0xBc00519DF74D4DC46260a77Aa05d3Bb37f072D24", + "gt": "0x67C303Ee204dA1B6793a7Fc61B1b24DaAC71e0D1" + }, + "config": { + "marketSymbol": "USDC/USUALUSDC+@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-USDC-WBTC@30MAY2025.json b/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-USDC-WBTC@30MAY2025.json new file mode 100644 index 0000000..6e50667 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-USDC-WBTC@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8108682", + "timestamp": "1744524624" + }, + "market": "0x4F3e9C8C26949D46C1dc27d03A288c8555759F48", + "collateral": { + "address": "0xA563d8C7fD838Ac0cb602028A854B225230b9626", + "symbol": "WBTC", + "priceFeed": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x1D82d84c77903611825915682224b8a6008277dF", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xA30bb367476A32E0fe2Cf32E634DD1d83C7DB5D2", + "xt": "0xE57302E26bAcc4De743F52622e3686C29ECB885A", + "gt": "0xd1882D7cb7C49b59862fB192179a2AB950c5f92f" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-USDC-cbBTC@30MAY2025.json b/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-USDC-cbBTC@30MAY2025.json new file mode 100644 index 0000000..097a1e0 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-USDC-cbBTC@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8108682", + "timestamp": "1744524624" + }, + "market": "0xE6bA5cD44ECd1e3A0470CC9b4464D04dA8d71660", + "collateral": { + "address": "0x951a44312d7Ad087d6FCA3a5e13583481ED10453", + "symbol": "cbBTC", + "priceFeed": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x1D82d84c77903611825915682224b8a6008277dF", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xFc0535dB78e90a080351537aBfC808E50dB935bf", + "xt": "0x4302aBe1ebEB82117C647Fa13dd5dac5652d0525", + "gt": "0x2427049A01DbEb47D0Ee50BDB678F6563cC3452D" + }, + "config": { + "marketSymbol": "USDC/cbBTC@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-USDC-eUSDe@29MAY2025.json b/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-USDC-eUSDe@29MAY2025.json new file mode 100644 index 0000000..c388a69 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-USDC-eUSDe@29MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8108682", + "timestamp": "1744524624" + }, + "market": "0x81657aeF2ec1141DD10eD737550FB5019E6F27F5", + "collateral": { + "address": "0x4C2aeA7Fa8E72D9A556918781821e2CFF113de5C", + "symbol": "eUSDe", + "priceFeed": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x1D82d84c77903611825915682224b8a6008277dF", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xee4B45E7F9c55FCefECe310f56CFd73b11486e8E", + "xt": "0xbd6CC033c568e0ee5480144248F600a92e517c95", + "gt": "0x311553240D8efd1A93901f0ef6A516458ee586e0" + }, + "config": { + "marketSymbol": "USDC/eUSDe@29MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "29MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-USDC-sUSDe@30MAY2025.json b/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-USDC-sUSDe@30MAY2025.json new file mode 100644 index 0000000..0d3aa96 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-USDC-sUSDe@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8108682", + "timestamp": "1744524624" + }, + "market": "0x2c4Fa22583db4987467fE01b12d2475AC809594b", + "collateral": { + "address": "0xd3Db12Df959Daea1D6cCF288D00b79a8B96FCfD4", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x1D82d84c77903611825915682224b8a6008277dF", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x6F446d40C08D1C2Ba6dfbc7C0946aE137002644a", + "xt": "0x7A0011ebDb220d31E87172aCF8D5Db3B30F94Ca6", + "gt": "0xDFaaaB0530f5c9e31F4387Cd930Ee5c9c56e5D74" + }, + "config": { + "marketSymbol": "USDC/sUSDe@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-USDC-wstETH@30MAY2025.json b/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-USDC-wstETH@30MAY2025.json new file mode 100644 index 0000000..dbda43c --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-USDC-wstETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8108682", + "timestamp": "1744524624" + }, + "market": "0xDC5c03df7f67ad0e64DBe57831F6f21E480Ec248", + "collateral": { + "address": "0xFD37068aa721F85522d0042f9Fa97dED1162EbD0", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x1D82d84c77903611825915682224b8a6008277dF", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xb400d13a248Ec1F65526013bEf84451A553396d8", + "xt": "0x9309fa5f406BF5882ca65d3A1b53e0BaFEDed1a1", + "gt": "0x0908F4AF6AA1cabc3379cB7fE25446b1db027E00" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-WETH-MCwETH@30MAY2025.json b/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-WETH-MCwETH@30MAY2025.json new file mode 100644 index 0000000..9b01d29 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-WETH-MCwETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8108682", + "timestamp": "1744524624" + }, + "market": "0x4c7Cd8eDAe914Edad8883347343Dd565fD5A40f7", + "collateral": { + "address": "0xf63e8AcCaf7FEC5A132b3564aDBEB6a950f9D9CD", + "symbol": "MCwETH", + "priceFeed": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x5f9B1d24D9029c89b49aE3DEbc85Ab49245fC39e", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x00e736e9E4A89C2F811eD2e0F6F81f00241fD00a", + "xt": "0x7E1942F69bFa6D06ED4CD2920e9953631FE25498", + "gt": "0xf2D36d48BB912aa12Cf04e7f10c0bCf55AFa4cf8" + }, + "config": { + "marketSymbol": "WETH/MCwETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-WETH-gtWETH@30MAY2025.json b/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-WETH-gtWETH@30MAY2025.json new file mode 100644 index 0000000..143998d --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-WETH-gtWETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8108682", + "timestamp": "1744524624" + }, + "market": "0x17cb434b11F050c98e5B0d119495Ae11a28Ef027", + "collateral": { + "address": "0xa4fF38705348B21b1154BAb14081bBDDddf3DAb4", + "symbol": "gtWETH", + "priceFeed": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x5f9B1d24D9029c89b49aE3DEbc85Ab49245fC39e", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x72c4a9284DC1e6dB682384ff069F5621F3e31EDF", + "xt": "0xe21f51746faEd41ea67f0C2317378b496aA63244", + "gt": "0xaCceC7ACefE2e2dEcD0B78767D31b973F4a7A395" + }, + "config": { + "marketSymbol": "WETH/gtWETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-WETH-pufETH@30MAY2025.json b/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-WETH-pufETH@30MAY2025.json new file mode 100644 index 0000000..3beada3 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-WETH-pufETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8108682", + "timestamp": "1744524624" + }, + "market": "0xE5CF329Da44c579DB1774339Eab62df06a476853", + "collateral": { + "address": "0x343e2bDA178FBFc995da36AbF45d872567F172E2", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x5f9B1d24D9029c89b49aE3DEbc85Ab49245fC39e", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x14C2e2ECE5D506A052cb39b63C559DccD26dcB4C", + "xt": "0x781669e1da8CDA943Be4Af519820AeFef789f762", + "gt": "0x68215ace62F0B0C332986E6a3f3BAb8d3509E73f" + }, + "config": { + "marketSymbol": "WETH/pufETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-WETH-weETH@30MAY2025.json b/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-WETH-weETH@30MAY2025.json new file mode 100644 index 0000000..0a7a7d5 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-WETH-weETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8108682", + "timestamp": "1744524624" + }, + "market": "0x956E1158Be33A40aB4D80aCaa8a277Cc3b0C6DD4", + "collateral": { + "address": "0x870252AE60aCa9667935CA94fe6768489D77e2E0", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x5f9B1d24D9029c89b49aE3DEbc85Ab49245fC39e", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xb209269F8074eD80e78E17eb4BB4309312b99766", + "xt": "0x9A852cdbBc4f1eF5A9046F84CCF4a0439dD59AB3", + "gt": "0x7aAd9577F8115404Cc1f7F72FB6D1a871A5ce0dd" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-pufETH-PT-pufETH-26JUN2025@30MAY2025.json b/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-pufETH-PT-pufETH-26JUN2025@30MAY2025.json new file mode 100644 index 0000000..52f8e10 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-sandbox-20250413/eth-sepolia-market-pufETH-PT-pufETH-26JUN2025@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8108682", + "timestamp": "1744524624" + }, + "market": "0x88B76e249c052a719Cb2701fd16B299550011CF9", + "collateral": { + "address": "0xA435495bC3CF5DF19E2Ec9e44331408768B66861", + "symbol": "PT-pufETH-26JUN2025", + "priceFeed": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x343e2bDA178FBFc995da36AbF45d872567F172E2", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x7183A133b9f7C9a2E52E522038038b88ea706900", + "xt": "0x786199b1bE0D8B2AeD2691007619c7c356d9731A", + "gt": "0x5b0404cA0975f799eeAA3ae56655E3B0Bc54d969" + }, + "config": { + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-staging-20250527/eth-sepolia-access-manager.json b/deployments/eth-sepolia-v1.0.8-staging-20250527/eth-sepolia-access-manager.json new file mode 100644 index 0000000..0854349 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-staging-20250527/eth-sepolia-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "eth-sepolia", + "deployedAt": "1748270760", + "gitBranch": "deploy/v1.0.9", + "gitCommitHash": "0x0xf96b35287288133061e1101131d7783969d2940d", + "blockInfo": { + "number": "8411075", + "timestamp": "1748270760" + }, + "deployer": "0xE355d5D8aa52EF0FbbD037C4a3C5E6Fd659cf46B", + "admin": "0x81f314f70702Bbe89FEd0F2cFe6841950275E0b7", + "contracts": { + "accessManager": "0xF97f629993AF917fFCa5Aa5dbFC89937098270fd" + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-staging-20250527/eth-sepolia-core.json b/deployments/eth-sepolia-v1.0.8-staging-20250527/eth-sepolia-core.json new file mode 100644 index 0000000..412f8f8 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-staging-20250527/eth-sepolia-core.json @@ -0,0 +1,21 @@ +{ + "network": "eth-sepolia", + "deployedAt": "1748271696", + "gitBranch": "deploy/v1.0.9", + "gitCommitHash": "0x0xf96b35287288133061e1101131d7783969d2940d", + "blockInfo": { + "number": "8411153", + "timestamp": "1748271696" + }, + "deployer": "0xE355d5D8aa52EF0FbbD037C4a3C5E6Fd659cf46B", + "admin": "0x81f314f70702Bbe89FEd0F2cFe6841950275E0b7", + "contracts": { + "factory": "0x80F84584b1bcAc9653261DD647e08f2893DC7cC2", + "vaultFactory": "0x1d75f27D66E11ac21D8970A7f9087D8a8a08a847", + "oracleAggregator": "0x79F31F8e0D7DAEd9C47292A0b8141fb9F3C2Cb63", + "router": "0x73b41257862498346FbCd1C4CFF447450ED7732a", + "swapAdapter": "0xbA3AFe7F2A906b6A06279A496DA56f0C4cEc6497", + "faucet": "0x0c48c8379b1499A6bb4bb25F0865eE1E05D11cb7", + "marketViewer": "0xa4F749FfF8462e7dE95069D134A2ed79e2ce3F32" + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-staging-20250527/eth-sepolia-market-USDC-wstETH@27MAY2025.json b/deployments/eth-sepolia-v1.0.8-staging-20250527/eth-sepolia-market-USDC-wstETH@27MAY2025.json new file mode 100644 index 0000000..a053826 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-staging-20250527/eth-sepolia-market-USDC-wstETH@27MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8411286", + "timestamp": "1748273304" + }, + "market": "0x9293a829E9f1BF86d3c0dbAD0D404b08672E5a3c", + "collateral": { + "address": "0x34EB42E88Ee00949212F98d86DF30DB10f306eef", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x7866f61d2cD2AFF9262C53bE9328e0Ab9f0f0D72", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x6A8980374c354c313be7B75f17Ac165569ca1D87", + "xt": "0xdB904a3568f944fF568232Dce6b057C48485057C", + "gt": "0xf64b12Cd1514d0c6Af80830A0F86E0104fDDffD9" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "27MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-staging-20250527/eth-sepolia-market-WETH-weETH@27MAY2025.json b/deployments/eth-sepolia-v1.0.8-staging-20250527/eth-sepolia-market-WETH-weETH@27MAY2025.json new file mode 100644 index 0000000..e43b5bc --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-staging-20250527/eth-sepolia-market-WETH-weETH@27MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8411247", + "timestamp": "1748272824" + }, + "market": "0x2dbAF062C29bf4981BCee272fD3531307Bd82dD5", + "collateral": { + "address": "0xAEacaC65Ae784f761693d8F957950720015caCcD", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x57b9B1641d4e4bD32AA0543f2343c20CBaDfa5d9", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xDcEdB8d09761ddA87dDc314656a63a9ade6AceAC", + "xt": "0x9A764C82C84a871271ecbDb49b920aeb0d401E36", + "gt": "0xa94d5064485eB290690cD7709e7afFe43162E760" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "27MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-staging-20250527/eth-sepolia-vault-TMX-USDC.json b/deployments/eth-sepolia-v1.0.8-staging-20250527/eth-sepolia-vault-TMX-USDC.json new file mode 100644 index 0000000..64e34da --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-staging-20250527/eth-sepolia-vault-TMX-USDC.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.9", + "commit": "0x0xf96b35287288133061e1101131d7783969d2940d" + }, + "blockInfo": { + "network": "eth-sepolia", + "blockNumber": "8411332", + "timestamp": "1748273856" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TMX-USDC", + "address": "0x218Caa7cd17E90b27EDC4a711B4C6aE52111441E", + "asset": "0x7866f61d2cD2AFF9262C53bE9328e0Ab9f0f0D72", + "performanceFeeRate": 0, + "maxCapacity": "4000000000", + "timelock": 86400, + "admin": "0xF97f629993AF917fFCa5Aa5dbFC89937098270fd", + "curator": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE", + "guardian": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE", + "allocator": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE" + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-access-manager.json b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-access-manager.json new file mode 100644 index 0000000..3d63b1b --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "eth-sepolia", + "deployedAt": "1744104768", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x141ada4a7f722cd4faab7818834dada2688bdc69", + "blockInfo": { + "number": "8076356", + "timestamp": "1744104768" + }, + "deployer": "0xE355d5D8aa52EF0FbbD037C4a3C5E6Fd659cf46B", + "admin": "0x81f314f70702Bbe89FEd0F2cFe6841950275E0b7", + "contracts": { + "accessManager": "0xcAe062fCe470C1A8567Fd812905C18EC08431644" + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-core.json b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-core.json new file mode 100644 index 0000000..9e6c488 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-core.json @@ -0,0 +1,21 @@ +{ + "network": "eth-sepolia", + "deployedAt": "1744105236", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x141ada4a7f722cd4faab7818834dada2688bdc69", + "blockInfo": { + "number": "8076395", + "timestamp": "1744105236" + }, + "deployer": "0xE355d5D8aa52EF0FbbD037C4a3C5E6Fd659cf46B", + "admin": "0x81f314f70702Bbe89FEd0F2cFe6841950275E0b7", + "contracts": { + "factory": "0x74d7E445852E405E92aDC75e4309E9626A4E142f", + "vaultFactory": "0xb14488641C7206636C0ab681A67CB8dbb930ae90", + "oracleAggregator": "0xa54F41EB0Ce499F07a044bcf76F6Bb4cCdb0F4A1", + "router": "0x769020BDbD532a7e1A7C15521Ab4b0Df7a95328a", + "swapAdapter": "0xE146A9e954b2DFD0Fd71668A9Ac70A590486c758", + "faucet": "0xeEbc49f73bC2faF0E6b52Fd78aec4a4eaA3e64D5", + "marketViewer": "0x7602984752987Ccb9cf526F51984124c0C30f73b" + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-PT-sUSDE-29MAY2025@30MAY2025.json b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-PT-sUSDE-29MAY2025@30MAY2025.json new file mode 100644 index 0000000..232c0df --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-PT-sUSDE-29MAY2025@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8076440", + "timestamp": "1744105800" + }, + "market": "0xd039A90DAeEe9665a2a5cf90858406a93418610C", + "collateral": { + "address": "0xE752EAf6c376F3aFc92F491C038b6034cFF2ed6B", + "symbol": "PT-sUSDE-29MAY2025", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x9EfB1F973a4B9215028094B71392961266177736", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x09974090Cc5dd30dD903dd900A2b311371dD695c", + "xt": "0xb9FE59e12d06360D91034C069dbc90bc436053CB", + "gt": "0x73e90e6101F914B799E7aaB6cafe475560272eEB" + }, + "config": { + "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-USUALUSDC+@30MAY2025.json b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-USUALUSDC+@30MAY2025.json new file mode 100644 index 0000000..2d9db4f --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-USUALUSDC+@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8076440", + "timestamp": "1744105800" + }, + "market": "0xc5ACFAe592806404DEc2b10114E1bC4F59D3a2BB", + "collateral": { + "address": "0x3b6Dc6959f6BC2e0a771F42c2ed5AC61558A070D", + "symbol": "USUALUSDC+", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x9EfB1F973a4B9215028094B71392961266177736", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x5C9e92db7f7bE6dD506C30A6a28e9201c78782Fa", + "xt": "0x8a85fe2f51d1e13859A42aad0436909dc312F567", + "gt": "0x4F7d358943b0Ced097ec89Cc3908CE8feCaD8B7a" + }, + "config": { + "marketSymbol": "USDC/USUALUSDC+@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-WBTC@30MAY2025.json b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-WBTC@30MAY2025.json new file mode 100644 index 0000000..48a26d7 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-WBTC@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8076440", + "timestamp": "1744105800" + }, + "market": "0xaFe10Ad8d4d179cb8D843E03729d47e2C4c2bbc5", + "collateral": { + "address": "0xeA569a4Ae4Bd3C71De9839DE21744177E979D86B", + "symbol": "WBTC", + "priceFeed": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "heartBeat": "3600" + }, + "underlying": { + "address": "0x9EfB1F973a4B9215028094B71392961266177736", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xfD44183B0d3a124F7c17aa34148B870d3aBBD219", + "xt": "0x8D4310d7857D06B96239ab2c66d16bCeA639c487", + "gt": "0x62cDC480FFbfE711888116c87DFD56778Da797E6" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-cbBTC@30MAY2025.json b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-cbBTC@30MAY2025.json new file mode 100644 index 0000000..8a85133 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-cbBTC@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8076440", + "timestamp": "1744105800" + }, + "market": "0x17AcE2764c593c3A29139686B7e70Abe46964Cbf", + "collateral": { + "address": "0x0Ab56705cBEcb370077C9061ce0c1001F18d7D65", + "symbol": "cbBTC", + "priceFeed": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x9EfB1F973a4B9215028094B71392961266177736", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x62E9bDC0B04bb449A1482627d4CcE53BEB1D12e9", + "xt": "0x5871FeDc05Db81d957CC8c8AFfdEB10A796F489a", + "gt": "0xBbEf58570483147FFF5b098a53AC194213a47390" + }, + "config": { + "marketSymbol": "USDC/cbBTC@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-eUSDe@29MAY2025.json b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-eUSDe@29MAY2025.json new file mode 100644 index 0000000..e2938d4 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-eUSDe@29MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8076440", + "timestamp": "1744105800" + }, + "market": "0xA01ebcc30F5A04d05ef08509bEba37369c7Ad5c4", + "collateral": { + "address": "0x8d1674d9Faa6D000C5Fccb96C6E3Ea243fE7dAb9", + "symbol": "eUSDe", + "priceFeed": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x9EfB1F973a4B9215028094B71392961266177736", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x541F31deB35c3A30Db9803bFC5f62931bd90eAe0", + "xt": "0xa39432D9D68bf009c3DeF643255837D43fFFb6D9", + "gt": "0x01356e9680b64FA4B06597ddd4802F7638D3BFE9" + }, + "config": { + "marketSymbol": "USDC/eUSDe@29MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "29MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-sUSDe@30MAY2025.json b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-sUSDe@30MAY2025.json new file mode 100644 index 0000000..d477aee --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-sUSDe@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8076440", + "timestamp": "1744105800" + }, + "market": "0x635430374F936e1371caa5f423253aE6A60c6094", + "collateral": { + "address": "0x668756092EF35B95e5972Daf4646B0904D77B8A2", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x9EfB1F973a4B9215028094B71392961266177736", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x6bE96A6Fb035b68C8d32B1F3F45B8a83A2C1eDE6", + "xt": "0x2506129881eB3363b9Fc72640162c195F9093cF8", + "gt": "0xEA861a9b80D6Bf302A180A1d71a761558cf7F588" + }, + "config": { + "marketSymbol": "USDC/sUSDe@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-wstETH@11APR2025.json b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-wstETH@11APR2025.json new file mode 100644 index 0000000..36538cc --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-wstETH@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8094955", + "timestamp": "1744344168" + }, + "market": "0x4B36FAB576513175f16aE91640385bB0d8E769fA", + "collateral": { + "address": "0x5f5b868451Bef658C72B553783A1E514aB581e8a", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x9EfB1F973a4B9215028094B71392961266177736", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x2D136A7807B464fb6a46B69C15cef14824039BD9", + "xt": "0x0BDb214ebA6CB1D025137B92Da1b90409F12362E", + "gt": "0x6ea3Ba9CB69969Dcdadf1B258e78F2858ed0c794" + }, + "config": { + "marketSymbol": "USDC/wstETH@11APR2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-wstETH@27JUN2025.json b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-wstETH@27JUN2025.json new file mode 100644 index 0000000..0b3e753 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-wstETH@27JUN2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8461289", + "timestamp": "1748874444" + }, + "market": "0xe0308B314bbF277C334191e98d606d354f4B74e8", + "collateral": { + "address": "0x5f5b868451Bef658C72B553783A1E514aB581e8a", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x9EfB1F973a4B9215028094B71392961266177736", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xCe2BD4DB80d7A032Def93eF32E082A50C5DF5F16", + "xt": "0xDc446841905Cb9780a6f66338eaefE60CeC5124C", + "gt": "0x17264609C0A416aBbC14BF5f87c5eA1E5c58e95D" + }, + "config": { + "marketSymbol": "USDC/wstETH@27MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "27JUN2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-wstETH@27MAY2025.json b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-wstETH@27MAY2025.json new file mode 100644 index 0000000..1e24413 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-wstETH@27MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8414564", + "timestamp": "1748312688" + }, + "market": "0x8B36F71b9038B070ab903Eb332Ba447cA8d33D0E", + "collateral": { + "address": "0x5f5b868451Bef658C72B553783A1E514aB581e8a", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x9EfB1F973a4B9215028094B71392961266177736", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x74048d5Ac367F1c89fe862d49efeddB73f9b609E", + "xt": "0x82cE065382D3c7971bE96fEE001C4C2bbA05b51c", + "gt": "0x39996693EbD0c334dC239c0aa2f8219ead9E2C72" + }, + "config": { + "marketSymbol": "USDC/wstETH@27MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "27MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-wstETH@28MAY2025.json b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-wstETH@28MAY2025.json new file mode 100644 index 0000000..77a2530 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-wstETH@28MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8417107", + "timestamp": "1748343288" + }, + "market": "0x0C209db1AA33675514011BA415c741C5f6Aff32f", + "collateral": { + "address": "0x5f5b868451Bef658C72B553783A1E514aB581e8a", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x9EfB1F973a4B9215028094B71392961266177736", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x7Ea4d044CDFf19530F8A87393C583Fc391285b8A", + "xt": "0xFF13770Fbd40Aed5E6eefC3C225FFCc672c45275", + "gt": "0x5fE8D5210C0B9501C55Ab15A60836f02Be71c325" + }, + "config": { + "marketSymbol": "USDC/wstETH@27MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "28MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-wstETH@30MAY2025.json b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-wstETH@30MAY2025.json new file mode 100644 index 0000000..623b24c --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-USDC-wstETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8076440", + "timestamp": "1744105800" + }, + "market": "0x68B0CDe0E2a22A02324EdAD07499d10De6552cEb", + "collateral": { + "address": "0x5f5b868451Bef658C72B553783A1E514aB581e8a", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x9EfB1F973a4B9215028094B71392961266177736", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xDa25e32D8Eae7dC967d75d77b54D323C31Fa6d22", + "xt": "0xdC1599eDb36b05461955Ac5e0be79246c6085Fd7", + "gt": "0xc41EA3022711d2ddea27F90e44cc2E863DF853F5" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-WETH-MCwETH@30MAY2025.json b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-WETH-MCwETH@30MAY2025.json new file mode 100644 index 0000000..ee91fb3 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-WETH-MCwETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8076440", + "timestamp": "1744105800" + }, + "market": "0xDD73Fd1D293Db5E10DfD2a51753BeF401060eddB", + "collateral": { + "address": "0xE30bD12bC98d29F0ACd2ee1113e96463b493b057", + "symbol": "MCwETH", + "priceFeed": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xFE719357C5eb7cfE29E169b0B5fB2BD0a7a27958", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x63E867cb03b6C5b8014f4a15721AC0Cd35Ef2522", + "xt": "0x8135c8e310767a10f9aF093A733f734880279eb4", + "gt": "0x118d44E474f8E50FBeF1Fc5481E73cBcDf3a6E32" + }, + "config": { + "marketSymbol": "WETH/MCwETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-WETH-gtWETH@30MAY2025.json b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-WETH-gtWETH@30MAY2025.json new file mode 100644 index 0000000..be07db5 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-WETH-gtWETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8076440", + "timestamp": "1744105800" + }, + "market": "0xf9523f3B29b85e83d15e7f57476c4cF21259d6B9", + "collateral": { + "address": "0xcad5E8d21fFF8E3aba0399016d16473CFd3F52Fc", + "symbol": "gtWETH", + "priceFeed": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xFE719357C5eb7cfE29E169b0B5fB2BD0a7a27958", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x7e20bC2453e278625f62f8e4C276D62A1E58129a", + "xt": "0x2ABd5C144AB31FBd46B059f0E70131f998Be76bc", + "gt": "0x60aa3ab271CA709dC93Affe3186229D2Ca9AB746" + }, + "config": { + "marketSymbol": "WETH/gtWETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-WETH-pufETH@30MAY2025.json b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-WETH-pufETH@30MAY2025.json new file mode 100644 index 0000000..9dfab83 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-WETH-pufETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8076440", + "timestamp": "1744105800" + }, + "market": "0x3e85d91F08fd4a951C00B5745b4e4D545257235f", + "collateral": { + "address": "0xf06D04d0532643613dD5E2BCfF337f41EcC63017", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xFE719357C5eb7cfE29E169b0B5fB2BD0a7a27958", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x6Da4110366bC29F7813FbcD3670897a4909B8258", + "xt": "0xc1F4C031657B86923e6Edf3Fd9DD00bCc1c365E4", + "gt": "0x200488e8CcB1807Dd16F0879491Feb20d5f2e4cD" + }, + "config": { + "marketSymbol": "WETH/pufETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-WETH-weETH@11APR2025.json b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-WETH-weETH@11APR2025.json new file mode 100644 index 0000000..ab75e81 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-WETH-weETH@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8094955", + "timestamp": "1744344168" + }, + "market": "0x06a89a2aC9861b3792105fC94B2B9b3Be292A9B8", + "collateral": { + "address": "0xaE232da97AC082aa0FB91637285041afcc330D02", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "21600" + }, + "underlying": { + "address": "0xFE719357C5eb7cfE29E169b0B5fB2BD0a7a27958", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x71Dd465a7f0b74BE2a74E8aEe08B1d9965551C9A", + "xt": "0x6f1BE4F650e894376B597643B189869Bf6149CC6", + "gt": "0x73348d53f4dAF4C0991C100C0e2608f7610a6859" + }, + "config": { + "marketSymbol": "WETH/weETH@11APR2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-WETH-weETH@27JUN2025.json b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-WETH-weETH@27JUN2025.json new file mode 100644 index 0000000..c0c87a2 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-WETH-weETH@27JUN2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8461289", + "timestamp": "1748874444" + }, + "market": "0x9baB531b1e667Ad3707A1F98d4313D340B0D4569", + "collateral": { + "address": "0xaE232da97AC082aa0FB91637285041afcc330D02", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xFE719357C5eb7cfE29E169b0B5fB2BD0a7a27958", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x08dDda75b2c79D799AB36f9041311d5d80837baF", + "xt": "0x1B472F1ae6513d962c03DF338107F4A37563ce11", + "gt": "0xdAe0AE31ec66e85EF39c75834D554895f58483Cb" + }, + "config": { + "marketSymbol": "WETH/weETH@27MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "27JUN2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-WETH-weETH@27MAY2025.json b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-WETH-weETH@27MAY2025.json new file mode 100644 index 0000000..8ef545b --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-WETH-weETH@27MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8417107", + "timestamp": "1748343288" + }, + "market": "0x55eE721d93c8e078E57567A86A10C39Aee07BB79", + "collateral": { + "address": "0xaE232da97AC082aa0FB91637285041afcc330D02", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xFE719357C5eb7cfE29E169b0B5fB2BD0a7a27958", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x71bB0aF0Ea6CF6cc1bFAC95B248d0Dd39Ee3d986", + "xt": "0x68A6Cb81ACC437693f77796101A0f9B2F7A3fB2c", + "gt": "0x2176560A9F704c5F0E940edA3ECC3E690DB353BB" + }, + "config": { + "marketSymbol": "WETH/weETH@27MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "27MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-WETH-weETH@30MAY2025.json b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-WETH-weETH@30MAY2025.json new file mode 100644 index 0000000..9284cde --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-WETH-weETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8076440", + "timestamp": "1744105800" + }, + "market": "0x16fcC0C341325Ab3142E9475ecE5A04ca5DEFffe", + "collateral": { + "address": "0xaE232da97AC082aa0FB91637285041afcc330D02", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "21600" + }, + "underlying": { + "address": "0xFE719357C5eb7cfE29E169b0B5fB2BD0a7a27958", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x971202ae0d7f96193B9360D5e7b382E4afdac01B", + "xt": "0xA23ACAABB8F004ac045056bBb6899B6DDbA78927", + "gt": "0x94cF59fe7aA5C743FA87beaB9dc00471c0a41940" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-pufETH-PT-pufETH-26JUN2025@30MAY2025.json b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-pufETH-PT-pufETH-26JUN2025@30MAY2025.json new file mode 100644 index 0000000..1956bfa --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-market-pufETH-PT-pufETH-26JUN2025@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8076440", + "timestamp": "1744105800" + }, + "market": "0x4bd6A608FA84dd23731923F56f3a70d71A89Acfd", + "collateral": { + "address": "0x8253a8Ab8fc41925a86C31b9A862C463332Fea7d", + "symbol": "PT-pufETH-26JUN2025", + "priceFeed": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xf06D04d0532643613dD5E2BCfF337f41EcC63017", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x291EA27b47AB3Cc90DF30799388Da8b0102DaC41", + "xt": "0xB65586D75742D06617453f5eabB9B6628a983A4a", + "gt": "0x7dbc6ce9447902710514d90C1FB1CcCc2f6144e3" + }, + "config": { + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-vault-TMT-USDC.json b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-vault-TMT-USDC.json new file mode 100644 index 0000000..e3468f9 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-vault-TMT-USDC.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xeca33b7ad0696b64ee9d768b832b5cf252689f41" + }, + "blockInfo": { + "network": "eth-sepolia", + "blockNumber": "8115159", + "timestamp": "1744609716" + }, + "vaultInfo": { + "name": "TermMatt USDC Vault", + "symbol": "TMT-USDC", + "address": "0x4b1272314F984F95Dadf8FD6C289fE39b633c291", + "asset": "0x9EfB1F973a4B9215028094B71392961266177736", + "performanceFeeRate": 0, + "maxCapacity": "100000000000", + "timelock": 1, + "admin": "0xcAe062fCe470C1A8567Fd812905C18EC08431644", + "curator": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE", + "guardian": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE", + "allocator": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE" + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-vault-TMX-USDC-Vault-02JUN2025.json b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-vault-TMX-USDC-Vault-02JUN2025.json new file mode 100644 index 0000000..551dafd --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-vault-TMX-USDC-Vault-02JUN2025.json @@ -0,0 +1,25 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.9", + "commit": "0x0xea7dfc944db2987fc0842066b5a72fe6696ea8d6" + }, + "blockInfo": { + "network": "eth-sepolia", + "blockNumber": "8461312", + "timestamp": "1748874720", + "dateString": "02JUN2025" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TMX-USDC-Vault", + "address": "0x3Ee26f3695B880dd02195f958ed4f09362bd2f7F", + "asset": "0x9EfB1F973a4B9215028094B71392961266177736", + "performanceFeeRate": 0, + "maxCapacity": "10000000000000000", + "timelock": 1, + "admin": "0xcAe062fCe470C1A8567Fd812905C18EC08431644", + "curator": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE", + "guardian": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE", + "allocator": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE" + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-vault-TMX-USDC.json b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-vault-TMX-USDC.json new file mode 100644 index 0000000..2f70585 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-vault-TMX-USDC.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x141ada4a7f722cd4faab7818834dada2688bdc69" + }, + "blockInfo": { + "network": "eth-sepolia", + "blockNumber": "8076543", + "timestamp": "1744107120" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TMX-USDC", + "address": "0x2f324e829C3A54AB1e9A8aa5825E2b43707fc650", + "asset": "0x9EfB1F973a4B9215028094B71392961266177736", + "performanceFeeRate": 10000000, + "maxCapacity": "1000000000000", + "timelock": 1, + "admin": "0xcAe062fCe470C1A8567Fd812905C18EC08431644", + "curator": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE", + "guardian": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE", + "allocator": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE" + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-vault-TMX-WETH.json b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-vault-TMX-WETH.json new file mode 100644 index 0000000..09db6da --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-staging-20250603/eth-sepolia-vault-TMX-WETH.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x141ada4a7f722cd4faab7818834dada2688bdc69" + }, + "blockInfo": { + "network": "eth-sepolia", + "blockNumber": "8076554", + "timestamp": "1744107252" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TMX-WETH", + "address": "0xd722217C99Aa2619E1AaD961B05F7f71B3363E2A", + "asset": "0xFE719357C5eb7cfE29E169b0B5fB2BD0a7a27958", + "performanceFeeRate": 10000000, + "maxCapacity": "5000000000000000000000", + "timelock": 1, + "admin": "0xcAe062fCe470C1A8567Fd812905C18EC08431644", + "curator": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE", + "guardian": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE", + "allocator": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE" + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-access-manager.json b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-access-manager.json new file mode 100644 index 0000000..3d63b1b --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "eth-sepolia", + "deployedAt": "1744104768", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x141ada4a7f722cd4faab7818834dada2688bdc69", + "blockInfo": { + "number": "8076356", + "timestamp": "1744104768" + }, + "deployer": "0xE355d5D8aa52EF0FbbD037C4a3C5E6Fd659cf46B", + "admin": "0x81f314f70702Bbe89FEd0F2cFe6841950275E0b7", + "contracts": { + "accessManager": "0xcAe062fCe470C1A8567Fd812905C18EC08431644" + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-core.json b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-core.json new file mode 100644 index 0000000..9e6c488 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-core.json @@ -0,0 +1,21 @@ +{ + "network": "eth-sepolia", + "deployedAt": "1744105236", + "gitBranch": "deploy/v1.0.8", + "gitCommitHash": "0x0x141ada4a7f722cd4faab7818834dada2688bdc69", + "blockInfo": { + "number": "8076395", + "timestamp": "1744105236" + }, + "deployer": "0xE355d5D8aa52EF0FbbD037C4a3C5E6Fd659cf46B", + "admin": "0x81f314f70702Bbe89FEd0F2cFe6841950275E0b7", + "contracts": { + "factory": "0x74d7E445852E405E92aDC75e4309E9626A4E142f", + "vaultFactory": "0xb14488641C7206636C0ab681A67CB8dbb930ae90", + "oracleAggregator": "0xa54F41EB0Ce499F07a044bcf76F6Bb4cCdb0F4A1", + "router": "0x769020BDbD532a7e1A7C15521Ab4b0Df7a95328a", + "swapAdapter": "0xE146A9e954b2DFD0Fd71668A9Ac70A590486c758", + "faucet": "0xeEbc49f73bC2faF0E6b52Fd78aec4a4eaA3e64D5", + "marketViewer": "0x7602984752987Ccb9cf526F51984124c0C30f73b" + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-USDC-PT-sUSDE-29MAY2025@30MAY2025.json b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-USDC-PT-sUSDE-29MAY2025@30MAY2025.json new file mode 100644 index 0000000..232c0df --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-USDC-PT-sUSDE-29MAY2025@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8076440", + "timestamp": "1744105800" + }, + "market": "0xd039A90DAeEe9665a2a5cf90858406a93418610C", + "collateral": { + "address": "0xE752EAf6c376F3aFc92F491C038b6034cFF2ed6B", + "symbol": "PT-sUSDE-29MAY2025", + "priceFeed": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x9EfB1F973a4B9215028094B71392961266177736", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x09974090Cc5dd30dD903dd900A2b311371dD695c", + "xt": "0xb9FE59e12d06360D91034C069dbc90bc436053CB", + "gt": "0x73e90e6101F914B799E7aaB6cafe475560272eEB" + }, + "config": { + "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-USDC-USUALUSDC+@30MAY2025.json b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-USDC-USUALUSDC+@30MAY2025.json new file mode 100644 index 0000000..2d9db4f --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-USDC-USUALUSDC+@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8076440", + "timestamp": "1744105800" + }, + "market": "0xc5ACFAe592806404DEc2b10114E1bC4F59D3a2BB", + "collateral": { + "address": "0x3b6Dc6959f6BC2e0a771F42c2ed5AC61558A070D", + "symbol": "USUALUSDC+", + "priceFeed": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x9EfB1F973a4B9215028094B71392961266177736", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x5C9e92db7f7bE6dD506C30A6a28e9201c78782Fa", + "xt": "0x8a85fe2f51d1e13859A42aad0436909dc312F567", + "gt": "0x4F7d358943b0Ced097ec89Cc3908CE8feCaD8B7a" + }, + "config": { + "marketSymbol": "USDC/USUALUSDC+@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-USDC-WBTC@30MAY2025.json b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-USDC-WBTC@30MAY2025.json new file mode 100644 index 0000000..48a26d7 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-USDC-WBTC@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8076440", + "timestamp": "1744105800" + }, + "market": "0xaFe10Ad8d4d179cb8D843E03729d47e2C4c2bbc5", + "collateral": { + "address": "0xeA569a4Ae4Bd3C71De9839DE21744177E979D86B", + "symbol": "WBTC", + "priceFeed": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "heartBeat": "3600" + }, + "underlying": { + "address": "0x9EfB1F973a4B9215028094B71392961266177736", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xfD44183B0d3a124F7c17aa34148B870d3aBBD219", + "xt": "0x8D4310d7857D06B96239ab2c66d16bCeA639c487", + "gt": "0x62cDC480FFbfE711888116c87DFD56778Da797E6" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-USDC-cbBTC@30MAY2025.json b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-USDC-cbBTC@30MAY2025.json new file mode 100644 index 0000000..8a85133 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-USDC-cbBTC@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8076440", + "timestamp": "1744105800" + }, + "market": "0x17AcE2764c593c3A29139686B7e70Abe46964Cbf", + "collateral": { + "address": "0x0Ab56705cBEcb370077C9061ce0c1001F18d7D65", + "symbol": "cbBTC", + "priceFeed": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x9EfB1F973a4B9215028094B71392961266177736", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x62E9bDC0B04bb449A1482627d4CcE53BEB1D12e9", + "xt": "0x5871FeDc05Db81d957CC8c8AFfdEB10A796F489a", + "gt": "0xBbEf58570483147FFF5b098a53AC194213a47390" + }, + "config": { + "marketSymbol": "USDC/cbBTC@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-USDC-eUSDe@29MAY2025.json b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-USDC-eUSDe@29MAY2025.json new file mode 100644 index 0000000..e2938d4 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-USDC-eUSDe@29MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8076440", + "timestamp": "1744105800" + }, + "market": "0xA01ebcc30F5A04d05ef08509bEba37369c7Ad5c4", + "collateral": { + "address": "0x8d1674d9Faa6D000C5Fccb96C6E3Ea243fE7dAb9", + "symbol": "eUSDe", + "priceFeed": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x9EfB1F973a4B9215028094B71392961266177736", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x541F31deB35c3A30Db9803bFC5f62931bd90eAe0", + "xt": "0xa39432D9D68bf009c3DeF643255837D43fFFb6D9", + "gt": "0x01356e9680b64FA4B06597ddd4802F7638D3BFE9" + }, + "config": { + "marketSymbol": "USDC/eUSDe@29MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "29MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-USDC-sUSDe@30MAY2025.json b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-USDC-sUSDe@30MAY2025.json new file mode 100644 index 0000000..d477aee --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-USDC-sUSDe@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8076440", + "timestamp": "1744105800" + }, + "market": "0x635430374F936e1371caa5f423253aE6A60c6094", + "collateral": { + "address": "0x668756092EF35B95e5972Daf4646B0904D77B8A2", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x9EfB1F973a4B9215028094B71392961266177736", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x6bE96A6Fb035b68C8d32B1F3F45B8a83A2C1eDE6", + "xt": "0x2506129881eB3363b9Fc72640162c195F9093cF8", + "gt": "0xEA861a9b80D6Bf302A180A1d71a761558cf7F588" + }, + "config": { + "marketSymbol": "USDC/sUSDe@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-USDC-wstETH@11APR2025.json b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-USDC-wstETH@11APR2025.json new file mode 100644 index 0000000..36538cc --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-USDC-wstETH@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8094955", + "timestamp": "1744344168" + }, + "market": "0x4B36FAB576513175f16aE91640385bB0d8E769fA", + "collateral": { + "address": "0x5f5b868451Bef658C72B553783A1E514aB581e8a", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x9EfB1F973a4B9215028094B71392961266177736", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x2D136A7807B464fb6a46B69C15cef14824039BD9", + "xt": "0x0BDb214ebA6CB1D025137B92Da1b90409F12362E", + "gt": "0x6ea3Ba9CB69969Dcdadf1B258e78F2858ed0c794" + }, + "config": { + "marketSymbol": "USDC/wstETH@11APR2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-USDC-wstETH@30MAY2025.json b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-USDC-wstETH@30MAY2025.json new file mode 100644 index 0000000..623b24c --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-USDC-wstETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8076440", + "timestamp": "1744105800" + }, + "market": "0x68B0CDe0E2a22A02324EdAD07499d10De6552cEb", + "collateral": { + "address": "0x5f5b868451Bef658C72B553783A1E514aB581e8a", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0x9EfB1F973a4B9215028094B71392961266177736", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xDa25e32D8Eae7dC967d75d77b54D323C31Fa6d22", + "xt": "0xdC1599eDb36b05461955Ac5e0be79246c6085Fd7", + "gt": "0xc41EA3022711d2ddea27F90e44cc2E863DF853F5" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-WETH-MCwETH@30MAY2025.json b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-WETH-MCwETH@30MAY2025.json new file mode 100644 index 0000000..ee91fb3 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-WETH-MCwETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8076440", + "timestamp": "1744105800" + }, + "market": "0xDD73Fd1D293Db5E10DfD2a51753BeF401060eddB", + "collateral": { + "address": "0xE30bD12bC98d29F0ACd2ee1113e96463b493b057", + "symbol": "MCwETH", + "priceFeed": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xFE719357C5eb7cfE29E169b0B5fB2BD0a7a27958", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x63E867cb03b6C5b8014f4a15721AC0Cd35Ef2522", + "xt": "0x8135c8e310767a10f9aF093A733f734880279eb4", + "gt": "0x118d44E474f8E50FBeF1Fc5481E73cBcDf3a6E32" + }, + "config": { + "marketSymbol": "WETH/MCwETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-WETH-gtWETH@30MAY2025.json b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-WETH-gtWETH@30MAY2025.json new file mode 100644 index 0000000..be07db5 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-WETH-gtWETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8076440", + "timestamp": "1744105800" + }, + "market": "0xf9523f3B29b85e83d15e7f57476c4cF21259d6B9", + "collateral": { + "address": "0xcad5E8d21fFF8E3aba0399016d16473CFd3F52Fc", + "symbol": "gtWETH", + "priceFeed": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", + "heartBeat": "3600" + }, + "underlying": { + "address": "0xFE719357C5eb7cfE29E169b0B5fB2BD0a7a27958", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x7e20bC2453e278625f62f8e4C276D62A1E58129a", + "xt": "0x2ABd5C144AB31FBd46B059f0E70131f998Be76bc", + "gt": "0x60aa3ab271CA709dC93Affe3186229D2Ca9AB746" + }, + "config": { + "marketSymbol": "WETH/gtWETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-WETH-pufETH@30MAY2025.json b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-WETH-pufETH@30MAY2025.json new file mode 100644 index 0000000..9dfab83 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-WETH-pufETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8076440", + "timestamp": "1744105800" + }, + "market": "0x3e85d91F08fd4a951C00B5745b4e4D545257235f", + "collateral": { + "address": "0xf06D04d0532643613dD5E2BCfF337f41EcC63017", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xFE719357C5eb7cfE29E169b0B5fB2BD0a7a27958", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x6Da4110366bC29F7813FbcD3670897a4909B8258", + "xt": "0xc1F4C031657B86923e6Edf3Fd9DD00bCc1c365E4", + "gt": "0x200488e8CcB1807Dd16F0879491Feb20d5f2e4cD" + }, + "config": { + "marketSymbol": "WETH/pufETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-WETH-weETH@11APR2025.json b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-WETH-weETH@11APR2025.json new file mode 100644 index 0000000..ab75e81 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-WETH-weETH@11APR2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8094955", + "timestamp": "1744344168" + }, + "market": "0x06a89a2aC9861b3792105fC94B2B9b3Be292A9B8", + "collateral": { + "address": "0xaE232da97AC082aa0FB91637285041afcc330D02", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "21600" + }, + "underlying": { + "address": "0xFE719357C5eb7cfE29E169b0B5fB2BD0a7a27958", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x71Dd465a7f0b74BE2a74E8aEe08B1d9965551C9A", + "xt": "0x6f1BE4F650e894376B597643B189869Bf6149CC6", + "gt": "0x73348d53f4dAF4C0991C100C0e2608f7610a6859" + }, + "config": { + "marketSymbol": "WETH/weETH@11APR2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "11APR2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-WETH-weETH@30MAY2025.json b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-WETH-weETH@30MAY2025.json new file mode 100644 index 0000000..9284cde --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-WETH-weETH@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8076440", + "timestamp": "1744105800" + }, + "market": "0x16fcC0C341325Ab3142E9475ecE5A04ca5DEFffe", + "collateral": { + "address": "0xaE232da97AC082aa0FB91637285041afcc330D02", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "21600" + }, + "underlying": { + "address": "0xFE719357C5eb7cfE29E169b0B5fB2BD0a7a27958", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "3600" + }, + "tokens": { + "ft": "0x971202ae0d7f96193B9360D5e7b382E4afdac01B", + "xt": "0xA23ACAABB8F004ac045056bBb6899B6DDbA78927", + "gt": "0x94cF59fe7aA5C743FA87beaB9dc00471c0a41940" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-pufETH-PT-pufETH-26JUN2025@30MAY2025.json b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-pufETH-PT-pufETH-26JUN2025@30MAY2025.json new file mode 100644 index 0000000..1956bfa --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-market-pufETH-PT-pufETH-26JUN2025@30MAY2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8076440", + "timestamp": "1744105800" + }, + "market": "0x4bd6A608FA84dd23731923F56f3a70d71A89Acfd", + "collateral": { + "address": "0x8253a8Ab8fc41925a86C31b9A862C463332Fea7d", + "symbol": "PT-pufETH-26JUN2025", + "priceFeed": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xf06D04d0532643613dD5E2BCfF337f41EcC63017", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x291EA27b47AB3Cc90DF30799388Da8b0102DaC41", + "xt": "0xB65586D75742D06617453f5eabB9B6628a983A4a", + "gt": "0x7dbc6ce9447902710514d90C1FB1CcCc2f6144e3" + }, + "config": { + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "30MAY2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-vault-TMT-USDC.json b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-vault-TMT-USDC.json new file mode 100644 index 0000000..e3468f9 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-vault-TMT-USDC.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0xeca33b7ad0696b64ee9d768b832b5cf252689f41" + }, + "blockInfo": { + "network": "eth-sepolia", + "blockNumber": "8115159", + "timestamp": "1744609716" + }, + "vaultInfo": { + "name": "TermMatt USDC Vault", + "symbol": "TMT-USDC", + "address": "0x4b1272314F984F95Dadf8FD6C289fE39b633c291", + "asset": "0x9EfB1F973a4B9215028094B71392961266177736", + "performanceFeeRate": 0, + "maxCapacity": "100000000000", + "timelock": 1, + "admin": "0xcAe062fCe470C1A8567Fd812905C18EC08431644", + "curator": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE", + "guardian": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE", + "allocator": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE" + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-vault-TMX-USDC.json b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-vault-TMX-USDC.json new file mode 100644 index 0000000..2f70585 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-vault-TMX-USDC.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x141ada4a7f722cd4faab7818834dada2688bdc69" + }, + "blockInfo": { + "network": "eth-sepolia", + "blockNumber": "8076543", + "timestamp": "1744107120" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TMX-USDC", + "address": "0x2f324e829C3A54AB1e9A8aa5825E2b43707fc650", + "asset": "0x9EfB1F973a4B9215028094B71392961266177736", + "performanceFeeRate": 10000000, + "maxCapacity": "1000000000000", + "timelock": 1, + "admin": "0xcAe062fCe470C1A8567Fd812905C18EC08431644", + "curator": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE", + "guardian": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE", + "allocator": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE" + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-vault-TMX-WETH.json b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-vault-TMX-WETH.json new file mode 100644 index 0000000..09db6da --- /dev/null +++ b/deployments/eth-sepolia-v1.0.8-testnet-20250414/eth-sepolia-vault-TMX-WETH.json @@ -0,0 +1,24 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.8", + "commit": "0x0x141ada4a7f722cd4faab7818834dada2688bdc69" + }, + "blockInfo": { + "network": "eth-sepolia", + "blockNumber": "8076554", + "timestamp": "1744107252" + }, + "vaultInfo": { + "name": "TermMax WETH Vault", + "symbol": "TMX-WETH", + "address": "0xd722217C99Aa2619E1AaD961B05F7f71B3363E2A", + "asset": "0xFE719357C5eb7cfE29E169b0B5fB2BD0a7a27958", + "performanceFeeRate": 10000000, + "maxCapacity": "5000000000000000000000", + "timelock": 1, + "admin": "0xcAe062fCe470C1A8567Fd812905C18EC08431644", + "curator": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE", + "guardian": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE", + "allocator": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE" + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-access-manager.json b/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-access-manager.json new file mode 100644 index 0000000..b1de91c --- /dev/null +++ b/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-access-manager.json @@ -0,0 +1,15 @@ +{ + "network": "eth-sepolia", + "deployedAt": "1748950020", + "gitBranch": "deploy/v1.0.9", + "gitCommitHash": "0x0x0489591746b16bb969ea123423e618e76b7e2dcb", + "blockInfo": { + "number": "8467586", + "timestamp": "1748950020" + }, + "deployer": "0xE355d5D8aa52EF0FbbD037C4a3C5E6Fd659cf46B", + "admin": "0x81f314f70702Bbe89FEd0F2cFe6841950275E0b7", + "contracts": { + "accessManager": "0x7662FcF152a9E18280A77f4A8108229E86D398Ab" + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-core.json b/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-core.json new file mode 100644 index 0000000..add433c --- /dev/null +++ b/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-core.json @@ -0,0 +1,21 @@ +{ + "network": "eth-sepolia", + "deployedAt": "1748952156", + "gitBranch": "deploy/v1.0.9", + "gitCommitHash": "0x0x0489591746b16bb969ea123423e618e76b7e2dcb", + "blockInfo": { + "number": "8467764", + "timestamp": "1748952156" + }, + "deployer": "0xE355d5D8aa52EF0FbbD037C4a3C5E6Fd659cf46B", + "admin": "0x81f314f70702Bbe89FEd0F2cFe6841950275E0b7", + "contracts": { + "factory": "0xC0339131b13cB78FC13Eee1F2f20aE2aE98F1d03", + "vaultFactory": "0xE98B34359852A5bbC48C59AF5319Ae83961e74eD", + "oracleAggregator": "0x614eAFf71890b3C2677aDb111252EE1BE5A53EF7", + "router": "0x2F68071baC2bE3332c8107Dd15a76f7230F34013", + "swapAdapter": "0xDafd984bBfD06c5D394a18E00727448cf8de6D8e", + "faucet": "0x34230231A3E309fa68d81ED6a0183282DD629859", + "marketViewer": "0x235f12Ac9B6947cAF234D78712a68941c30c0cdb" + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-USDC-PT-sUSDE-31JUL2025@26SEP2025.json b/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-USDC-PT-sUSDE-31JUL2025@26SEP2025.json new file mode 100644 index 0000000..d9df8ec --- /dev/null +++ b/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-USDC-PT-sUSDE-31JUL2025@26SEP2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8497338", + "timestamp": "1749307824" + }, + "market": "0x06534a55012cb93d867e92408018062da3BB4692", + "collateral": { + "address": "0xE89C59a60A484464995B3CA3F53CF821fE99845c", + "symbol": "PT-sUSDE-31JUL2025", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xCc121AB1098625728950b200490D28F8B2c324FD", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xa160956dcb868C6202751CFECA0a1D5Cee4ee102", + "xt": "0x4e62F22C33A12a095Fd3597d3A2729A1944b091d", + "gt": "0xb57e463144F673d155204faDBF2099B492dDDE0A" + }, + "config": { + "marketSymbol": "USDC/PT-sUSDE-31JUL2025@01AUG2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "26SEP2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-USDC-WBTC@26DEC2025.json b/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-USDC-WBTC@26DEC2025.json new file mode 100644 index 0000000..5962aab --- /dev/null +++ b/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-USDC-WBTC@26DEC2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8467887", + "timestamp": "1748953632" + }, + "market": "0x4e753aEdf1320C825c20D1270a5f4e7D5f59c12f", + "collateral": { + "address": "0x8967690496480374C22278812336F98616D91a48", + "symbol": "WBTC", + "priceFeed": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xCc121AB1098625728950b200490D28F8B2c324FD", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x741fa1aF78cEd7153eAe195F48507227418ceB10", + "xt": "0x21551Ab2DB4BC4eC2d343f5d17f7e0D982421789", + "gt": "0xf6BDDa0eFE133Ed1878D23D11F879655a2820Ebd" + }, + "config": { + "marketSymbol": "USDC/WBTC@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "26DEC2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-USDC-eUSDe@26DEC2025.json b/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-USDC-eUSDe@26DEC2025.json new file mode 100644 index 0000000..f2c9178 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-USDC-eUSDe@26DEC2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8467887", + "timestamp": "1748953632" + }, + "market": "0xD0Fe4057E8555Da533222971AF3fa4Ded2E39f2c", + "collateral": { + "address": "0x7e3a0eD86874640176044D44A0128E911ECC9D30", + "symbol": "eUSDe", + "priceFeed": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xCc121AB1098625728950b200490D28F8B2c324FD", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x8306287c883eE781B93299c38F66a6F6B3c3E308", + "xt": "0x6Ab1B7952c6a5c9d278dDA3240c3EC77179624c0", + "gt": "0xeA45053214B522727D1a2DCBe2dC7ca134b20CD3" + }, + "config": { + "marketSymbol": "USDC/eUSDe@29MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "26DEC2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-USDC-sUSDe@26SEP2025.json b/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-USDC-sUSDe@26SEP2025.json new file mode 100644 index 0000000..8823f60 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-USDC-sUSDe@26SEP2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8467887", + "timestamp": "1748953632" + }, + "market": "0xfc55aD47c92caCC3874180197669B91a6CA27Bea", + "collateral": { + "address": "0xD1DFA67b26737E91B663c76258b65670C7aE01ca", + "symbol": "sUSDe", + "priceFeed": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xCc121AB1098625728950b200490D28F8B2c324FD", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x94937bD71e2Afce027c5279Ee09F60d682503990", + "xt": "0xbDA62c38a99b6e465b3cFb534A43F1C844EcF89d", + "gt": "0x302A988F91a65670efba6E832f1eeC2C51ffFB2E" + }, + "config": { + "marketSymbol": "USDC/sUSDe@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "26SEP2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-USDC-wstETH@26SEP2025.json b/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-USDC-wstETH@26SEP2025.json new file mode 100644 index 0000000..36d9e4d --- /dev/null +++ b/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-USDC-wstETH@26SEP2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8467887", + "timestamp": "1748953632" + }, + "market": "0xA0b965aF0385A84b30EFe0f5A3e94677C48E1D0E", + "collateral": { + "address": "0xb32aaEB3fD3A788EC311C829DE0427C3e256E036", + "symbol": "wstETH", + "priceFeed": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xCc121AB1098625728950b200490D28F8B2c324FD", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x485aBc5Bf9dDf083bc81Da2014606a7999e236dE", + "xt": "0x8BF190aa9ABe2aBaB741F02b4bE0E5E80F33cE93", + "gt": "0x1B7b97594D61b0D6A5068FD36bD9418338f49f1b" + }, + "config": { + "marketSymbol": "USDC/wstETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "26SEP2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-WETH-pufETH@26DEC2025.json b/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-WETH-pufETH@26DEC2025.json new file mode 100644 index 0000000..b170fd7 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-WETH-pufETH@26DEC2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8467887", + "timestamp": "1748953632" + }, + "market": "0x52f3a8734D84266BA00eC850C9537553a516c309", + "collateral": { + "address": "0xd8De65C56f7b2A2C002b01385B3f01EACB2bdb69", + "symbol": "pufETH", + "priceFeed": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xe0792EC56340710EC24e49e32270E6bFa34C3da2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x37493da3bD9ef27d2E37D4762b7aBCD0d9271a4f", + "xt": "0x1e78900F44944870574Df58106B479E53E74B0A8", + "gt": "0x6436Ee623438d5E3aF4486c5A6151dbD103Cd4f8" + }, + "config": { + "marketSymbol": "WETH/pufETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "26DEC2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-WETH-weETH@26SEP2025.json b/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-WETH-weETH@26SEP2025.json new file mode 100644 index 0000000..585c420 --- /dev/null +++ b/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-WETH-weETH@26SEP2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "8467887", + "timestamp": "1748953632" + }, + "market": "0x456aDC2896580Bb333195Fbb30576bd434aCE707", + "collateral": { + "address": "0x08aa967A9f4740B2208e7D10dF9AEBDaAB86FA7b", + "symbol": "weETH", + "priceFeed": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xe0792EC56340710EC24e49e32270E6bFa34C3da2", + "symbol": "WETH", + "priceFeed": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x74e53627035B6FaA239Cd46d8d58474958Ab4329", + "xt": "0x755303e677F4c5d3f2E948E956d4Dd11B2f46492", + "gt": "0xa30f4958ecc8a76957E221e0BC6C72a9fc9C34D9" + }, + "config": { + "marketSymbol": "WETH/weETH@30MAY2025", + "treasurer": "0x9ec927F61542DCD12DEF83797D8d1022064dcfA4", + "maturity": "26SEP2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + } + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-vault-TMX-USDC-Vault-07JUN2025.json b/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-vault-TMX-USDC-Vault-07JUN2025.json new file mode 100644 index 0000000..742e34d --- /dev/null +++ b/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-vault-TMX-USDC-Vault-07JUN2025.json @@ -0,0 +1,25 @@ +{ + "gitInfo": { + "branch": "deploy/v1.0.9", + "commit": "0x0x650ec7429f5866925dc06ddae8e04e8d020c0b5e" + }, + "blockInfo": { + "network": "eth-sepolia", + "blockNumber": "8497277", + "timestamp": "1749307092", + "dateString": "07JUN2025" + }, + "vaultInfo": { + "name": "TermMax USDC Vault", + "symbol": "TMX-USDC-Vault", + "address": "0x9Be4f07a33c0454B13a5b0bd8D69835e1500f7d0", + "asset": "0xCc121AB1098625728950b200490D28F8B2c324FD", + "performanceFeeRate": 0, + "maxCapacity": "10000000000000000", + "timelock": 86400, + "admin": "0x7662FcF152a9E18280A77f4A8108229E86D398Ab", + "curator": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE", + "guardian": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE", + "allocator": "0x2A58A3D405c527491Daae4C62561B949e7F87EFE" + } +} \ No newline at end of file diff --git a/script.sh b/script.sh index a0799d1..325be89 100755 --- a/script.sh +++ b/script.sh @@ -13,6 +13,7 @@ if [ "$#" -lt 2 ]; then echo " - deploy:order - Deploy Order contracts" echo " - deploy:vault - Deploy Vault contracts" echo " - deploy:pretmx - Deploy PreTMX token contract" + echo " - deploy:adapters - Deploy Adapters contracts" echo "" echo " 2. Script Commands:" echo " - script: - Run a custom script (e.g., script:GrantRoles, script:SubmitOracles)" @@ -88,12 +89,12 @@ esac # If deploying, validate deployment type if [ "$OPERATION" = "deploy" ]; then case $TYPE in - "access-manager"|"core"|"market"|"order"|"vault"|"pretmx") + "access-manager"|"core"|"market"|"order"|"vault"|"pretmx"|"adapters") echo "Deployment type: $TYPE" ;; *) echo "Unsupported deployment type: $TYPE" - echo "Supported deployment types: access-manager, core, market, order, vault, pretmx" + echo "Supported deployment types: access-manager, core, market, order, vault, pretmx, adapters" exit 1 ;; esac diff --git a/script/deploy/DeployAdapters.s.sol b/script/deploy/DeployAdapters.s.sol new file mode 100644 index 0000000..d8bad0d --- /dev/null +++ b/script/deploy/DeployAdapters.s.sol @@ -0,0 +1,187 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {Script} from "forge-std/Script.sol"; +import {VmSafe} from "forge-std/Vm.sol"; +import "forge-std/console.sol"; +import {TermMaxFactory} from "contracts/v1/factory/TermMaxFactory.sol"; +import {ITermMaxFactory} from "contracts/v1/factory/ITermMaxFactory.sol"; +import {ITermMaxRouter} from "contracts/v1/router/ITermMaxRouter.sol"; +import {MarketViewer} from "contracts/v1/router/MarketViewer.sol"; +import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import {TermMaxMarket} from "contracts/v1/TermMaxMarket.sol"; +import {MockERC20} from "contracts/v1/test/MockERC20.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {MarketConfig} from "contracts/v1/storage/TermMaxStorage.sol"; +import {IMintableERC20} from "contracts/v1/tokens/IMintableERC20.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import {SwapAdapter} from "contracts/v1/test/testnet/SwapAdapter.sol"; +import {Faucet} from "contracts/v1/test/testnet/Faucet.sol"; +import {DeployBase} from "./DeployBase.s.sol"; +import {IOracle} from "contracts/v1/oracle/IOracle.sol"; +import {VaultFactory, IVaultFactory} from "contracts/v1/factory/VaultFactory.sol"; +import {KyberswapV2Adapter} from "contracts/v1/router/swapAdapters/KyberswapV2Adapter.sol"; +import {OdosV2Adapter} from "contracts/v1/router/swapAdapters/OdosV2Adapter.sol"; +import {PendleSwapV3Adapter} from "contracts/v1/router/swapAdapters/PendleSwapV3Adapter.sol"; +import {UniswapV3Adapter} from "contracts/v1/router/swapAdapters/UniswapV3Adapter.sol"; +import {ERC4626VaultAdapter} from "contracts/v1/router/swapAdapters/ERC4626VaultAdapter.sol"; +import {AccessManager} from "contracts/v1/access/AccessManager.sol"; + +contract DeployAdapters is DeployBase { + // Network-specific config loaded from environment variables + string network; + uint256 deployerPrivateKey; + address deployerAddr; + address adminAddr; + address accessManagerAddr; + address uniswapV3RouterAddr; + address odosV2RouterAddr; + address pendleSwapV3RouterAddr; + address routerAddr; + + AccessManager accessManager; + ITermMaxRouter router; + UniswapV3Adapter uniswapV3Adapter; + OdosV2Adapter odosV2Adapter; + PendleSwapV3Adapter pendleSwapV3Adapter; + ERC4626VaultAdapter vaultAdapter; + + function setUp() public { + // Load network from environment variable + network = vm.envString("NETWORK"); + string memory networkUpper = toUpper(network); + + // Load network-specific configuration + string memory privateKeyVar = string.concat(networkUpper, "_DEPLOYER_PRIVATE_KEY"); + string memory adminVar = string.concat(networkUpper, "_ADMIN_ADDRESS"); + + deployerPrivateKey = vm.envUint(privateKeyVar); + deployerAddr = vm.addr(deployerPrivateKey); + adminAddr = vm.envAddress(adminVar); + + if ( + keccak256(abi.encodePacked(network)) == keccak256(abi.encodePacked("eth-mainnet")) + || keccak256(abi.encodePacked(network)) == keccak256(abi.encodePacked("arb-mainnet")) + || keccak256(abi.encodePacked(network)) == keccak256(abi.encodePacked("bnb-mainnet")) + ) { + string memory uniswapV3RouterVar = string.concat(networkUpper, "_UNISWAP_V3_ROUTER_ADDRESS"); + string memory odosV2RouterVar = string.concat(networkUpper, "_ODOS_V2_ROUTER_ADDRESS"); + string memory pendleSwapV3RouterVar = string.concat(networkUpper, "_PENDLE_SWAP_V3_ROUTER_ADDRESS"); + string memory oracleTimelockVar = string.concat(networkUpper, "_ORACLE_TIMELOCK"); + uniswapV3RouterAddr = vm.envAddress(uniswapV3RouterVar); + odosV2RouterAddr = vm.envAddress(odosV2RouterVar); + pendleSwapV3RouterAddr = vm.envAddress(pendleSwapV3RouterVar); + } + + string memory deploymentPath = + string.concat(vm.projectRoot(), "/deployments/", network, "/", network, "-access-manager.json"); + string memory json = vm.readFile(deploymentPath); + accessManagerAddr = vm.parseJsonAddress(json, ".contracts.accessManager"); + + deploymentPath = string.concat(vm.projectRoot(), "/deployments/", network, "/", network, "-core.json"); + json = vm.readFile(deploymentPath); + routerAddr = vm.parseJsonAddress(json, ".contracts.router"); + } + + function run() public { + console.log("Network:", network); + console.log("Deployer balance:", deployerAddr.balance); + + uint256 currentBlock = block.number; + uint256 currentTimestamp = block.timestamp; + + vm.startBroadcast(deployerPrivateKey); + if ( + keccak256(abi.encodePacked(network)) == keccak256(abi.encodePacked("eth-mainnet")) + || keccak256(abi.encodePacked(network)) == keccak256(abi.encodePacked("arb-mainnet")) + ) { + (uniswapV3Adapter, odosV2Adapter, pendleSwapV3Adapter, vaultAdapter) = deployAdaptersMainnet( + accessManagerAddr, routerAddr, uniswapV3RouterAddr, odosV2RouterAddr, pendleSwapV3RouterAddr + ); + } else { + revert("This script is only for mainnet deployments"); + } + vm.stopBroadcast(); + + console.log("===== Git Info ====="); + console.log("Git branch:", getGitBranch()); + console.log("Git commit hash:"); + console.logBytes(getGitCommitHash()); + console.log(); + + console.log("===== Block Info ====="); + console.log("Block number:", currentBlock); + console.log("Block timestamp:", currentTimestamp); + console.log(); + + console.log("===== Core Info ====="); + console.log("Use access manager:", accessManagerAddr); + console.log("Use router:", address(router)); + + // Write deployment results to a JSON file with timestamp + string memory deploymentJson = string( + abi.encodePacked( + "{\n", + ' "network": "', + network, + '",\n', + ' "deployedAt": "', + vm.toString(block.timestamp), + '",\n', + ' "gitBranch": "', + getGitBranch(), + '",\n', + ' "gitCommitHash": "0x', + vm.toString(getGitCommitHash()), + '",\n', + ' "blockInfo": {\n', + ' "number": "', + vm.toString(currentBlock), + '",\n', + ' "timestamp": "', + vm.toString(currentTimestamp), + '"\n', + " },\n", + ' "deployer": "', + vm.toString(deployerAddr), + '",\n', + ' "admin": "', + vm.toString(adminAddr), + '",\n', + ' "swapAdapter": ', + keccak256(abi.encodePacked(network)) == keccak256(abi.encodePacked("eth-mainnet")) + || keccak256(abi.encodePacked(network)) == keccak256(abi.encodePacked("arb-mainnet")) + ? string.concat( + "{\n", + ' "uniswapV3Adapter": "', + vm.toString(address(uniswapV3Adapter)), + '",\n', + ' "odosV2Adapter": "', + vm.toString(address(odosV2Adapter)), + '",\n', + ' "pendleSwapV3Adapter": "', + vm.toString(address(pendleSwapV3Adapter)), + '",\n', + ' "ERC4626VaultAdapter": "', + vm.toString(address(vaultAdapter)), + '"\n', + " },\n" + ) + : '"\n', + "}" + ) + ); + + // Create deployments directory if it doesn't exist + string memory deploymentsDir = string.concat(vm.projectRoot(), "/deployments/", network); + if (!vm.exists(deploymentsDir)) { + // Directory doesn't exist, create it + vm.createDir(deploymentsDir, true); + } + + string memory deploymentPath = string.concat(deploymentsDir, "/", network, "-adapters.json"); + vm.writeFile(deploymentPath, deploymentJson); + console.log("Deployment info written to:", deploymentPath); + } +} diff --git a/script/deploy/DeployBase.s.sol b/script/deploy/DeployBase.s.sol index b9e842e..34a2e25 100644 --- a/script/deploy/DeployBase.s.sol +++ b/script/deploy/DeployBase.s.sol @@ -6,39 +6,39 @@ import {console} from "forge-std/console.sol"; import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; -import {TermMaxFactory} from "contracts/factory/TermMaxFactory.sol"; -import {ITermMaxFactory} from "contracts/factory/ITermMaxFactory.sol"; -import {TermMaxRouter} from "contracts/router/TermMaxRouter.sol"; -import {MarketViewer} from "contracts/router/MarketViewer.sol"; -import {ITermMaxRouter} from "contracts/router/ITermMaxRouter.sol"; -import {TermMaxMarket} from "contracts/TermMaxMarket.sol"; -import {TermMaxOrder} from "contracts/TermMaxOrder.sol"; -import {MockERC20} from "contracts/test/MockERC20.sol"; -import {MockPriceFeed} from "contracts/test/MockPriceFeed.sol"; -import {MockPriceFeed} from "contracts/test/MockPriceFeed.sol"; -import {IMintableERC20, MintableERC20} from "contracts/tokens/MintableERC20.sol"; -import {SwapAdapter} from "contracts/test/testnet/SwapAdapter.sol"; -import {Faucet} from "contracts/test/testnet/Faucet.sol"; +import {TermMaxFactory} from "contracts/v1/factory/TermMaxFactory.sol"; +import {ITermMaxFactory} from "contracts/v1/factory/ITermMaxFactory.sol"; +import {TermMaxRouter} from "contracts/v1/router/TermMaxRouter.sol"; +import {MarketViewer} from "contracts/v1/router/MarketViewer.sol"; +import {ITermMaxRouter} from "contracts/v1/router/ITermMaxRouter.sol"; +import {TermMaxMarket} from "contracts/v1/TermMaxMarket.sol"; +import {TermMaxOrder} from "contracts/v1/TermMaxOrder.sol"; +import {MockERC20} from "contracts/v1/test/MockERC20.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {IMintableERC20, MintableERC20} from "contracts/v1/tokens/MintableERC20.sol"; +import {SwapAdapter} from "contracts/v1/test/testnet/SwapAdapter.sol"; +import {Faucet} from "contracts/v1/test/testnet/Faucet.sol"; import {JsonLoader} from "../utils/JsonLoader.sol"; -import {FaucetERC20} from "contracts/test/testnet/FaucetERC20.sol"; -import {IOracle, OracleAggregator} from "contracts/oracle/OracleAggregator.sol"; -import {IOrderManager, OrderManager} from "contracts/vault/OrderManager.sol"; -import {ITermMaxVault, TermMaxVault} from "contracts/vault/TermMaxVault.sol"; -import {VaultFactory, IVaultFactory} from "contracts/factory/VaultFactory.sol"; +import {FaucetERC20} from "contracts/v1/test/testnet/FaucetERC20.sol"; +import {IOracle, OracleAggregator} from "contracts/v1/oracle/OracleAggregator.sol"; +import {IOrderManager, OrderManager} from "contracts/v1/vault/OrderManager.sol"; +import {ITermMaxVault, TermMaxVault} from "contracts/v1/vault/TermMaxVault.sol"; +import {VaultFactory, IVaultFactory} from "contracts/v1/factory/VaultFactory.sol"; import { MarketConfig, FeeConfig, MarketInitialParams, LoanConfig, VaultInitialParams -} from "contracts/storage/TermMaxStorage.sol"; -import {KyberswapV2Adapter} from "contracts/router/swapAdapters/KyberswapV2Adapter.sol"; -import {OdosV2Adapter} from "contracts/router/swapAdapters/OdosV2Adapter.sol"; -import {PendleSwapV3Adapter} from "contracts/router/swapAdapters/PendleSwapV3Adapter.sol"; -import {UniswapV3Adapter} from "contracts/router/swapAdapters/UniswapV3Adapter.sol"; -import {ERC4626VaultAdapter} from "contracts/router/swapAdapters/ERC4626VaultAdapter.sol"; +} from "contracts/v1/storage/TermMaxStorage.sol"; +import {KyberswapV2Adapter} from "contracts/v1/router/swapAdapters/KyberswapV2Adapter.sol"; +import {OdosV2Adapter} from "contracts/v1/router/swapAdapters/OdosV2Adapter.sol"; +import {PendleSwapV3Adapter} from "contracts/v1/router/swapAdapters/PendleSwapV3Adapter.sol"; +import {UniswapV3Adapter} from "contracts/v1/router/swapAdapters/UniswapV3Adapter.sol"; +import {ERC4626VaultAdapter} from "contracts/v1/router/swapAdapters/ERC4626VaultAdapter.sol"; import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; -import {AccessManager} from "contracts/access/AccessManager.sol"; +import {AccessManager} from "contracts/v1/access/AccessManager.sol"; import {StringHelper} from "../utils/StringHelper.sol"; contract DeployBase is Script { @@ -164,6 +164,39 @@ contract DeployBase is Script { accessManager.setAdapterWhitelist(router, address(vaultAdapter), true); } + function deployAdaptersMainnet( + address accessManagerAddr, + address routerAddr, + address uniswapV3Router, + address odosV2Router, + address pendleSwapV3Router + ) + public + returns ( + UniswapV3Adapter uniswapV3Adapter, + OdosV2Adapter odosV2Adapter, + PendleSwapV3Adapter pendleSwapV3Adapter, + ERC4626VaultAdapter vaultAdapter + ) + { + // deploy access manager + AccessManager accessManager = AccessManager(accessManagerAddr); + + // deploy router + TermMaxRouter router = TermMaxRouter(routerAddr); + + // deploy and whitelist swap adapter + uniswapV3Adapter = new UniswapV3Adapter(address(uniswapV3Router)); + odosV2Adapter = new OdosV2Adapter(odosV2Router); + pendleSwapV3Adapter = new PendleSwapV3Adapter(address(pendleSwapV3Router)); + vaultAdapter = new ERC4626VaultAdapter(); + + accessManager.setAdapterWhitelist(router, address(uniswapV3Adapter), true); + accessManager.setAdapterWhitelist(router, address(odosV2Adapter), true); + accessManager.setAdapterWhitelist(router, address(pendleSwapV3Adapter), true); + accessManager.setAdapterWhitelist(router, address(vaultAdapter), true); + } + function deployMarkets( address accessManagerAddr, address factoryAddr, @@ -215,7 +248,7 @@ contract DeployBase is Script { accessManager.submitPendingOracle( oracle, address(collateral), - IOracle.Oracle(collateralPriceFeed, collateralPriceFeed, 0, uint32(365 days), uint32(365 days)) + IOracle.Oracle(collateralPriceFeed, collateralPriceFeed, uint32(365 days)) ); accessManager.acceptPendingOracle(oracle, address(collateral)); } else { @@ -245,7 +278,7 @@ contract DeployBase is Script { accessManager.submitPendingOracle( oracle, address(underlying), - IOracle.Oracle(underlyingPriceFeed, underlyingPriceFeed, 0, uint32(365 days), uint32(365 days)) + IOracle.Oracle(underlyingPriceFeed, underlyingPriceFeed, uint32(365 days)) ); accessManager.acceptPendingOracle(oracle, address(underlying)); } else { From d19a1e428400d0854fad32e25e504f14a2e192e4 Mon Sep 17 00:00:00 2001 From: Evan Date: Fri, 20 Jun 2025 22:09:54 +0800 Subject: [PATCH 100/194] merge deploy data --- .../deploydata/arb-mainnet-oracles.json | 22 + script/deploy/deploydata/arb-sepolia.json | 14 +- .../deploydata/bnb-mainnet-oracles.json | 22 + script/deploy/deploydata/bnb-mainnet.json | 333 ++++++++++++ .../deploydata/eth-mainnet-oracles.json | 10 + script/deploy/deploydata/eth-mainnet.json | 71 ++- .../deploy/deploydata/eth-sepolia copy.json | 497 ++++++++++++++++++ script/deploy/deploydata/eth-sepolia.json | 469 +---------------- .../merkl-pTMX-campaign-20250610.json | 108 ++++ 9 files changed, 1064 insertions(+), 482 deletions(-) create mode 100644 script/deploy/deploydata/arb-mainnet-oracles.json create mode 100644 script/deploy/deploydata/bnb-mainnet-oracles.json create mode 100644 script/deploy/deploydata/bnb-mainnet.json create mode 100644 script/deploy/deploydata/eth-mainnet-oracles.json create mode 100644 script/deploy/deploydata/eth-sepolia copy.json create mode 100644 script/deploy/deploydata/merkl-pTMX-campaign-20250610.json diff --git a/script/deploy/deploydata/arb-mainnet-oracles.json b/script/deploy/deploydata/arb-mainnet-oracles.json new file mode 100644 index 0000000..9027d9e --- /dev/null +++ b/script/deploy/deploydata/arb-mainnet-oracles.json @@ -0,0 +1,22 @@ +{ + "oracles": [ + { + "tokenAddr": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "priceFeedAddr": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "backupPriceFeedAddr": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "heartBeat": 3600 + }, + { + "tokenAddr": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "priceFeedAddr": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "backupPriceFeedAddr": "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3", + "heartBeat": 86400 + }, + { + "tokenAddr": "0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9", + "priceFeedAddr": "0x3f3f5dF88dC9F13eac63DF89EC16ef6e7E25DdE7", + "backupPriceFeedAddr": "0x3f3f5dF88dC9F13eac63DF89EC16ef6e7E25DdE7", + "heartBeat": 86400 + } + ] +} \ No newline at end of file diff --git a/script/deploy/deploydata/arb-sepolia.json b/script/deploy/deploydata/arb-sepolia.json index bdfaf25..a9129af 100644 --- a/script/deploy/deploydata/arb-sepolia.json +++ b/script/deploy/deploydata/arb-sepolia.json @@ -5,7 +5,7 @@ "salt": 0, "collateralCapForGt": "511789884423953000000", "marketConfig": { - "maturity": "1748563200", + "maturity": "1758844800", "lendTakerFeeRatio": "2000000", "lendMakerFeeRatio": "2000000", "borrowTakerFeeRatio": "3000000", @@ -46,7 +46,7 @@ "salt": 0, "collateralCapForGt": "511789884423953000000", "marketConfig": { - "maturity": "1748563200", + "maturity": "1758844800", "lendTakerFeeRatio": "2000000", "lendMakerFeeRatio": "2000000", "borrowTakerFeeRatio": "3000000", @@ -87,7 +87,7 @@ "salt": 0, "collateralCapForGt": "1215801480", "marketConfig": { - "maturity": "1748563200", + "maturity": "1758844800", "lendTakerFeeRatio": "2000000", "lendMakerFeeRatio": "2000000", "borrowTakerFeeRatio": "3000000", @@ -128,7 +128,7 @@ "salt": 0, "collateralCapForGt": "576466989178777000000", "marketConfig": { - "maturity": "1748563200", + "maturity": "1758844800", "lendTakerFeeRatio": "2000000", "lendMakerFeeRatio": "2000000", "borrowTakerFeeRatio": "3000000", @@ -169,7 +169,7 @@ "salt": 0, "collateralCapForGt": "612476065957113000000", "marketConfig": { - "maturity": "1748563200", + "maturity": "1766707200", "lendTakerFeeRatio": "2000000", "lendMakerFeeRatio": "2000000", "borrowTakerFeeRatio": "3000000", @@ -210,7 +210,7 @@ "salt": 0, "collateralCapForGt": "2760143527463430000000000", "marketConfig": { - "maturity": "1748563200", + "maturity": "1766707200", "lendTakerFeeRatio": "2000000", "lendMakerFeeRatio": "2000000", "borrowTakerFeeRatio": "3000000", @@ -251,7 +251,7 @@ "salt": 0, "collateralCapForGt": "617950533596769000000", "marketConfig": { - "maturity": "1750982400", + "maturity": "1766707200", "lendTakerFeeRatio": "2000000", "lendMakerFeeRatio": "2000000", "borrowTakerFeeRatio": "3000000", diff --git a/script/deploy/deploydata/bnb-mainnet-oracles.json b/script/deploy/deploydata/bnb-mainnet-oracles.json new file mode 100644 index 0000000..2d51ae3 --- /dev/null +++ b/script/deploy/deploydata/bnb-mainnet-oracles.json @@ -0,0 +1,22 @@ +{ + "oracles": [ + { + "tokenAddr": "0x211Cc4DD073734dA055fbF44a2b4667d5E5fE5d2", + "priceFeedAddr": "0x7CD1174235476Ec8844A88de0d3E56A21E72ADa2", + "backupPriceFeedAddr": "0x59538B3BdF046f15F7bDD231aACfA314071b1DF1", + "heartBeat": 86400 + }, + { + "tokenAddr": "0xdd809435ba6c9d6903730f923038801781ca66ce", + "priceFeedAddr": "0xe532CD9609BADBF6c02778116034a1EbD1526d3C", + "backupPriceFeedAddr": "0x652cD426ffe87cb6f435317cC19BC81EC940Fd46", + "heartBeat": 86400 + }, + { + "tokenAddr": "0x32C830f5c34122C6afB8aE87ABA541B7900a2C5F", + "priceFeedAddr": "0x5F5376913E011AeDe8d93027B335832180411322", + "backupPriceFeedAddr": "0x0000000000000000000000000000000000000000", + "heartBeat": 3600 + } + ] +} \ No newline at end of file diff --git a/script/deploy/deploydata/bnb-mainnet.json b/script/deploy/deploydata/bnb-mainnet.json new file mode 100644 index 0000000..0912e17 --- /dev/null +++ b/script/deploy/deploydata/bnb-mainnet.json @@ -0,0 +1,333 @@ +{ + "configNum": "8", + "configs": { + "configs_0": { + "salt": 0, + "collateralCapForGt": "15000000000000000000000", + "marketName": "WBNB/ynBNBx@25JUL2025", + "marketSymbol": "WBNB/ynBNBx@25JUL2025", + "marketConfig": { + "maturity": "1753401600", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "3000000" + }, + "loanConfig": { + "liquidationLtv": "86500000", + "maxLtv": "84500000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c", + "priceFeedAddr": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", + "backupPriceFeedAddr": "0x8dd2D85C7c28F43F965AE4d9545189C7D022ED0e", + "heartBeat": "86400", + "name": "Wrapped BNB", + "symbol": "WBNB", + "decimals": "18", + "initialPrice": "66380000000" + }, + "collateralConfig": { + "tokenAddr": "0x32C830f5c34122C6afB8aE87ABA541B7900a2C5F", + "priceFeedAddr": "0x5F5376913E011AeDe8d93027B335832180411322", + "backupPriceFeedAddr": "0x0000000000000000000000000000000000000000", + "heartBeat": "86400", + "name": "ynBNB MAX", + "symbol": "ynBNBx", + "decimals": "18", + "initialPrice": "67700740261", + "gtKeyIdentifier": "GearingTokenWithERC20" + } + }, + "configs_1": { + "salt": 0, + "collateralCapForGt": "15000000000000000000000", + "marketName": "USDT/WBNB@25JUL2025", + "marketSymbol": "USDT/WBNB@25JUL2025", + "marketConfig": { + "maturity": "1753401600", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "6000000" + }, + "loanConfig": { + "liquidationLtv": "80000000", + "maxLtv": "75000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0x55d398326f99059fF775485246999027B3197955", + "priceFeedAddr": "0xB97Ad0E74fa7d920791E90258A6E2085088b4320", + "backupPriceFeedAddr": "0xf57bA29437C130e155Ca4b65128630777638F05D", + "heartBeat": "86400", + "name": "Tether USD", + "symbol": "USDT", + "decimals": "18", + "initialPrice": "99909118" + }, + "collateralConfig": { + "tokenAddr": "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c", + "priceFeedAddr": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", + "backupPriceFeedAddr": "0x8dd2D85C7c28F43F965AE4d9545189C7D022ED0e", + "heartBeat": "86400", + "name": "Wrapped BNB", + "symbol": "WBNB", + "decimals": "18", + "initialPrice": "66388000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + } + }, + "configs_2": { + "salt": 0, + "collateralCapForGt": "8550000000000000000000000", + "marketName": "USDT/sUSDe@25JUL2025", + "marketSymbol": "USDT/sUSDe@25JUL2025", + "marketConfig": { + "maturity": "1753401600", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "6000000" + }, + "loanConfig": { + "liquidationLtv": "91500000", + "maxLtv": "89500000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0x55d398326f99059fF775485246999027B3197955", + "priceFeedAddr": "0xB97Ad0E74fa7d920791E90258A6E2085088b4320", + "backupPriceFeedAddr": "0xf57bA29437C130e155Ca4b65128630777638F05D", + "heartBeat": "86400", + "name": "Tether USD", + "symbol": "USDT", + "decimals": "18", + "initialPrice": "99909118" + }, + "collateralConfig": { + "tokenAddr": "0x211Cc4DD073734dA055fbF44a2b4667d5E5fE5d2", + "priceFeedAddr": "0x7CD1174235476Ec8844A88de0d3E56A21E72ADa2", + "backupPriceFeedAddr": "0x59538B3BdF046f15F7bDD231aACfA314071b1DF1", + "heartBeat": "86400", + "name": "Staked USDe", + "symbol": "sUSDe", + "decimals": "18", + "initialPrice": "117868657", + "gtKeyIdentifier": "GearingTokenWithERC20" + } + }, + "configs_3": { + "salt": 0, + "collateralCapForGt": "10000000000000000000000000", + "marketName": "BTCB/USD1@25JUL2025", + "marketSymbol": "BTCB/USD1@25JUL2025", + "marketConfig": { + "maturity": "1753401600", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "3000000" + }, + "loanConfig": { + "liquidationLtv": "80000000", + "maxLtv": "75000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0x7130d2A12B9BCbFAe4f2634d864A1Ee1Ce3Ead9c", + "priceFeedAddr": "0x264990fbd0A4796A3E3d8E37C4d5F87a3aCa5Ebf", + "backupPriceFeedAddr": "0x0000000000000000000000000000000000000000", + "heartBeat": "86400", + "name": "BTCB Token", + "symbol": "BTCB", + "decimals": "18", + "initialPrice": "10722977910429" + }, + "collateralConfig": { + "tokenAddr": "0x8d0D000Ee44948FC98c9B98A4FA4921476f08B0d", + "priceFeedAddr": "0xaD8b4e59A7f25B68945fAf0f3a3EAF027832FFB0", + "backupPriceFeedAddr": "0x6A1c87d11dDe3D1d52c24f8EC59B91019f14170D", + "heartBeat": "86400", + "name": "World Liberty Financial USD", + "symbol": "USD1", + "decimals": "18", + "initialPrice": "99974118", + "gtKeyIdentifier": "GearingTokenWithERC20" + } + }, + "configs_4": { + "salt": 0, + "collateralCapForGt": "93000000000000000000", + "marketName": "USDT/BTCB@25JUL2025", + "marketSymbol": "USDT/BTCB@25JUL2025", + "marketConfig": { + "maturity": "1753401600", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "6000000" + }, + "loanConfig": { + "liquidationLtv": "80000000", + "maxLtv": "75000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0x55d398326f99059fF775485246999027B3197955", + "priceFeedAddr": "0xB97Ad0E74fa7d920791E90258A6E2085088b4320", + "backupPriceFeedAddr": "0xf57bA29437C130e155Ca4b65128630777638F05D", + "heartBeat": "86400", + "name": "Tether USD", + "symbol": "USDT", + "decimals": "18", + "initialPrice": "99947066" + }, + "collateralConfig": { + "tokenAddr": "0x7130d2A12B9BCbFAe4f2634d864A1Ee1Ce3Ead9c", + "priceFeedAddr": "0x264990fbd0A4796A3E3d8E37C4d5F87a3aCa5Ebf", + "backupPriceFeedAddr": "0x0000000000000000000000000000000000000000", + "heartBeat": "86400", + "name": "BTCB Token", + "symbol": "BTCB", + "decimals": "18", + "initialPrice": "10724217325584", + "gtKeyIdentifier": "GearingTokenWithERC20" + } + }, + "configs_5": { + "salt": 0, + "collateralCapForGt": "10000000000000000000000000", + "marketName": "USDT/USD1@25JUL2025", + "marketSymbol": "USDT/USD1@25JUL2025", + "marketConfig": { + "maturity": "1753401600", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "6000000" + }, + "loanConfig": { + "liquidationLtv": "92500000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0x55d398326f99059fF775485246999027B3197955", + "priceFeedAddr": "0xB97Ad0E74fa7d920791E90258A6E2085088b4320", + "backupPriceFeedAddr": "0xf57bA29437C130e155Ca4b65128630777638F05D", + "heartBeat": "86400", + "name": "Tether USD", + "symbol": "USDT", + "decimals": "18", + "initialPrice": "100021431" + }, + "collateralConfig": { + "tokenAddr": "0x8d0D000Ee44948FC98c9B98A4FA4921476f08B0d", + "priceFeedAddr": "0xaD8b4e59A7f25B68945fAf0f3a3EAF027832FFB0", + "backupPriceFeedAddr": "0x6A1c87d11dDe3D1d52c24f8EC59B91019f14170D", + "heartBeat": "86400", + "name": "World Liberty Financial USD", + "symbol": "USD1", + "decimals": "18", + "initialPrice": "99942432", + "gtKeyIdentifier": "GearingTokenWithERC20" + } + }, + "configs_6": { + "salt": 0, + "collateralCapForGt": "10000000000000000000000000", + "marketName": "WBNB/USD1@25JUL2025", + "marketSymbol": "WBNB/USD1@25JUL2025", + "marketConfig": { + "maturity": "1753401600", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "3000000" + }, + "loanConfig": { + "liquidationLtv": "80000000", + "maxLtv": "75000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c", + "priceFeedAddr": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", + "backupPriceFeedAddr": "0x8dd2D85C7c28F43F965AE4d9545189C7D022ED0e", + "heartBeat": "86400", + "name": "Wrapped BNB", + "symbol": "WBNB", + "decimals": "18", + "initialPrice": "66423000000" + }, + "collateralConfig": { + "tokenAddr": "0x8d0D000Ee44948FC98c9B98A4FA4921476f08B0d", + "priceFeedAddr": "0xaD8b4e59A7f25B68945fAf0f3a3EAF027832FFB0", + "backupPriceFeedAddr": "0x6A1c87d11dDe3D1d52c24f8EC59B91019f14170D", + "heartBeat": "86400", + "name": "World Liberty Financial USD", + "symbol": "USD1", + "decimals": "18", + "initialPrice": "99942432", + "gtKeyIdentifier": "GearingTokenWithERC20" + } + }, + "configs_7": { + "salt": 0, + "collateralCapForGt": "93000000000000000000", + "marketName": "WBNB/BTCB@25JUL2025", + "marketSymbol": "WBNB/BTCB@25JUL2025", + "marketConfig": { + "maturity": "1753401600", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "3000000" + }, + "loanConfig": { + "liquidationLtv": "80000000", + "maxLtv": "75000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c", + "priceFeedAddr": "0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE", + "backupPriceFeedAddr": "0x8dd2D85C7c28F43F965AE4d9545189C7D022ED0e", + "heartBeat": "86400", + "name": "Wrapped BNB", + "symbol": "WBNB", + "decimals": "18", + "initialPrice": "66424000000" + }, + "collateralConfig": { + "tokenAddr": "0x7130d2A12B9BCbFAe4f2634d864A1Ee1Ce3Ead9c", + "priceFeedAddr": "0x264990fbd0A4796A3E3d8E37C4d5F87a3aCa5Ebf", + "backupPriceFeedAddr": "0x0000000000000000000000000000000000000000", + "heartBeat": "86400", + "name": "BTCB Token", + "symbol": "BTCB", + "decimals": "18", + "initialPrice": "10725187649683", + "gtKeyIdentifier": "GearingTokenWithERC20" + } + } + } +} \ No newline at end of file diff --git a/script/deploy/deploydata/eth-mainnet-oracles.json b/script/deploy/deploydata/eth-mainnet-oracles.json new file mode 100644 index 0000000..f13b645 --- /dev/null +++ b/script/deploy/deploydata/eth-mainnet-oracles.json @@ -0,0 +1,10 @@ +{ + "oracles": [ + { + "tokenAddr": "0xE2Fc85BfB48C4cF147921fBE110cf92Ef9f26F94", + "priceFeedAddr": "0x91F37A3058A7fD3f4f66ED87d715CF05bB4fbfBd", + "backupPriceFeedAddr": "0x0000000000000000000000000000000000000000", + "heartBeat": 86400 + } + ] +} \ No newline at end of file diff --git a/script/deploy/deploydata/eth-mainnet.json b/script/deploy/deploydata/eth-mainnet.json index 7cfa426..5220d56 100644 --- a/script/deploy/deploydata/eth-mainnet.json +++ b/script/deploy/deploydata/eth-mainnet.json @@ -1,13 +1,13 @@ { - "configNum": "1", + "configNum": "2", "configs": { "configs_0": { "salt": 0, - "collateralCapForGt": "9832841690000000000000000", - "marketName": "USDC/cUSDO@25JUL2025", - "marketSymbol": "USDC/cUSDO@25JUL2025", + "collateralCapForGt": "5000000000000", + "marketName": "USDC/xUSD@29AUG2025", + "marketSymbol": "USDC/xUSD@29AUG2025", "marketConfig": { - "maturity": "1753401600", + "maturity": "1756425600", "lendTakerFeeRatio": "2000000", "lendMakerFeeRatio": "2000000", "borrowTakerFeeRatio": "3000000", @@ -17,7 +17,7 @@ }, "loanConfig": { "liquidationLtv": "94000000", - "maxLtv": "92000000", + "maxLtv": "90000000", "liquidatable": true }, "underlyingConfig": { @@ -28,19 +28,60 @@ "name": "USD Coin", "symbol": "USDC", "decimals": "6", - "initialPrice": "99845377" + "initialPrice": "100131606" }, "collateralConfig": { - "tokenAddr": "0xaD55aebc9b8c03FC43cd9f62260391c13c23e7c0", - "priceFeedAddr": "0xf158000de86899b5EB5E6fA3BB78F32A072bD14b", - "backupPriceFeedAddr": "0xf158000de86899b5EB5E6fA3BB78F32A072bD14b", + "tokenAddr": "0xE2Fc85BfB48C4cF147921fBE110cf92Ef9f26F94", + "priceFeedAddr": "0x91F37A3058A7fD3f4f66ED87d715CF05bB4fbfBd", + "backupPriceFeedAddr": "0x0000000000000000000000000000000000000000", "heartBeat": "86400", - "name": "Compounding Open Dollar", - "symbol": "cUSDO", - "decimals": "18", - "initialPrice": "101885665", + "name": "Staked Stream USD", + "symbol": "xUSD", + "decimals": "6", + "initialPrice": "100000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + } + }, + "configs_1": { + "salt": 0, + "collateralCapForGt": "5000000000000", + "marketName": "USDC/xUSD@26SEP2025", + "marketSymbol": "USDC/xUSD@26SEP2025", + "marketConfig": { + "maturity": "1758844800", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "6000000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "99982129" + }, + "collateralConfig": { + "tokenAddr": "0xE2Fc85BfB48C4cF147921fBE110cf92Ef9f26F94", + "priceFeedAddr": "0x91F37A3058A7fD3f4f66ED87d715CF05bB4fbfBd", + "backupPriceFeedAddr": "0x0000000000000000000000000000000000000000", + "heartBeat": "86400", + "name": "Staked Stream USD", + "symbol": "xUSD", + "decimals": "6", + "initialPrice": "100000000", "gtKeyIdentifier": "GearingTokenWithERC20" } } } -} \ No newline at end of file +} diff --git a/script/deploy/deploydata/eth-sepolia copy.json b/script/deploy/deploydata/eth-sepolia copy.json new file mode 100644 index 0000000..2930b4d --- /dev/null +++ b/script/deploy/deploydata/eth-sepolia copy.json @@ -0,0 +1,497 @@ +{ + "configNum": "12", + "configs": { + "configs_0": { + "salt": 0, + "collateralCapForGt": "638791170088097000000", + "marketConfig": { + "maturity": "1748325600", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "priceFeedAddr": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "backupPriceFeedAddr": "0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4", + "heartBeat": "86400", + "name": "Wrapped ETH", + "symbol": "WETH", + "decimals": "18", + "initialPrice": "147342000000" + }, + "collateralConfig": { + "tokenAddr": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", + "priceFeedAddr": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "backupPriceFeedAddr": "0x24CFEf73A30b2CEEC23d3659fA98B491D996F152", + "heartBeat": "86400", + "name": "Wrapped eETH", + "symbol": "weETH", + "decimals": "18", + "initialPrice": "156546000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "WETH/weETH@30MAY2025", + "marketSymbol": "WETH/weETH@30MAY2025" + }, + "configs_1": { + "salt": 0, + "collateralCapForGt": "567121561593946000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "85000000", + "maxLtv": "81000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", + "priceFeedAddr": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "backupPriceFeedAddr": "0x164b276057258d81941e97B0a900D4C7B358bCe0", + "heartBeat": "86400", + "name": "Wrapped liquid staked Ether 2.0", + "symbol": "wstETH", + "decimals": "18", + "initialPrice": "176329000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/wstETH@30MAY2025", + "marketSymbol": "USDC/wstETH@30MAY2025" + }, + "configs_2": { + "salt": 0, + "collateralCapForGt": "862068965517241000000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "90000000", + "maxLtv": "86000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "priceFeedAddr": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", + "backupPriceFeedAddr": "0xb99D174ED06c83588Af997c8859F93E83dD4733f", + "heartBeat": "86400", + "name": "Staked USDe", + "symbol": "sUSDe", + "decimals": "18", + "initialPrice": "115999999", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/sUSDe@30MAY2025", + "marketSymbol": "USDC/sUSDe@30MAY2025" + }, + "configs_3": { + "salt": 0, + "collateralCapForGt": "1025010250102500000000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "90000000", + "maxLtv": "86000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", + "priceFeedAddr": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", + "backupPriceFeedAddr": "0x333651c5710Fc8C4fe65E5D15E5639348F267D7c", + "heartBeat": "86400", + "name": "PT Ethena sUSDE 29MAY2025", + "symbol": "PT-sUSDE-29MAY2025", + "decimals": "18", + "initialPrice": "98000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/PT-sUSDE-29MAY2025@30MAY2025", + "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025" + }, + "configs_4": { + "salt": 0, + "collateralCapForGt": "952380952380952000000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0xd63070114470f685b75B74D60EEc7c1113d33a3D", + "priceFeedAddr": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "backupPriceFeedAddr": "0x2a2a0e32c54670045256EBcA681887E32e689E97", + "heartBeat": "86400", + "name": "USUAL Boosted USDC", + "symbol": "USUALUSDC+", + "decimals": "18", + "initialPrice": "105000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/USUALUSDC+@30MAY2025", + "marketSymbol": "USDC/USUALUSDC+@30MAY2025" + }, + "configs_5": { + "salt": 0, + "collateralCapForGt": "658925566985259000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "priceFeedAddr": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "backupPriceFeedAddr": "0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4", + "heartBeat": "86400", + "name": "Wrapped ETH", + "symbol": "WETH", + "decimals": "18", + "initialPrice": "147342000000" + }, + "collateralConfig": { + "tokenAddr": "0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8", + "priceFeedAddr": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", + "backupPriceFeedAddr": "0x3b82860EC8815Fc2A1dcC53580bd647b0042C93e", + "heartBeat": "86400", + "name": "MEV Capital wETH", + "symbol": "MCwETH", + "decimals": "18", + "initialPrice": "151762000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "WETH/MCwETH@30MAY2025", + "marketSymbol": "WETH/MCwETH@30MAY2025" + }, + "configs_6": { + "salt": 0, + "collateralCapForGt": "729620870774905000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "92000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "priceFeedAddr": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "backupPriceFeedAddr": "0x5F08C227deAe74D8e5Ec0d743FB0744AB1B6c984", + "heartBeat": "86400", + "name": "pufETH", + "symbol": "pufETH", + "decimals": "18", + "initialPrice": "183668000000" + }, + "collateralConfig": { + "tokenAddr": "0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D", + "priceFeedAddr": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", + "backupPriceFeedAddr": "0x5D18F4cB3c95568F315cb1C1eF48261a5A4D6053", + "heartBeat": "86400", + "name": "PT Puffer ETH 26JUN2025", + "symbol": "PT-pufETH-26JUN2025", + "decimals": "18", + "initialPrice": "137057000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "pufETH/PT-pufETH-26JUN2025@30MAY2025", + "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025" + }, + "configs_7": { + "salt": 0, + "collateralCapForGt": "1000000000000000000000000", + "marketConfig": { + "maturity": "1748476800", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "92000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F", + "priceFeedAddr": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", + "backupPriceFeedAddr": "0x6B09d473dB784D840E307Cb3Da63CbA79D300CAc", + "heartBeat": "86400", + "name": "Ethereal Pre-deposit Vault", + "symbol": "eUSDe", + "decimals": "18", + "initialPrice": "100000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/eUSDe@29MAY2025", + "marketSymbol": "USDC/eUSDe@29MAY2025" + }, + "configs_8": { + "salt": 0, + "collateralCapForGt": "650118523968408000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "priceFeedAddr": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "backupPriceFeedAddr": "0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4", + "heartBeat": "86400", + "name": "Wrapped ETH", + "symbol": "WETH", + "decimals": "18", + "initialPrice": "147342000000" + }, + "collateralConfig": { + "tokenAddr": "0xD9A442856C234a39a81a089C06451EBAa4306a72", + "priceFeedAddr": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", + "backupPriceFeedAddr": "0x5F08C227deAe74D8e5Ec0d743FB0744AB1B6c984", + "heartBeat": "86400", + "name": "pufETH", + "symbol": "pufETH", + "decimals": "18", + "initialPrice": "153818000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "WETH/pufETH@30MAY2025", + "marketSymbol": "WETH/pufETH@30MAY2025" + }, + "configs_9": { + "salt": 0, + "collateralCapForGt": "1294383437", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "85000000", + "maxLtv": "81000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "priceFeedAddr": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", + "backupPriceFeedAddr": "0xAB7f623fb2F6fea6601D4350FA0E2290663C28Fc", + "heartBeat": "86400", + "name": "Wrapped BTC", + "symbol": "WBTC", + "decimals": "8", + "initialPrice": "7725686000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/WBTC@30MAY2025", + "marketSymbol": "USDC/WBTC@30MAY2025" + }, + "configs_10": { + "salt": 0, + "collateralCapForGt": "1294383437", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000" + }, + "loanConfig": { + "liquidationLtv": "85000000", + "maxLtv": "81000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400", + "name": "USD Coin", + "symbol": "USDC", + "decimals": "6", + "initialPrice": "100000000" + }, + "collateralConfig": { + "tokenAddr": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", + "priceFeedAddr": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "backupPriceFeedAddr": "0x2665701293fCbEB223D11A08D826563EDcCE423A", + "heartBeat": "86400", + "name": "Coinbase Wrapped BTC", + "symbol": "cbBTC", + "decimals": "8", + "initialPrice": "7725686000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "USDC/cbBTC@30MAY2025", + "marketSymbol": "USDC/cbBTC@30MAY2025" + }, + "configs_11": { + "salt": 0, + "collateralCapForGt": "663758761853122000000", + "marketConfig": { + "maturity": "1748563200", + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "400000" + }, + "loanConfig": { + "liquidationLtv": "94000000", + "maxLtv": "90000000", + "liquidatable": true + }, + "underlyingConfig": { + "tokenAddr": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "priceFeedAddr": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", + "backupPriceFeedAddr": "0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4", + "heartBeat": "86400", + "name": "Wrapped ETH", + "symbol": "WETH", + "decimals": "18", + "initialPrice": "147342000000" + }, + "collateralConfig": { + "tokenAddr": "0x2371e134e3455e0593363cBF89d3b6cf53740618", + "priceFeedAddr": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", + "backupPriceFeedAddr": "0x3A44454F173b082F1dbbA9587b046Dc90B2F0AE7", + "heartBeat": "86400", + "name": "Gauntlet WETH Prime", + "symbol": "gtWETH", + "decimals": "18", + "initialPrice": "150657000000", + "gtKeyIdentifier": "GearingTokenWithERC20" + }, + "marketName": "WETH/gtWETH@30MAY2025", + "marketSymbol": "WETH/gtWETH@30MAY2025" + } + } +} \ No newline at end of file diff --git a/script/deploy/deploydata/eth-sepolia.json b/script/deploy/deploydata/eth-sepolia.json index eaa43ff..38c3322 100644 --- a/script/deploy/deploydata/eth-sepolia.json +++ b/script/deploy/deploydata/eth-sepolia.json @@ -1,11 +1,11 @@ { - "configNum": "12", + "configNum": "1", "configs": { "configs_0": { "salt": 0, "collateralCapForGt": "638791170088097000000", "marketConfig": { - "maturity": "1748563200", + "maturity": "1758844800", "lendTakerFeeRatio": "2000000", "lendMakerFeeRatio": "2000000", "borrowTakerFeeRatio": "3000000", @@ -18,129 +18,6 @@ "maxLtv": "90000000", "liquidatable": true }, - "underlyingConfig": { - "tokenAddr": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", - "priceFeedAddr": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", - "backupPriceFeedAddr": "0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4", - "heartBeat": "86400", - "name": "Wrapped ETH", - "symbol": "WETH", - "decimals": "18", - "initialPrice": "147342000000" - }, - "collateralConfig": { - "tokenAddr": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", - "priceFeedAddr": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", - "backupPriceFeedAddr": "0x24CFEf73A30b2CEEC23d3659fA98B491D996F152", - "heartBeat": "86400", - "name": "Wrapped eETH", - "symbol": "weETH", - "decimals": "18", - "initialPrice": "156546000000", - "gtKeyIdentifier": "GearingTokenWithERC20" - }, - "marketName": "WETH/weETH@30MAY2025", - "marketSymbol": "WETH/weETH@30MAY2025" - }, - "configs_1": { - "salt": 0, - "collateralCapForGt": "567121561593946000000", - "marketConfig": { - "maturity": "1748563200", - "lendTakerFeeRatio": "2000000", - "lendMakerFeeRatio": "2000000", - "borrowTakerFeeRatio": "3000000", - "borrowMakerFeeRatio": "3000000", - "mintGtFeeRatio": "1000000", - "mintGtFeeRef": "2000000" - }, - "loanConfig": { - "liquidationLtv": "85000000", - "maxLtv": "81000000", - "liquidatable": true - }, - "underlyingConfig": { - "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", - "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", - "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", - "heartBeat": "86400", - "name": "USD Coin", - "symbol": "USDC", - "decimals": "6", - "initialPrice": "100000000" - }, - "collateralConfig": { - "tokenAddr": "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", - "priceFeedAddr": "0x164b276057258d81941e97B0a900D4C7B358bCe0", - "backupPriceFeedAddr": "0x164b276057258d81941e97B0a900D4C7B358bCe0", - "heartBeat": "86400", - "name": "Wrapped liquid staked Ether 2.0", - "symbol": "wstETH", - "decimals": "18", - "initialPrice": "176329000000", - "gtKeyIdentifier": "GearingTokenWithERC20" - }, - "marketName": "USDC/wstETH@30MAY2025", - "marketSymbol": "USDC/wstETH@30MAY2025" - }, - "configs_2": { - "salt": 0, - "collateralCapForGt": "862068965517241000000000", - "marketConfig": { - "maturity": "1748563200", - "lendTakerFeeRatio": "2000000", - "lendMakerFeeRatio": "2000000", - "borrowTakerFeeRatio": "3000000", - "borrowMakerFeeRatio": "3000000", - "mintGtFeeRatio": "1000000", - "mintGtFeeRef": "2000000" - }, - "loanConfig": { - "liquidationLtv": "90000000", - "maxLtv": "86000000", - "liquidatable": true - }, - "underlyingConfig": { - "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", - "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", - "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", - "heartBeat": "86400", - "name": "USD Coin", - "symbol": "USDC", - "decimals": "6", - "initialPrice": "100000000" - }, - "collateralConfig": { - "tokenAddr": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", - "priceFeedAddr": "0xFF3BC18cCBd5999CE63E788A1c250a88626aD099", - "backupPriceFeedAddr": "0xb99D174ED06c83588Af997c8859F93E83dD4733f", - "heartBeat": "86400", - "name": "Staked USDe", - "symbol": "sUSDe", - "decimals": "18", - "initialPrice": "115999999", - "gtKeyIdentifier": "GearingTokenWithERC20" - }, - "marketName": "USDC/sUSDe@30MAY2025", - "marketSymbol": "USDC/sUSDe@30MAY2025" - }, - "configs_3": { - "salt": 0, - "collateralCapForGt": "1025010250102500000000000", - "marketConfig": { - "maturity": "1748563200", - "lendTakerFeeRatio": "2000000", - "lendMakerFeeRatio": "2000000", - "borrowTakerFeeRatio": "3000000", - "borrowMakerFeeRatio": "3000000", - "mintGtFeeRatio": "1000000", - "mintGtFeeRef": "2000000" - }, - "loanConfig": { - "liquidationLtv": "90000000", - "maxLtv": "86000000", - "liquidatable": true - }, "underlyingConfig": { "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", @@ -152,346 +29,18 @@ "initialPrice": "100000000" }, "collateralConfig": { - "tokenAddr": "0xb7de5dFCb74d25c2f21841fbd6230355C50d9308", - "priceFeedAddr": "0x8f29Df42c617C222Bc2B416AC8a022E85e853276", - "backupPriceFeedAddr": "0x333651c5710Fc8C4fe65E5D15E5639348F267D7c", + "tokenAddr": "0x3b3fb9c57858ef816833dc91565efcd85d96f634", + "priceFeedAddr": "0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136", + "backupPriceFeedAddr": "0x24CFEf73A30b2CEEC23d3659fA98B491D996F152", "heartBeat": "86400", - "name": "PT Ethena sUSDE 29MAY2025", - "symbol": "PT-sUSDE-29MAY2025", + "name": "PT-sUSDE-31JUL2025", + "symbol": "PT-sUSDE-31JUL2025", "decimals": "18", "initialPrice": "98000000", "gtKeyIdentifier": "GearingTokenWithERC20" }, - "marketName": "USDC/PT-sUSDE-29MAY2025@30MAY2025", - "marketSymbol": "USDC/PT-sUSDE-29MAY2025@30MAY2025" - }, - "configs_4": { - "salt": 0, - "collateralCapForGt": "952380952380952000000000", - "marketConfig": { - "maturity": "1748563200", - "lendTakerFeeRatio": "2000000", - "lendMakerFeeRatio": "2000000", - "borrowTakerFeeRatio": "3000000", - "borrowMakerFeeRatio": "3000000", - "mintGtFeeRatio": "1000000", - "mintGtFeeRef": "2000000" - }, - "loanConfig": { - "liquidationLtv": "94000000", - "maxLtv": "90000000", - "liquidatable": true - }, - "underlyingConfig": { - "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", - "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", - "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", - "heartBeat": "86400", - "name": "USD Coin", - "symbol": "USDC", - "decimals": "6", - "initialPrice": "100000000" - }, - "collateralConfig": { - "tokenAddr": "0xd63070114470f685b75B74D60EEc7c1113d33a3D", - "priceFeedAddr": "0x2a2a0e32c54670045256EBcA681887E32e689E97", - "backupPriceFeedAddr": "0x2a2a0e32c54670045256EBcA681887E32e689E97", - "heartBeat": "86400", - "name": "USUAL Boosted USDC", - "symbol": "USUALUSDC+", - "decimals": "18", - "initialPrice": "105000000", - "gtKeyIdentifier": "GearingTokenWithERC20" - }, - "marketName": "USDC/USUALUSDC+@30MAY2025", - "marketSymbol": "USDC/USUALUSDC+@30MAY2025" - }, - "configs_5": { - "salt": 0, - "collateralCapForGt": "658925566985259000000", - "marketConfig": { - "maturity": "1748563200", - "lendTakerFeeRatio": "2000000", - "lendMakerFeeRatio": "2000000", - "borrowTakerFeeRatio": "3000000", - "borrowMakerFeeRatio": "3000000", - "mintGtFeeRatio": "1000000", - "mintGtFeeRef": "400000" - }, - "loanConfig": { - "liquidationLtv": "94000000", - "maxLtv": "90000000", - "liquidatable": true - }, - "underlyingConfig": { - "tokenAddr": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", - "priceFeedAddr": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", - "backupPriceFeedAddr": "0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4", - "heartBeat": "86400", - "name": "Wrapped ETH", - "symbol": "WETH", - "decimals": "18", - "initialPrice": "147342000000" - }, - "collateralConfig": { - "tokenAddr": "0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8", - "priceFeedAddr": "0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006", - "backupPriceFeedAddr": "0x3b82860EC8815Fc2A1dcC53580bd647b0042C93e", - "heartBeat": "86400", - "name": "MEV Capital wETH", - "symbol": "MCwETH", - "decimals": "18", - "initialPrice": "151762000000", - "gtKeyIdentifier": "GearingTokenWithERC20" - }, - "marketName": "WETH/MCwETH@30MAY2025", - "marketSymbol": "WETH/MCwETH@30MAY2025" - }, - "configs_6": { - "salt": 0, - "collateralCapForGt": "729620870774905000000", - "marketConfig": { - "maturity": "1748563200", - "lendTakerFeeRatio": "2000000", - "lendMakerFeeRatio": "2000000", - "borrowTakerFeeRatio": "3000000", - "borrowMakerFeeRatio": "3000000", - "mintGtFeeRatio": "1000000", - "mintGtFeeRef": "400000" - }, - "loanConfig": { - "liquidationLtv": "94000000", - "maxLtv": "92000000", - "liquidatable": true - }, - "underlyingConfig": { - "tokenAddr": "0xD9A442856C234a39a81a089C06451EBAa4306a72", - "priceFeedAddr": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", - "backupPriceFeedAddr": "0x5F08C227deAe74D8e5Ec0d743FB0744AB1B6c984", - "heartBeat": "86400", - "name": "pufETH", - "symbol": "pufETH", - "decimals": "18", - "initialPrice": "183668000000" - }, - "collateralConfig": { - "tokenAddr": "0x9cFc9917C171A384c7168D3529Fc7e851a2E0d6D", - "priceFeedAddr": "0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1", - "backupPriceFeedAddr": "0x5D18F4cB3c95568F315cb1C1eF48261a5A4D6053", - "heartBeat": "86400", - "name": "PT Puffer ETH 26JUN2025", - "symbol": "PT-pufETH-26JUN2025", - "decimals": "18", - "initialPrice": "137057000000", - "gtKeyIdentifier": "GearingTokenWithERC20" - }, - "marketName": "pufETH/PT-pufETH-26JUN2025@30MAY2025", - "marketSymbol": "pufETH/PT-pufETH-26JUN2025@30MAY2025" - }, - "configs_7": { - "salt": 0, - "collateralCapForGt": "1000000000000000000000000", - "marketConfig": { - "maturity": "1748476800", - "lendTakerFeeRatio": "2000000", - "lendMakerFeeRatio": "2000000", - "borrowTakerFeeRatio": "3000000", - "borrowMakerFeeRatio": "3000000", - "mintGtFeeRatio": "1000000", - "mintGtFeeRef": "2000000" - }, - "loanConfig": { - "liquidationLtv": "94000000", - "maxLtv": "92000000", - "liquidatable": true - }, - "underlyingConfig": { - "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", - "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", - "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", - "heartBeat": "86400", - "name": "USD Coin", - "symbol": "USDC", - "decimals": "6", - "initialPrice": "100000000" - }, - "collateralConfig": { - "tokenAddr": "0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F", - "priceFeedAddr": "0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3", - "backupPriceFeedAddr": "0x6B09d473dB784D840E307Cb3Da63CbA79D300CAc", - "heartBeat": "86400", - "name": "Ethereal Pre-deposit Vault", - "symbol": "eUSDe", - "decimals": "18", - "initialPrice": "100000000", - "gtKeyIdentifier": "GearingTokenWithERC20" - }, - "marketName": "USDC/eUSDe@29MAY2025", - "marketSymbol": "USDC/eUSDe@29MAY2025" - }, - "configs_8": { - "salt": 0, - "collateralCapForGt": "650118523968408000000", - "marketConfig": { - "maturity": "1748563200", - "lendTakerFeeRatio": "2000000", - "lendMakerFeeRatio": "2000000", - "borrowTakerFeeRatio": "3000000", - "borrowMakerFeeRatio": "3000000", - "mintGtFeeRatio": "1000000", - "mintGtFeeRef": "400000" - }, - "loanConfig": { - "liquidationLtv": "94000000", - "maxLtv": "90000000", - "liquidatable": true - }, - "underlyingConfig": { - "tokenAddr": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", - "priceFeedAddr": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", - "backupPriceFeedAddr": "0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4", - "heartBeat": "86400", - "name": "Wrapped ETH", - "symbol": "WETH", - "decimals": "18", - "initialPrice": "147342000000" - }, - "collateralConfig": { - "tokenAddr": "0xD9A442856C234a39a81a089C06451EBAa4306a72", - "priceFeedAddr": "0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761", - "backupPriceFeedAddr": "0x5F08C227deAe74D8e5Ec0d743FB0744AB1B6c984", - "heartBeat": "86400", - "name": "pufETH", - "symbol": "pufETH", - "decimals": "18", - "initialPrice": "153818000000", - "gtKeyIdentifier": "GearingTokenWithERC20" - }, - "marketName": "WETH/pufETH@30MAY2025", - "marketSymbol": "WETH/pufETH@30MAY2025" - }, - "configs_9": { - "salt": 0, - "collateralCapForGt": "1294383437", - "marketConfig": { - "maturity": "1748563200", - "lendTakerFeeRatio": "2000000", - "lendMakerFeeRatio": "2000000", - "borrowTakerFeeRatio": "3000000", - "borrowMakerFeeRatio": "3000000", - "mintGtFeeRatio": "1000000", - "mintGtFeeRef": "2000000" - }, - "loanConfig": { - "liquidationLtv": "85000000", - "maxLtv": "81000000", - "liquidatable": true - }, - "underlyingConfig": { - "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", - "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", - "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", - "heartBeat": "86400", - "name": "USD Coin", - "symbol": "USDC", - "decimals": "6", - "initialPrice": "100000000" - }, - "collateralConfig": { - "tokenAddr": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", - "priceFeedAddr": "0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c", - "backupPriceFeedAddr": "0xAB7f623fb2F6fea6601D4350FA0E2290663C28Fc", - "heartBeat": "86400", - "name": "Wrapped BTC", - "symbol": "WBTC", - "decimals": "8", - "initialPrice": "7725686000000", - "gtKeyIdentifier": "GearingTokenWithERC20" - }, - "marketName": "USDC/WBTC@30MAY2025", - "marketSymbol": "USDC/WBTC@30MAY2025" - }, - "configs_10": { - "salt": 0, - "collateralCapForGt": "1294383437", - "marketConfig": { - "maturity": "1748563200", - "lendTakerFeeRatio": "2000000", - "lendMakerFeeRatio": "2000000", - "borrowTakerFeeRatio": "3000000", - "borrowMakerFeeRatio": "3000000", - "mintGtFeeRatio": "1000000", - "mintGtFeeRef": "2000000" - }, - "loanConfig": { - "liquidationLtv": "85000000", - "maxLtv": "81000000", - "liquidatable": true - }, - "underlyingConfig": { - "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", - "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", - "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", - "heartBeat": "86400", - "name": "USD Coin", - "symbol": "USDC", - "decimals": "6", - "initialPrice": "100000000" - }, - "collateralConfig": { - "tokenAddr": "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", - "priceFeedAddr": "0x2665701293fCbEB223D11A08D826563EDcCE423A", - "backupPriceFeedAddr": "0x2665701293fCbEB223D11A08D826563EDcCE423A", - "heartBeat": "86400", - "name": "Coinbase Wrapped BTC", - "symbol": "cbBTC", - "decimals": "8", - "initialPrice": "7725686000000", - "gtKeyIdentifier": "GearingTokenWithERC20" - }, - "marketName": "USDC/cbBTC@30MAY2025", - "marketSymbol": "USDC/cbBTC@30MAY2025" - }, - "configs_11": { - "salt": 0, - "collateralCapForGt": "663758761853122000000", - "marketConfig": { - "maturity": "1748563200", - "lendTakerFeeRatio": "2000000", - "lendMakerFeeRatio": "2000000", - "borrowTakerFeeRatio": "3000000", - "borrowMakerFeeRatio": "3000000", - "mintGtFeeRatio": "1000000", - "mintGtFeeRef": "400000" - }, - "loanConfig": { - "liquidationLtv": "94000000", - "maxLtv": "90000000", - "liquidatable": true - }, - "underlyingConfig": { - "tokenAddr": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", - "priceFeedAddr": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", - "backupPriceFeedAddr": "0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4", - "heartBeat": "86400", - "name": "Wrapped ETH", - "symbol": "WETH", - "decimals": "18", - "initialPrice": "147342000000" - }, - "collateralConfig": { - "tokenAddr": "0x2371e134e3455e0593363cBF89d3b6cf53740618", - "priceFeedAddr": "0xdc0115fe09600FeDa15D317cCa3D2f21F389036d", - "backupPriceFeedAddr": "0x3A44454F173b082F1dbbA9587b046Dc90B2F0AE7", - "heartBeat": "86400", - "name": "Gauntlet WETH Prime", - "symbol": "gtWETH", - "decimals": "18", - "initialPrice": "150657000000", - "gtKeyIdentifier": "GearingTokenWithERC20" - }, - "marketName": "WETH/gtWETH@30MAY2025", - "marketSymbol": "WETH/gtWETH@30MAY2025" + "marketName": "USDC/PT-sUSDE-31JUL2025@01AUG2025", + "marketSymbol": "USDC/PT-sUSDE-31JUL2025@01AUG2025" } } } \ No newline at end of file diff --git a/script/deploy/deploydata/merkl-pTMX-campaign-20250610.json b/script/deploy/deploydata/merkl-pTMX-campaign-20250610.json new file mode 100644 index 0000000..cadf35c --- /dev/null +++ b/script/deploy/deploydata/merkl-pTMX-campaign-20250610.json @@ -0,0 +1,108 @@ +{ + "version": "1.0", + "chainId": "1", + "createdAt": 1749635828, + "meta": { + "name": "Create Merkl Campaign", + "txBuilderVersion": "1.16.3" + }, + "transactions": [ + { + "to": "0x8BB4C975Ff3c250e0ceEA271728547f3802B36Fd", + "value": "0", + "data": null, + "contractMethod": { + "inputs": [], + "name": "acceptConditions", + "payable": false + }, + "contractInputsValues": null + }, + { + "to": "0xf30700f382bCcA697A23F8295D6eCE7B378254D6", + "value": "0", + "data": null, + "contractMethod": { + "inputs": [ + { + "name": "spender", + "type": "address", + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + } + ], + "name": "approve", + "payable": false + }, + "contractInputsValues": { + "amount": "70000000000000000000000", + "spender": "0x8BB4C975Ff3c250e0ceEA271728547f3802B36Fd" + } + }, + { + "to": "0x8BB4C975Ff3c250e0ceEA271728547f3802B36Fd", + "value": "0", + "data": null, + "contractMethod": { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "campaignId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "creator", + "type": "address" + }, + { + "internalType": "address", + "name": "rewardToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "campaignType", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "startTimestamp", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "duration", + "type": "uint32" + }, + { + "internalType": "bytes", + "name": "campaignData", + "type": "bytes" + } + ], + "internalType": "struct CampaignParameters", + "name": "newCampaign", + "type": "tuple" + } + ], + "name": "createCampaign", + "payable": false + }, + "contractInputsValues": { + "newCampaign": "[\"0x0000000000000000000000000000000000000000000000000000000000000000\",\"0x0000000000000000000000000000000000000000\",\"0xf30700f382bCcA697A23F8295D6eCE7B378254D6\",\"70000000000000000000000\",18,1749729600,518400,\"0x000000000000000000000000984408c88a9b042bf3e2ddf921cd1fafb4b735d100000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005868747470733a2f2f6170702e7465726d6d61782e74732e66696e616e63652f6561726e2f3078393834343038633838613962303432626633653264646639323163643166616662346237333564313f636861696e3d6574680000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a6d61784465706f7369740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000a31303030303030303030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\"]" + } + } + ] +} \ No newline at end of file From 53496c4b59815c620e0ac5b4504e4b712ef08515 Mon Sep 17 00:00:00 2001 From: Evan Date: Sat, 21 Jun 2025 07:35:38 +0800 Subject: [PATCH 101/194] clean scripts --- script/AcceptOracles.s.sol | 319 ---- script/CheckGTCollateralUsage.s.sol | 233 --- script/CheckGTPositions.s.sol | 303 ---- script/CheckMarketStatus.s.sol | 559 ------- script/CheckOracles.s.sol | 326 ---- script/E2ETest.s.sol | 368 ----- script/GenerateWallets.s.sol | 26 - script/GrantRoles.s.sol | 142 -- script/SubmitOracles.s.sol | 154 -- script/TVLChecker.s.sol | 780 --------- script/UpdateMarketFee_20250513.s.sol | 184 --- script/UpdateSingleGTCapacity.s.sol | 145 -- script/convertMarketConfigs.ts | 214 --- script/deploy/DeployAccessManager.s.sol | 2 +- script/deploy/DeployCore.s.sol | 38 +- script/deploy/DeployMarket.s.sol | 30 +- script/deploy/DeployMarketViewer.s.sol | 2 +- script/deploy/DeployOracleAggregator.s.sol | 38 +- script/deploy/DeployOrder.s.sol | 32 +- script/deploy/DeployOrderArbSepolia.s.sol | 99 -- script/deploy/DeployPendleSwapV3Adapter.s.sol | 107 -- script/deploy/DeployPreTMX.s.sol | 2 +- script/deploy/DeployPriceFeeds.sol | 4 +- script/deploy/DeployPriceFeedsArb.s.sol | 65 - script/deploy/DeployPriceFeedsArbBackup.s.sol | 57 - script/deploy/DeployPriceFeedsEth.s.sol | 168 -- script/deploy/DeployPriceFeedsEthBackup.s.sol | 152 -- .../deploy/DeployPriceFeedsEthInWstETH.s.sol | 33 - script/deploy/DeployPriceFeedsEthLevel.s.sol | 63 - .../deploy/DeployPriceFeedsEth_20250508.s.sol | 99 -- .../DeployPriceFeedsEth_20250508_Backup.s.sol | 61 - .../deploy/DeployPriceFeedsEth_20250513.s.sol | 63 - .../deploy/DeployPriceFeedsEth_20250522.s.sol | 141 -- script/deploy/DeployPriceFeedsMorpho.s.sol | 73 - script/deploy/DeployVault.s.sol | 38 +- script/deploy/DeployVaultFactory.s.sol | 38 +- script/order-history-tracker.ts | 1424 ----------------- script/transformAbi.ts | 48 - 38 files changed, 112 insertions(+), 6518 deletions(-) delete mode 100644 script/AcceptOracles.s.sol delete mode 100644 script/CheckGTCollateralUsage.s.sol delete mode 100644 script/CheckGTPositions.s.sol delete mode 100644 script/CheckMarketStatus.s.sol delete mode 100644 script/CheckOracles.s.sol delete mode 100644 script/E2ETest.s.sol delete mode 100644 script/GenerateWallets.s.sol delete mode 100644 script/GrantRoles.s.sol delete mode 100644 script/SubmitOracles.s.sol delete mode 100644 script/TVLChecker.s.sol delete mode 100644 script/UpdateMarketFee_20250513.s.sol delete mode 100644 script/UpdateSingleGTCapacity.s.sol delete mode 100644 script/convertMarketConfigs.ts delete mode 100644 script/deploy/DeployOrderArbSepolia.s.sol delete mode 100644 script/deploy/DeployPendleSwapV3Adapter.s.sol delete mode 100644 script/deploy/DeployPriceFeedsArb.s.sol delete mode 100644 script/deploy/DeployPriceFeedsArbBackup.s.sol delete mode 100644 script/deploy/DeployPriceFeedsEth.s.sol delete mode 100644 script/deploy/DeployPriceFeedsEthBackup.s.sol delete mode 100644 script/deploy/DeployPriceFeedsEthInWstETH.s.sol delete mode 100644 script/deploy/DeployPriceFeedsEthLevel.s.sol delete mode 100644 script/deploy/DeployPriceFeedsEth_20250508.s.sol delete mode 100644 script/deploy/DeployPriceFeedsEth_20250508_Backup.s.sol delete mode 100644 script/deploy/DeployPriceFeedsEth_20250513.s.sol delete mode 100644 script/deploy/DeployPriceFeedsEth_20250522.s.sol delete mode 100644 script/deploy/DeployPriceFeedsMorpho.s.sol delete mode 100644 script/order-history-tracker.ts delete mode 100644 script/transformAbi.ts diff --git a/script/AcceptOracles.s.sol b/script/AcceptOracles.s.sol deleted file mode 100644 index d79287e..0000000 --- a/script/AcceptOracles.s.sol +++ /dev/null @@ -1,319 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {console} from "forge-std/console.sol"; -import {IOracle} from "contracts/oracle/IOracle.sol"; -import {OracleAggregator} from "contracts/oracle/OracleAggregator.sol"; -import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; -import {JsonLoader} from "./utils/JsonLoader.sol"; -import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; -import {StringHelper} from "./utils/StringHelper.sol"; -import {AccessManager} from "contracts/access/AccessManager.sol"; -import {ScriptBase} from "./utils/ScriptBase.sol"; - -contract AcceptOracles is ScriptBase { - // Network-specific config loaded from environment variables - string network; - uint256 deployerPrivateKey; - address oracleAggregatorAddr; - address accessManagerAddr; - JsonLoader.Config[] configs; - mapping(address => bool) tokenChecked; - - // Track status of each oracle - struct PendingOracleStatus { - address tokenAddr; - string tokenSymbol; - address priceFeedAddr; - address backupPriceFeedAddr; - uint32 heartbeat; - uint64 validAt; - bool existsInConfig; - bool pendingOracleExists; - bool readyToAccept; - string statusMessage; - } - - PendingOracleStatus[] public acceptedOracles; - PendingOracleStatus[] public notReadyOracles; - - function setUp() public { - // Load network from environment variable - network = vm.envString("NETWORK"); - string memory networkUpper = StringHelper.toUpper(network); - // Load network-specific configuration - string memory privateKeyVar = string.concat(networkUpper, "_DEPLOYER_PRIVATE_KEY"); - deployerPrivateKey = vm.envUint(privateKeyVar); - - string memory accessManagerPath = - string.concat(vm.projectRoot(), "/deployments/", network, "/", network, "-access-manager.json"); - string memory json = vm.readFile(accessManagerPath); - accessManagerAddr = vm.parseJsonAddress(json, ".contracts.accessManager"); - - string memory corePath = string.concat(vm.projectRoot(), "/deployments/", network, "/", network, "-core.json"); - json = vm.readFile(corePath); - - oracleAggregatorAddr = vm.parseJsonAddress(json, ".contracts.oracleAggregator"); - } - - function run() public { - string memory deployDataPath = string.concat(vm.projectRoot(), "/script/deploy/deploydata/", network, ".json"); - - string memory deployData = vm.readFile(deployDataPath); - - configs = JsonLoader.getConfigsFromJson(deployData); - - AccessManager accessManager = AccessManager(accessManagerAddr); - OracleAggregator oracle = OracleAggregator(oracleAggregatorAddr); - - console.log("=== Checking Pending Oracles ==="); - console.log("Oracle Aggregator Address:", oracleAggregatorAddr); - console.log("Network:", network); - console.log("Current Block Timestamp:", block.timestamp); - console.log(""); - - // First, check all oracles for their status - checkAllOracleStatus(oracle); - - // Only broadcast if there are oracles to accept - if (acceptedOracles.length > 0) { - vm.startBroadcast(deployerPrivateKey); - - // Process acceptances - for (uint256 i = 0; i < acceptedOracles.length; i++) { - PendingOracleStatus memory status = acceptedOracles[i]; - - // Get current oracle config before accepting - (AggregatorV3Interface currentAggregator,,,,) = oracle.oracles(status.tokenAddr); - - // Accept the oracle - accessManager.acceptPendingOracle(oracle, status.tokenAddr); - - console.log("Accepted oracle for token:"); - console.log(" Token Symbol:", status.tokenSymbol); - console.log(" Token Address:", status.tokenAddr); - console.log(" Previous Oracle:", address(currentAggregator)); - console.log(" New Oracle:", status.priceFeedAddr); - console.log(" Heartbeat:", status.heartbeat); - console.log("--------------------------------"); - } - - vm.stopBroadcast(); - } - - // Print summary - console.log(""); - console.log("=== Oracle Acceptance Summary ==="); - console.log("Total tokens checked:", acceptedOracles.length + notReadyOracles.length); - console.log("Oracles accepted:", acceptedOracles.length); - console.log("Oracles not ready:", notReadyOracles.length); - - if (notReadyOracles.length > 0) { - console.log(""); - console.log("=== Oracles Not Ready for Acceptance ==="); - for (uint256 i = 0; i < notReadyOracles.length; i++) { - PendingOracleStatus memory status = notReadyOracles[i]; - console.log("%d. %s (%s)", i + 1, status.tokenSymbol, status.tokenAddr); - console.log(" Price Feed:", status.priceFeedAddr); - console.log(" Backup Price Feed:", status.backupPriceFeedAddr); - console.log(" Heartbeat:", status.heartbeat); - console.log(" Status:", status.statusMessage); - - if (status.pendingOracleExists && status.validAt > 0) { - uint256 timeRemaining = status.validAt > block.timestamp ? status.validAt - block.timestamp : 0; - console.log(" Valid At:", status.validAt); - console.log(" Time Remaining:", formatTimeDifference(timeRemaining)); - console.log(" Will be ready at:", formatTimestamp(status.validAt)); - } - console.log(" ---"); - } - } - - // Generate execution results JSON - uint256 currentBlock = block.number; - uint256 currentTimestamp = block.timestamp; - - string memory baseJson = createBaseExecutionJson(network, "AcceptOracles", currentBlock, currentTimestamp); - - // Add script-specific data - string memory executionJson = string( - abi.encodePacked( - baseJson, - ",\n", - ' "results": {\n', - ' "totalTokensChecked": "', - vm.toString(acceptedOracles.length + notReadyOracles.length), - '",\n', - ' "oraclesAccepted": "', - vm.toString(acceptedOracles.length), - '",\n', - ' "oraclesNotReady": "', - vm.toString(notReadyOracles.length), - '",\n', - ' "oracleAggregatorAddress": "', - vm.toString(oracleAggregatorAddr), - '",\n', - ' "accessManagerAddress": "', - vm.toString(accessManagerAddr), - '"\n', - " }\n", - "}" - ) - ); - - writeScriptExecutionResults(network, "AcceptOracles", executionJson); - } - - function formatTimestamp(uint256 timestamp) internal pure returns (string memory) { - return vm.toString(timestamp); - } - - function formatTimeDifference(uint256 timeDiff) internal pure returns (string memory) { - if (timeDiff < 60) { - return string(abi.encodePacked(vm.toString(timeDiff), " seconds")); - } else if (timeDiff < 3600) { - return string(abi.encodePacked(vm.toString(timeDiff / 60), " minutes")); - } else if (timeDiff < 86400) { - return string(abi.encodePacked(vm.toString(timeDiff / 3600), " hours")); - } else { - return string(abi.encodePacked(vm.toString(timeDiff / 86400), " days")); - } - } - - function checkAllOracleStatus(OracleAggregator oracle) internal { - // Process all tokens from the config - for (uint256 i; i < configs.length; i++) { - JsonLoader.Config memory config = configs[i]; - - // Check underlying token - if (!tokenChecked[config.underlyingConfig.tokenAddr]) { - checkAndReportOracleStatus( - oracle, - config.underlyingConfig.tokenAddr, - config.underlyingConfig.priceFeedAddr, - config.underlyingConfig.backupPriceFeedAddr, - uint32(config.underlyingConfig.heartBeat), - "underlying" - ); - tokenChecked[config.underlyingConfig.tokenAddr] = true; - } - - // Check collateral token - if (!tokenChecked[config.collateralConfig.tokenAddr]) { - checkAndReportOracleStatus( - oracle, - config.collateralConfig.tokenAddr, - config.collateralConfig.priceFeedAddr, - config.collateralConfig.backupPriceFeedAddr, - uint32(config.collateralConfig.heartBeat), - "collateral" - ); - tokenChecked[config.collateralConfig.tokenAddr] = true; - } - } - } - - function checkAndReportOracleStatus( - OracleAggregator oracle, - address tokenAddr, - address expectedPriceFeedAddr, - address expectedBackupPriceFeedAddr, - uint32 expectedHeartbeat, - string memory tokenType - ) internal { - // Create a new status entry - PendingOracleStatus memory status; - status.tokenAddr = tokenAddr; - status.priceFeedAddr = expectedPriceFeedAddr; - status.backupPriceFeedAddr = expectedBackupPriceFeedAddr; - status.heartbeat = expectedHeartbeat; - status.existsInConfig = true; - - // Get token symbol - try IERC20Metadata(tokenAddr).symbol() returns (string memory symbol) { - status.tokenSymbol = symbol; - } catch { - status.tokenSymbol = string(abi.encodePacked("Unknown ", tokenType)); - } - - // Check if there's a pending oracle - (IOracle.Oracle memory pendingOracle, uint64 validAt) = oracle.pendingOracles(tokenAddr); - - // Get current oracle for comparison - ( - AggregatorV3Interface currentAggregator, - AggregatorV3Interface currentBackupAggregator, - int256 currentMaxPrice, - uint32 currentHeartbeat, - uint32 currentBackupHeartbeat - ) = oracle.oracles(tokenAddr); - - if ( - address(currentAggregator) == expectedPriceFeedAddr - && address(currentBackupAggregator) == expectedBackupPriceFeedAddr && currentHeartbeat == expectedHeartbeat - ) { - status.readyToAccept = false; - status.statusMessage = "Oracle is already configured with the correct values"; - notReadyOracles.push(status); - return; - } else if ( - address(pendingOracle.aggregator) == address(0) && address(pendingOracle.backupAggregator) == address(0) - && pendingOracle.heartbeat == 0 - ) { - // No pending oracle exists - status.pendingOracleExists = false; - status.readyToAccept = false; - status.statusMessage = "No pending oracle exists"; - notReadyOracles.push(status); - } else { - // A pending oracle exists - status.pendingOracleExists = true; - status.validAt = validAt; - - // Check if it matches our expected price feed and is valid - if ( - address(pendingOracle.aggregator) != expectedPriceFeedAddr - || address(pendingOracle.backupAggregator) != expectedBackupPriceFeedAddr - || pendingOracle.heartbeat != expectedHeartbeat - ) { - status.readyToAccept = false; - status.statusMessage = string( - abi.encodePacked( - "Pending oracle doesn't match expected price feed. Found: ", - vm.toString(address(pendingOracle.aggregator)), - " Expected: ", - vm.toString(expectedPriceFeedAddr), - " Backup: ", - vm.toString(address(pendingOracle.backupAggregator)), - " Expected: ", - vm.toString(expectedBackupPriceFeedAddr), - " Heartbeat: ", - vm.toString(pendingOracle.heartbeat), - " Expected: ", - vm.toString(expectedHeartbeat) - ) - ); - notReadyOracles.push(status); - } else if (validAt > block.timestamp) { - // Timelock not yet elapsed - status.readyToAccept = false; - status.statusMessage = "Timelock period not yet elapsed"; - notReadyOracles.push(status); - } else { - // Oracle is ready to accept - this handles the case where the price feed address is different - status.readyToAccept = true; - - // Add more detail to acceptance information - if (address(currentAggregator) != expectedPriceFeedAddr) { - status.statusMessage = "Price feed address will be updated"; - } else { - // This branch should only be reached if there's some other condition - status.statusMessage = "Oracle will be updated (other changes)"; - } - acceptedOracles.push(status); - // Return here to avoid double-processing the same token - return; - } - } - } -} diff --git a/script/CheckGTCollateralUsage.s.sol b/script/CheckGTCollateralUsage.s.sol deleted file mode 100644 index 65589ac..0000000 --- a/script/CheckGTCollateralUsage.s.sol +++ /dev/null @@ -1,233 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {Script} from "forge-std/Script.sol"; -import {console2} from "forge-std/console2.sol"; -import {stdJson} from "forge-std/StdJson.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; -import {Vm} from "forge-std/Vm.sol"; - -interface IGearingToken { - function collateralCapacity() external view returns (uint256); - function getGtConfig() external view returns (GtConfig memory); -} - -struct GtConfig { - address treasurer; - address market; - IERC20 debtToken; - address collateral; - address ft; - uint256 maturity; - LoanConfig loanConfig; -} - -struct LoanConfig { - address oracle; - uint128 maxLtv; - uint128 liquidationLtv; - bool liquidatable; -} - -/** - * @title CheckGTCollateralUsage - * @notice Script to extract gtAddr from each market and check the collateral capacity usage - * @dev Run with: forge script script/CheckGTCollateralUsage.s.sol --rpc-url - */ -contract CheckGTCollateralUsage is Script { - using stdJson for string; - - struct MarketInfo { - string symbol; - address gt; - address collateral; - uint256 collateralCapacity; - uint256 collateralBalance; - uint256 usagePercentage; - uint8 collateralDecimals; - string collateralSymbol; - } - - MarketInfo[] public markets; - // Only show markets with usage > this percentage - uint256 constant USAGE_THRESHOLD = 20; - - function setUp() public { - // Nothing to set up - } - - function run() public { - console2.log("=== Checking GT Collateral Usage ==="); - - // 1. Load market information from market_list.json - string memory json = vm.readFile("script/deploy/deploydata/market_list.json"); - - // Extract the number of markets - bytes memory marketCountData = vm.parseJson(json, ".data"); - uint256 marketCount = abi.decode(marketCountData, (uint256[])).length; - - console2.log(string.concat("Total Markets Found: ", vm.toString(marketCount))); - - // 2. Process each market - for (uint256 i = 0; i < marketCount; i++) { - string memory marketPath = string.concat(".data[", vm.toString(i), "]"); - - // Extract market details - string memory symbol = vm.parseJsonString(json, string.concat(marketPath, ".symbol")); - address gtAddr = vm.parseJsonAddress(json, string.concat(marketPath, ".contracts.gtAddr")); - address collateralAddr = vm.parseJsonAddress(json, string.concat(marketPath, ".contracts.collateralAddr")); - - // Skip if GT address is zero (should not happen, but just in case) - if (gtAddr == address(0)) { - console2.log(string.concat("Market ", symbol, " has zero GT address, skipping...")); - continue; - } - - // Get collateral capacity from GT contract - IGearingToken gt = IGearingToken(gtAddr); - uint256 collateralCapacity; - try gt.collateralCapacity() returns (uint256 capacity) { - collateralCapacity = capacity; - } catch { - console2.log(string.concat("Error getting collateral capacity for ", symbol, ", skipping...")); - continue; - } - - // Get collateral token details - IERC20Metadata collateralToken = IERC20Metadata(collateralAddr); - uint8 collateralDecimals; - string memory collateralSymbol; - - try collateralToken.decimals() returns (uint8 decimals) { - collateralDecimals = decimals; - } catch { - collateralDecimals = 18; // Default to 18 if call fails - } - - try collateralToken.symbol() returns (string memory symbol_) { - collateralSymbol = symbol_; - } catch { - collateralSymbol = "???"; // Default if call fails - } - - // Get current collateral balance - uint256 collateralBalance = collateralToken.balanceOf(gtAddr); - - // Calculate usage percentage (with 2 decimal precision - multiply by 10000 and divide by 100) - uint256 usagePercentage = - collateralCapacity > 0 ? (collateralBalance * 10000) / collateralCapacity / 100 : 0; - - // Add to markets array - markets.push( - MarketInfo({ - symbol: symbol, - gt: gtAddr, - collateral: collateralAddr, - collateralCapacity: collateralCapacity, - collateralBalance: collateralBalance, - usagePercentage: usagePercentage, - collateralDecimals: collateralDecimals, - collateralSymbol: collateralSymbol - }) - ); - } - - // 3. Count markets with high usage (> USAGE_THRESHOLD%) - uint256 highUsageCount = 0; - for (uint256 i = 0; i < markets.length; i++) { - if (markets[i].usagePercentage > USAGE_THRESHOLD) { - highUsageCount++; - } - } - - // 4. Output results in a table format - console2.log("\n=== GT Collateral Usage Report (Usage > 20%) ==="); - - if (highUsageCount == 0) { - console2.log("No markets found with collateral usage greater than 20%"); - } else { - console2.log(string.concat("Found ", vm.toString(highUsageCount), " markets with usage > 20%")); - console2.log("Market | Collateral | Capacity | Balance | Usage (%)"); - console2.log("-------|------------|----------|---------|----------"); - - for (uint256 i = 0; i < markets.length; i++) { - MarketInfo memory market = markets[i]; - - // Skip markets with low usage - if (market.usagePercentage <= USAGE_THRESHOLD) { - continue; - } - - // Format capacity and balance with proper decimals for readability - string memory formattedCapacity = _formatAmount(market.collateralCapacity, market.collateralDecimals); - string memory formattedBalance = _formatAmount(market.collateralBalance, market.collateralDecimals); - - string memory logLine = string.concat( - market.symbol, - " | ", - market.collateralSymbol, - " | ", - formattedCapacity, - " | ", - formattedBalance, - " | ", - vm.toString(market.usagePercentage), - "%" - ); - - console2.log(logLine); - } - } - } - - // Helper function to format token amounts with proper decimals - function _formatAmount(uint256 amount, uint8 decimals) internal view returns (string memory) { - if (amount == 0) return "0"; - - // Convert to string - string memory amountStr = vm.toString(amount); - bytes memory amountBytes = bytes(amountStr); - - // Simple approach to avoid array out-of-bounds errors - if (decimals == 0) { - // No decimal point needed - return amountStr; - } else if (amountBytes.length <= decimals) { - // Number is less than 1 (e.g., 0.0123) - // Start with "0." - string memory result = "0."; - - // Add leading zeros - for (uint256 i = 0; i < decimals - amountBytes.length; i++) { - result = string.concat(result, "0"); - } - - // Add the significant digits - result = string.concat(result, amountStr); - return result; - } else { - // Number is >= 1 (e.g., 123.456) - uint256 intPartLength = amountBytes.length - decimals; - - // Extract integer part - bytes memory intPart = new bytes(intPartLength); - for (uint256 i = 0; i < intPartLength; i++) { - intPart[i] = amountBytes[i]; - } - - // Extract decimal part - bytes memory decPart = new bytes(decimals); - for (uint256 i = 0; i < decimals; i++) { - if (intPartLength + i < amountBytes.length) { - decPart[i] = amountBytes[intPartLength + i]; - } else { - decPart[i] = "0"; - } - } - - // Combine with decimal point - return string.concat(string(intPart), ".", string(decPart)); - } - } -} diff --git a/script/CheckGTPositions.s.sol b/script/CheckGTPositions.s.sol deleted file mode 100644 index 524cd21..0000000 --- a/script/CheckGTPositions.s.sol +++ /dev/null @@ -1,303 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {IERC721Enumerable} from "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol"; -import {ERC721Holder} from "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol"; -import {Vm} from "forge-std/Vm.sol"; -import {IGearingToken} from "../contracts/tokens/IGearingToken.sol"; - -interface IGT is IERC721Enumerable { - function tokenURI(uint256 tokenId) external view returns (string memory); - function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); - function getLockupInfo(uint256 tokenId) external view returns (address, uint256, uint256); - function getActiveAmount(uint256 tokenId) external view returns (uint256); - function getBalanceLocked(uint256 tokenId) external view returns (uint256); -} - -/** - * @title CheckGTPositions - * @notice Script to extract all addresses from market config files and list active GT positions - * @dev Run with: forge script script/CheckGTPositions.s.sol --rpc-url - */ -contract CheckGTPositions is Script, ERC721Holder { - struct MarketInfo { - string name; - address market; - address ft; - address xt; - address gt; - address underlying; - string underlyingSymbol; - address collateral; - string collateralSymbol; - } - - struct GTPosition { - uint256 tokenId; - uint256 activeAmount; - uint256 lockedAmount; - address owner; - uint256 lockupStart; - uint256 lockupEnd; - } - - MarketInfo[] public markets; - string constant DEPLOYMENT_DIR = "eth-mainnet-v1.0.8-20250404-2000"; - - function setUp() public { - // Nothing to set up - } - - function run() public { - console.log("=== Extracting Market Addresses and GT Positions ==="); - - // 1. Load all market configurations - string memory deploymentPath = string.concat(vm.projectRoot(), "/deployments/", DEPLOYMENT_DIR, "/"); - - // Read directory contents - string[] memory files = getFilesInDirectory(deploymentPath); - - // Filter for market files - for (uint256 i = 0; i < files.length; i++) { - string memory file = files[i]; - - // Only process market files - if (contains(file, "market-") && contains(file, ".json")) { - processMarketFile(string.concat(deploymentPath, file)); - } - } - - // 2. Print summary of all markets - console.log("\n=== Market Addresses Summary ==="); - console.log("Total Markets Found: %d", markets.length); - - for (uint256 i = 0; i < markets.length; i++) { - MarketInfo memory market = markets[i]; - console.log("\nMarket %d: %s", i + 1, market.name); - console.log("Market Address: %s", market.market); - console.log("Underlying: %s (%s)", market.underlyingSymbol, market.underlying); - console.log("Collateral: %s (%s)", market.collateralSymbol, market.collateral); - console.log("GT Address: %s", market.gt); - console.log("FT Address: %s", market.ft); - console.log("XT Address: %s", market.xt); - } - - // 3. Check active GT positions for each market - console.log("\n=== Active GT Positions ==="); - - for (uint256 i = 0; i < markets.length; i++) { - MarketInfo memory market = markets[i]; - console.log("\n--- Market: %s ---", market.name); - - IGearingToken gt = IGearingToken(market.gt); - uint256 totalSupply = gt.totalSupply(); - - // Skip if no GTs minted - if (totalSupply == 0) { - console.log("No GT tokens minted for this market"); - continue; - } - - console.log("Total GT Tokens: %d", totalSupply); - uint256 activePositions = 0; - - for (uint256 tokenId = 1; tokenId <= totalSupply; tokenId++) { - // This token exists, check if it's active - activePositions++; - - (address owner, uint128 debtAmt, bytes memory collateralData) = gt.loanInfo(tokenId); - uint256 collateralAmt = abi.decode(collateralData, (uint256)); - - // Print position details - console.log("GT #%d - Owner: %s", tokenId, owner); - console.log(" Debt Amount: %d", debtAmt); - console.log(" Collateral Amount: %d", collateralAmt); - } - - if (activePositions == 0) { - console.log("No active GT positions found"); - } else { - console.log("Total Active GT Positions: %d", activePositions); - } - } - } - - // Helper function to get files in a directory without using vm.readDir directly - function getFilesInDirectory(string memory path) internal returns (string[] memory) { - // Get a list of all files in the directory using shell command - string[] memory inputs = new string[](3); - inputs[0] = "ls"; - inputs[1] = "-1"; // One file per line - inputs[2] = path; - - bytes memory res = vm.ffi(inputs); - string memory result = string(res); - - // Split the result by newlines to get individual files - return split(result, "\n"); - } - - // Helper function to split a string by delimiter - function split(string memory _base, string memory _delimiter) internal pure returns (string[] memory) { - bytes memory baseBytes = bytes(_base); - - // Count the number of delimiters to determine array size - uint256 count = 1; - for (uint256 i = 0; i < baseBytes.length; i++) { - bytes memory delimiter = bytes(_delimiter); - bool found = true; - - if (i + delimiter.length > baseBytes.length) { - found = false; - } else { - for (uint256 j = 0; j < delimiter.length; j++) { - if (baseBytes[i + j] != delimiter[j]) { - found = false; - break; - } - } - } - - if (found) { - count++; - i += delimiter.length - 1; - } - } - - // Create the array and split the string - string[] memory parts = new string[](count); - uint256 partIndex = 0; - uint256 startIndex = 0; - - for (uint256 i = 0; i <= baseBytes.length; i++) { - if ( - i == baseBytes.length - || (i + bytes(_delimiter).length <= baseBytes.length && isMatch(baseBytes, i, bytes(_delimiter))) - ) { - // Extract the part - bytes memory part = new bytes(i - startIndex); - for (uint256 j = 0; j < part.length; j++) { - part[j] = baseBytes[startIndex + j]; - } - - parts[partIndex] = string(part); - partIndex++; - - if (i < baseBytes.length) { - i += bytes(_delimiter).length - 1; - startIndex = i + 1; - } - } - } - - return parts; - } - - // Helper function to check if there's a delimiter match at position - function isMatch(bytes memory _base, uint256 _position, bytes memory _match) internal pure returns (bool) { - if (_position + _match.length > _base.length) { - return false; - } - - for (uint256 i = 0; i < _match.length; i++) { - if (_base[_position + i] != _match[i]) { - return false; - } - } - - return true; - } - - function processMarketFile(string memory filePath) internal { - string memory json = vm.readFile(filePath); - - // Extract market name from file path - string memory fileName = extractFileName(filePath); - - // Extract addresses - address marketAddr = vm.parseJsonAddress(json, ".market"); - address underlying = vm.parseJsonAddress(json, ".underlying.address"); - string memory underlyingSymbol = vm.parseJsonString(json, ".underlying.symbol"); - address collateral = vm.parseJsonAddress(json, ".collateral.address"); - string memory collateralSymbol = vm.parseJsonString(json, ".collateral.symbol"); - address ftAddr = vm.parseJsonAddress(json, ".tokens.ft"); - address xtAddr = vm.parseJsonAddress(json, ".tokens.xt"); - address gtAddr = vm.parseJsonAddress(json, ".tokens.gt"); - - // Add to markets array - markets.push( - MarketInfo({ - name: fileName, - market: marketAddr, - ft: ftAddr, - xt: xtAddr, - gt: gtAddr, - underlying: underlying, - underlyingSymbol: underlyingSymbol, - collateral: collateral, - collateralSymbol: collateralSymbol - }) - ); - } - - // Helper function to check if a string contains a substring - function contains(string memory str, string memory substr) internal pure returns (bool) { - bytes memory strBytes = bytes(str); - bytes memory substrBytes = bytes(substr); - - if (substrBytes.length > strBytes.length) { - return false; - } - - for (uint256 i = 0; i <= strBytes.length - substrBytes.length; i++) { - bool found = true; - - for (uint256 j = 0; j < substrBytes.length; j++) { - if (strBytes[i + j] != substrBytes[j]) { - found = false; - break; - } - } - - if (found) { - return true; - } - } - - return false; - } - - // Helper function to extract file name from path - function extractFileName(string memory filePath) internal pure returns (string memory) { - bytes memory pathBytes = bytes(filePath); - uint256 lastSlash = 0; - - // Find the last slash in the path - for (uint256 i = 0; i < pathBytes.length; i++) { - if (pathBytes[i] == bytes1("/")) { - lastSlash = i; - } - } - - // Create the substring from after the last slash - bytes memory result = new bytes(pathBytes.length - lastSlash - 1); - for (uint256 i = 0; i < result.length; i++) { - result[i] = pathBytes[lastSlash + 1 + i]; - } - - return string(result); - } - - // Helper function to format unix timestamp - function formatTimestamp(uint256 timestamp) internal pure returns (string memory) { - if (timestamp == 0) { - return "N/A"; - } - - // Convert timestamp to a human-readable date - simplified version - return vm.toString(timestamp); - } -} diff --git a/script/CheckMarketStatus.s.sol b/script/CheckMarketStatus.s.sol deleted file mode 100644 index 033dd67..0000000 --- a/script/CheckMarketStatus.s.sol +++ /dev/null @@ -1,559 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {Script} from "forge-std/Script.sol"; -import {console2} from "forge-std/console2.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; -import {ITermMaxMarket} from "contracts/ITermMaxMarket.sol"; -import {IGearingToken} from "contracts/tokens/IGearingToken.sol"; -import {IMintableERC20} from "contracts/tokens/IMintableERC20.sol"; -/** - * @title CheckMarketStatus - * @dev Script to check status of markets and GTs - */ - -contract CheckMarketStatus is Script { - struct MarketInfo { - string fileName; - address market; - address underlying; - address collateral; - address ft; - address xt; - address gt; - string underlyingSymbol; - string collateralSymbol; - uint8 underlyingDecimals; - uint8 collateralDecimals; - uint256 underlyingBalance; // Underlying balance in market - uint256 collateralBalance; // Collateral balance in GT - uint256 ftTotalSupply; // Total supply of FT - uint256 treasurerUnderlyingBalance; // Treasurer's underlying balance - uint256 treasurerFtBalance; // Treasurer's FT balance - uint256 ftInMarketBalance; // FT balance in the market - } - - function run() public { - // Directory to look for deployment files - string memory deploymentDir = "deployments/eth-mainnet-v1.0.8-20250410-2000"; - - // Set treasurer address - address treasurer = 0x719e77027952929ed3060dbFFC5D43EC50c1cf79; - - // First, count the market files to determine array size - uint256 marketCount = countMarketFiles(deploymentDir); - MarketInfo[] memory markets = new MarketInfo[](marketCount); - uint256 marketIndex = 0; - - console2.log("====== Checking Balances for ETH Mainnet Markets ======"); - console2.log(string.concat("Directory: ", deploymentDir)); - console2.log(string.concat("Found ", vm.toString(marketCount), " market files")); - console2.log(string.concat("Treasurer: ", formatAddress(treasurer))); - console2.log("====================================================="); - - // Process market files - processMarketFiles(deploymentDir, markets, false, treasurer); - - // Display results - console2.log("\n====== MARKET BALANCES SUMMARY ======"); - - for (uint256 i = 0; i < marketCount; i++) { - MarketInfo memory info = markets[i]; - - // Extract market name from file path - string memory marketName = extractMarketName(info.fileName); - - // Format underlying balance with proper decimals - string memory formattedUnderlyingBalance = - formatTokenAmount(info.underlyingBalance, info.underlyingDecimals); - - // Format collateral balance with proper decimals - string memory formattedCollateralBalance = - formatTokenAmount(info.collateralBalance, info.collateralDecimals); - - // Format FT total supply - string memory formattedFtSupply = formatTokenAmount(info.ftTotalSupply, info.underlyingDecimals); - - // Format FT in market balance - string memory formattedFtInMarket = formatTokenAmount(info.ftInMarketBalance, info.underlyingDecimals); - - // Format treasurer balances - string memory formattedTreasurerUnderlyingBalance = - formatTokenAmount(info.treasurerUnderlyingBalance, info.underlyingDecimals); - string memory formattedTreasurerFtBalance = - formatTokenAmount(info.treasurerFtBalance, info.underlyingDecimals); - - // Display results in the requested format - console2.log("---------------------------------------------------------------"); - console2.log(string.concat("Market: ", marketName)); - console2.log(string.concat("Market address: ", formatAddress(info.market))); - console2.log( - string.concat("Underlying in market: ", formattedUnderlyingBalance, " ", info.underlyingSymbol) - ); - console2.log(string.concat("Collateral in GT: ", formattedCollateralBalance, " ", info.collateralSymbol)); - console2.log(string.concat("FT total supply: ", formattedFtSupply, " ", info.underlyingSymbol)); - console2.log(string.concat("FT in market: ", formattedFtInMarket, " ", info.underlyingSymbol)); - console2.log( - string.concat( - "Underlying of treasurer: ", formattedTreasurerUnderlyingBalance, " ", info.underlyingSymbol - ) - ); - console2.log(string.concat("FT of treasurer: ", formattedTreasurerFtBalance, " ", info.underlyingSymbol)); - - // Check if (FT total supply - FT in market) equals underlying in market - if (info.ftTotalSupply > 0) { - uint256 circulatingFT = - info.ftTotalSupply > info.ftInMarketBalance ? info.ftTotalSupply - info.ftInMarketBalance : 0; - - bool invariantPassed = circulatingFT == info.underlyingBalance; - if (invariantPassed) { - console2.log("INVARIANT CHECK PASSED: (FT total supply - FT in market) equals underlying in market"); - } else { - console2.log( - "INVARIANT CHECK FAILED: (FT total supply - FT in market) does NOT equal underlying in market" - ); - console2.log( - string.concat( - " Expected: ", - formatTokenAmount(info.underlyingBalance, info.underlyingDecimals), - " ", - info.underlyingSymbol - ) - ); - console2.log( - string.concat( - " Actual: ", - formatTokenAmount(circulatingFT, info.underlyingDecimals), - " ", - info.underlyingSymbol - ) - ); - console2.log( - string.concat( - " Difference: ", - formatTokenAmount( - circulatingFT > info.underlyingBalance - ? circulatingFT - info.underlyingBalance - : info.underlyingBalance - circulatingFT, - info.underlyingDecimals - ), - " ", - info.underlyingSymbol - ) - ); - } - } - - // Check for active GT positions - if (info.gt != address(0)) { - try IGearingToken(info.gt).totalSupply() returns (uint256 totalSupply) { - if (totalSupply > 0) { - console2.log(string.concat("Positions (", vm.toString(totalSupply), " total):")); - - // Check a few positions as example - uint256 positionsToCheck = totalSupply > 5 ? 5 : totalSupply; - for (uint256 j = 1; j <= positionsToCheck; j++) { - try IGearingToken(info.gt).loanInfo(j) returns ( - address owner, uint128 debtAmt, bytes memory collateralData - ) { - // Get collateral amount from collateralData - assuming it's an abi encoded uint256 - uint256 collateralAmt = 0; - if (collateralData.length >= 32) { - collateralAmt = abi.decode(collateralData, (uint256)); - } - - string memory formattedDebt = formatTokenAmount(debtAmt, info.underlyingDecimals); - string memory formattedCollateral = - formatTokenAmount(collateralAmt, info.collateralDecimals); - - // Format position details without formatted string - string memory positionMsg = string.concat( - " Position ", - vm.toString(j), - ": Owner: ", - formatAddress(owner), - ", debt: ", - formattedDebt, - " ", - info.underlyingSymbol, - ", collateral: ", - formattedCollateral, - " ", - info.collateralSymbol - ); - console2.log(positionMsg); - } catch { - console2.log(string.concat(" Error fetching position ", vm.toString(j))); - } - } - } else { - console2.log("No active positions"); - } - } catch { - console2.log(string.concat("Error: Could not fetch GT positions for ", formatAddress(info.gt))); - } - } - } - console2.log("---------------------------------------------------------------"); - } - - // Count how many market files are in the directory - function countMarketFiles(string memory deploymentDir) internal returns (uint256) { - string[] memory inputs = new string[](3); - inputs[0] = "ls"; - inputs[1] = "-1"; // One file per line - inputs[2] = deploymentDir; - - bytes memory result = vm.ffi(inputs); - string memory fileList = string(result); - - string[] memory files = split(fileList, "\n"); - uint256 marketCount = 0; - - for (uint256 i = 0; i < files.length; i++) { - if (contains(files[i], "market-") && contains(files[i], ".json")) { - marketCount++; - } - } - - return marketCount; - } - - // Process market files and extract information - function processMarketFiles( - string memory deploymentDir, - MarketInfo[] memory markets, - bool dryRun, - address treasurer - ) internal { - string[] memory inputs = new string[](3); - inputs[0] = "ls"; - inputs[1] = "-1"; // One file per line - inputs[2] = deploymentDir; - - bytes memory result = vm.ffi(inputs); - string memory fileList = string(result); - - string[] memory files = split(fileList, "\n"); - uint256 marketIndex = 0; - - for (uint256 i = 0; i < files.length; i++) { - if (contains(files[i], "market-") && contains(files[i], ".json")) { - string memory filePath = string.concat(deploymentDir, "/", files[i]); - string memory jsonContent = vm.readFile(filePath); - markets[marketIndex].fileName = files[i]; - - // Extract market address - markets[marketIndex].market = vm.parseJsonAddress(jsonContent, ".market"); - - // Extract underlying and collateral addresses - markets[marketIndex].underlying = vm.parseJsonAddress(jsonContent, ".underlying.address"); - markets[marketIndex].collateral = vm.parseJsonAddress(jsonContent, ".collateral.address"); - - // Get tokens from market - if (!dryRun) { - try ITermMaxMarket(markets[marketIndex].market).tokens() returns ( - IMintableERC20 ft, IMintableERC20 xt, IGearingToken gt, address collateral, IERC20 underlying - ) { - markets[marketIndex].ft = address(ft); - markets[marketIndex].xt = address(xt); - markets[marketIndex].gt = address(gt); - - // Double-check these match the JSON - if (collateral != markets[marketIndex].collateral) { - console2.log(string.concat("Warning: Collateral mismatch in ", files[i])); - console2.log(string.concat(" JSON: ", vm.toString(markets[marketIndex].collateral))); - console2.log(string.concat(" Market: ", vm.toString(collateral))); - } - - if (address(underlying) != markets[marketIndex].underlying) { - console2.log(string.concat("Warning: Underlying mismatch in ", files[i])); - console2.log(string.concat(" JSON: ", vm.toString(markets[marketIndex].underlying))); - console2.log(string.concat(" Market: ", vm.toString(address(underlying)))); - } - } catch (bytes memory err) { - console2.log( - string.concat( - "Error: Could not fetch tokens from market ", - formatAddress(markets[marketIndex].market), - ". Error: ", - err.length > 0 ? vm.toString(err) : "reverted without reason" - ) - ); - } - } else { - // In dry-run mode, create dummy values based on file naming conventions - // Extract token symbols from filename (e.g. eth-mainnet-market-USDC-WBTC@02APR2025.json) - string memory fileNameWithoutPath = files[i]; - // Extract market parts from filename - string[] memory parts = split(fileNameWithoutPath, "-"); - - if (parts.length >= 5) { - // Last part might contain something like "WBTC@02APR2025.json" - string[] memory symbolParts = split(parts[4], "@"); - string[] memory suffixParts = split(symbolParts[0], "."); - - markets[marketIndex].underlyingSymbol = parts[3]; // e.g. USDC - markets[marketIndex].collateralSymbol = suffixParts[0]; // e.g. WBTC - - // Create dummy FT address in dry-run mode - markets[marketIndex].ft = address(uint160(0xFEED0000 + i)); - - // Set default values for dry-run mode - if (bytes(markets[marketIndex].underlyingSymbol).length == 0) { - markets[marketIndex].underlyingSymbol = "UNK"; - } - if (bytes(markets[marketIndex].collateralSymbol).length == 0) { - markets[marketIndex].collateralSymbol = "UNK"; - } - - // Set dummy values for treasurer balances in dry-run mode - markets[marketIndex].treasurerUnderlyingBalance = 1000000 * (i + 1); - markets[marketIndex].treasurerFtBalance = 500000 * (i + 1); - markets[marketIndex].ftInMarketBalance = 200000 * (i + 1); - markets[marketIndex].underlyingDecimals = 6; // USDC is usually 6 - markets[marketIndex].collateralDecimals = 18; // Most tokens are 18 - } - } - - // Get token symbols and decimals - if (!dryRun) { - try IERC20Metadata(markets[marketIndex].underlying).symbol() returns (string memory symbol) { - markets[marketIndex].underlyingSymbol = symbol; - } catch { - markets[marketIndex].underlyingSymbol = "Unknown"; - } - - try IERC20Metadata(markets[marketIndex].collateral).symbol() returns (string memory symbol) { - markets[marketIndex].collateralSymbol = symbol; - } catch { - markets[marketIndex].collateralSymbol = "Unknown"; - } - - try IERC20Metadata(markets[marketIndex].underlying).decimals() returns (uint8 decimals) { - markets[marketIndex].underlyingDecimals = decimals; - } catch { - markets[marketIndex].underlyingDecimals = 18; - } - - try IERC20Metadata(markets[marketIndex].collateral).decimals() returns (uint8 decimals) { - markets[marketIndex].collateralDecimals = decimals; - } catch { - markets[marketIndex].collateralDecimals = 18; - } - } - - // Check balances - if (!dryRun) { - try IERC20(markets[marketIndex].underlying).balanceOf(markets[marketIndex].market) returns ( - uint256 balance - ) { - markets[marketIndex].underlyingBalance = balance; - } catch { - console2.log( - string.concat( - "Error: Could not fetch underlying balance for market ", - formatAddress(markets[marketIndex].market) - ) - ); - } - - try IERC20(markets[marketIndex].collateral).balanceOf(markets[marketIndex].gt) returns ( - uint256 balance - ) { - markets[marketIndex].collateralBalance = balance; - } catch { - console2.log( - string.concat( - "Error: Could not fetch collateral balance for GT ", - formatAddress(markets[marketIndex].gt) - ) - ); - } - - // Check FT total supply - if (markets[marketIndex].ft != address(0)) { - try IERC20(markets[marketIndex].ft).totalSupply() returns (uint256 supply) { - markets[marketIndex].ftTotalSupply = supply; - } catch { - console2.log( - string.concat( - "Error: Could not fetch FT total supply for ", - formatAddress(markets[marketIndex].ft) - ) - ); - } - - // Check FT balance in market - try IERC20(markets[marketIndex].ft).balanceOf(markets[marketIndex].market) returns ( - uint256 balance - ) { - markets[marketIndex].ftInMarketBalance = balance; - } catch { - console2.log( - string.concat( - "Error: Could not fetch FT balance in market ", - formatAddress(markets[marketIndex].market) - ) - ); - } - - // Check treasurer's FT balance - try IERC20(markets[marketIndex].ft).balanceOf(treasurer) returns (uint256 balance) { - markets[marketIndex].treasurerFtBalance = balance; - } catch { - console2.log( - string.concat( - "Error: Could not fetch treasurer's FT balance for ", - formatAddress(markets[marketIndex].ft) - ) - ); - } - } - - // Check treasurer's underlying balance - try IERC20(markets[marketIndex].underlying).balanceOf(treasurer) returns (uint256 balance) { - markets[marketIndex].treasurerUnderlyingBalance = balance; - } catch { - console2.log( - string.concat( - "Error: Could not fetch treasurer's underlying balance for ", - formatAddress(markets[marketIndex].underlying) - ) - ); - } - } - - marketIndex++; - } - } - } - - // Check if a string contains a substring - function contains(string memory source, string memory target) internal pure returns (bool) { - bytes memory sourceBytes = bytes(source); - bytes memory targetBytes = bytes(target); - - if (targetBytes.length > sourceBytes.length) { - return false; - } - - for (uint256 i = 0; i <= sourceBytes.length - targetBytes.length; i++) { - bool found = true; - for (uint256 j = 0; j < targetBytes.length; j++) { - if (sourceBytes[i + j] != targetBytes[j]) { - found = false; - break; - } - } - if (found) { - return true; - } - } - return false; - } - - // Split a string by delimiter - function split(string memory source, string memory delimiter) internal pure returns (string[] memory) { - bytes memory sourceBytes = bytes(source); - bytes memory delimiterBytes = bytes(delimiter); - - // Count occurrences of delimiter - uint256 count = 1; // At least one item - for (uint256 i = 0; i < sourceBytes.length - delimiterBytes.length + 1; i++) { - bool found = true; - for (uint256 j = 0; j < delimiterBytes.length; j++) { - if (sourceBytes[i + j] != delimiterBytes[j]) { - found = false; - break; - } - } - if (found) { - count++; - i += delimiterBytes.length - 1; - } - } - - // Split the string - string[] memory parts = new string[](count); - uint256 partIndex = 0; - uint256 startIndex = 0; - - for (uint256 i = 0; i <= sourceBytes.length - delimiterBytes.length + 1; i++) { - if (i == sourceBytes.length - delimiterBytes.length + 1) { - // Add the last part - parts[partIndex] = substring(source, startIndex, sourceBytes.length); - break; - } - - bool found = true; - for (uint256 j = 0; j < delimiterBytes.length; j++) { - if (i + j >= sourceBytes.length || sourceBytes[i + j] != delimiterBytes[j]) { - found = false; - break; - } - } - - if (found) { - parts[partIndex] = substring(source, startIndex, i); - partIndex++; - startIndex = i + delimiterBytes.length; - i += delimiterBytes.length - 1; - } - } - - return parts; - } - - // Helper function to format token amounts with proper decimals - function formatTokenAmount(uint256 amount, uint8 decimals) internal pure returns (string memory) { - if (amount == 0) return "0"; - - string memory amountStr = vm.toString(amount); - uint256 length = bytes(amountStr).length; - - // Format with proper decimals, showing all digits - if (length <= decimals) { - // Need to pad with leading zeros - string memory zeros = ""; - for (uint256 i = 0; i < decimals - length; i++) { - zeros = string.concat(zeros, "0"); - } - return string.concat("0.", zeros, amountStr); - } else { - // Insert decimal point - uint256 decimalPos = length - decimals; - return string.concat(substring(amountStr, 0, decimalPos), ".", substring(amountStr, decimalPos, length)); - } - } - - // Helper function to format address for display - function formatAddress(address addr) internal pure returns (string memory) { - return vm.toString(addr); - } - - // Helper function to get a substring - function substring(string memory str, uint256 startIndex, uint256 endIndex) internal pure returns (string memory) { - bytes memory strBytes = bytes(str); - bytes memory result = new bytes(endIndex - startIndex); - for (uint256 i = startIndex; i < endIndex; i++) { - result[i - startIndex] = strBytes[i]; - } - return string(result); - } - - // Extract market name from file path - function extractMarketName(string memory fileName) internal pure returns (string memory) { - // Example fileName: eth-mainnet-market-USDC-WBTC@02APR2025.json - // We want to extract: USDC-WBTC@02APR2025 - - string[] memory parts = split(fileName, "market-"); - if (parts.length < 2) return fileName; - - string memory marketPart = parts[1]; - string[] memory jsonParts = split(marketPart, ".json"); - - return jsonParts[0]; - } -} diff --git a/script/CheckOracles.s.sol b/script/CheckOracles.s.sol deleted file mode 100644 index 6cfad42..0000000 --- a/script/CheckOracles.s.sol +++ /dev/null @@ -1,326 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; -import {IOracle} from "contracts/oracle/IOracle.sol"; -import {OracleAggregator} from "contracts/oracle/OracleAggregator.sol"; -import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; -import {JsonLoader} from "./utils/JsonLoader.sol"; -import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; -import {StringHelper} from "./utils/StringHelper.sol"; - -contract CheckOracles is Script { - // Network-specific config - string network; - address oracleAggregatorAddr; - JsonLoader.Config[] configs; - mapping(address => bool) tokenChecked; - - // Struct to store detailed diagnostics about tokens with issues - struct TokenDiagnostics { - address tokenAddr; - address priceFeedAddr; - string symbol; - string errorType; // "NO_ORACLE", "PRICE_FEED_ERROR", "ORACLE_ERROR", "STALE_DATA" - string errorMessage; - bool aggregatorWorks; // Whether the direct price feed works - bool oracleWorks; // Whether the Oracle.getPrice works - uint256 lastUpdateTime; - int256 rawAnswer; // Raw answer from price feed - uint8 priceFeedDecimals; // Decimals of the price feed - uint8 tokenDecimals; // Decimals of the token - } - - TokenDiagnostics[] public diagnostics; - - function setUp() public { - // Default to eth-mainnet or use environment variable if available - network = vm.envOr("NETWORK", string("eth-mainnet")); - - string memory deploymentPath = - string.concat(vm.projectRoot(), "/deployments/", network, "/", network, "-core.json"); - string memory json = vm.readFile(deploymentPath); - - oracleAggregatorAddr = vm.parseJsonAddress(json, ".contracts.oracleAggregator"); - } - - function run() public { - string memory deployDataPath = string.concat(vm.projectRoot(), "/script/deploy/deploydata/", network, ".json"); - string memory deployData = vm.readFile(deployDataPath); - configs = JsonLoader.getConfigsFromJson(deployData); - - console.log("=== Checking Oracle Prices for %s ===", network); - console.log("Oracle Aggregator: %s", oracleAggregatorAddr); - console.log("Number of configs: %d", configs.length); - console.log(""); - - IOracle oracle = IOracle(oracleAggregatorAddr); - OracleAggregator oracleAggregator = OracleAggregator(oracleAggregatorAddr); - - // Track tokens with price issues - uint256 successCount = 0; - address[] memory tokensWithIssues = new address[](configs.length * 2); // Max possible issues - uint256 issueCount = 0; - - for (uint256 i; i < configs.length; i++) { - JsonLoader.Config memory config = configs[i]; - - // Check underlying token - if (!tokenChecked[config.underlyingConfig.tokenAddr]) { - bool success = checkTokenOracle( - oracle, - oracleAggregator, - config.underlyingConfig.tokenAddr, - config.underlyingConfig.priceFeedAddr, - uint32(config.underlyingConfig.heartBeat), - "Underlying" - ); - - if (success) { - successCount++; - } else { - tokensWithIssues[issueCount] = config.underlyingConfig.tokenAddr; - issueCount++; - } - - tokenChecked[config.underlyingConfig.tokenAddr] = true; - } - - // Check collateral token - if (!tokenChecked[config.collateralConfig.tokenAddr]) { - bool success = checkTokenOracle( - oracle, - oracleAggregator, - config.collateralConfig.tokenAddr, - config.collateralConfig.priceFeedAddr, - uint32(config.collateralConfig.heartBeat), - "Collateral" - ); - - if (success) { - successCount++; - } else { - tokensWithIssues[issueCount] = config.collateralConfig.tokenAddr; - issueCount++; - } - - tokenChecked[config.collateralConfig.tokenAddr] = true; - } - } - - // Summary report - console.log(""); - console.log("=== SUMMARY REPORT ==="); - console.log("Total tokens checked: %d", successCount + issueCount); - console.log("Successful: %d", successCount); - console.log("Issues: %d", issueCount); - - // Detailed diagnostics for tokens with issues - if (diagnostics.length > 0) { - console.log(""); - console.log("=== DETAILED DIAGNOSTICS ==="); - for (uint256 i = 0; i < diagnostics.length; i++) { - TokenDiagnostics memory diag = diagnostics[i]; - console.log("%d. %s (%s)", i + 1, diag.symbol, diag.tokenAddr); - console.log(" Price Feed Address: %s", diag.priceFeedAddr); - console.log(" Error Type: %s", diag.errorType); - console.log(" Error Message: %s", diag.errorMessage); - console.log(" Direct Price Feed Working: %s", diag.aggregatorWorks ? "YES" : "NO"); - console.log(" Oracle.getPrice Working: %s", diag.oracleWorks ? "YES" : "NO"); - - if (diag.aggregatorWorks) { - console.log(" Raw Answer: %d", diag.rawAnswer); - console.log(" Price Feed Decimals: %d", diag.priceFeedDecimals); - console.log( - " Last Update Time: %d (%s ago)", - diag.lastUpdateTime, - formatTimeDifference(block.timestamp - diag.lastUpdateTime) - ); - } - - console.log(" Token Decimals: %d", diag.tokenDecimals); - console.log(" ---"); - } - - // Output recommendations based on the diagnostics - console.log(""); - console.log("=== RECOMMENDATIONS ==="); - for (uint256 i = 0; i < diagnostics.length; i++) { - TokenDiagnostics memory diag = diagnostics[i]; - console.log("%d. %s (%s):", i + 1, diag.symbol, diag.tokenAddr); - - if (keccak256(bytes(diag.errorType)) == keccak256(bytes("NO_ORACLE"))) { - console.log(" Run SubmitOracles script to configure the oracle for this token"); - } else if (keccak256(bytes(diag.errorType)) == keccak256(bytes("PRICE_FEED_ERROR"))) { - if (!diag.aggregatorWorks) { - console.log(" Price feed is not accessible. Verify the price feed address is correct"); - console.log(" and that the price feed is correctly deployed on %s", network); - } else { - console.log(" Price feed is accessible but there may be an issue with its integration."); - console.log(" Check that the price feed has the correct interface and decimals"); - } - } else if (keccak256(bytes(diag.errorType)) == keccak256(bytes("ORACLE_ERROR"))) { - console.log(" The OracleAggregator can't retrieve the price. Check if there's a mismatch"); - console.log( - " between the price feed decimals (%d) and what OracleAggregator expects", - diag.priceFeedDecimals - ); - } else if (keccak256(bytes(diag.errorType)) == keccak256(bytes("STALE_DATA"))) { - console.log( - " Price feed data is stale. Last update was %s ago", - formatTimeDifference(block.timestamp - diag.lastUpdateTime) - ); - console.log(" Consider updating the heartbeat setting or using a different price feed"); - } - console.log(" ---"); - } - } - } - - function formatTimeDifference(uint256 timeDiff) internal pure returns (string memory) { - if (timeDiff < 60) { - return string(abi.encodePacked(vm.toString(timeDiff), " seconds")); - } else if (timeDiff < 3600) { - return string(abi.encodePacked(vm.toString(timeDiff / 60), " minutes")); - } else if (timeDiff < 86400) { - return string(abi.encodePacked(vm.toString(timeDiff / 3600), " hours")); - } else { - return string(abi.encodePacked(vm.toString(timeDiff / 86400), " days")); - } - } - - function checkTokenOracle( - IOracle oracle, - OracleAggregator oracleAggregator, - address tokenAddr, - address expectedPriceFeedAddr, - uint32 expectedHeartbeat, - string memory tokenType - ) internal returns (bool success) { - // Create a diagnostic entry in case of error - TokenDiagnostics memory diag; - diag.tokenAddr = tokenAddr; - diag.priceFeedAddr = expectedPriceFeedAddr; - - // Get token symbol and decimals - try IERC20Metadata(tokenAddr).symbol() returns (string memory symbol) { - diag.symbol = symbol; - } catch { - diag.symbol = "Unknown"; - } - - try IERC20Metadata(tokenAddr).decimals() returns (uint8 decimals) { - diag.tokenDecimals = decimals; - } catch { - diag.tokenDecimals = 0; - } - - console.log("--- Checking %s: %s (%s) ---", tokenType, diag.symbol, tokenAddr); - - // Check if the oracle is configured - (AggregatorV3Interface aggregator, AggregatorV3Interface backupAggregator, uint32 heartbeat) = - oracleAggregator.oracles(tokenAddr); - - if (address(aggregator) == address(0)) { - console.log("ERROR: No oracle configured for token"); - diag.errorType = "NO_ORACLE"; - diag.errorMessage = "No oracle configured for this token"; - diagnostics.push(diag); - return false; - } - - // Check if the configured aggregator matches expected - console.log("Price Feed: %s", address(aggregator)); - console.log("Expected: %s", expectedPriceFeedAddr); - if (address(aggregator) != expectedPriceFeedAddr) { - console.log("WARNING: Configured price feed doesn't match expected"); - } - - // Check heartbeat - console.log("Heartbeat: %s", heartbeat); - console.log("Expected: %s", expectedHeartbeat); - if (heartbeat != expectedHeartbeat) { - console.log("WARNING: Configured heartbeat doesn't match expected"); - } - - // First check direct access to the price feed - bool directPriceFeedWorks = false; - int256 rawAnswer = 0; - uint256 updatedAt = 0; - - try AggregatorV3Interface(aggregator).latestRoundData() returns ( - uint80 roundId, int256 answer, uint256 startedAt, uint256 updateTime, uint80 answeredInRound - ) { - console.log("Direct price feed access successful"); - console.log("Round ID: %d", roundId); - console.log("Raw Answer: %d", answer); - - // Get price feed decimals - try AggregatorV3Interface(aggregator).decimals() returns (uint8 priceFeedDecimals) { - console.log("Price Feed Decimals: %d", priceFeedDecimals); - diag.priceFeedDecimals = priceFeedDecimals; - } catch { - console.log("WARNING: Failed to get price feed decimals"); - diag.priceFeedDecimals = 0; - } - - // Calculate time since last update - uint256 timeSinceUpdate = block.timestamp - updateTime; - console.log("Last updated: %d (%s ago)", updateTime, formatTimeDifference(timeSinceUpdate)); - - // Update diagnostics - directPriceFeedWorks = true; - diag.aggregatorWorks = true; - diag.rawAnswer = answer; - diag.lastUpdateTime = updateTime; - - // Check if update is stale (beyond heartbeat) - if (timeSinceUpdate > heartbeat) { - console.log( - "WARNING: Price feed is stale (last updated %s ago, heartbeat is %d seconds)", - formatTimeDifference(timeSinceUpdate), - heartbeat - ); - if (success) { - diag.errorType = "STALE_DATA"; - diag.errorMessage = string( - abi.encodePacked( - "Price feed data is stale (last updated ", formatTimeDifference(timeSinceUpdate), " ago)" - ) - ); - } - } - - rawAnswer = answer; - updatedAt = updateTime; - } catch { - console.log("ERROR: Failed to get latest round data directly from price feed"); - diag.errorType = "PRICE_FEED_ERROR"; - diag.errorMessage = "Failed to access price feed directly"; - diag.aggregatorWorks = false; - diagnostics.push(diag); - success = false; - } - - // Now try to get price through the oracle - if (directPriceFeedWorks) { - try oracle.getPrice(tokenAddr) returns (uint256 price, uint8 decimals) { - console.log("Oracle.getPrice successful"); - console.log("Price: %d (decimals: %d)", price, decimals); - diag.oracleWorks = true; - success = true; - } catch { - console.log("ERROR: Failed to get price from oracle (even though price feed works directly)"); - diag.errorType = "ORACLE_ERROR"; - diag.errorMessage = "Price feed works directly but Oracle.getPrice fails"; - diag.oracleWorks = false; - diagnostics.push(diag); - success = false; - } - } - - console.log("--------------------------------"); - return success; - } -} diff --git a/script/E2ETest.s.sol b/script/E2ETest.s.sol deleted file mode 100644 index 259ccec..0000000 --- a/script/E2ETest.s.sol +++ /dev/null @@ -1,368 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; -import {TermMaxFactory} from "../contracts/factory/TermMaxFactory.sol"; -import {ITermMaxFactory} from "../contracts/factory/ITermMaxFactory.sol"; -import {TermMaxRouter} from "../contracts/router/TermMaxRouter.sol"; -import {ITermMaxRouter} from "../contracts/router/ITermMaxRouter.sol"; -import {TermMaxOrder} from "../contracts/TermMaxOrder.sol"; -import {ITermMaxOrder} from "../contracts/TermMaxOrder.sol"; -import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; -import {TermMaxMarket, Constants} from "../contracts/TermMaxMarket.sol"; -import {ITermMaxMarket} from "../contracts/TermMaxMarket.sol"; -import {MockERC20} from "../contracts/test/MockERC20.sol"; -import {MarketConfig} from "../contracts/storage/TermMaxStorage.sol"; -import {IMintableERC20} from "../contracts/tokens/IMintableERC20.sol"; -import {IGearingToken} from "../contracts/tokens/IGearingToken.sol"; -import {IOracle, OracleAggregator, AggregatorV3Interface} from "contracts/oracle/OracleAggregator.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; -import {MockSwapAdapter} from "../contracts/test/MockSwapAdapter.sol"; -import {Faucet} from "../contracts/test/testnet/Faucet.sol"; -import {FaucetERC20} from "../contracts/test/testnet/FaucetERC20.sol"; -import {MockPriceFeed} from "../contracts/test/MockPriceFeed.sol"; -import {SwapUnit} from "../contracts/router/ISwapAdapter.sol"; -import {MarketConfig} from "../contracts/storage/TermMaxStorage.sol"; -import {StringHelper} from "./utils/StringHelper.sol"; - -contract E2ETest is Script { - // Network-specific config loaded from environment variables - string network; - uint256 deployerPrivateKey; - address deployerAddr; - address userAddr; - uint256 userPrivateKey; - - // address config - address faucetAddr = address(0xb927B74d5D9c3985D4DCdd62CbffEc66CF527fAa); - address routerAddr = address(0x04bab94F939654E3711778c25683bBB34bC1a514); - address swapAdapter = address(0xC622E39c594570c731baCcDc2b6cD062EF941b06); - address marketAddr = address(0x10d9baa4A6475ee2b913755728342c7d40ce0A21); - address orderAddr = address(0x550a95c76A929635E7836cBef401C378485f4422); - - Faucet faucet = Faucet(faucetAddr); - TermMaxRouter router = TermMaxRouter(routerAddr); - TermMaxMarket market = TermMaxMarket(marketAddr); - TermMaxOrder order = TermMaxOrder(orderAddr); - IMintableERC20 ft; - IMintableERC20 xt; - IGearingToken gt; - address collateralAddr; - IERC20 underlyingERC20; - FaucetERC20 collateral; - FaucetERC20 underlying; - address collateralPriceFeedAddr; - address underlyingPriceFeedAddr; - - function setUp() public { - // Load network from environment variable - network = vm.envString("NETWORK"); - string memory networkUpper = StringHelper.toUpper(network); - - // Load network-specific configuration - string memory privateKeyVar = string.concat(networkUpper, "_DEPLOYER_PRIVATE_KEY"); - - deployerPrivateKey = vm.envUint(privateKeyVar); - deployerAddr = vm.addr(deployerPrivateKey); - userAddr = deployerAddr; - userPrivateKey = deployerPrivateKey; - } - - function run() public { - address tokenAddr = address(0xE407D6b58f1BaB00DB15a6b164F6e882aB3bb939); - IOracle oracle = IOracle(address(0xFBc0A46463645de435012363354f24791789b4D7)); - OracleAggregator oracleAggregator = OracleAggregator(address(0xFBc0A46463645de435012363354f24791789b4D7)); - (AggregatorV3Interface aggregator, AggregatorV3Interface backupAggregator, uint32 heartbeat) = - oracleAggregator.oracles(tokenAddr); - console.log(IERC20Metadata(tokenAddr).symbol()); - console.log(address(aggregator)); - console.log(heartbeat); - AggregatorV3Interface priceFeed = AggregatorV3Interface(address(aggregator)); - (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) = - priceFeed.latestRoundData(); - console.log(roundId); - console.log(answer); - console.log(startedAt); - console.log(updatedAt); - console.log(answeredInRound); - (uint256 price, uint8 decimals) = oracle.getPrice(tokenAddr); - console.log(price); - console.log(decimals); - - // (userAddr, userPrivateKey) = makeAddrAndKey("New User1"); - // vm.startBroadcast(deployerPrivateKey); - // payable(userAddr).transfer(0.1 ether); - // vm.stopBroadcast(); - // (ft, xt, gt, collateralAddr, underlyingERC20) = market.tokens(); - // collateral = FaucetERC20(collateralAddr); - // underlying = FaucetERC20(address(underlyingERC20)); - // underlyingPriceFeedAddr = faucet.getTokenConfig(faucet.getTokenId(address(underlying))).priceFeedAddr; - // collateralPriceFeedAddr = faucet.getTokenConfig(faucet.getTokenId(address(collateral))).priceFeedAddr; - // printMarketConfig(); - // mintDebtToken(deployerAddr, 100000); - // depositIntoOrder(100000); - // printUserPosition(); - - // console.log('> Mint 21504 debt token'); - // mintDebtToken(userAddr, 21504); - // printUserPosition(); - - // console.log('> Mint 12100 collateral token'); - // mintCollateralToken(userAddr, 12100); - // printUserPosition(); - // console.log('> Buy FT with 1000 debt token'); - // lendToOrder(1000); - // printUserPosition(); - - // console.log('> Borrow 8000 debt token with 12000 coll collateral token'); - // uint256 gtId = borrowFromOrder(12000, 8000, 8500); - // printUserPosition(); - - // console.log('> Add 100 collateral'); - // addCollateral(gtId, 100); - // printUserPosition(); - - // console.log('> Remove 50 collateral'); - // removeCollateral(gtId, 50); - // printUserPosition(); - - // console.log('> Repay 500 debt token'); - // repay(gtId, 500, true); - // printUserPosition(); - - // address to = vm.randomAddress(); - // console.log('> Transfer GT to', to); - // transferGT(gtId, to); - // printUserPosition(); - - // console.log('> Buy XT with 4 debt token and do leverage with 20000 debt token'); - // leverageFromOrder(4, 0, 20000, 0.8e8); - // printUserPosition(); - } - - function mintDebtToken(address to, uint256 amount) public { - uint256 mintAmt = amount * 10 ** underlying.decimals(); - vm.startBroadcast(deployerPrivateKey); - faucet.devMint(to, address(underlying), mintAmt); - vm.stopBroadcast(); - } - - function mintCollateralToken(address to, uint256 amount) public { - uint256 mintAmt = amount * 10 ** collateral.decimals(); - vm.startBroadcast(deployerPrivateKey); - faucet.devMint(to, address(collateral), mintAmt); - vm.stopBroadcast(); - } - - function depositIntoOrder(uint256 depositAmt) public { - vm.startBroadcast(deployerPrivateKey); - depositAmt = depositAmt * 10 ** underlying.decimals(); - (uint256 oriFtReserve, uint256 oriXtReserve) = order.tokenReserves(); - - underlying.approve(address(market), depositAmt); - market.mint(address(order), depositAmt); - (uint256 newFtReserve, uint256 newXtReserve) = order.tokenReserves(); - (uint256 newLendApr, uint256 newBorrowApr) = order.apr(); - console.log(""); - vm.stopBroadcast(); - // console.log("--- Deposit into order ---"); - // console.log("ori ftReserve:", oriFtReserve); - // console.log("ori xtReserve:", oriXtReserve); - // console.log("new ftReserve:", newFtReserve); - // console.log("new xtReserve:", newXtReserve); - // console.log("new lendApr:", newLendApr); - // console.log("new borrowApr:", newBorrowApr); - } - - function lendToOrder(uint256 lendAmt) public { - (uint256 oriFtReserve, uint256 oriXtReserve) = order.tokenReserves(); - (uint256 oriLendApr, uint256 oriBorrowApr) = order.apr(); - uint256 oriFtBalance = ft.balanceOf(userAddr); - - vm.startBroadcast(userPrivateKey); - lendAmt = lendAmt * 10 ** underlying.decimals(); - uint256 oriUnderlyingBalance = underlying.balanceOf(userAddr); - underlying.approve(address(order), lendAmt); - order.swapExactTokenToToken(underlying, ft, userAddr, uint128(lendAmt), 0, uint128(0)); - vm.stopBroadcast(); - - (uint256 newFtReserve, uint256 newXtReserve) = order.tokenReserves(); - (uint256 newLendApr, uint256 newBorrowApr) = order.apr(); - uint256 newUnderlyingBalance = underlying.balanceOf(userAddr); - uint256 newFtBalance = ft.balanceOf(userAddr); - - // console.log("--- Lend to order ---"); - // console.log("ori ftReserve:", oriFtReserve); - // console.log("ori xtReserve:", oriXtReserve); - // console.log("ori lendApr:", oriLendApr); - // console.log("ori borrowApr:", oriBorrowApr); - // console.log("ori underlyingBalance:", oriUnderlyingBalance); - // console.log("ori ftBalance:", oriFtBalance); - // console.log("new ftReserve:", newFtReserve); - // console.log("new xtReserve:", newXtReserve); - // console.log("new lendApr:", newLendApr); - // console.log("new borrowApr:", newBorrowApr); - // console.log("new underlyingBalance:", newUnderlyingBalance); - // console.log("new ftBalance:", newFtBalance); - } - - function borrowFromOrder(uint256 collateralAmt, uint256 borrowAmt, uint256 maxDebtAmt) - public - returns (uint256 gtId) - { - collateralAmt = collateralAmt * 10 ** collateral.decimals(); - borrowAmt = borrowAmt * 10 ** underlying.decimals(); - maxDebtAmt = maxDebtAmt * 10 ** underlying.decimals(); - (uint256 oriFtReserve, uint256 oriXtReserve) = order.tokenReserves(); - (uint256 oriLendApr, uint256 oriBorrowApr) = order.apr(); - uint256 oriUnderlyingBalance = underlying.balanceOf(userAddr); - - vm.startBroadcast(userPrivateKey); - uint256 oriCollateralBalance = collateral.balanceOf(userAddr); - // uint256 fee = (market.issueGtFeeRatio() * maxDebtAmt) / Constants.DECIMAL_BASE; - // uint256 ftAmt = maxDebtAmt - fee; - collateral.approve(address(router), collateralAmt); - ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); - orders[0] = order; - uint128[] memory ftAmtsToSell = new uint128[](1); - ftAmtsToSell[0] = uint128(borrowAmt); - SwapUnit[] memory units = new SwapUnit[](0); - (gtId,) = router.leverageFromToken( - userAddr, - market, - orders, - ftAmtsToSell, - uint128(0), // minXtOut - uint128(borrowAmt), // tokenToSwap - uint128(maxDebtAmt), // maxLtv - units, - block.timestamp - ); - vm.stopBroadcast(); - - (uint256 newFtReserve, uint256 newXtReserve) = order.tokenReserves(); - (uint256 newLendApr, uint256 newBorrowApr) = order.apr(); - uint256 newUnderlyingBalance = underlying.balanceOf(userAddr); - uint256 newCollateralBalance = collateral.balanceOf(userAddr); - - // console.log("--- Borrow from order ---"); - // console.log("ori ftReserve:", oriFtReserve); - // console.log("ori xtReserve:", oriXtReserve); - // console.log("ori lendApr:", oriLendApr); - // console.log("ori borrowApr:", oriBorrowApr); - // console.log("ori underlyingBalance:", oriUnderlyingBalance); - // console.log("ori collateralBalance:", oriCollateralBalance); - // console.log("new ftReserve:", newFtReserve); - // console.log("new xtReserve:", newXtReserve); - // console.log("new lendApr:", newLendApr); - // console.log("new borrowApr:", newBorrowApr); - // console.log("new underlyingBalance:", newUnderlyingBalance); - // console.log("new collateralBalance:", newCollateralBalance); - } - - function leverageFromOrder(uint128 amtToBuyXt, uint128 minXtOut, uint128 tokenToSwap, uint128 maxLtv) public { - amtToBuyXt = uint128(amtToBuyXt * 10 ** underlying.decimals()); - tokenToSwap = uint128(tokenToSwap * 10 ** underlying.decimals()); - ITermMaxOrder[] memory orders = new ITermMaxOrder[](1); - orders[0] = order; - uint128[] memory amtsToBuyXt = new uint128[](1); - amtsToBuyXt[0] = amtToBuyXt; - SwapUnit[] memory units = new SwapUnit[](1); - units[0] = SwapUnit( - address(swapAdapter), - address(underlying), - address(collateral), - abi.encode(underlyingPriceFeedAddr, collateralPriceFeedAddr) - ); - - (uint256 oriFtReserve, uint256 oriXtReserve) = order.tokenReserves(); - (uint256 oriLendApr, uint256 oriBorrowApr) = order.apr(); - uint256 oriUnderlyingBalance = underlying.balanceOf(userAddr); - - vm.startBroadcast(userPrivateKey); - underlying.approve(address(router), amtToBuyXt + tokenToSwap); - (uint256 gtId,) = router.leverageFromToken( - userAddr, market, orders, amtsToBuyXt, minXtOut, tokenToSwap, maxLtv, units, block.timestamp + 1 hours - ); - vm.stopBroadcast(); - - (uint256 newFtReserve, uint256 newXtReserve) = order.tokenReserves(); - (uint256 newLendApr, uint256 newBorrowApr) = order.apr(); - uint256 newUnderlyingBalance = underlying.balanceOf(userAddr); - // uint256 newCollateralBalance = collateral.balanceOf(userAddr); - - // console.log("--- Leverage from order ---"); - // console.log("ori ftReserve:", oriFtReserve); - // console.log("ori xtReserve:", oriXtReserve); - // console.log("ori lendApr:", oriLendApr); - // console.log("ori borrowApr:", oriBorrowApr); - // console.log("ori underlyingBalance:", oriUnderlyingBalance); - // console.log("new ftReserve:", newFtReserve); - // console.log("new xtReserve:", newXtReserve); - // console.log("new lendApr:", newLendApr); - // console.log("new borrowApr:", newBorrowApr); - // console.log("new underlyingBalance:", newUnderlyingBalance); - } - - function addCollateral(uint256 gtId, uint256 addCollateralAmt) public { - addCollateralAmt = addCollateralAmt * 10 ** collateral.decimals(); - vm.startBroadcast(userPrivateKey); - collateral.approve(address(gt), addCollateralAmt); - gt.addCollateral(gtId, abi.encode(addCollateralAmt)); - vm.stopBroadcast(); - } - - function removeCollateral(uint256 gtId, uint256 removeCollateralAmt) public { - removeCollateralAmt = removeCollateralAmt * 10 ** collateral.decimals(); - vm.startBroadcast(userPrivateKey); - gt.removeCollateral(gtId, abi.encode(removeCollateralAmt)); - vm.stopBroadcast(); - } - - function repay(uint256 gtId, uint128 repayAmt, bool byDebtToken) public { - repayAmt = uint128(repayAmt * 10 ** underlying.decimals()); - vm.startBroadcast(userPrivateKey); - underlying.approve(address(gt), repayAmt); - gt.repay(gtId, repayAmt, byDebtToken); - vm.stopBroadcast(); - } - - function transferGT(uint256 gtId, address toAddr) public { - vm.startBroadcast(userPrivateKey); - gt.transferFrom(userAddr, toAddr, gtId); - vm.stopBroadcast(); - // console.log("Transfer GT No. %d from %s to %s", gtId, userAddr, toAddr); - } - - function printMarketConfig() public view { - MarketConfig memory config = market.config(); - console.log("--- Market Config ---"); - console.log("Treasurer:", config.treasurer); - console.log("Maturity:", config.maturity); - console.log("lendTakerFeeRatio:", config.feeConfig.lendTakerFeeRatio); - console.log("lendMakerFeeRatio:", config.feeConfig.lendMakerFeeRatio); - console.log("borrowTakerFeeRatio:", config.feeConfig.borrowTakerFeeRatio); - console.log("borrowMakerFeeRatio:", config.feeConfig.borrowMakerFeeRatio); - console.log("mintGtFeeRatio:", config.feeConfig.mintGtFeeRatio); - console.log("mintGtFeeRef:", config.feeConfig.mintGtFeeRef); - console.log(""); - } - - function printUserPosition() public view { - console.log("--- User Position ---"); - console.log("User Addr:", userAddr); - console.log("Market Addr:", address(market)); - (IERC20[4] memory tokens, uint256[4] memory balances, address gtAddr, uint256[] memory gtIds) = - router.assetsWithERC20Collateral(market, address(0x2A58A3D405c527491Daae4C62561B949e7F87EFE)); - for (uint256 i = 0; i < tokens.length; i++) { - console.log(IERC20Metadata(address(tokens[i])).symbol(), ":", balances[i]); - } - console.log("gtAddr:", gtAddr); - console.log("gtIds:"); - for (uint256 i = 0; i < gtIds.length; i++) { - console.log(gtIds[i]); - } - } -} diff --git a/script/GenerateWallets.s.sol b/script/GenerateWallets.s.sol deleted file mode 100644 index 6bd2d2f..0000000 --- a/script/GenerateWallets.s.sol +++ /dev/null @@ -1,26 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; - -contract GenerateWallets is Script { - function run() public { - string memory mnemonic = vm.envString("MAINNET_FORK_MNEMONIC"); - - uint256 accountNum = 5; - - for (uint32 i = 0; i < accountNum; i++) { - (address deployer, uint256 privateKey) = deriveRememberKey(mnemonic, i); - console.log("Addr", i, ":", deployer); - console.log("PrivateKey", i, ":", privateKey); - } - - // bytes32 hash = keccak256("Signed by deployer"); - // (uint8 v, bytes32 r, bytes32 s) = vm.sign(privateKey, hash); - - // vm.startBroadcast(deployer); - - // vm.stopBroadcast(); - } -} diff --git a/script/GrantRoles.s.sol b/script/GrantRoles.s.sol deleted file mode 100644 index fdc4022..0000000 --- a/script/GrantRoles.s.sol +++ /dev/null @@ -1,142 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {console} from "forge-std/console.sol"; -import {AccessManager} from "contracts/access/AccessManager.sol"; -import {StringHelper} from "./utils/StringHelper.sol"; -import {ScriptBase} from "./utils/ScriptBase.sol"; - -/** - * @title GrantRoles - * @notice Script to grant essential roles to the deployer address - * @dev Uses admin private key to grant MARKET_ROLE, ORACLE_ROLE, and VAULT_ROLE - * to the deployer address for deploying and managing contracts - */ -contract GrantRoles is ScriptBase { - // Network-specific config loaded from environment variables - string network; - uint256 adminPrivateKey; - address adminAddr; - address deployerAddr; - address accessManagerAddr; - - function setUp() public { - // Load network from environment variable - network = vm.envString("NETWORK"); - string memory networkUpper = StringHelper.toUpper(network); - - // Load network-specific configuration - string memory adminPrivateKeyVar = string.concat(networkUpper, "_ADMIN_PRIVATE_KEY"); - string memory deployerVar = string.concat(networkUpper, "_DEPLOYER_ADDRESS"); - - adminPrivateKey = vm.envUint(adminPrivateKeyVar); - adminAddr = vm.addr(adminPrivateKey); - deployerAddr = vm.envAddress(deployerVar); - - // Load AccessManager address from deployment file - string memory deploymentPath = - string.concat(vm.projectRoot(), "/deployments/", network, "/", network, "-access-manager.json"); - string memory json = vm.readFile(deploymentPath); - accessManagerAddr = vm.parseJsonAddress(json, ".contracts.accessManager"); - } - - function run() public { - console.log("=== Configuration ==="); - console.log("Network:", network); - console.log("Admin:", adminAddr); - console.log("Deployer:", deployerAddr); - console.log("AccessManager:", accessManagerAddr); - console.log(""); - - console.log("=== Granting Roles to Deployer ==="); - - vm.startBroadcast(adminPrivateKey); - AccessManager accessManager = AccessManager(accessManagerAddr); - - // Grant MARKET_ROLE to deployer - if (!accessManager.hasRole(accessManager.MARKET_ROLE(), deployerAddr)) { - accessManager.grantRole(accessManager.MARKET_ROLE(), deployerAddr); - console.log("[SUCCESS] MARKET_ROLE granted to deployer"); - } else { - console.log("[INFO] Deployer already has MARKET_ROLE"); - } - - // Grant ORACLE_ROLE to deployer - if (!accessManager.hasRole(accessManager.ORACLE_ROLE(), deployerAddr)) { - accessManager.grantRole(accessManager.ORACLE_ROLE(), deployerAddr); - console.log("[SUCCESS] ORACLE_ROLE granted to deployer"); - } else { - console.log("[INFO] Deployer already has ORACLE_ROLE"); - } - - // Grant VAULT_ROLE to deployer - if (!accessManager.hasRole(accessManager.VAULT_ROLE(), deployerAddr)) { - accessManager.grantRole(accessManager.VAULT_ROLE(), deployerAddr); - console.log("[SUCCESS] VAULT_ROLE granted to deployer"); - } else { - console.log("[INFO] Deployer already has VAULT_ROLE"); - } - - // Grant CONFIGURATOR_ROLE to deployer (might be useful for additional config) - if (!accessManager.hasRole(accessManager.CONFIGURATOR_ROLE(), deployerAddr)) { - accessManager.grantRole(accessManager.CONFIGURATOR_ROLE(), deployerAddr); - console.log("[SUCCESS] CONFIGURATOR_ROLE granted to deployer"); - } else { - console.log("[INFO] Deployer already has CONFIGURATOR_ROLE"); - } - - vm.stopBroadcast(); - - console.log(""); - console.log("=== Role Assignment Complete ==="); - console.log("The deployer address now has all necessary roles to deploy and manage contracts"); - - // Generate execution results JSON - uint256 currentBlock = block.number; - uint256 currentTimestamp = block.timestamp; - - string memory baseJson = createBaseExecutionJson(network, "GrantRoles", currentBlock, currentTimestamp); - - // Check final role status - bool hasMarketRole = accessManager.hasRole(accessManager.MARKET_ROLE(), deployerAddr); - bool hasOracleRole = accessManager.hasRole(accessManager.ORACLE_ROLE(), deployerAddr); - bool hasVaultRole = accessManager.hasRole(accessManager.VAULT_ROLE(), deployerAddr); - bool hasConfiguratorRole = accessManager.hasRole(accessManager.CONFIGURATOR_ROLE(), deployerAddr); - - // Add script-specific data - string memory executionJson = string( - abi.encodePacked( - baseJson, - ",\n", - ' "results": {\n', - ' "adminAddress": "', - vm.toString(adminAddr), - '",\n', - ' "deployerAddress": "', - vm.toString(deployerAddr), - '",\n', - ' "accessManagerAddress": "', - vm.toString(accessManagerAddr), - '",\n', - ' "rolesGranted": {\n', - ' "MARKET_ROLE": ', - hasMarketRole ? "true" : "false", - ",\n", - ' "ORACLE_ROLE": ', - hasOracleRole ? "true" : "false", - ",\n", - ' "VAULT_ROLE": ', - hasVaultRole ? "true" : "false", - ",\n", - ' "CONFIGURATOR_ROLE": ', - hasConfiguratorRole ? "true" : "false", - "\n", - " }\n", - " }\n", - "}" - ) - ); - - writeScriptExecutionResults(network, "GrantRoles", executionJson); - } -} diff --git a/script/SubmitOracles.s.sol b/script/SubmitOracles.s.sol deleted file mode 100644 index 1208825..0000000 --- a/script/SubmitOracles.s.sol +++ /dev/null @@ -1,154 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {console} from "forge-std/console.sol"; -import {IOracle} from "contracts/oracle/IOracle.sol"; -import {OracleAggregator} from "contracts/oracle/OracleAggregator.sol"; -import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; -import {JsonLoader} from "./utils/JsonLoader.sol"; -import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; -import {StringHelper} from "./utils/StringHelper.sol"; -import {AccessManager} from "contracts/access/AccessManager.sol"; -import {ScriptBase} from "./utils/ScriptBase.sol"; - -contract SubmitOracles is ScriptBase { - // Network-specific config loaded from environment variables - string network; - uint256 deployerPrivateKey; - address oracleAggregatorAddr; - address accessManagerAddr; - JsonLoader.Config[] configs; - mapping(address => bool) tokenSubmitted; - - function setUp() public { - // Load network from environment variable - network = vm.envString("NETWORK"); - string memory networkUpper = StringHelper.toUpper(network); - // Load network-specific configuration - string memory privateKeyVar = string.concat(networkUpper, "_DEPLOYER_PRIVATE_KEY"); - deployerPrivateKey = vm.envUint(privateKeyVar); - - string memory accessManagerPath = - string.concat(vm.projectRoot(), "/deployments/", network, "/", network, "-access-manager.json"); - string memory json = vm.readFile(accessManagerPath); - accessManagerAddr = vm.parseJsonAddress(json, ".contracts.accessManager"); - - string memory corePath = string.concat(vm.projectRoot(), "/deployments/", network, "/", network, "-core.json"); - json = vm.readFile(corePath); - - oracleAggregatorAddr = vm.parseJsonAddress(json, ".contracts.oracleAggregator"); - } - - function run() public { - string memory deployDataPath = string.concat(vm.projectRoot(), "/script/deploy/deploydata/", network, ".json"); - - vm.startBroadcast(deployerPrivateKey); - - string memory deployData = vm.readFile(deployDataPath); - - configs = JsonLoader.getConfigsFromJson(deployData); - - AccessManager accessManager = AccessManager(accessManagerAddr); - OracleAggregator oracle = OracleAggregator(oracleAggregatorAddr); - for (uint256 i; i < configs.length; i++) { - JsonLoader.Config memory config = configs[i]; - ( - AggregatorV3Interface aggregator, - AggregatorV3Interface backupAggregator, - int256 maxPrice, - uint32 heartbeat, - uint32 backupHeartbeat - ) = oracle.oracles(address(config.underlyingConfig.tokenAddr)); - if ( - !tokenSubmitted[address(config.underlyingConfig.tokenAddr)] - && ( - address(aggregator) != address(config.underlyingConfig.priceFeedAddr) - || address(backupAggregator) != address(config.underlyingConfig.backupPriceFeedAddr) - || heartbeat != config.underlyingConfig.heartBeat - ) - ) { - accessManager.submitPendingOracle( - oracle, - address(config.underlyingConfig.tokenAddr), - IOracle.Oracle( - AggregatorV3Interface(config.underlyingConfig.priceFeedAddr), - AggregatorV3Interface(config.underlyingConfig.backupPriceFeedAddr), - 0, - uint32(config.underlyingConfig.heartBeat), - uint32(config.underlyingConfig.heartBeat) - ) - ); - tokenSubmitted[address(config.underlyingConfig.tokenAddr)] = true; - console.log( - "Submitted oracle for underlying: ", - IERC20Metadata(address(config.underlyingConfig.tokenAddr)).symbol() - ); - console.log("Price feed: ", config.underlyingConfig.priceFeedAddr); - console.log("Backup price feed: ", config.underlyingConfig.backupPriceFeedAddr); - console.log("Heartbeat: ", config.underlyingConfig.heartBeat); - console.log("--------------------------------"); - } - (aggregator, backupAggregator, maxPrice, heartbeat, backupHeartbeat) = - oracle.oracles(address(config.collateralConfig.tokenAddr)); - if ( - !tokenSubmitted[address(config.collateralConfig.tokenAddr)] - && ( - address(aggregator) != address(config.collateralConfig.priceFeedAddr) - || address(backupAggregator) != address(config.collateralConfig.backupPriceFeedAddr) - || heartbeat != config.collateralConfig.heartBeat - ) - ) { - accessManager.submitPendingOracle( - oracle, - address(config.collateralConfig.tokenAddr), - IOracle.Oracle( - AggregatorV3Interface(config.collateralConfig.priceFeedAddr), - AggregatorV3Interface(config.collateralConfig.backupPriceFeedAddr), - 0, - uint32(config.collateralConfig.heartBeat), - uint32(config.collateralConfig.heartBeat) - ) - ); - tokenSubmitted[address(config.collateralConfig.tokenAddr)] = true; - console.log( - "Submitted oracle for collateral: ", - IERC20Metadata(address(config.collateralConfig.tokenAddr)).symbol() - ); - console.log("Price feed: ", config.collateralConfig.priceFeedAddr); - console.log("Backup price feed: ", config.collateralConfig.backupPriceFeedAddr); - console.log("Heartbeat: ", config.collateralConfig.heartBeat); - console.log("--------------------------------"); - } - } - - vm.stopBroadcast(); - - // Generate execution results JSON - uint256 currentBlock = block.number; - uint256 currentTimestamp = block.timestamp; - - string memory baseJson = createBaseExecutionJson(network, "SubmitOracles", currentBlock, currentTimestamp); - - // Add script-specific data - string memory executionJson = string( - abi.encodePacked( - baseJson, - ",\n", - ' "results": {\n', - ' "totalConfigs": "', - vm.toString(configs.length), - '",\n', - ' "oracleAggregatorAddress": "', - vm.toString(oracleAggregatorAddr), - '",\n', - ' "accessManagerAddress": "', - vm.toString(accessManagerAddr), - '"\n', - " }\n", - "}" - ) - ); - - writeScriptExecutionResults(network, "SubmitOracles", executionJson); - } -} diff --git a/script/TVLChecker.s.sol b/script/TVLChecker.s.sol deleted file mode 100644 index c1a31c9..0000000 --- a/script/TVLChecker.s.sol +++ /dev/null @@ -1,780 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {Script} from "forge-std/Script.sol"; -import {console2} from "forge-std/console2.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; -import {ITermMaxMarket} from "contracts/ITermMaxMarket.sol"; -import {IGearingToken} from "contracts/tokens/IGearingToken.sol"; -import {IMintableERC20} from "contracts/tokens/IMintableERC20.sol"; -import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; -import {IERC4626} from "@openzeppelin/contracts/interfaces/IERC4626.sol"; - -/** - * @title TVLChecker - * @dev Script to check locked amount of underlying and collateral tokens for each market - */ - -// Interface for OracleAggregator -interface IOracleAggregator { - struct Oracle { - AggregatorV3Interface aggregator; - AggregatorV3Interface backupAggregator; - uint32 heartbeat; - } - - function getPrice(address asset) external view returns (uint256 price, uint8 decimals); - function oracles(address asset) - external - view - returns (AggregatorV3Interface aggregator, AggregatorV3Interface backupAggregator, uint32 heartbeat); -} - -contract TVLChecker is Script { - struct MarketTVL { - string marketName; - address market; - address gt; - address ft; - address xt; - address underlying; - address collateral; - string underlyingSymbol; - string collateralSymbol; - uint8 underlyingDecimals; - uint8 collateralDecimals; - uint256 underlyingLocked; // Underlying token locked in market - uint256 collateralLocked; // Collateral token locked in GT - uint256 underlyingPriceUSD; // USD price of underlying token (scaled by price decimals) - uint256 collateralPriceUSD; // USD price of collateral token (scaled by price decimals) - uint8 underlyingPriceDecimals; // Decimals of the underlying price feed - uint8 collateralPriceDecimals; // Decimals of the collateral price feed - } - - struct VaultTVL { - string vaultName; - address vaultAddress; - address assetAddress; - string assetSymbol; - uint8 assetDecimals; - uint256 totalAssets; - uint256 assetPriceUSD; - uint8 assetPriceDecimals; - } - - struct TokenSummary { - address tokenAddress; - string tokenSymbol; - uint8 tokenDecimals; - uint256 totalLocked; - uint256 tokenPriceUSD; - uint8 tokenPriceDecimals; - } - - function run() public { - // Directory to look for deployment files - string memory deploymentDir = "deployments/eth-mainnet-v1.0.8-20250530"; - - // Read oracle aggregator address from core.json - string memory coreJsonPath = string.concat(deploymentDir, "/eth-mainnet-core.json"); - string memory coreJson = vm.readFile(coreJsonPath); - address oracleAggregator = vm.parseJsonAddress(coreJson, ".contracts.oracleAggregator"); - - console2.log("Oracle Aggregator:", formatAddress(oracleAggregator)); - - // First, count the market files to determine array size - uint256 marketCount = countMarketFiles(deploymentDir); - MarketTVL[] memory markets = new MarketTVL[](marketCount); - - // Count vault files - uint256 vaultCount = countVaultFiles(deploymentDir); - VaultTVL[] memory vaults = new VaultTVL[](vaultCount); - - console2.log("====== Checking TVL for ETH Mainnet Markets and Vaults ======"); - console2.log(string.concat("Directory: ", deploymentDir)); - console2.log( - string.concat( - "Found ", vm.toString(marketCount), " market files and ", vm.toString(vaultCount), " vault files" - ) - ); - console2.log("================================================="); - - // Process market files - processMarketFiles(deploymentDir, markets, oracleAggregator); - - // Process vault files - processVaultFiles(deploymentDir, vaults, oracleAggregator); - - // Display results for markets - console2.log("\n====== MARKET TVL SUMMARY ======"); - - uint256 totalUnderlyingValueUSD = 0; - uint256 totalCollateralValueUSD = 0; - - for (uint256 i = 0; i < marketCount; i++) { - MarketTVL memory info = markets[i]; - - // Format balances with proper decimals - string memory formattedUnderlyingLocked = formatTokenAmount(info.underlyingLocked, info.underlyingDecimals); - string memory formattedCollateralLocked = formatTokenAmount(info.collateralLocked, info.collateralDecimals); - - // Calculate USD values with proper decimal adjustment - uint256 underlyingValueUSD = calculateUSDValue( - info.underlyingLocked, info.underlyingDecimals, info.underlyingPriceUSD, info.underlyingPriceDecimals - ); - - uint256 collateralValueUSD = calculateUSDValue( - info.collateralLocked, info.collateralDecimals, info.collateralPriceUSD, info.collateralPriceDecimals - ); - - // Add to totals (normalize to 18 decimals for addition) - totalUnderlyingValueUSD += underlyingValueUSD; - totalCollateralValueUSD += collateralValueUSD; - - // Format USD values as dollars with 2 decimal places - string memory formattedUnderlyingValueUSD = formatUSDValue(underlyingValueUSD); - string memory formattedCollateralValueUSD = formatUSDValue(collateralValueUSD); - - // Display results in the requested format - console2.log("-------------------------------------------------"); - console2.log(string.concat("Market: ", info.marketName)); - console2.log(string.concat("Market address: ", formatAddress(info.market))); - console2.log(string.concat("GT address: ", formatAddress(info.gt))); - console2.log(string.concat("FT address: ", formatAddress(info.ft))); - console2.log(string.concat("XT address: ", formatAddress(info.xt))); - console2.log(string.concat("Underlying address: ", formatAddress(info.underlying))); - console2.log(string.concat("Collateral address: ", formatAddress(info.collateral))); - console2.log(string.concat("Underlying locked: ", formattedUnderlyingLocked, " ", info.underlyingSymbol)); - console2.log(string.concat("Underlying USD value: $", formattedUnderlyingValueUSD)); - console2.log(string.concat("Collateral locked: ", formattedCollateralLocked, " ", info.collateralSymbol)); - console2.log(string.concat("Collateral USD value: $", formattedCollateralValueUSD)); - } - - // Display results for vaults - console2.log("\n====== VAULT TVL SUMMARY ======"); - - uint256 totalVaultValueUSD = 0; - - for (uint256 i = 0; i < vaultCount; i++) { - VaultTVL memory info = vaults[i]; - - // Format asset amount with proper decimals - string memory formattedAssets = formatTokenAmount(info.totalAssets, info.assetDecimals); - - // Calculate USD value - uint256 assetValueUSD = - calculateUSDValue(info.totalAssets, info.assetDecimals, info.assetPriceUSD, info.assetPriceDecimals); - - // Add to total - totalVaultValueUSD += assetValueUSD; - - // Format USD value - string memory formattedAssetValueUSD = formatUSDValue(assetValueUSD); - - // Display results - console2.log("-------------------------------------------------"); - console2.log(string.concat("Vault: ", info.vaultName)); - console2.log(string.concat("Vault address: ", formatAddress(info.vaultAddress))); - console2.log(string.concat("Asset address: ", formatAddress(info.assetAddress))); - console2.log(string.concat("Asset locked: ", formattedAssets, " ", info.assetSymbol)); - console2.log(string.concat("Asset USD value: $", formattedAssetValueUSD)); - } - - // Create and display token summary - console2.log("\n====== TOKEN-BASED TVL SUMMARY ======"); - - // 1. Collect all unique token addresses - address[] memory uniqueTokens = collectUniqueTokens(markets, vaults); - TokenSummary[] memory tokenSummaries = new TokenSummary[](uniqueTokens.length); - - // 2. Initialize token summaries - for (uint256 i = 0; i < uniqueTokens.length; i++) { - TokenSummary memory summary; - summary.tokenAddress = uniqueTokens[i]; - - try IERC20Metadata(uniqueTokens[i]).symbol() returns (string memory symbol) { - summary.tokenSymbol = symbol; - } catch { - summary.tokenSymbol = "Unknown"; - } - - try IERC20Metadata(uniqueTokens[i]).decimals() returns (uint8 decimals) { - summary.tokenDecimals = decimals; - } catch { - summary.tokenDecimals = 18; - } - - // Try to get price from oracle - IOracleAggregator oracle = IOracleAggregator(oracleAggregator); - try oracle.getPrice(uniqueTokens[i]) returns (uint256 price, uint8 decimals) { - summary.tokenPriceUSD = price; - summary.tokenPriceDecimals = decimals; - } catch { - summary.tokenPriceUSD = 0; - summary.tokenPriceDecimals = 8; - } - - tokenSummaries[i] = summary; - } - - // 3. Accumulate locked amounts for each token - for (uint256 i = 0; i < marketCount; i++) { - // Add underlying tokens from markets - for (uint256 j = 0; j < uniqueTokens.length; j++) { - if (markets[i].underlying == uniqueTokens[j]) { - tokenSummaries[j].totalLocked += markets[i].underlyingLocked; - break; - } - } - - // Add collateral tokens from markets - for (uint256 j = 0; j < uniqueTokens.length; j++) { - if (markets[i].collateral == uniqueTokens[j]) { - tokenSummaries[j].totalLocked += markets[i].collateralLocked; - break; - } - } - } - - // Add assets from vaults - for (uint256 i = 0; i < vaultCount; i++) { - for (uint256 j = 0; j < uniqueTokens.length; j++) { - if (vaults[i].assetAddress == uniqueTokens[j]) { - tokenSummaries[j].totalLocked += vaults[i].totalAssets; - break; - } - } - } - - // 4. Display token summaries - uint256 totalTokenValueUSD = 0; - - for (uint256 i = 0; i < tokenSummaries.length; i++) { - TokenSummary memory summary = tokenSummaries[i]; - - // Skip tokens with zero balance - if (summary.totalLocked == 0) continue; - - // Format amount with proper decimals - string memory formattedAmount = formatTokenAmount(summary.totalLocked, summary.tokenDecimals); - - // Calculate USD value - uint256 tokenValueUSD = calculateUSDValue( - summary.totalLocked, summary.tokenDecimals, summary.tokenPriceUSD, summary.tokenPriceDecimals - ); - - totalTokenValueUSD += tokenValueUSD; - string memory formattedTokenValueUSD = formatUSDValue(tokenValueUSD); - - // Display the token summary - console2.log("-------------------------------------------------"); - console2.log(string.concat("Token: ", summary.tokenSymbol)); - console2.log(string.concat("Address: ", formatAddress(summary.tokenAddress))); - console2.log(string.concat("Total locked: ", formattedAmount, " ", summary.tokenSymbol)); - console2.log(string.concat("USD value: $", formattedTokenValueUSD)); - } - - // Display grand totals - string memory formattedTotalUnderlyingUSD = formatUSDValue(totalUnderlyingValueUSD); - string memory formattedTotalCollateralUSD = formatUSDValue(totalCollateralValueUSD); - string memory formattedTotalVaultUSD = formatUSDValue(totalVaultValueUSD); - string memory formattedGrandTotalTVL = - formatUSDValue(totalUnderlyingValueUSD + totalCollateralValueUSD + totalVaultValueUSD); - - console2.log("\n====== TOTAL TVL SUMMARY ======"); - console2.log("-------------------------------------------------"); - console2.log(string.concat("Total Market Underlying USD Value: $", formattedTotalUnderlyingUSD)); - console2.log(string.concat("Total Market Collateral USD Value: $", formattedTotalCollateralUSD)); - console2.log(string.concat("Total Vault USD Value: $", formattedTotalVaultUSD)); - console2.log(string.concat("GRAND TOTAL TVL: $", formattedGrandTotalTVL)); - console2.log("-------------------------------------------------"); - } - - // Collect unique token addresses from markets and vaults - function collectUniqueTokens(MarketTVL[] memory markets, VaultTVL[] memory vaults) - internal - pure - returns (address[] memory) - { - // First, count the maximum possible unique tokens (2 per market + 1 per vault) - uint256 maxUniqueTokens = markets.length * 2 + vaults.length; - address[] memory tempTokens = new address[](maxUniqueTokens); - uint256 uniqueCount = 0; - - // Add market tokens (underlying and collateral) - for (uint256 i = 0; i < markets.length; i++) { - // Add underlying token if not already in the list - bool foundUnderlying = false; - for (uint256 j = 0; j < uniqueCount; j++) { - if (tempTokens[j] == markets[i].underlying) { - foundUnderlying = true; - break; - } - } - if (!foundUnderlying && markets[i].underlying != address(0)) { - tempTokens[uniqueCount] = markets[i].underlying; - uniqueCount++; - } - - // Add collateral token if not already in the list - bool foundCollateral = false; - for (uint256 j = 0; j < uniqueCount; j++) { - if (tempTokens[j] == markets[i].collateral) { - foundCollateral = true; - break; - } - } - if (!foundCollateral && markets[i].collateral != address(0)) { - tempTokens[uniqueCount] = markets[i].collateral; - uniqueCount++; - } - } - - // Add vault asset tokens - for (uint256 i = 0; i < vaults.length; i++) { - bool foundAsset = false; - for (uint256 j = 0; j < uniqueCount; j++) { - if (tempTokens[j] == vaults[i].assetAddress) { - foundAsset = true; - break; - } - } - if (!foundAsset && vaults[i].assetAddress != address(0)) { - tempTokens[uniqueCount] = vaults[i].assetAddress; - uniqueCount++; - } - } - - // Create correctly sized array with unique tokens - address[] memory uniqueTokens = new address[](uniqueCount); - for (uint256 i = 0; i < uniqueCount; i++) { - uniqueTokens[i] = tempTokens[i]; - } - - return uniqueTokens; - } - - // Calculate USD value from token amount and price - function calculateUSDValue(uint256 tokenAmount, uint8 tokenDecimals, uint256 tokenPrice, uint8 priceDecimals) - internal - pure - returns (uint256) - { - if (tokenAmount == 0 || tokenPrice == 0) return 0; - - // Convert to 18 decimal standard for consistency - uint256 normalizedAmount; - if (tokenDecimals < 18) { - normalizedAmount = tokenAmount * 10 ** (18 - tokenDecimals); - } else if (tokenDecimals > 18) { - normalizedAmount = tokenAmount / 10 ** (tokenDecimals - 18); - } else { - normalizedAmount = tokenAmount; - } - - // Scale price to 18 decimals - uint256 normalizedPrice; - if (priceDecimals < 18) { - normalizedPrice = tokenPrice * 10 ** (18 - priceDecimals); - } else if (priceDecimals > 18) { - normalizedPrice = tokenPrice / 10 ** (priceDecimals - 18); - } else { - normalizedPrice = tokenPrice; - } - - // Calculate value and return with 18 decimals precision - return (normalizedAmount * normalizedPrice) / 10 ** 18; - } - - // Format USD value as string with 2 decimal places - function formatUSDValue(uint256 valueUSD) internal pure returns (string memory) { - // Convert to dollars with 2 decimal places (USD value is in 18 decimals) - uint256 dollars = valueUSD / 10 ** 16; // Get dollars with 2 decimal places - string memory integerPart = vm.toString(dollars / 100); - uint256 fractionalPart = dollars % 100; - - // Ensure fractional part has leading zeros - string memory fractionalStr; - if (fractionalPart < 10) { - fractionalStr = string.concat("0", vm.toString(fractionalPart)); - } else { - fractionalStr = vm.toString(fractionalPart); - } - - return string.concat(integerPart, ".", fractionalStr); - } - - // Count how many market files are in the directory - function countMarketFiles(string memory deploymentDir) internal returns (uint256) { - string[] memory inputs = new string[](3); - inputs[0] = "ls"; - inputs[1] = "-1"; // One file per line - inputs[2] = deploymentDir; - - bytes memory result = vm.ffi(inputs); - string memory fileList = string(result); - - string[] memory files = split(fileList, "\n"); - uint256 marketCount = 0; - - for (uint256 i = 0; i < files.length; i++) { - if (contains(files[i], "market-") && contains(files[i], ".json")) { - marketCount++; - } - } - return marketCount; - } - - // Count how many vault files are in the directory - function countVaultFiles(string memory deploymentDir) internal returns (uint256) { - string[] memory inputs = new string[](3); - inputs[0] = "ls"; - inputs[1] = "-1"; // One file per line - inputs[2] = deploymentDir; - - bytes memory result = vm.ffi(inputs); - string memory fileList = string(result); - - string[] memory files = split(fileList, "\n"); - uint256 vaultCount = 0; - - for (uint256 i = 0; i < files.length; i++) { - if (contains(files[i], "vault-") && contains(files[i], ".json") && !contains(files[i], "factory")) { - vaultCount++; - } - } - return vaultCount; - } - - // Process market files and extract TVL information - function processMarketFiles(string memory deploymentDir, MarketTVL[] memory markets, address oracleAggregator) - internal - { - string[] memory inputs = new string[](3); - inputs[0] = "ls"; - inputs[1] = "-1"; // One file per line - inputs[2] = deploymentDir; - - bytes memory result = vm.ffi(inputs); - string memory fileList = string(result); - - string[] memory files = split(fileList, "\n"); - uint256 marketIndex = 0; - - for (uint256 i = 0; i < files.length; i++) { - if (contains(files[i], "market-") && contains(files[i], ".json")) { - string memory filePath = string.concat(deploymentDir, "/", files[i]); - string memory jsonContent = vm.readFile(filePath); - - // Extract market name from file path - markets[marketIndex].marketName = extractMarketName(files[i]); - - // Extract addresses from JSON - markets[marketIndex].market = vm.parseJsonAddress(jsonContent, ".market"); - markets[marketIndex].underlying = vm.parseJsonAddress(jsonContent, ".underlying.address"); - markets[marketIndex].collateral = vm.parseJsonAddress(jsonContent, ".collateral.address"); - markets[marketIndex].ft = vm.parseJsonAddress(jsonContent, ".tokens.ft"); - markets[marketIndex].xt = vm.parseJsonAddress(jsonContent, ".tokens.xt"); - markets[marketIndex].gt = vm.parseJsonAddress(jsonContent, ".tokens.gt"); - - // Get token symbols and decimals - try IERC20Metadata(markets[marketIndex].underlying).symbol() returns (string memory symbol) { - markets[marketIndex].underlyingSymbol = symbol; - } catch { - markets[marketIndex].underlyingSymbol = "Unknown"; - } - - try IERC20Metadata(markets[marketIndex].collateral).symbol() returns (string memory symbol) { - markets[marketIndex].collateralSymbol = symbol; - } catch { - markets[marketIndex].collateralSymbol = "Unknown"; - } - - try IERC20Metadata(markets[marketIndex].underlying).decimals() returns (uint8 decimals) { - markets[marketIndex].underlyingDecimals = decimals; - } catch { - markets[marketIndex].underlyingDecimals = 18; - } - - try IERC20Metadata(markets[marketIndex].collateral).decimals() returns (uint8 decimals) { - markets[marketIndex].collateralDecimals = decimals; - } catch { - markets[marketIndex].collateralDecimals = 18; - } - - // Check locked balances - try IERC20(markets[marketIndex].underlying).balanceOf(markets[marketIndex].market) returns ( - uint256 balance - ) { - markets[marketIndex].underlyingLocked = balance; - } catch { - console2.log( - string.concat( - "Error: Could not fetch underlying balance for market ", - formatAddress(markets[marketIndex].market) - ) - ); - } - - try IERC20(markets[marketIndex].collateral).balanceOf(markets[marketIndex].gt) returns (uint256 balance) - { - markets[marketIndex].collateralLocked = balance; - } catch { - console2.log( - string.concat( - "Error: Could not fetch collateral balance for GT ", formatAddress(markets[marketIndex].gt) - ) - ); - } - - // Get token prices from oracle aggregator - IOracleAggregator oracle = IOracleAggregator(oracleAggregator); - - try oracle.getPrice(markets[marketIndex].underlying) returns (uint256 price, uint8 decimals) { - markets[marketIndex].underlyingPriceUSD = price; - markets[marketIndex].underlyingPriceDecimals = decimals; - } catch { - console2.log( - string.concat( - "Error: Could not fetch underlying price for ", markets[marketIndex].underlyingSymbol - ) - ); - // Set defaults - markets[marketIndex].underlyingPriceUSD = 0; - markets[marketIndex].underlyingPriceDecimals = 8; // Default Chainlink decimals - } - - try oracle.getPrice(markets[marketIndex].collateral) returns (uint256 price, uint8 decimals) { - markets[marketIndex].collateralPriceUSD = price; - markets[marketIndex].collateralPriceDecimals = decimals; - } catch { - console2.log( - string.concat( - "Error: Could not fetch collateral price for ", markets[marketIndex].collateralSymbol - ) - ); - // Set defaults - markets[marketIndex].collateralPriceUSD = 0; - markets[marketIndex].collateralPriceDecimals = 8; // Default Chainlink decimals - } - - marketIndex++; - } - } - } - - // Process vault files and extract TVL information - function processVaultFiles(string memory deploymentDir, VaultTVL[] memory vaults, address oracleAggregator) - internal - { - string[] memory inputs = new string[](3); - inputs[0] = "ls"; - inputs[1] = "-1"; // One file per line - inputs[2] = deploymentDir; - - bytes memory result = vm.ffi(inputs); - string memory fileList = string(result); - - string[] memory files = split(fileList, "\n"); - uint256 vaultIndex = 0; - - for (uint256 i = 0; i < files.length; i++) { - if (contains(files[i], "vault-") && contains(files[i], ".json") && !contains(files[i], "factory")) { - string memory filePath = string.concat(deploymentDir, "/", files[i]); - string memory jsonContent = vm.readFile(filePath); - - // Extract vault name from file path - vaults[vaultIndex].vaultName = extractVaultName(files[i]); - - // Extract addresses from JSON - vaults[vaultIndex].vaultAddress = vm.parseJsonAddress(jsonContent, ".vaultInfo.address"); - vaults[vaultIndex].assetAddress = vm.parseJsonAddress(jsonContent, ".vaultInfo.asset"); - - // Get token symbol and decimals - try IERC20Metadata(vaults[vaultIndex].assetAddress).symbol() returns (string memory symbol) { - vaults[vaultIndex].assetSymbol = symbol; - } catch { - vaults[vaultIndex].assetSymbol = "Unknown"; - } - - try IERC20Metadata(vaults[vaultIndex].assetAddress).decimals() returns (uint8 decimals) { - vaults[vaultIndex].assetDecimals = decimals; - } catch { - vaults[vaultIndex].assetDecimals = 18; - } - - // Get asset balance of the vault using balanceOf instead of totalAssets - // try IERC4626(vaults[vaultIndex].vaultAddress).totalAssets() returns (uint256 balance) { - try IERC20(vaults[vaultIndex].assetAddress).balanceOf(vaults[vaultIndex].vaultAddress) returns ( - uint256 balance - ) { - vaults[vaultIndex].totalAssets = balance; - } catch { - console2.log( - string.concat( - "Error: Could not fetch asset balance for vault ", - formatAddress(vaults[vaultIndex].vaultAddress) - ) - ); - } - - // Get asset price from oracle aggregator - IOracleAggregator oracle = IOracleAggregator(oracleAggregator); - - try oracle.getPrice(vaults[vaultIndex].assetAddress) returns (uint256 price, uint8 decimals) { - vaults[vaultIndex].assetPriceUSD = price; - vaults[vaultIndex].assetPriceDecimals = decimals; - } catch { - console2.log(string.concat("Error: Could not fetch price for ", vaults[vaultIndex].assetSymbol)); - // Set defaults - vaults[vaultIndex].assetPriceUSD = 0; - vaults[vaultIndex].assetPriceDecimals = 8; // Default Chainlink decimals - } - - vaultIndex++; - } - } - } - - // Check if a string contains a substring - function contains(string memory source, string memory target) internal pure returns (bool) { - bytes memory sourceBytes = bytes(source); - bytes memory targetBytes = bytes(target); - - if (targetBytes.length > sourceBytes.length) { - return false; - } - - for (uint256 i = 0; i <= sourceBytes.length - targetBytes.length; i++) { - bool found = true; - for (uint256 j = 0; j < targetBytes.length; j++) { - if (sourceBytes[i + j] != targetBytes[j]) { - found = false; - break; - } - } - if (found) { - return true; - } - } - return false; - } - - // Split a string by delimiter - function split(string memory source, string memory delimiter) internal pure returns (string[] memory) { - bytes memory sourceBytes = bytes(source); - bytes memory delimiterBytes = bytes(delimiter); - - // Count occurrences of delimiter - uint256 count = 1; // At least one item - for (uint256 i = 0; i < sourceBytes.length - delimiterBytes.length + 1; i++) { - bool found = true; - for (uint256 j = 0; j < delimiterBytes.length; j++) { - if (sourceBytes[i + j] != delimiterBytes[j]) { - found = false; - break; - } - } - if (found) { - count++; - i += delimiterBytes.length - 1; - } - } - - // Split the string - string[] memory parts = new string[](count); - uint256 partIndex = 0; - uint256 startIndex = 0; - - for (uint256 i = 0; i <= sourceBytes.length - delimiterBytes.length + 1; i++) { - if (i == sourceBytes.length - delimiterBytes.length + 1) { - // Add the last part - parts[partIndex] = substring(source, startIndex, sourceBytes.length); - break; - } - - bool found = true; - for (uint256 j = 0; j < delimiterBytes.length; j++) { - if (i + j >= sourceBytes.length || sourceBytes[i + j] != delimiterBytes[j]) { - found = false; - break; - } - } - - if (found) { - parts[partIndex] = substring(source, startIndex, i); - partIndex++; - startIndex = i + delimiterBytes.length; - i += delimiterBytes.length - 1; - } - } - - return parts; - } - - // Helper function to format token amounts with proper decimals - function formatTokenAmount(uint256 amount, uint8 decimals) internal pure returns (string memory) { - if (amount == 0) return "0"; - - string memory amountStr = vm.toString(amount); - uint256 length = bytes(amountStr).length; - - // Format with proper decimals, showing all digits - if (length <= decimals) { - // Need to pad with leading zeros - string memory zeros = ""; - for (uint256 i = 0; i < decimals - length; i++) { - zeros = string.concat(zeros, "0"); - } - return string.concat("0.", zeros, amountStr); - } else { - // Insert decimal point - uint256 decimalPos = length - decimals; - return string.concat(substring(amountStr, 0, decimalPos), ".", substring(amountStr, decimalPos, length)); - } - } - - // Helper function to format address for display - function formatAddress(address addr) internal pure returns (string memory) { - return vm.toString(addr); - } - - // Helper function to get a substring - function substring(string memory str, uint256 startIndex, uint256 endIndex) internal pure returns (string memory) { - bytes memory strBytes = bytes(str); - bytes memory result = new bytes(endIndex - startIndex); - for (uint256 i = startIndex; i < endIndex; i++) { - result[i - startIndex] = strBytes[i]; - } - return string(result); - } - - // Extract market name from file path - function extractMarketName(string memory fileName) internal pure returns (string memory) { - // Example fileName: eth-mainnet-market-USDC-WBTC@30MAY2025.json - // We want to extract: USDC-WBTC@30MAY2025 - - string[] memory parts = split(fileName, "market-"); - if (parts.length < 2) return fileName; - - string memory marketPart = parts[1]; - string[] memory jsonParts = split(marketPart, ".json"); - - return jsonParts[0]; - } - - // Extract vault name from file path - function extractVaultName(string memory fileName) internal pure returns (string memory) { - // Example fileName: eth-mainnet-vault-TMX-WETH.json - // We want to extract: TMX-WETH - - string[] memory parts = split(fileName, "vault-"); - if (parts.length < 2) return fileName; - - string memory vaultPart = parts[1]; - string[] memory jsonParts = split(vaultPart, ".json"); - - return jsonParts[0]; - } -} diff --git a/script/UpdateMarketFee_20250513.s.sol b/script/UpdateMarketFee_20250513.s.sol deleted file mode 100644 index 01bffc0..0000000 --- a/script/UpdateMarketFee_20250513.s.sol +++ /dev/null @@ -1,184 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; -import {IGearingToken} from "contracts/tokens/IGearingToken.sol"; -import {PendleSwapV3Adapter} from "contracts/router/swapAdapters/PendleSwapV3Adapter.sol"; -import {ITermMaxVault} from "contracts/vault/ITermMaxVault.sol"; -import {ITermMaxMarket, MarketConfig} from "contracts/ITermMaxMarket.sol"; -import {StringHelper} from "./utils/StringHelper.sol"; - -interface IAccessManager { - function updateMarketConfig(ITermMaxMarket market, MarketConfig calldata newConfig) external; -} - -/// @title update market configs -/// @author evan -/// @notice -contract UpdateMarket is Script { - // Network-specific config loaded from environment variables - string network; - - address[] eth_stableCoinMarkets = [ - 0x03f2Af12aE4eb5533c3f7773BE826e8da56F6E1a, - 0x1A69127188B72A155165255270017b4c78f31b88, - 0x22Cd4c59eD4bb2ad852892518073056441c55BFE, - 0x2524D9a55C2D18A3F257A7F67AfD552B285de34E, - 0x403863917316Bf8AA1966F9D90b393Cec98F991b, - 0x6f5c8838E618448e43385E4C401006822Aa15142, - 0x7526D036cDDbD3bdFDd8370D75304b822740b291, - 0x988a287c4340B18665cC5E128DC76906A5C839e6, - 0x9904F3b879385033faa31B50d1D63cb80b3495A3, - 0xCE511791715D1A84cD2f7BfA279F92c187bb9d93, - 0xd017E469d22AB7FfB097b9aA329391874954523b, - 0xd699EFC4162d76BfD3cB553D65f850c882C29F5F, - 0xdBB2D44c238c459cCB820De886ABF721EF6E6941, - 0xe867255dC0c3a27c90f756ECC566a5292ce19492, - 0xEd7cD45E5e6ef68261929B58539805bA3c061f14, - 0xf4924D6189552ae5A7818088dA6f23Bd33281C1b, - 0x8d501c7640595EC9D2A39Fbd30dED7672e9631BD, - 0xa1ed39C786eea298925DD6FcC33199C3fF06765E, - 0x37877773B1289c27Bb6159b86613Efd0d15cADaE - ]; - address[] eth_unstableCoinMarkets = [ - 0x0B7eFE5DE3c3B5d75de33e25965b193d6Ba79f52, - 0x484CDece3FC951a7D009b9dBAC66EC287eC1f58e, - 0x918D8Ecba4C683EF3004b1C313cfEF5e3b9E1146, - 0xaBE8ab2223c846466Eb30f5137A7f05106c9d0c4, - 0xb9919eE2169a7dA664AD024C6dDCF0ccD4121C26, - 0xBebB5CEe893110cF477901AF7FA94E4840606421, - 0xc68a2fbD7cb560c71CcAfbDeE971824Ed9bF4556, - 0xC898Fa3A26CEAcAE25cCffF6003B087948dEDE2a, - 0xD316d4494c840F8A758FB6184e9b60281e35cC02, - 0xf0dE37189366F0f3AAe2795160763F3F34797B11 - ]; - address eth_accessManagerAddr = 0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF; - - address[] arb_stableCoinMarkets = [ - 0x0b91Cd4e86F0DBBbB2c37c384e1fA91B9a5A3220, - 0x10Af30e205Da0fFc594433BB87e41039be5d1f01, - 0x49E11668EAc15896ecF5B31baeF63C98897D4263, - 0x58C4d4688E0Bc92eF8d81fb963Bca2EaA5DFc31C, - 0x59e3D532727221ac3aeE2D6303cf3C39F1De65D7, - 0x63765e904777E0e13F0cE46A63B2feCf920681aA, - 0x79A4963f8b2f8d997908615352A44192Bc3D23e7, - 0xC62B23864c1e909868471bf72Cc457397BC52E13 - ]; - address[] arb_unstableCoinMarkets = [ - 0x2706f663C6e6a0AF2e1c16f7e0d2CcC85758d92c, - 0x4B66219eCcE3AD157A31B9E584beFDc798b556A1, - 0xA016DecA4AbdB8fd94BC221a5feB15BA3DB62031, - 0xa93A81835DAb4AC07649506B88AF7eE6DDaD03Ba, - 0xcc60D097222f45538159D43681FBa4B1fD37DE97 - ]; - address arb_accessManagerAddr = 0xFaD175CAf9B0Ac0EBca3B1816ec799884EB04B9c; - - uint32 ref_stable = 0.06e8; - uint32 ref_unstable = 0.03e8; - // uint32 mint_gt_fee_stable = 0.1e8; - // uint32 mint_gt_fee_unstable = 0.1e8; - - uint256 operatorPrivateKey; - address operator; - - function setUp() public { - // Load network from environment variable - network = vm.envString("NETWORK"); - string memory networkUpper = StringHelper.toUpper(network); - - // Load network-specific configuration - string memory operatorPrivateKeyPrivateKeyVar = string.concat(networkUpper, "_OPERATOR_PRIVATE_KEY"); - - operatorPrivateKey = vm.envUint(operatorPrivateKeyPrivateKeyVar); - operator = vm.addr(operatorPrivateKey); - } - - function run() public { - if (keccak256(abi.encodePacked(network)) == keccak256(abi.encodePacked("eth-mainnet"))) { - updateEth(); - } else if (keccak256(abi.encodePacked(network)) == keccak256(abi.encodePacked("arb-mainnet"))) { - updateArb(); - } - } - - function updateArb() internal { - console.log("=== Configuration ==="); - console.log("Network:", network); - console.log("Operator:", operator); - console.log("AccessManager:", arb_accessManagerAddr); - console.log(""); - - console.log("=== Update markets fees ==="); - - vm.startBroadcast(operatorPrivateKey); - IAccessManager accessManager = IAccessManager(arb_accessManagerAddr); - - for (uint256 i = 0; i < arb_stableCoinMarkets.length; i++) { - address market = arb_stableCoinMarkets[i]; - ITermMaxMarket termMaxMarket = ITermMaxMarket(market); - MarketConfig memory config = termMaxMarket.config(); - - config.feeConfig.mintGtFeeRef = ref_stable; - // config.feeConfig.mintGtFeeRatio = mint_gt_fee_stable; - accessManager.updateMarketConfig(termMaxMarket, config); - config = termMaxMarket.config(); - console.log("market", market); - console.log("mintGtFeeRef", config.feeConfig.mintGtFeeRef); - } - - for (uint256 i = 0; i < arb_unstableCoinMarkets.length; i++) { - address market = arb_unstableCoinMarkets[i]; - ITermMaxMarket termMaxMarket = ITermMaxMarket(market); - MarketConfig memory config = termMaxMarket.config(); - - config.feeConfig.mintGtFeeRef = ref_unstable; - // config.feeConfig.mintGtFeeRatio = mint_gt_fee_unstable; - accessManager.updateMarketConfig(termMaxMarket, config); - config = termMaxMarket.config(); - console.log("market", market); - console.log("mintGtFeeRef", config.feeConfig.mintGtFeeRef); - } - vm.stopBroadcast(); - } - - function updateEth() internal { - console.log("=== Configuration ==="); - console.log("Network:", network); - console.log("Operator:", operator); - console.log("AccessManager:", eth_accessManagerAddr); - console.log(""); - - console.log("=== Update markets fees ==="); - - vm.startBroadcast(operatorPrivateKey); - IAccessManager accessManager = IAccessManager(eth_accessManagerAddr); - - for (uint256 i = 0; i < eth_stableCoinMarkets.length; i++) { - address market = eth_stableCoinMarkets[i]; - ITermMaxMarket termMaxMarket = ITermMaxMarket(market); - MarketConfig memory config = termMaxMarket.config(); - - config.feeConfig.mintGtFeeRef = ref_stable; - // config.feeConfig.mintGtFeeRatio = mint_gt_fee_stable; - accessManager.updateMarketConfig(termMaxMarket, config); - config = termMaxMarket.config(); - console.log("market", market); - console.log("mintGtFeeRef", config.feeConfig.mintGtFeeRef); - } - - for (uint256 i = 0; i < eth_unstableCoinMarkets.length; i++) { - address market = eth_unstableCoinMarkets[i]; - ITermMaxMarket termMaxMarket = ITermMaxMarket(market); - MarketConfig memory config = termMaxMarket.config(); - - config.feeConfig.mintGtFeeRef = ref_unstable; - // config.feeConfig.mintGtFeeRatio = mint_gt_fee_unstable; - accessManager.updateMarketConfig(termMaxMarket, config); - config = termMaxMarket.config(); - console.log("market", market); - console.log("mintGtFeeRef", config.feeConfig.mintGtFeeRef); - } - vm.stopBroadcast(); - } -} diff --git a/script/UpdateSingleGTCapacity.s.sol b/script/UpdateSingleGTCapacity.s.sol deleted file mode 100644 index 4078901..0000000 --- a/script/UpdateSingleGTCapacity.s.sol +++ /dev/null @@ -1,145 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {Script} from "forge-std/Script.sol"; -import {console2} from "forge-std/console2.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; - -// Interface for the Access Manager -interface IAccessManager { - function updateGtConfig(address market, bytes memory configData) external; - function CONFIGURATOR_ROLE() external view returns (bytes32); - function hasRole(bytes32 role, address account) external view returns (bool); -} - -// Interface for TermMax Market -interface ITermMaxMarket { - function tokens() external view returns (IERC20, IERC20, address, address, IERC20); -} - -// Interface for Gearing Token -interface IGearingToken { - function collateralCapacity() external view returns (uint256); -} - -/** - * @title UpdateSingleGTCapacity - * @notice Forge script to update a single GT collateral capacity through the access manager using global variables - * @dev All configuration values (addresses, new capacity) are set as global variables in the script - */ -contract UpdateSingleGTCapacity is Script { - // CONFIGURATION - Update these values before running the script - // =============================================================== - - // The address of the AccessManager contract - address public constant ACCESS_MANAGER_ADDRESS = 0xDA4aAF85Bb924B53DCc2DFFa9e1A9C2Ef97aCFDF; // Mainnet - - // The address of the Market contract to update - address public constant MARKET_ADDRESS = 0x9D7386F68d9001a809860B4D88EC8E2cc3DD81B0; // Example - Replace with actual market address - - // The new collateral capacity value (in wei) to set for the GT - uint256 public constant NEW_GT_CAPACITY = 5000000e18; // Example: 1,000,000 tokens with 18 decimals - - // Private key environment variable name - string public constant PRIVATE_KEY_ENV_VAR = "ETH_MAINNET_DEPLOYER_PRIVATE_KEY"; - // =============================================================== - - function setUp() public { - // Nothing to set up - } - - function run() public { - // Validate configuration - require(ACCESS_MANAGER_ADDRESS != address(0), "Access Manager address not set"); - require(MARKET_ADDRESS != address(0), "Market address not set"); - require(NEW_GT_CAPACITY > 0, "New capacity must be greater than 0"); - - // Load private key for transaction signing - uint256 deployerPrivateKey = vm.envUint(PRIVATE_KEY_ENV_VAR); - address deployer = vm.addr(deployerPrivateKey); - - // Print script configuration - printConfiguration(deployer); - - // Check if deployer has configurator role - IAccessManager accessManager = IAccessManager(ACCESS_MANAGER_ADDRESS); - bytes32 configuratorRole = accessManager.CONFIGURATOR_ROLE(); - bool hasRole = accessManager.hasRole(configuratorRole, deployer); - - if (!hasRole) { - console2.log("ERROR: Deployer does not have CONFIGURATOR_ROLE. Cannot update GT config."); - return; - } - - // Get GT contract address from market - ITermMaxMarket market = ITermMaxMarket(MARKET_ADDRESS); - address gtAddress; - try market.tokens() returns (IERC20 ft, IERC20 xt, address gt, address collateralAddr, IERC20 underlying) { - gtAddress = gt; - console2.log(string.concat("GT Name: ", IERC20Metadata(gtAddress).name())); - console2.log(string.concat("GT Address: ", vm.toString(gtAddress))); - console2.log(string.concat("Collateral Address: ", vm.toString(collateralAddr))); - console2.log(string.concat("Underlying Address: ", vm.toString(address(underlying)))); - } catch { - console2.log("ERROR: Failed to get token addresses from market."); - return; - } - - // Get current collateral capacity for comparison - IGearingToken gt = IGearingToken(gtAddress); - uint256 currentCapacity; - try gt.collateralCapacity() returns (uint256 capacity) { - currentCapacity = capacity; - console2.log(string.concat("Current GT capacity: ", vm.toString(currentCapacity))); - } catch { - console2.log("WARNING: Could not retrieve current capacity (continuing anyway)"); - } - - // Encode new capacity as config data - bytes memory configData = abi.encode(NEW_GT_CAPACITY); - - // Start broadcasting transactions - vm.startBroadcast(deployerPrivateKey); - - // Update GT config through access manager - try accessManager.updateGtConfig(MARKET_ADDRESS, configData) { - console2.log("Successfully sent updateGtConfig transaction."); - } catch Error(string memory reason) { - console2.log(string.concat("Failed to update GT config: ", reason)); - vm.stopBroadcast(); - return; - } catch { - console2.log("Failed to update GT config: Unknown error"); - vm.stopBroadcast(); - return; - } - - vm.stopBroadcast(); - - // Verify the update (this will only work with local simulations or --slow flag) - try gt.collateralCapacity() returns (uint256 updatedCapacity) { - console2.log(string.concat("Updated GT capacity: ", vm.toString(updatedCapacity))); - if (updatedCapacity == NEW_GT_CAPACITY) { - console2.log("[SUCCESS] GT collateral capacity successfully updated!"); - } else { - console2.log( - "[WARNING] Note: Updated capacity doesn't match specified capacity. This may be normal if verifying against a fork." - ); - } - } catch { - console2.log( - "Note: Could not verify the updated capacity. This is normal when broadcasting to live networks." - ); - } - } - - function printConfiguration(address deployer) internal view { - console2.log("=== Update Single GT Capacity Configuration ==="); - console2.log(string.concat("Access Manager: ", vm.toString(ACCESS_MANAGER_ADDRESS))); - console2.log(string.concat("Market Address: ", vm.toString(MARKET_ADDRESS))); - console2.log(string.concat("New GT Capacity: ", vm.toString(NEW_GT_CAPACITY))); - console2.log(string.concat("Deployer: ", vm.toString(deployer))); - console2.log("=============================================="); - } -} diff --git a/script/convertMarketConfigs.ts b/script/convertMarketConfigs.ts deleted file mode 100644 index e4bf93f..0000000 --- a/script/convertMarketConfigs.ts +++ /dev/null @@ -1,214 +0,0 @@ -import fs from 'fs'; -import path from 'path'; -import { parse } from 'csv-parse/sync'; -import { DeployConfig, MarketData } from './utils/types'; - -// Parse command line arguments -const args = process.argv.slice(2); - -// Check if required arguments are provided -if (args.length < 2) { - console.error('Usage: ts-node script/convertMarketConfigs.ts '); - console.error('Example: ts-node script/convertMarketConfigs.ts script/deploy/deploydata/eth-mainnet.csv script/deploy/deploydata/eth-mainnet.json'); - process.exit(1); -} - -const inputCsvPath = args[0]; -const outputJsonPath = args[1]; - -// Read the CSV file -console.log(`Reading CSV from: ${inputCsvPath}`); -const csvContent = fs.readFileSync(inputCsvPath, 'utf-8'); - -// Parse CSV -const records = parse(csvContent, { - columns: (headers: string[]) => { - // Skip the first row (which contains section headers) - return headers.map((header, index) => { - // Map the columns based on their position - switch (index) { - case 0: return 'marketType'; - case 1: return 'salt'; - case 2: return 'collateralCapForGt'; - case 3: return 'maturity'; - case 4: return 'lendTakerFeeRatio'; - case 5: return 'lendMakerFeeRatio'; - case 6: return 'borrowTakerFeeRatio'; - case 7: return 'borrowMakerFeeRatio'; - case 8: return 'mintGtFeeRatio'; - case 9: return 'mintGtFeeRef'; - case 10: return 'liquidationLtv'; - case 11: return 'maxLtv'; - case 12: return 'liquidatable'; - case 13: return 'underlyingTokenAddr'; - case 14: return 'underlyingPriceFeedAddr'; - case 15: return 'underlyingHeartBeat'; - case 16: return 'underlyingBackupPriceFeedAddr'; - case 17: return 'underlyingName'; - case 18: return 'underlyingSymbol'; - case 19: return 'underlyingDecimals'; - case 20: return 'underlyingInitialPrice'; - case 21: return 'collateralTokenAddr'; - case 22: return 'collateralPriceFeedAddr'; - case 23: return 'collateralHeartBeat'; - case 24: return 'collateralBackupPriceFeedAddr'; - case 25: return 'collateralName'; - case 26: return 'collateralSymbol'; - case 27: return 'collateralDecimals'; - case 28: return 'collateralInitialPrice'; - case 29: return 'gtKeyIdentifier'; - // Skip the note column (30) by not mapping it - default: return `column${index}`; - } - }); - }, - skip_empty_lines: true, - trim: true, - from: 2 // Skip the first row (section headers) -}); - -// Convert to required format -const deployConfig: DeployConfig = { - configNum: records.length.toString(), - configs: {} -}; - -// Parse number with commas to a clean string -function parseNumberWithCommas(value: string): string { - if (!value) return ""; // Return empty string instead of default value - // Remove all commas and non-numeric characters except decimal point - return value.replace(/,/g, '').trim(); -} - -records.forEach((record: any, index: number) => { - try { - // console.log(`Processing record ${index + 1}...`); - - // Debug log column names for the first record - if (index === 0) { - console.log('CSV Column Headers:', Object.keys(record)); - } - - // Parse collateralCapForGt (remove commas) - const collateralCapForGt = parseNumberWithCommas(record['collateralCapForGt']); - - // Use the gtKeyIdentifier directly from CSV - // Default to "GearingTokenWithERC20" if not provided - const gtKeyIdentifier = record['gtKeyIdentifier'] || "GearingTokenWithERC20"; - - const marketData: MarketData = { - salt: parseInt(record['salt'] || '0'), - collateralCapForGt: collateralCapForGt, - marketConfig: { - maturity: record['maturity'] || '', - lendTakerFeeRatio: record['lendTakerFeeRatio'] || '', - lendMakerFeeRatio: record['lendMakerFeeRatio'] || '', - borrowTakerFeeRatio: record['borrowTakerFeeRatio'] || '', - borrowMakerFeeRatio: record['borrowMakerFeeRatio'] || '', - mintGtFeeRatio: record['mintGtFeeRatio'] || '', - mintGtFeeRef: record['mintGtFeeRef'] || '' - }, - loanConfig: { - liquidationLtv: record['liquidationLtv'] || '', - maxLtv: record['maxLtv'] || '', - liquidatable: (record['liquidatable'] || '').toUpperCase() === 'TRUE' - }, - underlyingConfig: { - tokenAddr: record['underlyingTokenAddr'] || '', - priceFeedAddr: record['underlyingPriceFeedAddr'] || '', - backupPriceFeedAddr: record['underlyingBackupPriceFeedAddr'] || '', - heartBeat: record['underlyingHeartBeat'] || '86400', - name: record['underlyingName'] || '', - symbol: record['underlyingSymbol'] || '', - decimals: record['underlyingDecimals'] || '', - initialPrice: convertToBaseUnit(record['underlyingInitialPrice'] || '0') - }, - collateralConfig: { - tokenAddr: record['collateralTokenAddr'] || '', - priceFeedAddr: record['collateralPriceFeedAddr'] || '', - backupPriceFeedAddr: record['collateralBackupPriceFeedAddr'] || '', - heartBeat: record['collateralHeartBeat'] || '3600', - name: record['collateralName'] || '', - symbol: record['collateralSymbol'] || '', - decimals: record['collateralDecimals'] || '', - initialPrice: convertToBaseUnit(record['collateralInitialPrice'] || '0'), - gtKeyIdentifier: gtKeyIdentifier - } - }; - - // Add market name and symbol (derived from tokens) - const collateralSymbol = record['collateralSymbol'] || ''; - const underlyingSymbol = record['underlyingSymbol'] || ''; - const maturity = record['maturity'] || ''; - - // Convert timestamp to human readable date format (DDMMMYYYY) - const maturityDate = new Date(parseInt(maturity) * 1000); - const day = maturityDate.getUTCDate().toString().padStart(2, '0'); - const month = maturityDate.toLocaleString('en-US', { month: 'short' }).toUpperCase(); - const year = maturityDate.getUTCFullYear(); - const formattedDate = `${day}${month}${year}`; - - marketData.marketName = `${underlyingSymbol}/${collateralSymbol}@${formattedDate}`; - marketData.marketSymbol = `${underlyingSymbol}/${collateralSymbol}@${formattedDate}`; - - // Debug log for the first record - if (index === 0) { - console.log('First record data:', record); - console.log('Processed market data:', marketData); - console.log('Price Feed Addresses:'); - console.log(`Underlying Price Feed: ${record['underlyingPriceFeedAddr']}`); - console.log(`Underlying Backup Price Feed: ${record['underlyingBackupPriceFeedAddr']}`); - console.log(`Collateral Price Feed: ${record['collateralPriceFeedAddr']}`); - console.log(`Collateral Backup Price Feed: ${record['collateralBackupPriceFeedAddr']}`); - console.log('Heartbeat Values:'); - console.log(`Underlying Heartbeat: ${record['underlyingHeartBeat'] || '86400'} (default: 86400 if not specified)`); - console.log(`Collateral Heartbeat: ${record['collateralHeartBeat'] || '3600'} (default: 3600 if not specified)`); - } - const collateralCapAmt = BigInt(collateralCapForGt || '0') / (BigInt(10) ** BigInt(parseInt(record['collateralDecimals'] || '18'))); - const collateralCapVault = BigInt(collateralCapForGt || '0') * BigInt(parseInt(convertToBaseUnit(record['collateralInitialPrice'] || '0'))) / (BigInt(10) ** BigInt(parseInt(record['collateralDecimals'] || '18'))) / BigInt(10 ** 8); - console.log(`Collateral Symbol:`, record['collateralSymbol']); - console.log(`Collateral Initial Price:`, record['collateralInitialPrice']); - console.log(`Collateral Cap Amt:`, collateralCapAmt); - console.log(`Collateral Cap Vault: ${collateralCapVault}`); - - deployConfig.configs[`configs_${index}`] = marketData; - } catch (error) { - console.error(`Error processing record ${index + 1}:`, error); - console.error('Record data:', record); - throw error; - } -}); - -// Helper function to convert price to base units with 8 decimals -function convertToBaseUnit(price: string): string { - try { - const priceNum = parseFloat(price); - if (isNaN(priceNum)) { - console.warn(`Warning: Invalid price (${price}), using 0`); - return '0'; - } - const PRICE_DECIMALS = 8; // Always use 8 decimals for prices - const multiplier = Math.pow(10, PRICE_DECIMALS); - const result = Math.floor(priceNum * multiplier); - // Convert to string and ensure it's in full decimal notation - return result.toLocaleString('fullwide', { useGrouping: false }); - } catch (error) { - console.error('Error converting price to base units:', error); - return '0'; - } -} - -// Create directory if it doesn't exist -const outputDir = path.dirname(outputJsonPath); -if (!fs.existsSync(outputDir)) { - fs.mkdirSync(outputDir, { recursive: true }); -} - -// Write to JSON file -fs.writeFileSync( - outputJsonPath, - JSON.stringify(deployConfig, null, 2), - 'utf-8' -); - -console.log(`Conversion complete. Output written to ${outputJsonPath}`); \ No newline at end of file diff --git a/script/deploy/DeployAccessManager.s.sol b/script/deploy/DeployAccessManager.s.sol index d56bc74..85c8364 100644 --- a/script/deploy/DeployAccessManager.s.sol +++ b/script/deploy/DeployAccessManager.s.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.27; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {AccessManager} from "contracts/access/AccessManager.sol"; +import {AccessManager} from "contracts/v1/access/AccessManager.sol"; import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; import {DeployBase} from "./DeployBase.s.sol"; diff --git a/script/deploy/DeployCore.s.sol b/script/deploy/DeployCore.s.sol index 27afc9f..bde99d9 100644 --- a/script/deploy/DeployCore.s.sol +++ b/script/deploy/DeployCore.s.sol @@ -4,29 +4,29 @@ pragma solidity ^0.8.27; import {Script} from "forge-std/Script.sol"; import {VmSafe} from "forge-std/Vm.sol"; import "forge-std/console.sol"; -import {TermMaxFactory} from "contracts/factory/TermMaxFactory.sol"; -import {ITermMaxFactory} from "contracts/factory/ITermMaxFactory.sol"; -import {ITermMaxRouter} from "contracts/router/ITermMaxRouter.sol"; -import {MarketViewer} from "contracts/router/MarketViewer.sol"; +import {TermMaxFactory} from "contracts/v1/factory/TermMaxFactory.sol"; +import {ITermMaxFactory} from "contracts/v1/factory/ITermMaxFactory.sol"; +import {ITermMaxRouter} from "contracts/v1/router/ITermMaxRouter.sol"; +import {MarketViewer} from "contracts/v1/router/MarketViewer.sol"; import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; -import {TermMaxMarket} from "contracts/TermMaxMarket.sol"; -import {MockERC20} from "contracts/test/MockERC20.sol"; -import {MockPriceFeed} from "contracts/test/MockPriceFeed.sol"; -import {MarketConfig} from "contracts/storage/TermMaxStorage.sol"; -import {IMintableERC20} from "contracts/tokens/IMintableERC20.sol"; +import {TermMaxMarket} from "contracts/v1/TermMaxMarket.sol"; +import {MockERC20} from "contracts/v1/test/MockERC20.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {MarketConfig} from "contracts/v1/storage/TermMaxStorage.sol"; +import {IMintableERC20} from "contracts/v1/tokens/IMintableERC20.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; -import {SwapAdapter} from "contracts/test/testnet/SwapAdapter.sol"; -import {Faucet} from "contracts/test/testnet/Faucet.sol"; +import {SwapAdapter} from "contracts/v1/test/testnet/SwapAdapter.sol"; +import {Faucet} from "contracts/v1/test/testnet/Faucet.sol"; import {DeployBase} from "./DeployBase.s.sol"; -import {IOracle} from "contracts/oracle/IOracle.sol"; -import {VaultFactory, IVaultFactory} from "contracts/factory/VaultFactory.sol"; -import {KyberswapV2Adapter} from "contracts/router/swapAdapters/KyberswapV2Adapter.sol"; -import {OdosV2Adapter} from "contracts/router/swapAdapters/OdosV2Adapter.sol"; -import {PendleSwapV3Adapter} from "contracts/router/swapAdapters/PendleSwapV3Adapter.sol"; -import {UniswapV3Adapter} from "contracts/router/swapAdapters/UniswapV3Adapter.sol"; -import {ERC4626VaultAdapter} from "contracts/router/swapAdapters/ERC4626VaultAdapter.sol"; -import {AccessManager} from "contracts/access/AccessManager.sol"; +import {IOracle} from "contracts/v1/oracle/IOracle.sol"; +import {VaultFactory, IVaultFactory} from "contracts/v1/factory/VaultFactory.sol"; +import {KyberswapV2Adapter} from "contracts/v1/router/swapAdapters/KyberswapV2Adapter.sol"; +import {OdosV2Adapter} from "contracts/v1/router/swapAdapters/OdosV2Adapter.sol"; +import {PendleSwapV3Adapter} from "contracts/v1/router/swapAdapters/PendleSwapV3Adapter.sol"; +import {UniswapV3Adapter} from "contracts/v1/router/swapAdapters/UniswapV3Adapter.sol"; +import {ERC4626VaultAdapter} from "contracts/v1/router/swapAdapters/ERC4626VaultAdapter.sol"; +import {AccessManager} from "contracts/v1/access/AccessManager.sol"; contract DeployCore is DeployBase { // Network-specific config loaded from environment variables diff --git a/script/deploy/DeployMarket.s.sol b/script/deploy/DeployMarket.s.sol index a76fc01..4ea79d1 100644 --- a/script/deploy/DeployMarket.s.sol +++ b/script/deploy/DeployMarket.s.sol @@ -3,25 +3,25 @@ pragma solidity ^0.8.27; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {TermMaxFactory} from "contracts/factory/TermMaxFactory.sol"; -import {ITermMaxFactory} from "contracts/factory/ITermMaxFactory.sol"; -import {TermMaxRouter} from "contracts/router/TermMaxRouter.sol"; +import {TermMaxFactory} from "contracts/v1/factory/TermMaxFactory.sol"; +import {ITermMaxFactory} from "contracts/v1/factory/ITermMaxFactory.sol"; +import {TermMaxRouter} from "contracts/v1/router/TermMaxRouter.sol"; import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; -import {TermMaxMarket} from "contracts/TermMaxMarket.sol"; -import {MockERC20} from "contracts/test/MockERC20.sol"; -import {MockPriceFeed} from "contracts/test/MockPriceFeed.sol"; -import {MockPriceFeed} from "contracts/test/MockPriceFeed.sol"; -import {MarketConfig} from "contracts/storage/TermMaxStorage.sol"; -import {IMintableERC20} from "contracts/tokens/IMintableERC20.sol"; -import {IGearingToken} from "contracts/tokens/IGearingToken.sol"; -import {IOracle} from "contracts/oracle/IOracle.sol"; -import {OracleAggregator} from "contracts/oracle/OracleAggregator.sol"; +import {TermMaxMarket} from "contracts/v1/TermMaxMarket.sol"; +import {MockERC20} from "contracts/v1/test/MockERC20.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {MarketConfig} from "contracts/v1/storage/TermMaxStorage.sol"; +import {IMintableERC20} from "contracts/v1/tokens/IMintableERC20.sol"; +import {IGearingToken} from "contracts/v1/tokens/IGearingToken.sol"; +import {IOracle} from "contracts/v1/oracle/IOracle.sol"; +import {OracleAggregator} from "contracts/v1/oracle/OracleAggregator.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; -import {MockSwapAdapter} from "contracts/test/MockSwapAdapter.sol"; +import {MockSwapAdapter} from "contracts/v1/test/MockSwapAdapter.sol"; import {JsonLoader} from "../utils/JsonLoader.sol"; -import {Faucet} from "contracts/test/testnet/Faucet.sol"; -import {FaucetERC20} from "contracts/test/testnet/FaucetERC20.sol"; +import {Faucet} from "contracts/v1/test/testnet/Faucet.sol"; +import {FaucetERC20} from "contracts/v1/test/testnet/FaucetERC20.sol"; import {DeployBase} from "./DeployBase.s.sol"; import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; import {StringHelper} from "../utils/StringHelper.sol"; diff --git a/script/deploy/DeployMarketViewer.s.sol b/script/deploy/DeployMarketViewer.s.sol index c862d87..094860e 100644 --- a/script/deploy/DeployMarketViewer.s.sol +++ b/script/deploy/DeployMarketViewer.s.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.27; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {MarketViewer} from "../../contracts/router/MarketViewer.sol"; +import {MarketViewer} from "contracts/v1/router/MarketViewer.sol"; import {StringHelper} from "../utils/StringHelper.sol"; contract DeployMarketViewer is Script { diff --git a/script/deploy/DeployOracleAggregator.s.sol b/script/deploy/DeployOracleAggregator.s.sol index b4b5d45..001b96b 100644 --- a/script/deploy/DeployOracleAggregator.s.sol +++ b/script/deploy/DeployOracleAggregator.s.sol @@ -4,29 +4,29 @@ pragma solidity ^0.8.27; import {Script} from "forge-std/Script.sol"; import {VmSafe} from "forge-std/Vm.sol"; import "forge-std/console.sol"; -import {TermMaxFactory} from "contracts/factory/TermMaxFactory.sol"; -import {ITermMaxFactory} from "contracts/factory/ITermMaxFactory.sol"; -import {ITermMaxRouter} from "contracts/router/ITermMaxRouter.sol"; -import {MarketViewer} from "contracts/router/MarketViewer.sol"; +import {TermMaxFactory} from "contracts/v1/factory/TermMaxFactory.sol"; +import {ITermMaxFactory} from "contracts/v1/factory/ITermMaxFactory.sol"; +import {ITermMaxRouter} from "contracts/v1/router/ITermMaxRouter.sol"; +import {MarketViewer} from "contracts/v1/router/MarketViewer.sol"; import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; -import {TermMaxMarket} from "contracts/TermMaxMarket.sol"; -import {MockERC20} from "contracts/test/MockERC20.sol"; -import {MockPriceFeed} from "contracts/test/MockPriceFeed.sol"; -import {MarketConfig} from "contracts/storage/TermMaxStorage.sol"; -import {IMintableERC20} from "contracts/tokens/IMintableERC20.sol"; +import {TermMaxMarket} from "contracts/v1/TermMaxMarket.sol"; +import {MockERC20} from "contracts/v1/test/MockERC20.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {MarketConfig} from "contracts/v1/storage/TermMaxStorage.sol"; +import {IMintableERC20} from "contracts/v1/tokens/IMintableERC20.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; -import {SwapAdapter} from "contracts/test/testnet/SwapAdapter.sol"; -import {Faucet} from "contracts/test/testnet/Faucet.sol"; +import {SwapAdapter} from "contracts/v1/test/testnet/SwapAdapter.sol"; +import {Faucet} from "contracts/v1/test/testnet/Faucet.sol"; import {DeployBase} from "./DeployBase.s.sol"; -import {IOracle} from "contracts/oracle/IOracle.sol"; -import {VaultFactory, IVaultFactory} from "contracts/factory/VaultFactory.sol"; -import {KyberswapV2Adapter} from "contracts/router/swapAdapters/KyberswapV2Adapter.sol"; -import {OdosV2Adapter} from "contracts/router/swapAdapters/OdosV2Adapter.sol"; -import {PendleSwapV3Adapter} from "contracts/router/swapAdapters/PendleSwapV3Adapter.sol"; -import {UniswapV3Adapter} from "contracts/router/swapAdapters/UniswapV3Adapter.sol"; -import {ERC4626VaultAdapter} from "contracts/router/swapAdapters/ERC4626VaultAdapter.sol"; -import {AccessManager} from "contracts/access/AccessManager.sol"; +import {IOracle} from "contracts/v1/oracle/IOracle.sol"; +import {VaultFactory, IVaultFactory} from "contracts/v1/factory/VaultFactory.sol"; +import {KyberswapV2Adapter} from "contracts/v1/router/swapAdapters/KyberswapV2Adapter.sol"; +import {OdosV2Adapter} from "contracts/v1/router/swapAdapters/OdosV2Adapter.sol"; +import {PendleSwapV3Adapter} from "contracts/v1/router/swapAdapters/PendleSwapV3Adapter.sol"; +import {UniswapV3Adapter} from "contracts/v1/router/swapAdapters/UniswapV3Adapter.sol"; +import {ERC4626VaultAdapter} from "contracts/v1/router/swapAdapters/ERC4626VaultAdapter.sol"; +import {AccessManager} from "contracts/v1/access/AccessManager.sol"; contract DeployCore is DeployBase { // Network-specific config loaded from environment variables diff --git a/script/deploy/DeployOrder.s.sol b/script/deploy/DeployOrder.s.sol index e35c4bc..d46a16a 100644 --- a/script/deploy/DeployOrder.s.sol +++ b/script/deploy/DeployOrder.s.sol @@ -3,26 +3,26 @@ pragma solidity ^0.8.27; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {TermMaxFactory} from "contracts/factory/TermMaxFactory.sol"; -import {ITermMaxFactory} from "contracts/factory/ITermMaxFactory.sol"; -import {TermMaxRouter} from "contracts/router/TermMaxRouter.sol"; +import {TermMaxFactory} from "contracts/v1/factory/TermMaxFactory.sol"; +import {ITermMaxFactory} from "contracts/v1/factory/ITermMaxFactory.sol"; +import {TermMaxRouter} from "contracts/v1/router/TermMaxRouter.sol"; import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; -import {TermMaxMarket} from "contracts/TermMaxMarket.sol"; -import {TermMaxOrder, ISwapCallback} from "contracts/TermMaxOrder.sol"; -import {ITermMaxOrder} from "contracts/TermMaxOrder.sol"; -import {MockERC20} from "contracts/test/MockERC20.sol"; -import {MockPriceFeed} from "contracts/test/MockPriceFeed.sol"; -import {MockPriceFeed} from "contracts/test/MockPriceFeed.sol"; -import {MarketConfig, OrderConfig, CurveCuts, CurveCut} from "contracts/storage/TermMaxStorage.sol"; -import {IMintableERC20} from "contracts/tokens/IMintableERC20.sol"; -import {IGearingToken} from "contracts/tokens/IGearingToken.sol"; -import {IOracle} from "contracts/oracle/IOracle.sol"; +import {TermMaxMarket} from "contracts/v1/TermMaxMarket.sol"; +import {TermMaxOrder, ISwapCallback} from "contracts/v1/TermMaxOrder.sol"; +import {ITermMaxOrder} from "contracts/v1/TermMaxOrder.sol"; +import {MockERC20} from "contracts/v1/test/MockERC20.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {MarketConfig, OrderConfig, CurveCuts, CurveCut} from "contracts/v1/storage/TermMaxStorage.sol"; +import {IMintableERC20} from "contracts/v1/tokens/IMintableERC20.sol"; +import {IGearingToken} from "contracts/v1/tokens/IGearingToken.sol"; +import {IOracle} from "contracts/v1/oracle/IOracle.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; -import {MockSwapAdapter} from "contracts/test/MockSwapAdapter.sol"; +import {MockSwapAdapter} from "contracts/v1/test/MockSwapAdapter.sol"; import {JsonLoader} from "../utils/JsonLoader.sol"; -import {Faucet} from "contracts/test/testnet/Faucet.sol"; -import {FaucetERC20} from "contracts/test/testnet/FaucetERC20.sol"; +import {Faucet} from "contracts/v1/test/testnet/Faucet.sol"; +import {FaucetERC20} from "contracts/v1/test/testnet/FaucetERC20.sol"; import {DeployBase} from "./DeployBase.s.sol"; import {StringHelper} from "../utils/StringHelper.sol"; diff --git a/script/deploy/DeployOrderArbSepolia.s.sol b/script/deploy/DeployOrderArbSepolia.s.sol deleted file mode 100644 index be04775..0000000 --- a/script/deploy/DeployOrderArbSepolia.s.sol +++ /dev/null @@ -1,99 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; -import {TermMaxFactory} from "contracts/factory/TermMaxFactory.sol"; -import {ITermMaxFactory} from "contracts/factory/ITermMaxFactory.sol"; -import {TermMaxRouter} from "contracts/router/TermMaxRouter.sol"; -import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; -import {TermMaxMarket} from "contracts/TermMaxMarket.sol"; -import {TermMaxOrder, ISwapCallback} from "contracts/TermMaxOrder.sol"; -import {ITermMaxOrder} from "contracts/TermMaxOrder.sol"; -import {MockERC20} from "contracts/test/MockERC20.sol"; -import {MockPriceFeed} from "contracts/test/MockPriceFeed.sol"; -import {MockPriceFeed} from "contracts/test/MockPriceFeed.sol"; -import {MarketConfig, OrderConfig, CurveCuts, CurveCut} from "contracts/storage/TermMaxStorage.sol"; -import {IMintableERC20} from "contracts/tokens/IMintableERC20.sol"; -import {IGearingToken} from "contracts/tokens/IGearingToken.sol"; -import {IOracle} from "contracts/oracle/IOracle.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; -import {MockSwapAdapter} from "contracts/test/MockSwapAdapter.sol"; -import {JsonLoader} from "../utils/JsonLoader.sol"; -import {Faucet} from "contracts/test/testnet/Faucet.sol"; -import {FaucetERC20} from "contracts/test/testnet/FaucetERC20.sol"; -import {DeployBase} from "./DeployBase.s.sol"; -import {StringHelper} from "../utils/StringHelper.sol"; - -contract DeloyOrderArbSepolia is DeployBase { - // Network-specific config loaded from environment variables - string network; - uint256 deployerPrivateKey; - address deployerAddr; - address adminAddr; - address priceFeedOperatorAddr; - - // address config - address marketAddr = address(0xD0586B5a5F97347C769983C404348346FE26f38e); - - function setUp() public { - // Load network from environment variable - network = vm.envString("NETWORK"); - string memory networkUpper = StringHelper.toUpper(network); - - // Load network-specific configuration - string memory privateKeyVar = string.concat(networkUpper, "_DEPLOYER_PRIVATE_KEY"); - string memory adminVar = string.concat(networkUpper, "_ADMIN_ADDRESS"); - string memory priceFeedOperatorVar = string.concat(networkUpper, "_PRICE_FEED_OPERATOR_ADDRESS"); - - deployerPrivateKey = vm.envUint(privateKeyVar); - deployerAddr = vm.addr(deployerPrivateKey); - adminAddr = vm.envAddress(adminVar); - priceFeedOperatorAddr = vm.envAddress(priceFeedOperatorVar); - } - - function run() public { - uint256 currentBlockNum = block.number; - TermMaxMarket market = TermMaxMarket(marketAddr); - vm.startBroadcast(deployerPrivateKey); - uint256 maxXtReserve = 200000000000; - CurveCut memory lendCurveCut0 = CurveCut({xtReserve: 0, liqSquare: 461683991532123062272, offset: 33973665961}); - CurveCut memory lendCurveCut1 = - CurveCut({xtReserve: 9000000000, liqSquare: 425141100695200464896, offset: 32237899859}); - CurveCut memory lendCurveCut2 = - CurveCut({xtReserve: 21000000000, liqSquare: 1072059478286836826112, offset: 63540304430}); - CurveCut[] memory _lendCurveCuts = new CurveCut[](3); - _lendCurveCuts[0] = lendCurveCut0; - _lendCurveCuts[1] = lendCurveCut1; - _lendCurveCuts[2] = lendCurveCut2; - - CurveCut memory borrowCurveCut0 = - CurveCut({xtReserve: 0, liqSquare: 330638754635872993280, offset: 29116862443}); - CurveCut memory borrowCurveCut1 = - CurveCut({xtReserve: 8000000000, liqSquare: 361237873939795017728, offset: 30796362980}); - CurveCut memory borrowCurveCut2 = - CurveCut({xtReserve: 20000000000, liqSquare: 826934466947518169088, offset: 56854893632}); - CurveCut[] memory _borrowCurveCuts = new CurveCut[](3); - _borrowCurveCuts[0] = borrowCurveCut0; - _borrowCurveCuts[1] = borrowCurveCut1; - _borrowCurveCuts[2] = borrowCurveCut2; - - CurveCuts memory curveCuts = CurveCuts({lendCurveCuts: _lendCurveCuts, borrowCurveCuts: _borrowCurveCuts}); - ITermMaxOrder order = market.createOrder(deployerAddr, maxXtReserve, ISwapCallback(address(0)), curveCuts); - - vm.stopBroadcast(); - - console.log("===== Git Info ====="); - console.log("Git branch:", getGitBranch()); - console.log("Git commit hash:"); - console.logBytes(getGitCommitHash()); - console.log(); - - console.log("===== Order Info ====="); - console.log("Order Maker:", deployerAddr); - console.log("Order Address:", address(order)); - console.log("Deployed at block number:", currentBlockNum); - console.log(""); - } -} diff --git a/script/deploy/DeployPendleSwapV3Adapter.s.sol b/script/deploy/DeployPendleSwapV3Adapter.s.sol deleted file mode 100644 index b07b226..0000000 --- a/script/deploy/DeployPendleSwapV3Adapter.s.sol +++ /dev/null @@ -1,107 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; -import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; -import {DeployBase} from "./DeployBase.s.sol"; -import {PendleSwapV3Adapter} from "contracts/router/swapAdapters/PendleSwapV3Adapter.sol"; - -contract DeployAccessManager is DeployBase { - // Network-specific config loaded from environment variables - string network; - uint256 deployerPrivateKey; - address deployerAddr; - address pendleSwapV3Router; - - function setUp() public { - // Load network from environment variable - network = vm.envString("NETWORK"); - string memory networkUpper = toUpper(network); - - // Load network-specific configuration - string memory privateKeyVar = string.concat(networkUpper, "_DEPLOYER_PRIVATE_KEY"); - string memory pendleSwapV3RouterVar = string.concat(networkUpper, "_PENDLE_SWAP_V3_ROUTER_ADDRESS"); - - deployerPrivateKey = vm.envUint(privateKeyVar); - deployerAddr = vm.addr(deployerPrivateKey); - pendleSwapV3Router = vm.envAddress(pendleSwapV3RouterVar); - } - - function run() public { - console.log("Network:", network); - console.log("Deployer:", deployerAddr); - console.log("Deployer balance:", deployerAddr.balance); - console.log("PendleSwapV3Router:", pendleSwapV3Router); - - uint256 currentBlock = block.number; - uint256 currentTimestamp = block.timestamp; - - vm.startBroadcast(deployerPrivateKey); - PendleSwapV3Adapter pendleSwapV3Adapter = new PendleSwapV3Adapter(address(pendleSwapV3Router)); - - vm.stopBroadcast(); - - console.log("===== Git Info ====="); - console.log("Git branch:", getGitBranch()); - console.log("Git commit hash:"); - console.logBytes(getGitCommitHash()); - console.log(); - - console.log("===== Block Info ====="); - console.log("Block number:", currentBlock); - console.log("Block timestamp:", currentTimestamp); - console.log(); - - console.log("===== PendleSwapV3Adapter Info ====="); - console.log("PendleSwapV3Adapter deployed at:", address(pendleSwapV3Adapter)); - console.log(); - - // Write deployment results to a JSON file - string memory deploymentJson = string( - abi.encodePacked( - "{\n", - ' "network": "', - network, - '",\n', - ' "deployedAt": "', - vm.toString(block.timestamp), - '",\n', - ' "gitBranch": "', - getGitBranch(), - '",\n', - ' "gitCommitHash": "0x', - vm.toString(getGitCommitHash()), - '",\n', - ' "blockInfo": {\n', - ' "number": "', - vm.toString(currentBlock), - '",\n', - ' "timestamp": "', - vm.toString(currentTimestamp), - '"\n', - " },\n", - ' "deployer": "', - vm.toString(deployerAddr), - '",\n', - ' "contracts": {\n', - ' "pendleSwapV3Adapter": "', - vm.toString(address(pendleSwapV3Adapter)), - '"\n', - " }\n", - "}" - ) - ); - - // Create deployment directory if it doesn't exist - string memory deploymentsDir = string.concat(vm.projectRoot(), "/deployments/", network); - if (!vm.exists(deploymentsDir)) { - vm.createDir(deploymentsDir, true); - } - - // Write the JSON file - string memory filePath = string.concat(deploymentsDir, "/", network, "-pendle-swap-v3-adapter.json"); - vm.writeFile(filePath, deploymentJson); - console.log("Deployment information written to:", filePath); - } -} diff --git a/script/deploy/DeployPreTMX.s.sol b/script/deploy/DeployPreTMX.s.sol index 3bd55f6..9619edd 100644 --- a/script/deploy/DeployPreTMX.s.sol +++ b/script/deploy/DeployPreTMX.s.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.27; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {PreTMX} from "contracts/tokenomics/PreTMX.sol"; +import {PreTMX} from "contracts/v2/tokenomics/PreTMX.sol"; import {DeployBase} from "./DeployBase.s.sol"; contract DeployPreTMX is DeployBase { diff --git a/script/deploy/DeployPriceFeeds.sol b/script/deploy/DeployPriceFeeds.sol index 1d33b94..d996751 100644 --- a/script/deploy/DeployPriceFeeds.sol +++ b/script/deploy/DeployPriceFeeds.sol @@ -4,13 +4,13 @@ pragma solidity ^0.8.27; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; -import {TermMaxPriceFeedFactory} from "contracts/factory/TermMaxPriceFeedFactory.sol"; +import {TermMaxPriceFeedFactoryV2} from "contracts/v2/factory/TermMaxPriceFeedFactoryV2.sol"; contract DeployPriceFeeds is Script { function run() public { uint256 deployerPrivateKey = vm.envUint("ETH_MAINNET_DEPLOYER_PRIVATE_KEY"); vm.startBroadcast(deployerPrivateKey); - TermMaxPriceFeedFactory priceFeedFactory = new TermMaxPriceFeedFactory(); + TermMaxPriceFeedFactoryV2 priceFeedFactory = new TermMaxPriceFeedFactoryV2(); console.log("TermMaxPriceFeedFactory deployed at", address(priceFeedFactory)); // pendle deployments: https://github.com/pendle-finance/pendle-core-v2-public/blob/main/deployments/1-core.json diff --git a/script/deploy/DeployPriceFeedsArb.s.sol b/script/deploy/DeployPriceFeedsArb.s.sol deleted file mode 100644 index b1d48e6..0000000 --- a/script/deploy/DeployPriceFeedsArb.s.sol +++ /dev/null @@ -1,65 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; -import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; -import {PriceFeedFactory} from "contracts/extensions/PriceFeedFactory.sol"; - -contract DeployPriceFeedsArb is Script { - function run() public { - uint256 deployerPrivateKey = vm.envUint("DEPLOYER_PRIVATE_KEY"); - vm.startBroadcast(deployerPrivateKey); - PriceFeedFactory priceFeedFactory = new PriceFeedFactory(); - - console.log("PriceFeedFactory deployed at", address(priceFeedFactory)); - // pendle deployment: https://github.com/pendle-finance/pendle-core-v2-public/blob/main/deployments/42161-core.json - address pendlePYLpOracle = 0x9a9Fa8338dd5E5B2188006f1Cd2Ef26d921650C2; - address weEthOracle; - { - // chainlink(wstETH/ETH): https://data.chain.link/feeds/arbitrum/mainnet/wsteth-eth - // heartBeat: 86400 (24hr) - address wstEthToEth = 0xb523AE262D20A936BC152e6023996e46FDC2A95D; - // chainlink(ETH/USD): https://data.chain.link/feeds/arbitrum/mainnet/eth-usd - // heartBeat: 86400 (24hr) - address ethToUsd = 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612; - // new price feed heartBeat = max(86400, 86400) = 86400 (24hr) - AggregatorV3Interface wstEthFeed = - AggregatorV3Interface(priceFeedFactory.createPriceFeedConverter(wstEthToEth, ethToUsd)); - (, int256 answer,,,) = wstEthFeed.latestRoundData(); - console.log("wstEth price feed address", address(wstEthFeed)); - console.log("wstEth last answer", answer); - } - - { - // chainlink(weETH/ETH): https://data.chain.link/feeds/arbitrum/mainnet/weeth-eth - // heartBeat: 86400 (24hr) - address weEthToEth = 0xE141425bc1594b8039De6390db1cDaf4397EA22b; - // chainlink(ETH/USD): https://data.chain.link/feeds/arbitrum/mainnet/eth-usd - // heartBeat: 86400 (24hr) - address ethToUsd = 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612; - // new price feed heartBeat = max(86400, 86400) = 86400 (24hr) - AggregatorV3Interface weEthFeed = - AggregatorV3Interface(priceFeedFactory.createPriceFeedConverter(weEthToEth, ethToUsd)); - (, int256 answer,,,) = weEthFeed.latestRoundData(); - console.log("weEth price feed address", address(weEthFeed)); - console.log("weEth last answer", answer); - weEthOracle = address(weEthFeed); - } - - { - // pendle(PT-weETH 26JUN2025): https://app.pendle.finance/trade/markets/0xbf5e60ddf654085f80dae9dd33ec0e345773e1f8/swap?view=pt&chain=arbitrum&tab=info - address PT_weETH_26JUN2025_market = 0xBf5E60ddf654085F80DAe9DD33Ec0E345773E1F8; - // weETH/USD heartBeat: 86400 (24hr) - // new price feed heartBeat = max(86400) = 86400 (24hr) - AggregatorV3Interface ptFeed = AggregatorV3Interface( - priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, PT_weETH_26JUN2025_market, 900, weEthOracle) - ); - (, int256 answer,,,) = ptFeed.latestRoundData(); - console.log("pt_weETH_26JUN2025 price feed address", address(ptFeed)); - console.log("pt_weETH_26JUN2025 last answer", answer); - } - - vm.stopBroadcast(); - } -} diff --git a/script/deploy/DeployPriceFeedsArbBackup.s.sol b/script/deploy/DeployPriceFeedsArbBackup.s.sol deleted file mode 100644 index 72403ce..0000000 --- a/script/deploy/DeployPriceFeedsArbBackup.s.sol +++ /dev/null @@ -1,57 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; -import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; -import {PriceFeedFactory} from "contracts/extensions/PriceFeedFactory.sol"; - -contract DeployPriceFeedsArb is Script { - function run() public { - uint256 deployerPrivateKey = vm.envUint("ARB_MAINNET_DEPLOYER_PRIVATE_KEY"); - vm.startBroadcast(deployerPrivateKey); - PriceFeedFactory priceFeedFactory = new PriceFeedFactory(); - - console.log("PriceFeedFactory deployed at", address(priceFeedFactory)); - // pendle deployment: https://github.com/pendle-finance/pendle-core-v2-public/blob/main/deployments/42161-core.json - address pendlePYLpOracle = 0x9a9Fa8338dd5E5B2188006f1Cd2Ef26d921650C2; - address weEthOracle; - - { - // redstone(weETH/ETH): https://app.redstone.finance/app/feeds/?page=1&sortBy=popularity&sortDesc=false&perPage=64&search=weETH - // heartBeat: 86400 (24hr) - address weEthToEth = 0xA736eAe8805dDeFFba40cAB8c99bCB309dEaBd9B; - // eOracle(ETH/USD): https://docs.eo.app/docs/eprice/feed-addresses/arbitrum - // heartBeat: 86400 (24hr) - address ethToUsd = 0xd68AeF8Ab6D86CeC502e08Faa376297d836FdfA6; - // new price feed heartBeat = max(86400, 86400) = 86400 (24hr) - AggregatorV3Interface weEthFeed = - AggregatorV3Interface(priceFeedFactory.createPriceFeedConverter(weEthToEth, ethToUsd)); - (, int256 answer,,,) = weEthFeed.latestRoundData(); - AggregatorV3Interface weEthFeedCheck = AggregatorV3Interface(0x8f29Df42c617C222Bc2B416AC8a022E85e853276); - (, int256 answerCheck,,,) = weEthFeedCheck.latestRoundData(); - console.log("weEth price feed address", address(weEthFeed)); - console.log("weEth last answer", answer); - console.log("weEth last answer check", answerCheck); - weEthOracle = address(weEthFeed); - } - - { - // pendle(PT-weETH 26JUN2025): https://app.pendle.finance/trade/markets/0xbf5e60ddf654085f80dae9dd33ec0e345773e1f8/swap?view=pt&chain=arbitrum&tab=info - address PT_weETH_26JUN2025_market = 0xBf5E60ddf654085F80DAe9DD33Ec0E345773E1F8; - // weETH/USD heartBeat: 86400 (24hr) - // new price feed heartBeat = max(86400) = 86400 (24hr) - AggregatorV3Interface ptFeed = AggregatorV3Interface( - priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, PT_weETH_26JUN2025_market, 900, weEthOracle) - ); - (, int256 answer,,,) = ptFeed.latestRoundData(); - AggregatorV3Interface ptFeedCheck = AggregatorV3Interface(0x2a2a0e32c54670045256EBcA681887E32e689E97); - (, int256 answerCheck,,,) = ptFeedCheck.latestRoundData(); - console.log("pt_weETH_26JUN2025 price feed address", address(ptFeed)); - console.log("pt_weETH_26JUN2025 last answer", answer); - console.log("pt_weETH_26JUN2025 last answer check", answerCheck); - } - - vm.stopBroadcast(); - } -} diff --git a/script/deploy/DeployPriceFeedsEth.s.sol b/script/deploy/DeployPriceFeedsEth.s.sol deleted file mode 100644 index 2c6700e..0000000 --- a/script/deploy/DeployPriceFeedsEth.s.sol +++ /dev/null @@ -1,168 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; -import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; -import {PriceFeedFactory} from "contracts/extensions/PriceFeedFactory.sol"; - -contract DeployPriceFeeds is Script { - function run() public { - uint256 deployerPrivateKey = vm.envUint("ETH_MAINNET_DEPLOYER_PRIVATE_KEY"); - vm.startBroadcast(deployerPrivateKey); - PriceFeedFactory priceFeedFactory = new PriceFeedFactory(); - - console.log("PriceFeedFactory deployed at", address(priceFeedFactory)); - // pendle deployments: https://github.com/pendle-finance/pendle-core-v2-public/blob/main/deployments/1-core.json - address pendlePYLpOracle = 0x9a9Fa8338dd5E5B2188006f1Cd2Ef26d921650C2; - address pufferEthOracle; - { - // chainlink(pufETH/ETH): https://data.chain.link/feeds/ethereum/mainnet/pufeth-eth - // heartBeat: 86400 (24hr) - address pufferEthToEth = 0xDe3f7Dd92C4701BCf59F47235bCb61e727c45f80; - // chainlink(ETH/USD): https://data.chain.link/feeds/ethereum/mainnet/eth-usd - // heartBeat: 3600 (1hr) - address ethToUsd = 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419; - // new price feed heartBeat = max(3600, 86400) = 86400 (24hr) - AggregatorV3Interface pufferEthFeed = - AggregatorV3Interface(priceFeedFactory.createPriceFeedConverter(pufferEthToEth, ethToUsd)); - (, int256 answer,,,) = pufferEthFeed.latestRoundData(); - console.log("pufferEth price feed address", address(pufferEthFeed)); - console.log("pufferEth last answer", answer); - pufferEthOracle = address(pufferEthFeed); - } - - { - // pendle(PT-sUSDe 29MAY2025): https://app.pendle.finance/trade/markets/0xb162b764044697cf03617c2efbcb1f42e31e4766/swap?view=pt&chain=ethereum&tab=info - address pt_market = 0xB162B764044697cf03617C2EFbcB1f42e31E4766; - // chainlink(sUSDe/USD): https://data.chain.link/feeds/ethereum/mainnet/susde-usd - // heartBeat: 86400 (24hr) - address susdeToUsd = 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099; - // new price feed heartBeat = max(86400) = 86400 (24hr) - AggregatorV3Interface ptFeed = AggregatorV3Interface( - priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, pt_market, 900, susdeToUsd) - ); - (, int256 answer,,,) = ptFeed.latestRoundData(); - console.log("pt_sUsde_29MAY2025 price feed address", address(ptFeed)); - console.log("pt_sUsde_29MAY2025 last answer", answer); - } - - { - // morpho(USUALUSDC+): https://app.morpho.org/ethereum/vault/0xd63070114470f685b75B74D60EEc7c1113d33a3D/mev-capital-usual-usdc - address USUALUSDCPlusVault = 0xd63070114470f685b75B74D60EEc7c1113d33a3D; - // chainlink(USDC/USD): https://data.chain.link/feeds/ethereum/mainnet/usdc-usd-svr - // heartBeat: 86400 (24hr) - address usdcToUsd = 0xfB6471ACD42c91FF265344Ff73E88353521d099F; - // new price feed heartBeat = max(86400) = 86400 (24hr) - AggregatorV3Interface usdcPlusFeed = - AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usdcToUsd, USUALUSDCPlusVault)); - (, int256 answer,,,) = usdcPlusFeed.latestRoundData(); - console.log("USUALUSDC+ price feed address", address(usdcPlusFeed)); - console.log("USUALUSDC+ last answer", answer); - } - - { - // morpho(MC-wETH): https://app.morpho.org/ethereum/vault/0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8/mev-capital-weth - address MCwETHVault = 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8; - // chainlink(ETH/USD): https://data.chain.link/feeds/ethereum/mainnet/eth-usd - // heartBeat: 3600 (1hr) - address wethToUsd = 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419; - // new price feed heartBeat = max(3600) = 3600 (1hr) - AggregatorV3Interface wethFeed = - AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(wethToUsd, MCwETHVault)); - (, int256 answer,,,) = wethFeed.latestRoundData(); - console.log("MCwETH price feed address", address(wethFeed)); - console.log("MCwETH last answer", answer); - } - - { - // morpho(gtWETH): https://app.morpho.org/ethereum/vault/0x2371e134e3455e0593363cBF89d3b6cf53740618/gauntlet-weth-prime - address gtWETHVault = 0x2371e134e3455e0593363cBF89d3b6cf53740618; - // chainlink(ETH/USD): https://data.chain.link/feeds/ethereum/mainnet/eth-usd - // heartBeat: 3600 (1hr) - address wethToUsd = 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419; - // new price feed heartBeat = max(3600) = 3600 (1hr) - AggregatorV3Interface gtWETHFeed = - AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(wethToUsd, gtWETHVault)); - (, int256 answer,,,) = gtWETHFeed.latestRoundData(); - console.log("gtWETH price feed address", address(gtWETHFeed)); - console.log("gtWETH last answer", answer); - } - - { - // pendle(PT-pufETH 26JUN2025): https://app.pendle.finance/trade/markets/0x58612beb0e8a126735b19bb222cbc7fc2c162d2a/swap?view=pt&chain=ethereum&tab=info - address PT_pufETH_26JUN2025_market = 0x58612beB0e8a126735b19BB222cbC7fC2C162D2a; - // pufETH/USD heartBeat: 86400 (24hr) - // new price feed heartBeat = max(86400) = 86400 (24hr) - AggregatorV3Interface ptFeed = AggregatorV3Interface( - priceFeedFactory.createPTWithPriceFeed( - pendlePYLpOracle, PT_pufETH_26JUN2025_market, 900, pufferEthOracle - ) - ); - (, int256 answer,,,) = ptFeed.latestRoundData(); - console.log("pt_pufETH_26JUN2025 price feed address", address(ptFeed)); - console.log("pt_pufETH_26JUN2025 last answer", answer); - } - - { - // etherscan(eUSDe): https://etherscan.io/token/0x90d2af7d622ca3141efa4d8f1f24d86e5974cc8f#readContract - address eUSDeVault = 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F; - // chainlink(eUSDe/USD): https://data.chain.link/feeds/ethereum/mainnet/usde-usd - // heartBeat: 86400 (24hr) - address usdeToUsd = 0xa569d910839Ae8865Da8F8e70FfFb0cBA869F961; - // new price feed heartBeat = max(86400) = 86400 (24hr) - AggregatorV3Interface usdeFeed = - AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usdeToUsd, eUSDeVault)); - (, int256 answer,,,) = usdeFeed.latestRoundData(); - console.log("eUSDe price feed address", address(usdeFeed)); - console.log("eUSDe last answer", answer); - } - - { - // pendle(PT-USD0PlusPlus 26JUN2025): https://app.pendle.finance/trade/markets/0x048680f64d6dff1748ba6d9a01f578433787e24b/swap?view=pt&chain=ethereum&tab=info - address PT_USD0PlusPlus_26JUN2025_market = 0x048680F64d6DFf1748ba6D9a01F578433787e24B; - // Usual Docs: https://tech.usual.money/smart-contracts/contract-deployments - //! heartBeat: 86400 (24hr) not sure - address usd0PlusPlusToUsd = 0xFC9e30Cf89f8A00dba3D34edf8b65BCDAdeCC1cB; - // new price feed heartBeat = max(86400) = 86400 (24hr) - AggregatorV3Interface usd0PlusPlusFeed = AggregatorV3Interface( - priceFeedFactory.createPTWithPriceFeed( - pendlePYLpOracle, PT_USD0PlusPlus_26JUN2025_market, 900, usd0PlusPlusToUsd - ) - ); - (, int256 answer,,,) = usd0PlusPlusFeed.latestRoundData(); - console.log("PT_USD0PlusPlus_26JUN2025_market price feed address", address(usd0PlusPlusFeed)); - console.log("PT_USD0PlusPlus_26JUN2025_market last answer", answer); - } - - { - // UpShift USDC(upUSDC): https://app.upshift.finance/pools/1/0x80E1048eDE66ec4c364b4F22C8768fc657FF6A42 - address upUSDCVault = 0x80E1048eDE66ec4c364b4F22C8768fc657FF6A42; - // chainlink(USDC/USD): https://data.chain.link/feeds/ethereum/mainnet/usdc-usd-svr - // heartBeat: 86400 (24hr) - address usdcToUsd = 0xfB6471ACD42c91FF265344Ff73E88353521d099F; - // new price feed heartBeat = max(86400) = 86400 (24hr) - AggregatorV3Interface usdcFeed = - AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usdcToUsd, upUSDCVault)); - (, int256 answer,,,) = usdcFeed.latestRoundData(); - console.log("upUSDC price feed address", address(usdcFeed)); - console.log("upUSDC last answer", answer); - } - - { - // Usual(usualx): https://tech.usual.money/smart-contracts/contract-deployments - address usualxVault = 0x06B964d96f5dCF7Eae9d7C559B09EDCe244d4B8E; - // Redstone (USUAL/USD): https://app.redstone.finance/app/feeds/?search=USUAL&page=1&sortBy=popularity&sortDesc=false&perPage=32 - // heartBeat: 86400 (24hr) - address usualToUsd = 0x2240AE461B34CC56D654ba5FA5830A243Ca54840; - // new price feed heartBeat = max(86400) = 86400 (24hr) - AggregatorV3Interface usualFeed = - AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usualToUsd, usualxVault)); - (, int256 answer,,,) = usualFeed.latestRoundData(); - console.log("usualx price feed address", address(usualFeed)); - console.log("usualx last answer", answer); - } - - vm.stopBroadcast(); - } -} diff --git a/script/deploy/DeployPriceFeedsEthBackup.s.sol b/script/deploy/DeployPriceFeedsEthBackup.s.sol deleted file mode 100644 index 4a1c995..0000000 --- a/script/deploy/DeployPriceFeedsEthBackup.s.sol +++ /dev/null @@ -1,152 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; -import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; -import {PriceFeedFactory} from "contracts/extensions/PriceFeedFactory.sol"; - -contract DeployPriceFeeds is Script { - function run() public { - uint256 deployerPrivateKey = vm.envUint("ETH_MAINNET_DEPLOYER_PRIVATE_KEY"); - vm.startBroadcast(deployerPrivateKey); - PriceFeedFactory priceFeedFactory = new PriceFeedFactory(); - - console.log("PriceFeedFactory deployed at", address(priceFeedFactory)); - // pendle deployments: https://github.com/pendle-finance/pendle-core-v2-public/blob/main/deployments/1-core.json - address pendlePYLpOracle = 0x9a9Fa8338dd5E5B2188006f1Cd2Ef26d921650C2; - address pufferEthOracle; - { - // redstone(pufETH/ETH): https://app.redstone.finance/app/feeds/?page=1&sortBy=popularity&sortDesc=false&perPage=64&search=pufETH - // heartBeat: 86400 (24hr) - address pufferEthToEth = 0x76A495b0bFfb53ef3F0E94ef0763e03cE410835C; - // redstone(ETH/USD): https://app.redstone.finance/app/feeds/?page=1&sortBy=popularity&sortDesc=false&perPage=64&search=ETH%2FUSD - // heartBeat: 86400 (24hr) - address ethToUsd = 0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4; - // new price feed heartBeat = max(86400, 86400) = 86400 (24hr) - AggregatorV3Interface pufferEthFeed = - AggregatorV3Interface(priceFeedFactory.createPriceFeedConverter(pufferEthToEth, ethToUsd)); - (, int256 answer,,,) = pufferEthFeed.latestRoundData(); - // compare with primary feed: 0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761 - AggregatorV3Interface pufferEthFeedCheck = AggregatorV3Interface(0xB3ae8A16CF827d193Ae51a92fd2630e6839F5761); - (, int256 answerCheck,,,) = pufferEthFeedCheck.latestRoundData(); - console.log("pufferEth backup price feed address", address(pufferEthFeed)); - console.log("pufferEth last answer", answer); - console.log("pufferEth last answer check", answerCheck); - pufferEthOracle = address(pufferEthFeed); - } - - { - // pendle(PT-sUSDe 29MAY2025): https://app.pendle.finance/trade/markets/0xb162b764044697cf03617c2efbcb1f42e31e4766/swap?view=pt&chain=ethereum&tab=info - address pt_market = 0xB162B764044697cf03617C2EFbcB1f42e31E4766; - // redstone(sUSDe/USD): https://app.redstone.finance/app/feeds/?page=1&sortBy=popularity&sortDesc=false&perPage=64&search=sUSDe%2FUSD - // heartBeat: 86400 (24hr) - address susdeToUsd = 0xb99D174ED06c83588Af997c8859F93E83dD4733f; - // new price feed heartBeat = max(86400) = 86400 (24hr) - AggregatorV3Interface ptFeed = AggregatorV3Interface( - priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, pt_market, 900, susdeToUsd) - ); - // compared with primary feed: 0x8f29Df42c617C222Bc2B416AC8a022E85e853276 - AggregatorV3Interface ptFeedCheck = AggregatorV3Interface(0x8f29Df42c617C222Bc2B416AC8a022E85e853276); - (, int256 answerCheck,,,) = ptFeedCheck.latestRoundData(); - (, int256 answer,,,) = ptFeed.latestRoundData(); - console.log("pt_sUsde_29MAY2025 backup price feed address", address(ptFeed)); - console.log("pt_sUsde_29MAY2025 last answer", answer); - console.log("pt_sUsde_29MAY2025 last answer check", answerCheck); - } - - { - // morpho(MC-wETH): https://app.morpho.org/ethereum/vault/0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8/mev-capital-weth - address MCwETHVault = 0x9a8bC3B04b7f3D87cfC09ba407dCED575f2d61D8; - // redstone(ETH/USD): https://app.redstone.finance/app/feeds/?page=1&sortBy=popularity&sortDesc=false&perPage=64&search=ETH%2FUSD - // heartBeat: 86400 (24hr) - address wethToUsd = 0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4; - // new price feed heartBeat = max(86400) = 86400 (24hr) - AggregatorV3Interface wethFeed = - AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(wethToUsd, MCwETHVault)); - // compared with primary feed: 0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006 - AggregatorV3Interface wethFeedCheck = AggregatorV3Interface(0xF1D1c1e387820c2eFDB9B863960FaA5d035C2006); - (, int256 answerCheck,,,) = wethFeedCheck.latestRoundData(); - (, int256 answer,,,) = wethFeed.latestRoundData(); - console.log("MCwETH backup price feed address", address(wethFeed)); - console.log("MCwETH last answer", answer); - console.log("MCwETH last answer check", answerCheck); - } - - { - // morpho(gtWETH): https://app.morpho.org/ethereum/vault/0x2371e134e3455e0593363cBF89d3b6cf53740618/gauntlet-weth-prime - address gtWETHVault = 0x2371e134e3455e0593363cBF89d3b6cf53740618; - // redstone(ETH/USD): https://app.redstone.finance/app/feeds/?page=1&sortBy=popularity&sortDesc=false&perPage=64&search=ETH%2FUSD - // heartBeat: 86400 (24hr) - address wethToUsd = 0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4; - // new price feed heartBeat = max(86400) = 86400 (24hr) - AggregatorV3Interface gtWETHFeed = - AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(wethToUsd, gtWETHVault)); - // compared with primary feed: 0xdc0115fe09600FeDa15D317cCa3D2f21F389036d - AggregatorV3Interface gtWETHFeedCheck = AggregatorV3Interface(0xdc0115fe09600FeDa15D317cCa3D2f21F389036d); - (, int256 answerCheck,,,) = gtWETHFeedCheck.latestRoundData(); - (, int256 answer,,,) = gtWETHFeed.latestRoundData(); - console.log("gtWETH backup price feed address", address(gtWETHFeed)); - console.log("gtWETH last answer", answer); - console.log("gtWETH last answer check", answerCheck); - } - - { - // pendle(PT-pufETH 26JUN2025): https://app.pendle.finance/trade/markets/0x58612beb0e8a126735b19bb222cbc7fc2c162d2a/swap?view=pt&chain=ethereum&tab=info - address PT_pufETH_26JUN2025_market = 0x58612beB0e8a126735b19BB222cbC7fC2C162D2a; - // pufETH/USD heartBeat: 86400 (24hr) - // new price feed heartBeat = max(86400) = 86400 (24hr) - AggregatorV3Interface ptFeed = AggregatorV3Interface( - priceFeedFactory.createPTWithPriceFeed( - pendlePYLpOracle, PT_pufETH_26JUN2025_market, 900, pufferEthOracle - ) - ); - // compared with primary feed: 0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1 - AggregatorV3Interface ptFeedCheck = AggregatorV3Interface(0x5a27314e6D35B6fFCBaE6B3eb030e7Faf7EF34F1); - (, int256 answerCheck,,,) = ptFeedCheck.latestRoundData(); - (, int256 answer,,,) = ptFeed.latestRoundData(); - console.log("pt_pufETH_26JUN2025 backup price feed address", address(ptFeed)); - console.log("pt_pufETH_26JUN2025 last answer", answer); - console.log("pt_pufETH_26JUN2025 last answer check", answerCheck); - } - - { - // etherscan(eUSDe): https://etherscan.io/token/0x90d2af7d622ca3141efa4d8f1f24d86e5974cc8f#readContract - address eUSDeVault = 0x90D2af7d622ca3141efA4d8f1F24d86E5974Cc8F; - // redstone(USDe/USD): https://app.redstone.finance/app/feeds/?page=1&sortBy=popularity&sortDesc=false&perPage=64&search=USDe%2FUSD - // heartBeat: 86400 (24hr) - address usdeToUsd = 0xbC5FBcf58CeAEa19D523aBc76515b9AEFb5cfd58; - // new price feed heartBeat = max(86400) = 86400 (24hr) - AggregatorV3Interface usdeFeed = - AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usdeToUsd, eUSDeVault)); - // compared with primary feed: 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3 - AggregatorV3Interface usdeFeedCheck = AggregatorV3Interface(0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3); - (, int256 answerCheck,,,) = usdeFeedCheck.latestRoundData(); - (, int256 answer,,,) = usdeFeed.latestRoundData(); - console.log("eUSDe backup price feed address", address(usdeFeed)); - console.log("eUSDe last answer", answer); - console.log("eUSDe last answer check", answerCheck); - } - - { - // chainlink(weETH/ETH): https://data.chain.link/feeds/ethereum/mainnet/weeth-eth - // heartBeat: 86400 (24hr) - address weEthToEth = 0x5c9C449BbC9a6075A2c061dF312a35fd1E05fF22; - // chainlink(ETH/USD): https://data.chain.link/feeds/ethereum/mainnet/eth-usd - // heartBeat: 3600 (1hr) - address ethToUsd = 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419; - // new price feed heartBeat = max(3600, 86400) = 86400 (24hr) - AggregatorV3Interface weEthFeed = - AggregatorV3Interface(priceFeedFactory.createPriceFeedConverter(weEthToEth, ethToUsd)); - (, int256 answer,,,) = weEthFeed.latestRoundData(); - // compare with primary feed: 0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136 - AggregatorV3Interface weEthFeedCheck = AggregatorV3Interface(0xdDb6F90fFb4d3257dd666b69178e5B3c5Bf41136); - (, int256 answerCheck,,,) = weEthFeedCheck.latestRoundData(); - console.log("weEth backup price feed address", address(weEthFeed)); - console.log("weEth last answer", answer); - console.log("weEth last answer check", answerCheck); - } - - vm.stopBroadcast(); - } -} diff --git a/script/deploy/DeployPriceFeedsEthInWstETH.s.sol b/script/deploy/DeployPriceFeedsEthInWstETH.s.sol deleted file mode 100644 index d0dad79..0000000 --- a/script/deploy/DeployPriceFeedsEthInWstETH.s.sol +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; -import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; -import {PriceFeedFactory} from "contracts/extensions/PriceFeedFactory.sol"; - -contract DeployPriceFeeds is Script { - function run() public { - uint256 deployerPrivateKey = vm.envUint("ETH_MAINNET_DEPLOYER_PRIVATE_KEY"); - vm.startBroadcast(deployerPrivateKey); - PriceFeedFactory priceFeedFactory = new PriceFeedFactory(); - - console.log("PriceFeedFactory deployed at", address(priceFeedFactory)); - - { - // inceptionLRT(inwstETH): https://docs.inceptionlrt.com/contracts/addresses/lrts - address inwstETHVault = 0xf9D9F828989A624423C48b95BC04E9Ae0ef5Ec97; - // chainlink(wstETH/USD): https://data.chain.link/feeds/ethereum/mainnet/wsteth-usd - // heartBeat: 86400 (24hr) - address wstETHToUsd = 0x164b276057258d81941e97B0a900D4C7B358bCe0; - // new price feed heartBeat = max(86400) = 86400 (24hr) - AggregatorV3Interface inwstETHFeed = - AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(wstETHToUsd, inwstETHVault)); - (, int256 answer,,,) = inwstETHFeed.latestRoundData(); - console.log("inwstETH price feed address", address(inwstETHFeed)); - console.log("inwstETH last answer", answer); - } - - vm.stopBroadcast(); - } -} diff --git a/script/deploy/DeployPriceFeedsEthLevel.s.sol b/script/deploy/DeployPriceFeedsEthLevel.s.sol deleted file mode 100644 index 5c95fee..0000000 --- a/script/deploy/DeployPriceFeedsEthLevel.s.sol +++ /dev/null @@ -1,63 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; -import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; -import {PriceFeedFactory} from "contracts/extensions/PriceFeedFactory.sol"; - -contract DeployPriceFeeds is Script { - function run() public { - uint256 deployerPrivateKey = vm.envUint("ETH_MAINNET_DEPLOYER_PRIVATE_KEY"); - vm.startBroadcast(deployerPrivateKey); - PriceFeedFactory priceFeedFactory = new PriceFeedFactory(); - - console.log("PriceFeedFactory deployed at", address(priceFeedFactory)); - // pendle deployments: https://github.com/pendle-finance/pendle-core-v2-public/blob/main/deployments/1-core.json - address pendlePYLpOracle = 0x9a9Fa8338dd5E5B2188006f1Cd2Ef26d921650C2; - { - // pendle(PT-lvlUSD-29MAY2025): https://app.pendle.finance/trade/markets/0xe45d2ce15abba3c67b9ff1e7a69225c855d3da82/swap?view=pt&chain=ethereum&tab=info - address pt_market = 0xE45d2CE15aBbA3c67b9fF1E7A69225C855d3DA82; - // chainlink(USDC/USD): https://data.chain.link/feeds/ethereum/mainnet/usdc-usd - // heartBeat: 86400 (24hr) - address usdcToUsd = 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6; - // new price feed heartBeat = max(86400) = 86400 (24hr) - AggregatorV3Interface ptFeed = AggregatorV3Interface( - priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, pt_market, 900, usdcToUsd) - ); - (, int256 answer,,,) = ptFeed.latestRoundData(); - console.log("pt_lvlUSD_29MAY2025 price feed address", address(ptFeed)); - console.log("pt_lvlUSD_29MAY2025 last answer", answer); - } - - { - // slvlUSD: https://etherscan.io/address/0x4737D9b4592B40d51e110b94c9C043c6654067Ae#readContract - address slvlUsd = 0x4737D9b4592B40d51e110b94c9C043c6654067Ae; - // chainlink(USDC/USD): https://data.chain.link/feeds/ethereum/mainnet/usdc-usd - // heartBeat: 86400 (24hr) - address usdcToUsd = 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6; - // new price feed heartBeat = max(86400) = 86400 (24hr) - AggregatorV3Interface slvlUsdFeed = - AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usdcToUsd, slvlUsd)); - (, int256 answer,,,) = slvlUsdFeed.latestRoundData(); - console.log("slvlUSD price feed address", address(slvlUsdFeed)); - console.log("slvlUSD last answer", answer); - } - - { - // morpho(USUALUSDC+): https://app.morpho.org/ethereum/vault/0xd63070114470f685b75B74D60EEc7c1113d33a3D/mev-capital-usual-usdc - address USUALUSDCPlusVault = 0xd63070114470f685b75B74D60EEc7c1113d33a3D; - // chainlink(USDC/USD): https://data.chain.link/feeds/ethereum/mainnet/usdc-usd - // heartBeat: 86400 (24hr) - address usdcToUsd = 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6; - // new price feed heartBeat = max(86400) = 86400 (24hr) - AggregatorV3Interface usdcPlusFeed = - AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usdcToUsd, USUALUSDCPlusVault)); - (, int256 answer,,,) = usdcPlusFeed.latestRoundData(); - console.log("USUALUSDC+ price feed address", address(usdcPlusFeed)); - console.log("USUALUSDC+ last answer", answer); - } - - vm.stopBroadcast(); - } -} diff --git a/script/deploy/DeployPriceFeedsEth_20250508.s.sol b/script/deploy/DeployPriceFeedsEth_20250508.s.sol deleted file mode 100644 index 4d75691..0000000 --- a/script/deploy/DeployPriceFeedsEth_20250508.s.sol +++ /dev/null @@ -1,99 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; -import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; -import {PriceFeedFactory} from "contracts/extensions/PriceFeedFactory.sol"; - -contract DeployPriceFeeds is Script { - function run() public { - uint256 deployerPrivateKey = vm.envUint("ETH_MAINNET_DEPLOYER_PRIVATE_KEY"); - vm.startBroadcast(deployerPrivateKey); - address priceFeedFactoryAddress = 0xcac930B240163fDB71b74514E8FAA113ec0dA844; - PriceFeedFactory priceFeedFactory = PriceFeedFactory(priceFeedFactoryAddress); - - console.log("PriceFeedFactory deployed at", address(priceFeedFactory)); - // pendle deployments: https://github.com/pendle-finance/pendle-core-v2-public/blob/main/deployments/1-core.json - address pendlePYLpOracle = 0x9a9Fa8338dd5E5B2188006f1Cd2Ef26d921650C2; - - { - // pendle(PT-sUSDe 31JUL2025): https://app.pendle.finance/trade/markets/0x4339ffe2b7592dc783ed13cce310531ab366deac/swap?view=pt&chain=ethereum&tab=info - address pt_market = 0x4339Ffe2B7592Dc783ed13cCE310531aB366dEac; - // chainlink(sUSDe/USD): https://data.chain.link/feeds/ethereum/mainnet/susde-usd - // heartBeat: 86400 (24hr) - address susdeToUsd = 0xFF3BC18cCBd5999CE63E788A1c250a88626aD099; - // new price feed heartBeat = max(86400) = 86400 (24hr) - AggregatorV3Interface ptFeed = AggregatorV3Interface( - priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, pt_market, 900, susdeToUsd) - ); - (, int256 answer,,,) = ptFeed.latestRoundData(); - console.log("pt_sUsde_31JUL2025 price feed address", address(ptFeed)); - console.log("pt_sUsde_31JUL2025 last answer", answer); - } - { - // pendle(PT-lvlUSD-25SEP2025): https://app.pendle.finance/trade/markets/0x461bc2ac3f80801bc11b0f20d63b73fef60c8076/swap?view=pt&chain=ethereum&tab=info - address pt_market = 0x461bc2ac3f80801BC11B0F20d63B73feF60C8076; - // chainlink(USDC/USD): https://data.chain.link/feeds/ethereum/mainnet/usdc-usd - // heartBeat: 86400 (24hr) - address usdcToUsd = 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6; - // new price feed heartBeat = max(86400) = 86400 (24hr) - AggregatorV3Interface ptFeed = AggregatorV3Interface( - priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, pt_market, 900, usdcToUsd) - ); - (, int256 answer,,,) = ptFeed.latestRoundData(); - console.log("pt_lvlUSD_25SEP2025 price feed address", address(ptFeed)); - console.log("pt_lvlUSD_25SEP2025 last answer", answer); - } - address cUSDOToUsdFeed; - { - // chainlink(USDC/USD): https://data.chain.link/feeds/ethereum/mainnet/usdc-usd - // heartBeat: 86400 (24hr) - address usdcToUsd = 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6; - address cUSDO = 0xaD55aebc9b8c03FC43cd9f62260391c13c23e7c0; - // new price feed heartBeat = max(86400) = 86400 (24hr) - AggregatorV3Interface cusdoFeed = - AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usdcToUsd, cUSDO)); - cUSDOToUsdFeed = address(cusdoFeed); - (, int256 answer,,,) = cusdoFeed.latestRoundData(); - console.log("cUSDO price feed address", address(cusdoFeed)); - console.log("cUSDO last answer", answer); - } - { - // pendle(PT-cUSDO-19JUN2025): https://app.pendle.finance/trade/markets/0xa77c0de4d26b7c97d1d42abd6733201206122e25/swap?view=pt&chain=ethereum&tab=info - address pt_market = 0xA77c0DE4d26B7C97D1D42ABD6733201206122E25; - AggregatorV3Interface ptFeed = AggregatorV3Interface( - priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, pt_market, 900, cUSDOToUsdFeed) - ); - (, int256 answer,,,) = ptFeed.latestRoundData(); - console.log("pt_cUSDO_19JUN2025 price feed address", address(ptFeed)); - console.log("pt_cUSDO_19JUN2025 last answer", answer); - } - address wstUsrToUsdFeed; - { - // chainlink(USR/USD): https://data.chain.link/feeds/ethereum/mainnet/usr-usd - // heartBeat: 86400 (24hr) - address usrToUsd = 0x34ad75691e25A8E9b681AAA85dbeB7ef6561B42c; - address wstUsr = 0x1202F5C7b4B9E47a1A484E8B270be34dbbC75055; - // new price feed heartBeat = max(86400) = 86400 (24hr) - AggregatorV3Interface wstUsrFeed = - AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usrToUsd, wstUsr)); - wstUsrToUsdFeed = address(wstUsrFeed); - (, int256 answer,,,) = wstUsrFeed.latestRoundData(); - console.log("wstUsr price feed address", address(wstUsrFeed)); - console.log("wstUsr last answer", answer); - } - { - // pendle(PT-wstUSR-25SEP2025): https://app.pendle.finance/trade/markets/0x09fa04aac9c6d1c6131352ee950cd67ecc6d4fb9/swap?view=pt&chain=ethereum&tab=info - address pt_market = 0x09fA04Aac9c6d1c6131352EE950CD67ecC6d4fB9; - AggregatorV3Interface ptFeed = AggregatorV3Interface( - priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, pt_market, 900, wstUsrToUsdFeed) - ); - (, int256 answer,,,) = ptFeed.latestRoundData(); - console.log("pt_wstUSR_25SEP2025 price feed address", address(ptFeed)); - console.log("pt_wstUSR_25SEP2025 last answer", answer); - } - - vm.stopBroadcast(); - } -} diff --git a/script/deploy/DeployPriceFeedsEth_20250508_Backup.s.sol b/script/deploy/DeployPriceFeedsEth_20250508_Backup.s.sol deleted file mode 100644 index 3c3f647..0000000 --- a/script/deploy/DeployPriceFeedsEth_20250508_Backup.s.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; -import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; -import {PriceFeedFactory} from "contracts/extensions/PriceFeedFactory.sol"; - -contract DeployPriceFeeds is Script { - function run() public { - uint256 deployerPrivateKey = vm.envUint("ETH_MAINNET_DEPLOYER_PRIVATE_KEY"); - vm.startBroadcast(deployerPrivateKey); - address priceFeedFactoryAddress = 0xcac930B240163fDB71b74514E8FAA113ec0dA844; - PriceFeedFactory priceFeedFactory = PriceFeedFactory(priceFeedFactoryAddress); - - console.log("PriceFeedFactory deployed at", address(priceFeedFactory)); - // pendle deployments: https://github.com/pendle-finance/pendle-core-v2-public/blob/main/deployments/1-core.json - address pendlePYLpOracle = 0x9a9Fa8338dd5E5B2188006f1Cd2Ef26d921650C2; - - { - // pendle(PT-sUSDe 31JUL2025): https://app.pendle.finance/trade/markets/0x4339ffe2b7592dc783ed13cce310531ab366deac/swap?view=pt&chain=ethereum&tab=info - address pt_market = 0x4339Ffe2B7592Dc783ed13cCE310531aB366dEac; - // redstone(sUSDe/USD): https://app.redstone.finance/app/feeds/?page=1&sortBy=popularity&sortDesc=false&perPage=64&search=sUSDe%2FUSD - // heartBeat: 86400 (24hr) - address susdeToUsd = 0xb99D174ED06c83588Af997c8859F93E83dD4733f; - // new price feed heartBeat = max(86400) = 86400 (24hr) - AggregatorV3Interface ptFeed = AggregatorV3Interface( - priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, pt_market, 900, susdeToUsd) - ); - (, int256 answer,,,) = ptFeed.latestRoundData(); - console.log("pt_sUsde_31JUL2025 price feed address", address(ptFeed)); - console.log("pt_sUsde_31JUL2025 last answer", answer); - } - address wstUsrToUsdFeed; - { - // redstone(USR/USD): https://app.redstone.finance/app/feeds/?page=1&sortBy=popularity&sortDesc=false&perPage=64&search=USR%2FUSD - // heartBeat: 86400 (24hr) - address usrToUsd = 0x107Dd3391A6357248f2093698014e7c6130779Ee; - address wstUsr = 0x1202F5C7b4B9E47a1A484E8B270be34dbbC75055; - // new price feed heartBeat = max(86400) = 86400 (24hr) - AggregatorV3Interface wstUsrFeed = - AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usrToUsd, wstUsr)); - wstUsrToUsdFeed = address(wstUsrFeed); - (, int256 answer,,,) = wstUsrFeed.latestRoundData(); - console.log("wstUsr price feed address", address(wstUsrFeed)); - console.log("wstUsr last answer", answer); - } - { - // pendle(PT-wstUSR-25SEP2025): https://app.pendle.finance/trade/markets/0x09fa04aac9c6d1c6131352ee950cd67ecc6d4fb9/swap?view=pt&chain=ethereum&tab=info - address pt_market = 0x09fA04Aac9c6d1c6131352EE950CD67ecC6d4fB9; - AggregatorV3Interface ptFeed = AggregatorV3Interface( - priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, pt_market, 900, wstUsrToUsdFeed) - ); - (, int256 answer,,,) = ptFeed.latestRoundData(); - console.log("pt_wstUSR_25SEP2025 price feed address", address(ptFeed)); - console.log("pt_wstUSR_25SEP2025 last answer", answer); - } - - vm.stopBroadcast(); - } -} diff --git a/script/deploy/DeployPriceFeedsEth_20250513.s.sol b/script/deploy/DeployPriceFeedsEth_20250513.s.sol deleted file mode 100644 index 1f4d5c9..0000000 --- a/script/deploy/DeployPriceFeedsEth_20250513.s.sol +++ /dev/null @@ -1,63 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; -import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; -import {PriceFeedFactory} from "contracts/extensions/PriceFeedFactory.sol"; - -contract DeployPriceFeeds is Script { - function run() public { - uint256 deployerPrivateKey = vm.envUint("ETH_MAINNET_DEPLOYER_PRIVATE_KEY"); - vm.startBroadcast(deployerPrivateKey); - address priceFeedFactoryAddress = 0xcac930B240163fDB71b74514E8FAA113ec0dA844; - PriceFeedFactory priceFeedFactory = PriceFeedFactory(priceFeedFactoryAddress); - - console.log("PriceFeedFactory deployed at", address(priceFeedFactory)); - // pendle deployments: https://github.com/pendle-finance/pendle-core-v2-public/blob/main/deployments/1-core.json - address pendlePYLpOracle = 0x9a9Fa8338dd5E5B2188006f1Cd2Ef26d921650C2; - address slvlUSDFeedAddr; - { - // chainlink(USDC/USD): https://data.chain.link/feeds/ethereum/mainnet/usdc-usd - // heartBeat: 86400 (24hr) - address usdcToUsd = 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6; - // Coingecko: https://www.coingecko.com/en/coins/staked-level-usd - address vault = 0x4737D9b4592B40d51e110b94c9C043c6654067Ae; - // new price feed heartBeat = max(86400) = 86400 (24hr) - AggregatorV3Interface slvlUSDFeed = - AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usdcToUsd, vault)); - (, int256 answer,,,) = slvlUSDFeed.latestRoundData(); - slvlUSDFeedAddr = address(slvlUSDFeed); - console.log("slvlUSD price feed address", address(slvlUSDFeed)); - console.log("slvlUSD last answer", answer); - } - - { - // pendle(PT-slvlUSD 25SEP2025): https://app.pendle.finance/trade/markets/0xc88ff954d42d3e11d43b62523b3357847c29377c/swap?view=pt&chain=ethereum&tab=info - address pt_market = 0xC88FF954d42d3e11D43B62523B3357847C29377c; - // new price feed heartBeat = max(86400) = 86400 (24hr) - AggregatorV3Interface ptFeed = AggregatorV3Interface( - priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, pt_market, 900, slvlUSDFeedAddr) - ); - (, int256 answer,,,) = ptFeed.latestRoundData(); - console.log("pt_slvlUSD_25SEP2025 price feed address", address(ptFeed)); - console.log("pt_slvlUSD_25SEP2025 last answer", answer); - } - - { - // pendle(PT-mMEV 31JUL2025): https://app.pendle.finance/trade/markets/0x266728b30c98b24de810e3325adc615486988cb2/swap?view=pt&chain=ethereum&tab=info - address pt_market = 0x266728b30c98B24De810E3325aDC615486988Cb2; - // custom price feed by themself - address mMEVToUsd = 0x5f09Aff8B9b1f488B7d1bbaD4D89648579e55d61; - // new price feed heartBeat = max(5*86400) = 5*86400 (5 days) - AggregatorV3Interface ptFeed = AggregatorV3Interface( - priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, pt_market, 900, mMEVToUsd) - ); - (, int256 answer,,,) = ptFeed.latestRoundData(); - console.log("pt_mMEV_31JUL2025 price feed address", address(ptFeed)); - console.log("pt_mMEV_31JUL2025 last answer", answer); - } - - vm.stopBroadcast(); - } -} diff --git a/script/deploy/DeployPriceFeedsEth_20250522.s.sol b/script/deploy/DeployPriceFeedsEth_20250522.s.sol deleted file mode 100644 index e18ff43..0000000 --- a/script/deploy/DeployPriceFeedsEth_20250522.s.sol +++ /dev/null @@ -1,141 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; -import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; -import {PriceFeedFactory} from "contracts/extensions/PriceFeedFactory.sol"; - -contract DeployPriceFeeds is Script { - function run() public { - uint256 deployerPrivateKey = vm.envUint("ETH_MAINNET_DEPLOYER_PRIVATE_KEY"); - vm.startBroadcast(deployerPrivateKey); - address priceFeedFactoryAddress = 0xcac930B240163fDB71b74514E8FAA113ec0dA844; - PriceFeedFactory priceFeedFactory = PriceFeedFactory(priceFeedFactoryAddress); - - console.log("PriceFeedFactory deployed at", address(priceFeedFactory)); - // pendle deployments: https://github.com/pendle-finance/pendle-core-v2-public/blob/main/deployments/1-core.json - address pendlePYLpOracle = 0x9a9Fa8338dd5E5B2188006f1Cd2Ef26d921650C2; - - { - // pendle(PT-eUSDE-14AUG2025): https://app.pendle.finance/trade/markets/0xe93b4a93e80bd3065b290394264af5d82422ee70/swap?view=pt&chain=ethereum&chart=apy&tab=info - address pt_market = 0xE93B4A93e80BD3065B290394264af5d82422ee70; - // eUSDe primary price feed: https://docs.ts.finance/technical-details/oracles - // heartBeat: 86400 (24hr) - address eUSDeToUsdPrimary = 0xB6549635409Ae9c0eeBB71B3F904cB004F2D97D3; - // new price feed heartBeat = max(86400) = 86400 (24hr) - AggregatorV3Interface ptFeedPrimary = AggregatorV3Interface( - priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, pt_market, 900, eUSDeToUsdPrimary) - ); - (, int256 answerPrimary,,,) = ptFeedPrimary.latestRoundData(); - console.log("PT-eUSDE-14AUG2025 primary price feed address", address(ptFeedPrimary)); - console.log("PT-eUSDE-14AUG2025 primary last answer", answerPrimary); - - // eUSDe secondary price feed: https://docs.ts.finance/technical-details/oracles - // heartBeat: 86400 (24hr) - address eUSDeToUsdSecondary = 0x6B09d473dB784D840E307Cb3Da63CbA79D300CAc; - // new price feed heartBeat = max(86400) = 86400 (24hr) - AggregatorV3Interface ptFeedSecondary = AggregatorV3Interface( - priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, pt_market, 900, eUSDeToUsdSecondary) - ); - (, int256 answerSecondary,,,) = ptFeedSecondary.latestRoundData(); - console.log("PT-eUSDE-14AUG2025 secondary price feed address", address(ptFeedSecondary)); - console.log("PT-eUSDE-14AUG2025 secondary last answer", answerSecondary); - } - - AggregatorV3Interface lbtcFeedPrimary; - AggregatorV3Interface lbtcFeedSecondary; - { - // chainlink(LBTC/BTC): https://data.chain.link/feeds/ethereum/mainnet/lbtc-btc - // heartBeat: 86400 (24hr) - address lbtcToBtcChainlink = 0x5c29868C58b6e15e2b962943278969Ab6a7D3212; - // chainlink(BTC/USD): https://data.chain.link/feeds/ethereum/mainnet/btc-usd - // heartBeat: 3600 (1hr) - address btcToUsdChainlink = 0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c; - // new price feed heartBeat = max(3600, 86400) = 86400 (24hr) - lbtcFeedPrimary = - AggregatorV3Interface(priceFeedFactory.createPriceFeedConverter(lbtcToBtcChainlink, btcToUsdChainlink)); - (, int256 answerPrimary,,,) = lbtcFeedPrimary.latestRoundData(); - console.log("lbtc primary price feed address", address(lbtcFeedPrimary)); - console.log("lbtc primary last answer", answerPrimary); - - // redstone(LBTC/BTC): https://app.redstone.finance/app/feeds/?page=1&sortBy=popularity&sortDesc=false&perPage=32&search=LBTC - // heartBeat: 86400 (24hr) - address lbtcToBtcRedstone = 0xb415eAA355D8440ac7eCB602D3fb67ccC1f0bc81; - // redstone(BTC/USD): https://app.redstone.finance/app/feeds/?page=1&sortBy=popularity&sortDesc=false&perPage=32&search=BTC - // heartBeat: 86400 (24hr) - address btcToUsdRedstone = 0xAB7f623fb2F6fea6601D4350FA0E2290663C28Fc; - // new price feed heartBeat = max(86400, 86400) = 86400 (24hr) - lbtcFeedSecondary = - AggregatorV3Interface(priceFeedFactory.createPriceFeedConverter(lbtcToBtcRedstone, btcToUsdRedstone)); - (, int256 answerSecondary,,,) = lbtcFeedSecondary.latestRoundData(); - console.log("lbtc secondary price feed address", address(lbtcFeedSecondary)); - console.log("lbtc secondary last answer", answerSecondary); - } - - { - // pendle(PT-LBTC-26JUN2025): https://app.pendle.finance/trade/markets/0x931f7ea0c31c14914a452d341bc5cb5d996be71d/swap?view=pt&chain=ethereum&chart=apy&tab=info - address pt_market = 0x931F7eA0c31c14914a452d341bc5Cb5d996BE71d; - // LBTC primary price feed: deployed in the same script - // heartBeat: 86400 (24hr) - // new price feed heartBeat = max(86400) = 86400 (24hr) - AggregatorV3Interface ptFeedPrimary = AggregatorV3Interface( - priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, pt_market, 900, address(lbtcFeedPrimary)) - ); - (, int256 answerPrimary,,,) = ptFeedPrimary.latestRoundData(); - console.log("PT-LBTC-26JUN2025 primary price feed address", address(ptFeedPrimary)); - console.log("PT-LBTC-26JUN2025 primary last answer", answerPrimary); - - // LBTC secondary price feed: deployed in the same script - // heartBeat: 86400 (24hr) - // new price feed heartBeat = max(86400) = 86400 (24hr) - AggregatorV3Interface ptFeedSecondary = AggregatorV3Interface( - priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, pt_market, 900, address(lbtcFeedSecondary)) - ); - (, int256 answerSecondary,,,) = ptFeedSecondary.latestRoundData(); - console.log("PT-LBTC-26JUN2025 secondary price feed address", address(ptFeedSecondary)); - console.log("PT-LBTC-26JUN2025 secondary last answer", answerSecondary); - } - - { - // chainlink(ETH/USD): https://data.chain.link/feeds/ethereum/mainnet/eth-usd - // heartBeat: 3600 (1hr) - address ethToUsdChainlink = 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419; - // YieldNest: https://docs.yieldnest.finance/protocol-design/max-lrts/yneth-max-ynethx - address vault = 0x657d9ABA1DBb59e53f9F3eCAA878447dCfC96dCb; - // new price feed heartBeat = max(3600) = 3600 (24hr) - AggregatorV3Interface ynEthxPriceFeedPrimary = - AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(ethToUsdChainlink, vault)); - (, int256 answerPrimary,,,) = ynEthxPriceFeedPrimary.latestRoundData(); - console.log("ynEthx primary price feed address", address(ynEthxPriceFeedPrimary)); - console.log("ynEthx primary last answer", answerPrimary); - - // redstone(ETH/USD): https://app.redstone.finance/app/feeds/?page=1&sortBy=popularity&sortDesc=false&perPage=32&search=ETH%2FUSD - // heartBeat: 86400 (24hr) - address ethToUsdRedstone = 0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4; - // new price feed heartBeat = max(86400) = 86400 (24hr) - AggregatorV3Interface ynEthxPriceFeedSecondary = - AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(ethToUsdRedstone, vault)); - (, int256 answerSecondary,,,) = ynEthxPriceFeedSecondary.latestRoundData(); - console.log("ynEthx secondary price feed address", address(ynEthxPriceFeedSecondary)); - console.log("ynEthx secondary last answer", answerSecondary); - } - - { - // pendle(PT-USDS-14AUG2025): https://app.pendle.finance/trade/markets/0xdace1121e10500e9e29d071f01593fd76b000f08/swap?view=pt&chain=ethereum&chart=apy&tab=info - address pt_market = 0xdacE1121e10500e9e29d071F01593fD76B000f08; - // chainlink(USDS/USD): https://data.chain.link/feeds/ethereum/mainnet/usds-usd - address usdsToUsdChainlink = 0xfF30586cD0F29eD462364C7e81375FC0C71219b1; - // heartBeat: 86400 (24hr) - // new price feed heartBeat = max(86400) = 86400 (24hr) - AggregatorV3Interface ptFeedPrimary = AggregatorV3Interface( - priceFeedFactory.createPTWithPriceFeed(pendlePYLpOracle, pt_market, 900, usdsToUsdChainlink) - ); - (, int256 answerPrimary,,,) = ptFeedPrimary.latestRoundData(); - console.log("PT-USDS-14AUG2025 primary price feed address", address(ptFeedPrimary)); - console.log("PT-USDS-14AUG2025 primary last answer", answerPrimary); - } - - vm.stopBroadcast(); - } -} diff --git a/script/deploy/DeployPriceFeedsMorpho.s.sol b/script/deploy/DeployPriceFeedsMorpho.s.sol deleted file mode 100644 index 62e154d..0000000 --- a/script/deploy/DeployPriceFeedsMorpho.s.sol +++ /dev/null @@ -1,73 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; - -import {Script} from "forge-std/Script.sol"; -import {console} from "forge-std/console.sol"; -import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; -import {PriceFeedFactory} from "contracts/extensions/PriceFeedFactory.sol"; - -contract DeployPriceFeeds is Script { - function run() public { - uint256 deployerPrivateKey = vm.envUint("ETH_MAINNET_DEPLOYER_PRIVATE_KEY"); - vm.startBroadcast(deployerPrivateKey); - PriceFeedFactory priceFeedFactory = new PriceFeedFactory(); - - { - // morpho(gtusdcf): https://app.morpho.org/ethereum/vault/0xc582F04d8a82795aa2Ff9c8bb4c1c889fe7b754e/gauntlet-usdc-frontier - address gtusdcfVault = 0xc582F04d8a82795aa2Ff9c8bb4c1c889fe7b754e; - // chainlink(USDC/USD): https://data.chain.link/feeds/ethereum/mainnet/usdc-usd-svr - // heartBeat: 86400 (24hr) - address usdcToUsd = 0xfB6471ACD42c91FF265344Ff73E88353521d099F; - // new price feed heartBeat = max(86400) = 86400 (24hr) - AggregatorV3Interface gtusdcfFeed = - AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usdcToUsd, gtusdcfVault)); - (, int256 answer,,,) = gtusdcfFeed.latestRoundData(); - console.log("gtusdcf price feed address", address(gtusdcfFeed)); - console.log("gtusdcf last answer", answer); - } - - { - // morpho(MC-wETH): https://app.morpho.org/ethereum/vault/0x701907283a57FF77E255C3f1aAD790466B8CE4ef/index-coop-hyeth - address mhyETHVault = 0x701907283a57FF77E255C3f1aAD790466B8CE4ef; - // chainlink(ETH/USD): https://data.chain.link/feeds/ethereum/mainnet/eth-usd - // heartBeat: 3600 (1hr) - address wethToUsd = 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419; - // new price feed heartBeat = max(3600) = 3600 (1hr) - AggregatorV3Interface mhyETHFeed = - AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(wethToUsd, mhyETHVault)); - (, int256 answer,,,) = mhyETHFeed.latestRoundData(); - console.log("mhyETH price feed address", address(mhyETHFeed)); - console.log("mhyETH last answer", answer); - } - - { - // morpho(MC-wETH): https://app.morpho.org/ethereum/vault/0x701907283a57FF77E255C3f1aAD790466B8CE4ef/index-coop-hyeth - address mhyETHVault = 0x701907283a57FF77E255C3f1aAD790466B8CE4ef; - // redstone(ETH/USD): https://app.redstone.finance/app/feeds/?search=ETH%2FUSD&page=1&sortBy=popularity&sortDesc=false&perPage=32 - // heartBeat: 86400 (24hr) - address wethToUsd = 0x67F6838e58859d612E4ddF04dA396d6DABB66Dc4; - // new price feed heartBeat = max(86400) = 86400 (24hr) - AggregatorV3Interface mhyETHBackupFeed = - AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(wethToUsd, mhyETHVault)); - (, int256 answer,,,) = mhyETHBackupFeed.latestRoundData(); - console.log("mhyETHBackup price feed address", address(mhyETHBackupFeed)); - console.log("mhyETHBackup last answer", answer); - } - - { - // morpho(MC_USDCP): https://app.morpho.org/ethereum/vault/0xf1fd8AC6346eC7BC4116Ba7aDc81102B2BC4C52D/mev-capital-usdc-prime - address mevUsdcPrimeVault = 0xf1fd8AC6346eC7BC4116Ba7aDc81102B2BC4C52D; - // chainlink(USDC/USD): https://data.chain.link/feeds/ethereum/mainnet/usdc-usd-svr - // heartBeat: 86400 (24hr) - address usdcToUsd = 0xfB6471ACD42c91FF265344Ff73E88353521d099F; - // new price feed heartBeat = max(86400) = 86400 (24hr) - AggregatorV3Interface mevUsdcPrimeFeed = - AggregatorV3Interface(priceFeedFactory.createPriceFeedWithERC4626(usdcToUsd, mevUsdcPrimeVault)); - (, int256 answer,,,) = mevUsdcPrimeFeed.latestRoundData(); - console.log("mevUsdcPrime price feed address", address(mevUsdcPrimeFeed)); - console.log("mevUsdcPrime last answer", answer); - } - - vm.stopBroadcast(); - } -} diff --git a/script/deploy/DeployVault.s.sol b/script/deploy/DeployVault.s.sol index af35ee8..f0311c7 100644 --- a/script/deploy/DeployVault.s.sol +++ b/script/deploy/DeployVault.s.sol @@ -3,30 +3,30 @@ pragma solidity ^0.8.27; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {TermMaxFactory} from "contracts/factory/TermMaxFactory.sol"; -import {ITermMaxFactory} from "contracts/factory/ITermMaxFactory.sol"; -import {TermMaxRouter} from "contracts/router/TermMaxRouter.sol"; +import {TermMaxFactory} from "contracts/v1/factory/TermMaxFactory.sol"; +import {ITermMaxFactory} from "contracts/v1/factory/ITermMaxFactory.sol"; +import {TermMaxRouter} from "contracts/v1/router/TermMaxRouter.sol"; import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; -import {TermMaxMarket} from "contracts/TermMaxMarket.sol"; -import {TermMaxOrder, ISwapCallback} from "contracts/TermMaxOrder.sol"; -import {ITermMaxOrder} from "contracts/TermMaxOrder.sol"; -import {MockERC20} from "contracts/test/MockERC20.sol"; -import {MockPriceFeed} from "contracts/test/MockPriceFeed.sol"; -import {MockPriceFeed} from "contracts/test/MockPriceFeed.sol"; -import {MarketConfig, OrderConfig, CurveCuts, CurveCut} from "contracts/storage/TermMaxStorage.sol"; -import {IMintableERC20} from "contracts/tokens/IMintableERC20.sol"; -import {IGearingToken} from "contracts/tokens/IGearingToken.sol"; -import {IOracle} from "contracts/oracle/IOracle.sol"; +import {TermMaxMarket} from "contracts/v1/TermMaxMarket.sol"; +import {TermMaxOrder, ISwapCallback} from "contracts/v1/TermMaxOrder.sol"; +import {ITermMaxOrder} from "contracts/v1/TermMaxOrder.sol"; +import {MockERC20} from "contracts/v1/test/MockERC20.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {MarketConfig, OrderConfig, CurveCuts, CurveCut} from "contracts/v1/storage/TermMaxStorage.sol"; +import {IMintableERC20} from "contracts/v1/tokens/IMintableERC20.sol"; +import {IGearingToken} from "contracts/v1/tokens/IGearingToken.sol"; +import {IOracle} from "contracts/v1/oracle/IOracle.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; -import {MockSwapAdapter} from "contracts/test/MockSwapAdapter.sol"; +import {MockSwapAdapter} from "contracts/v1/test/MockSwapAdapter.sol"; import {JsonLoader} from "../utils/JsonLoader.sol"; -import {Faucet} from "contracts/test/testnet/Faucet.sol"; -import {FaucetERC20} from "contracts/test/testnet/FaucetERC20.sol"; +import {Faucet} from "contracts/v1/test/testnet/Faucet.sol"; +import {FaucetERC20} from "contracts/v1/test/testnet/FaucetERC20.sol"; import {DeployBase} from "./DeployBase.s.sol"; -import {ITermMaxVault, TermMaxVault} from "contracts/vault/TermMaxVault.sol"; -import {VaultFactory, IVaultFactory} from "contracts/factory/VaultFactory.sol"; -import {AccessManager} from "contracts/access/AccessManager.sol"; +import {ITermMaxVault, TermMaxVault} from "contracts/v1/vault/TermMaxVault.sol"; +import {VaultFactory, IVaultFactory} from "contracts/v1/factory/VaultFactory.sol"; +import {AccessManager} from "contracts/v1/access/AccessManager.sol"; contract DeloyVault is DeployBase { // Initialize vault configurations with a single USDC vault diff --git a/script/deploy/DeployVaultFactory.s.sol b/script/deploy/DeployVaultFactory.s.sol index 6e4e343..2ed680b 100644 --- a/script/deploy/DeployVaultFactory.s.sol +++ b/script/deploy/DeployVaultFactory.s.sol @@ -4,29 +4,29 @@ pragma solidity ^0.8.27; import {Script} from "forge-std/Script.sol"; import {VmSafe} from "forge-std/Vm.sol"; import "forge-std/console.sol"; -import {TermMaxFactory} from "contracts/factory/TermMaxFactory.sol"; -import {ITermMaxFactory} from "contracts/factory/ITermMaxFactory.sol"; -import {ITermMaxRouter} from "contracts/router/ITermMaxRouter.sol"; -import {MarketViewer} from "contracts/router/MarketViewer.sol"; +import {TermMaxFactory} from "contracts/v1/factory/TermMaxFactory.sol"; +import {ITermMaxFactory} from "contracts/v1/factory/ITermMaxFactory.sol"; +import {ITermMaxRouter} from "contracts/v1/router/ITermMaxRouter.sol"; +import {MarketViewer} from "contracts/v1/router/MarketViewer.sol"; import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; -import {TermMaxMarket} from "contracts/TermMaxMarket.sol"; -import {MockERC20} from "contracts/test/MockERC20.sol"; -import {MockPriceFeed} from "contracts/test/MockPriceFeed.sol"; -import {MarketConfig} from "contracts/storage/TermMaxStorage.sol"; -import {IMintableERC20} from "contracts/tokens/IMintableERC20.sol"; +import {TermMaxMarket} from "contracts/v1/TermMaxMarket.sol"; +import {MockERC20} from "contracts/v1/test/MockERC20.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {MarketConfig} from "contracts/v1/storage/TermMaxStorage.sol"; +import {IMintableERC20} from "contracts/v1/tokens/IMintableERC20.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; -import {SwapAdapter} from "contracts/test/testnet/SwapAdapter.sol"; -import {Faucet} from "contracts/test/testnet/Faucet.sol"; +import {SwapAdapter} from "contracts/v1/test/testnet/SwapAdapter.sol"; +import {Faucet} from "contracts/v1/test/testnet/Faucet.sol"; import {DeployBase} from "./DeployBase.s.sol"; -import {IOracle} from "contracts/oracle/IOracle.sol"; -import {VaultFactory, IVaultFactory} from "contracts/factory/VaultFactory.sol"; -import {KyberswapV2Adapter} from "contracts/router/swapAdapters/KyberswapV2Adapter.sol"; -import {OdosV2Adapter} from "contracts/router/swapAdapters/OdosV2Adapter.sol"; -import {PendleSwapV3Adapter} from "contracts/router/swapAdapters/PendleSwapV3Adapter.sol"; -import {UniswapV3Adapter} from "contracts/router/swapAdapters/UniswapV3Adapter.sol"; -import {ERC4626VaultAdapter} from "contracts/router/swapAdapters/ERC4626VaultAdapter.sol"; -import {AccessManager} from "contracts/access/AccessManager.sol"; +import {IOracle} from "contracts/v1/oracle/IOracle.sol"; +import {VaultFactory, IVaultFactory} from "contracts/v1/factory/VaultFactory.sol"; +import {KyberswapV2Adapter} from "contracts/v1/router/swapAdapters/KyberswapV2Adapter.sol"; +import {OdosV2Adapter} from "contracts/v1/router/swapAdapters/OdosV2Adapter.sol"; +import {PendleSwapV3Adapter} from "contracts/v1/router/swapAdapters/PendleSwapV3Adapter.sol"; +import {UniswapV3Adapter} from "contracts/v1/router/swapAdapters/UniswapV3Adapter.sol"; +import {ERC4626VaultAdapter} from "contracts/v1/router/swapAdapters/ERC4626VaultAdapter.sol"; +import {AccessManager} from "contracts/v1/access/AccessManager.sol"; contract DeployVaultFactory is DeployBase { // Network-specific config loaded from environment variables diff --git a/script/order-history-tracker.ts b/script/order-history-tracker.ts deleted file mode 100644 index dda0d53..0000000 --- a/script/order-history-tracker.ts +++ /dev/null @@ -1,1424 +0,0 @@ -#!/usr/bin/env node - -import { ethers } from 'ethers'; -import * as fs from 'fs'; -import { abiTermMaxOrder } from '../abi_typescript/abiTermMaxOrder'; - -// Type definitions for the script -interface TokenInfo { - address: string; - name: string; - symbol: string; - decimals: number; - error?: string; -} - -interface MarketConfig { - treasurer: string; - maturity: string; - maturityDate: string; -} - -interface MarketTokens { - ft: TokenInfo; - xt: TokenInfo; - gt: { - address: string; - }; - collateral: TokenInfo; - debtToken: TokenInfo; -} - -interface MarketInfo { - address: string; - config: MarketConfig | null; - tokens: MarketTokens; - error?: string; -} - -interface OrderConfig { - maxXtReserve: string; - gtId: string; - swapTrigger: string; -} - -interface OrderInfo { - address: string; - marketAddress: string; - marketInfo: MarketInfo; - makerAddress: string; - ftReserve: string; - xtReserve: string; - orderConfig: OrderConfig | null; - error?: string; -} - -interface BaseEvent { - blockNumber: number; - transactionHash: string; - logIndex: number; - eventType: string; - operationType: 'Swap' | 'Deposit' | 'Withdraw' | 'UpdateCurve' | 'Create' | string; - timestamp: number | null; - date?: string; - sortKey?: string; - daysToMaturity?: number; -} - -interface SwapEvent extends BaseEvent { - tokenIn: string; - tokenOut: string; - caller: string; - recipient: string; - tokenInAmount: ethers.BigNumber; - tokenOutAmount: ethers.BigNumber; - feeAmount: ethers.BigNumber; - tokenInSymbol?: string; - tokenOutSymbol?: string; - tokenInAmountFormatted?: string; - tokenOutAmountFormatted?: string; - feeAmountFormatted?: string; - direction?: 'LEND' | 'BORROW' | 'OTHER'; - abstractTokenInSymbol?: string; - abstractTokenOutSymbol?: string; - abstractTokenInAmountFormatted?: string; - abstractTokenOutAmountFormatted?: string; - avgMatchedInterestRate?: number; -} - -interface UpdateOrderEvent extends BaseEvent { - ftChangeAmt: ethers.BigNumber; - xtChangeAmt: ethers.BigNumber; - gtId: ethers.BigNumber; - maxXtReserve: ethers.BigNumber; - swapTrigger: string; - ftChangeAmtFormatted?: string; - xtChangeAmtFormatted?: string; - maxXtReserveFormatted?: string; -} - -interface WithdrawAssetsEvent extends BaseEvent { - token: string; - owner: string; - recipient: string; - amount: ethers.BigNumber; - tokenSymbol?: string; - amountFormatted?: string; -} - -interface OrderInitializedEvent extends BaseEvent { - market: string; - maker: string; - maxXtReserve: ethers.BigNumber; - swapTrigger: string; - maxXtReserveFormatted?: string; -} - -type EventType = SwapEvent | UpdateOrderEvent | WithdrawAssetsEvent | OrderInitializedEvent; - -interface EventsCollection { - swaps: SwapEvent[]; - deposits: UpdateOrderEvent[]; - withdrawals: (UpdateOrderEvent | WithdrawAssetsEvent)[]; - updateCurves: UpdateOrderEvent[]; - creations: OrderInitializedEvent[]; - all: EventType[]; -} - -interface DisplayOptions { - limit?: number; - detailed?: boolean; -} - -/** - * Helper function to construct proper tuple type strings - * This is a critical function for correctly generating event signatures with complex tuple types - * @param input - ABI input parameter - * @returns Properly formatted type string - */ -function constructTupleType(input: any): string { - // Handle tuple type - if (input.type === 'tuple') { - // Process all components of the tuple - const componentsType = input.components.map((comp: any) => { - if (comp.type === 'tuple' || comp.type.endsWith('[]')) { - return constructTupleType(comp); - } - return comp.type; - }).join(','); - return `tuple(${componentsType})`; - } - // Handle array of tuples - else if (input.type.endsWith('[]')) { - const baseType = input.type.substring(0, input.type.length - 2); - if (baseType === 'tuple') { - const componentsType = input.components.map((comp: any) => { - if (comp.type === 'tuple' || comp.type.endsWith('[]')) { - return constructTupleType(comp); - } - return comp.type; - }).join(','); - return `tuple(${componentsType})[]`; - } - return input.type; - } - // Return simple type as is - return input.type; -} - -// Extract event signatures from ABI with additional debugging -function extractEventSignatures(abi: readonly any[]) { - const eventSignatures: Record = {}; - - // Filter to get just the events from the ABI - const events = abi.filter(item => item.type === 'event'); - - // Generate signature and hash for each event - events.forEach(event => { - try { - const paramTypes = event.inputs.map((input: any) => { - // For tuples, we need special handling to match the Solidity signature format - if (input.type === 'tuple' || input.type.endsWith('[]')) { - return constructTupleType(input); - } - return input.type; - }).join(','); - - const signature = `${event.name}(${paramTypes})`; - const hash = ethers.utils.id(signature); - eventSignatures[event.name] = hash; - } catch (error) { - console.error(`Error processing event ${event.name}: ${error instanceof Error ? error.message : String(error)}`); - } - }); - - return eventSignatures; -} - -// Extract event signatures from ABI -const eventTopics = extractEventSignatures(abiTermMaxOrder); - -// Using the imported abiTermMaxOrder instead of defining a separate orderABI - -// ABI for reading TermMaxMarket contract data -const marketABI = [ - "function tokens() external view returns (address, address, address, address, address)", - "function config() external view returns (tuple(address treasurer, uint64 maturity, tuple(uint64 borrowTakerFeeRatio, uint64 borrowMakerFeeRatio, uint64 lendTakerFeeRatio, uint64 lendMakerFeeRatio, uint64 mintGtFeeRatio, uint64 mintGtFeeRef) feeConfig))" -]; - -// ABI for basic ERC20 token information -const erc20ABI = [ - "function name() external view returns (string)", - "function symbol() external view returns (string)", - "function decimals() external view returns (uint8)" -]; - -/** - * Fetch token information - * @param tokenAddress - Address of the token - * @param provider - Ethers provider - * @returns Basic information about the token - */ -async function getTokenInfo(tokenAddress: string, provider: ethers.providers.Provider): Promise { - try { - const tokenContract = new ethers.Contract(tokenAddress, erc20ABI, provider); - - const [name, symbol, decimals] = await Promise.all([ - tokenContract.name().catch(() => 'Unknown'), - tokenContract.symbol().catch(() => 'Unknown'), - tokenContract.decimals().catch(() => 18) - ]); - - return { - address: tokenAddress, - name, - symbol, - decimals - }; - } catch (error) { - return { - address: tokenAddress, - name: 'Unknown', - symbol: 'Unknown', - decimals: 18, - error: error instanceof Error ? error.message : String(error) - }; - } -} - -/** - * Fetch market details from the contract - * @param marketAddress - Address of the TermMaxMarket contract - * @param provider - Ethers provider - * @returns Detailed information about the market - */ -async function getMarketInfo(marketAddress: string, provider: ethers.providers.Provider): Promise { - console.log(`Fetching market information for: ${marketAddress}`); - - const marketContract = new ethers.Contract(marketAddress, marketABI, provider); - - try { - // Get token addresses from the market - const [ft, xt, gt, collateral, debtToken] = await marketContract.tokens(); - console.log(`Found tokens: FT=${ft}, XT=${xt}, GT=${gt}, collateral=${collateral}, debtToken=${debtToken}`); - - // Get market configuration - let marketConfig: MarketConfig | null = null; - try { - const config = await marketContract.config(); - marketConfig = { - treasurer: config.treasurer, - maturity: config.maturity.toString(), - maturityDate: new Date(config.maturity.toNumber() * 1000).toISOString() - }; - console.log(`Market maturity: ${marketConfig.maturityDate}`); - console.log(`Market treasurer: ${marketConfig.treasurer}`); - } catch (error) { - console.log("Could not fetch market configuration details"); - } - - // Get token details - const [ftInfo, xtInfo, collateralInfo, debtTokenInfo] = await Promise.all([ - getTokenInfo(ft, provider), - getTokenInfo(xt, provider), - getTokenInfo(collateral, provider), - getTokenInfo(debtToken, provider) - ]); - - console.log(`FT Token: ${ftInfo.symbol} (${ftInfo.name})`); - console.log(`XT Token: ${xtInfo.symbol} (${xtInfo.name})`); - console.log(`Collateral: ${collateralInfo.symbol} (${collateralInfo.name})`); - console.log(`Debt Token: ${debtTokenInfo.symbol} (${debtTokenInfo.name})`); - - return { - address: marketAddress, - config: marketConfig, - tokens: { - ft: ftInfo, - xt: xtInfo, - gt: { - address: gt - }, - collateral: collateralInfo, - debtToken: debtTokenInfo - } - }; - } catch (error) { - console.error("Error fetching market information:", error instanceof Error ? error.message : String(error)); - return { - address: marketAddress, - config: null, - tokens: {} as MarketTokens, - error: error instanceof Error ? error.message : String(error) - }; - } -} - -/** - * Fetch order details from the contract - * @param orderAddress - Address of the TermMaxOrder contract - * @param provider - Ethers provider - * @returns Basic information about the order - */ -async function getOrderInfo(orderAddress: string, provider: ethers.providers.Provider): Promise { - console.log(`Fetching order information for: ${orderAddress}`); - - const orderContract = new ethers.Contract(orderAddress, abiTermMaxOrder, provider); - - try { - // Get market address - const marketAddress = await orderContract.market(); - console.log(`Market address: ${marketAddress}`); - - // Get market information - const marketInfo = await getMarketInfo(marketAddress, provider); - - // Get maker (owner) address - const makerAddress = await orderContract.maker(); - console.log(`Maker address: ${makerAddress}`); - - // Get token reserves - const [ftReserve, xtReserve] = await orderContract.tokenReserves(); - - // Format reserves based on token decimals - const ftDecimals = marketInfo.tokens?.ft?.decimals || 18; - const xtDecimals = marketInfo.tokens?.xt?.decimals || 18; - - console.log(`Current FT reserve: ${ethers.utils.formatUnits(ftReserve, ftDecimals)} ${marketInfo.tokens?.ft?.symbol || 'FT'}`); - console.log(`Current XT reserve: ${ethers.utils.formatUnits(xtReserve, xtDecimals)} ${marketInfo.tokens?.xt?.symbol || 'XT'}`); - - // Try to get order configuration (may fail if structure is different) - let orderConfig: OrderConfig | null = null; - try { - const config = await orderContract.orderConfig(); - orderConfig = { - maxXtReserve: config.maxXtReserve.toString(), - gtId: config.gtId.toString(), - swapTrigger: config.swapTrigger - }; - console.log(`Max XT reserve: ${ethers.utils.formatUnits(config.maxXtReserve, xtDecimals)} ${marketInfo.tokens?.xt?.symbol || 'XT'}`); - } catch (error) { - console.log("Could not fetch order configuration details"); - } - - return { - address: orderAddress, - marketAddress, - marketInfo, - makerAddress, - ftReserve: ftReserve.toString(), - xtReserve: xtReserve.toString(), - orderConfig - }; - } catch (error) { - console.error("Error fetching order information:", error instanceof Error ? error.message : String(error)); - return { - address: orderAddress, - marketAddress: '', - marketInfo: {} as MarketInfo, - makerAddress: '', - ftReserve: '0', - xtReserve: '0', - orderConfig: null, - error: error instanceof Error ? error.message : String(error) - }; - } -} - -/** - * Collect and categorize events from the specified order contract - * @param orderAddress - Address of the TermMaxOrder contract - * @param provider - Ethers provider - * @param startBlock - Starting block for event scanning - * @param endBlock - Ending block for event scanning - * @returns Categorized events - */ -async function collectOrderEvents( - orderAddress: string, - provider: ethers.providers.Provider, - startBlock: number, - endBlock?: number -): Promise { - // Create contract interface for parsing events - const iface = new ethers.utils.Interface(abiTermMaxOrder); - - // Events collection - const events: EventsCollection = { - swaps: [], - deposits: [], - withdrawals: [], - updateCurves: [], - creations: [], - all: [] - }; - - console.log(`Collecting events for order: ${orderAddress}`); - console.log(`Scanning blocks ${startBlock} to ${endBlock || 'latest'}...`); - - // Get current block if endBlock not specified - if (!endBlock) { - endBlock = await provider.getBlockNumber(); - console.log(`Using current block ${endBlock} as end block`); - } - - // Create contract instance for better event filtering - const orderContract = new ethers.Contract(orderAddress, abiTermMaxOrder, provider); - - try { - // Collect all relevant events using queryFilter which handles complex event types better - console.log(`Querying events from block ${startBlock} to ${endBlock}...`); - - // Define batch size to avoid too large requests - const BATCH_SIZE = 10000; - - // Arrays to hold all events - let swapExactEvents: ethers.Event[] = []; - let swapToExactEvents: ethers.Event[] = []; - let updateOrderEvents: ethers.Event[] = []; - let withdrawEvents: ethers.Event[] = []; - let initEvents: ethers.Event[] = []; - - // Process in batches - for (let fromBlock = startBlock; fromBlock <= endBlock; fromBlock += BATCH_SIZE) { - const toBlock = Math.min(fromBlock + BATCH_SIZE - 1, endBlock); - - console.log(`Querying events from block ${fromBlock} to ${toBlock}...`); - - // Collect events in this batch - const [ - batchSwapExactEvents, - batchSwapToExactEvents, - batchUpdateOrderEvents, - batchWithdrawEvents, - batchInitEvents - ] = await Promise.all([ - orderContract.queryFilter(orderContract.filters.SwapExactTokenToToken(), fromBlock, toBlock), - orderContract.queryFilter(orderContract.filters.SwapTokenToExactToken(), fromBlock, toBlock), - orderContract.queryFilter(orderContract.filters.UpdateOrder(), fromBlock, toBlock), - orderContract.queryFilter(orderContract.filters.WithdrawAssets(), fromBlock, toBlock), - orderContract.queryFilter(orderContract.filters.OrderInitialized(), fromBlock, toBlock) - ]); - - console.log(`Found in blocks ${fromBlock}-${toBlock}: ` + - `SwapExact=${batchSwapExactEvents.length}, ` + - `SwapToExact=${batchSwapToExactEvents.length}, ` + - `UpdateOrder=${batchUpdateOrderEvents.length}, ` + - `Withdraw=${batchWithdrawEvents.length}, ` + - `Init=${batchInitEvents.length}`); - - // Append batch results to the main arrays - swapExactEvents = swapExactEvents.concat(batchSwapExactEvents); - swapToExactEvents = swapToExactEvents.concat(batchSwapToExactEvents); - updateOrderEvents = updateOrderEvents.concat(batchUpdateOrderEvents); - withdrawEvents = withdrawEvents.concat(batchWithdrawEvents); - initEvents = initEvents.concat(batchInitEvents); - } - - // Log the total events found after batching - console.log(`Total events found: ` + - `SwapExact=${swapExactEvents.length}, ` + - `SwapToExact=${swapToExactEvents.length}, ` + - `UpdateOrder=${updateOrderEvents.length}, ` + - `Withdraw=${withdrawEvents.length}, ` + - `Init=${initEvents.length}`); - - // Process SwapExactTokenToToken events - for (const event of swapExactEvents) { - try { - // Use type assertion to handle the arguments - const args = event.args as any; - if (!args) { - console.error(`Missing arguments in SwapExactTokenToToken event`); - continue; - } - - const tokenIn = args.tokenIn; - const tokenOut = args.tokenOut; - const caller = args.caller || ''; - const recipient = args.recipient || ''; - const tokenAmtIn = args.tokenAmtIn; - const netTokenOut = args.netTokenOut; - const feeAmt = args.feeAmt; - - // Ensure we have the required values before proceeding - if (!tokenIn || !tokenOut) { - console.error(`Missing required parameters in SwapExactTokenToToken event`); - continue; - } - - const swapEvent: SwapEvent = { - blockNumber: event.blockNumber, - transactionHash: event.transactionHash, - logIndex: event.logIndex, - eventType: 'SwapExactTokenToToken', - operationType: 'Swap', - tokenIn, - tokenOut, - caller, - recipient, - tokenInAmount: tokenAmtIn ? ethers.BigNumber.from(tokenAmtIn) : ethers.BigNumber.from(0), - tokenOutAmount: netTokenOut ? ethers.BigNumber.from(netTokenOut) : ethers.BigNumber.from(0), - feeAmount: feeAmt ? ethers.BigNumber.from(feeAmt) : ethers.BigNumber.from(0), - timestamp: null // Will be populated later if needed - }; - - events.swaps.push(swapEvent); - events.all.push({ - ...swapEvent, - sortKey: `${event.blockNumber.toString().padStart(10, '0')}-${event.logIndex.toString().padStart(5, '0')}` - }); - } catch (error) { - console.error(`Error processing SwapExactTokenToToken event: ${error instanceof Error ? error.message : String(error)}`); - } - } - - // Process SwapTokenToExactToken events - for (const event of swapToExactEvents) { - try { - // Use type assertion to handle the arguments - const args = event.args as any; - if (!args) { - console.error(`Missing arguments in SwapTokenToExactToken event`); - continue; - } - - const tokenIn = args.tokenIn; - const tokenOut = args.tokenOut; - const caller = args.caller || ''; - const recipient = args.recipient || ''; - const tokenAmtOut = args.tokenAmtOut; - const netTokenIn = args.netTokenIn; - const feeAmt = args.feeAmt; - - // Ensure we have the required values before proceeding - if (!tokenIn || !tokenOut) { - console.error(`Missing required parameters in SwapTokenToExactToken event`); - continue; - } - - const swapEvent: SwapEvent = { - blockNumber: event.blockNumber, - transactionHash: event.transactionHash, - logIndex: event.logIndex, - eventType: 'SwapTokenToExactToken', - operationType: 'Swap', - tokenIn, - tokenOut, - caller, - recipient, - tokenInAmount: netTokenIn ? ethers.BigNumber.from(netTokenIn) : ethers.BigNumber.from(0), - tokenOutAmount: tokenAmtOut ? ethers.BigNumber.from(tokenAmtOut) : ethers.BigNumber.from(0), - feeAmount: feeAmt ? ethers.BigNumber.from(feeAmt) : ethers.BigNumber.from(0), - timestamp: null // Will be populated later if needed - }; - - events.swaps.push(swapEvent); - events.all.push({ - ...swapEvent, - sortKey: `${event.blockNumber.toString().padStart(10, '0')}-${event.logIndex.toString().padStart(5, '0')}` - }); - } catch (error) { - console.error(`Error processing SwapTokenToExactToken event: ${error instanceof Error ? error.message : String(error)}`); - } - } - - // Process UpdateOrder events - for (const event of updateOrderEvents) { - try { - // Use type assertion to handle the arguments - const args = event.args as any; - if (!args) { - console.error(`Missing arguments in UpdateOrder event`); - continue; - } - - const curveCuts = args.curveCuts; - const ftChangeAmt = args.ftChangeAmt; - const xtChangeAmt = args.xtChangeAmt; - const gtId = args.gtId; - const maxXtReserve = args.maxXtReserve; - const swapTrigger = args.swapTrigger || ''; - - // Ensure we have the required values before proceeding - if (ftChangeAmt === undefined || xtChangeAmt === undefined) { - console.error(`Missing required parameters in UpdateOrder event`); - continue; - } - - // Determine if this is a deposit, withdrawal, or just a curve update - let operationType: 'Deposit' | 'Withdraw' | 'UpdateCurve' = 'UpdateCurve'; - if (ethers.BigNumber.from(ftChangeAmt).gt(0) || ethers.BigNumber.from(xtChangeAmt).gt(0)) { - operationType = 'Deposit'; - } else if (ethers.BigNumber.from(ftChangeAmt).lt(0) || ethers.BigNumber.from(xtChangeAmt).lt(0)) { - operationType = 'Withdraw'; - } - - const updateEvent: UpdateOrderEvent = { - blockNumber: event.blockNumber, - transactionHash: event.transactionHash, - logIndex: event.logIndex, - eventType: 'UpdateOrder', - operationType, - ftChangeAmt: ethers.BigNumber.from(ftChangeAmt), - xtChangeAmt: ethers.BigNumber.from(xtChangeAmt), - gtId: gtId ? ethers.BigNumber.from(gtId) : ethers.BigNumber.from(0), - maxXtReserve: maxXtReserve ? ethers.BigNumber.from(maxXtReserve) : ethers.BigNumber.from(0), - swapTrigger, - timestamp: null, // Will be populated later if needed - }; - - events.updateCurves.push(updateEvent); - - // Add to the appropriate category - if (operationType === 'Deposit') { - events.deposits.push(updateEvent); - } else if (operationType === 'Withdraw') { - events.withdrawals.push(updateEvent); - } - - events.all.push({ - ...updateEvent, - sortKey: `${event.blockNumber.toString().padStart(10, '0')}-${event.logIndex.toString().padStart(5, '0')}` - }); - } catch (error) { - console.error(`Error processing UpdateOrder event: ${error instanceof Error ? error.message : String(error)}`); - } - } - - // Process WithdrawAssets events - for (const event of withdrawEvents) { - try { - // Use type assertion to handle the arguments - const args = event.args as any; - if (!args) { - console.error(`Missing arguments in WithdrawAssets event`); - continue; - } - - const token = args.token; - const owner = args.owner; - const caller = args.caller; - const recipient = args.recipient || ''; - const amount = args.amount; - - // Ensure we have the required values before proceeding - if (!token || !amount) { - console.error(`Missing required parameters in WithdrawAssets event`); - continue; - } - - const withdrawEvent: WithdrawAssetsEvent = { - blockNumber: event.blockNumber, - transactionHash: event.transactionHash, - logIndex: event.logIndex, - eventType: 'WithdrawAssets', - operationType: 'Withdraw', - token, - owner: owner || caller || '', - recipient, - amount: ethers.BigNumber.from(amount), - timestamp: null // Will be populated later if needed - }; - - events.withdrawals.push(withdrawEvent); - events.all.push({ - ...withdrawEvent, - sortKey: `${event.blockNumber.toString().padStart(10, '0')}-${event.logIndex.toString().padStart(5, '0')}` - }); - } catch (error) { - console.error(`Error processing WithdrawAssets event: ${error instanceof Error ? error.message : String(error)}`); - } - } - - // Process OrderInitialized events - for (const event of initEvents) { - try { - // Use type assertion to handle the arguments - const args = event.args as any; - if (!args) { - console.error(`Missing arguments in OrderInitialized event`); - continue; - } - - const market = args.market; - const maker = args.maker; - const maxXtReserve = args.maxXtReserve; - const swapTrigger = args.swapTrigger || ''; - const curveCuts = args.curveCuts; - - // Ensure we have the required values before proceeding - if (!market || !maker) { - console.error(`Missing required parameters in OrderInitialized event`); - continue; - } - - const initEvent: OrderInitializedEvent = { - blockNumber: event.blockNumber, - transactionHash: event.transactionHash, - logIndex: event.logIndex, - eventType: 'OrderInitialized', - operationType: 'Create', // New operation type for order creation - market, - maker, - maxXtReserve: maxXtReserve ? ethers.BigNumber.from(maxXtReserve) : ethers.BigNumber.from(0), - swapTrigger, - timestamp: null // Will be populated later if needed - }; - - events.creations.push(initEvent); - events.all.push({ - ...initEvent, - sortKey: `${event.blockNumber.toString().padStart(10, '0')}-${event.logIndex.toString().padStart(5, '0')}` - }); - } catch (error) { - console.error(`Error processing OrderInitialized event: ${error instanceof Error ? error.message : String(error)}`); - } - } - } catch (error) { - console.error(`Error collecting events: ${error instanceof Error ? error.message : String(error)}`); - } - - console.log(`Collected events: ${events.all.length} total`); - console.log(`- Swaps: ${events.swaps.length}`); - console.log(`- Deposits: ${events.deposits.length}`); - console.log(`- Withdrawals: ${events.withdrawals.length}`); - console.log(`- Update Curves: ${events.updateCurves.length}`); - console.log(`- Creations: ${events.creations.length}`); - - return events; -} - -/** - * Format BigNumber to human-readable string with proper decimals - * @param amount - Amount to format - * @param decimals - Number of decimals - * @returns Formatted string - */ -function formatAmount(amount: ethers.BigNumber | string | undefined, decimals: number = 18): string { - if (!amount || typeof amount === 'string') { - return amount?.toString() || '0'; - } - - try { - return ethers.utils.formatUnits(amount, decimals); - } catch (error) { - console.error(`Error formatting amount: ${error instanceof Error ? error.message : String(error)}`); - return '0'; - } -} - -/** - * Enrich events with additional data like timestamps and token details - * @param events - Object containing categorized events - * @param orderInfo - Information about the order and tokens - * @param provider - Ethers provider - * @returns - Enriched events - */ -async function enrichEvents( - events: EventsCollection, - orderInfo: OrderInfo, - provider: ethers.providers.Provider -): Promise { - console.log(`Enriching ${events.all.length} events with additional data...`); - - // Group events by block number to minimize RPC calls - const blockNumbers = [...new Set(events.all.map(event => event.blockNumber))]; - - // Get block data in batches - const blockData: Record = {}; - const BATCH_SIZE = 50; - - for (let i = 0; i < blockNumbers.length; i += BATCH_SIZE) { - const batch = blockNumbers.slice(i, i + BATCH_SIZE); - console.log(`Fetching timestamps for blocks ${i} to ${i + batch.length - 1} of ${blockNumbers.length}...`); - - const promises = batch.map(blockNum => provider.getBlock(blockNum)); - const blocks = await Promise.all(promises); - - blocks.forEach(block => { - if (block) { - blockData[block.number] = { - timestamp: block.timestamp - }; - } - }); - } - - // Token info for better display - const tokens = orderInfo?.marketInfo?.tokens || {}; - const tokenDecimals: Record = {}; - const tokenSymbols: Record = {}; - - if (tokens.ft) { - tokenDecimals[tokens.ft.address.toLowerCase()] = tokens.ft.decimals; - tokenSymbols[tokens.ft.address.toLowerCase()] = tokens.ft.symbol; - } - - if (tokens.xt) { - tokenDecimals[tokens.xt.address.toLowerCase()] = tokens.xt.decimals; - tokenSymbols[tokens.xt.address.toLowerCase()] = tokens.xt.symbol; - } - - if (tokens.debtToken) { - tokenDecimals[tokens.debtToken.address.toLowerCase()] = tokens.debtToken.decimals; - tokenSymbols[tokens.debtToken.address.toLowerCase()] = tokens.debtToken.symbol; - } - - if (tokens.collateral) { - tokenDecimals[tokens.collateral.address.toLowerCase()] = tokens.collateral.decimals; - tokenSymbols[tokens.collateral.address.toLowerCase()] = tokens.collateral.symbol; - } - - const debtTokenDecimals = tokens.debtToken?.decimals || 18; - const ftDecimals = tokens.ft?.decimals || 18; - const xtDecimals = tokens.xt?.decimals || 18; - - // Enrich swap events - events.swaps = events.swaps.map(event => { - // Add timestamp - if (blockData[event.blockNumber]) { - event.timestamp = blockData[event.blockNumber].timestamp; - event.date = new Date(event.timestamp * 1000).toISOString(); - } - - // Add token details - const tokenInLower = event.tokenIn?.toLowerCase(); - const tokenOutLower = event.tokenOut?.toLowerCase(); - - event.tokenInSymbol = tokenSymbols[tokenInLower] || 'Unknown'; - event.tokenOutSymbol = tokenSymbols[tokenOutLower] || 'Unknown'; - - const tokenInDecimals = tokenDecimals[tokenInLower] || 18; - const tokenOutDecimals = tokenDecimals[tokenOutLower] || 18; - - // Add formatted amounts with proper decimals - event.tokenInAmountFormatted = formatAmount(event.tokenInAmount, tokenInDecimals); - event.tokenOutAmountFormatted = formatAmount(event.tokenOutAmount, tokenOutDecimals); - event.feeAmountFormatted = formatAmount(event.feeAmount, debtTokenDecimals); - - // Determine transaction direction (Lend/Borrow/Other) - const ftTokenAddress = tokens.ft?.address?.toLowerCase(); - const xtTokenAddress = tokens.xt?.address?.toLowerCase(); - const debtTokenAddress = tokens.debtToken?.address?.toLowerCase(); - - // Calculate days to maturity for interest rates - if (event.timestamp && orderInfo.marketInfo.config?.maturity) { - event.daysToMaturity = Math.floor((parseInt(orderInfo.marketInfo.config.maturity) - event.timestamp) / 86400); - } - - if (tokenInLower === ftTokenAddress && tokenOutLower === debtTokenAddress) { - event.direction = 'LEND'; - event.abstractTokenInSymbol = tokens.ft.symbol; - event.abstractTokenOutSymbol = tokens.xt.symbol; - - event.abstractTokenInAmountFormatted = formatAmount( - ethers.BigNumber.from(event.tokenInAmount).sub(event.tokenOutAmount), - debtTokenDecimals - ); - event.abstractTokenOutAmountFormatted = event.tokenOutAmountFormatted; - - if (event.daysToMaturity && event.daysToMaturity > 0) { - const abstractIn = parseFloat(event.abstractTokenInAmountFormatted); - const abstractOut = parseFloat(event.abstractTokenOutAmountFormatted); - event.avgMatchedInterestRate = (abstractIn / abstractOut) * (365 / event.daysToMaturity); - } - } else if (tokenInLower === debtTokenAddress && tokenOutLower === xtTokenAddress) { - event.direction = 'LEND'; - event.abstractTokenInSymbol = tokens.ft.symbol; - event.abstractTokenOutSymbol = tokens.xt.symbol; - - event.abstractTokenInAmountFormatted = event.tokenInAmountFormatted; - event.abstractTokenOutAmountFormatted = formatAmount( - ethers.BigNumber.from(event.tokenOutAmount).sub(event.tokenInAmount), - debtTokenDecimals - ); - - if (event.daysToMaturity && event.daysToMaturity > 0) { - const abstractIn = parseFloat(event.abstractTokenInAmountFormatted); - const abstractOut = parseFloat(event.abstractTokenOutAmountFormatted); - event.avgMatchedInterestRate = (abstractIn / abstractOut) * (365 / event.daysToMaturity); - } - } else if (tokenInLower === xtTokenAddress && tokenOutLower === debtTokenAddress) { - event.direction = 'BORROW'; - event.abstractTokenInSymbol = tokens.xt.symbol; - event.abstractTokenOutSymbol = tokens.ft.symbol; - - event.abstractTokenInAmountFormatted = formatAmount( - ethers.BigNumber.from(event.tokenInAmount).sub(event.tokenOutAmount), - debtTokenDecimals - ); - event.abstractTokenOutAmountFormatted = event.tokenOutAmountFormatted; - - if (event.daysToMaturity && event.daysToMaturity > 0) { - const abstractIn = parseFloat(event.abstractTokenInAmountFormatted); - const abstractOut = parseFloat(event.abstractTokenOutAmountFormatted); - event.avgMatchedInterestRate = (abstractOut / abstractIn) * (365 / event.daysToMaturity); - } - } else if (tokenInLower === debtTokenAddress && tokenOutLower === ftTokenAddress) { - event.direction = 'BORROW'; - event.abstractTokenInSymbol = tokens.xt.symbol; - event.abstractTokenOutSymbol = tokens.ft.symbol; - - event.abstractTokenInAmountFormatted = event.tokenInAmountFormatted; - event.abstractTokenOutAmountFormatted = formatAmount( - ethers.BigNumber.from(event.tokenOutAmount).sub(event.tokenInAmount), - debtTokenDecimals - ); - - if (event.daysToMaturity && event.daysToMaturity > 0) { - const abstractIn = parseFloat(event.abstractTokenInAmountFormatted); - const abstractOut = parseFloat(event.abstractTokenOutAmountFormatted); - event.avgMatchedInterestRate = (abstractOut / abstractIn) * (365 / event.daysToMaturity); - } - } else { - event.direction = 'OTHER'; - } - - return event; - }); - - // Enrich deposit, withdrawal and update events - const updateEnrichment = (event: UpdateOrderEvent | WithdrawAssetsEvent): UpdateOrderEvent | WithdrawAssetsEvent => { - // Add timestamp - if (blockData[event.blockNumber]) { - event.timestamp = blockData[event.blockNumber].timestamp; - event.date = new Date(event.timestamp * 1000).toISOString(); - } - - // For UpdateOrder events, add formatted amounts - if (event.eventType === 'UpdateOrder' && 'ftChangeAmt' in event) { - event.ftChangeAmtFormatted = formatAmount(event.ftChangeAmt, ftDecimals); - event.xtChangeAmtFormatted = formatAmount(event.xtChangeAmt, xtDecimals); - event.maxXtReserveFormatted = formatAmount(event.maxXtReserve, xtDecimals); - } - - // For WithdrawAssets events, add token details - if (event.eventType === 'WithdrawAssets' && 'token' in event) { - const tokenLower = event.token?.toLowerCase(); - event.tokenSymbol = tokenSymbols[tokenLower] || 'Unknown'; - const tokenDecimal = tokenDecimals[tokenLower] || 18; - event.amountFormatted = formatAmount(event.amount, tokenDecimal); - } - - return event; - }; - - events.deposits = events.deposits.map(updateEnrichment) as UpdateOrderEvent[]; - events.withdrawals = events.withdrawals.map(updateEnrichment) as (UpdateOrderEvent | WithdrawAssetsEvent)[]; - events.updateCurves = events.updateCurves.map(updateEnrichment) as UpdateOrderEvent[]; - - // Enrich creation events - events.creations = events.creations.map(event => { - // Add timestamp - if (blockData[event.blockNumber]) { - event.timestamp = blockData[event.blockNumber].timestamp; - event.date = new Date(event.timestamp * 1000).toISOString(); - } - - // Format maxXtReserve with proper decimals - event.maxXtReserveFormatted = formatAmount(event.maxXtReserve, xtDecimals); - - return event; - }); - - // Enrich all events and sort them - events.all = events.all.map(event => { - if (event.eventType === 'SwapExactTokenToToken' || event.eventType === 'SwapTokenToExactToken') { - const matchingSwap = events.swaps.find( - swap => swap.transactionHash === event.transactionHash && swap.logIndex === event.logIndex - ); - return matchingSwap || event; - } else if (event.eventType === 'UpdateOrder') { - const matchingUpdate = [...events.deposits, ...events.withdrawals, ...events.updateCurves].find( - update => update.transactionHash === event.transactionHash && update.logIndex === event.logIndex - ) as UpdateOrderEvent; - return matchingUpdate || event; - } else if (event.eventType === 'WithdrawAssets') { - const matchingWithdraw = events.withdrawals.find( - withdraw => withdraw.transactionHash === event.transactionHash && withdraw.logIndex === event.logIndex - ) as WithdrawAssetsEvent; - return matchingWithdraw || event; - } else if (event.eventType === 'OrderInitialized') { - const matchingInit = events.creations.find( - creation => creation.transactionHash === event.transactionHash && creation.logIndex === event.logIndex - ) as OrderInitializedEvent; - return matchingInit || event; - } - return event; - }); - - // Sort all events by block number (descending) and log index (ascending) - events.all.sort((a, b) => { - if (a.blockNumber !== b.blockNumber) { - return b.blockNumber - a.blockNumber; // Newer blocks first - } - return a.logIndex - b.logIndex; // Earlier logs first within the same block - }); - - return events; -} - -/** - * Print event history in a readable format - * @param events - Object with categorized events - * @param options - Display options - */ -function printEventHistory(events: EventsCollection, options: DisplayOptions = {}): void { - const { limit = 20, detailed = false } = options; - - if (events.all.length === 0) { - console.log("No events found"); - return; - } - - const displayEvents = events.all.slice(0, limit); - - console.log(`\n--- Order History (showing ${displayEvents.length} of ${events.all.length} events) ---`); - console.log("Date | Block | Type | Operation | Details"); - console.log("-----------+---------+------------+-----------+------------------------------------"); - - for (const event of displayEvents) { - let dateStr = event.date ? event.date.substring(0, 10) : 'Unknown'; - let typeStr = (event.eventType || 'Unknown').padEnd(12); - let operationStr = (event.operationType || 'Unknown').padEnd(11); - let detailsStr = ''; - - switch (event.operationType) { - case 'Swap': { - const swapEvent = event as SwapEvent; - const direction = swapEvent.direction || ''; - detailsStr = `${direction}: ${swapEvent.abstractTokenInAmountFormatted} ${swapEvent.abstractTokenInSymbol} → ${swapEvent.abstractTokenOutAmountFormatted} ${swapEvent.abstractTokenOutSymbol}`; - break; - } - case 'Deposit': { - const depositEvent = event as UpdateOrderEvent; - let depositDetails: string[] = []; - if (depositEvent.ftChangeAmt && depositEvent.ftChangeAmt.gt(0)) { - depositDetails.push(`${depositEvent.ftChangeAmtFormatted} FT`); - } - if (depositEvent.xtChangeAmt && depositEvent.xtChangeAmt.gt(0)) { - depositDetails.push(`${depositEvent.xtChangeAmtFormatted} XT`); - } - detailsStr = `Add: ${depositDetails.join(' and ')}`; - break; - } - case 'Withdraw': { - if (event.eventType === 'WithdrawAssets') { - const withdrawEvent = event as WithdrawAssetsEvent; - detailsStr = `Remove: ${withdrawEvent.amountFormatted} ${withdrawEvent.tokenSymbol}`; - } else { - const withdrawEvent = event as UpdateOrderEvent; - let withdrawDetails: string[] = []; - if (withdrawEvent.ftChangeAmt && withdrawEvent.ftChangeAmt.lt(0)) { - withdrawDetails.push(`${withdrawEvent.ftChangeAmtFormatted?.replace('-', '')} FT`); - } - if (withdrawEvent.xtChangeAmt && withdrawEvent.xtChangeAmt.lt(0)) { - withdrawDetails.push(`${withdrawEvent.xtChangeAmtFormatted?.replace('-', '')} XT`); - } - detailsStr = `Remove: ${withdrawDetails.join(' and ')}`; - } - break; - } - case 'UpdateCurve': { - const updateEvent = event as UpdateOrderEvent; - detailsStr = `Max XT Reserve: ${updateEvent.maxXtReserveFormatted}`; - break; - } - case 'Create': { - const createEvent = event as OrderInitializedEvent; - detailsStr = `Order Created, Max XT Reserve: ${createEvent.maxXtReserveFormatted}, Maker: ${createEvent.maker.substring(0, 10)}...`; - break; - } - default: - detailsStr = event.eventType; - } - - console.log( - `${dateStr} | ${event.blockNumber} | ${typeStr} | ${operationStr} | ${detailsStr}` - ); - } - - // Show detailed view if requested - if (detailed && displayEvents.length > 0) { - console.log("\n--- Detailed Event View ---"); - - for (let i = 0; i < Math.min(5, displayEvents.length); i++) { - const event = displayEvents[i]; - console.log(`\nEvent #${i + 1}:`); - console.log(`Hash: ${event.transactionHash}`); - console.log(`Block: ${event.blockNumber} | Log Index: ${event.logIndex}`); - console.log(`Type: ${event.eventType}`); - console.log(`Operation: ${event.operationType}`); - console.log(`Date: ${event.date || 'Unknown'}`); - - switch (event.operationType) { - case 'Swap': { - const swapEvent = event as SwapEvent; - console.log(`Direction: ${swapEvent.direction}`); - console.log(`Token In: ${swapEvent.tokenInAmountFormatted} ${swapEvent.tokenInSymbol} (${swapEvent.tokenIn})`); - console.log(`Token Out: ${swapEvent.tokenOutAmountFormatted} ${swapEvent.tokenOutSymbol} (${swapEvent.tokenOut})`); - console.log(`Fee: ${swapEvent.feeAmountFormatted}`); - console.log(`Caller: ${swapEvent.caller}`); - console.log(`Recipient: ${swapEvent.recipient}`); - break; - } - case 'Deposit': - case 'Withdraw': - case 'UpdateCurve': { - if (event.eventType === 'UpdateOrder') { - const updateEvent = event as UpdateOrderEvent; - console.log(`FT Change: ${updateEvent.ftChangeAmtFormatted}`); - console.log(`XT Change: ${updateEvent.xtChangeAmtFormatted}`); - console.log(`Max XT Reserve: ${updateEvent.maxXtReserveFormatted}`); - console.log(`GT ID: ${updateEvent.gtId.toString()}`); - console.log(`Swap Trigger: ${updateEvent.swapTrigger}`); - } else if (event.eventType === 'WithdrawAssets') { - const withdrawEvent = event as WithdrawAssetsEvent; - console.log(`Token: ${withdrawEvent.tokenSymbol} (${withdrawEvent.token})`); - console.log(`Amount: ${withdrawEvent.amountFormatted}`); - console.log(`Owner: ${withdrawEvent.owner}`); - console.log(`Recipient: ${withdrawEvent.recipient}`); - } - break; - } - case 'Create': { - const createEvent = event as OrderInitializedEvent; - console.log(`Market: ${createEvent.market}`); - console.log(`Maker: ${createEvent.maker}`); - console.log(`Max XT Reserve: ${createEvent.maxXtReserveFormatted}`); - console.log(`Swap Trigger: ${createEvent.swapTrigger}`); - break; - } - } - } - } - - if (events.all.length > limit) { - console.log(`\n... and ${events.all.length - limit} more events`); - } -} - -/** - * Generate a CSV file with order history - * @param events - Object with categorized events - * @param filename - Output filename for the CSV - */ -function generateCsvFile(events: EventsCollection, filename: string): void { - // Define CSV header - const header = 'Date,Block,Operation,Direction,Amount,InterestRate\n'; - - // Initialize CSV content with header - let csvContent = header; - - // Sort events by block number (ascending) to show chronological order in the CSV - const sortedEvents = [...events.all].sort((a, b) => a.blockNumber - b.blockNumber); - - for (const event of sortedEvents) { - // Only include events with a date (those we've enriched with timestamps) - if (event.date) { - let date = event.date.substring(0, 10); - let blockNumber = event.blockNumber; - let operation = event.operationType || 'Unknown'; - let direction = (event as SwapEvent).direction || 'N/A'; - let amount: string | number = 0; - let interestRate = (event as SwapEvent).avgMatchedInterestRate || ''; - - // Determine amount based on direction - if (direction === 'LEND') { - const swapEvent = event as SwapEvent; - amount = swapEvent.abstractTokenOutAmountFormatted || '0'; - } else if (direction === 'BORROW') { - const swapEvent = event as SwapEvent; - amount = swapEvent.abstractTokenInAmountFormatted || '0'; - } else if (operation === 'Deposit' && (event as UpdateOrderEvent).ftChangeAmtFormatted) { - const depositEvent = event as UpdateOrderEvent; - direction = 'DEPOSIT'; - amount = depositEvent.ftChangeAmtFormatted?.replace('-', '') || '0'; - } else if (operation === 'Withdraw' && (event as UpdateOrderEvent).ftChangeAmtFormatted) { - const withdrawEvent = event as UpdateOrderEvent; - direction = 'WITHDRAW'; - amount = withdrawEvent.ftChangeAmtFormatted?.replace('-', '') || '0'; - } else if (operation === 'Create') { - const createEvent = event as OrderInitializedEvent; - direction = 'CREATE'; - amount = createEvent.maxXtReserveFormatted || '0'; - } - - // Skip rows that don't have meaningful amounts - if (amount) { - // Escape any commas in the values - csvContent += `${date},${blockNumber},${operation},${direction},${amount},${interestRate}\n`; - } - } - } - - // Write to file - fs.writeFileSync(filename, csvContent); - console.log(`\nCSV order history exported to ${filename}`); -} - -/** - * Helper function to convert BigNumber values to strings for JSON serialization - * @param event - Event object to process - * @returns Processed event with BigNumber values converted to strings - */ -function processEventForJson(event: EventType): Record { - const result: Record = { ...event }; - - // Convert known BigNumber fields to strings - const bigNumberFields = [ - 'tokenInAmount', 'tokenOutAmount', 'feeAmount', 'amount', - 'ftChangeAmt', 'xtChangeAmt', 'maxXtReserve', 'gtId' - ]; - - for (const field of bigNumberFields) { - if (result[field] && typeof result[field] !== 'string' && result[field].toString) { - result[field] = result[field].toString(); - } - } - - // Delete sort key as it's not needed in JSON output - delete result.sortKey; - - return result; -} - -/** - * Process token objects for JSON serialization - * @param tokens - Token objects to process - * @returns Processed tokens - */ -function processMappedTokens(tokens?: MarketTokens): Record { - if (!tokens) return {}; - - const result: Record = {}; - for (const key in tokens) { - if (Object.prototype.hasOwnProperty.call(tokens, key)) { - result[key] = { ...(tokens as any)[key] }; - } - } - - return result; -} - -interface CommandOptions { - startBlock?: number; - endBlock?: number; - includeTimestamps?: boolean; - showDetails?: boolean; - limit?: number; - outputFile?: string; - csvFile?: string; -} - -async function main(): Promise { - // Get command line arguments - const args = process.argv.slice(2); - - if (args.length < 2) { - console.error("Usage: node order-history-tracker.js [options]"); - console.error("Options:"); - console.error(" --start-block Starting block number (default: 0)"); - console.error(" --end-block Ending block number (default: current)"); - console.error(" --include-timestamps Include timestamps in output"); - console.error(" --show-details Show detailed information for events"); - console.error(" --limit Maximum number of events to display (default: 20)"); - console.error(" --output-file Save results to JSON file (default: order-history.json)"); - console.error(" --csv-file Export order history to CSV file"); - process.exit(1); - } - - const orderAddress = args[0]; - const rpcUrl = args[1]; - - // Parse options from remaining arguments - const options: CommandOptions = {}; - for (let i = 2; i < args.length; i++) { - if (args[i] === '--start-block' && i + 1 < args.length) { - options.startBlock = parseInt(args[i + 1]); - i++; // Skip the next argument - } else if (args[i] === '--end-block' && i + 1 < args.length) { - options.endBlock = parseInt(args[i + 1]); - i++; // Skip the next argument - } else if (args[i] === '--include-timestamps') { - options.includeTimestamps = true; - } else if (args[i] === '--show-details') { - options.showDetails = true; - } else if (args[i] === '--limit' && i + 1 < args.length) { - options.limit = parseInt(args[i + 1]); - i++; // Skip the next argument - } else if (args[i] === '--output-file' && i + 1 < args.length) { - options.outputFile = args[i + 1]; - i++; // Skip the next argument - } else if (args[i] === '--output-file') { - options.outputFile = 'order-history.json'; // Default filename if none provided - } else if (args[i] === '--csv-file' && i + 1 < args.length) { - options.csvFile = args[i + 1]; - i++; // Skip the next argument - } else if (args[i] === '--csv-file') { - options.csvFile = 'order-history.csv'; // Default filename if none provided - } - } - - try { - // Get an ethers provider - const provider = new ethers.providers.JsonRpcProvider(rpcUrl); - - // Step 0: Get order information - const orderInfo = await getOrderInfo(orderAddress, provider); - - // Step 1: Collect events - let events = await collectOrderEvents( - orderAddress, - provider, - options.startBlock || 0, - options.endBlock - ); - - // Step 2: Optionally enrich events with additional data - if (options.includeTimestamps || true) { // Always enrich for better display - events = await enrichEvents(events, orderInfo, provider); - } - - // Step 3: Print event history - printEventHistory(events, { - limit: options.limit || 20, - detailed: options.showDetails || false - }); - - // Step 4: Save to JSON file if outputFile option is specified - if (options.outputFile) { - // Convert BigNumber to string for JSON serialization - const jsonEvents = { - swaps: events.swaps.map(processEventForJson), - deposits: events.deposits.map(processEventForJson), - withdrawals: events.withdrawals.map(processEventForJson), - updateCurves: events.updateCurves.map(processEventForJson), - creations: events.creations.map(processEventForJson), - all: events.all.map(processEventForJson), - orderInfo: { - ...orderInfo, - ftReserve: orderInfo.ftReserve, - xtReserve: orderInfo.xtReserve, - marketInfo: { - ...orderInfo.marketInfo, - tokens: processMappedTokens(orderInfo.marketInfo?.tokens) - } - } - }; - - fs.writeFileSync(options.outputFile, JSON.stringify(jsonEvents, null, 2)); - console.log(`\nResults saved to ${options.outputFile}`); - } - - // Step 5: Generate CSV file if requested - if (options.csvFile) { - generateCsvFile(events, options.csvFile); - } - - // Print summary stats - console.log("\n--- Order Summary ---"); - console.log(`Total Events: ${events.all.length}`); - console.log(`- Swaps: ${events.swaps.length}`); - console.log(`- Deposits: ${events.deposits.length}`); - console.log(`- Withdrawals: ${events.withdrawals.length}`); - console.log(`- Curve Updates: ${events.updateCurves.length}`); - console.log(`- Creations: ${events.creations.length}`); - - const marketInfo = orderInfo.marketInfo; - const tokens = marketInfo?.tokens || {}; - - if (marketInfo && tokens) { - const ftDecimals = tokens.ft?.decimals || 18; - const xtDecimals = tokens.xt?.decimals || 18; - - console.log("\n--- Current Reserves ---"); - console.log(`FT Reserve: ${formatAmount(ethers.BigNumber.from(orderInfo.ftReserve), ftDecimals)} ${tokens.ft?.symbol || 'FT'}`); - console.log(`XT Reserve: ${formatAmount(ethers.BigNumber.from(orderInfo.xtReserve), xtDecimals)} ${tokens.xt?.symbol || 'XT'}`); - - if (marketInfo.config) { - console.log(`\nMarket Maturity: ${marketInfo.config.maturityDate}`); - } - } - - } catch (error) { - console.error("Error tracking order history:", error instanceof Error ? error.message : String(error)); - process.exit(1); - } -} - -// Export functions for potential use in other scripts -export { - getTokenInfo, - getMarketInfo, - getOrderInfo, - collectOrderEvents, - enrichEvents, - formatAmount, - printEventHistory -}; - -// Run if this script is executed directly -if (require.main === module) { - main(); -} \ No newline at end of file diff --git a/script/transformAbi.ts b/script/transformAbi.ts deleted file mode 100644 index 309c813..0000000 --- a/script/transformAbi.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { readFileSync, writeFileSync } from 'fs'; -import { join } from 'path'; - -// List of JSON files to transform -const contractFiles = [ - './out/Faucet.sol/Faucet.json', - './out/TermMaxRouter.sol/TermMaxRouter.json', - './out/MintableERC20.sol/MintableERC20.json', - './out/GearingTokenWithERC20.sol/GearingTokenWithERC20.json', - './out/TermMaxMarket.sol/TermMaxMarket.json', - './out/TermMaxOrder.sol/TermMaxOrder.json', - './out/TermMaxVault.sol/TermMaxVault.json', - './out/VaultFactory.sol/VaultFactory.json', - './out/OracleAggregator.sol/OracleAggregator.json', - './out/TermMaxFactory.sol/TermMaxFactory.json', -]; - -const transformAbi = (filePath: string) => { - try { - // Read and parse the JSON file - const contractJson = JSON.parse(readFileSync(filePath, 'utf-8')); - - // Format the ABI - const formattedAbi = JSON.stringify(contractJson.abi, null, 2) - .replace(/"(\w+)":/g, '$1:') // Remove quotes from keys - .replace(/"/g, "'") // Replace double quotes with single quotes - .replace(/([^,{[])(\n\s*[}\]])/g, '$1,$2') // Add trailing commas - .replace(/(})(\n\s*])/g, '$1,$2'); // Ensure {} inside arrays get trailing commas - - // Extract contract name from path (e.g., Faucet.json -> Faucet) - const contractName = filePath.split('/').pop()?.replace('.json', '') || 'Contract'; - - // Define TypeScript content - const tsContent = `// This file is auto-generated. Do not edit manually.\n\nexport const abi${contractName} = ${formattedAbi} as const;\n`; - - // Define output filename - const outputFileName = join('./abi_typescript', `abi${contractName}.ts`); - - // Write the transformed TypeScript file - writeFileSync(outputFileName, tsContent); - console.log(`ABI transformed successfully: ${outputFileName}`); - } catch (error) { - console.error(`Error processing ${filePath}:`, error); - } -}; - -// Process all contract files -contractFiles.forEach(transformAbi); From abc18e219c0f7b98873cd43ece158f098524c84e Mon Sep 17 00:00:00 2001 From: "Aaron C.-W. Liang" Date: Sat, 21 Jun 2025 11:54:26 +0800 Subject: [PATCH 102/194] update adapter to v2 --- script.sh | 2 +- script/deploy/DeployAdapters.s.sol | 18 +++++++++--------- script/deploy/DeployBase.s.sol | 23 +++++++++++++---------- 3 files changed, 23 insertions(+), 20 deletions(-) diff --git a/script.sh b/script.sh index 325be89..e4f59b5 100755 --- a/script.sh +++ b/script.sh @@ -76,7 +76,7 @@ done # Validate network case $NETWORK in - "eth-sepolia"|"arb-sepolia"|"eth-mainnet"|"arb-mainnet") + "eth-sepolia"|"arb-sepolia"|"eth-mainnet"|"arb-mainnet"|"bnb-mainnet"|"bnb-testnet") echo "Running on $NETWORK..." ;; *) diff --git a/script/deploy/DeployAdapters.s.sol b/script/deploy/DeployAdapters.s.sol index d8bad0d..ff7ac5b 100644 --- a/script/deploy/DeployAdapters.s.sol +++ b/script/deploy/DeployAdapters.s.sol @@ -21,12 +21,11 @@ import {Faucet} from "contracts/v1/test/testnet/Faucet.sol"; import {DeployBase} from "./DeployBase.s.sol"; import {IOracle} from "contracts/v1/oracle/IOracle.sol"; import {VaultFactory, IVaultFactory} from "contracts/v1/factory/VaultFactory.sol"; -import {KyberswapV2Adapter} from "contracts/v1/router/swapAdapters/KyberswapV2Adapter.sol"; -import {OdosV2Adapter} from "contracts/v1/router/swapAdapters/OdosV2Adapter.sol"; -import {PendleSwapV3Adapter} from "contracts/v1/router/swapAdapters/PendleSwapV3Adapter.sol"; -import {UniswapV3Adapter} from "contracts/v1/router/swapAdapters/UniswapV3Adapter.sol"; -import {ERC4626VaultAdapter} from "contracts/v1/router/swapAdapters/ERC4626VaultAdapter.sol"; import {AccessManager} from "contracts/v1/access/AccessManager.sol"; +import {UniswapV3AdapterV2} from "contracts/v1/router/specAdapters/UniswapV3AdapterV2.sol"; +import {OdosV2AdapterV2} from "contracts/v1/router/specAdapters/OdosV2AdapterV2.sol"; +import {PendleSwapV3AdapterV2} from "contracts/v1/router/specAdapters/PendleSwapV3AdapterV2.sol"; +import {ERC4626VaultAdapterV2} from "contracts/v1/router/specAdapters/ERC4626VaultAdapterV2.sol"; contract DeployAdapters is DeployBase { // Network-specific config loaded from environment variables @@ -42,10 +41,10 @@ contract DeployAdapters is DeployBase { AccessManager accessManager; ITermMaxRouter router; - UniswapV3Adapter uniswapV3Adapter; - OdosV2Adapter odosV2Adapter; - PendleSwapV3Adapter pendleSwapV3Adapter; - ERC4626VaultAdapter vaultAdapter; + UniswapV3AdapterV2 uniswapV3Adapter; + OdosV2AdapterV2 odosV2Adapter; + PendleSwapV3AdapterV2 pendleSwapV3Adapter; + ERC4626VaultAdapterV2 vaultAdapter; function setUp() public { // Load network from environment variable @@ -95,6 +94,7 @@ contract DeployAdapters is DeployBase { if ( keccak256(abi.encodePacked(network)) == keccak256(abi.encodePacked("eth-mainnet")) || keccak256(abi.encodePacked(network)) == keccak256(abi.encodePacked("arb-mainnet")) + || keccak256(abi.encodePacked(network)) == keccak256(abi.encodePacked("bnb-mainnet")) ) { (uniswapV3Adapter, odosV2Adapter, pendleSwapV3Adapter, vaultAdapter) = deployAdaptersMainnet( accessManagerAddr, routerAddr, uniswapV3RouterAddr, odosV2RouterAddr, pendleSwapV3RouterAddr diff --git a/script/deploy/DeployBase.s.sol b/script/deploy/DeployBase.s.sol index 34a2e25..be9adb2 100644 --- a/script/deploy/DeployBase.s.sol +++ b/script/deploy/DeployBase.s.sol @@ -32,11 +32,14 @@ import { LoanConfig, VaultInitialParams } from "contracts/v1/storage/TermMaxStorage.sol"; -import {KyberswapV2Adapter} from "contracts/v1/router/swapAdapters/KyberswapV2Adapter.sol"; +import {ERC4626VaultAdapterV2} from "contracts/v1/router/specAdapters/ERC4626VaultAdapterV2.sol"; +import {OdosV2AdapterV2} from "contracts/v1/router/specAdapters/OdosV2AdapterV2.sol"; +import {PendleSwapV3AdapterV2} from "contracts/v1/router/specAdapters/PendleSwapV3AdapterV2.sol"; +import {UniswapV3AdapterV2} from "contracts/v1/router/specAdapters/UniswapV3AdapterV2.sol"; +import {ERC4626VaultAdapter} from "contracts/v1/router/swapAdapters/ERC4626VaultAdapter.sol"; import {OdosV2Adapter} from "contracts/v1/router/swapAdapters/OdosV2Adapter.sol"; import {PendleSwapV3Adapter} from "contracts/v1/router/swapAdapters/PendleSwapV3Adapter.sol"; import {UniswapV3Adapter} from "contracts/v1/router/swapAdapters/UniswapV3Adapter.sol"; -import {ERC4626VaultAdapter} from "contracts/v1/router/swapAdapters/ERC4626VaultAdapter.sol"; import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; import {AccessManager} from "contracts/v1/access/AccessManager.sol"; import {StringHelper} from "../utils/StringHelper.sol"; @@ -173,10 +176,10 @@ contract DeployBase is Script { ) public returns ( - UniswapV3Adapter uniswapV3Adapter, - OdosV2Adapter odosV2Adapter, - PendleSwapV3Adapter pendleSwapV3Adapter, - ERC4626VaultAdapter vaultAdapter + UniswapV3AdapterV2 uniswapV3Adapter, + OdosV2AdapterV2 odosV2Adapter, + PendleSwapV3AdapterV2 pendleSwapV3Adapter, + ERC4626VaultAdapterV2 vaultAdapter ) { // deploy access manager @@ -186,10 +189,10 @@ contract DeployBase is Script { TermMaxRouter router = TermMaxRouter(routerAddr); // deploy and whitelist swap adapter - uniswapV3Adapter = new UniswapV3Adapter(address(uniswapV3Router)); - odosV2Adapter = new OdosV2Adapter(odosV2Router); - pendleSwapV3Adapter = new PendleSwapV3Adapter(address(pendleSwapV3Router)); - vaultAdapter = new ERC4626VaultAdapter(); + uniswapV3Adapter = new UniswapV3AdapterV2(address(uniswapV3Router)); + odosV2Adapter = new OdosV2AdapterV2(odosV2Router); + pendleSwapV3Adapter = new PendleSwapV3AdapterV2(address(pendleSwapV3Router)); + vaultAdapter = new ERC4626VaultAdapterV2(); accessManager.setAdapterWhitelist(router, address(uniswapV3Adapter), true); accessManager.setAdapterWhitelist(router, address(odosV2Adapter), true); From e817861699888c5f46317db48069f9f3de30cc10 Mon Sep 17 00:00:00 2001 From: "Aaron C.-W. Liang" Date: Sat, 21 Jun 2025 16:07:05 +0800 Subject: [PATCH 103/194] update --- script/deploy/DeployAdapters.s.sol | 2 ++ 1 file changed, 2 insertions(+) diff --git a/script/deploy/DeployAdapters.s.sol b/script/deploy/DeployAdapters.s.sol index ff7ac5b..1838799 100644 --- a/script/deploy/DeployAdapters.s.sol +++ b/script/deploy/DeployAdapters.s.sol @@ -86,6 +86,8 @@ contract DeployAdapters is DeployBase { function run() public { console.log("Network:", network); console.log("Deployer balance:", deployerAddr.balance); + console.log("Git commit hash:"); + console.logBytes(getGitCommitHash()); uint256 currentBlock = block.number; uint256 currentTimestamp = block.timestamp; From 91637cffdc2f0f59f783893bcdae860420b4fa98 Mon Sep 17 00:00:00 2001 From: Vincent Date: Sat, 21 Jun 2025 12:00:39 +0800 Subject: [PATCH 104/194] Deploy USDC/PT-cUSDO market. Deploy ETH and ARB adapters --- .../1/run-1750473958.json | 354 ++++++++++++++++ .../DeployAdapters.s.sol/1/run-latest.json | 354 ++++++++++++++++ .../42161/run-latest.json | 390 ++++++++++++++++++ .../DeployMarket.s.sol/1/run-1750477645.json | 222 ++++++++++ .../DeployMarket.s.sol/1/run-latest.json | 222 ++++++++++ .../arb-mainnet/arb-mainnet-adapters.json | 18 + .../eth-mainnet/eth-mainnet-adapters.json | 18 + ...ket-USDC-PT-cUSDO-20NOV2025@21NOV2025.json | 38 ++ script/deploy/deploydata/eth-mainnet.json | 69 +--- 9 files changed, 1630 insertions(+), 55 deletions(-) create mode 100644 broadcast/DeployAdapters.s.sol/1/run-1750473958.json create mode 100644 broadcast/DeployAdapters.s.sol/1/run-latest.json create mode 100644 broadcast/DeployAdapters.s.sol/42161/run-latest.json create mode 100644 broadcast/DeployMarket.s.sol/1/run-1750477645.json create mode 100644 broadcast/DeployMarket.s.sol/1/run-latest.json create mode 100644 deployments/arb-mainnet/arb-mainnet-adapters.json create mode 100644 deployments/eth-mainnet/eth-mainnet-adapters.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-USDC-PT-cUSDO-20NOV2025@21NOV2025.json diff --git a/broadcast/DeployAdapters.s.sol/1/run-1750473958.json b/broadcast/DeployAdapters.s.sol/1/run-1750473958.json new file mode 100644 index 0000000..24586e6 --- /dev/null +++ b/broadcast/DeployAdapters.s.sol/1/run-1750473958.json @@ -0,0 +1,354 @@ +{ + "transactions": [ + { + "hash": "0x285f30cc30eaab1ac799d72d57f614051fd2e063de938a14a773335e3733e574", + "transactionType": "CREATE", + "contractName": "UniswapV3Adapter", + "contractAddress": "0xece68c88d0d1789bd13a8519fba51eb870fa0cc7", + "function": null, + "arguments": [ + "0xE592427A0AEce92De3Edee1F18E0157C05861564" + ], + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "gas": "0xb9660", + "value": "0x0", + "input": "0x60a034606e57601f610a1838819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606e57516001600160a01b03811690819003606e57608052604051610991908161008782396080518181816065015261015c0152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146105485780636563c0e9146104c85780639df303251461048c578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b1610582565b6100b9610598565b5060443567ffffffffffffffff8111610094576100da9036906004016105ec565b60643567ffffffffffffffff8111610094576100fa9036906004016105ec565b906020815191818082019384920101031261009457516040516370a0823160e01b8152306004820152926001600160a01b0316602084602481845afa9384156103b9575f94610458575b5060405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166004820181905260248201849052906020816044815f875af180156103b957610421575b5083518401906080856020840193031261009457602085015167ffffffffffffffff811161009457850182603f82011215610094576020810151906101e4826105d0565b936101f260405195866105ae565b8285526040828401011161009457815f926040602093018387015e8401015260408501519060806060870151960151928584029380850487149015171561037357861561040d5760405160a081019080821067ffffffffffffffff8311176103f9576020956102ac935f9360405282528682019030825260408301968752606083019a8a8c5260808401910481526040519a8b978896879563c04b8d5960e01b87528b60048801525160a0602488015260c4870190610688565b93516001600160a01b031660448601525160648501525160848401525160a483015203925af19283156103b9575f936103c4575b506020602491604051928380926370a0823160e01b82523060048301525afa9081156103b9575f91610387575b508361031983836106ac565b036103525761034e836040519060208201526020815261033a6040826105ae565b604051918291602083526020830190610688565b0390f35b909150820391821161037357638e17b66b60e01b5f5260045260245260445ffd5b634e487b7160e01b5f52601160045260245ffd5b90506020813d6020116103b1575b816103a2602093836105ae565b8101031261009457518461030d565b3d9150610395565b6040513d5f823e3d90fd5b9092506020813d6020116103f1575b816103e0602093836105ae565b8101031261009457519160206102e0565b3d91506103d3565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b6020813d602011610450575b8161043a602093836105ae565b81010312610094575180151581146101a0575f80fd5b3d915061042d565b9093506020813d602011610484575b81610474602093836105ae565b8101031261009457519284610144565b3d9150610467565b346100945761049a36610632565b9190602083519381808201958692010103126100945791516104c69290916001600160a01b03166107a3565b005b34610094576080366003190112610094576104e1610582565b6104e9610598565b906044356001600160a01b03811681036100945760643567ffffffffffffffff81116100945761051d9036906004016105ec565b92602084519481808201968792010103126100945792516104c69390926001600160a01b031661073b565b346100945761055636610632565b9190602083519381808201958692010103126100945791516104c69290916001600160a01b03166106b9565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff8211176103f957604052565b67ffffffffffffffff81116103f957601f01601f191660200190565b81601f8201121561009457803590610603826105d0565b9261061160405194856105ae565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff821161009457610685916004016105ec565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9190820180921161037357565b9091905f19821461072c576001600160a01b03831630148015610724575b61071f5760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261071d91906107186064836105ae565b610903565b565b505050565b5081156106d7565b630d550c3b60e11b5f5260045ffd5b9092915f19831461072c576001600160a01b03908116931691828414801561079b575b6107955761071d93604051936323b872dd60e01b6020860152602485015260448401526064830152606482526107186084836105ae565b50505050565b50801561075e565b821580156108f1575b61071f57604051636eb1769f60e11b81523060048201526001600160a01b03838116602483018190529490831691602081604481865afa9081156103b9575f916108bd575b50610839946108476108066020945f946106ac565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529687906064820190565b03601f1981018852876105ae565b85519082865af1903d5f51908361089e575b5050501561086657505050565b61071861071d936040519063095ea7b360e01b602083015260248201525f6044820152604481526108986064826105ae565b82610903565b919250906108b357503b15155b5f8080610859565b60019150146108ab565b90506020813d6020116108e9575b816108d8602093836105ae565b8101031261009457516108396107f1565b3d91506108cb565b506001600160a01b03821630146107ac565b905f602091828151910182855af1156103b9575f513d61095257506001600160a01b0381163b155b6109325750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b6001141561092b56fea26469706673582212206ad8ebc6ec787a48097d03c1fbb2ad1b7bd771674b19f2f62398a14d8b67431064736f6c634300081b0033000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564", + "nonce": "0x363", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xbd570f787d17545500e716109468f03dcbebd9691b82268687e076a0cdee5ada", + "transactionType": "CREATE", + "contractName": "OdosV2Adapter", + "contractAddress": "0xd402019cd1ec046dd74a70922f24c2e3cbb05e24", + "function": null, + "arguments": [ + "0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559" + ], + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "gas": "0xcfd2b", + "value": "0x0", + "input": "0x60a034606e57601f610b5f38819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606e57516001600160a01b03811690819003606e57608052604051610ad890816100878239608051818181606501526101600152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b1461064a5780636563c0e9146105ca5780639df303251461058e578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b1610684565b6100b961069a565b9060443567ffffffffffffffff8111610094576100da9036906004016106ee565b9060643567ffffffffffffffff8111610094576100fb9036906004016106ee565b916020815191818082019384920101031261009457516040516370a0823160e01b81523060048201529390916001600160a01b031690602085602481855afa948515610493575f9561055a575b5060405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600482018190526024820185905291906020816044815f885af1801561049357610523575b5084518501948060208701960361014081126100945760e013610094576040519060e0820182811067ffffffffffffffff82111761050f576040526101ec60208201610a05565b82526040810151926020830193845261020760608301610a05565b976040840198895261021b60808401610a05565b6060850190815260a08401516080860190815260c08501519060a0870191825261024760e08701610a05565b9260c0880193845261010087015167ffffffffffffffff811161009457870185603f8201121561009457602081015190610280826106d2565b9661028e60405198896106b0565b8288526040828401011161009457815f92604060209301838a015e870101526101208701516001600160a01b03811697908890036100945761014001519563ffffffff87168097036100945781516001600160a01b039182169116036104d3578b8251906102fb91610a19565b895161030691610a2c565b82528b83519061031591610a19565b895161032091610a2c565b83528b8952308452604051630ed8d73960e21b815297516001600160a01b0390811660048a0152985160248901529b51881660448801529a518716606487015299516084860152985160a4850152975190931660c483015261014060e4830152909586928392916103969061014485019061078a565b9161010484015261012483015203815a6020945f91f1928315610493575f9361049e575b506020602491604051928380926370a0823160e01b82523060048301525afa908115610493575f91610461575b50836103f383836107ae565b0361042c5761042883604051906020820152602081526104146040826106b0565b60405191829160208352602083019061078a565b0390f35b909150820391821161044d57638e17b66b60e01b5f5260045260245260445ffd5b634e487b7160e01b5f52601160045260245ffd5b90506020813d60201161048b575b8161047c602093836106b0565b810103126100945751846103e7565b3d915061046f565b6040513d5f823e3d90fd5b9092506020813d6020116104cb575b816104ba602093836106b0565b8101031261009457519160206103ba565b3d91506104ad565b60405162461bcd60e51b815260206004820152601460248201527324a72b20a624a22fa7aaaa282aaa2faa27a5a2a760611b6044820152606490fd5b634e487b7160e01b5f52604160045260245ffd5b6020813d602011610552575b8161053c602093836106b0565b81010312610094575180151581146101a5575f80fd5b3d915061052f565b9094506020813d602011610586575b81610576602093836106b0565b8101031261009457519385610148565b3d9150610569565b346100945761059c36610734565b9190602083519381808201958692010103126100945791516105c89290916001600160a01b03166108a5565b005b34610094576080366003190112610094576105e3610684565b6105eb61069a565b906044356001600160a01b03811681036100945760643567ffffffffffffffff81116100945761061f9036906004016106ee565b92602084519481808201968792010103126100945792516105c89390926001600160a01b031661083d565b346100945761065836610734565b9190602083519381808201958692010103126100945791516105c89290916001600160a01b03166107bb565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff82111761050f57604052565b67ffffffffffffffff811161050f57601f01601f191660200190565b81601f8201121561009457803590610705826106d2565b9261071360405194856106b0565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff821161009457610787916004016106ee565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9190820180921161044d57565b9091905f19821461082e576001600160a01b03831630148015610826575b6108215760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261081f919061081a6064836106b0565b610a4a565b565b505050565b5081156107d9565b630d550c3b60e11b5f5260045ffd5b9092915f19831461082e576001600160a01b03908116931691828414801561089d575b6108975761081f93604051936323b872dd60e01b60208601526024850152604484015260648301526064825261081a6084836106b0565b50505050565b508015610860565b821580156109f3575b61082157604051636eb1769f60e11b81523060048201526001600160a01b03838116602483018190529490831691602081604481865afa908115610493575f916109bf575b5061093b946109496109086020945f946107ae565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529687906064820190565b03601f1981018852876106b0565b85519082865af1903d5f5190836109a0575b5050501561096857505050565b61081a61081f936040519063095ea7b360e01b602083015260248201525f60448201526044815261099a6064826106b0565b82610a4a565b919250906109b557503b15155b5f808061095b565b60019150146109ad565b90506020813d6020116109eb575b816109da602093836106b0565b81010312610094575161093b6108f3565b3d91506109cd565b506001600160a01b03821630146108ae565b51906001600160a01b038216820361009457565b8181029291811591840414171561044d57565b8115610a36570490565b634e487b7160e01b5f52601260045260245ffd5b905f602091828151910182855af115610493575f513d610a9957506001600160a01b0381163b155b610a795750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b60011415610a7256fea26469706673582212204763315a6411a7960fce618c8c1b5d96ae7ea3c2ea7ebb92abcf095b95bbea1c64736f6c634300081b0033000000000000000000000000cf5540fffcdc3d510b18bfca6d2b9987b0772559", + "nonce": "0x364", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xf09987959d483053d251c4b92e8f9b37964ef6082632cf0d973286115b5c289f", + "transactionType": "CREATE", + "contractName": "PendleSwapV3Adapter", + "contractAddress": "0xfbbbb37aaa95a8f1c4498c9066318c2b5680fb84", + "function": null, + "arguments": [ + "0x888888888889758F76e7103c6CbF23ABbF58F946" + ], + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "gas": "0x17488f", + "value": "0x0", + "input": "0x60a0604052346100ea57604051601f6113d838819003918201601f19168301916001600160401b038311848410176100d6578084926020946040528339810103126100ea57516001600160a01b038116908190036100ea5760405160a081016001600160401b038111828210176100d657655af3107a4000916080916040525f81525f1960208201525f6040820152610100606082015201525f6008555f196009555f600a55610100600b55655af3107a4000600c556080526040516112e990816100ef8239608051818181608901526103200152f35b634e487b7160e01b5f52604160045260245ffd5b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816309316dd314610a6b575080633268263b14610a315780634ebfc814146109f25780636563c0e9146109725780639df3032514610936578063e0a80413146101f8578063f66a7749146100bc5763f887ea4014610074575f80fd5b346100b8575f3660031901126100b8576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b346100b8575f3660031901126100b8575f54604051905f6001548060011c91600182169182156101ee575b6020841083146101da5783865285929081156101bb575060011461015c575b61011292500383610c0d565b60ff60025416610150604051938361012e8660ff819716610d3f565b60081c6001600160a01b03166020850152608060408501819052840190610c43565b90151560608301520390f35b5060015f90815290917fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b81831061019f57505090602061011292820101610106565b6020919350806001915483858901015201910190918492610187565b6020925061011294915060ff191682840152151560051b820101610106565b634e487b7160e01b5f52602260045260245ffd5b92607f16926100e7565b346100b85760803660031901126100b857610211610c67565b610219610c7d565b9060443567ffffffffffffffff81116100b85761023a903690600401610c93565b9060643567ffffffffffffffff81116100b85761025b903690600401610c93565b91602081519181808201938492010103126100b857516040516370a0823160e01b8152306004820152936001600160a01b03909216929091602085602481875afa948515610551575f95610902575b5060018060a01b0316906060818051810103126100b85760208101516001600160a01b038116908190036100b857606060408301519201519260405192630b2339af60e21b8452606084600481865afa938415610551575f94610895575b5060405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600482018190526024820188905295906020816044815f8d5af1801561055157610878575b508681029080820488149015171561050b5781156108645704926001600160a01b0316908082036105ba57505060405163095ea7b360e01b81526001600160a01b038416600482015260248101859052926020846044815f8a5af1928315610551576104509460609461058d575b505f6103dd6111eb565b938885528760208601528860408601526104626040519788968795869463640fc23d60e11b86523060048701526024860152604485015260085460648501526009546084850152600a5460a4850152600b5460c4850152600c5460e4850152610140610104850152610144840190610fea565b8281036003190161012484015261119b565b03925af1908115610551576024916020915f9161055c575b50935b6040516370a0823160e01b815230600482015292839182905afa908115610551575f9161051f575b50836104b18383610d60565b036104ea576104e683604051906020820152602081526104d2604082610c0d565b604051918291602083526020830190610c43565b0390f35b909150820391821161050b57638e17b66b60e01b5f5260045260245260445ffd5b634e487b7160e01b5f52601160045260245ffd5b90506020813d602011610549575b8161053a60209383610c0d565b810103126100b85751846104a5565b3d915061052d565b6040513d5f823e3d90fd5b61057e915060603d606011610586575b6105768183610c0d565b810190610fcf565b50508661047a565b503d61056c565b6105ae9060203d6020116105b3575b6105a68183610c0d565b810190610fb7565b6103d3565b503d61059c565b90929593604051630bc4ed8360e21b8152602081600481885afa908115610551575f91610845575b501561073c5750505060206004916040519283809263781c18db60e01b82525afa908115610551575f916106fa575b5060405163a9059cbb60e01b81526001600160a01b039190911660048201819052602482018490529093906020856044815f875af1908115610551575f956020926106df575b5060246040518097819363bcb7ea5d60e01b83523060048401525af1938415610551575f946106ab575b5083818110610696575050602060249161047d565b63eb7f211d60e01b5f5260045260245260445ffd5b9093506020813d6020116106d7575b816106c760209383610c0d565b810103126100b857519285610681565b3d91506106ba565b6106f590833d85116105b3576105a68183610c0d565b610657565b90506020813d602011610734575b8161071560209383610c0d565b810103126100b857516001600160a01b03811681036100b85785610611565b3d9150610708565b60405163095ea7b360e01b81526001600160a01b0382166004820152602481018790529496929491935090916020836044815f8b5af18015610551576107e8956060956107d7955f93610828575b506107936111eb565b938185526020850152604084015260405196879586948593631652a23360e21b855230600486015260248501528a604485015260a0606485015260a4840190610fea565b82810360031901608484015261119b565b03925af1908115610551576024916020915f91610807575b509361047d565b610820915060603d606011610586576105768183610c0d565b505086610800565b6108409060203d6020116105b3576105a68183610c0d565b61078a565b61085e915060203d6020116105b3576105a68183610c0d565b896105e2565b634e487b7160e01b5f52601260045260245ffd5b6108909060203d6020116105b3576105a68183610c0d565b610365565b9093506060813d6060116108fa575b816108b160609383610c0d565b810103126100b85780516001600160a01b038116036100b8576020810151906001600160a01b03821682036100b857604001516001600160a01b038116036100b8579288610308565b3d91506108a4565b9094506020813d60201161092e575b8161091e60209383610c0d565b810103126100b8575193856102aa565b3d9150610911565b346100b85761094436610ce9565b9190602083519381808201958692010103126100b85791516109709290916001600160a01b0316610e57565b005b346100b85760803660031901126100b85761098b610c67565b610993610c7d565b906044356001600160a01b03811681036100b85760643567ffffffffffffffff81116100b8576109c7903690600401610c93565b92602084519481808201968792010103126100b85792516109709390926001600160a01b0316610def565b346100b8575f3660031901126100b85760a0600854600954600a54600b5490600c54926040519485526020850152604084015260608301526080820152f35b346100b857610a3f36610ce9565b9190602083519381808201958692010103126100b85791516109709290916001600160a01b0316610d6d565b346100b8575f3660031901126100b85760018060a01b0360035416600454915f6007548060011c90600181168015610b6c575b6020831081146101da57828552908115610b485750600114610aea575b5090610acc816104e6930382610c0d565b60405193849384526020840152606060408401526060830190610c43565b60075f9081527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688939250905b808210610b2e57509091508101602001610acc610abb565b919260018160209254838588010152019101909291610b16565b60ff191660208086019190915291151560051b84019091019150610acc9050610abb565b91607f1691610a9e565b5f92918154918260011c92600181168015610c03575b6020851081146101da57848452908115610be65750600114610bad57505050565b5f9081526020812093945091925b838310610bcc575060209250010190565b600181602092949394548385870101520191019190610bbb565b915050602093945060ff929192191683830152151560051b010190565b93607f1693610b8c565b90601f8019910116810190811067ffffffffffffffff821117610c2f57604052565b634e487b7160e01b5f52604160045260245ffd5b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036100b857565b602435906001600160a01b03821682036100b857565b81601f820112156100b85780359067ffffffffffffffff8211610c2f5760405192610cc8601f8401601f191660200185610c0d565b828452602083830101116100b857815f926020809301838601378301015290565b60606003198201126100b8576004356001600160a01b03811681036100b857916024356001600160a01b03811681036100b857916044359067ffffffffffffffff82116100b857610d3c91600401610c93565b90565b90600b821015610d4c5752565b634e487b7160e01b5f52602160045260245ffd5b9190820180921161050b57565b9091905f198214610de0576001600160a01b03831630148015610dd8575b610dd35760405163a9059cbb60e01b60208201526001600160a01b03939093166024840152604480840192909252908252610dd19190610dcc606483610c0d565b61125b565b565b505050565b508115610d8b565b630d550c3b60e11b5f5260045ffd5b9092915f198314610de0576001600160a01b039081169316918284148015610e4f575b610e4957610dd193604051936323b872dd60e01b602086015260248501526044840152606483015260648252610dcc608483610c0d565b50505050565b508015610e12565b82158015610fa5575b610dd357604051636eb1769f60e11b81523060048201526001600160a01b03838116602483018190529490831691602081604481865afa908115610551575f91610f71575b50610eed94610efb610eba6020945f94610d60565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529687906064820190565b03601f198101885287610c0d565b85519082865af1903d5f519083610f52575b50505015610f1a57505050565b610dcc610dd1936040519063095ea7b360e01b602083015260248201525f604482015260448152610f4c606482610c0d565b8261125b565b91925090610f6757503b15155b5f8080610f0d565b6001915014610f5f565b90506020813d602011610f9d575b81610f8c60209383610c0d565b810103126100b85751610eed610ea5565b3d9150610f7f565b506001600160a01b0382163014610e60565b908160209103126100b8575180151581036100b85790565b908160609103126100b8578051916040602083015192015190565b60809060018060a01b0381511683526020810151602084015260018060a01b03604082015116604084015260018060a01b03606082015116606084015201519060a0608082015261103f60a082018351610d3f565b60208201516001600160a01b031660c08201526040820151608060e08301526101009060609061107490610120850190610c43565b930151151591015290565b908060208354918281520160208260051b840101935f5260205f20925f905b8382106110ad57505050505090565b9091929394601f19828203018452606081528554606082015260018601546080820152600286015460a0820152600386015460ff81166004811015610d4c5760c08301526001600160a01b03600891821c811660e0840152600488015481166101008401526005880154811661012084015260068801541661014083015260078701546101608301528601546101808083019190915260098701546101a08301526101c0820152600190602090600d906111816111716101e08301600a8c01610b76565b82810385840152600b8b01610b76565b906040600c8b01549101529701940192019093929361109e565b610d3c9060018060a01b03600354168152600454602082015260a060408201526111db6111cc60a08301600561107f565b8281036060840152600661107f565b9060808183039101526007610b76565b6040519060a0820182811067ffffffffffffffff821117610c2f57604052815f81525f60208201525f60408201525f606082015260405190608082019082821067ffffffffffffffff831117610c2f576080916040525f83525f6020840152606060408401525f60608401520152565b905f602091828151910182855af115610551575f513d6112aa57506001600160a01b0381163b155b61128a5750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b6001141561128356fea26469706673582212201ee77fd202ede4dc014cdf8b197fb2ef16d65387626d9feaaf9b419b66e37d0764736f6c634300081b0033000000000000000000000000888888888889758f76e7103c6cbf23abbf58f946", + "nonce": "0x365", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x9f08285e86f6f696d8e67c8b9476df2ac90b6f6d8a455f8693fc88d56d9f6c0e", + "transactionType": "CREATE", + "contractName": "ERC4626VaultAdapter", + "contractAddress": "0xe62567e9a8969aae406195f7c4c7e4e85d4ed879", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "gas": "0xb5b9e", + "value": "0x0", + "input": "0x60808060405234601557610961908161001a8239f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b1461051c5780636563c0e91461049c5780639df30325146104605763e0a8041314610045575f80fd5b3461029d57608036600319011261029d5761005e610556565b61006661056c565b60443567ffffffffffffffff811161029d576100869036906004016105b8565b9160643567ffffffffffffffff811161029d576100a79036906004016105b8565b926020815191818082019384920101031261029d57516040516370a0823160e01b81523060048201529290916001600160a01b031690602084602481855afa9384156102a9575f9461042c575b5060018060a01b03169360608180518101031261029d57602081015190600282101561029d57606060408201519101518481029080820486149015171561025f57811561041857049080610328575060405163095ea7b360e01b81526001600160a01b038616600482015260248101849052946020866044815f875af19081156102a9575f966020926102fd575b50604460405180988193636e553f6560e01b83528860048401523060248401525af19485156102a9575f956102c9575b50848181106102b457505060206024915b6040516370a0823160e01b815230600482015292839182905afa9081156102a9575f91610273575b50826101f78383610664565b0361024157836040805160208101928352602081526102168282610582565b8151928391602083525180918160208501528484015e5f828201840152601f01601f19168101030190f35b820391821161025f57638e17b66b60e01b5f5260045260245260445ffd5b634e487b7160e01b5f52601160045260245ffd5b90506020813d6020116102a1575b8161028e60209383610582565b8101031261029d57515f6101eb565b5f80fd5b3d9150610281565b6040513d5f823e3d90fd5b63eb7f211d60e01b5f5260045260245260445ffd5b9094506020813d6020116102f5575b816102e560209383610582565b8101031261029d5751935f6101b2565b3d91506102d8565b61031c90833d8511610321575b6103148183610582565b8101906108bb565b610182565b503d61030a565b9094506001036104095760405163095ea7b360e01b81526001600160a01b0382166004820152602481018390526020816044815f865af180156102a9576103ec575b5060405193635d043b2960e11b85528260048601523060248601523060448601526020856064815f865af19485156102a9575f956103b8575b50848181106102b457505060206024916101c3565b9094506020813d6020116103e4575b816103d460209383610582565b8101031261029d5751935f6103a3565b3d91506103c7565b6104049060203d602011610321576103148183610582565b61036a565b634a7f394f60e01b5f5260045ffd5b634e487b7160e01b5f52601260045260245ffd5b9093506020813d602011610458575b8161044860209383610582565b8101031261029d5751925f6100f4565b3d915061043b565b3461029d5761046e3661060e565b91906020835193818082019586920101031261029d57915161049a9290916001600160a01b031661075b565b005b3461029d57608036600319011261029d576104b5610556565b6104bd61056c565b906044356001600160a01b038116810361029d5760643567ffffffffffffffff811161029d576104f19036906004016105b8565b926020845194818082019687920101031261029d57925161049a9390926001600160a01b03166106f3565b3461029d5761052a3661060e565b91906020835193818082019586920101031261029d57915161049a9290916001600160a01b0316610671565b600435906001600160a01b038216820361029d57565b602435906001600160a01b038216820361029d57565b90601f8019910116810190811067ffffffffffffffff8211176105a457604052565b634e487b7160e01b5f52604160045260245ffd5b81601f8201121561029d5780359067ffffffffffffffff82116105a457604051926105ed601f8401601f191660200185610582565b8284526020838301011161029d57815f926020809301838601378301015290565b606060031982011261029d576004356001600160a01b038116810361029d57916024356001600160a01b038116810361029d57916044359067ffffffffffffffff821161029d57610661916004016105b8565b90565b9190820180921161025f57565b9091905f1982146106e4576001600160a01b038316301480156106dc575b6106d75760405163a9059cbb60e01b60208201526001600160a01b039390931660248401526044808401929092529082526106d591906106d0606483610582565b6108d3565b565b505050565b50811561068f565b630d550c3b60e11b5f5260045ffd5b9092915f1983146106e4576001600160a01b039081169316918284148015610753575b61074d576106d593604051936323b872dd60e01b6020860152602485015260448401526064830152606482526106d0608483610582565b50505050565b508015610716565b821580156108a9575b6106d757604051636eb1769f60e11b81523060048201526001600160a01b03838116602483018190529490831691602081604481865afa9081156102a9575f91610875575b506107f1946107ff6107be6020945f94610664565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529687906064820190565b03601f198101885287610582565b85519082865af1903d5f519083610856575b5050501561081e57505050565b6106d06106d5936040519063095ea7b360e01b602083015260248201525f604482015260448152610850606482610582565b826108d3565b9192509061086b57503b15155b5f8080610811565b6001915014610863565b90506020813d6020116108a1575b8161089060209383610582565b8101031261029d57516107f16107a9565b3d9150610883565b506001600160a01b0382163014610764565b9081602091031261029d5751801515810361029d5790565b905f602091828151910182855af1156102a9575f513d61092257506001600160a01b0381163b155b6109025750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156108fb56fea2646970667358221220f873473c980ff986be5bdcc90d6237af100c3efe734f2a1fd6277d6017a3857f64736f6c634300081b0033", + "nonce": "0x366", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xf51679aa92e64d1b2a43136ad3d1f4b6e85e952cf2718156485c17bc6c245c4c", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "gas": "0x16bfc", + "value": "0x0", + "input": "0xb6b07b8e000000000000000000000000c47591f5c023e44931c78d5a993834875b79fb11000000000000000000000000ece68c88d0d1789bd13a8519fba51eb870fa0cc70000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x367", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x13aaefcf3b68f44f31777b417c41c20ffed021babe81eed285b49a6cc9a6fbe4", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "gas": "0x16bfc", + "value": "0x0", + "input": "0xb6b07b8e000000000000000000000000c47591f5c023e44931c78d5a993834875b79fb11000000000000000000000000d402019cd1ec046dd74a70922f24c2e3cbb05e240000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x368", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xce702ef3ed3c62c0725af26fb861c0e4622726d5d0ac44afdef5ac873ce4f3b9", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "gas": "0x16bfc", + "value": "0x0", + "input": "0xb6b07b8e000000000000000000000000c47591f5c023e44931c78d5a993834875b79fb11000000000000000000000000fbbbb37aaa95a8f1c4498c9066318c2b5680fb840000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x369", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x7d2819b3e549a0d05abca93aef14e81e311cb2e8982bab1c932196ff92bc65c1", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "gas": "0x16bfc", + "value": "0x0", + "input": "0xb6b07b8e000000000000000000000000c47591f5c023e44931c78d5a993834875b79fb11000000000000000000000000e62567e9a8969aae406195f7c4c7e4e85d4ed8790000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x36a", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x1ca2384", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x285f30cc30eaab1ac799d72d57f614051fd2e063de938a14a773335e3733e574", + "transactionIndex": "0x49", + "blockHash": "0xe46e6d7b8546e9a608d73c4c6e540acecf79894bdefa1b690b365fd0a9faa954", + "blockNumber": "0x15b22e7", + "gasUsed": "0x8e9d4", + "effectiveGasPrice": "0x138e318a", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": null, + "contractAddress": "0xece68c88d0d1789bd13a8519fba51eb870fa0cc7" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xcf9c58", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xbd570f787d17545500e716109468f03dcbebd9691b82268687e076a0cdee5ada", + "transactionIndex": "0x51", + "blockHash": "0x7d647b9f9ec28158fab0580a0c6c0b03f40c4d8e4e76709726091f286a50ef47", + "blockNumber": "0x15b22e8", + "gasUsed": "0x9fdd3", + "effectiveGasPrice": "0x158bda72", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": null, + "contractAddress": "0xd402019cd1ec046dd74a70922f24c2e3cbb05e24" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x2e525c", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xf09987959d483053d251c4b92e8f9b37964ef6082632cf0d973286115b5c289f", + "transactionIndex": "0x1a", + "blockHash": "0x49fe8d4a454bb8a6f0e3fd05ecc3817c3a120346ab0fb9f390b76bf922f412ed", + "blockNumber": "0x15b22e9", + "gasUsed": "0x11e90c", + "effectiveGasPrice": "0x157d4bdd", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": null, + "contractAddress": "0xfbbbb37aaa95a8f1c4498c9066318c2b5680fb84" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x2eebd6", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x9f08285e86f6f696d8e67c8b9476df2ac90b6f6d8a455f8693fc88d56d9f6c0e", + "transactionIndex": "0x1a", + "blockHash": "0xb84536ececacfa64eec52695167109296b8207045d0828c979a045c1f74c5bce", + "blockNumber": "0x15b22ea", + "gasUsed": "0x8bca1", + "effectiveGasPrice": "0x14e873ba", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": null, + "contractAddress": "0xe62567e9a8969aae406195f7c4c7e4e85d4ed879" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x7e9721", + "logs": [ + { + "address": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x000000000000000000000000ece68c88d0d1789bd13a8519fba51eb870fa0cc70000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x310141b63ea64f7af53e1e836f407d4d2217cc7b2a26ae6b3ce8ee4abbec8447", + "blockNumber": "0x15b22eb", + "blockTimestamp": "0x68561c63", + "transactionHash": "0xf51679aa92e64d1b2a43136ad3d1f4b6e85e952cf2718156485c17bc6c245c4c", + "transactionIndex": "0x5f", + "logIndex": "0xc9", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000010800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000020000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xf51679aa92e64d1b2a43136ad3d1f4b6e85e952cf2718156485c17bc6c245c4c", + "transactionIndex": "0x5f", + "blockHash": "0x310141b63ea64f7af53e1e836f407d4d2217cc7b2a26ae6b3ce8ee4abbec8447", + "blockNumber": "0x15b22eb", + "gasUsed": "0xf8e1", + "effectiveGasPrice": "0x1433f020", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xc35bd1", + "logs": [ + { + "address": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x000000000000000000000000d402019cd1ec046dd74a70922f24c2e3cbb05e240000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x833160887b2326060161125e15a7fb8d6122b2e68abc1f39a3ec152f59fc07ef", + "blockNumber": "0x15b22ec", + "blockTimestamp": "0x68561c6f", + "transactionHash": "0x13aaefcf3b68f44f31777b417c41c20ffed021babe81eed285b49a6cc9a6fbe4", + "transactionIndex": "0x79", + "logIndex": "0x182", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000010800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000020000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x13aaefcf3b68f44f31777b417c41c20ffed021babe81eed285b49a6cc9a6fbe4", + "transactionIndex": "0x79", + "blockHash": "0x833160887b2326060161125e15a7fb8d6122b2e68abc1f39a3ec152f59fc07ef", + "blockNumber": "0x15b22ec", + "gasUsed": "0xf8e1", + "effectiveGasPrice": "0x131fbd43", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xb8ac90", + "logs": [ + { + "address": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x000000000000000000000000fbbbb37aaa95a8f1c4498c9066318c2b5680fb840000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x19f4a8952fcac1e486efc47516c2ed84ead42dec315c1d53a6b8bd6af1030fd0", + "blockNumber": "0x15b22ee", + "blockTimestamp": "0x68561c87", + "transactionHash": "0xce702ef3ed3c62c0725af26fb861c0e4622726d5d0ac44afdef5ac873ce4f3b9", + "transactionIndex": "0x72", + "logIndex": "0x14e", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000010800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000020000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xce702ef3ed3c62c0725af26fb861c0e4622726d5d0ac44afdef5ac873ce4f3b9", + "transactionIndex": "0x72", + "blockHash": "0x19f4a8952fcac1e486efc47516c2ed84ead42dec315c1d53a6b8bd6af1030fd0", + "blockNumber": "0x15b22ee", + "gasUsed": "0xf8e1", + "effectiveGasPrice": "0x151d3141", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x7826ba", + "logs": [ + { + "address": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x000000000000000000000000e62567e9a8969aae406195f7c4c7e4e85d4ed8790000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xc2ee0f69f9c8e334c1ce84be36b4b6ca52bb6729d0fade6d80e8c0bccfcafc2f", + "blockNumber": "0x15b22ef", + "blockTimestamp": "0x68561c93", + "transactionHash": "0x7d2819b3e549a0d05abca93aef14e81e311cb2e8982bab1c932196ff92bc65c1", + "transactionIndex": "0x40", + "logIndex": "0xc7", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000010800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000020000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x7d2819b3e549a0d05abca93aef14e81e311cb2e8982bab1c932196ff92bc65c1", + "transactionIndex": "0x40", + "blockHash": "0xc2ee0f69f9c8e334c1ce84be36b4b6ca52bb6729d0fade6d80e8c0bccfcafc2f", + "blockNumber": "0x15b22ef", + "gasUsed": "0xf8e1", + "effectiveGasPrice": "0x153bba18", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "contractAddress": null + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1750473958, + "chain": 1, + "commit": "53496c4" +} \ No newline at end of file diff --git a/broadcast/DeployAdapters.s.sol/1/run-latest.json b/broadcast/DeployAdapters.s.sol/1/run-latest.json new file mode 100644 index 0000000..24586e6 --- /dev/null +++ b/broadcast/DeployAdapters.s.sol/1/run-latest.json @@ -0,0 +1,354 @@ +{ + "transactions": [ + { + "hash": "0x285f30cc30eaab1ac799d72d57f614051fd2e063de938a14a773335e3733e574", + "transactionType": "CREATE", + "contractName": "UniswapV3Adapter", + "contractAddress": "0xece68c88d0d1789bd13a8519fba51eb870fa0cc7", + "function": null, + "arguments": [ + "0xE592427A0AEce92De3Edee1F18E0157C05861564" + ], + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "gas": "0xb9660", + "value": "0x0", + "input": "0x60a034606e57601f610a1838819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606e57516001600160a01b03811690819003606e57608052604051610991908161008782396080518181816065015261015c0152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146105485780636563c0e9146104c85780639df303251461048c578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b1610582565b6100b9610598565b5060443567ffffffffffffffff8111610094576100da9036906004016105ec565b60643567ffffffffffffffff8111610094576100fa9036906004016105ec565b906020815191818082019384920101031261009457516040516370a0823160e01b8152306004820152926001600160a01b0316602084602481845afa9384156103b9575f94610458575b5060405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166004820181905260248201849052906020816044815f875af180156103b957610421575b5083518401906080856020840193031261009457602085015167ffffffffffffffff811161009457850182603f82011215610094576020810151906101e4826105d0565b936101f260405195866105ae565b8285526040828401011161009457815f926040602093018387015e8401015260408501519060806060870151960151928584029380850487149015171561037357861561040d5760405160a081019080821067ffffffffffffffff8311176103f9576020956102ac935f9360405282528682019030825260408301968752606083019a8a8c5260808401910481526040519a8b978896879563c04b8d5960e01b87528b60048801525160a0602488015260c4870190610688565b93516001600160a01b031660448601525160648501525160848401525160a483015203925af19283156103b9575f936103c4575b506020602491604051928380926370a0823160e01b82523060048301525afa9081156103b9575f91610387575b508361031983836106ac565b036103525761034e836040519060208201526020815261033a6040826105ae565b604051918291602083526020830190610688565b0390f35b909150820391821161037357638e17b66b60e01b5f5260045260245260445ffd5b634e487b7160e01b5f52601160045260245ffd5b90506020813d6020116103b1575b816103a2602093836105ae565b8101031261009457518461030d565b3d9150610395565b6040513d5f823e3d90fd5b9092506020813d6020116103f1575b816103e0602093836105ae565b8101031261009457519160206102e0565b3d91506103d3565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b6020813d602011610450575b8161043a602093836105ae565b81010312610094575180151581146101a0575f80fd5b3d915061042d565b9093506020813d602011610484575b81610474602093836105ae565b8101031261009457519284610144565b3d9150610467565b346100945761049a36610632565b9190602083519381808201958692010103126100945791516104c69290916001600160a01b03166107a3565b005b34610094576080366003190112610094576104e1610582565b6104e9610598565b906044356001600160a01b03811681036100945760643567ffffffffffffffff81116100945761051d9036906004016105ec565b92602084519481808201968792010103126100945792516104c69390926001600160a01b031661073b565b346100945761055636610632565b9190602083519381808201958692010103126100945791516104c69290916001600160a01b03166106b9565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff8211176103f957604052565b67ffffffffffffffff81116103f957601f01601f191660200190565b81601f8201121561009457803590610603826105d0565b9261061160405194856105ae565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff821161009457610685916004016105ec565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9190820180921161037357565b9091905f19821461072c576001600160a01b03831630148015610724575b61071f5760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261071d91906107186064836105ae565b610903565b565b505050565b5081156106d7565b630d550c3b60e11b5f5260045ffd5b9092915f19831461072c576001600160a01b03908116931691828414801561079b575b6107955761071d93604051936323b872dd60e01b6020860152602485015260448401526064830152606482526107186084836105ae565b50505050565b50801561075e565b821580156108f1575b61071f57604051636eb1769f60e11b81523060048201526001600160a01b03838116602483018190529490831691602081604481865afa9081156103b9575f916108bd575b50610839946108476108066020945f946106ac565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529687906064820190565b03601f1981018852876105ae565b85519082865af1903d5f51908361089e575b5050501561086657505050565b61071861071d936040519063095ea7b360e01b602083015260248201525f6044820152604481526108986064826105ae565b82610903565b919250906108b357503b15155b5f8080610859565b60019150146108ab565b90506020813d6020116108e9575b816108d8602093836105ae565b8101031261009457516108396107f1565b3d91506108cb565b506001600160a01b03821630146107ac565b905f602091828151910182855af1156103b9575f513d61095257506001600160a01b0381163b155b6109325750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b6001141561092b56fea26469706673582212206ad8ebc6ec787a48097d03c1fbb2ad1b7bd771674b19f2f62398a14d8b67431064736f6c634300081b0033000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564", + "nonce": "0x363", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xbd570f787d17545500e716109468f03dcbebd9691b82268687e076a0cdee5ada", + "transactionType": "CREATE", + "contractName": "OdosV2Adapter", + "contractAddress": "0xd402019cd1ec046dd74a70922f24c2e3cbb05e24", + "function": null, + "arguments": [ + "0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559" + ], + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "gas": "0xcfd2b", + "value": "0x0", + "input": "0x60a034606e57601f610b5f38819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606e57516001600160a01b03811690819003606e57608052604051610ad890816100878239608051818181606501526101600152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b1461064a5780636563c0e9146105ca5780639df303251461058e578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b1610684565b6100b961069a565b9060443567ffffffffffffffff8111610094576100da9036906004016106ee565b9060643567ffffffffffffffff8111610094576100fb9036906004016106ee565b916020815191818082019384920101031261009457516040516370a0823160e01b81523060048201529390916001600160a01b031690602085602481855afa948515610493575f9561055a575b5060405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600482018190526024820185905291906020816044815f885af1801561049357610523575b5084518501948060208701960361014081126100945760e013610094576040519060e0820182811067ffffffffffffffff82111761050f576040526101ec60208201610a05565b82526040810151926020830193845261020760608301610a05565b976040840198895261021b60808401610a05565b6060850190815260a08401516080860190815260c08501519060a0870191825261024760e08701610a05565b9260c0880193845261010087015167ffffffffffffffff811161009457870185603f8201121561009457602081015190610280826106d2565b9661028e60405198896106b0565b8288526040828401011161009457815f92604060209301838a015e870101526101208701516001600160a01b03811697908890036100945761014001519563ffffffff87168097036100945781516001600160a01b039182169116036104d3578b8251906102fb91610a19565b895161030691610a2c565b82528b83519061031591610a19565b895161032091610a2c565b83528b8952308452604051630ed8d73960e21b815297516001600160a01b0390811660048a0152985160248901529b51881660448801529a518716606487015299516084860152985160a4850152975190931660c483015261014060e4830152909586928392916103969061014485019061078a565b9161010484015261012483015203815a6020945f91f1928315610493575f9361049e575b506020602491604051928380926370a0823160e01b82523060048301525afa908115610493575f91610461575b50836103f383836107ae565b0361042c5761042883604051906020820152602081526104146040826106b0565b60405191829160208352602083019061078a565b0390f35b909150820391821161044d57638e17b66b60e01b5f5260045260245260445ffd5b634e487b7160e01b5f52601160045260245ffd5b90506020813d60201161048b575b8161047c602093836106b0565b810103126100945751846103e7565b3d915061046f565b6040513d5f823e3d90fd5b9092506020813d6020116104cb575b816104ba602093836106b0565b8101031261009457519160206103ba565b3d91506104ad565b60405162461bcd60e51b815260206004820152601460248201527324a72b20a624a22fa7aaaa282aaa2faa27a5a2a760611b6044820152606490fd5b634e487b7160e01b5f52604160045260245ffd5b6020813d602011610552575b8161053c602093836106b0565b81010312610094575180151581146101a5575f80fd5b3d915061052f565b9094506020813d602011610586575b81610576602093836106b0565b8101031261009457519385610148565b3d9150610569565b346100945761059c36610734565b9190602083519381808201958692010103126100945791516105c89290916001600160a01b03166108a5565b005b34610094576080366003190112610094576105e3610684565b6105eb61069a565b906044356001600160a01b03811681036100945760643567ffffffffffffffff81116100945761061f9036906004016106ee565b92602084519481808201968792010103126100945792516105c89390926001600160a01b031661083d565b346100945761065836610734565b9190602083519381808201958692010103126100945791516105c89290916001600160a01b03166107bb565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff82111761050f57604052565b67ffffffffffffffff811161050f57601f01601f191660200190565b81601f8201121561009457803590610705826106d2565b9261071360405194856106b0565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff821161009457610787916004016106ee565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9190820180921161044d57565b9091905f19821461082e576001600160a01b03831630148015610826575b6108215760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261081f919061081a6064836106b0565b610a4a565b565b505050565b5081156107d9565b630d550c3b60e11b5f5260045ffd5b9092915f19831461082e576001600160a01b03908116931691828414801561089d575b6108975761081f93604051936323b872dd60e01b60208601526024850152604484015260648301526064825261081a6084836106b0565b50505050565b508015610860565b821580156109f3575b61082157604051636eb1769f60e11b81523060048201526001600160a01b03838116602483018190529490831691602081604481865afa908115610493575f916109bf575b5061093b946109496109086020945f946107ae565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529687906064820190565b03601f1981018852876106b0565b85519082865af1903d5f5190836109a0575b5050501561096857505050565b61081a61081f936040519063095ea7b360e01b602083015260248201525f60448201526044815261099a6064826106b0565b82610a4a565b919250906109b557503b15155b5f808061095b565b60019150146109ad565b90506020813d6020116109eb575b816109da602093836106b0565b81010312610094575161093b6108f3565b3d91506109cd565b506001600160a01b03821630146108ae565b51906001600160a01b038216820361009457565b8181029291811591840414171561044d57565b8115610a36570490565b634e487b7160e01b5f52601260045260245ffd5b905f602091828151910182855af115610493575f513d610a9957506001600160a01b0381163b155b610a795750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b60011415610a7256fea26469706673582212204763315a6411a7960fce618c8c1b5d96ae7ea3c2ea7ebb92abcf095b95bbea1c64736f6c634300081b0033000000000000000000000000cf5540fffcdc3d510b18bfca6d2b9987b0772559", + "nonce": "0x364", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xf09987959d483053d251c4b92e8f9b37964ef6082632cf0d973286115b5c289f", + "transactionType": "CREATE", + "contractName": "PendleSwapV3Adapter", + "contractAddress": "0xfbbbb37aaa95a8f1c4498c9066318c2b5680fb84", + "function": null, + "arguments": [ + "0x888888888889758F76e7103c6CbF23ABbF58F946" + ], + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "gas": "0x17488f", + "value": "0x0", + "input": "0x60a0604052346100ea57604051601f6113d838819003918201601f19168301916001600160401b038311848410176100d6578084926020946040528339810103126100ea57516001600160a01b038116908190036100ea5760405160a081016001600160401b038111828210176100d657655af3107a4000916080916040525f81525f1960208201525f6040820152610100606082015201525f6008555f196009555f600a55610100600b55655af3107a4000600c556080526040516112e990816100ef8239608051818181608901526103200152f35b634e487b7160e01b5f52604160045260245ffd5b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816309316dd314610a6b575080633268263b14610a315780634ebfc814146109f25780636563c0e9146109725780639df3032514610936578063e0a80413146101f8578063f66a7749146100bc5763f887ea4014610074575f80fd5b346100b8575f3660031901126100b8576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b346100b8575f3660031901126100b8575f54604051905f6001548060011c91600182169182156101ee575b6020841083146101da5783865285929081156101bb575060011461015c575b61011292500383610c0d565b60ff60025416610150604051938361012e8660ff819716610d3f565b60081c6001600160a01b03166020850152608060408501819052840190610c43565b90151560608301520390f35b5060015f90815290917fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b81831061019f57505090602061011292820101610106565b6020919350806001915483858901015201910190918492610187565b6020925061011294915060ff191682840152151560051b820101610106565b634e487b7160e01b5f52602260045260245ffd5b92607f16926100e7565b346100b85760803660031901126100b857610211610c67565b610219610c7d565b9060443567ffffffffffffffff81116100b85761023a903690600401610c93565b9060643567ffffffffffffffff81116100b85761025b903690600401610c93565b91602081519181808201938492010103126100b857516040516370a0823160e01b8152306004820152936001600160a01b03909216929091602085602481875afa948515610551575f95610902575b5060018060a01b0316906060818051810103126100b85760208101516001600160a01b038116908190036100b857606060408301519201519260405192630b2339af60e21b8452606084600481865afa938415610551575f94610895575b5060405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600482018190526024820188905295906020816044815f8d5af1801561055157610878575b508681029080820488149015171561050b5781156108645704926001600160a01b0316908082036105ba57505060405163095ea7b360e01b81526001600160a01b038416600482015260248101859052926020846044815f8a5af1928315610551576104509460609461058d575b505f6103dd6111eb565b938885528760208601528860408601526104626040519788968795869463640fc23d60e11b86523060048701526024860152604485015260085460648501526009546084850152600a5460a4850152600b5460c4850152600c5460e4850152610140610104850152610144840190610fea565b8281036003190161012484015261119b565b03925af1908115610551576024916020915f9161055c575b50935b6040516370a0823160e01b815230600482015292839182905afa908115610551575f9161051f575b50836104b18383610d60565b036104ea576104e683604051906020820152602081526104d2604082610c0d565b604051918291602083526020830190610c43565b0390f35b909150820391821161050b57638e17b66b60e01b5f5260045260245260445ffd5b634e487b7160e01b5f52601160045260245ffd5b90506020813d602011610549575b8161053a60209383610c0d565b810103126100b85751846104a5565b3d915061052d565b6040513d5f823e3d90fd5b61057e915060603d606011610586575b6105768183610c0d565b810190610fcf565b50508661047a565b503d61056c565b6105ae9060203d6020116105b3575b6105a68183610c0d565b810190610fb7565b6103d3565b503d61059c565b90929593604051630bc4ed8360e21b8152602081600481885afa908115610551575f91610845575b501561073c5750505060206004916040519283809263781c18db60e01b82525afa908115610551575f916106fa575b5060405163a9059cbb60e01b81526001600160a01b039190911660048201819052602482018490529093906020856044815f875af1908115610551575f956020926106df575b5060246040518097819363bcb7ea5d60e01b83523060048401525af1938415610551575f946106ab575b5083818110610696575050602060249161047d565b63eb7f211d60e01b5f5260045260245260445ffd5b9093506020813d6020116106d7575b816106c760209383610c0d565b810103126100b857519285610681565b3d91506106ba565b6106f590833d85116105b3576105a68183610c0d565b610657565b90506020813d602011610734575b8161071560209383610c0d565b810103126100b857516001600160a01b03811681036100b85785610611565b3d9150610708565b60405163095ea7b360e01b81526001600160a01b0382166004820152602481018790529496929491935090916020836044815f8b5af18015610551576107e8956060956107d7955f93610828575b506107936111eb565b938185526020850152604084015260405196879586948593631652a23360e21b855230600486015260248501528a604485015260a0606485015260a4840190610fea565b82810360031901608484015261119b565b03925af1908115610551576024916020915f91610807575b509361047d565b610820915060603d606011610586576105768183610c0d565b505086610800565b6108409060203d6020116105b3576105a68183610c0d565b61078a565b61085e915060203d6020116105b3576105a68183610c0d565b896105e2565b634e487b7160e01b5f52601260045260245ffd5b6108909060203d6020116105b3576105a68183610c0d565b610365565b9093506060813d6060116108fa575b816108b160609383610c0d565b810103126100b85780516001600160a01b038116036100b8576020810151906001600160a01b03821682036100b857604001516001600160a01b038116036100b8579288610308565b3d91506108a4565b9094506020813d60201161092e575b8161091e60209383610c0d565b810103126100b8575193856102aa565b3d9150610911565b346100b85761094436610ce9565b9190602083519381808201958692010103126100b85791516109709290916001600160a01b0316610e57565b005b346100b85760803660031901126100b85761098b610c67565b610993610c7d565b906044356001600160a01b03811681036100b85760643567ffffffffffffffff81116100b8576109c7903690600401610c93565b92602084519481808201968792010103126100b85792516109709390926001600160a01b0316610def565b346100b8575f3660031901126100b85760a0600854600954600a54600b5490600c54926040519485526020850152604084015260608301526080820152f35b346100b857610a3f36610ce9565b9190602083519381808201958692010103126100b85791516109709290916001600160a01b0316610d6d565b346100b8575f3660031901126100b85760018060a01b0360035416600454915f6007548060011c90600181168015610b6c575b6020831081146101da57828552908115610b485750600114610aea575b5090610acc816104e6930382610c0d565b60405193849384526020840152606060408401526060830190610c43565b60075f9081527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688939250905b808210610b2e57509091508101602001610acc610abb565b919260018160209254838588010152019101909291610b16565b60ff191660208086019190915291151560051b84019091019150610acc9050610abb565b91607f1691610a9e565b5f92918154918260011c92600181168015610c03575b6020851081146101da57848452908115610be65750600114610bad57505050565b5f9081526020812093945091925b838310610bcc575060209250010190565b600181602092949394548385870101520191019190610bbb565b915050602093945060ff929192191683830152151560051b010190565b93607f1693610b8c565b90601f8019910116810190811067ffffffffffffffff821117610c2f57604052565b634e487b7160e01b5f52604160045260245ffd5b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036100b857565b602435906001600160a01b03821682036100b857565b81601f820112156100b85780359067ffffffffffffffff8211610c2f5760405192610cc8601f8401601f191660200185610c0d565b828452602083830101116100b857815f926020809301838601378301015290565b60606003198201126100b8576004356001600160a01b03811681036100b857916024356001600160a01b03811681036100b857916044359067ffffffffffffffff82116100b857610d3c91600401610c93565b90565b90600b821015610d4c5752565b634e487b7160e01b5f52602160045260245ffd5b9190820180921161050b57565b9091905f198214610de0576001600160a01b03831630148015610dd8575b610dd35760405163a9059cbb60e01b60208201526001600160a01b03939093166024840152604480840192909252908252610dd19190610dcc606483610c0d565b61125b565b565b505050565b508115610d8b565b630d550c3b60e11b5f5260045ffd5b9092915f198314610de0576001600160a01b039081169316918284148015610e4f575b610e4957610dd193604051936323b872dd60e01b602086015260248501526044840152606483015260648252610dcc608483610c0d565b50505050565b508015610e12565b82158015610fa5575b610dd357604051636eb1769f60e11b81523060048201526001600160a01b03838116602483018190529490831691602081604481865afa908115610551575f91610f71575b50610eed94610efb610eba6020945f94610d60565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529687906064820190565b03601f198101885287610c0d565b85519082865af1903d5f519083610f52575b50505015610f1a57505050565b610dcc610dd1936040519063095ea7b360e01b602083015260248201525f604482015260448152610f4c606482610c0d565b8261125b565b91925090610f6757503b15155b5f8080610f0d565b6001915014610f5f565b90506020813d602011610f9d575b81610f8c60209383610c0d565b810103126100b85751610eed610ea5565b3d9150610f7f565b506001600160a01b0382163014610e60565b908160209103126100b8575180151581036100b85790565b908160609103126100b8578051916040602083015192015190565b60809060018060a01b0381511683526020810151602084015260018060a01b03604082015116604084015260018060a01b03606082015116606084015201519060a0608082015261103f60a082018351610d3f565b60208201516001600160a01b031660c08201526040820151608060e08301526101009060609061107490610120850190610c43565b930151151591015290565b908060208354918281520160208260051b840101935f5260205f20925f905b8382106110ad57505050505090565b9091929394601f19828203018452606081528554606082015260018601546080820152600286015460a0820152600386015460ff81166004811015610d4c5760c08301526001600160a01b03600891821c811660e0840152600488015481166101008401526005880154811661012084015260068801541661014083015260078701546101608301528601546101808083019190915260098701546101a08301526101c0820152600190602090600d906111816111716101e08301600a8c01610b76565b82810385840152600b8b01610b76565b906040600c8b01549101529701940192019093929361109e565b610d3c9060018060a01b03600354168152600454602082015260a060408201526111db6111cc60a08301600561107f565b8281036060840152600661107f565b9060808183039101526007610b76565b6040519060a0820182811067ffffffffffffffff821117610c2f57604052815f81525f60208201525f60408201525f606082015260405190608082019082821067ffffffffffffffff831117610c2f576080916040525f83525f6020840152606060408401525f60608401520152565b905f602091828151910182855af115610551575f513d6112aa57506001600160a01b0381163b155b61128a5750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b6001141561128356fea26469706673582212201ee77fd202ede4dc014cdf8b197fb2ef16d65387626d9feaaf9b419b66e37d0764736f6c634300081b0033000000000000000000000000888888888889758f76e7103c6cbf23abbf58f946", + "nonce": "0x365", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x9f08285e86f6f696d8e67c8b9476df2ac90b6f6d8a455f8693fc88d56d9f6c0e", + "transactionType": "CREATE", + "contractName": "ERC4626VaultAdapter", + "contractAddress": "0xe62567e9a8969aae406195f7c4c7e4e85d4ed879", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "gas": "0xb5b9e", + "value": "0x0", + "input": "0x60808060405234601557610961908161001a8239f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b1461051c5780636563c0e91461049c5780639df30325146104605763e0a8041314610045575f80fd5b3461029d57608036600319011261029d5761005e610556565b61006661056c565b60443567ffffffffffffffff811161029d576100869036906004016105b8565b9160643567ffffffffffffffff811161029d576100a79036906004016105b8565b926020815191818082019384920101031261029d57516040516370a0823160e01b81523060048201529290916001600160a01b031690602084602481855afa9384156102a9575f9461042c575b5060018060a01b03169360608180518101031261029d57602081015190600282101561029d57606060408201519101518481029080820486149015171561025f57811561041857049080610328575060405163095ea7b360e01b81526001600160a01b038616600482015260248101849052946020866044815f875af19081156102a9575f966020926102fd575b50604460405180988193636e553f6560e01b83528860048401523060248401525af19485156102a9575f956102c9575b50848181106102b457505060206024915b6040516370a0823160e01b815230600482015292839182905afa9081156102a9575f91610273575b50826101f78383610664565b0361024157836040805160208101928352602081526102168282610582565b8151928391602083525180918160208501528484015e5f828201840152601f01601f19168101030190f35b820391821161025f57638e17b66b60e01b5f5260045260245260445ffd5b634e487b7160e01b5f52601160045260245ffd5b90506020813d6020116102a1575b8161028e60209383610582565b8101031261029d57515f6101eb565b5f80fd5b3d9150610281565b6040513d5f823e3d90fd5b63eb7f211d60e01b5f5260045260245260445ffd5b9094506020813d6020116102f5575b816102e560209383610582565b8101031261029d5751935f6101b2565b3d91506102d8565b61031c90833d8511610321575b6103148183610582565b8101906108bb565b610182565b503d61030a565b9094506001036104095760405163095ea7b360e01b81526001600160a01b0382166004820152602481018390526020816044815f865af180156102a9576103ec575b5060405193635d043b2960e11b85528260048601523060248601523060448601526020856064815f865af19485156102a9575f956103b8575b50848181106102b457505060206024916101c3565b9094506020813d6020116103e4575b816103d460209383610582565b8101031261029d5751935f6103a3565b3d91506103c7565b6104049060203d602011610321576103148183610582565b61036a565b634a7f394f60e01b5f5260045ffd5b634e487b7160e01b5f52601260045260245ffd5b9093506020813d602011610458575b8161044860209383610582565b8101031261029d5751925f6100f4565b3d915061043b565b3461029d5761046e3661060e565b91906020835193818082019586920101031261029d57915161049a9290916001600160a01b031661075b565b005b3461029d57608036600319011261029d576104b5610556565b6104bd61056c565b906044356001600160a01b038116810361029d5760643567ffffffffffffffff811161029d576104f19036906004016105b8565b926020845194818082019687920101031261029d57925161049a9390926001600160a01b03166106f3565b3461029d5761052a3661060e565b91906020835193818082019586920101031261029d57915161049a9290916001600160a01b0316610671565b600435906001600160a01b038216820361029d57565b602435906001600160a01b038216820361029d57565b90601f8019910116810190811067ffffffffffffffff8211176105a457604052565b634e487b7160e01b5f52604160045260245ffd5b81601f8201121561029d5780359067ffffffffffffffff82116105a457604051926105ed601f8401601f191660200185610582565b8284526020838301011161029d57815f926020809301838601378301015290565b606060031982011261029d576004356001600160a01b038116810361029d57916024356001600160a01b038116810361029d57916044359067ffffffffffffffff821161029d57610661916004016105b8565b90565b9190820180921161025f57565b9091905f1982146106e4576001600160a01b038316301480156106dc575b6106d75760405163a9059cbb60e01b60208201526001600160a01b039390931660248401526044808401929092529082526106d591906106d0606483610582565b6108d3565b565b505050565b50811561068f565b630d550c3b60e11b5f5260045ffd5b9092915f1983146106e4576001600160a01b039081169316918284148015610753575b61074d576106d593604051936323b872dd60e01b6020860152602485015260448401526064830152606482526106d0608483610582565b50505050565b508015610716565b821580156108a9575b6106d757604051636eb1769f60e11b81523060048201526001600160a01b03838116602483018190529490831691602081604481865afa9081156102a9575f91610875575b506107f1946107ff6107be6020945f94610664565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529687906064820190565b03601f198101885287610582565b85519082865af1903d5f519083610856575b5050501561081e57505050565b6106d06106d5936040519063095ea7b360e01b602083015260248201525f604482015260448152610850606482610582565b826108d3565b9192509061086b57503b15155b5f8080610811565b6001915014610863565b90506020813d6020116108a1575b8161089060209383610582565b8101031261029d57516107f16107a9565b3d9150610883565b506001600160a01b0382163014610764565b9081602091031261029d5751801515810361029d5790565b905f602091828151910182855af1156102a9575f513d61092257506001600160a01b0381163b155b6109025750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156108fb56fea2646970667358221220f873473c980ff986be5bdcc90d6237af100c3efe734f2a1fd6277d6017a3857f64736f6c634300081b0033", + "nonce": "0x366", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xf51679aa92e64d1b2a43136ad3d1f4b6e85e952cf2718156485c17bc6c245c4c", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "gas": "0x16bfc", + "value": "0x0", + "input": "0xb6b07b8e000000000000000000000000c47591f5c023e44931c78d5a993834875b79fb11000000000000000000000000ece68c88d0d1789bd13a8519fba51eb870fa0cc70000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x367", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x13aaefcf3b68f44f31777b417c41c20ffed021babe81eed285b49a6cc9a6fbe4", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "gas": "0x16bfc", + "value": "0x0", + "input": "0xb6b07b8e000000000000000000000000c47591f5c023e44931c78d5a993834875b79fb11000000000000000000000000d402019cd1ec046dd74a70922f24c2e3cbb05e240000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x368", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xce702ef3ed3c62c0725af26fb861c0e4622726d5d0ac44afdef5ac873ce4f3b9", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "gas": "0x16bfc", + "value": "0x0", + "input": "0xb6b07b8e000000000000000000000000c47591f5c023e44931c78d5a993834875b79fb11000000000000000000000000fbbbb37aaa95a8f1c4498c9066318c2b5680fb840000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x369", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x7d2819b3e549a0d05abca93aef14e81e311cb2e8982bab1c932196ff92bc65c1", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "gas": "0x16bfc", + "value": "0x0", + "input": "0xb6b07b8e000000000000000000000000c47591f5c023e44931c78d5a993834875b79fb11000000000000000000000000e62567e9a8969aae406195f7c4c7e4e85d4ed8790000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x36a", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x1ca2384", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x285f30cc30eaab1ac799d72d57f614051fd2e063de938a14a773335e3733e574", + "transactionIndex": "0x49", + "blockHash": "0xe46e6d7b8546e9a608d73c4c6e540acecf79894bdefa1b690b365fd0a9faa954", + "blockNumber": "0x15b22e7", + "gasUsed": "0x8e9d4", + "effectiveGasPrice": "0x138e318a", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": null, + "contractAddress": "0xece68c88d0d1789bd13a8519fba51eb870fa0cc7" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xcf9c58", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xbd570f787d17545500e716109468f03dcbebd9691b82268687e076a0cdee5ada", + "transactionIndex": "0x51", + "blockHash": "0x7d647b9f9ec28158fab0580a0c6c0b03f40c4d8e4e76709726091f286a50ef47", + "blockNumber": "0x15b22e8", + "gasUsed": "0x9fdd3", + "effectiveGasPrice": "0x158bda72", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": null, + "contractAddress": "0xd402019cd1ec046dd74a70922f24c2e3cbb05e24" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x2e525c", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xf09987959d483053d251c4b92e8f9b37964ef6082632cf0d973286115b5c289f", + "transactionIndex": "0x1a", + "blockHash": "0x49fe8d4a454bb8a6f0e3fd05ecc3817c3a120346ab0fb9f390b76bf922f412ed", + "blockNumber": "0x15b22e9", + "gasUsed": "0x11e90c", + "effectiveGasPrice": "0x157d4bdd", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": null, + "contractAddress": "0xfbbbb37aaa95a8f1c4498c9066318c2b5680fb84" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x2eebd6", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x9f08285e86f6f696d8e67c8b9476df2ac90b6f6d8a455f8693fc88d56d9f6c0e", + "transactionIndex": "0x1a", + "blockHash": "0xb84536ececacfa64eec52695167109296b8207045d0828c979a045c1f74c5bce", + "blockNumber": "0x15b22ea", + "gasUsed": "0x8bca1", + "effectiveGasPrice": "0x14e873ba", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": null, + "contractAddress": "0xe62567e9a8969aae406195f7c4c7e4e85d4ed879" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x7e9721", + "logs": [ + { + "address": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x000000000000000000000000ece68c88d0d1789bd13a8519fba51eb870fa0cc70000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x310141b63ea64f7af53e1e836f407d4d2217cc7b2a26ae6b3ce8ee4abbec8447", + "blockNumber": "0x15b22eb", + "blockTimestamp": "0x68561c63", + "transactionHash": "0xf51679aa92e64d1b2a43136ad3d1f4b6e85e952cf2718156485c17bc6c245c4c", + "transactionIndex": "0x5f", + "logIndex": "0xc9", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000010800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000020000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xf51679aa92e64d1b2a43136ad3d1f4b6e85e952cf2718156485c17bc6c245c4c", + "transactionIndex": "0x5f", + "blockHash": "0x310141b63ea64f7af53e1e836f407d4d2217cc7b2a26ae6b3ce8ee4abbec8447", + "blockNumber": "0x15b22eb", + "gasUsed": "0xf8e1", + "effectiveGasPrice": "0x1433f020", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xc35bd1", + "logs": [ + { + "address": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x000000000000000000000000d402019cd1ec046dd74a70922f24c2e3cbb05e240000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x833160887b2326060161125e15a7fb8d6122b2e68abc1f39a3ec152f59fc07ef", + "blockNumber": "0x15b22ec", + "blockTimestamp": "0x68561c6f", + "transactionHash": "0x13aaefcf3b68f44f31777b417c41c20ffed021babe81eed285b49a6cc9a6fbe4", + "transactionIndex": "0x79", + "logIndex": "0x182", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000010800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000020000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x13aaefcf3b68f44f31777b417c41c20ffed021babe81eed285b49a6cc9a6fbe4", + "transactionIndex": "0x79", + "blockHash": "0x833160887b2326060161125e15a7fb8d6122b2e68abc1f39a3ec152f59fc07ef", + "blockNumber": "0x15b22ec", + "gasUsed": "0xf8e1", + "effectiveGasPrice": "0x131fbd43", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xb8ac90", + "logs": [ + { + "address": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x000000000000000000000000fbbbb37aaa95a8f1c4498c9066318c2b5680fb840000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x19f4a8952fcac1e486efc47516c2ed84ead42dec315c1d53a6b8bd6af1030fd0", + "blockNumber": "0x15b22ee", + "blockTimestamp": "0x68561c87", + "transactionHash": "0xce702ef3ed3c62c0725af26fb861c0e4622726d5d0ac44afdef5ac873ce4f3b9", + "transactionIndex": "0x72", + "logIndex": "0x14e", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000010800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000020000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xce702ef3ed3c62c0725af26fb861c0e4622726d5d0ac44afdef5ac873ce4f3b9", + "transactionIndex": "0x72", + "blockHash": "0x19f4a8952fcac1e486efc47516c2ed84ead42dec315c1d53a6b8bd6af1030fd0", + "blockNumber": "0x15b22ee", + "gasUsed": "0xf8e1", + "effectiveGasPrice": "0x151d3141", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x7826ba", + "logs": [ + { + "address": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x000000000000000000000000e62567e9a8969aae406195f7c4c7e4e85d4ed8790000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xc2ee0f69f9c8e334c1ce84be36b4b6ca52bb6729d0fade6d80e8c0bccfcafc2f", + "blockNumber": "0x15b22ef", + "blockTimestamp": "0x68561c93", + "transactionHash": "0x7d2819b3e549a0d05abca93aef14e81e311cb2e8982bab1c932196ff92bc65c1", + "transactionIndex": "0x40", + "logIndex": "0xc7", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000010800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000020000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x7d2819b3e549a0d05abca93aef14e81e311cb2e8982bab1c932196ff92bc65c1", + "transactionIndex": "0x40", + "blockHash": "0xc2ee0f69f9c8e334c1ce84be36b4b6ca52bb6729d0fade6d80e8c0bccfcafc2f", + "blockNumber": "0x15b22ef", + "gasUsed": "0xf8e1", + "effectiveGasPrice": "0x153bba18", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "contractAddress": null + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1750473958, + "chain": 1, + "commit": "53496c4" +} \ No newline at end of file diff --git a/broadcast/DeployAdapters.s.sol/42161/run-latest.json b/broadcast/DeployAdapters.s.sol/42161/run-latest.json new file mode 100644 index 0000000..ab283ef --- /dev/null +++ b/broadcast/DeployAdapters.s.sol/42161/run-latest.json @@ -0,0 +1,390 @@ +{ + "transactions": [ + { + "hash": "0x4df862fd2444842c869f2d44d11555de94e8cebea16cda7ef15c14cc27039563", + "transactionType": "CREATE", + "contractName": "UniswapV3Adapter", + "contractAddress": "0x25e4889346f04b4e005ffab35bf2c3cb395e74d5", + "function": null, + "arguments": [ + "0xE592427A0AEce92De3Edee1F18E0157C05861564" + ], + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "gas": "0xc221f", + "value": "0x0", + "input": "0x60a034606e57601f610a1838819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606e57516001600160a01b03811690819003606e57608052604051610991908161008782396080518181816065015261015c0152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146105485780636563c0e9146104c85780639df303251461048c578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b1610582565b6100b9610598565b5060443567ffffffffffffffff8111610094576100da9036906004016105ec565b60643567ffffffffffffffff8111610094576100fa9036906004016105ec565b906020815191818082019384920101031261009457516040516370a0823160e01b8152306004820152926001600160a01b0316602084602481845afa9384156103b9575f94610458575b5060405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166004820181905260248201849052906020816044815f875af180156103b957610421575b5083518401906080856020840193031261009457602085015167ffffffffffffffff811161009457850182603f82011215610094576020810151906101e4826105d0565b936101f260405195866105ae565b8285526040828401011161009457815f926040602093018387015e8401015260408501519060806060870151960151928584029380850487149015171561037357861561040d5760405160a081019080821067ffffffffffffffff8311176103f9576020956102ac935f9360405282528682019030825260408301968752606083019a8a8c5260808401910481526040519a8b978896879563c04b8d5960e01b87528b60048801525160a0602488015260c4870190610688565b93516001600160a01b031660448601525160648501525160848401525160a483015203925af19283156103b9575f936103c4575b506020602491604051928380926370a0823160e01b82523060048301525afa9081156103b9575f91610387575b508361031983836106ac565b036103525761034e836040519060208201526020815261033a6040826105ae565b604051918291602083526020830190610688565b0390f35b909150820391821161037357638e17b66b60e01b5f5260045260245260445ffd5b634e487b7160e01b5f52601160045260245ffd5b90506020813d6020116103b1575b816103a2602093836105ae565b8101031261009457518461030d565b3d9150610395565b6040513d5f823e3d90fd5b9092506020813d6020116103f1575b816103e0602093836105ae565b8101031261009457519160206102e0565b3d91506103d3565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b6020813d602011610450575b8161043a602093836105ae565b81010312610094575180151581146101a0575f80fd5b3d915061042d565b9093506020813d602011610484575b81610474602093836105ae565b8101031261009457519284610144565b3d9150610467565b346100945761049a36610632565b9190602083519381808201958692010103126100945791516104c69290916001600160a01b03166107a3565b005b34610094576080366003190112610094576104e1610582565b6104e9610598565b906044356001600160a01b03811681036100945760643567ffffffffffffffff81116100945761051d9036906004016105ec565b92602084519481808201968792010103126100945792516104c69390926001600160a01b031661073b565b346100945761055636610632565b9190602083519381808201958692010103126100945791516104c69290916001600160a01b03166106b9565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff8211176103f957604052565b67ffffffffffffffff81116103f957601f01601f191660200190565b81601f8201121561009457803590610603826105d0565b9261061160405194856105ae565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff821161009457610685916004016105ec565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9190820180921161037357565b9091905f19821461072c576001600160a01b03831630148015610724575b61071f5760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261071d91906107186064836105ae565b610903565b565b505050565b5081156106d7565b630d550c3b60e11b5f5260045ffd5b9092915f19831461072c576001600160a01b03908116931691828414801561079b575b6107955761071d93604051936323b872dd60e01b6020860152602485015260448401526064830152606482526107186084836105ae565b50505050565b50801561075e565b821580156108f1575b61071f57604051636eb1769f60e11b81523060048201526001600160a01b03838116602483018190529490831691602081604481865afa9081156103b9575f916108bd575b50610839946108476108066020945f946106ac565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529687906064820190565b03601f1981018852876105ae565b85519082865af1903d5f51908361089e575b5050501561086657505050565b61071861071d936040519063095ea7b360e01b602083015260248201525f6044820152604481526108986064826105ae565b82610903565b919250906108b357503b15155b5f8080610859565b60019150146108ab565b90506020813d6020116108e9575b816108d8602093836105ae565b8101031261009457516108396107f1565b3d91506108cb565b506001600160a01b03821630146107ac565b905f602091828151910182855af1156103b9575f513d61095257506001600160a01b0381163b155b6109325750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b6001141561092b56fea26469706673582212206ad8ebc6ec787a48097d03c1fbb2ad1b7bd771674b19f2f62398a14d8b67431064736f6c634300081b0033000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564", + "nonce": "0x117", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xf2ef3b49657979ab628163410dddfcef7ffa4b6c2983671005e9d40e48243dd9", + "transactionType": "CREATE", + "contractName": "OdosV2Adapter", + "contractAddress": "0x003e6f7f6071a4e33f9324c125deae2615998010", + "function": null, + "arguments": [ + "0xa669e7A0d4b3e4Fa48af2dE86BD4CD7126Be4e13" + ], + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "gas": "0xd97f5", + "value": "0x0", + "input": "0x60a034606e57601f610b5f38819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606e57516001600160a01b03811690819003606e57608052604051610ad890816100878239608051818181606501526101600152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b1461064a5780636563c0e9146105ca5780639df303251461058e578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b1610684565b6100b961069a565b9060443567ffffffffffffffff8111610094576100da9036906004016106ee565b9060643567ffffffffffffffff8111610094576100fb9036906004016106ee565b916020815191818082019384920101031261009457516040516370a0823160e01b81523060048201529390916001600160a01b031690602085602481855afa948515610493575f9561055a575b5060405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600482018190526024820185905291906020816044815f885af1801561049357610523575b5084518501948060208701960361014081126100945760e013610094576040519060e0820182811067ffffffffffffffff82111761050f576040526101ec60208201610a05565b82526040810151926020830193845261020760608301610a05565b976040840198895261021b60808401610a05565b6060850190815260a08401516080860190815260c08501519060a0870191825261024760e08701610a05565b9260c0880193845261010087015167ffffffffffffffff811161009457870185603f8201121561009457602081015190610280826106d2565b9661028e60405198896106b0565b8288526040828401011161009457815f92604060209301838a015e870101526101208701516001600160a01b03811697908890036100945761014001519563ffffffff87168097036100945781516001600160a01b039182169116036104d3578b8251906102fb91610a19565b895161030691610a2c565b82528b83519061031591610a19565b895161032091610a2c565b83528b8952308452604051630ed8d73960e21b815297516001600160a01b0390811660048a0152985160248901529b51881660448801529a518716606487015299516084860152985160a4850152975190931660c483015261014060e4830152909586928392916103969061014485019061078a565b9161010484015261012483015203815a6020945f91f1928315610493575f9361049e575b506020602491604051928380926370a0823160e01b82523060048301525afa908115610493575f91610461575b50836103f383836107ae565b0361042c5761042883604051906020820152602081526104146040826106b0565b60405191829160208352602083019061078a565b0390f35b909150820391821161044d57638e17b66b60e01b5f5260045260245260445ffd5b634e487b7160e01b5f52601160045260245ffd5b90506020813d60201161048b575b8161047c602093836106b0565b810103126100945751846103e7565b3d915061046f565b6040513d5f823e3d90fd5b9092506020813d6020116104cb575b816104ba602093836106b0565b8101031261009457519160206103ba565b3d91506104ad565b60405162461bcd60e51b815260206004820152601460248201527324a72b20a624a22fa7aaaa282aaa2faa27a5a2a760611b6044820152606490fd5b634e487b7160e01b5f52604160045260245ffd5b6020813d602011610552575b8161053c602093836106b0565b81010312610094575180151581146101a5575f80fd5b3d915061052f565b9094506020813d602011610586575b81610576602093836106b0565b8101031261009457519385610148565b3d9150610569565b346100945761059c36610734565b9190602083519381808201958692010103126100945791516105c89290916001600160a01b03166108a5565b005b34610094576080366003190112610094576105e3610684565b6105eb61069a565b906044356001600160a01b03811681036100945760643567ffffffffffffffff81116100945761061f9036906004016106ee565b92602084519481808201968792010103126100945792516105c89390926001600160a01b031661083d565b346100945761065836610734565b9190602083519381808201958692010103126100945791516105c89290916001600160a01b03166107bb565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff82111761050f57604052565b67ffffffffffffffff811161050f57601f01601f191660200190565b81601f8201121561009457803590610705826106d2565b9261071360405194856106b0565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff821161009457610787916004016106ee565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9190820180921161044d57565b9091905f19821461082e576001600160a01b03831630148015610826575b6108215760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261081f919061081a6064836106b0565b610a4a565b565b505050565b5081156107d9565b630d550c3b60e11b5f5260045ffd5b9092915f19831461082e576001600160a01b03908116931691828414801561089d575b6108975761081f93604051936323b872dd60e01b60208601526024850152604484015260648301526064825261081a6084836106b0565b50505050565b508015610860565b821580156109f3575b61082157604051636eb1769f60e11b81523060048201526001600160a01b03838116602483018190529490831691602081604481865afa908115610493575f916109bf575b5061093b946109496109086020945f946107ae565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529687906064820190565b03601f1981018852876106b0565b85519082865af1903d5f5190836109a0575b5050501561096857505050565b61081a61081f936040519063095ea7b360e01b602083015260248201525f60448201526044815261099a6064826106b0565b82610a4a565b919250906109b557503b15155b5f808061095b565b60019150146109ad565b90506020813d6020116109eb575b816109da602093836106b0565b81010312610094575161093b6108f3565b3d91506109cd565b506001600160a01b03821630146108ae565b51906001600160a01b038216820361009457565b8181029291811591840414171561044d57565b8115610a36570490565b634e487b7160e01b5f52601260045260245ffd5b905f602091828151910182855af115610493575f513d610a9957506001600160a01b0381163b155b610a795750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b60011415610a7256fea26469706673582212204763315a6411a7960fce618c8c1b5d96ae7ea3c2ea7ebb92abcf095b95bbea1c64736f6c634300081b0033000000000000000000000000a669e7a0d4b3e4fa48af2de86bd4cd7126be4e13", + "nonce": "0x118", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x6a0adee2b9b03931714160c9cb43a3a61bb55a257fa170fc20528d253cca9dbf", + "transactionType": "CREATE", + "contractName": "PendleSwapV3Adapter", + "contractAddress": "0xdf69dda7ba69ddeeb4182b821eb2356744180405", + "function": null, + "arguments": [ + "0x888888888889758F76e7103c6CbF23ABbF58F946" + ], + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "gas": "0x1845fd", + "value": "0x0", + "input": "0x60a0604052346100ea57604051601f6113d838819003918201601f19168301916001600160401b038311848410176100d6578084926020946040528339810103126100ea57516001600160a01b038116908190036100ea5760405160a081016001600160401b038111828210176100d657655af3107a4000916080916040525f81525f1960208201525f6040820152610100606082015201525f6008555f196009555f600a55610100600b55655af3107a4000600c556080526040516112e990816100ef8239608051818181608901526103200152f35b634e487b7160e01b5f52604160045260245ffd5b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816309316dd314610a6b575080633268263b14610a315780634ebfc814146109f25780636563c0e9146109725780639df3032514610936578063e0a80413146101f8578063f66a7749146100bc5763f887ea4014610074575f80fd5b346100b8575f3660031901126100b8576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b346100b8575f3660031901126100b8575f54604051905f6001548060011c91600182169182156101ee575b6020841083146101da5783865285929081156101bb575060011461015c575b61011292500383610c0d565b60ff60025416610150604051938361012e8660ff819716610d3f565b60081c6001600160a01b03166020850152608060408501819052840190610c43565b90151560608301520390f35b5060015f90815290917fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b81831061019f57505090602061011292820101610106565b6020919350806001915483858901015201910190918492610187565b6020925061011294915060ff191682840152151560051b820101610106565b634e487b7160e01b5f52602260045260245ffd5b92607f16926100e7565b346100b85760803660031901126100b857610211610c67565b610219610c7d565b9060443567ffffffffffffffff81116100b85761023a903690600401610c93565b9060643567ffffffffffffffff81116100b85761025b903690600401610c93565b91602081519181808201938492010103126100b857516040516370a0823160e01b8152306004820152936001600160a01b03909216929091602085602481875afa948515610551575f95610902575b5060018060a01b0316906060818051810103126100b85760208101516001600160a01b038116908190036100b857606060408301519201519260405192630b2339af60e21b8452606084600481865afa938415610551575f94610895575b5060405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600482018190526024820188905295906020816044815f8d5af1801561055157610878575b508681029080820488149015171561050b5781156108645704926001600160a01b0316908082036105ba57505060405163095ea7b360e01b81526001600160a01b038416600482015260248101859052926020846044815f8a5af1928315610551576104509460609461058d575b505f6103dd6111eb565b938885528760208601528860408601526104626040519788968795869463640fc23d60e11b86523060048701526024860152604485015260085460648501526009546084850152600a5460a4850152600b5460c4850152600c5460e4850152610140610104850152610144840190610fea565b8281036003190161012484015261119b565b03925af1908115610551576024916020915f9161055c575b50935b6040516370a0823160e01b815230600482015292839182905afa908115610551575f9161051f575b50836104b18383610d60565b036104ea576104e683604051906020820152602081526104d2604082610c0d565b604051918291602083526020830190610c43565b0390f35b909150820391821161050b57638e17b66b60e01b5f5260045260245260445ffd5b634e487b7160e01b5f52601160045260245ffd5b90506020813d602011610549575b8161053a60209383610c0d565b810103126100b85751846104a5565b3d915061052d565b6040513d5f823e3d90fd5b61057e915060603d606011610586575b6105768183610c0d565b810190610fcf565b50508661047a565b503d61056c565b6105ae9060203d6020116105b3575b6105a68183610c0d565b810190610fb7565b6103d3565b503d61059c565b90929593604051630bc4ed8360e21b8152602081600481885afa908115610551575f91610845575b501561073c5750505060206004916040519283809263781c18db60e01b82525afa908115610551575f916106fa575b5060405163a9059cbb60e01b81526001600160a01b039190911660048201819052602482018490529093906020856044815f875af1908115610551575f956020926106df575b5060246040518097819363bcb7ea5d60e01b83523060048401525af1938415610551575f946106ab575b5083818110610696575050602060249161047d565b63eb7f211d60e01b5f5260045260245260445ffd5b9093506020813d6020116106d7575b816106c760209383610c0d565b810103126100b857519285610681565b3d91506106ba565b6106f590833d85116105b3576105a68183610c0d565b610657565b90506020813d602011610734575b8161071560209383610c0d565b810103126100b857516001600160a01b03811681036100b85785610611565b3d9150610708565b60405163095ea7b360e01b81526001600160a01b0382166004820152602481018790529496929491935090916020836044815f8b5af18015610551576107e8956060956107d7955f93610828575b506107936111eb565b938185526020850152604084015260405196879586948593631652a23360e21b855230600486015260248501528a604485015260a0606485015260a4840190610fea565b82810360031901608484015261119b565b03925af1908115610551576024916020915f91610807575b509361047d565b610820915060603d606011610586576105768183610c0d565b505086610800565b6108409060203d6020116105b3576105a68183610c0d565b61078a565b61085e915060203d6020116105b3576105a68183610c0d565b896105e2565b634e487b7160e01b5f52601260045260245ffd5b6108909060203d6020116105b3576105a68183610c0d565b610365565b9093506060813d6060116108fa575b816108b160609383610c0d565b810103126100b85780516001600160a01b038116036100b8576020810151906001600160a01b03821682036100b857604001516001600160a01b038116036100b8579288610308565b3d91506108a4565b9094506020813d60201161092e575b8161091e60209383610c0d565b810103126100b8575193856102aa565b3d9150610911565b346100b85761094436610ce9565b9190602083519381808201958692010103126100b85791516109709290916001600160a01b0316610e57565b005b346100b85760803660031901126100b85761098b610c67565b610993610c7d565b906044356001600160a01b03811681036100b85760643567ffffffffffffffff81116100b8576109c7903690600401610c93565b92602084519481808201968792010103126100b85792516109709390926001600160a01b0316610def565b346100b8575f3660031901126100b85760a0600854600954600a54600b5490600c54926040519485526020850152604084015260608301526080820152f35b346100b857610a3f36610ce9565b9190602083519381808201958692010103126100b85791516109709290916001600160a01b0316610d6d565b346100b8575f3660031901126100b85760018060a01b0360035416600454915f6007548060011c90600181168015610b6c575b6020831081146101da57828552908115610b485750600114610aea575b5090610acc816104e6930382610c0d565b60405193849384526020840152606060408401526060830190610c43565b60075f9081527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688939250905b808210610b2e57509091508101602001610acc610abb565b919260018160209254838588010152019101909291610b16565b60ff191660208086019190915291151560051b84019091019150610acc9050610abb565b91607f1691610a9e565b5f92918154918260011c92600181168015610c03575b6020851081146101da57848452908115610be65750600114610bad57505050565b5f9081526020812093945091925b838310610bcc575060209250010190565b600181602092949394548385870101520191019190610bbb565b915050602093945060ff929192191683830152151560051b010190565b93607f1693610b8c565b90601f8019910116810190811067ffffffffffffffff821117610c2f57604052565b634e487b7160e01b5f52604160045260245ffd5b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036100b857565b602435906001600160a01b03821682036100b857565b81601f820112156100b85780359067ffffffffffffffff8211610c2f5760405192610cc8601f8401601f191660200185610c0d565b828452602083830101116100b857815f926020809301838601378301015290565b60606003198201126100b8576004356001600160a01b03811681036100b857916024356001600160a01b03811681036100b857916044359067ffffffffffffffff82116100b857610d3c91600401610c93565b90565b90600b821015610d4c5752565b634e487b7160e01b5f52602160045260245ffd5b9190820180921161050b57565b9091905f198214610de0576001600160a01b03831630148015610dd8575b610dd35760405163a9059cbb60e01b60208201526001600160a01b03939093166024840152604480840192909252908252610dd19190610dcc606483610c0d565b61125b565b565b505050565b508115610d8b565b630d550c3b60e11b5f5260045ffd5b9092915f198314610de0576001600160a01b039081169316918284148015610e4f575b610e4957610dd193604051936323b872dd60e01b602086015260248501526044840152606483015260648252610dcc608483610c0d565b50505050565b508015610e12565b82158015610fa5575b610dd357604051636eb1769f60e11b81523060048201526001600160a01b03838116602483018190529490831691602081604481865afa908115610551575f91610f71575b50610eed94610efb610eba6020945f94610d60565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529687906064820190565b03601f198101885287610c0d565b85519082865af1903d5f519083610f52575b50505015610f1a57505050565b610dcc610dd1936040519063095ea7b360e01b602083015260248201525f604482015260448152610f4c606482610c0d565b8261125b565b91925090610f6757503b15155b5f8080610f0d565b6001915014610f5f565b90506020813d602011610f9d575b81610f8c60209383610c0d565b810103126100b85751610eed610ea5565b3d9150610f7f565b506001600160a01b0382163014610e60565b908160209103126100b8575180151581036100b85790565b908160609103126100b8578051916040602083015192015190565b60809060018060a01b0381511683526020810151602084015260018060a01b03604082015116604084015260018060a01b03606082015116606084015201519060a0608082015261103f60a082018351610d3f565b60208201516001600160a01b031660c08201526040820151608060e08301526101009060609061107490610120850190610c43565b930151151591015290565b908060208354918281520160208260051b840101935f5260205f20925f905b8382106110ad57505050505090565b9091929394601f19828203018452606081528554606082015260018601546080820152600286015460a0820152600386015460ff81166004811015610d4c5760c08301526001600160a01b03600891821c811660e0840152600488015481166101008401526005880154811661012084015260068801541661014083015260078701546101608301528601546101808083019190915260098701546101a08301526101c0820152600190602090600d906111816111716101e08301600a8c01610b76565b82810385840152600b8b01610b76565b906040600c8b01549101529701940192019093929361109e565b610d3c9060018060a01b03600354168152600454602082015260a060408201526111db6111cc60a08301600561107f565b8281036060840152600661107f565b9060808183039101526007610b76565b6040519060a0820182811067ffffffffffffffff821117610c2f57604052815f81525f60208201525f60408201525f606082015260405190608082019082821067ffffffffffffffff831117610c2f576080916040525f83525f6020840152606060408401525f60608401520152565b905f602091828151910182855af115610551575f513d6112aa57506001600160a01b0381163b155b61128a5750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b6001141561128356fea26469706673582212201ee77fd202ede4dc014cdf8b197fb2ef16d65387626d9feaaf9b419b66e37d0764736f6c634300081b0033000000000000000000000000888888888889758f76e7103c6cbf23abbf58f946", + "nonce": "0x119", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x7954626b30f44904a2364a8a45c6059396adc8aae48e0648e2273ad345d4884d", + "transactionType": "CREATE", + "contractName": "ERC4626VaultAdapter", + "contractAddress": "0x1084fcddee1526a2331095207bf7e35e716c01bd", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "gas": "0xbdf66", + "value": "0x0", + "input": "0x60808060405234601557610961908161001a8239f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b1461051c5780636563c0e91461049c5780639df30325146104605763e0a8041314610045575f80fd5b3461029d57608036600319011261029d5761005e610556565b61006661056c565b60443567ffffffffffffffff811161029d576100869036906004016105b8565b9160643567ffffffffffffffff811161029d576100a79036906004016105b8565b926020815191818082019384920101031261029d57516040516370a0823160e01b81523060048201529290916001600160a01b031690602084602481855afa9384156102a9575f9461042c575b5060018060a01b03169360608180518101031261029d57602081015190600282101561029d57606060408201519101518481029080820486149015171561025f57811561041857049080610328575060405163095ea7b360e01b81526001600160a01b038616600482015260248101849052946020866044815f875af19081156102a9575f966020926102fd575b50604460405180988193636e553f6560e01b83528860048401523060248401525af19485156102a9575f956102c9575b50848181106102b457505060206024915b6040516370a0823160e01b815230600482015292839182905afa9081156102a9575f91610273575b50826101f78383610664565b0361024157836040805160208101928352602081526102168282610582565b8151928391602083525180918160208501528484015e5f828201840152601f01601f19168101030190f35b820391821161025f57638e17b66b60e01b5f5260045260245260445ffd5b634e487b7160e01b5f52601160045260245ffd5b90506020813d6020116102a1575b8161028e60209383610582565b8101031261029d57515f6101eb565b5f80fd5b3d9150610281565b6040513d5f823e3d90fd5b63eb7f211d60e01b5f5260045260245260445ffd5b9094506020813d6020116102f5575b816102e560209383610582565b8101031261029d5751935f6101b2565b3d91506102d8565b61031c90833d8511610321575b6103148183610582565b8101906108bb565b610182565b503d61030a565b9094506001036104095760405163095ea7b360e01b81526001600160a01b0382166004820152602481018390526020816044815f865af180156102a9576103ec575b5060405193635d043b2960e11b85528260048601523060248601523060448601526020856064815f865af19485156102a9575f956103b8575b50848181106102b457505060206024916101c3565b9094506020813d6020116103e4575b816103d460209383610582565b8101031261029d5751935f6103a3565b3d91506103c7565b6104049060203d602011610321576103148183610582565b61036a565b634a7f394f60e01b5f5260045ffd5b634e487b7160e01b5f52601260045260245ffd5b9093506020813d602011610458575b8161044860209383610582565b8101031261029d5751925f6100f4565b3d915061043b565b3461029d5761046e3661060e565b91906020835193818082019586920101031261029d57915161049a9290916001600160a01b031661075b565b005b3461029d57608036600319011261029d576104b5610556565b6104bd61056c565b906044356001600160a01b038116810361029d5760643567ffffffffffffffff811161029d576104f19036906004016105b8565b926020845194818082019687920101031261029d57925161049a9390926001600160a01b03166106f3565b3461029d5761052a3661060e565b91906020835193818082019586920101031261029d57915161049a9290916001600160a01b0316610671565b600435906001600160a01b038216820361029d57565b602435906001600160a01b038216820361029d57565b90601f8019910116810190811067ffffffffffffffff8211176105a457604052565b634e487b7160e01b5f52604160045260245ffd5b81601f8201121561029d5780359067ffffffffffffffff82116105a457604051926105ed601f8401601f191660200185610582565b8284526020838301011161029d57815f926020809301838601378301015290565b606060031982011261029d576004356001600160a01b038116810361029d57916024356001600160a01b038116810361029d57916044359067ffffffffffffffff821161029d57610661916004016105b8565b90565b9190820180921161025f57565b9091905f1982146106e4576001600160a01b038316301480156106dc575b6106d75760405163a9059cbb60e01b60208201526001600160a01b039390931660248401526044808401929092529082526106d591906106d0606483610582565b6108d3565b565b505050565b50811561068f565b630d550c3b60e11b5f5260045ffd5b9092915f1983146106e4576001600160a01b039081169316918284148015610753575b61074d576106d593604051936323b872dd60e01b6020860152602485015260448401526064830152606482526106d0608483610582565b50505050565b508015610716565b821580156108a9575b6106d757604051636eb1769f60e11b81523060048201526001600160a01b03838116602483018190529490831691602081604481865afa9081156102a9575f91610875575b506107f1946107ff6107be6020945f94610664565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529687906064820190565b03601f198101885287610582565b85519082865af1903d5f519083610856575b5050501561081e57505050565b6106d06106d5936040519063095ea7b360e01b602083015260248201525f604482015260448152610850606482610582565b826108d3565b9192509061086b57503b15155b5f8080610811565b6001915014610863565b90506020813d6020116108a1575b8161089060209383610582565b8101031261029d57516107f16107a9565b3d9150610883565b506001600160a01b0382163014610764565b9081602091031261029d5751801515810361029d5790565b905f602091828151910182855af1156102a9575f513d61092257506001600160a01b0381163b155b6109025750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156108fb56fea2646970667358221220f873473c980ff986be5bdcc90d6237af100c3efe734f2a1fd6277d6017a3857f64736f6c634300081b0033", + "nonce": "0x11a", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xafaf74b2e749ca0e5b571953f380fd40933ea43c017b64f88c207c2568b30c42", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", + "function": "setAdapterWhitelist(address,address,bool)", + "arguments": [ + "0x7fa333b184868d88aC78a82eC06d5e87d4B0322E", + "0x25e4889346F04B4E005FFab35Bf2C3CB395E74d5", + "true" + ], + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", + "gas": "0x15ac9", + "value": "0x0", + "input": "0xb6b07b8e0000000000000000000000007fa333b184868d88ac78a82ec06d5e87d4b0322e00000000000000000000000025e4889346f04b4e005ffab35bf2c3cb395e74d50000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x11b", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x23bbfc3740ffc675ccda95c09e0ebf7e2443089b2455de950b0e436d244478b6", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", + "function": "setAdapterWhitelist(address,address,bool)", + "arguments": [ + "0x7fa333b184868d88aC78a82eC06d5e87d4B0322E", + "0x003E6F7f6071a4E33F9324C125dEaE2615998010", + "true" + ], + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", + "gas": "0x15ac9", + "value": "0x0", + "input": "0xb6b07b8e0000000000000000000000007fa333b184868d88ac78a82ec06d5e87d4b0322e000000000000000000000000003e6f7f6071a4e33f9324c125deae26159980100000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x11c", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xae334ad4c19f4eb1caa7dbdf334bbf822b65b2cdb57f796303524d2bd3ae6940", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", + "function": "setAdapterWhitelist(address,address,bool)", + "arguments": [ + "0x7fa333b184868d88aC78a82eC06d5e87d4B0322E", + "0xDf69dDA7ba69ddEEB4182b821eb2356744180405", + "true" + ], + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", + "gas": "0x15ad8", + "value": "0x0", + "input": "0xb6b07b8e0000000000000000000000007fa333b184868d88ac78a82ec06d5e87d4b0322e000000000000000000000000df69dda7ba69ddeeb4182b821eb23567441804050000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x11d", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x82070274c1fa6384c4f0fc5cb582bfbd674a2e341ffeb0af29715da474b5c721", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", + "function": "setAdapterWhitelist(address,address,bool)", + "arguments": [ + "0x7fa333b184868d88aC78a82eC06d5e87d4B0322E", + "0x1084fCdDee1526a2331095207bf7e35e716c01bd", + "true" + ], + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", + "gas": "0x15ad8", + "value": "0x0", + "input": "0xb6b07b8e0000000000000000000000007fa333b184868d88ac78a82ec06d5e87d4b0322e0000000000000000000000001084fcddee1526a2331095207bf7e35e716c01bd0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x11e", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x98b21", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x4df862fd2444842c869f2d44d11555de94e8cebea16cda7ef15c14cc27039563", + "transactionIndex": "0x2", + "blockHash": "0x47597d6970b43c3847e851e75206095d72367dfd22718f1c87d6c60d8ad5b29a", + "blockNumber": "0x14d57677", + "gasUsed": "0x93433", + "effectiveGasPrice": "0x989680", + "blobGasUsed": "0x0", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": null, + "contractAddress": "0x25e4889346f04b4e005ffab35bf2c3cb395e74d5", + "gasUsedForL1": "0x4a5f", + "l1BlockNumber": "0x15b230c" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xbb251", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xf2ef3b49657979ab628163410dddfcef7ffa4b6c2983671005e9d40e48243dd9", + "transactionIndex": "0x2", + "blockHash": "0x003ce234b469546396c990a9ded9f5575e1c0bde2cd6165a8d18f4cf2b7e056c", + "blockNumber": "0x14d5767f", + "gasUsed": "0xa50b2", + "effectiveGasPrice": "0x989680", + "blobGasUsed": "0x0", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": null, + "contractAddress": "0x003e6f7f6071a4e33f9324c125deae2615998010", + "gasUsedForL1": "0x52df", + "l1BlockNumber": "0x15b230c" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x176e7e", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x6a0adee2b9b03931714160c9cb43a3a61bb55a257fa170fc20528d253cca9dbf", + "transactionIndex": "0x4", + "blockHash": "0x79887d947b102d21f4b79e1966d3031ce5baa2e7c27e9ea53c013e090e537c9a", + "blockNumber": "0x14d57688", + "gasUsed": "0x12717b", + "effectiveGasPrice": "0x989680", + "blobGasUsed": "0x0", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": null, + "contractAddress": "0xdf69dda7ba69ddeeb4182b821eb2356744180405", + "gasUsedForL1": "0x886f", + "l1BlockNumber": "0x15b230c" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xa657c", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x7954626b30f44904a2364a8a45c6059396adc8aae48e0648e2273ad345d4884d", + "transactionIndex": "0x4", + "blockHash": "0xf252c397a91923333adac5ab8ab5f066b4ff1ae3e0913547fc7d290754a4f570", + "blockNumber": "0x14d576ae", + "gasUsed": "0x901e4", + "effectiveGasPrice": "0x989680", + "blobGasUsed": "0x0", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": null, + "contractAddress": "0x1084fcddee1526a2331095207bf7e35e716c01bd", + "gasUsedForL1": "0x4543", + "l1BlockNumber": "0x15b230c" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x43e7c", + "logs": [ + { + "address": "0x7fa333b184868d88ac78a82ec06d5e87d4b0322e", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x00000000000000000000000025e4889346f04b4e005ffab35bf2c3cb395e74d50000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x980d7fc755bf816082e5dd7aa5cc883e7f5f84ed95822d9997d86c5a9f8a018a", + "blockNumber": "0x14d576b5", + "transactionHash": "0xafaf74b2e749ca0e5b571953f380fd40933ea43c017b64f88c207c2568b30c42", + "transactionIndex": "0x5", + "logIndex": "0x3", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xafaf74b2e749ca0e5b571953f380fd40933ea43c017b64f88c207c2568b30c42", + "transactionIndex": "0x5", + "blockHash": "0x980d7fc755bf816082e5dd7aa5cc883e7f5f84ed95822d9997d86c5a9f8a018a", + "blockNumber": "0x14d576b5", + "gasUsed": "0x101d5", + "effectiveGasPrice": "0x989680", + "blobGasUsed": "0x0", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", + "contractAddress": null, + "gasUsedForL1": "0x900", + "l1BlockNumber": "0x15b230d" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x4a6ac0", + "logs": [ + { + "address": "0x7fa333b184868d88ac78a82ec06d5e87d4b0322e", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x000000000000000000000000003e6f7f6071a4e33f9324c125deae26159980100000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xd625cc450c95aaef0fc260034a2b8e2d756067a33f65aa78f1e0e89e2a4b91e9", + "blockNumber": "0x14d576bc", + "transactionHash": "0x23bbfc3740ffc675ccda95c09e0ebf7e2443089b2455de950b0e436d244478b6", + "transactionIndex": "0xb", + "logIndex": "0x10", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x23bbfc3740ffc675ccda95c09e0ebf7e2443089b2455de950b0e436d244478b6", + "transactionIndex": "0xb", + "blockHash": "0xd625cc450c95aaef0fc260034a2b8e2d756067a33f65aa78f1e0e89e2a4b91e9", + "blockNumber": "0x14d576bc", + "gasUsed": "0x101d5", + "effectiveGasPrice": "0x989680", + "blobGasUsed": "0x0", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", + "contractAddress": null, + "gasUsedForL1": "0x900", + "l1BlockNumber": "0x15b230d" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x59226", + "logs": [ + { + "address": "0x7fa333b184868d88ac78a82ec06d5e87d4b0322e", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x000000000000000000000000df69dda7ba69ddeeb4182b821eb23567441804050000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xe8dd43f2a0b6cd615a0189ba6d81c8d8f66dccdacf7899d28e239b706f401570", + "blockNumber": "0x14d576c4", + "transactionHash": "0xae334ad4c19f4eb1caa7dbdf334bbf822b65b2cdb57f796303524d2bd3ae6940", + "transactionIndex": "0x4", + "logIndex": "0x9", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xae334ad4c19f4eb1caa7dbdf334bbf822b65b2cdb57f796303524d2bd3ae6940", + "transactionIndex": "0x4", + "blockHash": "0xe8dd43f2a0b6cd615a0189ba6d81c8d8f66dccdacf7899d28e239b706f401570", + "blockNumber": "0x14d576c4", + "gasUsed": "0x101e1", + "effectiveGasPrice": "0x989680", + "blobGasUsed": "0x0", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", + "contractAddress": null, + "gasUsedForL1": "0x900", + "l1BlockNumber": "0x15b230d" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x101e1", + "logs": [ + { + "address": "0x7fa333b184868d88ac78a82ec06d5e87d4b0322e", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x0000000000000000000000001084fcddee1526a2331095207bf7e35e716c01bd0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x85e0d67d494bd1e4a4cb5b6013b61f4d159bda180cb70c73f5f9aa5b065d8d2c", + "blockNumber": "0x14d576cc", + "transactionHash": "0x82070274c1fa6384c4f0fc5cb582bfbd674a2e341ffeb0af29715da474b5c721", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x82070274c1fa6384c4f0fc5cb582bfbd674a2e341ffeb0af29715da474b5c721", + "transactionIndex": "0x1", + "blockHash": "0x85e0d67d494bd1e4a4cb5b6013b61f4d159bda180cb70c73f5f9aa5b065d8d2c", + "blockNumber": "0x14d576cc", + "gasUsed": "0x101e1", + "effectiveGasPrice": "0x989680", + "blobGasUsed": "0x0", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", + "contractAddress": null, + "gasUsedForL1": "0x900", + "l1BlockNumber": "0x15b230d" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1750474250, + "chain": 42161, + "commit": "53496c4" +} \ No newline at end of file diff --git a/broadcast/DeployMarket.s.sol/1/run-1750477645.json b/broadcast/DeployMarket.s.sol/1/run-1750477645.json new file mode 100644 index 0000000..605dbbb --- /dev/null +++ b/broadcast/DeployMarket.s.sol/1/run-1750477645.json @@ -0,0 +1,222 @@ +{ + "transactions": [ + { + "hash": "0x4bd6bc5824a7b615c2163bb893ac1cfbf804991780696e41d41afaaf0c2391c1", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "gas": "0x1a8513", + "value": "0x0", + "input": "0xdc496c2000000000000000000000000037ba9934aaba7a49cc29d0952c6a91d7c7043dbcd9eb2aaa5f19c272f06ea2b4c8449687a8c2ac90aa2cfba9b3c9de0dca6ca69500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b10da2f9147f9cf2b8826877cd0c95c18a0f42dc000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000da4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000719e77027952929ed3060dbffc5d43ec50c1cf7900000000000000000000000000000000000000000000000000000000691fab8000000000000000000000000000000000000000000000000000000000001e848000000000000000000000000000000000000000000000000000000000001e848000000000000000000000000000000000000000000000000000000000002dc6c000000000000000000000000000000000000000000000000000000000002dc6c0000000000000000000000000000000000000000000000000000000000098968000000000000000000000000000000000000000000000000000000000005b8d80000000000000000000000000e3a31690392e8e18dc3d862651c079339e2c1ade0000000000000000000000000000000000000000000000000000000005742de000000000000000000000000000000000000000000000000000000000053724e00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000422ca8b0a00a4250000000000000000000000000000000000000000000000000000000000000000000021555344432f50542d635553444f2d32304e4f56323032354032314e4f5632303235000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021555344432f50542d635553444f2d32304e4f56323032354032314e4f563230323500000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x36b", + "chainId": "0x1" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0xb8d33503a851d2d44e02f14fb0321e900c7a89ac", + "initCode": "0x3d602d80600a3d3981f3363d3d373d3d3d363d73883192efdd5a3417b2c0a14b25f7536b2018f8535af43d82803e903d91602b57fd5bf3" + }, + { + "transactionType": "CREATE", + "address": "0x52d0713604f23383063ce89cf36801428b0136b8", + "initCode": "0x3d602d80600a3d3981f3363d3d373d3d3d363d73a715005c1a8524c0790029153b8a860f96a2a8565af43d82803e903d91602b57fd5bf3" + }, + { + "transactionType": "CREATE", + "address": "0x5aa72d45b2b6381b87eb407288920e3fc4c0e9c3", + "initCode": "0x3d602d80600a3d3981f3363d3d373d3d3d363d73a715005c1a8524c0790029153b8a860f96a2a8565af43d82803e903d91602b57fd5bf3" + }, + { + "transactionType": "CREATE", + "address": "0x424a1e95eaad4e768dc925679c63ba230552965b", + "initCode": "0x3d602d80600a3d3981f3363d3d373d3d3d363d738a2e5bfe2c0b1930575c75a61aad0d81baf93daa5af43d82803e903d91602b57fd5bf3" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x3aac54", + "logs": [ + { + "address": "0xb8d33503a851d2d44e02f14fb0321e900c7a89ac", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000da4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf" + ], + "data": "0x", + "blockHash": "0x9cb4bcfb8c1f1915ca773349d068f5c955302315a7c46c6f3b98f6ad3738e302", + "blockNumber": "0x15b2428", + "blockTimestamp": "0x68562b4b", + "transactionHash": "0x4bd6bc5824a7b615c2163bb893ac1cfbf804991780696e41d41afaaf0c2391c1", + "transactionIndex": "0x31", + "logIndex": "0x37", + "removed": false + }, + { + "address": "0x52d0713604f23383063ce89cf36801428b0136b8", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000b8d33503a851d2d44e02f14fb0321e900c7a89ac" + ], + "data": "0x", + "blockHash": "0x9cb4bcfb8c1f1915ca773349d068f5c955302315a7c46c6f3b98f6ad3738e302", + "blockNumber": "0x15b2428", + "blockTimestamp": "0x68562b4b", + "transactionHash": "0x4bd6bc5824a7b615c2163bb893ac1cfbf804991780696e41d41afaaf0c2391c1", + "transactionIndex": "0x31", + "logIndex": "0x38", + "removed": false + }, + { + "address": "0x52d0713604f23383063ce89cf36801428b0136b8", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x9cb4bcfb8c1f1915ca773349d068f5c955302315a7c46c6f3b98f6ad3738e302", + "blockNumber": "0x15b2428", + "blockTimestamp": "0x68562b4b", + "transactionHash": "0x4bd6bc5824a7b615c2163bb893ac1cfbf804991780696e41d41afaaf0c2391c1", + "transactionIndex": "0x31", + "logIndex": "0x39", + "removed": false + }, + { + "address": "0x5aa72d45b2b6381b87eb407288920e3fc4c0e9c3", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000b8d33503a851d2d44e02f14fb0321e900c7a89ac" + ], + "data": "0x", + "blockHash": "0x9cb4bcfb8c1f1915ca773349d068f5c955302315a7c46c6f3b98f6ad3738e302", + "blockNumber": "0x15b2428", + "blockTimestamp": "0x68562b4b", + "transactionHash": "0x4bd6bc5824a7b615c2163bb893ac1cfbf804991780696e41d41afaaf0c2391c1", + "transactionIndex": "0x31", + "logIndex": "0x3a", + "removed": false + }, + { + "address": "0x5aa72d45b2b6381b87eb407288920e3fc4c0e9c3", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x9cb4bcfb8c1f1915ca773349d068f5c955302315a7c46c6f3b98f6ad3738e302", + "blockNumber": "0x15b2428", + "blockTimestamp": "0x68562b4b", + "transactionHash": "0x4bd6bc5824a7b615c2163bb893ac1cfbf804991780696e41d41afaaf0c2391c1", + "transactionIndex": "0x31", + "logIndex": "0x3b", + "removed": false + }, + { + "address": "0x424a1e95eaad4e768dc925679c63ba230552965b", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000b8d33503a851d2d44e02f14fb0321e900c7a89ac" + ], + "data": "0x", + "blockHash": "0x9cb4bcfb8c1f1915ca773349d068f5c955302315a7c46c6f3b98f6ad3738e302", + "blockNumber": "0x15b2428", + "blockTimestamp": "0x68562b4b", + "transactionHash": "0x4bd6bc5824a7b615c2163bb893ac1cfbf804991780696e41d41afaaf0c2391c1", + "transactionIndex": "0x31", + "logIndex": "0x3c", + "removed": false + }, + { + "address": "0x424a1e95eaad4e768dc925679c63ba230552965b", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x9cb4bcfb8c1f1915ca773349d068f5c955302315a7c46c6f3b98f6ad3738e302", + "blockNumber": "0x15b2428", + "blockTimestamp": "0x68562b4b", + "transactionHash": "0x4bd6bc5824a7b615c2163bb893ac1cfbf804991780696e41d41afaaf0c2391c1", + "transactionIndex": "0x31", + "logIndex": "0x3d", + "removed": false + }, + { + "address": "0xb8d33503a851d2d44e02f14fb0321e900c7a89ac", + "topics": [ + "0x923c07a7269eb05c7b48c4002081d856ef37b3cbc4c2bae12d7493178477e306", + "0x000000000000000000000000b10da2f9147f9cf2b8826877cd0c95c18a0f42dc", + "0x000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000691fab8000000000000000000000000052d0713604f23383063ce89cf36801428b0136b80000000000000000000000005aa72d45b2b6381b87eb407288920e3fc4c0e9c3000000000000000000000000424a1e95eaad4e768dc925679c63ba230552965b", + "blockHash": "0x9cb4bcfb8c1f1915ca773349d068f5c955302315a7c46c6f3b98f6ad3738e302", + "blockNumber": "0x15b2428", + "blockTimestamp": "0x68562b4b", + "transactionHash": "0x4bd6bc5824a7b615c2163bb893ac1cfbf804991780696e41d41afaaf0c2391c1", + "transactionIndex": "0x31", + "logIndex": "0x3e", + "removed": false + }, + { + "address": "0xb8d33503a851d2d44e02f14fb0321e900c7a89ac", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x9cb4bcfb8c1f1915ca773349d068f5c955302315a7c46c6f3b98f6ad3738e302", + "blockNumber": "0x15b2428", + "blockTimestamp": "0x68562b4b", + "transactionHash": "0x4bd6bc5824a7b615c2163bb893ac1cfbf804991780696e41d41afaaf0c2391c1", + "transactionIndex": "0x31", + "logIndex": "0x3f", + "removed": false + }, + { + "address": "0x37ba9934aaba7a49cc29d0952c6a91d7c7043dbc", + "topics": [ + "0x3f53d2c2743b2b162c0aa5d678be4058d3ae2043700424be52c04105df3e2411", + "0x000000000000000000000000b8d33503a851d2d44e02f14fb0321e900c7a89ac", + "0x000000000000000000000000b10da2f9147f9cf2b8826877cd0c95c18a0f42dc", + "0x000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48" + ], + "data": "0x", + "blockHash": "0x9cb4bcfb8c1f1915ca773349d068f5c955302315a7c46c6f3b98f6ad3738e302", + "blockNumber": "0x15b2428", + "blockTimestamp": "0x68562b4b", + "transactionHash": "0x4bd6bc5824a7b615c2163bb893ac1cfbf804991780696e41d41afaaf0c2391c1", + "transactionIndex": "0x31", + "logIndex": "0x40", + "removed": false + } + ], + "logsBloom": "0x00020024000000000000008002000100000400000000000000800000000000000000008000200000000002000010000000000000000000000000004000000200000080000000000000000000000000000001000000000000000000000000000280000000020200000000000000040800800008000000000000040000000000400000000000002000000800000000000200000000000090000000000000000000000000000000000000000800000000400000000000000000000200000000200000000000000000000000000000000000000000000004000000000000000020000000000000000000200000000000000004002000000000400000002000000000", + "type": "0x2", + "transactionHash": "0x4bd6bc5824a7b615c2163bb893ac1cfbf804991780696e41d41afaaf0c2391c1", + "transactionIndex": "0x31", + "blockHash": "0x9cb4bcfb8c1f1915ca773349d068f5c955302315a7c46c6f3b98f6ad3738e302", + "blockNumber": "0x15b2428", + "gasUsed": "0x13332c", + "effectiveGasPrice": "0x10c899d4", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "contractAddress": null + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1750477645, + "chain": 1, + "commit": "53496c4" +} \ No newline at end of file diff --git a/broadcast/DeployMarket.s.sol/1/run-latest.json b/broadcast/DeployMarket.s.sol/1/run-latest.json new file mode 100644 index 0000000..605dbbb --- /dev/null +++ b/broadcast/DeployMarket.s.sol/1/run-latest.json @@ -0,0 +1,222 @@ +{ + "transactions": [ + { + "hash": "0x4bd6bc5824a7b615c2163bb893ac1cfbf804991780696e41d41afaaf0c2391c1", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "gas": "0x1a8513", + "value": "0x0", + "input": "0xdc496c2000000000000000000000000037ba9934aaba7a49cc29d0952c6a91d7c7043dbcd9eb2aaa5f19c272f06ea2b4c8449687a8c2ac90aa2cfba9b3c9de0dca6ca69500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b10da2f9147f9cf2b8826877cd0c95c18a0f42dc000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000da4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000719e77027952929ed3060dbffc5d43ec50c1cf7900000000000000000000000000000000000000000000000000000000691fab8000000000000000000000000000000000000000000000000000000000001e848000000000000000000000000000000000000000000000000000000000001e848000000000000000000000000000000000000000000000000000000000002dc6c000000000000000000000000000000000000000000000000000000000002dc6c0000000000000000000000000000000000000000000000000000000000098968000000000000000000000000000000000000000000000000000000000005b8d80000000000000000000000000e3a31690392e8e18dc3d862651c079339e2c1ade0000000000000000000000000000000000000000000000000000000005742de000000000000000000000000000000000000000000000000000000000053724e00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000422ca8b0a00a4250000000000000000000000000000000000000000000000000000000000000000000021555344432f50542d635553444f2d32304e4f56323032354032314e4f5632303235000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021555344432f50542d635553444f2d32304e4f56323032354032314e4f563230323500000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x36b", + "chainId": "0x1" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0xb8d33503a851d2d44e02f14fb0321e900c7a89ac", + "initCode": "0x3d602d80600a3d3981f3363d3d373d3d3d363d73883192efdd5a3417b2c0a14b25f7536b2018f8535af43d82803e903d91602b57fd5bf3" + }, + { + "transactionType": "CREATE", + "address": "0x52d0713604f23383063ce89cf36801428b0136b8", + "initCode": "0x3d602d80600a3d3981f3363d3d373d3d3d363d73a715005c1a8524c0790029153b8a860f96a2a8565af43d82803e903d91602b57fd5bf3" + }, + { + "transactionType": "CREATE", + "address": "0x5aa72d45b2b6381b87eb407288920e3fc4c0e9c3", + "initCode": "0x3d602d80600a3d3981f3363d3d373d3d3d363d73a715005c1a8524c0790029153b8a860f96a2a8565af43d82803e903d91602b57fd5bf3" + }, + { + "transactionType": "CREATE", + "address": "0x424a1e95eaad4e768dc925679c63ba230552965b", + "initCode": "0x3d602d80600a3d3981f3363d3d373d3d3d363d738a2e5bfe2c0b1930575c75a61aad0d81baf93daa5af43d82803e903d91602b57fd5bf3" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x3aac54", + "logs": [ + { + "address": "0xb8d33503a851d2d44e02f14fb0321e900c7a89ac", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000da4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf" + ], + "data": "0x", + "blockHash": "0x9cb4bcfb8c1f1915ca773349d068f5c955302315a7c46c6f3b98f6ad3738e302", + "blockNumber": "0x15b2428", + "blockTimestamp": "0x68562b4b", + "transactionHash": "0x4bd6bc5824a7b615c2163bb893ac1cfbf804991780696e41d41afaaf0c2391c1", + "transactionIndex": "0x31", + "logIndex": "0x37", + "removed": false + }, + { + "address": "0x52d0713604f23383063ce89cf36801428b0136b8", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000b8d33503a851d2d44e02f14fb0321e900c7a89ac" + ], + "data": "0x", + "blockHash": "0x9cb4bcfb8c1f1915ca773349d068f5c955302315a7c46c6f3b98f6ad3738e302", + "blockNumber": "0x15b2428", + "blockTimestamp": "0x68562b4b", + "transactionHash": "0x4bd6bc5824a7b615c2163bb893ac1cfbf804991780696e41d41afaaf0c2391c1", + "transactionIndex": "0x31", + "logIndex": "0x38", + "removed": false + }, + { + "address": "0x52d0713604f23383063ce89cf36801428b0136b8", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x9cb4bcfb8c1f1915ca773349d068f5c955302315a7c46c6f3b98f6ad3738e302", + "blockNumber": "0x15b2428", + "blockTimestamp": "0x68562b4b", + "transactionHash": "0x4bd6bc5824a7b615c2163bb893ac1cfbf804991780696e41d41afaaf0c2391c1", + "transactionIndex": "0x31", + "logIndex": "0x39", + "removed": false + }, + { + "address": "0x5aa72d45b2b6381b87eb407288920e3fc4c0e9c3", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000b8d33503a851d2d44e02f14fb0321e900c7a89ac" + ], + "data": "0x", + "blockHash": "0x9cb4bcfb8c1f1915ca773349d068f5c955302315a7c46c6f3b98f6ad3738e302", + "blockNumber": "0x15b2428", + "blockTimestamp": "0x68562b4b", + "transactionHash": "0x4bd6bc5824a7b615c2163bb893ac1cfbf804991780696e41d41afaaf0c2391c1", + "transactionIndex": "0x31", + "logIndex": "0x3a", + "removed": false + }, + { + "address": "0x5aa72d45b2b6381b87eb407288920e3fc4c0e9c3", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x9cb4bcfb8c1f1915ca773349d068f5c955302315a7c46c6f3b98f6ad3738e302", + "blockNumber": "0x15b2428", + "blockTimestamp": "0x68562b4b", + "transactionHash": "0x4bd6bc5824a7b615c2163bb893ac1cfbf804991780696e41d41afaaf0c2391c1", + "transactionIndex": "0x31", + "logIndex": "0x3b", + "removed": false + }, + { + "address": "0x424a1e95eaad4e768dc925679c63ba230552965b", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000b8d33503a851d2d44e02f14fb0321e900c7a89ac" + ], + "data": "0x", + "blockHash": "0x9cb4bcfb8c1f1915ca773349d068f5c955302315a7c46c6f3b98f6ad3738e302", + "blockNumber": "0x15b2428", + "blockTimestamp": "0x68562b4b", + "transactionHash": "0x4bd6bc5824a7b615c2163bb893ac1cfbf804991780696e41d41afaaf0c2391c1", + "transactionIndex": "0x31", + "logIndex": "0x3c", + "removed": false + }, + { + "address": "0x424a1e95eaad4e768dc925679c63ba230552965b", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x9cb4bcfb8c1f1915ca773349d068f5c955302315a7c46c6f3b98f6ad3738e302", + "blockNumber": "0x15b2428", + "blockTimestamp": "0x68562b4b", + "transactionHash": "0x4bd6bc5824a7b615c2163bb893ac1cfbf804991780696e41d41afaaf0c2391c1", + "transactionIndex": "0x31", + "logIndex": "0x3d", + "removed": false + }, + { + "address": "0xb8d33503a851d2d44e02f14fb0321e900c7a89ac", + "topics": [ + "0x923c07a7269eb05c7b48c4002081d856ef37b3cbc4c2bae12d7493178477e306", + "0x000000000000000000000000b10da2f9147f9cf2b8826877cd0c95c18a0f42dc", + "0x000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000691fab8000000000000000000000000052d0713604f23383063ce89cf36801428b0136b80000000000000000000000005aa72d45b2b6381b87eb407288920e3fc4c0e9c3000000000000000000000000424a1e95eaad4e768dc925679c63ba230552965b", + "blockHash": "0x9cb4bcfb8c1f1915ca773349d068f5c955302315a7c46c6f3b98f6ad3738e302", + "blockNumber": "0x15b2428", + "blockTimestamp": "0x68562b4b", + "transactionHash": "0x4bd6bc5824a7b615c2163bb893ac1cfbf804991780696e41d41afaaf0c2391c1", + "transactionIndex": "0x31", + "logIndex": "0x3e", + "removed": false + }, + { + "address": "0xb8d33503a851d2d44e02f14fb0321e900c7a89ac", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x9cb4bcfb8c1f1915ca773349d068f5c955302315a7c46c6f3b98f6ad3738e302", + "blockNumber": "0x15b2428", + "blockTimestamp": "0x68562b4b", + "transactionHash": "0x4bd6bc5824a7b615c2163bb893ac1cfbf804991780696e41d41afaaf0c2391c1", + "transactionIndex": "0x31", + "logIndex": "0x3f", + "removed": false + }, + { + "address": "0x37ba9934aaba7a49cc29d0952c6a91d7c7043dbc", + "topics": [ + "0x3f53d2c2743b2b162c0aa5d678be4058d3ae2043700424be52c04105df3e2411", + "0x000000000000000000000000b8d33503a851d2d44e02f14fb0321e900c7a89ac", + "0x000000000000000000000000b10da2f9147f9cf2b8826877cd0c95c18a0f42dc", + "0x000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48" + ], + "data": "0x", + "blockHash": "0x9cb4bcfb8c1f1915ca773349d068f5c955302315a7c46c6f3b98f6ad3738e302", + "blockNumber": "0x15b2428", + "blockTimestamp": "0x68562b4b", + "transactionHash": "0x4bd6bc5824a7b615c2163bb893ac1cfbf804991780696e41d41afaaf0c2391c1", + "transactionIndex": "0x31", + "logIndex": "0x40", + "removed": false + } + ], + "logsBloom": "0x00020024000000000000008002000100000400000000000000800000000000000000008000200000000002000010000000000000000000000000004000000200000080000000000000000000000000000001000000000000000000000000000280000000020200000000000000040800800008000000000000040000000000400000000000002000000800000000000200000000000090000000000000000000000000000000000000000800000000400000000000000000000200000000200000000000000000000000000000000000000000000004000000000000000020000000000000000000200000000000000004002000000000400000002000000000", + "type": "0x2", + "transactionHash": "0x4bd6bc5824a7b615c2163bb893ac1cfbf804991780696e41d41afaaf0c2391c1", + "transactionIndex": "0x31", + "blockHash": "0x9cb4bcfb8c1f1915ca773349d068f5c955302315a7c46c6f3b98f6ad3738e302", + "blockNumber": "0x15b2428", + "gasUsed": "0x13332c", + "effectiveGasPrice": "0x10c899d4", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "contractAddress": null + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1750477645, + "chain": 1, + "commit": "53496c4" +} \ No newline at end of file diff --git a/deployments/arb-mainnet/arb-mainnet-adapters.json b/deployments/arb-mainnet/arb-mainnet-adapters.json new file mode 100644 index 0000000..ac1f0cf --- /dev/null +++ b/deployments/arb-mainnet/arb-mainnet-adapters.json @@ -0,0 +1,18 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1750474201", + "gitBranch": "v1_special_adapter", + "gitCommitHash": "0x0x53496c4b59815c620e0ac5b4504e4b712ef08515", + "blockInfo": { + "number": "349533707", + "timestamp": "1750474201" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "swapAdapter": { + "uniswapV3Adapter": "0x25e4889346F04B4E005FFab35Bf2C3CB395E74d5", + "odosV2Adapter": "0x003E6F7f6071a4E33F9324C125dEaE2615998010", + "pendleSwapV3Adapter": "0xDf69dDA7ba69ddEEB4182b821eb2356744180405", + "ERC4626VaultAdapter": "0x1084fCdDee1526a2331095207bf7e35e716c01bd" + }, +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-adapters.json b/deployments/eth-mainnet/eth-mainnet-adapters.json new file mode 100644 index 0000000..0451a01 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-adapters.json @@ -0,0 +1,18 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1750473743", + "gitBranch": "v1_special_adapter", + "gitCommitHash": "0x0x53496c4b59815c620e0ac5b4504e4b712ef08515", + "blockInfo": { + "number": "22749924", + "timestamp": "1750473743" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "swapAdapter": { + "uniswapV3Adapter": "0xEce68C88D0d1789Bd13a8519FBa51eb870FA0cC7", + "odosV2Adapter": "0xd402019Cd1ec046dD74a70922F24c2E3cBb05E24", + "pendleSwapV3Adapter": "0xFBBBB37Aaa95A8F1C4498c9066318C2B5680fB84", + "ERC4626VaultAdapter": "0xE62567e9a8969AAE406195f7C4C7e4e85d4ed879" + }, +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-cUSDO-20NOV2025@21NOV2025.json b/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-cUSDO-20NOV2025@21NOV2025.json new file mode 100644 index 0000000..09da7aa --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-USDC-PT-cUSDO-20NOV2025@21NOV2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22750245", + "timestamp": "1750477607" + }, + "market": "0xb8D33503a851D2d44E02F14Fb0321E900C7A89ac", + "collateral": { + "address": "0xB10DA2F9147f9cf2B8826877Cd0c95c18A0f42dc", + "symbol": "PT-cUSDO-20NOV2025", + "priceFeed": "0x1039F090392798Be2FeA222D6468676cB2F07699", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0x52D0713604f23383063ce89cf36801428B0136B8", + "xt": "0x5aa72d45B2b6381B87Eb407288920e3fC4C0E9c3", + "gt": "0x424a1e95eAaD4E768Dc925679C63ba230552965b" + }, + "config": { + "marketSymbol": "USDC/PT-cUSDO-20NOV2025@21NOV2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "21NOV2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "6000000" + } + } +} \ No newline at end of file diff --git a/script/deploy/deploydata/eth-mainnet.json b/script/deploy/deploydata/eth-mainnet.json index 5220d56..0adfd38 100644 --- a/script/deploy/deploydata/eth-mainnet.json +++ b/script/deploy/deploydata/eth-mainnet.json @@ -1,13 +1,13 @@ { - "configNum": "2", + "configNum": "1", "configs": { "configs_0": { "salt": 0, - "collateralCapForGt": "5000000000000", - "marketName": "USDC/xUSD@29AUG2025", - "marketSymbol": "USDC/xUSD@29AUG2025", + "collateralCapForGt": "5000000000000000000000000", + "marketName": "USDC/PT-cUSDO-20NOV2025@21NOV2025", + "marketSymbol": "USDC/PT-cUSDO-20NOV2025@21NOV2025", "marketConfig": { - "maturity": "1756425600", + "maturity": "1763683200", "lendTakerFeeRatio": "2000000", "lendMakerFeeRatio": "2000000", "borrowTakerFeeRatio": "3000000", @@ -16,8 +16,8 @@ "mintGtFeeRef": "6000000" }, "loanConfig": { - "liquidationLtv": "94000000", - "maxLtv": "90000000", + "liquidationLtv": "91500000", + "maxLtv": "87500000", "liquidatable": true }, "underlyingConfig": { @@ -28,58 +28,17 @@ "name": "USD Coin", "symbol": "USDC", "decimals": "6", - "initialPrice": "100131606" + "initialPrice": "100000000" }, "collateralConfig": { - "tokenAddr": "0xE2Fc85BfB48C4cF147921fBE110cf92Ef9f26F94", - "priceFeedAddr": "0x91F37A3058A7fD3f4f66ED87d715CF05bB4fbfBd", + "tokenAddr": "0xb10da2f9147f9cf2b8826877cd0c95c18a0f42dc", + "priceFeedAddr": "0x1039F090392798Be2FeA222D6468676cB2F07699", "backupPriceFeedAddr": "0x0000000000000000000000000000000000000000", "heartBeat": "86400", - "name": "Staked Stream USD", - "symbol": "xUSD", - "decimals": "6", - "initialPrice": "100000000", - "gtKeyIdentifier": "GearingTokenWithERC20" - } - }, - "configs_1": { - "salt": 0, - "collateralCapForGt": "5000000000000", - "marketName": "USDC/xUSD@26SEP2025", - "marketSymbol": "USDC/xUSD@26SEP2025", - "marketConfig": { - "maturity": "1758844800", - "lendTakerFeeRatio": "2000000", - "lendMakerFeeRatio": "2000000", - "borrowTakerFeeRatio": "3000000", - "borrowMakerFeeRatio": "3000000", - "mintGtFeeRatio": "10000000", - "mintGtFeeRef": "6000000" - }, - "loanConfig": { - "liquidationLtv": "94000000", - "maxLtv": "90000000", - "liquidatable": true - }, - "underlyingConfig": { - "tokenAddr": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", - "priceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", - "backupPriceFeedAddr": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", - "heartBeat": "86400", - "name": "USD Coin", - "symbol": "USDC", - "decimals": "6", - "initialPrice": "99982129" - }, - "collateralConfig": { - "tokenAddr": "0xE2Fc85BfB48C4cF147921fBE110cf92Ef9f26F94", - "priceFeedAddr": "0x91F37A3058A7fD3f4f66ED87d715CF05bB4fbfBd", - "backupPriceFeedAddr": "0x0000000000000000000000000000000000000000", - "heartBeat": "86400", - "name": "Staked Stream USD", - "symbol": "xUSD", - "decimals": "6", - "initialPrice": "100000000", + "name": "PT Compounding Open Dollar 20NOV2025", + "symbol": "PT-cUSDO-20NOV2025", + "decimals": "18", + "initialPrice": "260000000000", "gtKeyIdentifier": "GearingTokenWithERC20" } } From 1e847ba246f0e7231f92db6db4ef8d2831a704cc Mon Sep 17 00:00:00 2001 From: Vincent Date: Sat, 21 Jun 2025 18:44:15 +0800 Subject: [PATCH 105/194] simulate bnb mainnet adapters deployment --- deployments/bnb-mainnet/bnb-mainnet-adapters.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 deployments/bnb-mainnet/bnb-mainnet-adapters.json diff --git a/deployments/bnb-mainnet/bnb-mainnet-adapters.json b/deployments/bnb-mainnet/bnb-mainnet-adapters.json new file mode 100644 index 0000000..135c818 --- /dev/null +++ b/deployments/bnb-mainnet/bnb-mainnet-adapters.json @@ -0,0 +1,13 @@ +{ + "network": "bnb-mainnet", + "deployedAt": "1750502264", + "gitBranch": "v1_special_adapter", + "gitCommitHash": "0x0x91637cffdc2f0f59f783893bcdae860420b4fa98", + "blockInfo": { + "number": "51838638", + "timestamp": "1750502264" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "swapAdapter": " +} \ No newline at end of file From 60b3daa379e95213cf203c8512238c235a4fd873 Mon Sep 17 00:00:00 2001 From: "Aaron C.-W. Liang" Date: Sat, 21 Jun 2025 21:59:00 +0800 Subject: [PATCH 106/194] upadte --- script/deploy/DeployAdapters.s.sol | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/script/deploy/DeployAdapters.s.sol b/script/deploy/DeployAdapters.s.sol index 1838799..332102a 100644 --- a/script/deploy/DeployAdapters.s.sol +++ b/script/deploy/DeployAdapters.s.sol @@ -108,8 +108,6 @@ contract DeployAdapters is DeployBase { console.log("===== Git Info ====="); console.log("Git branch:", getGitBranch()); - console.log("Git commit hash:"); - console.logBytes(getGitCommitHash()); console.log(); console.log("===== Block Info ====="); @@ -134,7 +132,7 @@ contract DeployAdapters is DeployBase { ' "gitBranch": "', getGitBranch(), '",\n', - ' "gitCommitHash": "0x', + ' "gitCommitHash": "', vm.toString(getGitCommitHash()), '",\n', ' "blockInfo": {\n', @@ -154,6 +152,7 @@ contract DeployAdapters is DeployBase { ' "swapAdapter": ', keccak256(abi.encodePacked(network)) == keccak256(abi.encodePacked("eth-mainnet")) || keccak256(abi.encodePacked(network)) == keccak256(abi.encodePacked("arb-mainnet")) + || keccak256(abi.encodePacked(network)) == keccak256(abi.encodePacked("bnb-mainnet")) ? string.concat( "{\n", ' "uniswapV3Adapter": "', From 907b45e9fef447b887a6c3df565a21bf27975cf2 Mon Sep 17 00:00:00 2001 From: "Aaron C.-W. Liang" Date: Sat, 21 Jun 2025 22:30:21 +0800 Subject: [PATCH 107/194] update log --- script/deploy/DeployAdapters.s.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/deploy/DeployAdapters.s.sol b/script/deploy/DeployAdapters.s.sol index 332102a..f622e77 100644 --- a/script/deploy/DeployAdapters.s.sol +++ b/script/deploy/DeployAdapters.s.sol @@ -117,7 +117,7 @@ contract DeployAdapters is DeployBase { console.log("===== Core Info ====="); console.log("Use access manager:", accessManagerAddr); - console.log("Use router:", address(router)); + console.log("Use router:", routerAddr); // Write deployment results to a JSON file with timestamp string memory deploymentJson = string( From ab470cc3efed23b39083a8b2ee9dfd74c38b5b33 Mon Sep 17 00:00:00 2001 From: Vincent Date: Sat, 21 Jun 2025 23:40:56 +0800 Subject: [PATCH 108/194] Deploy BNB adapter --- .../DeployAdapters.s.sol/56/run-latest.json | 360 ++++++++++++++++++ .../bnb-mainnet/bnb-mainnet-adapters.json | 15 +- 2 files changed, 370 insertions(+), 5 deletions(-) create mode 100644 broadcast/DeployAdapters.s.sol/56/run-latest.json diff --git a/broadcast/DeployAdapters.s.sol/56/run-latest.json b/broadcast/DeployAdapters.s.sol/56/run-latest.json new file mode 100644 index 0000000..ead5137 --- /dev/null +++ b/broadcast/DeployAdapters.s.sol/56/run-latest.json @@ -0,0 +1,360 @@ +{ + "transactions": [ + { + "hash": "0xb32193b7701f1ac3b05a64bbba6a975bd5c8c127c560012ff8465a5225bd6394", + "transactionType": "CREATE", + "contractName": null, + "contractAddress": "0xa715005c1a8524c0790029153b8a860f96a2a856", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "gas": "0xbaa6f", + "value": "0x0", + "input": "0x60c034607a57601f610a3738819003918201601f19168301916001600160401b03831184841017607e57808492602094604052833981010312607a57516001600160a01b03811690819003607a573060805260a0526040516109a4908161009382396080518160fd015260a051818181606501526101610152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146106c15780636563c0e9146105f55780639df3032514610495578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b161072d565b6100b9610743565b5060443567ffffffffffffffff8111610094576100da903690600401610797565b60643567ffffffffffffffff8111610094576100fa903690600401610797565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630146104865781516001600160a01b039190911691602080820192820191909103126100945751604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316602482018190529193919290602081604481855afa80156103bd5785905f90610450575b6101b79250610857565b60405163095ea7b360e01b60208083019182526001600160a01b03871660248401526044808401949094529282529091905f906101f5606485610759565b83519082865af15f513d82610434575b5050156103f0575b505080518101916080826020850194031261009457602082015167ffffffffffffffff811161009457820183603f82011215610094576020810151906102528261077b565b946102606040519687610759565b8286526040828401011161009457815f926040602093018388015e85010152604082015191608060608201519101519061029b8187846108d0565b9080156103dc57866102b09309151590610857565b9260405160a081019080821067ffffffffffffffff8311176103c857602095610322935f936040528252868201903082526040830196875260608301988952608083019081526040519889978896879563c04b8d5960e01b87528b60048801525160a0602488015260c4870190610833565b93516001600160a01b031660448601525160648501525160848401525160a483015203925af180156103bd575f90610389575b6103859060405190602082015260208152610371604082610759565b604051918291602083526020830190610833565b0390f35b506020813d6020116103b5575b816103a360209383610759565b81010312610094576103859051610355565b3d9150610396565b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b61042d9161042860405163095ea7b360e01b60208201528660248201525f604482015260448152610422606482610759565b82610878565b610878565b838061020d565b9091506104485750813b15155b8680610205565b600114610441565b50506020813d60201161047e575b8161046b60209383610759565b8101031261009457846101b791516101ad565b3d915061045e565b6302f3451d60e21b5f5260045ffd5b34610094576104a3366107dd565b80516001600160a01b039093169260208083019291820191909103126100945751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa9081156103bd575f916105c1575b5061054a936105586105176020945f94610857565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f198101875286610759565b84519082855af15f513d826105a5575b50501561057157005b6104286105a3936040519063095ea7b360e01b602083015260248201525f604482015260448152610422606482610759565b005b9091506105b95750803b15155b8480610568565b6001146105b2565b90506020813d6020116105ed575b816105dc60209383610759565b81010312610094575161054a610502565b3d91506105cf565b346100945760803660031901126100945761060e61072d565b610616610743565b6044356001600160a01b03811692908390036100945760643567ffffffffffffffff81116100945761064c903690600401610797565b6020815191818082019384920101031261009457515f1981146106b2576105a393604051936323b872dd60e01b602086015260018060a01b0316602485015260448401526064830152606482526106a4608483610759565b6001600160a01b0316610878565b630d550c3b60e11b5f5260045ffd5b34610094576106cf366107dd565b602081939293519181808201938492010103126100945751905f1982146106b25760405163a9059cbb60e01b60208201526001600160a01b039390931660248401526044808401929092529082526105a391906106a4606483610759565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff8211176103c857604052565b67ffffffffffffffff81116103c857601f01601f191660200190565b81601f82011215610094578035906107ae8261077b565b926107bc6040519485610759565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff82116100945761083091600401610797565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9190820180921161086457565b634e487b7160e01b5f52601160045260245ffd5b905f602091828151910182855af1156103bd575f513d6108c757506001600160a01b0381163b155b6108a75750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156108a0565b91818302915f198185099383808610950394808603951461096057848311156109485790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b5050809250156103dc57049056fea2646970667358221220f6000c9f1bdef97179fd0d632833ccb7f8eb8b0c4e5d5beef7139a47675404a964736f6c634300081b0033000000000000000000000000b971ef87ede563556b2ed4b1c0b0019111dd85d2", + "nonce": "0x68", + "chainId": "0x38" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x40a0b6934d478af6b50604988e0b8ba77ade700fe2cd94c5c96d2c176d5b709a", + "transactionType": "CREATE", + "contractName": null, + "contractAddress": "0x954529f8f103bde464fc6d02a94cd40c5bd322d1", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "gas": "0xc9ca6", + "value": "0x0", + "input": "0x60c034607a57601f610b1438819003918201601f19168301916001600160401b03831184841017607e57808492602094604052833981010312607a57516001600160a01b03811690819003607a573060805260a052604051610a81908161009382396080518160fd015260a051818181606501526101610152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146107565780636563c0e91461068a5780639df303251461052a578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b16107c2565b6100b96107d8565b5060443567ffffffffffffffff8111610094576100da90369060040161082c565b60643567ffffffffffffffff8111610094576100fa90369060040161082c565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316301461051b5781516001600160a01b039190911691602080820192820191909103126100945751604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031660248201819052919290602081604481855afa80156104665784905f906104e5575b6101b59250610900565b60405163095ea7b360e01b60208083019182526001600160a01b03861660248401526044808401949094529282529091905f906101f36064856107ee565b83519082865af15f513d826104c9575b505015610485575b505082518301908360208301920361014081126100945760e013610094576040519160e0830183811067ffffffffffffffff82111761047157604052610253602086016108ec565b83526040850151906020840191825261026e606087016108ec565b9360408101948552610282608088016108ec565b966060820197885260a0810151926080830193845260c08201519760a084019889526102b060e084016108ec565b9160c0850192835261010084015167ffffffffffffffff811161009457840181603f82011215610094576020810151906102e982610810565b926102f760405194856107ee565b8284526040828401011161009457815f926040602093018386015e830101526101208401516001600160a01b03811694908590036100945761014001519263ffffffff84168094036100945760209a876103e09461035a5f9a51828d5191610921565b825261036a8351828d5191610921565b83528a52308352604051630ed8d73960e21b815297516001600160a01b0390811660048a0152995160248901529a51891660448801529b518816606487015298516084860152995160a4850152965190941660c483015261014060e48301529096879586948593929091906101448501906108c8565b9161010484015261012483015203925af18015610466575f90610432575b61042e906040519060208201526020815261041a6040826107ee565b6040519182916020835260208301906108c8565b0390f35b506020813d60201161045e575b8161044c602093836107ee565b810103126100945761042e90516103fe565b3d915061043f565b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b6104c2916104bd60405163095ea7b360e01b60208201528560248201525f6044820152604481526104b76064826107ee565b82610955565b610955565b838061020b565b9091506104dd5750813b15155b8680610203565b6001146104d6565b50506020813d602011610513575b81610500602093836107ee565b8101031261009457836101b591516101ab565b3d91506104f3565b6302f3451d60e21b5f5260045ffd5b346100945761053836610872565b80516001600160a01b039093169260208083019291820191909103126100945751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa908115610466575f91610656575b506105df936105ed6105ac6020945f94610900565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f1981018752866107ee565b84519082855af15f513d8261063a575b50501561060657005b6104bd610638936040519063095ea7b360e01b602083015260248201525f6044820152604481526104b76064826107ee565b005b90915061064e5750803b15155b84806105fd565b600114610647565b90506020813d602011610682575b81610671602093836107ee565b8101031261009457516105df610597565b3d9150610664565b34610094576080366003190112610094576106a36107c2565b6106ab6107d8565b6044356001600160a01b03811692908390036100945760643567ffffffffffffffff8111610094576106e190369060040161082c565b6020815191818082019384920101031261009457515f1981146107475761063893604051936323b872dd60e01b602086015260018060a01b0316602485015260448401526064830152606482526107396084836107ee565b6001600160a01b0316610955565b630d550c3b60e11b5f5260045ffd5b346100945761076436610872565b602081939293519181808201938492010103126100945751905f1982146107475760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261063891906107396064836107ee565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff82111761047157604052565b67ffffffffffffffff811161047157601f01601f191660200190565b81601f820112156100945780359061084382610810565b9261085160405194856107ee565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff8211610094576108c59160040161082c565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b51906001600160a01b038216820361009457565b9190820180921161090d57565b634e487b7160e01b5f52601160045260245ffd5b9161092d8183856109ad565b918115610941576108c59309151590610900565b634e487b7160e01b5f52601260045260245ffd5b905f602091828151910182855af115610466575f513d6109a457506001600160a01b0381163b155b6109845750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b6001141561097d565b91818302915f1981850993838086109503948086039514610a3d5784831115610a255790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b50508092501561094157049056fea26469706673582212201a43e03d554ef4508b4ce4929a5e2c8c851ee4de243e12f6b2b1267ec83a42f164736f6c634300081b003300000000000000000000000089b8aa89fdd0507a99d334cbe3c808fafc7d850e", + "nonce": "0x69", + "chainId": "0x38" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x5a2688b1f57dd655d926a6ca0a0b8a785e9620074522e880f0404daf7aed6670", + "transactionType": "CREATE", + "contractName": null, + "contractAddress": "0x883192efdd5a3417b2c0a14b25f7536b2018f853", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "gas": "0x1670a3", + "value": "0x0", + "input": "0x60c0604052346100f757604051601f61132138819003918201601f19168301916001600160401b038311848410176100e3578084926020946040528339810103126100f757516001600160a01b038116908190036100f7573060805260405160a081016001600160401b038111828210176100e357655af3107a4000916080916040525f81525f1960208201525f6040820152610100606082015201525f6008555f196009555f600a55610100600b55655af3107a4000600c5560a05260405161122590816100fc82396080518161025d015260a0518181816089015261031d0152f35b634e487b7160e01b5f52604160045260245ffd5b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816309316dd314610b30575080633268263b14610ac45780634ebfc81414610a855780636563c0e9146109b95780639df303251461084e578063e0a80413146101f8578063f66a7749146100bc5763f887ea4014610074575f80fd5b346100b8575f3660031901126100b8576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b346100b8575f3660031901126100b8575f54604051905f6001548060011c91600182169182156101ee575b6020841083146101da5783865285929081156101bb575060011461015c575b61011292500383610cd2565b60ff60025416610150604051938361012e8660ff819716610e04565b60081c6001600160a01b03166020850152608060408501819052840190610d08565b90151560608301520390f35b5060015f90815290917fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b81831061019f57505090602061011292820101610106565b6020919350806001915483858901015201910190918492610187565b6020925061011294915060ff191682840152151560051b820101610106565b634e487b7160e01b5f52602260045260245ffd5b92607f16926100e7565b346100b85760803660031901126100b857610211610d2c565b610219610d42565b60443567ffffffffffffffff81116100b857610239903690600401610d58565b9160643567ffffffffffffffff81116100b85761025a903690600401610d58565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316301461083f5783516001600160a01b0393841694919093169260208083019291820191909103126100b85751916060828051810103126100b85760208201516001600160a01b03811691908290036100b857606060408401519301519460405195630b2339af60e21b8752606087600481875afa968715610508575f976107d2575b50604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316602482018190529590602081604481885afa80156105085788905f9061079c575b6103709250611041565b60405163095ea7b360e01b60208083019182526001600160a01b038a1660248401526044808401949094529282529091905f906103ae606485610cd2565b83519082895af15f513d82610780575b50501561073c575b506103d2818884611151565b90801561072857876103e79309151590611041565b956001600160a01b0316818103610513575050935f606094939261047e9661040d611062565b95818752602087015260408601526104906040519788968795869463640fc23d60e11b86523060048701526024860152604485015260085460648501526009546084850152600a5460a4850152600b5460c4850152600c5460e4850152610140610104850152610144840190610e40565b82810360031901610124840152610ff1565b03925af18015610508576104d3915f916104d7575b505b604051906020820152602081526104bf604082610cd2565b604051918291602083526020830190610d08565b0390f35b6104f9915060603d606011610501575b6104f18183610cd2565b810190610e25565b5050826104a5565b503d6104e7565b6040513d5f823e3d90fd5b9150949391604051630bc4ed8360e21b8152602081600481865afa908115610508575f916106ed575b50156106535750936020600494956040519586809263781c18db60e01b82525afa938415610508575f9461060b575b50905f61057f6105bc9660409695946110d2565b938551968795869485936323f8ef1160e11b855230600486015260018060a01b031660248501526044840152608060648401526084830190610e40565b03925af18015610508575f906105d7575b6104d391506104a7565b506040813d604011610603575b816105f160409383610cd2565b810103126100b8576104d390516105cd565b3d91506105e4565b90929193506020813d60201161064b575b8161062960209383610cd2565b810103126100b85751926001600160a01b03841684036100b85790915f61056b565b3d915061061c565b929190505f6106676060956106a0976110d2565b936106b160405197889687958694631652a23360e21b86523060048701526024860152604485015260a0606485015260a4840190610e40565b828103600319016084840152610ff1565b03925af18015610508576104d3915f916106cc575b506104a7565b6106e5915060603d606011610501576104f18183610cd2565b5050826106c6565b90506020813d602011610720575b8161070860209383610cd2565b810103126100b8575180151581036100b8578761053c565b3d91506106fb565b634e487b7160e01b5f52601260045260245ffd5b61077a9061077460405163095ea7b360e01b60208201528960248201525f60448201526044815261076e606482610cd2565b876110f9565b856110f9565b886103c6565b9091506107945750843b15155b8a806103be565b60011461078d565b50506020813d6020116107ca575b816107b760209383610cd2565b810103126100b857876103709151610366565b3d91506107aa565b9096506060813d606011610837575b816107ee60609383610cd2565b810103126100b85780516001600160a01b038116036100b8576020810151906001600160a01b03821682036100b857604001516001600160a01b038116036100b8579587610307565b3d91506107e1565b6302f3451d60e21b5f5260045ffd5b346100b85761085c36610dae565b80516001600160a01b039093169260208083019291820191909103126100b85751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa908115610508575f91610985575b50610903936109116108d06020945f94611041565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f198101875286610cd2565b84519082855af15f513d82610969575b50501561092a57005b610962610967936040519063095ea7b360e01b602083015260248201525f60448201526044815261095c606482610cd2565b826110f9565b6110f9565b005b90915061097d5750803b15155b8480610921565b600114610976565b90506020813d6020116109b1575b816109a060209383610cd2565b810103126100b857516109036108bb565b3d9150610993565b346100b85760803660031901126100b8576109d2610d2c565b6109da610d42565b6044356001600160a01b03811692908390036100b85760643567ffffffffffffffff81116100b857610a10903690600401610d58565b602081519181808201938492010103126100b857515f198114610a765761096793604051936323b872dd60e01b602086015260018060a01b031660248501526044840152606483015260648252610a68608483610cd2565b6001600160a01b03166110f9565b630d550c3b60e11b5f5260045ffd5b346100b8575f3660031901126100b85760a0600854600954600a54600b5490600c54926040519485526020850152604084015260608301526080820152f35b346100b857610ad236610dae565b602081939293519181808201938492010103126100b85751905f198214610a765760405163a9059cbb60e01b60208201526001600160a01b039390931660248401526044808401929092529082526109679190610a68606483610cd2565b346100b8575f3660031901126100b85760018060a01b0360035416600454915f6007548060011c90600181168015610c31575b6020831081146101da57828552908115610c0d5750600114610baf575b5090610b91816104d3930382610cd2565b60405193849384526020840152606060408401526060830190610d08565b60075f9081527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688939250905b808210610bf357509091508101602001610b91610b80565b919260018160209254838588010152019101909291610bdb565b60ff191660208086019190915291151560051b84019091019150610b919050610b80565b91607f1691610b63565b5f92918154918260011c92600181168015610cc8575b6020851081146101da57848452908115610cab5750600114610c7257505050565b5f9081526020812093945091925b838310610c91575060209250010190565b600181602092949394548385870101520191019190610c80565b915050602093945060ff929192191683830152151560051b010190565b93607f1693610c51565b90601f8019910116810190811067ffffffffffffffff821117610cf457604052565b634e487b7160e01b5f52604160045260245ffd5b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036100b857565b602435906001600160a01b03821682036100b857565b81601f820112156100b85780359067ffffffffffffffff8211610cf45760405192610d8d601f8401601f191660200185610cd2565b828452602083830101116100b857815f926020809301838601378301015290565b60606003198201126100b8576004356001600160a01b03811681036100b857916024356001600160a01b03811681036100b857916044359067ffffffffffffffff82116100b857610e0191600401610d58565b90565b90600b821015610e115752565b634e487b7160e01b5f52602160045260245ffd5b908160609103126100b8578051916040602083015192015190565b60809060018060a01b0381511683526020810151602084015260018060a01b03604082015116604084015260018060a01b03606082015116606084015201519060a06080820152610e9560a082018351610e04565b60208201516001600160a01b031660c08201526040820151608060e083015261010090606090610eca90610120850190610d08565b930151151591015290565b908060208354918281520160208260051b840101935f5260205f20925f905b838210610f0357505050505090565b9091929394601f19828203018452606081528554606082015260018601546080820152600286015460a0820152600386015460ff81166004811015610e115760c08301526001600160a01b03600891821c811660e0840152600488015481166101008401526005880154811661012084015260068801541661014083015260078701546101608301528601546101808083019190915260098701546101a08301526101c0820152600190602090600d90610fd7610fc76101e08301600a8c01610c3b565b82810385840152600b8b01610c3b565b906040600c8b015491015297019401920190939293610ef4565b610e019060018060a01b03600354168152600454602082015260a0604082015261103161102260a083016005610ed5565b82810360608401526006610ed5565b9060808183039101526007610c3b565b9190820180921161104e57565b634e487b7160e01b5f52601160045260245ffd5b6040519060a0820182811067ffffffffffffffff821117610cf457604052815f81525f60208201525f60408201525f606082015260405190608082019082821067ffffffffffffffff831117610cf4576080916040525f83525f6020840152606060408401525f60608401520152565b91906110dc611062565b6001600160a01b0390931680845260208401919091526040830152565b905f602091828151910182855af115610508575f513d61114857506001600160a01b0381163b155b6111285750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b60011415611121565b91818302915f19818509938380861095039480860395146111e157848311156111c95790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b50508092501561072857049056fea2646970667358221220d7c8c2f17efce607284d62466051aec3e13f6f1e6deb7e056420af021f77a8ae64736f6c634300081b0033000000000000000000000000888888888889758f76e7103c6cbf23abbf58f946", + "nonce": "0x6a", + "chainId": "0x38" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x709bea00a7c8fa356f7319c373ae8d41091418bda63325bb1c3eed74a3a52f63", + "transactionType": "CREATE", + "contractName": null, + "contractAddress": "0x37ba9934aaba7a49cc29d0952c6a91d7c7043dbc", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "gas": "0xaf02f", + "value": "0x0", + "input": "0x60a0806040523460215730608052610900908161002682396080518160aa0152f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146106395780636563c0e91461056d5780639df303251461040d5763e0a8041314610045575f80fd5b346102a35760803660031901126102a35761005e6106a5565b6100666106bb565b9060443567ffffffffffffffff81116102a357610087903690600401610707565b60643567ffffffffffffffff81116102a3576100a7903690600401610707565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630146103fe5781516001600160a01b039182169490911691602080820192820191909103126102a35751926060838051810103126102a35760208301519260028410156102a357606060408201519101519061012f81878461082c565b9080156103ea578661014493091515906107b3565b92806103525750604051636eb1769f60e11b815230600482015260248101839052602081604481855afa9081156102af575f9161031a575b50846020939261018f5f976044946107b3565b60405163095ea7b360e01b8782019081526001600160a01b038716602483015260448083019390935291815290869089906101cb6064856106d1565b83519082865af188513d826102fb575b5050156102ba575b50506040519586938492636e553f6560e01b845260048401523060248401525af19182156102af575f92610277575b50818181106102625750505b60408051602081019283526020815261023782826106d1565b8151928391602083525180918160208501528484015e5f828201840152601f01601f19168101030190f35b63eb7f211d60e01b5f5260045260245260445ffd5b9091506020813d6020116102a7575b81610293602093836106d1565b810103126102a35751905f610212565b5f80fd5b3d9150610286565b6040513d5f823e3d90fd5b6102f4916102ef60405163095ea7b360e01b898201528760248201528a878201528681526102e96064826106d1565b826107d4565b6107d4565b5f806101e3565b9091501589146103125750813b15155b5f806101db565b60011461030b565b90506020929192813d60201161034a575b81610338602093836106d1565b810103126102a357519091908461017c565b3d915061032b565b909391506001036103db575f9260646020926040519586938492635d043b2960e11b845260048401523060248401523060448401525af19182156102af575f926103a7575b508181811061026257505061021e565b9091506020813d6020116103d3575b816103c3602093836106d1565b810103126102a35751905f610397565b3d91506103b6565b634a7f394f60e01b5f5260045ffd5b634e487b7160e01b5f52601260045260245ffd5b6302f3451d60e21b5f5260045ffd5b346102a35761041b3661075d565b80516001600160a01b039093169260208083019291820191909103126102a35751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa9081156102af575f91610539575b506104c2936104d061048f6020945f946107b3565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f1981018752866106d1565b84519082855af15f513d8261051d575b5050156104e957005b6102ef61051b936040519063095ea7b360e01b602083015260248201525f6044820152604481526102e96064826106d1565b005b9091506105315750803b15155b84806104e0565b60011461052a565b90506020813d602011610565575b81610554602093836106d1565b810103126102a357516104c261047a565b3d9150610547565b346102a35760803660031901126102a3576105866106a5565b61058e6106bb565b6044356001600160a01b03811692908390036102a35760643567ffffffffffffffff81116102a3576105c4903690600401610707565b602081519181808201938492010103126102a357515f19811461062a5761051b93604051936323b872dd60e01b602086015260018060a01b03166024850152604484015260648301526064825261061c6084836106d1565b6001600160a01b03166107d4565b630d550c3b60e11b5f5260045ffd5b346102a3576106473661075d565b602081939293519181808201938492010103126102a35751905f19821461062a5760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261051b919061061c6064836106d1565b600435906001600160a01b03821682036102a357565b602435906001600160a01b03821682036102a357565b90601f8019910116810190811067ffffffffffffffff8211176106f357604052565b634e487b7160e01b5f52604160045260245ffd5b81601f820112156102a35780359067ffffffffffffffff82116106f3576040519261073c601f8401601f1916602001856106d1565b828452602083830101116102a357815f926020809301838601378301015290565b60606003198201126102a3576004356001600160a01b03811681036102a357916024356001600160a01b03811681036102a357916044359067ffffffffffffffff82116102a3576107b091600401610707565b90565b919082018092116107c057565b634e487b7160e01b5f52601160045260245ffd5b905f602091828151910182855af1156102af575f513d61082357506001600160a01b0381163b155b6108035750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156107fc565b91818302915f19818509938380861095039480860395146108bc57848311156108a45790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b5050809250156103ea57049056fea2646970667358221220b9f441923fe75e1f6e0f37bda35dde1cbac73c1e69240288bd35172a90f8e35164736f6c634300081b0033", + "nonce": "0x6b", + "chainId": "0x38" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x724d2e4ac0e7a0bb1ded7e087a57ce13bcb1a738f07297bbd90bdc246ee0c507", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x9498764f0c62257b83a04e2a757de30908ec793d", + "function": "setAdapterWhitelist(address,address,bool)", + "arguments": [ + "0xb7634dB4f4710bb992118bC37d1F63e00e2704A4", + "0xa715005c1A8524C0790029153B8a860F96a2a856", + "true" + ], + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0x9498764f0c62257b83a04e2a757de30908ec793d", + "gas": "0x16bd9", + "value": "0x0", + "input": "0xb6b07b8e000000000000000000000000b7634db4f4710bb992118bc37d1f63e00e2704a4000000000000000000000000a715005c1a8524c0790029153b8a860f96a2a8560000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x6c", + "chainId": "0x38" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x47a97180396aa6437c248d3d22f9f98ae5d6be5a7ed978df6067fdc572ec69ee", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x9498764f0c62257b83a04e2a757de30908ec793d", + "function": "setAdapterWhitelist(address,address,bool)", + "arguments": [ + "0xb7634dB4f4710bb992118bC37d1F63e00e2704A4", + "0x954529F8f103bde464fc6d02a94CD40c5BD322D1", + "true" + ], + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0x9498764f0c62257b83a04e2a757de30908ec793d", + "gas": "0x16bfc", + "value": "0x0", + "input": "0xb6b07b8e000000000000000000000000b7634db4f4710bb992118bc37d1f63e00e2704a4000000000000000000000000954529f8f103bde464fc6d02a94cd40c5bd322d10000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x6d", + "chainId": "0x38" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xfe8da01c9f5bbf05f6977ae46e9abf20fec80443b55230617a466681ad49c165", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x9498764f0c62257b83a04e2a757de30908ec793d", + "function": "setAdapterWhitelist(address,address,bool)", + "arguments": [ + "0xb7634dB4f4710bb992118bC37d1F63e00e2704A4", + "0x883192eFdD5a3417B2C0A14B25F7536B2018f853", + "true" + ], + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0x9498764f0c62257b83a04e2a757de30908ec793d", + "gas": "0x16bfc", + "value": "0x0", + "input": "0xb6b07b8e000000000000000000000000b7634db4f4710bb992118bc37d1f63e00e2704a4000000000000000000000000883192efdd5a3417b2c0a14b25f7536b2018f8530000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x6e", + "chainId": "0x38" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x85e1ff3ae45a12bf2c85ec58786f498fbee7e9336f0bc59866804f9a2c20f57c", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x9498764f0c62257b83a04e2a757de30908ec793d", + "function": "setAdapterWhitelist(address,address,bool)", + "arguments": [ + "0xb7634dB4f4710bb992118bC37d1F63e00e2704A4", + "0x37Ba9934aAbA7a49cC29d0952C6a91d7c7043dbc", + "true" + ], + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0x9498764f0c62257b83a04e2a757de30908ec793d", + "gas": "0x16bfc", + "value": "0x0", + "input": "0xb6b07b8e000000000000000000000000b7634db4f4710bb992118bc37d1f63e00e2704a400000000000000000000000037ba9934aaba7a49cc29d0952c6a91d7c7043dbc0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x6f", + "chainId": "0x38" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x1dcc851", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0xb32193b7701f1ac3b05a64bbba6a975bd5c8c127c560012ff8465a5225bd6394", + "transactionIndex": "0xaa", + "blockHash": "0xebb1abc4b4c26953dc48c046130ff80aa6ebd5fd6e165e515e9a9d96ffb99d4b", + "blockNumber": "0x3172a9f", + "gasUsed": "0x8f942", + "effectiveGasPrice": "0x5f5e100", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": null, + "contractAddress": "0xa715005c1a8524c0790029153b8a860f96a2a856" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x2bed985", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x40a0b6934d478af6b50604988e0b8ba77ade700fe2cd94c5c96d2c176d5b709a", + "transactionIndex": "0xca", + "blockHash": "0x948f7b1fe8745b3436a405ebfd8c87fa22951a3943dd20a8274ef4645461f60b", + "blockNumber": "0x3172aa5", + "gasUsed": "0x9b394", + "effectiveGasPrice": "0x5f5e100", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": null, + "contractAddress": "0x954529f8f103bde464fc6d02a94cd40c5bd322d1" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x23598f4", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x5a2688b1f57dd655d926a6ca0a0b8a785e9620074522e880f0404daf7aed6670", + "transactionIndex": "0xe7", + "blockHash": "0x10ddd55d604533607682c18f04e653254dd10e6eb35ef891f2dfe155a40a0fa3", + "blockNumber": "0x3172aab", + "gasUsed": "0x1142f4", + "effectiveGasPrice": "0x5f5e100", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": null, + "contractAddress": "0x883192efdd5a3417b2c0a14b25f7536b2018f853" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1c32760", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x709bea00a7c8fa356f7319c373ae8d41091418bda63325bb1c3eed74a3a52f63", + "transactionIndex": "0xbd", + "blockHash": "0x99620fdfcb6ce61efe98e50614933d0793c1d2828f3b6343cf6def450c92e48f", + "blockNumber": "0x3172ab1", + "gasUsed": "0x869fd", + "effectiveGasPrice": "0x5f5e100", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": null, + "contractAddress": "0x37ba9934aaba7a49cc29d0952c6a91d7c7043dbc" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xd23815", + "logs": [ + { + "address": "0xb7634db4f4710bb992118bc37d1f63e00e2704a4", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x000000000000000000000000a715005c1a8524c0790029153b8a860f96a2a8560000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x90dce315acbe5ac18306df007f6a2c449655dfb4a4fcdbda37efc947b9e79493", + "blockNumber": "0x3172ab7", + "transactionHash": "0x724d2e4ac0e7a0bb1ded7e087a57ce13bcb1a738f07297bbd90bdc246ee0c507", + "transactionIndex": "0x55", + "logIndex": "0x20e", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000008000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000020000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x724d2e4ac0e7a0bb1ded7e087a57ce13bcb1a738f07297bbd90bdc246ee0c507", + "transactionIndex": "0x55", + "blockHash": "0x90dce315acbe5ac18306df007f6a2c449655dfb4a4fcdbda37efc947b9e79493", + "blockNumber": "0x3172ab7", + "gasUsed": "0xf8c9", + "effectiveGasPrice": "0x5f5e100", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0x9498764f0c62257b83a04e2a757de30908ec793d", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1c08189", + "logs": [ + { + "address": "0xb7634db4f4710bb992118bc37d1f63e00e2704a4", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x000000000000000000000000954529f8f103bde464fc6d02a94cd40c5bd322d10000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x2159815fbbdf47cbd5977899ab4310575f978b1e1f07f68a064e8974884f253b", + "blockNumber": "0x3172abd", + "transactionHash": "0x47a97180396aa6437c248d3d22f9f98ae5d6be5a7ed978df6067fdc572ec69ee", + "transactionIndex": "0xbb", + "logIndex": "0x442", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000008000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000020000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x47a97180396aa6437c248d3d22f9f98ae5d6be5a7ed978df6067fdc572ec69ee", + "transactionIndex": "0xbb", + "blockHash": "0x2159815fbbdf47cbd5977899ab4310575f978b1e1f07f68a064e8974884f253b", + "blockNumber": "0x3172abd", + "gasUsed": "0xf8e1", + "effectiveGasPrice": "0x5f5e100", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0x9498764f0c62257b83a04e2a757de30908ec793d", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1afbd5d", + "logs": [ + { + "address": "0xb7634db4f4710bb992118bc37d1f63e00e2704a4", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x000000000000000000000000883192efdd5a3417b2c0a14b25f7536b2018f8530000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x45e5b88ceb76c660bcac0af5a7a69390b2f6c5d93cadd2884dd13cc6f6b763a2", + "blockNumber": "0x3172ac3", + "transactionHash": "0xfe8da01c9f5bbf05f6977ae46e9abf20fec80443b55230617a466681ad49c165", + "transactionIndex": "0xb9", + "logIndex": "0x414", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000008000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000020000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0xfe8da01c9f5bbf05f6977ae46e9abf20fec80443b55230617a466681ad49c165", + "transactionIndex": "0xb9", + "blockHash": "0x45e5b88ceb76c660bcac0af5a7a69390b2f6c5d93cadd2884dd13cc6f6b763a2", + "blockNumber": "0x3172ac3", + "gasUsed": "0xf8e1", + "effectiveGasPrice": "0x5f5e100", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0x9498764f0c62257b83a04e2a757de30908ec793d", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x18b7719", + "logs": [ + { + "address": "0xb7634db4f4710bb992118bc37d1f63e00e2704a4", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x00000000000000000000000037ba9934aaba7a49cc29d0952c6a91d7c7043dbc0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x5b47b3a43939983f321b1d50a9796ce32920e93f8a94ebb41f55bc612f3a4712", + "blockNumber": "0x3172ac9", + "transactionHash": "0x85e1ff3ae45a12bf2c85ec58786f498fbee7e9336f0bc59866804f9a2c20f57c", + "transactionIndex": "0xa7", + "logIndex": "0x3cc", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000008000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000020000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x85e1ff3ae45a12bf2c85ec58786f498fbee7e9336f0bc59866804f9a2c20f57c", + "transactionIndex": "0xa7", + "blockHash": "0x5b47b3a43939983f321b1d50a9796ce32920e93f8a94ebb41f55bc612f3a4712", + "blockNumber": "0x3172ac9", + "gasUsed": "0xf8e1", + "effectiveGasPrice": "0x5f5e100", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0x9498764f0c62257b83a04e2a757de30908ec793d", + "contractAddress": null + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1750519209, + "chain": 56, + "commit": "907b45e" +} \ No newline at end of file diff --git a/deployments/bnb-mainnet/bnb-mainnet-adapters.json b/deployments/bnb-mainnet/bnb-mainnet-adapters.json index 135c818..e10efff 100644 --- a/deployments/bnb-mainnet/bnb-mainnet-adapters.json +++ b/deployments/bnb-mainnet/bnb-mainnet-adapters.json @@ -1,13 +1,18 @@ { "network": "bnb-mainnet", - "deployedAt": "1750502264", + "deployedAt": "1750519115", "gitBranch": "v1_special_adapter", - "gitCommitHash": "0x0x91637cffdc2f0f59f783893bcdae860420b4fa98", + "gitCommitHash": "0x907b45e9fef447b887a6c3df565a21bf27975cf2", "blockInfo": { - "number": "51838638", - "timestamp": "1750502264" + "number": "51849871", + "timestamp": "1750519115" }, "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", - "swapAdapter": " + "swapAdapter": { + "uniswapV3Adapter": "0xa715005c1A8524C0790029153B8a860F96a2a856", + "odosV2Adapter": "0x954529F8f103bde464fc6d02a94CD40c5BD322D1", + "pendleSwapV3Adapter": "0x883192eFdD5a3417B2C0A14B25F7536B2018f853", + "ERC4626VaultAdapter": "0x37Ba9934aAbA7a49cC29d0952C6a91d7c7043dbc" + }, } \ No newline at end of file From a17ee9eff18914e438228728ba8d44bb6bebe29c Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 23 Jun 2025 13:57:45 +0800 Subject: [PATCH 109/194] fork test for bnb pairs --- test/testdata/fork/bsc.json | 927 ++++++++++++++++++++++ test/v1/mainnet-fork/GtBaseTest.t.sol | 33 + test/v1/mainnet-fork/mainnet/ForkGt.t.sol | 73 +- 3 files changed, 962 insertions(+), 71 deletions(-) create mode 100644 test/testdata/fork/bsc.json diff --git a/test/testdata/fork/bsc.json b/test/testdata/fork/bsc.json new file mode 100644 index 0000000..653eff5 --- /dev/null +++ b/test/testdata/fork/bsc.json @@ -0,0 +1,927 @@ + +{ + "routers": { + "pendleRouter": "0x888888888889758F76e7103c6CbF23ABbF58F946", + "uniswapRouter": "0xE592427A0AEce92De3Edee1F18E0157C05861564", + "odosRouter": "0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559" + }, + "tokenPairs": [ + "WBNB-USDT" + ], + "ynBNBx-WBNB": { + "blockNumber": "51933960", + "orderInitialAmount": "20000000000000000000000", + "duration": "30", + "collateral": "0x32C830f5c34122C6afB8aE87ABA541B7900a2C5F", + "debtToken": "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c", + "loanConfig": { + "maxLtv": "89000000", + "liquidationLtv": "90000000", + "liquidatable": true + }, + "feeConfig": { + "redeemFeeRatio": "0", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000", + "lendTakerFeeRatio": "1000000", + "borrowTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "1000000", + "borrowMakerFeeRatio": "2000000" + }, + "orderConfig": { + "maxXtReserve": "2000000000000000000000000000000000000000000000000000000000000000000", + "gtId": "0", + "lendCurveCuts": { + "0": { + "xtReserve": "0", + "liqSquare": "17148936676412860051488768", + "offset": "6547697434292" + }, + "1": { + "xtReserve": "8200000000", + "liqSquare": "3601276702046700610", + "offset": "-5161974583" + }, + "2": { + "xtReserve": "9000000000", + "liqSquare": "51800738781260893117687869", + "offset": "14547185370727" + }, + "3": { + "xtReserve": "38200000000", + "liqSquare": "1554022163437826793", + "offset": "-35426169851" + }, + "4": { + "xtReserve": "39000000000", + "liqSquare": "433646276003678296168", + "offset": "20699832775" + }, + "5": { + "xtReserve": "39200000000", + "liqSquare": "1588671805064995511", + "offset": "-35574439899" + }, + "length": 6 + }, + "borrowCurveCuts": { + "0": { + "xtReserve": "0", + "liqSquare": "12253114043286217560162304", + "offset": "5605197689344" + }, + "1": { + "xtReserve": "7200000000", + "liqSquare": "3308340791687278741", + "offset": "-4270879534" + }, + "2": { + "xtReserve": "8000000000", + "liqSquare": "6832763607918441056808585", + "offset": "5351194154482" + }, + "3": { + "xtReserve": "19200000000", + "liqSquare": "1571535629821241443", + "offset": "-16590539411" + }, + "4": { + "xtReserve": "20000000000", + "liqSquare": "3473307729328620213070793", + "offset": "5048683691704" + }, + "5": { + "xtReserve": "38200000000", + "liqSquare": "1424056169024734287", + "offset": "-34904520632" + }, + "length": 6 + } + }, + "swapData": { + "debtAmt": "1000000000000000000", + "swapAmtIn": "1000000000000000000", + "tokenType": "0", + "length": "1", + "leverageUnits": { + "0": { + "adapter": "0x954529f8f103bde464fc6d02a94cd40c5bd322d1", + "tokenIn": "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c", + "tokenOut": "0x32c830f5c34122c6afb8ae87aba541b7900a2c5f", + "swapData": "0x000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c0000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c3f3a07ae7d2a125ef81a5950c4d0dd54c74025100000000000000000000000032c830f5c34122c6afb8ae87aba541b7900a2c5f0000000000000000000000000000000000000000000000000d84774e6074ee000000000000000000000000000000000000000000000000000d7329e8dd6a1b00000000000000000000000000b7634db4f4710bb992118bc37d1f63e00e2704a40000000000000000000000000000000000000000000000000000000000000140000000000000000000000000c3f3a07ae7d2a125ef81a5950c4d0dd54c74025100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000048010203000e0101010200ff000000000000000000000000000000000000000000cdedb4bad9978e1d0a82ad2061d0345f48014bc4bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c000000000000000000000000000000000000000000000000" + } + }, + "flashRepayUnits": { + "0": { + "adapter": "0x954529f8f103bde464fc6d02a94cd40c5bd322d1", + "tokenIn": "0x32c830f5c34122c6afb8ae87aba541b7900a2c5f", + "tokenOut": "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c", + "swapData": "0x00000000000000000000000032c830f5c34122c6afb8ae87aba541b7900a2c5f0000000000000000000000000000000000000000000000000d84774e6074ee00000000000000000000000000c3f3a07ae7d2a125ef81a5950c4d0dd54c740251000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c0000000000000000000000000000000000000000000000000dcccbcb4d1985800000000000000000000000000000000000000000000000000dbb21d0af463200000000000000000000000000b7634db4f4710bb992118bc37d1f63e00e2704a40000000000000000000000000000000000000000000000000000000000000140000000000000000000000000c3f3a07ae7d2a125ef81a5950c4d0dd54c74025100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000048010203000e0101010201ff000000000000000000000000000000000000000000410cef6a0514af4c4eeda54ba243493f9f5efc5632c830f5c34122c6afb8ae87aba541b7900a2c5f000000000000000000000000000000000000000000000000" + } + } + } + }, + "WBNB-USDT": { + "blockNumber": "51933960", + "orderInitialAmount": "20000000000000000000000", + "duration": "30", + "collateral": "0xBB4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c", + "debtToken": "0x55d398326f99059fF775485246999027B3197955", + "loanConfig": { + "maxLtv": "89000000", + "liquidationLtv": "90000000", + "liquidatable": true + }, + "feeConfig": { + "redeemFeeRatio": "0", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000", + "lendTakerFeeRatio": "1000000", + "borrowTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "1000000", + "borrowMakerFeeRatio": "2000000" + }, + "orderConfig": { + "maxXtReserve": "2000000000000000000000000000000000000000000000000000000000000000000", + "gtId": "0", + "lendCurveCuts": { + "0": { + "xtReserve": "0", + "liqSquare": "17148936676412860051488768", + "offset": "6547697434292" + }, + "1": { + "xtReserve": "8200000000", + "liqSquare": "3601276702046700610", + "offset": "-5161974583" + }, + "2": { + "xtReserve": "9000000000", + "liqSquare": "51800738781260893117687869", + "offset": "14547185370727" + }, + "3": { + "xtReserve": "38200000000", + "liqSquare": "1554022163437826793", + "offset": "-35426169851" + }, + "4": { + "xtReserve": "39000000000", + "liqSquare": "433646276003678296168", + "offset": "20699832775" + }, + "5": { + "xtReserve": "39200000000", + "liqSquare": "1588671805064995511", + "offset": "-35574439899" + }, + "length": 6 + }, + "borrowCurveCuts": { + "0": { + "xtReserve": "0", + "liqSquare": "12253114043286217560162304", + "offset": "5605197689344" + }, + "1": { + "xtReserve": "7200000000", + "liqSquare": "3308340791687278741", + "offset": "-4270879534" + }, + "2": { + "xtReserve": "8000000000", + "liqSquare": "6832763607918441056808585", + "offset": "5351194154482" + }, + "3": { + "xtReserve": "19200000000", + "liqSquare": "1571535629821241443", + "offset": "-16590539411" + }, + "4": { + "xtReserve": "20000000000", + "liqSquare": "3473307729328620213070793", + "offset": "5048683691704" + }, + "5": { + "xtReserve": "38200000000", + "liqSquare": "1424056169024734287", + "offset": "-34904520632" + }, + "length": 6 + } + }, + "swapData": { + "debtAmt": "10000000000000000", + "swapAmtIn": "30000000000000000000", + "tokenType": "0", + "length": "1", + "leverageUnits": { + "0": { + "adapter": "0x954529f8f103bde464fc6d02a94cd40c5bd322d1", + "tokenIn": "0x55d398326f99059ff775485246999027b3197955", + "tokenOut": "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c", + "swapData": "0x00000000000000000000000055d398326f99059ff775485246999027b319795500000000000000000000000000000000000000000000002086ac351052600000000000000000000000000000c3f3a07ae7d2a125ef81a5950c4d0dd54c740251000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c0000000000000000000000000000000000000000000000000d6cdbfed38b66000000000000000000000000000000000000000000000000000d5bacd0c0911a00000000000000000000000000b7634db4f4710bb992118bc37d1f63e00e2704a40000000000000000000000000000000000000000000000000000000000000140000000000000000000000000c3f3a07ae7d2a125ef81a5950c4d0dd54c74025100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000048010203000e0101010201ff000000000000000000000000000000000000000000172fcd41e0913e95784454622d1c3724f546f84955d398326f99059ff775485246999027b3197955000000000000000000000000000000000000000000000000" + } + }, + "flashRepayUnits": { + "0": { + "adapter": "0x954529f8f103bde464fc6d02a94cd40c5bd322d1", + "tokenIn": "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c", + "tokenOut": "0x55d398326f99059ff775485246999027b3197955", + "swapData": "0x000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c0000000000000000000000000000000000000000000000000d6cdbfed38b6600000000000000000000000000c3f3a07ae7d2a125ef81a5950c4d0dd54c74025100000000000000000000000055d398326f99059ff775485246999027b3197955000000000000000000000000000000000000000000000020801f82d5879000000000000000000000000000000000000000000000000000205685c0e661c40000000000000000000000000000b7634db4f4710bb992118bc37d1f63e00e2704a40000000000000000000000000000000000000000000000000000000000000140000000000000000000000000c3f3a07ae7d2a125ef81a5950c4d0dd54c74025100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000048010203000e0101010200ff00000000000000000000000000000000000000000047a90a2d92a8367a91efa1906bfc8c1e05bf10c4bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c000000000000000000000000000000000000000000000000" + } + } + } + }, + "sUSDe-USDT": { + "blockNumber": "51933960", + "orderInitialAmount": "20000000000000000000000", + "duration": "30", + "collateral": "0x211Cc4DD073734dA055fbF44a2b4667d5E5fE5d2", + "debtToken": "0x55d398326f99059fF775485246999027B3197955", + "loanConfig": { + "maxLtv": "89000000", + "liquidationLtv": "90000000", + "liquidatable": true + }, + "feeConfig": { + "redeemFeeRatio": "0", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000", + "lendTakerFeeRatio": "1000000", + "borrowTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "1000000", + "borrowMakerFeeRatio": "2000000" + }, + "orderConfig": { + "maxXtReserve": "2000000000000000000000000000000000000000000000000000000000000000000", + "gtId": "0", + "lendCurveCuts": { + "0": { + "xtReserve": "0", + "liqSquare": "17148936676412860051488768", + "offset": "6547697434292" + }, + "1": { + "xtReserve": "8200000000", + "liqSquare": "3601276702046700610", + "offset": "-5161974583" + }, + "2": { + "xtReserve": "9000000000", + "liqSquare": "51800738781260893117687869", + "offset": "14547185370727" + }, + "3": { + "xtReserve": "38200000000", + "liqSquare": "1554022163437826793", + "offset": "-35426169851" + }, + "4": { + "xtReserve": "39000000000", + "liqSquare": "433646276003678296168", + "offset": "20699832775" + }, + "5": { + "xtReserve": "39200000000", + "liqSquare": "1588671805064995511", + "offset": "-35574439899" + }, + "length": 6 + }, + "borrowCurveCuts": { + "0": { + "xtReserve": "0", + "liqSquare": "12253114043286217560162304", + "offset": "5605197689344" + }, + "1": { + "xtReserve": "7200000000", + "liqSquare": "3308340791687278741", + "offset": "-4270879534" + }, + "2": { + "xtReserve": "8000000000", + "liqSquare": "6832763607918441056808585", + "offset": "5351194154482" + }, + "3": { + "xtReserve": "19200000000", + "liqSquare": "1571535629821241443", + "offset": "-16590539411" + }, + "4": { + "xtReserve": "20000000000", + "liqSquare": "3473307729328620213070793", + "offset": "5048683691704" + }, + "5": { + "xtReserve": "38200000000", + "liqSquare": "1424056169024734287", + "offset": "-34904520632" + }, + "length": 6 + } + }, + "swapData": { + "debtAmt": "30000000000000000000", + "swapAmtIn": "30000000000000000000", + "tokenType": "2", + "length": "2", + "leverageUnits": { + "0": { + "adapter": "0x954529f8f103bde464fc6d02a94cd40c5bd322d1", + "tokenIn": "0x55d398326f99059ff775485246999027b3197955", + "tokenOut": "0x5d3a1ff2b6bab83b63cd9ad0787074081a52ef34", + "swapData": "0x00000000000000000000000055d398326f99059ff775485246999027b319795500000000000000000000000000000000000000000000002086ac351052600000000000000000000000000000c3f3a07ae7d2a125ef81a5950c4d0dd54c7402510000000000000000000000005d3a1ff2b6bab83b63cd9ad0787074081a52ef340000000000000000000000000000000000000000000000208169437163be00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b7634db4f4710bb992118bc37d1f63e00e2704a40000000000000000000000000000000000000000000000000000000000000140000000000000000000000000c3f3a07ae7d2a125ef81a5950c4d0dd54c74025100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000048010203000e0101010201ff000000000000000000000000000000000000000000dc35157217a3aeff3dcaf2e86327254fbf9f460155d398326f99059ff775485246999027b3197955000000000000000000000000000000000000000000000000" + }, + "1": { + "adapter": "0x37ba9934aaba7a49cc29d0952c6a91d7c7043dbc", + "tokenIn": "0x5d3a1ff2b6bab83b63cd9ad0787074081a52ef34", + "tokenOut": "0x211cc4dd073734da055fbf44a2b4667d5e5fe5d2", + "swapData": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000208169437163be000000000000000000000000000000000000000000000000001b966e26c9d587878e" + } + }, + "flashRepayUnits": { + "0": { + "adapter": "0x37ba9934aaba7a49cc29d0952c6a91d7c7043dbc", + "tokenIn": "0x211cc4dd073734da055fbf44a2b4667d5e5fe5d2", + "tokenOut": "0x5d3a1ff2b6bab83b63cd9ad0787074081a52ef34", + "swapData": "0x000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000001b966e26c9d587878e0000000000000000000000000000000000000000000000000000000000000000" + }, + "1": { + "adapter": "0x954529f8f103bde464fc6d02a94cd40c5bd322d1", + "tokenIn": "0x5d3a1ff2b6bab83b63cd9ad0787074081a52ef34", + "tokenOut": "0x55d398326f99059ff775485246999027b3197955", + "swapData": "0x0000000000000000000000005d3a1ff2b6bab83b63cd9ad0787074081a52ef3400000000000000000000000000000000000000000000002057caf33bdfe510c4000000000000000000000000c3f3a07ae7d2a125ef81a5950c4d0dd54c74025100000000000000000000000055d398326f99059ff775485246999027b31979550000000000000000000000000000000000000000000000205666382f202800000000000000000000000000000000000000000000000000202d01de4d9c280000000000000000000000000000b7634db4f4710bb992118bc37d1f63e00e2704a40000000000000000000000000000000000000000000000000000000000000140000000000000000000000000c3f3a07ae7d2a125ef81a5950c4d0dd54c74025100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000048010203000e0101010200ff000000000000000000000000000000000000000000dc35157217a3aeff3dcaf2e86327254fbf9f46015d3a1ff2b6bab83b63cd9ad0787074081a52ef34000000000000000000000000000000000000000000000000" + } + } + } + }, + "BTCB-USD1": { + "blockNumber": "51933960", + "orderInitialAmount": "20000000000000000000000", + "duration": "30", + "collateral": "0x8d0D000Ee44948FC98c9B98A4FA4921476f08B0d", + "debtToken": "0x7130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c", + "loanConfig": { + "maxLtv": "89000000", + "liquidationLtv": "90000000", + "liquidatable": true + }, + "feeConfig": { + "redeemFeeRatio": "0", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000", + "lendTakerFeeRatio": "1000000", + "borrowTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "1000000", + "borrowMakerFeeRatio": "2000000" + }, + "orderConfig": { + "maxXtReserve": "2000000000000000000000000000000000000000000000000000000000000000000", + "gtId": "0", + "lendCurveCuts": { + "0": { + "xtReserve": "0", + "liqSquare": "17148936676412860051488768", + "offset": "6547697434292" + }, + "1": { + "xtReserve": "8200000000", + "liqSquare": "3601276702046700610", + "offset": "-5161974583" + }, + "2": { + "xtReserve": "9000000000", + "liqSquare": "51800738781260893117687869", + "offset": "14547185370727" + }, + "3": { + "xtReserve": "38200000000", + "liqSquare": "1554022163437826793", + "offset": "-35426169851" + }, + "4": { + "xtReserve": "39000000000", + "liqSquare": "433646276003678296168", + "offset": "20699832775" + }, + "5": { + "xtReserve": "39200000000", + "liqSquare": "1588671805064995511", + "offset": "-35574439899" + }, + "length": 6 + }, + "borrowCurveCuts": { + "0": { + "xtReserve": "0", + "liqSquare": "12253114043286217560162304", + "offset": "5605197689344" + }, + "1": { + "xtReserve": "7200000000", + "liqSquare": "3308340791687278741", + "offset": "-4270879534" + }, + "2": { + "xtReserve": "8000000000", + "liqSquare": "6832763607918441056808585", + "offset": "5351194154482" + }, + "3": { + "xtReserve": "19200000000", + "liqSquare": "1571535629821241443", + "offset": "-16590539411" + }, + "4": { + "xtReserve": "20000000000", + "liqSquare": "3473307729328620213070793", + "offset": "5048683691704" + }, + "5": { + "xtReserve": "38200000000", + "liqSquare": "1424056169024734287", + "offset": "-34904520632" + }, + "length": 6 + } + }, + "swapData": { + "debtAmt": "1000000000000000000", + "swapAmtIn": "1000000000000000000", + "tokenType": "0", + "length": "1", + "leverageUnits": { + "0": { + "adapter": "0x954529f8f103bde464fc6d02a94cd40c5bd322d1", + "tokenIn": "0x7130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c", + "tokenOut": "0x8d0d000ee44948fc98c9b98a4fa4921476f08b0d", + "swapData": "0x0000000000000000000000007130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c00000000000000000000000000000000000000000000002086ac351052600000000000000000000000000000c3f3a07ae7d2a125ef81a5950c4d0dd54c7402510000000000000000000000008d0d000ee44948fc98c9b98a4fa4921476f08b0d00000000000000000000000000000000000000000010cadda52b9beb0000000000000000000000000000000000000000000000000010b55f18d3122d00000000000000000000000000000000b7634db4f4710bb992118bc37d1f63e00e2704a40000000000000000000000000000000000000000000000000000000000000140000000000000000000000000c3f3a07ae7d2a125ef81a5950c4d0dd54c740251000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002ac07051801451deb1403010001010201190136d1e50d0e0100030201011e1228ec0e0100040201013367bf16030200010502001901866bc7e20e0200060200014056b0e30e0200070200000e0300080200074ebbf79b000007c29f89e603040001090a0119060e04000b0a010524df0eb2030400010c0d0119051c6cf6700e04000e0d0105868e7ead0e04000f0d0105a93f27700e0400100d01040e0000110d01033b12ca230e000012130003e32633d80e0000141300020e0000151300000e0101160a01080e0101171300ff000000000000000000000000000000000000000061eb789d75a95caa3ff50ed7e47b96c132fec0827130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c6bbc40579ad1bbd243895ca0acb086bb6300d636fc75f4e78bf71ed5066db9ca771d4ccb7c1264e0d171b26e4484402de70e3ea256be5a2630d7e88dd4dca84e1808da3354924cd243c66828cf7754704bba1018b967e59220b22ca03f68821a3276c9a646cf1cf8c69595804ba91dfdd8d6b960c9b0a7c416b9a82891338f9ba80e2d6970fdda79d1eb0dae55d398326f99059ff775485246999027b31979556fe9e9de56356f7edbfcbb29fab7cd69471a486974e4716e431f45807dcf19f284c7aa99f18a4fbc2170ed0880ac9a755fd29b2688956bd959f933f858f04aada1051885a3c4e296aab0a454ea1233a3d0e226f674bbf064f54ab47f42473ff80db98cba0f338ec12d3f7c3d77a4b9fcc1f95f3fb6ad0ea6be141893e4c6ad9272e8c04bab7e6a10604501a5172fcd41e0913e95784454622d1c3724f546f849bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c36696169c63e42cd08ce11f5deebbcebae65205047a90a2d92a8367a91efa1906bfc8c1e05bf10c49c4ee895e4f6ce07ada631c508d1306db7502cce4a3218606af9b4728a9f187e1c1a8c07fbc172a90000000000000000000000000000000000000000" + } + }, + "flashRepayUnits": { + "0":{ + "adapter": "0x954529f8f103bde464fc6d02a94cd40c5bd322d1", + "tokenIn": "0x8d0d000ee44948fc98c9b98a4fa4921476f08b0d", + "tokenOut": "0x7130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c", + "swapData": "0x0000000000000000000000008d0d000ee44948fc98c9b98a4fa4921476f08b0d00000000000000000000000000000000000000000010cadda52b9beb00000000000000000000000000000000c3f3a07ae7d2a125ef81a5950c4d0dd54c7402510000000000000000000000007130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c000000000000000000000000000000000000000000000003c5e83c85bdb64000000000000000000000000000000000000000000000000003c113e00f4ff68000000000000000000000000000b7634db4f4710bb992118bc37d1f63e00e2704a40000000000000000000000000000000000000000000000000000000000000140000000000000000000000000c3f3a07ae7d2a125ef81a5950c4d0dd54c74025100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b50210f5d0114673cfb0301000101020019010026b1df0e0100030200015db7eca20e01000402000105037cf80e0100050200010161e4140f010002060000002d000001000103c6312c0f010002060000000c0000010001003f92a9030200010702001901091f29b00e02000802000100c380e90e0200090200010343f1940e02000a020001004309d10f0200020b0000004d000002000100431b64030300010c0200190100432d000e03000d02000100433ea5030400010e0201190100435053030500010f020019010043620b030611011102011901009c30a70e07001202000197124d210e080013020101018515d40e0901140200000f0a000215000dbba000465000150062d3e20000140f0b00151601000bb800003c0011db8895b0000a1103e57d8d030c0001171800191106adf2a80e0c00191800114dc092ed0e0c001a180011064df57b0e0c001b1800110a01d9990e0c001c180011a3eb88860e0c001d180011689a9e750e0c001e18001112cc247d030b00011f18001911393ad6ac0e0b0020180011a4ed5e7e0e0b0021180011374050491b0b0022180011aee8f8540e0d00231800100e0e0024180003dc362582000e030116e8ba030a00012506011903693228320e0a0026060103597ef6d00e0a0027060103084c769a0e0a002806010384c513b70c0a000618030a417ac10e0800290601032fb09f480e0c002a060003f1f665f10e0c002b0600020e0c002c0600078beec3970001060e0c002d2e010f9ee93a1e000c0e0f00002f1500000bb800003c000c030c00001030001e05049e50f10a0e310b060100052b89a87b0e0e00320b00050fc947f20e0e00330b000510415f610e0e00340b0005c401c7d90f0e000b06000000060000010005752138f10f0e000b060000000700000100054e617704220e0001350b01058553ec55220e0001360b000558b188f60f00000b15000001f400000a00040f00000b150000006400000100080e0e003738000a1f0400393a01150041fede030901013b1800141500386bb3030901013c18001415003d6858030901013d1800141503a8a345030901013e18001915073b3cf80e09013f18001509a09d140e090140180015f182929c0e090141180015045b9e8a0e09014218001594df18b50e0901431800152d47b8190e0901441800140e0901451800190218035d03090101462f01141908628cc903090101472f011919014d31180e0901482f011905dec07b0e0901492f011955b4d9c80e09014a2f01196b7d70eb0e09014b2f01192c4c12da0e09014c2f01180e09014d2f011d00302384030901014e0601191d006568e20e09014f06011dd66d79540e09015006011d70a638070e09015106011d056140770e09015206011c0e0901530601100e09015455001a0e0901565701020e0901582e01160e0901591600000f0901155a010001f400000a00081f09015b5c00ff00109977931268a6f7cbcf61dc9218323345ce8d0e8d0d000ee44948fc98c9b98a4fa4921476f08b0d4c6cebdefba2612986a42df2ff287949cda9c7899c4ee895e4f6ce07ada631c508d1306db7502ccef150d29d92e7460a1531cbc9d1abeab33d6998e455d398326f99059ff775485246999027b3197955cd92481850f0498b2b8f850c5081d6aa5bc4f82eb3f27fe82bd1e5d7458e02b543cf0c6610ffad83e27cb00d8ceefa9457945d176efd7a4fbd2f2e35fdfc89d953e044f84faa2ed4953190a066328ee08ac76a51cc950d9822d68b83fe1ad97b32cd580de320dda751dd20116be92d4c0b6d24d344f4e05bbc278c8beef275a301700323f214f46b6c8f499b3860f457d627e5acf5631b48571b4ae3a254b9f5b621eaf65fc1214a0eb4491c12164d8ce1174e302da39e15f8b505da62a79eeb107166544543365257e8f67d01d04b5045da5f7357faa5a9afa42b6e370fbd4cc0c5c99ffc8586aaff24a5134601386b4a3218606af9b4728a9f187e1c1a8c07fbc172a914b0c3d61516261d6309aafdb19292552e69bf0f0000000000000000000000000000000000000000ba2ae424d960c26247dd6c32edc70b295c744c4374e4716e431f45807dcf19f284c7aa99f18a4fbcbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c1123e75b71019962cd4d21b0f3018a6412edb63c58f04aada1051885a3c4e296aab0a454ea1233a37d05c84581f0c41ad80ddf677a510360bae09a5a62fcb3c1794fb95bd8b1a97f6ad5d8a7e4943a1ed0e226f674bbf064f54ab47f42473ff80db98cba0f338ec12d3f7c3d77a4b9fcc1f95f3fb6ad0ea6ac109c8025f272414fd9e2faa805a583708a017f06c97634423750e04a189aacc138ecc0a00b5df7ce6160bb594fc055c943f59de92cee30b8c6b32cb80666f4f4d82f92e40d6f2be1d1800e5ca9410461cd03597e34ba58efec89d1af9615e3af817f9836696169c63e42cd08ce11f5deebbcebae65205016b9a82891338f9ba80e2d6970fdda79d1eb0dae172fcd41e0913e95784454622d1c3724f546f84947a90a2d92a8367a91efa1906bfc8c1e05bf10c46fe9e9de56356f7edbfcbb29fab7cd69471a486998a0004b8e9fe161369528a2e07de56c15a27d768829abfa1a7b017078195c10a966d7411a0c9515be141893e4c6ad9272e8c04bab7e6a10604501a5f9878a5dd55edc120fde01893ea713a4f032229c517f28453b947ba01fe6a6b193294d45765288260e09fabb73bd3ade0a17ecc321fd13a19e81ce822170ed0880ac9a755fd29b2688956bd959f933f8c9882def23bc42d53895b8361d0b1edc7570bc6a3efebc418efb585248a0d2140cfb87afcc2c63dd7491c04dc4575e086a8ee31f7ce1c6d56fb7dcc192b7807bf19b7dddf89b706143896d05228f31212c3c320d49019d4f9a92352e947c7e5acfe47d683ce759d5f0cbd6269400aa675947dd738cf620d547423dbe87f337a4a5c17cc57d09b971d501dd14bf72b6485e4b31601afe7b0a1210be2004d2b1d6c5f0f7b66764f6ec8c8dff7ba683102295e1640979397885e32d5ee198cb997092dad5b04784bcc12859e4544c4bb03966803b044a93563bd2d0dd4d1e1afe9d9c5f290d8f6996ddb190bd111908a43dc7e9d76ba11099af3f330ff829c5f442d571e0577561eee90e24f3b348e1087a005f78b4c845352461eb789d75a95caa3ff50ed7e47b96c132fec0826b67112aa7b45e8cdc0a93b8d66a6a36e68ae8e5ebe40e120bac0d8f9793c080b4ce1653961930c86bbc40579ad1bbd243895ca0acb086bb6300d63662edaf2a56c9fb55be5f9b1399ac067f6a37013bfc75f4e78bf71ed5066db9ca771d4ccb7c1264e0fd6e5b7c30538dff2752058e425ad01a56b831cc28df0835942396b7a1b7ae1cd068728e6ddbbafd6216e04cd40db2c6fbed64f1b5830a98d3a91740d171b26e4484402de70e3ea256be5a2630d7e88d1f9b1a3ddedbf47b96c65f29c0586b678de2623b7d1d3649232f28bf7467e9cdb27e6d902c16a165d4dca84e1808da3354924cd243c66828cf7754704bba1018b967e59220b22ca03f68821a3276c9a6cec31052610aaf0693d6b4d34e055687af3aeee63fb2623567e21f8c50f0ae86f54ef4849b4eb47b3f803ec2b816ea7f06ec76aa2b6f2532f9892d626ee3ee9c3395bbd136b6076a70cb6cff241c0e2446cf1cf8c69595804ba91dfdd8d6b960c9b0a7c4247f51881d1e3ae0f759afb801413a6c948ef44206396509195eb9e07c38a016694dc9ff535b128a813c0decbb1097fff46d0ed6a39fb5f6a83043f4246505db95e5a60d8524d52b9ed3dbaf6ee2584ff4c8e32eadec4bfe97e0f595add0f4450a863a11575a951ad021d4297ac125be88ee4620652d5c124aae823a6a0b376de6a78e74ecc5b079d38cbcf7380a466ae6896d7d4fcd571e1e24cd5061a836b3353d328efbef48b79a570cbc2fde20f40e9f20637130d2a12b9bcbfae4f2634d864a1ee1ce3ead9cc5dc2b1b41e21772a620101910a08aee55e83872fdc66a08b0d0dc44c17bbd471b88f49f50cdd20f00000000000000000000000000000000" + } + } + } + }, + "BTCB-USDT": { + "blockNumber": "51933960", + "orderInitialAmount": "20000000000000000000000", + "duration": "30", + "collateral": "0x7130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c", + "debtToken": "0x55d398326f99059ff775485246999027b3197955", + "loanConfig": { + "maxLtv": "89000000", + "liquidationLtv": "90000000", + "liquidatable": true + }, + "feeConfig": { + "redeemFeeRatio": "0", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000", + "lendTakerFeeRatio": "1000000", + "borrowTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "1000000", + "borrowMakerFeeRatio": "2000000" + }, + "orderConfig": { + "maxXtReserve": "2000000000000000000000000000000000000000000000000000000000000000000", + "gtId": "0", + "lendCurveCuts": { + "0": { + "xtReserve": "0", + "liqSquare": "17148936676412860051488768", + "offset": "6547697434292" + }, + "1": { + "xtReserve": "8200000000", + "liqSquare": "3601276702046700610", + "offset": "-5161974583" + }, + "2": { + "xtReserve": "9000000000", + "liqSquare": "51800738781260893117687869", + "offset": "14547185370727" + }, + "3": { + "xtReserve": "38200000000", + "liqSquare": "1554022163437826793", + "offset": "-35426169851" + }, + "4": { + "xtReserve": "39000000000", + "liqSquare": "433646276003678296168", + "offset": "20699832775" + }, + "5": { + "xtReserve": "39200000000", + "liqSquare": "1588671805064995511", + "offset": "-35574439899" + }, + "length": 6 + }, + "borrowCurveCuts": { + "0": { + "xtReserve": "0", + "liqSquare": "12253114043286217560162304", + "offset": "5605197689344" + }, + "1": { + "xtReserve": "7200000000", + "liqSquare": "3308340791687278741", + "offset": "-4270879534" + }, + "2": { + "xtReserve": "8000000000", + "liqSquare": "6832763607918441056808585", + "offset": "5351194154482" + }, + "3": { + "xtReserve": "19200000000", + "liqSquare": "1571535629821241443", + "offset": "-16590539411" + }, + "4": { + "xtReserve": "20000000000", + "liqSquare": "3473307729328620213070793", + "offset": "5048683691704" + }, + "5": { + "xtReserve": "38200000000", + "liqSquare": "1424056169024734287", + "offset": "-34904520632" + }, + "length": 6 + } + }, + "swapData": { + "debtAmt": "300000000000000000000", + "swapAmtIn": "300000000000000000000", + "tokenType": "0", + "length": "1", + "leverageUnits": { + "0": { + "adapter": "0x954529f8f103bde464fc6d02a94cd40c5bd322d1", + "tokenIn": "0x55d398326f99059ff775485246999027b3197955", + "tokenOut": "0x7130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c", + "swapData": "0x00000000000000000000000055d398326f99059ff775485246999027b319795500000000000000000000000000000000000000000000002086ac351052600000000000000000000000000000c3f3a07ae7d2a125ef81a5950c4d0dd54c7402510000000000000000000000007130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c000000000000000000000000000000000000000000000000001513fbfc3511990000000000000000000000000000000000000000000000000014f9012010f6a1000000000000000000000000b7634db4f4710bb992118bc37d1f63e00e2704a40000000000000000000000000000000000000000000000000000000000000140000000000000000000000000c3f3a07ae7d2a125ef81a5950c4d0dd54c74025100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070010205000e0100010201020e0001030400ff0000000000000000000000000000172fcd41e0913e95784454622d1c3724f546f84955d398326f99059ff775485246999027b3197955ebe40e120bac0d8f9793c080b4ce1653961930c8bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c00000000000000000000000000000000" + } + }, + "flashRepayUnits": { + "0":{ + "adapter": "0x954529f8f103bde464fc6d02a94cd40c5bd322d1", + "tokenIn": "0x7130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c", + "tokenOut": "0x55d398326f99059ff775485246999027b3197955", + "swapData": "0x0000000000000000000000007130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c000000000000000000000000000000000000000000000000001513fbfc351199000000000000000000000000c3f3a07ae7d2a125ef81a5950c4d0dd54c74025100000000000000000000000055d398326f99059ff775485246999027b319795500000000000000000000000000000000000000000000002080c66d0ecddc0000000000000000000000000000000000000000000000000020572bd578f85a0000000000000000000000000000b7634db4f4710bb992118bc37d1f63e00e2704a40000000000000000000000000000000000000000000000000000000000000140000000000000000000000000c3f3a07ae7d2a125ef81a5950c4d0dd54c74025100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000048010203000e0101010200ff00000000000000000000000000000000000000000046cf1cf8c69595804ba91dfdd8d6b960c9b0a7c47130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c000000000000000000000000000000000000000000000000" + } + } + } + }, + "USD1-USDT": { + "blockNumber": "51933960", + "orderInitialAmount": "20000000000000000000000", + "duration": "30", + "collateral": "0x8d0D000Ee44948FC98c9B98A4FA4921476f08B0d", + "debtToken": "0x55d398326f99059ff775485246999027b3197955", + "loanConfig": { + "maxLtv": "89000000", + "liquidationLtv": "90000000", + "liquidatable": true + }, + "feeConfig": { + "redeemFeeRatio": "0", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000", + "lendTakerFeeRatio": "1000000", + "borrowTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "1000000", + "borrowMakerFeeRatio": "2000000" + }, + "orderConfig": { + "maxXtReserve": "2000000000000000000000000000000000000000000000000000000000000000000", + "gtId": "0", + "lendCurveCuts": { + "0": { + "xtReserve": "0", + "liqSquare": "17148936676412860051488768", + "offset": "6547697434292" + }, + "1": { + "xtReserve": "8200000000", + "liqSquare": "3601276702046700610", + "offset": "-5161974583" + }, + "2": { + "xtReserve": "9000000000", + "liqSquare": "51800738781260893117687869", + "offset": "14547185370727" + }, + "3": { + "xtReserve": "38200000000", + "liqSquare": "1554022163437826793", + "offset": "-35426169851" + }, + "4": { + "xtReserve": "39000000000", + "liqSquare": "433646276003678296168", + "offset": "20699832775" + }, + "5": { + "xtReserve": "39200000000", + "liqSquare": "1588671805064995511", + "offset": "-35574439899" + }, + "length": 6 + }, + "borrowCurveCuts": { + "0": { + "xtReserve": "0", + "liqSquare": "12253114043286217560162304", + "offset": "5605197689344" + }, + "1": { + "xtReserve": "7200000000", + "liqSquare": "3308340791687278741", + "offset": "-4270879534" + }, + "2": { + "xtReserve": "8000000000", + "liqSquare": "6832763607918441056808585", + "offset": "5351194154482" + }, + "3": { + "xtReserve": "19200000000", + "liqSquare": "1571535629821241443", + "offset": "-16590539411" + }, + "4": { + "xtReserve": "20000000000", + "liqSquare": "3473307729328620213070793", + "offset": "5048683691704" + }, + "5": { + "xtReserve": "38200000000", + "liqSquare": "1424056169024734287", + "offset": "-34904520632" + }, + "length": 6 + } + }, + "swapData": { + "debtAmt": "300000000000000000000", + "swapAmtIn": "300000000000000000000", + "tokenType": "0", + "length": "1", + "leverageUnits": { + "0": { + "adapter": "0x954529f8f103bde464fc6d02a94cd40c5bd322d1", + "tokenIn": "0x55d398326f99059ff775485246999027b3197955", + "tokenOut": "0x8d0d000ee44948fc98c9b98a4fa4921476f08b0d", + "swapData": "0x00000000000000000000000055d398326f99059ff775485246999027b319795500000000000000000000000000000000000000000000002086ac351052600000000000000000000000000000c3f3a07ae7d2a125ef81a5950c4d0dd54c7402510000000000000000000000008d0d000ee44948fc98c9b98a4fa4921476f08b0d00000000000000000000000000000000000000000000002086ae864e523200000000000000000000000000000000000000000000000000205d0c5f3c026c0000000000000000000000000000b7634db4f4710bb992118bc37d1f63e00e2704a40000000000000000000000000000000000000000000000000000000000000140000000000000000000000000c3f3a07ae7d2a125ef81a5950c4d0dd54c74025100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000048010203000f010101020100000c00000100ff000000000000000000000000000055d398326f99059ff775485246999027b31979558d0d000ee44948fc98c9b98a4fa4921476f08b0d000000000000000000000000000000000000000000000000" + } + }, + "flashRepayUnits": { + "0":{ + "adapter": "0x954529f8f103bde464fc6d02a94cd40c5bd322d1", + "tokenIn": "0x8d0d000ee44948fc98c9b98a4fa4921476f08b0d", + "tokenOut": "0x55d398326f99059ff775485246999027b3197955", + "swapData": "0x0000000000000000000000008d0d000ee44948fc98c9b98a4fa4921476f08b0d00000000000000000000000000000000000000000000002086ae864e52320000000000000000000000000000c3f3a07ae7d2a125ef81a5950c4d0dd54c74025100000000000000000000000055d398326f99059ff775485246999027b319795500000000000000000000000000000000000000000000002081733f27ab76000000000000000000000000000000000000000000000000002057d7ca5bf3900000000000000000000000000000b7634db4f4710bb992118bc37d1f63e00e2704a40000000000000000000000000000000000000000000000000000000000000140000000000000000000000000c3f3a07ae7d2a125ef81a5950c4d0dd54c74025100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000048010203000f010101020000000c00000100ff00000000000000000000000000008d0d000ee44948fc98c9b98a4fa4921476f08b0d55d398326f99059ff775485246999027b3197955000000000000000000000000000000000000000000000000" + } + } + } + }, + "WBNB-USD1": { + "blockNumber": "51933960", + "orderInitialAmount": "20000000000000000000000", + "duration": "30", + "collateral": "0x8d0D000Ee44948FC98c9B98A4FA4921476f08B0d", + "debtToken": "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c", + "loanConfig": { + "maxLtv": "89000000", + "liquidationLtv": "90000000", + "liquidatable": true + }, + "feeConfig": { + "redeemFeeRatio": "0", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000", + "lendTakerFeeRatio": "1000000", + "borrowTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "1000000", + "borrowMakerFeeRatio": "2000000" + }, + "orderConfig": { + "maxXtReserve": "2000000000000000000000000000000000000000000000000000000000000000000", + "gtId": "0", + "lendCurveCuts": { + "0": { + "xtReserve": "0", + "liqSquare": "17148936676412860051488768", + "offset": "6547697434292" + }, + "1": { + "xtReserve": "8200000000", + "liqSquare": "3601276702046700610", + "offset": "-5161974583" + }, + "2": { + "xtReserve": "9000000000", + "liqSquare": "51800738781260893117687869", + "offset": "14547185370727" + }, + "3": { + "xtReserve": "38200000000", + "liqSquare": "1554022163437826793", + "offset": "-35426169851" + }, + "4": { + "xtReserve": "39000000000", + "liqSquare": "433646276003678296168", + "offset": "20699832775" + }, + "5": { + "xtReserve": "39200000000", + "liqSquare": "1588671805064995511", + "offset": "-35574439899" + }, + "length": 6 + }, + "borrowCurveCuts": { + "0": { + "xtReserve": "0", + "liqSquare": "12253114043286217560162304", + "offset": "5605197689344" + }, + "1": { + "xtReserve": "7200000000", + "liqSquare": "3308340791687278741", + "offset": "-4270879534" + }, + "2": { + "xtReserve": "8000000000", + "liqSquare": "6832763607918441056808585", + "offset": "5351194154482" + }, + "3": { + "xtReserve": "19200000000", + "liqSquare": "1571535629821241443", + "offset": "-16590539411" + }, + "4": { + "xtReserve": "20000000000", + "liqSquare": "3473307729328620213070793", + "offset": "5048683691704" + }, + "5": { + "xtReserve": "38200000000", + "liqSquare": "1424056169024734287", + "offset": "-34904520632" + }, + "length": 6 + } + }, + "swapData": { + "debtAmt": "30000000000000000000", + "swapAmtIn": "30000000000000000000", + "tokenType": "0", + "length": "1", + "leverageUnits": { + "0": { + "adapter": "0x954529f8f103bde464fc6d02a94cd40c5bd322d1", + "tokenIn": "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c", + "tokenOut": "0x8d0d000ee44948fc98c9b98a4fa4921476f08b0d", + "swapData": "0x000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c0000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c3f3a07ae7d2a125ef81a5950c4d0dd54c7402510000000000000000000000008d0d000ee44948fc98c9b98a4fa4921476f08b0d0000000000000000000000000000000000000000000000219caef4eb1fe8000000000000000000000000000000000000000000000000002171a8f640fd300000000000000000000000000000b7634db4f4710bb992118bc37d1f63e00e2704a40000000000000000000000000000000000000000000000000000000000000140000000000000000000000000c3f3a07ae7d2a125ef81a5950c4d0dd54c74025100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070010205000e0100010200020f000103040100000c00000100ff0000000000000047a90a2d92a8367a91efa1906bfc8c1e05bf10c4bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c55d398326f99059ff775485246999027b31979558d0d000ee44948fc98c9b98a4fa4921476f08b0d00000000000000000000000000000000" + } + }, + "flashRepayUnits": { + "0":{ + "adapter": "0x954529f8f103bde464fc6d02a94cd40c5bd322d1", + "tokenIn": "0x8d0d000ee44948fc98c9b98a4fa4921476f08b0d", + "tokenOut": "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c", + "swapData": "0x0000000000000000000000008d0d000ee44948fc98c9b98a4fa4921476f08b0d0000000000000000000000000000000000000000000000219caef4eb1fe80000000000000000000000000000c3f3a07ae7d2a125ef81a5950c4d0dd54c740251000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c0000000000000000000000000000000000000000000000000dde7e9725507c800000000000000000000000000000000000000000000000000dccbdf51c2af700000000000000000000000000b7634db4f4710bb992118bc37d1f63e00e2704a40000000000000000000000000000000000000000000000000000000000000140000000000000000000000000c3f3a07ae7d2a125ef81a5950c4d0dd54c7402510000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c010204000f010001020000002d00000100020e0001030201ff000000000000008d0d000ee44948fc98c9b98a4fa4921476f08b0d55d398326f99059ff775485246999027b319795547a90a2d92a8367a91efa1906bfc8c1e05bf10c400000000" + } + } + } + }, + "BTCB-WBNB": { + "blockNumber": "51933960", + "orderInitialAmount": "20000000000000000000000", + "duration": "30", + "collateral": "0x7130d2A12B9BCbFAe4f2634d864A1Ee1Ce3Ead9c", + "debtToken": "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c", + "loanConfig": { + "maxLtv": "89000000", + "liquidationLtv": "90000000", + "liquidatable": true + }, + "feeConfig": { + "redeemFeeRatio": "0", + "mintGtFeeRatio": "1000000", + "mintGtFeeRef": "2000000", + "lendTakerFeeRatio": "1000000", + "borrowTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "1000000", + "borrowMakerFeeRatio": "2000000" + }, + "orderConfig": { + "maxXtReserve": "2000000000000000000000000000000000000000000000000000000000000000000", + "gtId": "0", + "lendCurveCuts": { + "0": { + "xtReserve": "0", + "liqSquare": "17148936676412860051488768", + "offset": "6547697434292" + }, + "1": { + "xtReserve": "8200000000", + "liqSquare": "3601276702046700610", + "offset": "-5161974583" + }, + "2": { + "xtReserve": "9000000000", + "liqSquare": "51800738781260893117687869", + "offset": "14547185370727" + }, + "3": { + "xtReserve": "38200000000", + "liqSquare": "1554022163437826793", + "offset": "-35426169851" + }, + "4": { + "xtReserve": "39000000000", + "liqSquare": "433646276003678296168", + "offset": "20699832775" + }, + "5": { + "xtReserve": "39200000000", + "liqSquare": "1588671805064995511", + "offset": "-35574439899" + }, + "length": 6 + }, + "borrowCurveCuts": { + "0": { + "xtReserve": "0", + "liqSquare": "12253114043286217560162304", + "offset": "5605197689344" + }, + "1": { + "xtReserve": "7200000000", + "liqSquare": "3308340791687278741", + "offset": "-4270879534" + }, + "2": { + "xtReserve": "8000000000", + "liqSquare": "6832763607918441056808585", + "offset": "5351194154482" + }, + "3": { + "xtReserve": "19200000000", + "liqSquare": "1571535629821241443", + "offset": "-16590539411" + }, + "4": { + "xtReserve": "20000000000", + "liqSquare": "3473307729328620213070793", + "offset": "5048683691704" + }, + "5": { + "xtReserve": "38200000000", + "liqSquare": "1424056169024734287", + "offset": "-34904520632" + }, + "length": 6 + } + }, + "swapData": { + "debtAmt": "10000000000000000", + "swapAmtIn": "30000000000000000000", + "tokenType": "0", + "length": "1", + "leverageUnits": { + "0": { + "adapter": "0x954529f8f103bde464fc6d02a94cd40c5bd322d1", + "tokenIn": "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c", + "tokenOut": "0x7130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c", + "swapData": "0x000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c0000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000c3f3a07ae7d2a125ef81a5950c4d0dd54c7402510000000000000000000000007130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c0000000000000000000000000000000000000000000000000015c68b900a7d390000000000000000000000000000000000000000000000000015aaac2514ad3c000000000000000000000000b7634db4f4710bb992118bc37d1f63e00e2704a40000000000000000000000000000000000000000000000000000000000000140000000000000000000000000c3f3a07ae7d2a125ef81a5950c4d0dd54c74025100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000048010203000e0101010200ff000000000000000000000000000000000000000000ebe40e120bac0d8f9793c080b4ce1653961930c8bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c000000000000000000000000000000000000000000000000" + } + }, + "flashRepayUnits": { + "0":{ + "adapter": "0x954529f8f103bde464fc6d02a94cd40c5bd322d1", + "tokenIn": "0x7130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c", + "tokenOut": "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c", + "swapData": "0x0000000000000000000000007130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c0000000000000000000000000000000000000000000000000015c68b900a7d39000000000000000000000000c3f3a07ae7d2a125ef81a5950c4d0dd54c740251000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c0000000000000000000000000000000000000000000000000ddcc2b2a4f4d9800000000000000000000000000000000000000000000000000dcb0448ca881b00000000000000000000000000b7634db4f4710bb992118bc37d1f63e00e2704a40000000000000000000000000000000000000000000000000000000000000140000000000000000000000000c3f3a07ae7d2a125ef81a5950c4d0dd54c74025100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000048010203000e0101010201ff0000000000000000000000000000000000000000006bbc40579ad1bbd243895ca0acb086bb6300d6367130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c000000000000000000000000000000000000000000000000" + } + } + } + } +} diff --git a/test/v1/mainnet-fork/GtBaseTest.t.sol b/test/v1/mainnet-fork/GtBaseTest.t.sol index 5acd874..c6ff964 100644 --- a/test/v1/mainnet-fork/GtBaseTest.t.sol +++ b/test/v1/mainnet-fork/GtBaseTest.t.sol @@ -8,6 +8,7 @@ import {StateChecker} from "../utils/StateChecker.sol"; import {SwapUtils} from "../utils/SwapUtils.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {TermMaxFactory} from "contracts/v1/factory/TermMaxFactory.sol"; import {Constants} from "contracts/v1/lib/Constants.sol"; import {ITermMaxMarket, TermMaxMarket, MarketEvents} from "contracts/v1/TermMaxMarket.sol"; @@ -137,6 +138,7 @@ abstract contract GtBaseTest is ForkBaseTest { address(new OdosV2AdapterV2(vm.parseJsonAddress(jsonData, ".routers.odosRouter"))); res.swapAdapters.vaultAdapter = address(new ERC4626VaultAdapterV2()); res.router = deployRouter(res.marketInitialParams.admin); + vm.label(address(res.router), "TermMaxRouter"); res.router.setAdapterWhitelist(res.swapAdapters.uniswapAdapter, true); res.router.setAdapterWhitelist(res.swapAdapters.pendleAdapter, true); res.router.setAdapterWhitelist(res.swapAdapters.odosAdapter, true); @@ -220,6 +222,12 @@ abstract contract GtBaseTest is ForkBaseTest { uint128 tokenAmtIn, SwapUnit[] memory units ) internal returns (uint256 gtId) { + vm.startPrank(Ownable(address(res.router)).owner()); + for (uint256 i = 0; i < units.length; i++) { + res.router.setAdapterWhitelist(units[i].adapter, true); + } + vm.stopPrank(); + vm.startPrank(taker); deal(taker, 1e8); deal(address(res.debtToken), taker, xtAmtIn); @@ -260,6 +268,13 @@ abstract contract GtBaseTest is ForkBaseTest { uint128 tokenAmtIn, SwapUnit[] memory units ) internal returns (uint256 gtId) { + vm.label(taker, "Taker"); + vm.startPrank(Ownable(address(res.router)).owner()); + for (uint256 i = 0; i < units.length; i++) { + res.router.setAdapterWhitelist(units[i].adapter, true); + } + vm.stopPrank(); + vm.startPrank(taker); deal(taker, 1e8); @@ -302,8 +317,20 @@ abstract contract GtBaseTest is ForkBaseTest { } function _testFlashRepay(GtTestRes memory res, uint256 gtId, address taker, SwapUnit[] memory units) internal { + vm.startPrank(Ownable(address(res.router)).owner()); + for (uint256 i = 0; i < units.length; i++) { + res.router.setAdapterWhitelist(units[i].adapter, true); + } + vm.stopPrank(); + deal(taker, 1e18); + vm.startPrank(Ownable(address(res.router)).owner()); + for (uint256 i = 0; i < units.length; i++) { + res.router.setAdapterWhitelist(units[i].adapter, true); + } + vm.stopPrank(); + vm.startPrank(taker); res.gt.approve(address(res.router), gtId); @@ -325,6 +352,12 @@ abstract contract GtBaseTest is ForkBaseTest { } function _testFlashRepayByFt(GtTestRes memory res, uint256 gtId, address taker, SwapUnit[] memory units) internal { + vm.startPrank(Ownable(address(res.router)).owner()); + for (uint256 i = 0; i < units.length; i++) { + res.router.setAdapterWhitelist(units[i].adapter, true); + } + vm.stopPrank(); + deal(taker, 1e18); vm.startPrank(taker); diff --git a/test/v1/mainnet-fork/mainnet/ForkGt.t.sol b/test/v1/mainnet-fork/mainnet/ForkGt.t.sol index 608bbf3..b3bdf4d 100644 --- a/test/v1/mainnet-fork/mainnet/ForkGt.t.sol +++ b/test/v1/mainnet-fork/mainnet/ForkGt.t.sol @@ -5,7 +5,7 @@ import "../GtBaseTest.t.sol"; contract ForkGtV1 is GtBaseTest { string MAINNET_RPC_URL = vm.envString("MAINNET_RPC_URL"); - string DATA_PATH = string.concat(vm.projectRoot(), "/test/testdata/fork/mainnet.json"); + string DATA_PATH = string.concat(vm.projectRoot(), "/test/testdata/fork/bsc.json"); function _getForkRpcUrl() internal view override returns (string memory) { return MAINNET_RPC_URL; @@ -32,23 +32,6 @@ contract ForkGtV1 is GtBaseTest { for (uint256 i = 0; i < tokenPairs.length; i++) { string memory tokenPair = tokenPairs[i]; GtTestRes memory res = _initializeGtTestRes(tokenPair); - if (res.swapData.tokenType == TokenType.General) { - res.swapData.leverageUnits[0].adapter = res.swapAdapters.odosAdapter; - } else if (res.swapData.tokenType == TokenType.Pendle) { - if (res.swapData.leverageUnits.length == 1) { - res.swapData.leverageUnits[0].adapter = res.swapAdapters.pendleAdapter; - } else { - res.swapData.leverageUnits[1].adapter = res.swapAdapters.pendleAdapter; - res.swapData.leverageUnits[0].adapter = res.swapAdapters.odosAdapter; - } - } else if (res.swapData.tokenType == TokenType.Morpho) { - if (res.swapData.leverageUnits.length == 1) { - res.swapData.leverageUnits[0].adapter = res.swapAdapters.vaultAdapter; - } else { - res.swapData.leverageUnits[1].adapter = res.swapAdapters.vaultAdapter; - res.swapData.leverageUnits[0].adapter = res.swapAdapters.odosAdapter; - } - } address taker = vm.randomAddress(); @@ -60,32 +43,6 @@ contract ForkGtV1 is GtBaseTest { for (uint256 i = 0; i < tokenPairs.length; i++) { string memory tokenPair = tokenPairs[i]; GtTestRes memory res = _initializeGtTestRes(tokenPair); - if (res.swapData.tokenType == TokenType.General) { - res.swapData.leverageUnits[0].adapter = res.swapAdapters.odosAdapter; - res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.odosAdapter; - } else if (res.swapData.tokenType == TokenType.Pendle) { - if (res.swapData.leverageUnits.length == 1) { - res.swapData.leverageUnits[0].adapter = res.swapAdapters.pendleAdapter; - res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.pendleAdapter; - } else { - res.swapData.leverageUnits[1].adapter = res.swapAdapters.pendleAdapter; - res.swapData.leverageUnits[0].adapter = res.swapAdapters.odosAdapter; - - res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.pendleAdapter; - res.swapData.flashRepayUnits[1].adapter = res.swapAdapters.odosAdapter; - } - } else if (res.swapData.tokenType == TokenType.Morpho) { - if (res.swapData.leverageUnits.length == 1) { - res.swapData.leverageUnits[0].adapter = res.swapAdapters.vaultAdapter; - res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.vaultAdapter; - } else { - res.swapData.leverageUnits[1].adapter = res.swapAdapters.vaultAdapter; - res.swapData.leverageUnits[0].adapter = res.swapAdapters.odosAdapter; - - res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.vaultAdapter; - res.swapData.flashRepayUnits[1].adapter = res.swapAdapters.odosAdapter; - } - } address taker = vm.randomAddress(); uint256 gtId = _testLeverageFromXt( @@ -99,32 +56,6 @@ contract ForkGtV1 is GtBaseTest { for (uint256 i = 0; i < tokenPairs.length; i++) { string memory tokenPair = tokenPairs[i]; GtTestRes memory res = _initializeGtTestRes(tokenPair); - if (res.swapData.tokenType == TokenType.General) { - res.swapData.leverageUnits[0].adapter = res.swapAdapters.odosAdapter; - res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.odosAdapter; - } else if (res.swapData.tokenType == TokenType.Pendle) { - if (res.swapData.leverageUnits.length == 1) { - res.swapData.leverageUnits[0].adapter = res.swapAdapters.pendleAdapter; - res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.pendleAdapter; - } else { - res.swapData.leverageUnits[1].adapter = res.swapAdapters.pendleAdapter; - res.swapData.leverageUnits[0].adapter = res.swapAdapters.odosAdapter; - - res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.pendleAdapter; - res.swapData.flashRepayUnits[1].adapter = res.swapAdapters.odosAdapter; - } - } else if (res.swapData.tokenType == TokenType.Morpho) { - if (res.swapData.leverageUnits.length == 1) { - res.swapData.leverageUnits[0].adapter = res.swapAdapters.vaultAdapter; - res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.vaultAdapter; - } else { - res.swapData.leverageUnits[1].adapter = res.swapAdapters.vaultAdapter; - res.swapData.leverageUnits[0].adapter = res.swapAdapters.odosAdapter; - - res.swapData.flashRepayUnits[0].adapter = res.swapAdapters.vaultAdapter; - res.swapData.flashRepayUnits[1].adapter = res.swapAdapters.odosAdapter; - } - } address taker = vm.randomAddress(); uint256 gtId = _testLeverageFromXt( @@ -146,7 +77,7 @@ contract ForkGtV1 is GtBaseTest { uint128 borrowAmt = uint128(res.orderInitialAmount / 20); uint256 gtId = _fastLoan(res, borrower, borrowAmt, collateralAmt); - _updateCollateralPrice(res, 0.5e8); + _updateCollateralPrice(res, 1); _testLiquidate(res, liquidator, gtId); } From 89cafe2f70a0ab78f62216a553ab720f7ab8e397 Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 24 Jun 2025 13:03:38 +0800 Subject: [PATCH 110/194] support repay for gt in router --- contracts/v1/router/IGtRepayer.sol | 24 + .../v1/router/TermMaxRouter_Repay_Gt.sol | 584 ++++++++++++++++++ test/v1/Router.t.sol | 33 + 3 files changed, 641 insertions(+) create mode 100644 contracts/v1/router/IGtRepayer.sol create mode 100644 contracts/v1/router/TermMaxRouter_Repay_Gt.sol diff --git a/contracts/v1/router/IGtRepayer.sol b/contracts/v1/router/IGtRepayer.sol new file mode 100644 index 0000000..d3f264b --- /dev/null +++ b/contracts/v1/router/IGtRepayer.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {ITermMaxMarket} from "../ITermMaxMarket.sol"; +/** + * @title TermMax Repayer interface + * @author Term Structure Labs + * @notice Interface for the TermMax Gt Repayer contract + */ + +interface IGtRepayer { + /** + * @notice Repays a GT in a TermMax market + * @param market The TermMax market to repay in + * @param gtId The ID of the GT to repay + * @param maxRepayAmt Maximum amount of tokens to repay + * @param byDebtToken Whether to repay using debt tokens + * @return repayAmt The actual amount repaid + */ + function repayGt(ITermMaxMarket market, uint256 gtId, uint128 maxRepayAmt, bool byDebtToken) + external + returns (uint128 repayAmt); +} diff --git a/contracts/v1/router/TermMaxRouter_Repay_Gt.sol b/contracts/v1/router/TermMaxRouter_Repay_Gt.sol new file mode 100644 index 0000000..0efec5d --- /dev/null +++ b/contracts/v1/router/TermMaxRouter_Repay_Gt.sol @@ -0,0 +1,584 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {IERC721Enumerable} from "@openzeppelin/contracts/interfaces/IERC721Enumerable.sol"; +import {IERC721Receiver} from "@openzeppelin/contracts/interfaces/IERC721Receiver.sol"; +import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; +import { + Ownable2StepUpgradeable, + OwnableUpgradeable +} from "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; + +import {ITermMaxMarket} from "../ITermMaxMarket.sol"; +import {ITermMaxOrder} from "../ITermMaxOrder.sol"; +import {SwapUnit, ISwapAdapter} from "./ISwapAdapter.sol"; +import {RouterErrors} from "../errors/RouterErrors.sol"; +import {RouterEvents} from "../events/RouterEvents.sol"; +import {TransferUtils} from "../lib/TransferUtils.sol"; +import {IFlashLoanReceiver} from "../IFlashLoanReceiver.sol"; +import {IFlashRepayer} from "../tokens/IFlashRepayer.sol"; +import {ITermMaxRouter} from "./ITermMaxRouter.sol"; +import {IGearingToken} from "../tokens/IGearingToken.sol"; +import {CurveCuts} from "../storage/TermMaxStorage.sol"; +import {ISwapCallback} from "../ISwapCallback.sol"; +import {Constants} from "../lib/Constants.sol"; +import {MathLib} from "../lib/MathLib.sol"; +import {IGtRepayer} from "./IGtRepayer.sol"; + +/** + * @title TermMax Router for GT Repayment + * @author Term Structure Labs + * @notice Router contract for repaying GTs + */ +contract TermMaxRouter_Repay_Gt is + UUPSUpgradeable, + Ownable2StepUpgradeable, + PausableUpgradeable, + IFlashLoanReceiver, + IFlashRepayer, + IERC721Receiver, + ITermMaxRouter, + RouterErrors, + RouterEvents, + IGtRepayer +{ + using SafeCast for *; + using TransferUtils for IERC20; + using MathLib for uint256; + + enum FlashLoanType { + COLLATERAL, + DEBT + } + + /// @notice whitelist mapping of adapter + mapping(address => bool) public adapterWhitelist; + + function _authorizeUpgrade(address newImplementation) internal virtual override onlyOwner {} + + function initialize(address admin) public initializer { + __UUPSUpgradeable_init(); + __Pausable_init(); + __Ownable_init(admin); + } + + /** + * @inheritdoc ITermMaxRouter + */ + function setAdapterWhitelist(address adapter, bool isWhitelist) external onlyOwner { + adapterWhitelist[adapter] = isWhitelist; + emit UpdateSwapAdapterWhiteList(adapter, isWhitelist); + } + + /** + * @inheritdoc ITermMaxRouter + */ + function assetsWithERC20Collateral(ITermMaxMarket market, address owner) + external + view + override + returns (IERC20[4] memory tokens, uint256[4] memory balances, address gtAddr, uint256[] memory gtIds) + { + (IERC20 ft, IERC20 xt, IGearingToken gt, address collateral, IERC20 underlying) = market.tokens(); + tokens[0] = ft; + tokens[1] = xt; + tokens[2] = IERC20(collateral); + tokens[3] = underlying; + for (uint256 i = 0; i < 4; ++i) { + balances[i] = tokens[i].balanceOf(owner); + } + gtAddr = address(gt); + uint256 balance = IERC721Enumerable(gtAddr).balanceOf(owner); + gtIds = new uint256[](balance); + for (uint256 i = 0; i < balance; ++i) { + gtIds[i] = IERC721Enumerable(gtAddr).tokenOfOwnerByIndex(owner, i); + } + } + + function swapExactTokenToToken( + IERC20 tokenIn, + IERC20 tokenOut, + address recipient, + ITermMaxOrder[] memory orders, + uint128[] memory tradingAmts, + uint128 minTokenOut, + uint256 deadline + ) external whenNotPaused returns (uint256 netTokenOut) { + uint256 totalAmtIn = sum(tradingAmts); + tokenIn.safeTransferFrom(msg.sender, address(this), totalAmtIn); + netTokenOut = _swapExactTokenToToken(tokenIn, tokenOut, recipient, orders, tradingAmts, minTokenOut, deadline); + emit SwapExactTokenToToken(tokenIn, tokenOut, msg.sender, recipient, orders, tradingAmts, netTokenOut); + } + + function _swapExactTokenToToken( + IERC20 tokenIn, + IERC20 tokenOut, + address recipient, + ITermMaxOrder[] memory orders, + uint128[] memory tradingAmts, + uint128 minTokenOut, + uint256 deadline + ) internal returns (uint256 netTokenOut) { + if (orders.length != tradingAmts.length) revert OrdersAndAmtsLengthNotMatch(); + for (uint256 i = 0; i < orders.length; ++i) { + ITermMaxOrder order = orders[i]; + tokenIn.safeIncreaseAllowance(address(order), tradingAmts[i]); + netTokenOut += order.swapExactTokenToToken(tokenIn, tokenOut, recipient, tradingAmts[i], 0, deadline); + } + if (netTokenOut < minTokenOut) revert InsufficientTokenOut(address(tokenOut), netTokenOut, minTokenOut); + } + + function swapTokenToExactToken( + IERC20 tokenIn, + IERC20 tokenOut, + address recipient, + ITermMaxOrder[] memory orders, + uint128[] memory tradingAmts, + uint128 maxTokenIn, + uint256 deadline + ) external whenNotPaused returns (uint256 netTokenIn) { + tokenIn.safeTransferFrom(msg.sender, address(this), maxTokenIn); + netTokenIn = _swapTokenToExactToken(tokenIn, tokenOut, recipient, orders, tradingAmts, maxTokenIn, deadline); + tokenIn.safeTransfer(msg.sender, maxTokenIn - netTokenIn); + emit SwapTokenToExactToken(tokenIn, tokenOut, msg.sender, recipient, orders, tradingAmts, netTokenIn); + } + + function _swapTokenToExactToken( + IERC20 tokenIn, + IERC20 tokenOut, + address recipient, + ITermMaxOrder[] memory orders, + uint128[] memory tradingAmts, + uint128 maxTokenIn, + uint256 deadline + ) internal returns (uint256 netTokenIn) { + if (orders.length != tradingAmts.length) revert OrdersAndAmtsLengthNotMatch(); + for (uint256 i = 0; i < orders.length; ++i) { + ITermMaxOrder order = orders[i]; + tokenIn.safeIncreaseAllowance(address(order), maxTokenIn); + netTokenIn += + order.swapTokenToExactToken(tokenIn, tokenOut, recipient, tradingAmts[i], maxTokenIn, deadline); + } + if (netTokenIn > maxTokenIn) revert InsufficientTokenIn(address(tokenIn), netTokenIn, maxTokenIn); + } + + function sum(uint128[] memory values) internal pure returns (uint256 total) { + for (uint256 i = 0; i < values.length; ++i) { + total += values[i]; + } + } + + function sellTokens( + address recipient, + ITermMaxMarket market, + uint128 ftInAmt, + uint128 xtInAmt, + ITermMaxOrder[] memory orders, + uint128[] memory amtsToSellTokens, + uint128 minTokenOut, + uint256 deadline + ) external whenNotPaused returns (uint256 netTokenOut) { + (IERC20 ft, IERC20 xt,,, IERC20 debtToken) = market.tokens(); + (uint256 maxBurn, IERC20 toenToSell) = ftInAmt > xtInAmt ? (xtInAmt, ft) : (ftInAmt, xt); + + ft.safeTransferFrom(msg.sender, address(this), ftInAmt); + ft.safeIncreaseAllowance(address(market), maxBurn); + xt.safeTransferFrom(msg.sender, address(this), xtInAmt); + xt.safeIncreaseAllowance(address(market), maxBurn); + market.burn(recipient, maxBurn); + netTokenOut = _swapExactTokenToToken(toenToSell, debtToken, recipient, orders, amtsToSellTokens, 0, deadline); + netTokenOut += maxBurn; + if (netTokenOut < minTokenOut) revert InsufficientTokenOut(address(debtToken), netTokenOut, minTokenOut); + emit SellTokens(market, msg.sender, recipient, ftInAmt, xtInAmt, orders, amtsToSellTokens, netTokenOut); + } + + function leverageFromToken( + address recipient, + ITermMaxMarket market, + ITermMaxOrder[] memory orders, + uint128[] memory amtsToBuyXt, + uint128 minXtOut, + uint128 tokenToSwap, + uint128 maxLtv, + SwapUnit[] memory units, + uint256 deadline + ) external whenNotPaused returns (uint256 gtId, uint256 netXtOut) { + (, IERC20 xt, IGearingToken gt,, IERC20 debtToken) = market.tokens(); + uint256 totalAmtToBuyXt = sum(amtsToBuyXt); + debtToken.safeTransferFrom(msg.sender, address(this), tokenToSwap + totalAmtToBuyXt); + netXtOut = _swapExactTokenToToken(debtToken, xt, address(this), orders, amtsToBuyXt, minXtOut, deadline); + + bytes memory callbackData = abi.encode(address(gt), tokenToSwap, units, FlashLoanType.DEBT); + xt.safeIncreaseAllowance(address(market), netXtOut); + + gtId = market.leverageByXt(recipient, netXtOut.toUint128(), callbackData); + (,, bytes memory collateralData) = gt.loanInfo(gtId); + (, uint128 ltv,) = gt.getLiquidationInfo(gtId); + if (ltv > maxLtv) { + revert LtvBiggerThanExpected(maxLtv, ltv); + } + emit IssueGt(market, gtId, msg.sender, recipient, tokenToSwap, netXtOut.toUint128(), ltv, collateralData); + } + + /** + * @inheritdoc ITermMaxRouter + */ + function leverageFromXt( + address recipient, + ITermMaxMarket market, + uint128 xtInAmt, + uint128 tokenInAmt, + uint128 maxLtv, + SwapUnit[] memory units + ) external whenNotPaused returns (uint256 gtId) { + (, IERC20 xt, IGearingToken gt,, IERC20 debtToken) = market.tokens(); + xt.safeTransferFrom(msg.sender, address(this), xtInAmt); + xt.safeIncreaseAllowance(address(market), xtInAmt); + + debtToken.safeTransferFrom(msg.sender, address(this), tokenInAmt); + + bytes memory callbackData = abi.encode(address(gt), tokenInAmt, units, FlashLoanType.DEBT); + gtId = market.leverageByXt(recipient, xtInAmt.toUint128(), callbackData); + + (,, bytes memory collateralData) = gt.loanInfo(gtId); + (, uint128 ltv,) = gt.getLiquidationInfo(gtId); + if (ltv > maxLtv) { + revert LtvBiggerThanExpected(maxLtv, ltv); + } + emit IssueGt(market, gtId, msg.sender, recipient, tokenInAmt, xtInAmt, ltv, collateralData); + } + + /** + * @inheritdoc ITermMaxRouter + */ + function leverageFromXtAndCollateral( + address recipient, + ITermMaxMarket market, + uint128 xtInAmt, + uint128 collateralInAmt, + uint128 maxLtv, + SwapUnit[] memory units + ) external whenNotPaused returns (uint256 gtId) { + (, IERC20 xt, IGearingToken gt, address collAddr,) = market.tokens(); + IERC20 collateral = IERC20(collAddr); + xt.safeTransferFrom(msg.sender, address(this), xtInAmt); + xt.safeIncreaseAllowance(address(market), xtInAmt); + + collateral.safeTransferFrom(msg.sender, address(this), collateralInAmt); + + bytes memory callbackData = abi.encode(address(gt), 0, units, FlashLoanType.COLLATERAL); + gtId = market.leverageByXt(recipient, xtInAmt.toUint128(), callbackData); + + (,, bytes memory collateralData) = gt.loanInfo(gtId); + (, uint128 ltv,) = gt.getLiquidationInfo(gtId); + if (ltv > maxLtv) { + revert LtvBiggerThanExpected(maxLtv, ltv); + } + emit IssueGt(market, gtId, msg.sender, recipient, 0, xtInAmt, ltv, collateralData); + } + + /** + * @inheritdoc ITermMaxRouter + */ + function borrowTokenFromCollateral( + address recipient, + ITermMaxMarket market, + uint256 collInAmt, + ITermMaxOrder[] memory orders, + uint128[] memory tokenAmtsWantBuy, + uint128 maxDebtAmt, + uint256 deadline + ) external whenNotPaused returns (uint256) { + (IERC20 ft,, IGearingToken gt, address collateralAddr, IERC20 debtToken) = market.tokens(); + IERC20(collateralAddr).safeTransferFrom(msg.sender, address(this), collInAmt); + IERC20(collateralAddr).safeIncreaseAllowance(address(gt), collInAmt); + + (uint256 gtId, uint128 ftOutAmt) = market.issueFt(address(this), maxDebtAmt, _encodeAmount(collInAmt)); + uint256 netTokenIn = + _swapTokenToExactToken(ft, debtToken, recipient, orders, tokenAmtsWantBuy, ftOutAmt, deadline); + uint256 repayAmt = ftOutAmt - netTokenIn; + if (repayAmt > 0) { + ft.safeIncreaseAllowance(address(gt), repayAmt); + gt.repay(gtId, repayAmt.toUint128(), false); + } + + gt.safeTransferFrom(address(this), recipient, gtId); + emit Borrow(market, gtId, msg.sender, recipient, collInAmt, ftOutAmt, netTokenIn.toUint128()); + return gtId; + } + + function borrowTokenFromCollateral(address recipient, ITermMaxMarket market, uint256 collInAmt, uint256 borrowAmt) + external + whenNotPaused + returns (uint256) + { + (IERC20 ft, IERC20 xt, IGearingToken gt, address collateralAddr,) = market.tokens(); + + IERC20(collateralAddr).safeTransferFrom(msg.sender, address(this), collInAmt); + IERC20(collateralAddr).safeIncreaseAllowance(address(gt), collInAmt); + + uint256 mintGtFeeRatio = market.mintGtFeeRatio(); + uint128 debtAmt = ((borrowAmt * Constants.DECIMAL_BASE) / (Constants.DECIMAL_BASE - mintGtFeeRatio)).toUint128(); + + (uint256 gtId, uint128 ftOutAmt) = market.issueFt(address(this), debtAmt, _encodeAmount(collInAmt)); + borrowAmt = borrowAmt.min(ftOutAmt); + xt.safeTransferFrom(msg.sender, address(this), borrowAmt); + + ft.safeIncreaseAllowance(address(market), borrowAmt); + xt.safeIncreaseAllowance(address(market), borrowAmt); + + market.burn(recipient, borrowAmt); + + gt.safeTransferFrom(address(this), recipient, gtId); + emit Borrow(market, gtId, msg.sender, recipient, collInAmt, debtAmt, borrowAmt.toUint128()); + return gtId; + } + + function borrowTokenFromGt(address recipient, ITermMaxMarket market, uint256 gtId, uint256 borrowAmt) + external + whenNotPaused + { + (IERC20 ft, IERC20 xt, IGearingToken gt,,) = market.tokens(); + + if (gt.ownerOf(gtId) != msg.sender) { + revert GtNotOwnedBySender(); + } + + uint256 mintGtFeeRatio = market.mintGtFeeRatio(); + uint128 debtAmt = ((borrowAmt * Constants.DECIMAL_BASE) / (Constants.DECIMAL_BASE - mintGtFeeRatio)).toUint128(); + + uint256 ftOutAmt = market.issueFtByExistedGt(address(this), debtAmt, gtId); + borrowAmt = borrowAmt.min(ftOutAmt); + xt.safeTransferFrom(msg.sender, address(this), borrowAmt); + + ft.safeIncreaseAllowance(address(market), borrowAmt); + xt.safeIncreaseAllowance(address(market), borrowAmt); + market.burn(recipient, borrowAmt); + + emit Borrow(market, gtId, msg.sender, recipient, 0, debtAmt, borrowAmt.toUint128()); + } + + /** + * @inheritdoc ITermMaxRouter + */ + function flashRepayFromColl( + address recipient, + ITermMaxMarket market, + uint256 gtId, + ITermMaxOrder[] memory orders, + uint128[] memory amtsToBuyFt, + bool byDebtToken, + SwapUnit[] memory units, + uint256 deadline + ) external whenNotPaused returns (uint256 netTokenOut) { + (IERC20 ft,, IGearingToken gt,, IERC20 debtToken) = market.tokens(); + gt.safeTransferFrom(msg.sender, address(this), gtId, ""); + gt.flashRepay(gtId, byDebtToken, abi.encode(orders, amtsToBuyFt, ft, units, deadline)); + netTokenOut = debtToken.balanceOf(address(this)); + debtToken.safeTransfer(recipient, netTokenOut); + } + + /** + * @inheritdoc ITermMaxRouter + */ + function repayByTokenThroughFt( + address recipient, + ITermMaxMarket market, + uint256 gtId, + ITermMaxOrder[] memory orders, + uint128[] memory ftAmtsWantBuy, + uint128 maxTokenIn, + uint256 deadline + ) external whenNotPaused returns (uint256 returnAmt) { + (IERC20 ft,, IGearingToken gt,, IERC20 debtToken) = market.tokens(); + + debtToken.safeTransferFrom(msg.sender, address(this), maxTokenIn); + uint256 netCost = + _swapTokenToExactToken(debtToken, ft, address(this), orders, ftAmtsWantBuy, maxTokenIn, deadline); + uint256 totalFtAmt = sum(ftAmtsWantBuy); + (, uint128 repayAmt,) = gt.loanInfo(gtId); + + if (totalFtAmt < repayAmt) { + repayAmt = totalFtAmt.toUint128(); + } + ft.safeIncreaseAllowance(address(gt), repayAmt); + gt.repay(gtId, repayAmt, false); + + returnAmt = maxTokenIn - netCost; + debtToken.safeTransfer(recipient, returnAmt); + if (totalFtAmt > repayAmt) { + ft.safeTransfer(recipient, totalFtAmt - repayAmt); + } + + emit RepayByTokenThroughFt(market, gtId, msg.sender, recipient, repayAmt, returnAmt); + } + + function redeemAndSwap( + address recipient, + ITermMaxMarket market, + uint256 ftAmount, + SwapUnit[] memory units, + uint256 minTokenOut + ) external whenNotPaused returns (uint256) { + (IERC20 ft,,, address collateralAddr, IERC20 debtToken) = market.tokens(); + ft.safeTransferFrom(msg.sender, address(this), ftAmount); + ft.safeIncreaseAllowance(address(market), ftAmount); + (uint256 redeemedAmt, bytes memory collateralData) = market.redeem(ftAmount, address(this)); + redeemedAmt += _decodeAmount(_doSwap(collateralData, units)); + if (redeemedAmt < minTokenOut) { + revert InsufficientTokenOut(address(debtToken), redeemedAmt, minTokenOut); + } + debtToken.safeTransfer(recipient, redeemedAmt); + emit RedeemAndSwap(market, ftAmount, msg.sender, recipient, redeemedAmt); + return redeemedAmt; + } + + function createOrderAndDeposit( + ITermMaxMarket market, + address maker, + uint256 maxXtReserve, + ISwapCallback swapTrigger, + uint256 debtTokenToDeposit, + uint128 ftToDeposit, + uint128 xtToDeposit, + CurveCuts memory curveCuts + ) external whenNotPaused returns (ITermMaxOrder order) { + (IERC20 ft, IERC20 xt,,, IERC20 debtToken) = market.tokens(); + order = market.createOrder(maker, maxXtReserve, swapTrigger, curveCuts); + if (debtTokenToDeposit > 0) { + debtToken.safeTransferFrom(msg.sender, address(this), debtTokenToDeposit); + debtToken.safeIncreaseAllowance(address(market), debtTokenToDeposit); + market.mint(address(order), debtTokenToDeposit); + } + if (ftToDeposit > 0) { + ft.safeTransferFrom(msg.sender, address(order), ftToDeposit); + } + if (xtToDeposit > 0) { + xt.safeTransferFrom(msg.sender, address(order), xtToDeposit); + } + + emit CreateOrderAndDeposit(market, order, maker, debtTokenToDeposit, ftToDeposit, xtToDeposit, curveCuts); + } + + /// @dev Market flash leverage flashloan callback + function executeOperation(address, IERC20, uint256 amount, bytes memory data) + external + returns (bytes memory collateralData) + { + (address gt, uint256 tokenInAmt, SwapUnit[] memory units, FlashLoanType flashLoanType) = + abi.decode(data, (address, uint256, SwapUnit[], FlashLoanType)); + uint256 totalAmount = amount + tokenInAmt; + collateralData = _doSwap(abi.encode(totalAmount), units); + SwapUnit memory lastUnit = units[units.length - 1]; + if (!adapterWhitelist[lastUnit.adapter]) { + revert AdapterNotWhitelisted(lastUnit.adapter); + } + + if (flashLoanType == FlashLoanType.COLLATERAL) { + IERC20 collateral = IERC20(lastUnit.tokenOut); + uint256 collateralBalance = collateral.balanceOf(address(this)); + collateralData = _encodeAmount(collateralBalance); + // approve all collateral if fashloan type is collateral + collateral.safeIncreaseAllowance(gt, collateralBalance); + } else if (flashLoanType == FlashLoanType.DEBT) { + bytes memory approvalData = + abi.encodeCall(ISwapAdapter.approveOutputToken, (lastUnit.tokenOut, gt, collateralData)); + (bool success, bytes memory returnData) = lastUnit.adapter.delegatecall(approvalData); + if (!success) { + revert ApproveTokenFailWhenSwap(lastUnit.tokenOut, returnData); + } + } + } + + function _balanceOf(IERC20 token, address account) internal view returns (uint256) { + return token.balanceOf(account); + } + + function _encodeAmount(uint256 amount) internal pure returns (bytes memory) { + return abi.encode(amount); + } + + function _decodeAmount(bytes memory collateralData) internal pure returns (uint256) { + return abi.decode(collateralData, (uint256)); + } + + /// @dev Gt flash repay flashloan callback + function executeOperation( + IERC20 repayToken, + uint128 debtAmt, + address, + bytes memory collateralData, + bytes memory callbackData + ) external override { + ( + ITermMaxOrder[] memory orders, + uint128[] memory amtsToBuyFt, + IERC20 ft, + SwapUnit[] memory units, + uint256 deadline + ) = abi.decode(callbackData, (ITermMaxOrder[], uint128[], IERC20, SwapUnit[], uint256)); + bytes memory outData = _doSwap(collateralData, units); + + if (address(repayToken) == address(ft)) { + IERC20 debtToken = IERC20(units[units.length - 1].tokenOut); + uint256 amount = abi.decode(outData, (uint256)); + _swapTokenToExactToken(debtToken, ft, address(this), orders, amtsToBuyFt, amount.toUint128(), deadline); + } + repayToken.safeIncreaseAllowance(msg.sender, debtAmt); + } + + function _doSwap(bytes memory inputData, SwapUnit[] memory units) internal returns (bytes memory outData) { + if (units.length == 0) { + revert SwapUnitsIsEmpty(); + } + for (uint256 i = 0; i < units.length; ++i) { + if (!adapterWhitelist[units[i].adapter]) { + revert AdapterNotWhitelisted(units[i].adapter); + } + bytes memory dataToSwap = + abi.encodeCall(ISwapAdapter.swap, (units[i].tokenIn, units[i].tokenOut, inputData, units[i].swapData)); + + (bool success, bytes memory returnData) = units[i].adapter.delegatecall(dataToSwap); + if (!success) { + revert SwapFailed(units[i].adapter, returnData); + } + inputData = abi.decode(returnData, (bytes)); + } + outData = inputData; + } + + function onERC721Received(address, address, uint256, bytes memory) external pure override returns (bytes4) { + return this.onERC721Received.selector; + } + + function pause() external onlyOwner { + _pause(); + } + + function unpause() external onlyOwner { + _unpause(); + } + + function repayGt(ITermMaxMarket market, uint256 gtId, uint128 maxRepayAmt, bool byDebtToken) + external + override + whenNotPaused + returns (uint128 repayAmt) + { + (IERC20 ft,, IGearingToken gt,, IERC20 debtToken) = market.tokens(); + (, uint128 debtAmt,) = gt.loanInfo(gtId); // Ensure gtId is valid + if (maxRepayAmt > debtAmt) { + repayAmt = debtAmt; + } else { + repayAmt = maxRepayAmt; + } + IERC20 repayToken = byDebtToken ? debtToken : ft; + repayToken.safeTransferFrom(msg.sender, address(this), repayAmt); + repayToken.safeIncreaseAllowance(address(gt), repayAmt); + gt.repay(gtId, repayAmt, byDebtToken); + } +} diff --git a/test/v1/Router.t.sol b/test/v1/Router.t.sol index 0ab0876..1fda33e 100644 --- a/test/v1/Router.t.sol +++ b/test/v1/Router.t.sol @@ -21,6 +21,7 @@ import {IGearingToken} from "contracts/v1/tokens/IGearingToken.sol"; import {MockSwapAdapter} from "contracts/v1/test/MockSwapAdapter.sol"; import {SwapUnit, ISwapAdapter} from "contracts/v1/router/ISwapAdapter.sol"; import {RouterErrors, RouterEvents, TermMaxRouter} from "contracts/v1/router/TermMaxRouter.sol"; +import {TermMaxRouter_Repay_Gt} from "contracts/v1/router/TermMaxRouter_Repay_Gt.sol"; import "contracts/v1/storage/TermMaxStorage.sol"; contract RouterTest is Test { @@ -691,4 +692,36 @@ contract RouterTest is Test { ); vm.stopPrank(); } + + function testRepayGt(bool byDebtToken) public { + TermMaxRouter_Repay_Gt repayer = new TermMaxRouter_Repay_Gt(); + vm.startPrank(deployer); + // upgrade res.router to support repayGt + res.router.upgradeToAndCall(address(repayer), bytes("")); + vm.stopPrank(); + + vm.startPrank(sender); + + uint128 debtAmt = 100e8; + uint256 collateralAmt = 1e18; + (uint256 gtId,) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); + + uint128 maxRepayAmt = 50e8; + TermMaxRouter_Repay_Gt routerRepayer = TermMaxRouter_Repay_Gt(address(res.router)); + IERC20 repayToken = byDebtToken ? IERC20(res.debt) : res.ft; + deal(address(repayToken), sender, maxRepayAmt); + repayToken.approve(address(routerRepayer), maxRepayAmt); + uint128 repayAmt = routerRepayer.repayGt(res.market, gtId, maxRepayAmt, byDebtToken); + assertEq(repayAmt, maxRepayAmt); + assertEq(repayToken.balanceOf(sender), 0); + + maxRepayAmt = 100e8; + deal(address(repayToken), sender, maxRepayAmt); + repayToken.approve(address(routerRepayer), maxRepayAmt); + repayAmt = routerRepayer.repayGt(res.market, gtId, maxRepayAmt, byDebtToken); + + assertEq(repayAmt, 50e8); + assertEq(repayToken.balanceOf(sender), 50e8); + assertEq(res.collateral.balanceOf(sender), collateralAmt); + } } From 0e9419881735dacf050696b808a5e24120273b52 Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 24 Jun 2025 13:12:04 +0800 Subject: [PATCH 111/194] upgrade script --- .../deploy/UpgradeRouterForRepayingGt.s.sol | 106 ++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 script/deploy/UpgradeRouterForRepayingGt.s.sol diff --git a/script/deploy/UpgradeRouterForRepayingGt.s.sol b/script/deploy/UpgradeRouterForRepayingGt.s.sol new file mode 100644 index 0000000..35972b1 --- /dev/null +++ b/script/deploy/UpgradeRouterForRepayingGt.s.sol @@ -0,0 +1,106 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {Script} from "forge-std/Script.sol"; +import {VmSafe} from "forge-std/Vm.sol"; +import "forge-std/console.sol"; +import {TermMaxFactory} from "contracts/v1/factory/TermMaxFactory.sol"; +import {ITermMaxFactory} from "contracts/v1/factory/ITermMaxFactory.sol"; +import {ITermMaxRouter} from "contracts/v1/router/ITermMaxRouter.sol"; +import {MarketViewer} from "contracts/v1/router/MarketViewer.sol"; +import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import {TermMaxMarket} from "contracts/v1/TermMaxMarket.sol"; +import {MockERC20} from "contracts/v1/test/MockERC20.sol"; +import {MockPriceFeed} from "contracts/v1/test/MockPriceFeed.sol"; +import {MarketConfig} from "contracts/v1/storage/TermMaxStorage.sol"; +import {IMintableERC20} from "contracts/v1/tokens/IMintableERC20.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import {SwapAdapter} from "contracts/v1/test/testnet/SwapAdapter.sol"; +import {Faucet} from "contracts/v1/test/testnet/Faucet.sol"; +import {DeployBase} from "./DeployBase.s.sol"; +import {IOracle} from "contracts/v1/oracle/IOracle.sol"; +import {VaultFactory, IVaultFactory} from "contracts/v1/factory/VaultFactory.sol"; +import {AccessManager} from "contracts/v1/access/AccessManager.sol"; +import {UniswapV3AdapterV2} from "contracts/v1/router/specAdapters/UniswapV3AdapterV2.sol"; +import {OdosV2AdapterV2} from "contracts/v1/router/specAdapters/OdosV2AdapterV2.sol"; +import {PendleSwapV3AdapterV2} from "contracts/v1/router/specAdapters/PendleSwapV3AdapterV2.sol"; +import {ERC4626VaultAdapterV2} from "contracts/v1/router/specAdapters/ERC4626VaultAdapterV2.sol"; +import {TermMaxRouter_Repay_Gt, UUPSUpgradeable} from "contracts/v1/router/TermMaxRouter_Repay_Gt.sol"; + +contract UpgradeRouterForRepayingGt is DeployBase { + // Network-specific config loaded from environment variables + string network; + uint256 deployerPrivateKey; + address deployerAddr; + address adminAddr; + address accessManagerAddr; + address uniswapV3RouterAddr; + address odosV2RouterAddr; + address pendleSwapV3RouterAddr; + address routerAddr; + + AccessManager accessManager; + ITermMaxRouter router; + + function setUp() public { + // Load network from environment variable + network = vm.envString("NETWORK"); + string memory networkUpper = toUpper(network); + + // Load network-specific configuration + string memory privateKeyVar = string.concat(networkUpper, "_DEPLOYER_PRIVATE_KEY"); + string memory adminVar = string.concat(networkUpper, "_ADMIN_ADDRESS"); + + deployerPrivateKey = vm.envUint(privateKeyVar); + deployerAddr = vm.addr(deployerPrivateKey); + adminAddr = vm.envAddress(adminVar); + + string memory deploymentPath = + string.concat(vm.projectRoot(), "/deployments/", network, "/", network, "-access-manager.json"); + string memory json = vm.readFile(deploymentPath); + accessManagerAddr = vm.parseJsonAddress(json, ".contracts.accessManager"); + + deploymentPath = string.concat(vm.projectRoot(), "/deployments/", network, "/", network, "-core.json"); + json = vm.readFile(deploymentPath); + routerAddr = vm.parseJsonAddress(json, ".contracts.router"); + } + + function run() public { + console.log("Network:", network); + console.log("Deployer balance:", deployerAddr.balance); + console.log("Git commit hash:"); + console.logBytes(getGitCommitHash()); + + uint256 currentBlock = block.number; + uint256 currentTimestamp = block.timestamp; + + vm.startBroadcast(deployerPrivateKey); + if ( + keccak256(abi.encodePacked(network)) == keccak256(abi.encodePacked("eth-mainnet")) + || keccak256(abi.encodePacked(network)) == keccak256(abi.encodePacked("arb-mainnet")) + || keccak256(abi.encodePacked(network)) == keccak256(abi.encodePacked("bnb-mainnet")) + ) { + accessManager = AccessManager(accessManagerAddr); + TermMaxRouter_Repay_Gt newRouter = new TermMaxRouter_Repay_Gt(); + console.log("Deploying new router at:", address(newRouter)); + accessManager.upgradeSubContract(UUPSUpgradeable(routerAddr), address(newRouter), bytes("")); + } else { + revert("This script is only for mainnet deployments"); + } + vm.stopBroadcast(); + + console.log("===== Git Info ====="); + console.log("Git branch:", getGitBranch()); + console.log(); + + console.log("===== Block Info ====="); + console.log("Block number:", currentBlock); + console.log("Block timestamp:", currentTimestamp); + console.log(); + + console.log("===== Core Info ====="); + console.log("Use access manager:", accessManagerAddr); + console.log("Use router:", routerAddr); + } +} From e94e05abc393ac0a11f4566cd5ef80a171cbaab7 Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 26 Jun 2025 10:56:51 +0800 Subject: [PATCH 112/194] fix issue 4 --- contracts/v2/errors/VaultErrorsV2.sol | 2 ++ contracts/v2/vault/OrderManagerV2.sol | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/contracts/v2/errors/VaultErrorsV2.sol b/contracts/v2/errors/VaultErrorsV2.sol index 2186256..b1865ca 100644 --- a/contracts/v2/errors/VaultErrorsV2.sol +++ b/contracts/v2/errors/VaultErrorsV2.sol @@ -6,6 +6,8 @@ pragma solidity ^0.8.0; * @author Term Structure Labs */ interface VaultErrorsV2 { + /// @notice Error thrown when the parameters of updating orders are invalid + error ArrayLengthMismatch(); /// @notice Error thrown when dealing unexpected collateral error CollateralIsAsset(); /// @notice Error thrown when an invalid or unsupported functions is called diff --git a/contracts/v2/vault/OrderManagerV2.sol b/contracts/v2/vault/OrderManagerV2.sol index e8cd174..0970475 100644 --- a/contracts/v2/vault/OrderManagerV2.sol +++ b/contracts/v2/vault/OrderManagerV2.sol @@ -56,6 +56,11 @@ contract OrderManagerV2 is VaultStorageV2, VaultErrors, VaultEvents, IOrderManag uint256[] memory maxSupplies, CurveCuts[] memory curveCuts ) external override onlyProxy { + uint256 length = orders.length; + if (length != changes.length || length != maxSupplies.length || length != curveCuts.length) { + revert VaultErrorsV2.ArrayLengthMismatch(); + } + _accruedInterest(); int256 totalChanges = 0; for (uint256 i = 0; i < orders.length; ++i) { From 28a1506a721ba908fede382497a2c588169f9baf Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 26 Jun 2025 11:00:02 +0800 Subject: [PATCH 113/194] fix issues 5 --- contracts/v2/vault/OrderManagerV2.sol | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/contracts/v2/vault/OrderManagerV2.sol b/contracts/v2/vault/OrderManagerV2.sol index 0970475..fbac1ad 100644 --- a/contracts/v2/vault/OrderManagerV2.sol +++ b/contracts/v2/vault/OrderManagerV2.sol @@ -179,25 +179,19 @@ contract OrderManagerV2 is VaultStorageV2, VaultErrors, VaultEvents, IOrderManag */ function withdrawAssets(IERC20 asset, address recipient, uint256 amount) external override onlyProxy { _accruedInterest(); - uint256 assetBalance = asset.balanceOf(address(this)); - if (assetBalance >= amount) { - asset.safeTransfer(recipient, amount); - } else { - revert InsufficientFunds(assetBalance, amount); - } uint256 amplifiedAmt = amount * Constants.DECIMAL_BASE_SQ; _totalFt -= amplifiedAmt; _accretingPrincipal -= amplifiedAmt; + + asset.safeTransfer(recipient, amount); } function _withdrawPerformanceFee(IERC20 asset, address recipient, uint256 amount) internal { uint256 amplifiedAmt = amount * Constants.DECIMAL_BASE_SQ; - if (amplifiedAmt > _performanceFee) { - revert InsufficientFunds(_performanceFee / Constants.DECIMAL_BASE_SQ, amount); - } - asset.safeTransfer(recipient, amount); _performanceFee -= amplifiedAmt; _totalFt -= amplifiedAmt; + + asset.safeTransfer(recipient, amount); emit WithdrawPerformanceFee(msg.sender, recipient, amount); } From c6cbea85f4ff27ba77585425ed0cca6c31e8f536 Mon Sep 17 00:00:00 2001 From: Vincent Date: Thu, 26 Jun 2025 11:16:12 +0800 Subject: [PATCH 114/194] deploy USDC/SPK market --- .../DeployMarket.s.sol/1/run-1750907511.json | 222 ++++++++++++++++++ .../DeployMarket.s.sol/1/run-latest.json | 188 +++++++-------- ...eth-mainnet-market-USDC-SPK@05JUL2025.json | 38 +++ script/deploy/deploydata/eth-mainnet.json | 22 +- 4 files changed, 365 insertions(+), 105 deletions(-) create mode 100644 broadcast/DeployMarket.s.sol/1/run-1750907511.json create mode 100644 deployments/eth-mainnet/eth-mainnet-market-USDC-SPK@05JUL2025.json diff --git a/broadcast/DeployMarket.s.sol/1/run-1750907511.json b/broadcast/DeployMarket.s.sol/1/run-1750907511.json new file mode 100644 index 0000000..330a12f --- /dev/null +++ b/broadcast/DeployMarket.s.sol/1/run-1750907511.json @@ -0,0 +1,222 @@ +{ + "transactions": [ + { + "hash": "0x5638fe1ddc54f99eff2649249929d45ecb177e89906309b719f2350a6bddee3d", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "gas": "0x161ce5", + "value": "0x0", + "input": "0xdc496c2000000000000000000000000037ba9934aaba7a49cc29d0952c6a91d7c7043dbcd9eb2aaa5f19c272f06ea2b4c8449687a8c2ac90aa2cfba9b3c9de0dca6ca69500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c20059e0317de91738d13af027dfc4a50781b066000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000da4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000719e77027952929ed3060dbffc5d43ec50c1cf790000000000000000000000000000000000000000000000000000000068686b0000000000000000000000000000000000000000000000000000000000001e848000000000000000000000000000000000000000000000000000000000001e848000000000000000000000000000000000000000000000000000000000002dc6c000000000000000000000000000000000000000000000000000000000002dc6c0000000000000000000000000000000000000000000000000000000000098968000000000000000000000000000000000000000000000000000000000005b8d80000000000000000000000000e3a31690392e8e18dc3d862651c079339e2c1ade00000000000000000000000000000000000000000000000000000000042c1d8000000000000000000000000000000000000000000000000000000000039387000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000295be96e640669720000000000000000000000000000000000000000000000000000000000000000000012555344432f53504b4030354a554c3230323500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012555344432f53504b4030354a554c323032350000000000000000000000000000", + "nonce": "0x36f", + "chainId": "0x1" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x6b24654f5154214d1a39b09ae0e2342bb48efe08", + "initCode": "0x3d602d80600a3d3981f3363d3d373d3d3d363d73883192efdd5a3417b2c0a14b25f7536b2018f8535af43d82803e903d91602b57fd5bf3" + }, + { + "transactionType": "CREATE", + "address": "0xef73a3623a6c23c0271c4fc798cb6a745e211487", + "initCode": "0x3d602d80600a3d3981f3363d3d373d3d3d363d73a715005c1a8524c0790029153b8a860f96a2a8565af43d82803e903d91602b57fd5bf3" + }, + { + "transactionType": "CREATE", + "address": "0xa11a440e7720c55caaf5b2155b172e6f32339813", + "initCode": "0x3d602d80600a3d3981f3363d3d373d3d3d363d73a715005c1a8524c0790029153b8a860f96a2a8565af43d82803e903d91602b57fd5bf3" + }, + { + "transactionType": "CREATE", + "address": "0x72036ace0d05c6de44a3bd0ff47f59f41efa386e", + "initCode": "0x3d602d80600a3d3981f3363d3d373d3d3d363d738a2e5bfe2c0b1930575c75a61aad0d81baf93daa5af43d82803e903d91602b57fd5bf3" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x71a95f", + "logs": [ + { + "address": "0x6b24654f5154214d1a39b09ae0e2342bb48efe08", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000da4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf" + ], + "data": "0x", + "blockHash": "0xee108a4a662158ecab6e7ac0389cbc2eab60be61f9d6467ea3bb18af4db56f2a", + "blockNumber": "0x15baf38", + "blockTimestamp": "0x685cba73", + "transactionHash": "0x5638fe1ddc54f99eff2649249929d45ecb177e89906309b719f2350a6bddee3d", + "transactionIndex": "0x4c", + "logIndex": "0xa2", + "removed": false + }, + { + "address": "0xef73a3623a6c23c0271c4fc798cb6a745e211487", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000006b24654f5154214d1a39b09ae0e2342bb48efe08" + ], + "data": "0x", + "blockHash": "0xee108a4a662158ecab6e7ac0389cbc2eab60be61f9d6467ea3bb18af4db56f2a", + "blockNumber": "0x15baf38", + "blockTimestamp": "0x685cba73", + "transactionHash": "0x5638fe1ddc54f99eff2649249929d45ecb177e89906309b719f2350a6bddee3d", + "transactionIndex": "0x4c", + "logIndex": "0xa3", + "removed": false + }, + { + "address": "0xef73a3623a6c23c0271c4fc798cb6a745e211487", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xee108a4a662158ecab6e7ac0389cbc2eab60be61f9d6467ea3bb18af4db56f2a", + "blockNumber": "0x15baf38", + "blockTimestamp": "0x685cba73", + "transactionHash": "0x5638fe1ddc54f99eff2649249929d45ecb177e89906309b719f2350a6bddee3d", + "transactionIndex": "0x4c", + "logIndex": "0xa4", + "removed": false + }, + { + "address": "0xa11a440e7720c55caaf5b2155b172e6f32339813", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000006b24654f5154214d1a39b09ae0e2342bb48efe08" + ], + "data": "0x", + "blockHash": "0xee108a4a662158ecab6e7ac0389cbc2eab60be61f9d6467ea3bb18af4db56f2a", + "blockNumber": "0x15baf38", + "blockTimestamp": "0x685cba73", + "transactionHash": "0x5638fe1ddc54f99eff2649249929d45ecb177e89906309b719f2350a6bddee3d", + "transactionIndex": "0x4c", + "logIndex": "0xa5", + "removed": false + }, + { + "address": "0xa11a440e7720c55caaf5b2155b172e6f32339813", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xee108a4a662158ecab6e7ac0389cbc2eab60be61f9d6467ea3bb18af4db56f2a", + "blockNumber": "0x15baf38", + "blockTimestamp": "0x685cba73", + "transactionHash": "0x5638fe1ddc54f99eff2649249929d45ecb177e89906309b719f2350a6bddee3d", + "transactionIndex": "0x4c", + "logIndex": "0xa6", + "removed": false + }, + { + "address": "0x72036ace0d05c6de44a3bd0ff47f59f41efa386e", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000006b24654f5154214d1a39b09ae0e2342bb48efe08" + ], + "data": "0x", + "blockHash": "0xee108a4a662158ecab6e7ac0389cbc2eab60be61f9d6467ea3bb18af4db56f2a", + "blockNumber": "0x15baf38", + "blockTimestamp": "0x685cba73", + "transactionHash": "0x5638fe1ddc54f99eff2649249929d45ecb177e89906309b719f2350a6bddee3d", + "transactionIndex": "0x4c", + "logIndex": "0xa7", + "removed": false + }, + { + "address": "0x72036ace0d05c6de44a3bd0ff47f59f41efa386e", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xee108a4a662158ecab6e7ac0389cbc2eab60be61f9d6467ea3bb18af4db56f2a", + "blockNumber": "0x15baf38", + "blockTimestamp": "0x685cba73", + "transactionHash": "0x5638fe1ddc54f99eff2649249929d45ecb177e89906309b719f2350a6bddee3d", + "transactionIndex": "0x4c", + "logIndex": "0xa8", + "removed": false + }, + { + "address": "0x6b24654f5154214d1a39b09ae0e2342bb48efe08", + "topics": [ + "0x923c07a7269eb05c7b48c4002081d856ef37b3cbc4c2bae12d7493178477e306", + "0x000000000000000000000000c20059e0317de91738d13af027dfc4a50781b066", + "0x000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000068686b00000000000000000000000000ef73a3623a6c23c0271c4fc798cb6a745e211487000000000000000000000000a11a440e7720c55caaf5b2155b172e6f3233981300000000000000000000000072036ace0d05c6de44a3bd0ff47f59f41efa386e", + "blockHash": "0xee108a4a662158ecab6e7ac0389cbc2eab60be61f9d6467ea3bb18af4db56f2a", + "blockNumber": "0x15baf38", + "blockTimestamp": "0x685cba73", + "transactionHash": "0x5638fe1ddc54f99eff2649249929d45ecb177e89906309b719f2350a6bddee3d", + "transactionIndex": "0x4c", + "logIndex": "0xa9", + "removed": false + }, + { + "address": "0x6b24654f5154214d1a39b09ae0e2342bb48efe08", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xee108a4a662158ecab6e7ac0389cbc2eab60be61f9d6467ea3bb18af4db56f2a", + "blockNumber": "0x15baf38", + "blockTimestamp": "0x685cba73", + "transactionHash": "0x5638fe1ddc54f99eff2649249929d45ecb177e89906309b719f2350a6bddee3d", + "transactionIndex": "0x4c", + "logIndex": "0xaa", + "removed": false + }, + { + "address": "0x37ba9934aaba7a49cc29d0952c6a91d7c7043dbc", + "topics": [ + "0x3f53d2c2743b2b162c0aa5d678be4058d3ae2043700424be52c04105df3e2411", + "0x0000000000000000000000006b24654f5154214d1a39b09ae0e2342bb48efe08", + "0x000000000000000000000000c20059e0317de91738d13af027dfc4a50781b066", + "0x000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48" + ], + "data": "0x", + "blockHash": "0xee108a4a662158ecab6e7ac0389cbc2eab60be61f9d6467ea3bb18af4db56f2a", + "blockNumber": "0x15baf38", + "blockTimestamp": "0x685cba73", + "transactionHash": "0x5638fe1ddc54f99eff2649249929d45ecb177e89906309b719f2350a6bddee3d", + "transactionIndex": "0x4c", + "logIndex": "0xab", + "removed": false + } + ], + "logsBloom": "0x00000014000000000000008000000000010000000000000000a10080000000000000008000000000000002000410008000000000000000000000004000000000000080000000000000000000000000000001000000008000000000000000080200000004020001000000000000000801000008000000000000040000000000400000000000002000000800000010000200000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000010000000000000000000004000000000000000020000000000000020200a00000000000000004000000000000000000002000000000", + "type": "0x2", + "transactionHash": "0x5638fe1ddc54f99eff2649249929d45ecb177e89906309b719f2350a6bddee3d", + "transactionIndex": "0x4c", + "blockHash": "0xee108a4a662158ecab6e7ac0389cbc2eab60be61f9d6467ea3bb18af4db56f2a", + "blockNumber": "0x15baf38", + "gasUsed": "0xf1eb3", + "effectiveGasPrice": "0x852e900d", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "contractAddress": null + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1750907511, + "chain": 1, + "commit": "0e94198" +} \ No newline at end of file diff --git a/broadcast/DeployMarket.s.sol/1/run-latest.json b/broadcast/DeployMarket.s.sol/1/run-latest.json index 605dbbb..330a12f 100644 --- a/broadcast/DeployMarket.s.sol/1/run-latest.json +++ b/broadcast/DeployMarket.s.sol/1/run-latest.json @@ -1,7 +1,7 @@ { "transactions": [ { - "hash": "0x4bd6bc5824a7b615c2163bb893ac1cfbf804991780696e41d41afaaf0c2391c1", + "hash": "0x5638fe1ddc54f99eff2649249929d45ecb177e89906309b719f2350a6bddee3d", "transactionType": "CALL", "contractName": "ERC1967Proxy", "contractAddress": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", @@ -10,31 +10,31 @@ "transaction": { "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", - "gas": "0x1a8513", + "gas": "0x161ce5", "value": "0x0", - "input": "0xdc496c2000000000000000000000000037ba9934aaba7a49cc29d0952c6a91d7c7043dbcd9eb2aaa5f19c272f06ea2b4c8449687a8c2ac90aa2cfba9b3c9de0dca6ca69500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b10da2f9147f9cf2b8826877cd0c95c18a0f42dc000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000da4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000719e77027952929ed3060dbffc5d43ec50c1cf7900000000000000000000000000000000000000000000000000000000691fab8000000000000000000000000000000000000000000000000000000000001e848000000000000000000000000000000000000000000000000000000000001e848000000000000000000000000000000000000000000000000000000000002dc6c000000000000000000000000000000000000000000000000000000000002dc6c0000000000000000000000000000000000000000000000000000000000098968000000000000000000000000000000000000000000000000000000000005b8d80000000000000000000000000e3a31690392e8e18dc3d862651c079339e2c1ade0000000000000000000000000000000000000000000000000000000005742de000000000000000000000000000000000000000000000000000000000053724e00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000422ca8b0a00a4250000000000000000000000000000000000000000000000000000000000000000000021555344432f50542d635553444f2d32304e4f56323032354032314e4f5632303235000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021555344432f50542d635553444f2d32304e4f56323032354032314e4f563230323500000000000000000000000000000000000000000000000000000000000000", - "nonce": "0x36b", + "input": "0xdc496c2000000000000000000000000037ba9934aaba7a49cc29d0952c6a91d7c7043dbcd9eb2aaa5f19c272f06ea2b4c8449687a8c2ac90aa2cfba9b3c9de0dca6ca69500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c20059e0317de91738d13af027dfc4a50781b066000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000da4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000719e77027952929ed3060dbffc5d43ec50c1cf790000000000000000000000000000000000000000000000000000000068686b0000000000000000000000000000000000000000000000000000000000001e848000000000000000000000000000000000000000000000000000000000001e848000000000000000000000000000000000000000000000000000000000002dc6c000000000000000000000000000000000000000000000000000000000002dc6c0000000000000000000000000000000000000000000000000000000000098968000000000000000000000000000000000000000000000000000000000005b8d80000000000000000000000000e3a31690392e8e18dc3d862651c079339e2c1ade00000000000000000000000000000000000000000000000000000000042c1d8000000000000000000000000000000000000000000000000000000000039387000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000295be96e640669720000000000000000000000000000000000000000000000000000000000000000000012555344432f53504b4030354a554c3230323500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012555344432f53504b4030354a554c323032350000000000000000000000000000", + "nonce": "0x36f", "chainId": "0x1" }, "additionalContracts": [ { "transactionType": "CREATE2", - "address": "0xb8d33503a851d2d44e02f14fb0321e900c7a89ac", + "address": "0x6b24654f5154214d1a39b09ae0e2342bb48efe08", "initCode": "0x3d602d80600a3d3981f3363d3d373d3d3d363d73883192efdd5a3417b2c0a14b25f7536b2018f8535af43d82803e903d91602b57fd5bf3" }, { "transactionType": "CREATE", - "address": "0x52d0713604f23383063ce89cf36801428b0136b8", + "address": "0xef73a3623a6c23c0271c4fc798cb6a745e211487", "initCode": "0x3d602d80600a3d3981f3363d3d373d3d3d363d73a715005c1a8524c0790029153b8a860f96a2a8565af43d82803e903d91602b57fd5bf3" }, { "transactionType": "CREATE", - "address": "0x5aa72d45b2b6381b87eb407288920e3fc4c0e9c3", + "address": "0xa11a440e7720c55caaf5b2155b172e6f32339813", "initCode": "0x3d602d80600a3d3981f3363d3d373d3d3d363d73a715005c1a8524c0790029153b8a860f96a2a8565af43d82803e903d91602b57fd5bf3" }, { "transactionType": "CREATE", - "address": "0x424a1e95eaad4e768dc925679c63ba230552965b", + "address": "0x72036ace0d05c6de44a3bd0ff47f59f41efa386e", "initCode": "0x3d602d80600a3d3981f3363d3d373d3d3d363d738a2e5bfe2c0b1930575c75a61aad0d81baf93daa5af43d82803e903d91602b57fd5bf3" } ], @@ -44,170 +44,170 @@ "receipts": [ { "status": "0x1", - "cumulativeGasUsed": "0x3aac54", + "cumulativeGasUsed": "0x71a95f", "logs": [ { - "address": "0xb8d33503a851d2d44e02f14fb0321e900c7a89ac", + "address": "0x6b24654f5154214d1a39b09ae0e2342bb48efe08", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x000000000000000000000000da4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf" ], "data": "0x", - "blockHash": "0x9cb4bcfb8c1f1915ca773349d068f5c955302315a7c46c6f3b98f6ad3738e302", - "blockNumber": "0x15b2428", - "blockTimestamp": "0x68562b4b", - "transactionHash": "0x4bd6bc5824a7b615c2163bb893ac1cfbf804991780696e41d41afaaf0c2391c1", - "transactionIndex": "0x31", - "logIndex": "0x37", + "blockHash": "0xee108a4a662158ecab6e7ac0389cbc2eab60be61f9d6467ea3bb18af4db56f2a", + "blockNumber": "0x15baf38", + "blockTimestamp": "0x685cba73", + "transactionHash": "0x5638fe1ddc54f99eff2649249929d45ecb177e89906309b719f2350a6bddee3d", + "transactionIndex": "0x4c", + "logIndex": "0xa2", "removed": false }, { - "address": "0x52d0713604f23383063ce89cf36801428b0136b8", + "address": "0xef73a3623a6c23c0271c4fc798cb6a745e211487", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000b8d33503a851d2d44e02f14fb0321e900c7a89ac" + "0x0000000000000000000000006b24654f5154214d1a39b09ae0e2342bb48efe08" ], "data": "0x", - "blockHash": "0x9cb4bcfb8c1f1915ca773349d068f5c955302315a7c46c6f3b98f6ad3738e302", - "blockNumber": "0x15b2428", - "blockTimestamp": "0x68562b4b", - "transactionHash": "0x4bd6bc5824a7b615c2163bb893ac1cfbf804991780696e41d41afaaf0c2391c1", - "transactionIndex": "0x31", - "logIndex": "0x38", + "blockHash": "0xee108a4a662158ecab6e7ac0389cbc2eab60be61f9d6467ea3bb18af4db56f2a", + "blockNumber": "0x15baf38", + "blockTimestamp": "0x685cba73", + "transactionHash": "0x5638fe1ddc54f99eff2649249929d45ecb177e89906309b719f2350a6bddee3d", + "transactionIndex": "0x4c", + "logIndex": "0xa3", "removed": false }, { - "address": "0x52d0713604f23383063ce89cf36801428b0136b8", + "address": "0xef73a3623a6c23c0271c4fc798cb6a745e211487", "topics": [ "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" ], "data": "0x0000000000000000000000000000000000000000000000000000000000000001", - "blockHash": "0x9cb4bcfb8c1f1915ca773349d068f5c955302315a7c46c6f3b98f6ad3738e302", - "blockNumber": "0x15b2428", - "blockTimestamp": "0x68562b4b", - "transactionHash": "0x4bd6bc5824a7b615c2163bb893ac1cfbf804991780696e41d41afaaf0c2391c1", - "transactionIndex": "0x31", - "logIndex": "0x39", + "blockHash": "0xee108a4a662158ecab6e7ac0389cbc2eab60be61f9d6467ea3bb18af4db56f2a", + "blockNumber": "0x15baf38", + "blockTimestamp": "0x685cba73", + "transactionHash": "0x5638fe1ddc54f99eff2649249929d45ecb177e89906309b719f2350a6bddee3d", + "transactionIndex": "0x4c", + "logIndex": "0xa4", "removed": false }, { - "address": "0x5aa72d45b2b6381b87eb407288920e3fc4c0e9c3", + "address": "0xa11a440e7720c55caaf5b2155b172e6f32339813", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000b8d33503a851d2d44e02f14fb0321e900c7a89ac" + "0x0000000000000000000000006b24654f5154214d1a39b09ae0e2342bb48efe08" ], "data": "0x", - "blockHash": "0x9cb4bcfb8c1f1915ca773349d068f5c955302315a7c46c6f3b98f6ad3738e302", - "blockNumber": "0x15b2428", - "blockTimestamp": "0x68562b4b", - "transactionHash": "0x4bd6bc5824a7b615c2163bb893ac1cfbf804991780696e41d41afaaf0c2391c1", - "transactionIndex": "0x31", - "logIndex": "0x3a", + "blockHash": "0xee108a4a662158ecab6e7ac0389cbc2eab60be61f9d6467ea3bb18af4db56f2a", + "blockNumber": "0x15baf38", + "blockTimestamp": "0x685cba73", + "transactionHash": "0x5638fe1ddc54f99eff2649249929d45ecb177e89906309b719f2350a6bddee3d", + "transactionIndex": "0x4c", + "logIndex": "0xa5", "removed": false }, { - "address": "0x5aa72d45b2b6381b87eb407288920e3fc4c0e9c3", + "address": "0xa11a440e7720c55caaf5b2155b172e6f32339813", "topics": [ "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" ], "data": "0x0000000000000000000000000000000000000000000000000000000000000001", - "blockHash": "0x9cb4bcfb8c1f1915ca773349d068f5c955302315a7c46c6f3b98f6ad3738e302", - "blockNumber": "0x15b2428", - "blockTimestamp": "0x68562b4b", - "transactionHash": "0x4bd6bc5824a7b615c2163bb893ac1cfbf804991780696e41d41afaaf0c2391c1", - "transactionIndex": "0x31", - "logIndex": "0x3b", + "blockHash": "0xee108a4a662158ecab6e7ac0389cbc2eab60be61f9d6467ea3bb18af4db56f2a", + "blockNumber": "0x15baf38", + "blockTimestamp": "0x685cba73", + "transactionHash": "0x5638fe1ddc54f99eff2649249929d45ecb177e89906309b719f2350a6bddee3d", + "transactionIndex": "0x4c", + "logIndex": "0xa6", "removed": false }, { - "address": "0x424a1e95eaad4e768dc925679c63ba230552965b", + "address": "0x72036ace0d05c6de44a3bd0ff47f59f41efa386e", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000b8d33503a851d2d44e02f14fb0321e900c7a89ac" + "0x0000000000000000000000006b24654f5154214d1a39b09ae0e2342bb48efe08" ], "data": "0x", - "blockHash": "0x9cb4bcfb8c1f1915ca773349d068f5c955302315a7c46c6f3b98f6ad3738e302", - "blockNumber": "0x15b2428", - "blockTimestamp": "0x68562b4b", - "transactionHash": "0x4bd6bc5824a7b615c2163bb893ac1cfbf804991780696e41d41afaaf0c2391c1", - "transactionIndex": "0x31", - "logIndex": "0x3c", + "blockHash": "0xee108a4a662158ecab6e7ac0389cbc2eab60be61f9d6467ea3bb18af4db56f2a", + "blockNumber": "0x15baf38", + "blockTimestamp": "0x685cba73", + "transactionHash": "0x5638fe1ddc54f99eff2649249929d45ecb177e89906309b719f2350a6bddee3d", + "transactionIndex": "0x4c", + "logIndex": "0xa7", "removed": false }, { - "address": "0x424a1e95eaad4e768dc925679c63ba230552965b", + "address": "0x72036ace0d05c6de44a3bd0ff47f59f41efa386e", "topics": [ "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" ], "data": "0x0000000000000000000000000000000000000000000000000000000000000001", - "blockHash": "0x9cb4bcfb8c1f1915ca773349d068f5c955302315a7c46c6f3b98f6ad3738e302", - "blockNumber": "0x15b2428", - "blockTimestamp": "0x68562b4b", - "transactionHash": "0x4bd6bc5824a7b615c2163bb893ac1cfbf804991780696e41d41afaaf0c2391c1", - "transactionIndex": "0x31", - "logIndex": "0x3d", + "blockHash": "0xee108a4a662158ecab6e7ac0389cbc2eab60be61f9d6467ea3bb18af4db56f2a", + "blockNumber": "0x15baf38", + "blockTimestamp": "0x685cba73", + "transactionHash": "0x5638fe1ddc54f99eff2649249929d45ecb177e89906309b719f2350a6bddee3d", + "transactionIndex": "0x4c", + "logIndex": "0xa8", "removed": false }, { - "address": "0xb8d33503a851d2d44e02f14fb0321e900c7a89ac", + "address": "0x6b24654f5154214d1a39b09ae0e2342bb48efe08", "topics": [ "0x923c07a7269eb05c7b48c4002081d856ef37b3cbc4c2bae12d7493178477e306", - "0x000000000000000000000000b10da2f9147f9cf2b8826877cd0c95c18a0f42dc", + "0x000000000000000000000000c20059e0317de91738d13af027dfc4a50781b066", "0x000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48" ], - "data": "0x00000000000000000000000000000000000000000000000000000000691fab8000000000000000000000000052d0713604f23383063ce89cf36801428b0136b80000000000000000000000005aa72d45b2b6381b87eb407288920e3fc4c0e9c3000000000000000000000000424a1e95eaad4e768dc925679c63ba230552965b", - "blockHash": "0x9cb4bcfb8c1f1915ca773349d068f5c955302315a7c46c6f3b98f6ad3738e302", - "blockNumber": "0x15b2428", - "blockTimestamp": "0x68562b4b", - "transactionHash": "0x4bd6bc5824a7b615c2163bb893ac1cfbf804991780696e41d41afaaf0c2391c1", - "transactionIndex": "0x31", - "logIndex": "0x3e", + "data": "0x0000000000000000000000000000000000000000000000000000000068686b00000000000000000000000000ef73a3623a6c23c0271c4fc798cb6a745e211487000000000000000000000000a11a440e7720c55caaf5b2155b172e6f3233981300000000000000000000000072036ace0d05c6de44a3bd0ff47f59f41efa386e", + "blockHash": "0xee108a4a662158ecab6e7ac0389cbc2eab60be61f9d6467ea3bb18af4db56f2a", + "blockNumber": "0x15baf38", + "blockTimestamp": "0x685cba73", + "transactionHash": "0x5638fe1ddc54f99eff2649249929d45ecb177e89906309b719f2350a6bddee3d", + "transactionIndex": "0x4c", + "logIndex": "0xa9", "removed": false }, { - "address": "0xb8d33503a851d2d44e02f14fb0321e900c7a89ac", + "address": "0x6b24654f5154214d1a39b09ae0e2342bb48efe08", "topics": [ "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" ], "data": "0x0000000000000000000000000000000000000000000000000000000000000001", - "blockHash": "0x9cb4bcfb8c1f1915ca773349d068f5c955302315a7c46c6f3b98f6ad3738e302", - "blockNumber": "0x15b2428", - "blockTimestamp": "0x68562b4b", - "transactionHash": "0x4bd6bc5824a7b615c2163bb893ac1cfbf804991780696e41d41afaaf0c2391c1", - "transactionIndex": "0x31", - "logIndex": "0x3f", + "blockHash": "0xee108a4a662158ecab6e7ac0389cbc2eab60be61f9d6467ea3bb18af4db56f2a", + "blockNumber": "0x15baf38", + "blockTimestamp": "0x685cba73", + "transactionHash": "0x5638fe1ddc54f99eff2649249929d45ecb177e89906309b719f2350a6bddee3d", + "transactionIndex": "0x4c", + "logIndex": "0xaa", "removed": false }, { "address": "0x37ba9934aaba7a49cc29d0952c6a91d7c7043dbc", "topics": [ "0x3f53d2c2743b2b162c0aa5d678be4058d3ae2043700424be52c04105df3e2411", - "0x000000000000000000000000b8d33503a851d2d44e02f14fb0321e900c7a89ac", - "0x000000000000000000000000b10da2f9147f9cf2b8826877cd0c95c18a0f42dc", + "0x0000000000000000000000006b24654f5154214d1a39b09ae0e2342bb48efe08", + "0x000000000000000000000000c20059e0317de91738d13af027dfc4a50781b066", "0x000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48" ], "data": "0x", - "blockHash": "0x9cb4bcfb8c1f1915ca773349d068f5c955302315a7c46c6f3b98f6ad3738e302", - "blockNumber": "0x15b2428", - "blockTimestamp": "0x68562b4b", - "transactionHash": "0x4bd6bc5824a7b615c2163bb893ac1cfbf804991780696e41d41afaaf0c2391c1", - "transactionIndex": "0x31", - "logIndex": "0x40", + "blockHash": "0xee108a4a662158ecab6e7ac0389cbc2eab60be61f9d6467ea3bb18af4db56f2a", + "blockNumber": "0x15baf38", + "blockTimestamp": "0x685cba73", + "transactionHash": "0x5638fe1ddc54f99eff2649249929d45ecb177e89906309b719f2350a6bddee3d", + "transactionIndex": "0x4c", + "logIndex": "0xab", "removed": false } ], - "logsBloom": "0x00020024000000000000008002000100000400000000000000800000000000000000008000200000000002000010000000000000000000000000004000000200000080000000000000000000000000000001000000000000000000000000000280000000020200000000000000040800800008000000000000040000000000400000000000002000000800000000000200000000000090000000000000000000000000000000000000000800000000400000000000000000000200000000200000000000000000000000000000000000000000000004000000000000000020000000000000000000200000000000000004002000000000400000002000000000", + "logsBloom": "0x00000014000000000000008000000000010000000000000000a10080000000000000008000000000000002000410008000000000000000000000004000000000000080000000000000000000000000000001000000008000000000000000080200000004020001000000000000000801000008000000000000040000000000400000000000002000000800000010000200000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000010000000000000000000004000000000000000020000000000000020200a00000000000000004000000000000000000002000000000", "type": "0x2", - "transactionHash": "0x4bd6bc5824a7b615c2163bb893ac1cfbf804991780696e41d41afaaf0c2391c1", - "transactionIndex": "0x31", - "blockHash": "0x9cb4bcfb8c1f1915ca773349d068f5c955302315a7c46c6f3b98f6ad3738e302", - "blockNumber": "0x15b2428", - "gasUsed": "0x13332c", - "effectiveGasPrice": "0x10c899d4", + "transactionHash": "0x5638fe1ddc54f99eff2649249929d45ecb177e89906309b719f2350a6bddee3d", + "transactionIndex": "0x4c", + "blockHash": "0xee108a4a662158ecab6e7ac0389cbc2eab60be61f9d6467ea3bb18af4db56f2a", + "blockNumber": "0x15baf38", + "gasUsed": "0xf1eb3", + "effectiveGasPrice": "0x852e900d", "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", "contractAddress": null @@ -216,7 +216,7 @@ "libraries": [], "pending": [], "returns": {}, - "timestamp": 1750477645, + "timestamp": 1750907511, "chain": 1, - "commit": "53496c4" + "commit": "0e94198" } \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-market-USDC-SPK@05JUL2025.json b/deployments/eth-mainnet/eth-mainnet-market-USDC-SPK@05JUL2025.json new file mode 100644 index 0000000..922c439 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-market-USDC-SPK@05JUL2025.json @@ -0,0 +1,38 @@ +{ + "blockInfo": { + "number": "22785845", + "timestamp": "1750907471" + }, + "market": "0x6B24654F5154214D1A39b09AE0E2342bB48eFE08", + "collateral": { + "address": "0xc20059e0317DE91738d13af027DfC4a50781b066", + "symbol": "SPK", + "priceFeed": "0x552116E747a5b386B2E7EEd4371002359cf2A574", + "heartBeat": "86400" + }, + "underlying": { + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "priceFeed": "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", + "heartBeat": "86400" + }, + "tokens": { + "ft": "0xEF73A3623A6c23C0271c4fC798CB6A745e211487", + "xt": "0xa11A440e7720c55caAF5b2155B172E6F32339813", + "gt": "0x72036acE0D05c6De44a3bD0fF47F59F41efa386E" + }, + "config": { + "marketSymbol": "USDC/SPK@05JUL2025", + "treasurer": "0x719e77027952929ed3060dbFFC5D43EC50c1cf79", + "maturity": "05JUL2025", + "salt": "0", + "fees": { + "lendTakerFeeRatio": "2000000", + "lendMakerFeeRatio": "2000000", + "borrowTakerFeeRatio": "3000000", + "borrowMakerFeeRatio": "3000000", + "mintGtFeeRatio": "10000000", + "mintGtFeeRef": "6000000" + } + } +} \ No newline at end of file diff --git a/script/deploy/deploydata/eth-mainnet.json b/script/deploy/deploydata/eth-mainnet.json index 0adfd38..4049bc5 100644 --- a/script/deploy/deploydata/eth-mainnet.json +++ b/script/deploy/deploydata/eth-mainnet.json @@ -3,11 +3,11 @@ "configs": { "configs_0": { "salt": 0, - "collateralCapForGt": "5000000000000000000000000", - "marketName": "USDC/PT-cUSDO-20NOV2025@21NOV2025", - "marketSymbol": "USDC/PT-cUSDO-20NOV2025@21NOV2025", + "collateralCapForGt": "50000000000000000000000000", + "marketName": "USDC/SPK@05JUL2025", + "marketSymbol": "USDC/SPK@05JUL2025", "marketConfig": { - "maturity": "1763683200", + "maturity": "1751673600", "lendTakerFeeRatio": "2000000", "lendMakerFeeRatio": "2000000", "borrowTakerFeeRatio": "3000000", @@ -16,8 +16,8 @@ "mintGtFeeRef": "6000000" }, "loanConfig": { - "liquidationLtv": "91500000", - "maxLtv": "87500000", + "liquidationLtv": "70000000", + "maxLtv": "60000000", "liquidatable": true }, "underlyingConfig": { @@ -31,14 +31,14 @@ "initialPrice": "100000000" }, "collateralConfig": { - "tokenAddr": "0xb10da2f9147f9cf2b8826877cd0c95c18a0f42dc", - "priceFeedAddr": "0x1039F090392798Be2FeA222D6468676cB2F07699", + "tokenAddr": "0xc20059e0317DE91738d13af027DfC4a50781b066", + "priceFeedAddr": "0x552116E747a5b386B2E7EEd4371002359cf2A574", "backupPriceFeedAddr": "0x0000000000000000000000000000000000000000", "heartBeat": "86400", - "name": "PT Compounding Open Dollar 20NOV2025", - "symbol": "PT-cUSDO-20NOV2025", + "name": "Spark", + "symbol": "SPK", "decimals": "18", - "initialPrice": "260000000000", + "initialPrice": "4000000", "gtKeyIdentifier": "GearingTokenWithERC20" } } From 5af620d1059929fd4c835a1f48ef28489b8b7208 Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 26 Jun 2025 11:41:01 +0800 Subject: [PATCH 115/194] fix issue 7 --- contracts/v2/vault/OrderManagerV2.sol | 2 +- contracts/v2/vault/TermMaxVaultV2.sol | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/contracts/v2/vault/OrderManagerV2.sol b/contracts/v2/vault/OrderManagerV2.sol index fbac1ad..2a01877 100644 --- a/contracts/v2/vault/OrderManagerV2.sol +++ b/contracts/v2/vault/OrderManagerV2.sol @@ -190,7 +190,7 @@ contract OrderManagerV2 is VaultStorageV2, VaultErrors, VaultEvents, IOrderManag uint256 amplifiedAmt = amount * Constants.DECIMAL_BASE_SQ; _performanceFee -= amplifiedAmt; _totalFt -= amplifiedAmt; - + asset.safeTransfer(recipient, amount); emit WithdrawPerformanceFee(msg.sender, recipient, amount); } diff --git a/contracts/v2/vault/TermMaxVaultV2.sol b/contracts/v2/vault/TermMaxVaultV2.sol index 7028a27..c5a6f09 100644 --- a/contracts/v2/vault/TermMaxVaultV2.sol +++ b/contracts/v2/vault/TermMaxVaultV2.sol @@ -55,8 +55,10 @@ contract TermMaxVaultV2 is address public immutable ORDER_MANAGER_SINGLETON; - uint256 private constant ACTION_DEPOSIT = uint256(keccak256("ACTION_DEPOSIT")); - uint256 private constant ACTION_WITHDRAW = uint256(keccak256("ACTION_WITHDRAW")); + // keccak256(abi.encode(uint256(keccak256("termmax.tsstorage.vault.actionDeposit")) - 1)) & ~bytes32(uint256(0xff)) + uint256 private constant ACTION_DEPOSIT = 0x1d9ff85e70b948f53a2cc45fa6f42c020b2a8eec3349351855dea946b0635700; + // keccak256(abi.encode(uint256(keccak256("termmax.tsstorage.vault.actionWithdraw")) - 1)) & ~bytes32(uint256(0xff)) + uint256 private constant ACTION_WITHDRAW = 0xfcb0c32c4f653382a412cb0caa6a29f9e46d74bae452ca200c67f1e5e6389300; modifier onlyCuratorRole() { address sender = _msgSender(); From 200eb95b228b95ba7f840ca4ab85eb43d7f9fa67 Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 26 Jun 2025 11:44:10 +0800 Subject: [PATCH 116/194] fix issue 8 --- contracts/v2/vault/TermMaxVaultV2.sol | 3 --- 1 file changed, 3 deletions(-) diff --git a/contracts/v2/vault/TermMaxVaultV2.sol b/contracts/v2/vault/TermMaxVaultV2.sol index c5a6f09..209bf21 100644 --- a/contracts/v2/vault/TermMaxVaultV2.sol +++ b/contracts/v2/vault/TermMaxVaultV2.sol @@ -84,9 +84,6 @@ contract TermMaxVaultV2 is } modifier marketIsWhitelisted(address market) { - if (_pendingMarkets[market].validAt != 0 && block.timestamp > _pendingMarkets[market].validAt) { - _marketWhitelist[market] = true; - } if (!_marketWhitelist[market]) revert MarketNotWhitelisted(); _; } From dff4f2ec0ecadf36e0613fd03a532d5a4fcae5b8 Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 26 Jun 2025 11:47:49 +0800 Subject: [PATCH 117/194] fix issue 9 --- contracts/v2/vault/TermMaxVaultV2.sol | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/contracts/v2/vault/TermMaxVaultV2.sol b/contracts/v2/vault/TermMaxVaultV2.sol index 209bf21..67c90dc 100644 --- a/contracts/v2/vault/TermMaxVaultV2.sol +++ b/contracts/v2/vault/TermMaxVaultV2.sol @@ -105,11 +105,11 @@ contract TermMaxVaultV2 is } function initialize(VaultInitialParamsV2 memory params) external virtual initializer { - __ERC20_init(params.name, params.symbol); - __Ownable_init(params.admin); - __ERC4626_init(params.asset); - __ReentrancyGuard_init(); - __Pausable_init(); + __ERC20_init_unchained(params.name, params.symbol); + __Ownable_init_unchained(params.admin); + __ERC4626_init_unchained(params.asset); + __ReentrancyGuard_init_unchained(); + __Pausable_init_unchained(); _setPerformanceFeeRate(params.performanceFeeRate); _checkTimelockBounds(params.timelock); From fcc4afad14965875fe81562d1ae8d4f7883ecfbe Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 26 Jun 2025 11:52:34 +0800 Subject: [PATCH 118/194] add check when initializing --- contracts/v2/vault/TermMaxVaultV2.sol | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/contracts/v2/vault/TermMaxVaultV2.sol b/contracts/v2/vault/TermMaxVaultV2.sol index 67c90dc..cd74253 100644 --- a/contracts/v2/vault/TermMaxVaultV2.sol +++ b/contracts/v2/vault/TermMaxVaultV2.sol @@ -111,6 +111,7 @@ contract TermMaxVaultV2 is __ReentrancyGuard_init_unchained(); __Pausable_init_unchained(); + _checkPerformanceFeeRateBounds(params.performanceFeeRate); _setPerformanceFeeRate(params.performanceFeeRate); _checkTimelockBounds(params.timelock); _setTimelock(params.timelock); @@ -568,13 +569,17 @@ contract TermMaxVaultV2 is if (newTimelock < VaultConstants.POST_INITIALIZATION_MIN_TIMELOCK) revert BelowMinTimelock(); } + function _checkPerformanceFeeRateBounds(uint256 newPerformanceFeeRate) internal pure { + if (newPerformanceFeeRate > VaultConstants.MAX_PERFORMANCE_FEE_RATE) revert PerformanceFeeRateExceeded(); + } + /** * @inheritdoc ITermMaxVault */ function submitPerformanceFeeRate(uint184 newPerformanceFeeRate) external virtual onlyCuratorRole { if (newPerformanceFeeRate == _performanceFeeRate) revert AlreadySet(); if (_pendingPerformanceFeeRate.validAt != 0) revert AlreadyPending(); - if (newPerformanceFeeRate > VaultConstants.MAX_PERFORMANCE_FEE_RATE) revert PerformanceFeeRateExceeded(); + _checkPerformanceFeeRateBounds(newPerformanceFeeRate); if (newPerformanceFeeRate < _performanceFeeRate) { _setPerformanceFeeRate(uint256(newPerformanceFeeRate).toUint64()); emit SetPerformanceFeeRate(_msgSender(), newPerformanceFeeRate); From 81365c009bf413ca361a5972b6c7271d50079a88 Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 26 Jun 2025 12:10:25 +0800 Subject: [PATCH 119/194] fix issue 14 --- contracts/v2/vault/TermMaxVaultV2.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/v2/vault/TermMaxVaultV2.sol b/contracts/v2/vault/TermMaxVaultV2.sol index cd74253..81ed173 100644 --- a/contracts/v2/vault/TermMaxVaultV2.sol +++ b/contracts/v2/vault/TermMaxVaultV2.sol @@ -508,7 +508,7 @@ contract TermMaxVaultV2 is shares = previewWithdraw(badDebtAmt); uint256 maxShares = maxRedeem(owner); if (shares > maxShares) { - revert ERC4626ExceededMaxMint(recipient, shares, maxShares); + revert ERC4626ExceededMaxRedeem(recipient, shares, maxShares); } if (caller != owner) { From d426aa11dd7e43d4387c3bdff6d1633dd0603c07 Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 26 Jun 2025 12:16:13 +0800 Subject: [PATCH 120/194] fix issue 16 --- contracts/v2/errors/VaultErrorsV2.sol | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/v2/errors/VaultErrorsV2.sol b/contracts/v2/errors/VaultErrorsV2.sol index b1865ca..d4d6998 100644 --- a/contracts/v2/errors/VaultErrorsV2.sol +++ b/contracts/v2/errors/VaultErrorsV2.sol @@ -10,13 +10,13 @@ interface VaultErrorsV2 { error ArrayLengthMismatch(); /// @notice Error thrown when dealing unexpected collateral error CollateralIsAsset(); - /// @notice Error thrown when an invalid or unsupported functions is called + /// @notice Error thrown when initializing the vault using V1 initializing function error UseVaultInitialParamsV2(); - /// @notice Error thrown when an invalid or unsupported functions is called + /// @notice Error thrown when calling functions about supply queue error SupplyQueueNoLongerSupported(); - /// @notice Error thrown when an invalid or unsupported functions is called + /// @notice Error thrown when calling functions about withdrawal queue error WithdrawalQueueNoLongerSupported(); - /// @notice Error thrown when an invalid or unsupported functions is called + /// @notice Error thrown when calling apr function error UseApyInsteadOfApr(); /// @notice Error thrown when the APY is too low error ApyTooLow(uint256 apy, uint256 minApy); From 51cd8a92aa2460569e627d79fce144247976e1e8 Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 26 Jun 2025 12:27:17 +0800 Subject: [PATCH 121/194] fix issue 19 --- contracts/v2/events/FactoryEventsV2.sol | 4 ++-- contracts/v2/factory/TermMaxFactoryV2.sol | 2 +- contracts/v2/factory/TermMaxVaultFactoryV2.sol | 2 +- test/v2/FactoryV2.t.sol | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/contracts/v2/events/FactoryEventsV2.sol b/contracts/v2/events/FactoryEventsV2.sol index bcb324f..95eb9bc 100644 --- a/contracts/v2/events/FactoryEventsV2.sol +++ b/contracts/v2/events/FactoryEventsV2.sol @@ -17,7 +17,7 @@ interface FactoryEventsV2 { * @param debtToken The debt token interface * @param params The initial parameters for the market */ - event CreateMarket( + event MarketCreated( address indexed market, address indexed collateral, IERC20 indexed debtToken, MarketInitialParams params ); @@ -27,7 +27,7 @@ interface FactoryEventsV2 { * @param creator The address of the vault creator * @param initialParams The initial parameters used to configure the vault */ - event CreateVault(address indexed vault, address indexed creator, VaultInitialParamsV2 initialParams); + event VaultCreated(address indexed vault, address indexed creator, VaultInitialParamsV2 initialParams); /** * @notice Emitted when a new price feed is created diff --git a/contracts/v2/factory/TermMaxFactoryV2.sol b/contracts/v2/factory/TermMaxFactoryV2.sol index db224bf..6140d1c 100644 --- a/contracts/v2/factory/TermMaxFactoryV2.sol +++ b/contracts/v2/factory/TermMaxFactoryV2.sol @@ -118,6 +118,6 @@ contract TermMaxFactoryV2 is Ownable2Step, ITermMaxFactory, FactoryEventsV2 { ITermMaxMarket(market).initialize(params); // Emit event for market creation tracking - emit FactoryEventsV2.CreateMarket(market, params.collateral, params.debtToken, params); + emit FactoryEventsV2.MarketCreated(market, params.collateral, params.debtToken, params); } } diff --git a/contracts/v2/factory/TermMaxVaultFactoryV2.sol b/contracts/v2/factory/TermMaxVaultFactoryV2.sol index a234669..2190879 100644 --- a/contracts/v2/factory/TermMaxVaultFactoryV2.sol +++ b/contracts/v2/factory/TermMaxVaultFactoryV2.sol @@ -49,6 +49,6 @@ contract TermMaxVaultFactoryV2 is ITermMaxVaultFactoryV2 { keccak256(abi.encode(msg.sender, initialParams.asset, initialParams.name, initialParams.symbol, salt)) ); ITermMaxVaultV2(vault).initialize(initialParams); - emit FactoryEventsV2.CreateVault(vault, msg.sender, initialParams); + emit FactoryEventsV2.VaultCreated(vault, msg.sender, initialParams); } } diff --git a/test/v2/FactoryV2.t.sol b/test/v2/FactoryV2.t.sol index b482bcf..ffa6965 100644 --- a/test/v2/FactoryV2.t.sol +++ b/test/v2/FactoryV2.t.sol @@ -147,7 +147,7 @@ contract FactoryTestV2 is Test { predictMarketAddress, "GT:test", "GT:test", abi.encode(type(uint256).max) ); emit GearingTokenWithERC20V2.CollateralCapacityUpdated(type(uint256).max); - emit FactoryEventsV2.CreateMarket(predictMarketAddress, address(collateral), debt, params); + emit FactoryEventsV2.MarketCreated(predictMarketAddress, address(collateral), debt, params); factory.createMarket(DeployUtils.GT_ERC20, params, 0); vm.stopPrank(); } From e154de31329901e3fefaefc96dbc88f2f0fb8ab8 Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 26 Jun 2025 12:32:18 +0800 Subject: [PATCH 122/194] fix issue 29 --- contracts/v2/ITermMaxOrderV2.sol | 2 +- contracts/v2/vault/ITermMaxVaultV2.sol | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/v2/ITermMaxOrderV2.sol b/contracts/v2/ITermMaxOrderV2.sol index 699b6e9..1ba67f7 100644 --- a/contracts/v2/ITermMaxOrderV2.sol +++ b/contracts/v2/ITermMaxOrderV2.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; +pragma solidity ^0.8.0; import {IERC20} from "../v1/tokens/IMintableERC20.sol"; import {IGearingToken} from "../v1/tokens/IGearingToken.sol"; diff --git a/contracts/v2/vault/ITermMaxVaultV2.sol b/contracts/v2/vault/ITermMaxVaultV2.sol index b1d2ba4..97d3d50 100644 --- a/contracts/v2/vault/ITermMaxVaultV2.sol +++ b/contracts/v2/vault/ITermMaxVaultV2.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; +pragma solidity ^0.8.0; import {PendingAddress, PendingUint192} from "../../v1/lib/PendingLib.sol"; import {VaultInitialParamsV2} from "../storage/TermMaxStorageV2.sol"; From 89f6893d129b7f706689e4f3ce59a592217ef30f Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 26 Jun 2025 13:17:12 +0800 Subject: [PATCH 123/194] fix issue 30 and 31 --- contracts/v2/vault/ITermMaxVaultV2.sol | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/contracts/v2/vault/ITermMaxVaultV2.sol b/contracts/v2/vault/ITermMaxVaultV2.sol index 97d3d50..d53a3a9 100644 --- a/contracts/v2/vault/ITermMaxVaultV2.sol +++ b/contracts/v2/vault/ITermMaxVaultV2.sol @@ -19,21 +19,21 @@ interface ITermMaxVaultV2 { function initialize(VaultInitialParamsV2 memory params) external; /** - * @notice Returns the current annual percentage yield based on accreting principal + * @notice Returns the current annual percentage yield based on accreting principal, eg. 5% APY = 0.05e8 * @dev APY is calculated based on the vault's current performance and accruing interest * @return The current APY as a uint256 value */ function apy() external view returns (uint256); /** - * @notice Returns the minimum guaranteed APY for the vault + * @notice Returns the minimum guaranteed APY for the vault, e.g. 5% APY = 0.05e8 * @dev This represents the floor APY that the vault aims to maintain * @return The minimum APY as a uint64 value */ function minApy() external view returns (uint64); /** - * @notice Returns the minimum rate for idle funds in the vault + * @notice Returns the minimum rate for idle funds in the vault, e.g. 10% idle fund rate = 0.05e8 * @dev This rate applies to funds that are not actively deployed in strategies * @return The minimum idle fund rate as a uint64 value */ @@ -42,28 +42,32 @@ interface ITermMaxVaultV2 { /** * @notice Returns the pending minimum APY update details * @dev Contains the proposed new value and timing information for the pending change - * @return PendingUint192 struct with pending minimum APY data + * @return PendingUint192 struct with pending minimum APY data, structure includes: + * - new value: the proposed new minimum APY + * - valid at: the timestamp when the change was proposed */ function pendingMinApy() external view returns (PendingUint192 memory); /** * @notice Returns the pending minimum idle fund rate update details * @dev Contains the proposed new value and timing information for the pending change - * @return PendingUint192 struct with pending minimum idle fund rate data + * @return PendingUint192 struct with pending minimum idle fund rate data, structure includes: + * - new value: the proposed new minimum idle fund rate + * - valid at: the timestamp when the change was proposed */ function pendingMinIdleFundRate() external view returns (PendingUint192 memory); /** * @notice Submits a new minimum APY for pending approval * @dev Initiates a timelock period before the new minimum APY can be applied - * @param newMinApy The proposed new minimum APY value + * @param newMinApy The proposed new minimum APY value, e.g. 5% APY = 0.05e8 */ function submitPendingMinApy(uint64 newMinApy) external; /** * @notice Submits a new minimum idle fund rate for pending approval * @dev Initiates a timelock period before the new rate can be applied - * @param newMinIdleFundRate The proposed new minimum idle fund rate + * @param newMinIdleFundRate The proposed new minimum idle fund rate, e.g. 10% idle fund rate = 0.10e8 */ function submitPendingMinIdleFundRate(uint64 newMinIdleFundRate) external; From 7a0b42843752e1328a2c0a469262f0ce0bd1cda6 Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 26 Jun 2025 13:21:10 +0800 Subject: [PATCH 124/194] fix issue 35 --- contracts/v2/vault/OrderManagerV2.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/contracts/v2/vault/OrderManagerV2.sol b/contracts/v2/vault/OrderManagerV2.sol index 2a01877..3afe956 100644 --- a/contracts/v2/vault/OrderManagerV2.sol +++ b/contracts/v2/vault/OrderManagerV2.sol @@ -100,7 +100,6 @@ contract OrderManagerV2 is VaultStorageV2, VaultErrors, VaultEvents, IOrderManag ) external onlyProxy returns (ITermMaxOrder order) { _accruedInterest(); (IERC20 ft, IERC20 xt,,, IERC20 debtToken) = market.tokens(); - if (asset != debtToken) revert InconsistentAsset(); order = market.createOrder(address(this), maxSupply, ISwapCallback(address(this)), curveCuts); if (initialReserve > 0) { From 4d0e1c19fadca3e8bca11ee9452eaa9cfe265af5 Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 26 Jun 2025 13:26:52 +0800 Subject: [PATCH 125/194] fix issue 36 --- contracts/v2/vault/OrderManagerV2.sol | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/contracts/v2/vault/OrderManagerV2.sol b/contracts/v2/vault/OrderManagerV2.sol index 3afe956..db21894 100644 --- a/contracts/v2/vault/OrderManagerV2.sol +++ b/contracts/v2/vault/OrderManagerV2.sol @@ -136,13 +136,16 @@ contract OrderManagerV2 is VaultStorageV2, VaultErrors, VaultEvents, IOrderManag orderInfo.ft.safeIncreaseAllowance(address(orderInfo.market), withdrawChanges); orderInfo.xt.safeIncreaseAllowance(address(orderInfo.market), withdrawChanges); orderInfo.market.burn(address(this), withdrawChanges); - } else { + } else if (changes > 0) { // deposit assets to order uint256 depositChanges = uint256(changes); asset.safeIncreaseAllowance(address(orderInfo.market), depositChanges); orderInfo.market.mint(address(order), depositChanges); // update curve cuts order.updateOrder(newOrderConfig, 0, 0); + } else { + // no changes, just update curve cuts + order.updateOrder(newOrderConfig, 0, 0); } _orderMapping[address(order)] = orderInfo; emit UpdateOrder(msg.sender, address(order), changes, maxSupply, curveCuts); From 815bcc38968f3cf5c19db8f417cc3c82339e1b0a Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 26 Jun 2025 14:48:14 +0800 Subject: [PATCH 126/194] fix issue 43 --- contracts/v2/storage/TermMaxStorageV2.sol | 3 +++ 1 file changed, 3 insertions(+) diff --git a/contracts/v2/storage/TermMaxStorageV2.sol b/contracts/v2/storage/TermMaxStorageV2.sol index 4eaed88..17d6ffb 100644 --- a/contracts/v2/storage/TermMaxStorageV2.sol +++ b/contracts/v2/storage/TermMaxStorageV2.sol @@ -12,7 +12,10 @@ struct VaultInitialParamsV2 { uint256 maxCapacity; string name; string symbol; + /// @notice The performance fee rate in base units, e.g. 20% = 0.2e8 uint64 performanceFeeRate; + /// @notice The minimum APY in base units, e.g. 2% = 0.02e8 uint64 minApy; + /// @notice The minimum idle fund rate in base units, e.g. 10% = 0.1e8 uint64 minIdleFundRate; } From 75000e7364570574f3f28a9a46ff85879eff2643 Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 26 Jun 2025 14:57:07 +0800 Subject: [PATCH 127/194] fix issue 49 --- contracts/v2/factory/TermMaxVaultFactoryV2.sol | 3 --- 1 file changed, 3 deletions(-) diff --git a/contracts/v2/factory/TermMaxVaultFactoryV2.sol b/contracts/v2/factory/TermMaxVaultFactoryV2.sol index 2190879..1382468 100644 --- a/contracts/v2/factory/TermMaxVaultFactoryV2.sol +++ b/contracts/v2/factory/TermMaxVaultFactoryV2.sol @@ -19,9 +19,6 @@ contract TermMaxVaultFactoryV2 is ITermMaxVaultFactoryV2 { address public immutable TERMMAX_VAULT_IMPLEMENTATION; constructor(address TERMMAX_VAULT_IMPLEMENTATION_) { - if (TERMMAX_VAULT_IMPLEMENTATION_ == address(0)) { - revert FactoryErrors.InvalidImplementation(); - } TERMMAX_VAULT_IMPLEMENTATION = TERMMAX_VAULT_IMPLEMENTATION_; } From 0008a5ea7dc9b026b10b4fac36b24e8db49ba31e Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 26 Jun 2025 15:03:04 +0800 Subject: [PATCH 128/194] fix issue 55 --- contracts/v2/vault/TermMaxVaultV2.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/v2/vault/TermMaxVaultV2.sol b/contracts/v2/vault/TermMaxVaultV2.sol index 81ed173..91ff935 100644 --- a/contracts/v2/vault/TermMaxVaultV2.sol +++ b/contracts/v2/vault/TermMaxVaultV2.sol @@ -29,7 +29,7 @@ import {VaultErrors} from "../../v1/errors/VaultErrors.sol"; import {VaultEvents} from "../../v1/events/VaultEvents.sol"; import {VaultEventsV2} from "../events/VaultEventsV2.sol"; import {IOrderManager} from "../../v1/vault/IOrderManager.sol"; -import {VaultStorageV2, OrderInfo} from "../../v2/vault/VaultStorageV2.sol"; +import {VaultStorageV2, OrderInfo} from "./VaultStorageV2.sol"; import {Constants} from "../../v1/lib/Constants.sol"; import {ITermMaxVault} from "../../v1/vault/ITermMaxVault.sol"; import {ITermMaxVaultV2} from "./ITermMaxVaultV2.sol"; From b37a6323d1473fa5e302aec96382c4e88bf0b6bc Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 26 Jun 2025 15:04:31 +0800 Subject: [PATCH 129/194] fix issue 58 --- contracts/v2/vault/TermMaxVaultV2.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/contracts/v2/vault/TermMaxVaultV2.sol b/contracts/v2/vault/TermMaxVaultV2.sol index 91ff935..4fee9d2 100644 --- a/contracts/v2/vault/TermMaxVaultV2.sol +++ b/contracts/v2/vault/TermMaxVaultV2.sol @@ -99,7 +99,6 @@ contract TermMaxVaultV2 is } constructor(address ORDER_MANAGER_SINGLETON_) { - if (ORDER_MANAGER_SINGLETON_ == address(0)) revert InvalidImplementation(); ORDER_MANAGER_SINGLETON = ORDER_MANAGER_SINGLETON_; _disableInitializers(); } From 23b76ca54b9c28b2b4fc0b4d07d64b3f17c4ee36 Mon Sep 17 00:00:00 2001 From: Vincent Date: Thu, 26 Jun 2025 15:09:21 +0800 Subject: [PATCH 130/194] upgrade router on Ethereum and Arbitrum. BNB failed to verify --- .../1/run-1750916028.json | 97 ++++++++++++++++ .../1/run-latest.json | 97 ++++++++++++++++ .../42161/run-latest.json | 106 ++++++++++++++++++ .../56/run-latest.json | 100 +++++++++++++++++ 4 files changed, 400 insertions(+) create mode 100644 broadcast/UpgradeRouterForRepayingGt.s.sol/1/run-1750916028.json create mode 100644 broadcast/UpgradeRouterForRepayingGt.s.sol/1/run-latest.json create mode 100644 broadcast/UpgradeRouterForRepayingGt.s.sol/42161/run-latest.json create mode 100644 broadcast/UpgradeRouterForRepayingGt.s.sol/56/run-latest.json diff --git a/broadcast/UpgradeRouterForRepayingGt.s.sol/1/run-1750916028.json b/broadcast/UpgradeRouterForRepayingGt.s.sol/1/run-1750916028.json new file mode 100644 index 0000000..1d04c65 --- /dev/null +++ b/broadcast/UpgradeRouterForRepayingGt.s.sol/1/run-1750916028.json @@ -0,0 +1,97 @@ +{ + "transactions": [ + { + "hash": "0x38269b852581d4528fe48065c5f52a299037abc3175a7c7652d168747a9fb0dc", + "transactionType": "CREATE", + "contractName": "TermMaxRouter_Repay_Gt", + "contractAddress": "0x8ffc4da23ee650ffdd3cb4880a644ce17d2e5623", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "gas": "0x5168df", + "value": "0x0", + "input": "0x60a080604052346029573060805261492c908161002e82396080518181816128dc015261296f0152f35b5f80fdfe60806040526004361015610011575f80fd5b5f5f3560e01c80631443c4d61461322c578063150b7a02146131d75780631ac100a41461314f5780632a51cf5114612faa5780632e3e3ef214612f6c5780632f20734514612ee95780633f4ba83a14612e6957806345618d2b14612b195780634f1ef2861461293057806352d1902d146128c95780635c975abb1461289a578063715018a61461281b57806379ba5097146127ce5780638456cb591461275b57806384e090911461252257806389c3584d146121ca5780638da5cb5b14612195578063943189f414611eb257806395320fd014611c1357806399a54a5a14611974578063ad3cb1cc14611927578063c4d66de81461177a578063c71c700c146113bd578063d3e052cf146110a5578063df3e1e0514610d2f578063e30c397814610cfa578063e9919e5c14610c5c578063ef8b4968146109f5578063f1a229ad1461070e578063f2fde38b14610688578063f38743f3146104755763fc1c1b211461017a575f80fd5b3461035057610188366138cc565b91929690959394610197613f9f565b604051634eb1c24560e11b81526001600160a01b039190911697909260a0846004818c5afa9485156103d657839288859486978799610432575b506001600160a01b0390811697169461020291906101f18230338a613fc6565b6001600160a01b031695869061405a565b604061022f8c6102118c6145c3565b8884519e8f9485938492637a0ee4f960e11b84523060048501613b55565b03925af196871561042757859a86986103e5575b509187918961025395948961441d565b92610267846001600160801b038716613d75565b8281610362575b9150503b1561035e57604051632142170760e11b81523060048201526001600160a01b0386166024820152604481018890529082908290818381606481015b03925af180156103535761033b575b602087808a7fdc3efdf28701077a23ef0beb0f3260ca639658ce2676bbc9d83030fac6ce56128a8a6103308b6102f18c6141bf565b604080513381526001600160a01b0390951660208601528401949094526001600160801b039081166060840152909216608082015290819060a0820190565b0390a3604051908152f35b61034682809261353f565b61035057806102bc565b80fd5b6040513d84823e3d90fd5b5080fd5b81610370916103759461405a565b6141bf565b813b156103e1576001600160801b0360405191636f965f9f60e11b8352896004840152166024820152826044820152828160648183865af180156103d6579083916103c1575b8261026e565b816103cb9161353f565b61035e57815f6103bb565b6040513d85823e3d90fd5b8280fd5b610253949391929b508998506104129060403d604011610420575b61040a818361353f565b810190613dd9565b9b909b985091909293610243565b503d610400565b6040513d87823e3d90fd5b9198505061045e919650610202945060a03d60a01161046e575b610456818361353f565b810190613a36565b99909891969193909250906101d1565b503d61044c565b50346103505760a03660031901126103505761048f613478565b9061049861348e565b90604435926064356001600160401b0381116103e1576104bc9036906004016135d8565b608435936104c8613f9f565b604051634eb1c24560e11b81526001600160a01b039190911693909160a083600481885afa928315610353578588918490859661065b575b506105219291906001600160a01b031661051c83303384613fc6565b61405a565b604051633def417960e11b815260048101889052306024820152908282604481838a5af180156103d65783928491610607575b509061055f916145db565b90602082519281808201948592010103126106035761057f915190613d54565b948086106105e2575050602094826105bb867fc1822dac55540066416ffa59d2eb79715d05171ecf435ac5226726b50686d9419560809561455f565b604051918252338783015260018060a01b03166040820152846060820152a2604051908152f35b856064936319aae4c960e11b845260018060a01b0316600452602452604452fd5b5f80fd5b9250503d8084843e610619818461353f565b8201604083820312610657578251926020810151906001600160401b038211610653579161064c9161055f949301613b96565b9091610554565b8580fd5b8380fd5b6105219392965061067b915060a03d60a01161046e57610456818361353f565b9894959250610500915050565b5034610350576020366003190112610350576106a2613478565b6106aa61437f565b5f5160206148d75f395f51905f5280546001600160a01b0319166001600160a01b039283169081179091555f5160206148575f395f51905f52549091167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b50346103505761010036600319011261035057610729613478565b9061073261348e565b916044356064356001600160401b03811161065757610755903690600401613750565b6084356001600160401b0381116109f1576107749036906004016137be565b9160a435918215158093036106535760c4356001600160401b0381116109ed5760a06107a5600492369084016135d8565b986107ae613f9f565b604051634eb1c24560e11b815292839182905f196001861b01165afa9788156109e25787918890899a6109bb575b506001600160a01b031695863b156109ac57604051635c46a7ef60e11b815233600482015230602482015285604482015260806064820152896084820152898160a481838c5af180156109b057908a91610997575b50506108a69261085d979695949261086f610890936040519a8b9660a0602089015260c0880190613c94565b868103601f1901604088015290613cd0565b6001600160a01b039092166060850152838203601f19016080850152613a88565b60e43560a083015203601f19810186528561353f565b823b1561065357916108e593918680946040519687958694859363078ad17360e31b855260048501526024840152606060448401526064830190613960565b03925af180156103d657908391610982575b50506040516370a0823160e01b81523060048201526020816024816001600160a01b0388165afa9283156109765792610941575b50816109399160209461455f565b604051908152f35b9091506020813d60201161096e575b8161095d6020938361353f565b81010312610603575190602061092b565b3d9150610950565b604051903d90823e3d90fd5b8161098c9161353f565b61035e57815f6108f7565b816109a19161353f565b6109ac57885f610831565b8880fd5b6040513d8c823e3d90fd5b919950506109d8915060a03d60a01161046e57610456818361353f565b9a9250505f6107dc565b6040513d89823e3d90fd5b8680fd5b8480fd5b50346103505760a036600319011261035057610a0f613478565b6024356001600160801b0381168091036103e157610a2b6134a4565b506064356001600160401b03811161065757610a4b903690600401613592565b916084356001600160401b0381116109f157610a6b903690600401613592565b805181019360a082602087019603126106535760208201516001600160401b0381116109ed5782019480603f870112156109ed57602086015195610aae87613560565b96610abc604051988961353f565b808852602080808a019260051b8401010191838311610c2057604001905b828210610c445750505060408301516001600160401b038111610c4057830181603f82011215610c4057602081015190610b1382613560565b91610b21604051938461353f565b8083526020808085019260051b8401010191848311610c3c57604001905b828210610c2457505050610b5560608501613a22565b916080850151946001600160401b038611610c2057610b7e610b8992602060a098840101613df3565b9586910151946145db565b936001600160a01b0386811690841614610bad575b88610baa88338961405a565b80f35b80515f198101908111610c0c576001600160a01b0391604091610bcf91613da7565b51015116966020855195818082019788920101031261060357610baa97610bf9610c0196516141bf565b93309161441d565b505f80808080610b9e565b634e487b7160e01b8a52601160045260248afd5b8980fd5b60208091610c3184613b82565b815201910190610b3f565b8a80fd5b8780fd5b60208091610c5184613a22565b815201910190610ada565b5034610350576020610cd5610330610cdc7f18f137cdb80704341c5da72a0f5776e3361de90e2a157d704a4b79d96b753aa6610ccc610c9a3661382c565b869a9596949992939791610cac613f9f565b84898c8a6001600160801b03851699610cc78b303384613fc6565b61441d565b998a8094613d75565b338a61455f565b6040516001600160a01b039485169890941696939485943386613d0c565b50346103505780600319360112610350575f5160206148d75f395f51905f52546040516001600160a01b039091168152602090f35b503461035057610d3e36613922565b91610d4a939193613f9f565b604051634eb1c24560e11b81526001600160a01b0391909116929060a081600481875afa90811561109a5786908790889361106c575b506040516331a9108f60e11b8152600481018890526001600160a01b0391821693909160209183916024918391165afa908115611018578891611032575b50336001600160a01b039091160361102357604051633f5ffaf560e01b8152602081600481895afa908115611018578891610fe6575b506305f5e1008402908482046305f5e1001485151715610fd2576305f5e10003906305f5e1008211610fd257610e2d9161037091613dbb565b906001600160801b03604051926339a380ed60e01b845230600485015216938460248401528760448401526020836064818c8b5af18015610fc75787938a91610f74575b509293610eaf93859261051c916001600160801b031680821015610f695750809681955b610ea183303388613fc6565b6001600160a01b031661405a565b833b1561065357604051632770a7eb60e21b81526001600160a01b03841660048201526024810182905286908181604481838a5af1801561035357610f50575b5050916001600160801b0360a092610f277fdc3efdf28701077a23ef0beb0f3260ca639658ce2676bbc9d83030fac6ce5612956141bf565b9060405193338552600180871b031660208501528860408501526060840152166080820152a380f35b81610f5d9195939561353f565b6106535791855f610eef565b905080968195610e95565b9350506020833d602011610fbf575b81610f906020938361353f565b810103126109ac57869361051c85926001600160801b03610fb3610eaf97613b82565b93975050929450610e71565b3d9150610f83565b6040513d8b823e3d90fd5b634e487b7160e01b89526011600452602489fd5b90506020813d602011611010575b816110016020938361353f565b8101031261060357515f610df4565b3d9150610ff4565b6040513d8a823e3d90fd5b6315e69dc560e21b8752600487fd5b90506020813d602011611064575b8161104d6020938361353f565b81010312610c405761105e90613a22565b5f610dbe565b3d9150611040565b602493506020925061108d915060a03d60a01161046e57610456818361353f565b5050939192909150610d80565b6040513d88823e3d90fd5b503461035057610100366003190112610350576110c0613478565b6110c861348e565b6064356001600160a01b03811693919084900361035e57608435936110eb6134e4565b936110f46134fa565b9260e435916001600160401b03831161065357604060031984360301126106535760405192604084018481106001600160401b038211176113a95760405280600401356001600160401b038111610c40576111559060043691840101613984565b845260248101356001600160401b038111610c405761117991369101600401613984565b6020840152611186613f9f565b604051634eb1c24560e11b8152966001600160a01b0391909116949060a088600481895afa9687156109765780978199829161137d575b5060405163887bb98960e01b81526001600160a01b03909516600486018190526044803560248801528601979097526080606486015260208580611204608482018a613f75565b0381858c5af1948515610353578295611341575b508a6112dc575b5050927fac20b37c6c923070aa8deac25d6e9bf9f6eecd727d9c2b89d0451685ecf4ba5294926001600160801b03610330938160209c9716998a806112bd575b50501698898061129e575b505060018060a01b031697889760405195869586528b8601526040850152606084015260a0608084015260a0830190613f75565b6112b6916001600160a01b0384811691339116613fc6565b5f8961126a565b6112d5916001600160a01b0386811691339116613fc6565b5f8a61125f565b8a886112ee9261051c83303384613fc6565b863b15610350576040516340c10f1960e01b81526001600160a01b0385166004820152602481018b90528181604481838c5af18015610353571561121f5761133782809261353f565b610350578061121f565b9094506020813d602011611375575b8161135d6020938361353f565b8101031261035e5761136e90613a22565b935f611218565b3d9150611350565b9198505061139b91985060a03d60a01161046e57610456818361353f565b9a939150509790985f6111bd565b634e487b7160e01b88526041600452602488fd5b503461035057610100366003190112610350576113d8613478565b6113e061348e565b6113e86134ce565b92606435926001600160801b038416928385036103e1576084356001600160401b0381116106575761141e903690600401613750565b9460a4356001600160401b0381116109f15761143e9036906004016137be565b916114476134fa565b9260e43591611454613f9f565b604051634eb1c24560e11b81526001600160a01b039190911698909360a0856004818d5afa958615611018578a9b899a9b998b978c99611746575b506001600160a01b03908116976001600160801b0392909216939116908c84111561173457966001600160801b0381985b169a8b906114d086303386613fc6565b6114d99261405a565b898d6114e78e303386613fc6565b6114f09261405a565b8b3b15610c2057604051632770a7eb60e21b81526001600160a01b0389166004820152602481018a90528a818e8183816044810103925af1801561172957908b91611714575b5050899b835185510361170557999b989a8c9a6001600160a01b03998a169a988a16998816989091908c5b8651111561164d578b8f8c8f8d60c4918e8e6001600160801b038f8f986115b5916115b060209b6115998460018060a01b0392613da7565b51169687866115a88686613da7565b51169161405a565b613da7565b51166040519889978896632cfdfa9360e11b8852600488015260248701526044860152606485015282608485015260a48401525af1908115611640578e9161160e575b5061160590600192613d54565b9e019d8e611561565b90506020813d8211611638575b816116286020938361353f565b81010312610603575160016115f8565b3d915061161b565b8e604051903d90823e3d90fd5b858c928f8f906001600160801b038f91611668908d97613d54565b9816908189106116ea57505050602096926116cb7f482c5c16eb3726edd4dc0b4e52fdb8488530e472f26df2a268d3d94edfc135a095936116d9936040519687963388528c8801526040870152606086015260e0608086015260e0850190613c94565b9083820360a0850152613cd0565b8560c08301520390a2604051908152f35b6319aae4c960e11b8352600452602488905260445260649150fd5b631f77022160e11b8b5260048bfd5b8161171e9161353f565b610c2057895f611536565b6040513d8d823e3d90fd5b5082966001600160801b0382986114c0565b90506001600160801b03985061176c91975060a03d60a01161046e57610456818361353f565b9a92999392915061148f9050565b503461035057602036600319011261035057611794613478565b5f5160206148b75f395f51905f52549060ff8260401c1615916001600160401b0381168015908161191f575b6001149081611915575b15908161190c575b506118fd5767ffffffffffffffff1981166001175f5160206148b75f395f51905f5255826118d1575b50611804614775565b61180c614775565b611814614775565b60ff195f5160206148975f395f51905f5254165f5160206148975f395f51905f525561183e614775565b611846614775565b6001600160a01b038116156118bd5761185e906143b2565b6118655780f35b68ff0000000000000000195f5160206148b75f395f51905f5254165f5160206148b75f395f51905f52557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a180f35b631e4fbdf760e01b83526004839052602483fd5b68ffffffffffffffffff191668010000000000000001175f5160206148b75f395f51905f52555f6117fb565b63f92ee8a960e01b8452600484fd5b9050155f6117d2565b303b1591506117ca565b8491506117c0565b50346103505780600319360112610350575061197060405161194a60408261353f565b60058152640352e302e360dc1b6020820152604051918291602083526020830190613960565b0390f35b50346103505760803660031901126103505761198e613478565b5061199761348e565b506064356001600160401b03811161035e576119b7903690600401613592565b908151820160808382031261035e5760208301516001600160a01b03811693908490036103e1576040810151916060820151906001600160401b0382116109f157608091602080611a0c930191850101613df3565b9101519160028310156106575781611a29611a4692604435613d54565b60405190602082015260208152611a4160408261353f565b6145db565b815190915f198201918211611bff5790611a5f91613da7565b5180516001600160a01b031684526020849052604084205490929060ff1615611be25780611b2457505060409081015190516370a0823160e01b81523060048201526001600160a01b039091169190602081602481865afa9182156109765791611af0575b508061197093611ad6611adc936145c3565b9361405a565b604051918291602083526020830190613960565b90506020813d602011611b1c575b81611b0b6020938361353f565b810103126106035751611970611ac4565b3d9150611afe565b9193909291600114611b3d575b50506119709150611adc565b8190604085019460018060a01b0386511690604051926020840192639df3032560e01b84526024850152604484015260606064840152611b9283611b846084820189613960565b03601f19810185528461353f565b519151916001600160a01b03165af491611baa613ed9565b9215611bb65780611b31565b51604051631d039b4360e11b815292839250611bde916001600160a01b031660048401613f08565b0390fd5b825163616d132960e01b85526001600160a01b0316600452602484fd5b634e487b7160e01b85526011600452602485fd5b503461035057611c2236613922565b93929091611c2e613f9f565b604051634eb1c24560e11b81526001600160a01b0391909116949060a081600481895afa8015610427578590858788948993611e81575b506001600160a01b0392831694921691611c979190611c8682303389613fc6565b6001600160a01b031694859061405a565b604051633f5ffaf560e01b81526020816004818c5afa908115611018578891611e4f575b506305f5e1008502908582046305f5e1001486151715610fd2576305f5e10003906305f5e1008211610fd2576103708995949392611cf892613dbb565b946040611d258b611d088b6145c3565b83519c8d80948193637a0ee4f960e11b83528d3060048501613b55565b03925af18015610427579085949392918b969a8691611e12575b509161051c87926001600160801b03611d6e9695168082105f14611e07575080988195610ea183303388613fc6565b873b1561035e57604051632770a7eb60e21b81526001600160a01b0386166004820152602481018490528281604481838d5af180156103d657908391611df2575b5050803b1561035e57604051632142170760e11b81523060048201526001600160a01b0386166024820152604481018890529082908290818381606481016102ad565b81611dfc9161353f565b61035e57815f611daf565b905080988195610e95565b6001600160801b039b50611d6e949391508792611e4061051c9260403d6040116104205761040a818361353f565b9d909d93959650509250611d3f565b90506020813d602011611e79575b81611e6a6020938361353f565b8101031261060357515f611cbb565b3d9150611e5d565b91935050611c979350611ea3915060a03d60a01161046e57610456818361353f565b50909492939092909190611c65565b503461035057611ec1366136be565b9194929593611ece613f9f565b604051634eb1c24560e11b81526001600160a01b03919091169560a0826004818a5afa90811561109a57611f978899611fbc9994602094611f83948b8c938d93612157575b506001600160801b03948516989394611f5894909291611f44918b916001600160a01b031661051c83303384613fc6565b1690309033906001600160a01b0316613fc6565b60018060a01b03169560405192839188868401528a60408401526080606084015260a0830190613a88565b89608083015203601f19810183528261353f565b611fa0836141bf565b604051639ea1c1c960e01b815298899283928960048501613b55565b0381888b5af1958615610427578596612123575b506040516341a4eb5f60e11b815260048101879052918583602481875afa92831561109a5786936120f8575b50606060249394604051948580926350ef5c3560e01b82528b60048301525afa92831561109a5786936120b9575b506001600160801b0392831692168083116120a25750926103307f6cc7689f3960393f975bc636577345ee34fd6fd0b516b15c923e7885e518b098938796936020999660405195869533875260018060a01b03168c87015260408601526060850152608084015260c060a084015260c0830190613960565b6370d1969b60e01b86526004526024829052604485fd5b6001600160801b039193506120e6829160603d6060116120f1575b6120de818361353f565b810190613c1b565b50905093915061202a565b503d6120d4565b602493506121196060913d808a833e612111818361353f565b810190613bdc565b9150509350611ffc565b9095506020813d60201161214f575b8161213f6020938361353f565b810103126106035751945f611fd0565b3d9150612132565b611f5894506001600160801b03935083929150612185611f449160a03d60a01161046e57610456818361353f565b509097509550929350611f139050565b50346103505780600319360112610350575f5160206148575f395f51905f52546040516001600160a01b039091168152602090f35b5034610350576040366003190112610350576121e4613478565b6121ec61348e565b90608092600460405192612200868561353f565b8536853760a060405191612214888461353f565b87368437604051634eb1c24560e11b815293849182905f196001861b01165afa80156103d6578392848594869287946124f6575b506001600160a01b039081168852908116602088015290811660408701529081166060860152851691835b6004811061247057506040516370a0823160e01b815260048101939093526001600160a01b031690602083602481855afa928315612465578493612431575b5095949391906122c182613560565b916122cf604051938461353f565b8083526122db81613560565b602084019690601f1901368837855b82811061239e575050506040519687966101408801948887905b6004821061237b57505050870185905b600482106123615750505061010086015261014061012086015251809152610160840192915b818110612348575050500390f35b825184528594506020938401939092019160010161233a565b825181528998506020928301926001929092019101612314565b82516001600160a01b031681528b9a506020928301926001929092019101612304565b604051632f745c5960e01b81526001600160a01b038316600482015260248101829052989997989597949593949390602082604481895afa80156110185788906123ff575b600192506123f18289613da7565b5201989796949392986122ea565b506020823d8211612429575b816124186020938361353f565b8101031261060357600191516123e3565b3d915061240b565b9092506020813d60201161245d575b8161244d6020938361353f565b810103126106035751915f6122b2565b3d9150612440565b6040513d86823e3d90fd5b60249060206001600160a01b03612487838a613d82565b5116604051938480926370a0823160e01b82528960048301525afa801561109a5786906124c4575b600192506124bd8286613d82565b5201612273565b506020823d82116124ee575b816124dd6020938361353f565b8101031261060357600191516124af565b3d91506124d0565b935050505061251591925060a03d60a01161046e57610456818361353f565b919493919290915f612248565b503461035057612531366138cc565b909291939461253e613f9f565b604051634eb1c24560e11b81526001600160a01b039190911694909260a084600481895afa928315610fc757898a958b95612728575b506001600160a01b0316956001600160801b038116926125b0926125aa92909186906125a28730338c613fc6565b308b8a61441d565b926141f0565b6040516341a4eb5f60e11b8152600481018990526001600160a01b0390951699909481816024818e5afa90811561035357829161270b575b506001600160801b03811686106126f2575b6001600160801b03169961260f8b828961405a565b803b1561035e57818b60648b836040519586948593636f965f9f60e11b8552600485015260248401528160448401525af18015610353576126dd575b5050977ff2960dbf8545963973c9df7f52bdbdd6803dbf97c4597938fa37510b1218aece948860809561268e8296612686869760209f613d75565b9c8d9161455f565b8381116126c1575b505050506040519133835260018060a01b0316888301526040820152856060820152a3604051908152f35b6126d4936126ce91613d75565b9161455f565b805f8381612696565b6126e882809261353f565b610350578061264b565b506001600160801b03612704866141bf565b90506125fa565b61271f91503d8084833e612111818361353f565b5090505f6125e8565b6125aa96506125b092955061274c915060a03d60a01161046e57610456818361353f565b91985090969391506125749050565b503461035057806003193601126103505761277461437f565b61277c613f9f565b600160ff195f5160206148975f395f51905f525416175f5160206148975f395f51905f52557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a180f35b50346103505780600319360112610350575f5160206148d75f395f51905f5254336001600160a01b039091160361280857610baa336143b2565b63118cdaa760e01b815233600452602490fd5b503461035057806003193601126103505761283461437f565b5f5160206148d75f395f51905f5280546001600160a01b03199081169091555f5160206148575f395f51905f528054918216905581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5034610350578060031936011261035057602060ff5f5160206148975f395f51905f5254166040519015158152f35b50346103505780600319360112610350577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630036129215760206040515f5160206148775f395f51905f528152f35b63703e46dd60e11b8152600490fd5b50604036600319011261035057612945613478565b906024356001600160401b03811161035e57612965903690600401613592565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016308114908115612af7575b50612ae8576129a761437f565b6040516352d1902d60e01b8152926001600160a01b0381169190602085600481865afa80958596612ab4575b506129ec57634c9c8ce360e01b84526004839052602484fd5b9091845f5160206148775f395f51905f528103612aa25750813b15612a90575f5160206148775f395f51905f5280546001600160a01b031916821790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8480a28151839015612a765780836020612a7295519101845af4612a6c613ed9565b916147f8565b5080f35b50505034612a815780f35b63b398979f60e01b8152600490fd5b634c9c8ce360e01b8452600452602483fd5b632a87526960e21b8552600452602484fd5b9095506020813d602011612ae0575b81612ad06020938361353f565b810103126109f15751945f6129d3565b3d9150612ac3565b63703e46dd60e11b8252600482fd5b5f5160206148775f395f51905f52546001600160a01b0316141590505f61299a565b50346103505761012036600319011261035057612b34613478565b612b3c61348e565b906044356001600160401b03811161065757612b5c903690600401613750565b916064356001600160401b0381116109f157612b7c9036906004016137be565b93608435916001600160801b038316830361035e57612b996134e4565b94612ba26134fa565b9360e4356001600160401b0381116109f157612bc29036906004016135d8565b92612bcb613f9f565b604051634eb1c24560e11b81526001600160a01b039190911698909160a0836004818d5afa91821561109a578997948794602094612cad9c9894612c88948f9d9b9489948a94612e31575b50612c4b612c43612c58969760018060a01b03169d6001600160801b03612c3c866141f0565b9116613d54565b303387613fc6565b61010435938c309161422b565b998a9160018060a01b03169761051c8b612c7a6040519788928d8b8501613b1a565b03601f19810187528661353f565b612c91886141bf565b604051639ea1c1c960e01b8152998a9283928960048501613b55565b0381848c5af1968715612e24578197612df0575b506040516341a4eb5f60e11b815260048101889052918183602481875afa928315610353578293612dcd575b50606060249394604051948580926350ef5c3560e01b82528c60048301525afa928315610353578293612da0575b506001600160801b03166001600160801b03831690808211612d8a575050509260409692612d7b7f6cc7689f3960393f975bc636577345ee34fd6fd0b516b15c923e7885e518b098938896612d6f896141bf565b8b519586953387613c4a565b0390a382519182526020820152f35b6370d1969b60e01b835260045260245260449150fd5b6001600160801b03919350612dc39060603d6060116120f1576120de818361353f565b5090509290612d1b565b60249350612de66060913d8086833e612111818361353f565b9150509350612ced565b9096506020813d602011612e1c575b81612e0c6020938361353f565b810103126106035751955f612cc1565b3d9150612dff565b50604051903d90823e3d90fd5b612c4b9650612c589550612c439450612e589060a03d60a01161046e57610456818361353f565b92999198509196509150612c169050565b5034610350578060031936011261035057612e8261437f565b5f5160206148975f395f51905f525460ff811615612eda5760ff19165f5160206148975f395f51905f52557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a180f35b638dfc202b60e01b8252600482fd5b503461035057604036600319011261035057612f03613478565b602435908115158092036103e1577f4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca91604091612f3e61437f565b60018060a01b0316908185528460205282852060ff1981541660ff831617905582519182526020820152a180f35b50346103505760203660031901126103505760209060ff906040906001600160a01b03612f97613478565b1681528084522054166040519015158152f35b3461060357608036600319011261060357612fc3613478565b60243590612fcf6134ce565b9160643592831515908185036106035760a0600494612fec613f9f565b604051634eb1c24560e11b815295869182905f196001861b01165afa9485156130e1575f945f905f97613124575b506040516341a4eb5f60e11b8152600481018690526001600160a01b0391909116965f826024818b5afa9687156130e1578897613089956001600160801b03945f92613105575b5081851681861611156130fd5750935b156130ec5750915b1694859161051c83303384613fc6565b833b156106035760645f92836040519687948593636f965f9f60e11b8552600485015287602485015260448401525af19182156130e1576020926130d1575b50604051908152f35b5f6130db9161353f565b5f6130c8565b6040513d5f823e3d90fd5b6001600160a01b0316929050613079565b905093613071565b61311a9192503d805f833e612111818361353f565b509050908b613061565b9195505061314291955060a03d60a01161046e57610456818361353f565b979396925088905061301a565b346106035760207f93065b6ca8f9c36086d73ad337c4138513e460fcb4367c4880651b03da29494f6103306131b66131863661382c565b90613198999698939594979299613f9f565b6131ac6131a48b6141f0565b30338c613fc6565b898689878c61422b565b809760405194859460018060a01b03169860018060a01b0316973386613d0c565b34610603576080366003190112610603576131f0613478565b506131f961348e565b506064356001600160401b03811161060357613219903690600401613592565b50604051630a85bd0160e11b8152602090f35b346106035761323a366136be565b9094919293613247613f9f565b604051634eb1c24560e11b81526001600160a01b039190911695909460a0866004818a5afa80156130e157611b84611fa0896103706132e99a6020955f905f915f91613447575b6001600160801b038a16959293506132d0926132bc918791906001600160a01b031661051c83303384613fc6565b6001600160801b038d169030903390613fc6565b60018060a01b0316976040519485918c8b898501613b1a565b03815f8b5af19586156130e1575f96613413575b506040516341a4eb5f60e11b815260048101879052915f83602481875afa9283156130e1575f936133f0575b50606060249394604051948580926350ef5c3560e01b82528b60048301525afa9283156130e1575f936133c3575b506001600160801b03166001600160801b038316908082116133ae57602088808b7f6cc7689f3960393f975bc636577345ee34fd6fd0b516b15c923e7885e518b0988b8b6103308c8c8c6040519586953387613c4a565b6370d1969b60e01b5f5260045260245260445ffd5b6001600160801b039193506133e69060603d6060116120f1576120de818361353f565b5090509290613357565b602493506134096060913d805f833e612111818361353f565b9150509350613329565b9095506020813d60201161343f575b8161342f6020938361353f565b81010312610603575194876132fd565b3d9150613422565b5050506132d06134686132bc9260a03d60a01161046e57610456818361353f565b91955085945090925061328e9050565b600435906001600160a01b038216820361060357565b602435906001600160a01b038216820361060357565b604435906001600160a01b038216820361060357565b35906001600160a01b038216820361060357565b604435906001600160801b038216820361060357565b60a435906001600160801b038216820361060357565b60c435906001600160801b038216820361060357565b608081019081106001600160401b0382111761352b57604052565b634e487b7160e01b5f52604160045260245ffd5b90601f801991011681019081106001600160401b0382111761352b57604052565b6001600160401b03811161352b5760051b60200190565b6001600160401b03811161352b57601f01601f191660200190565b81601f82011215610603578035906135a982613577565b926135b7604051948561353f565b8284526020838301011161060357815f926020809301838601378301015290565b9080601f83011215610603578135916135f083613560565b926135fe604051948561353f565b80845260208085019160051b830101918383116106035760208101915b83831061362a57505050505090565b82356001600160401b038111610603578201906080828703601f190112610603576040519061365882613510565b613664602084016134ba565b8252613672604084016134ba565b6020830152613683606084016134ba565b60408301526080830135916001600160401b038311610603576136ae88602080969581960101613592565b606082015281520192019161361b565b9060c0600319830112610603576004356001600160a01b038116810361060357916024356001600160a01b038116810361060357916044356001600160801b038116810361060357916064356001600160801b038116810361060357916084356001600160801b0381168103610603579160a435906001600160401b0382116106035761374d916004016135d8565b90565b9080601f830112156106035781359061376882613560565b92613776604051948561353f565b82845260208085019360051b82010191821161060357602001915b81831061379e5750505090565b82356001600160a01b038116810361060357815260209283019201613791565b9080601f83011215610603578135906137d682613560565b926137e4604051948561353f565b82845260208085019360051b82010191821161060357602001915b81831061380c5750505090565b82356001600160801b0381168103610603578152602092830192016137ff565b60e0600319820112610603576004356001600160a01b038116810361060357916024356001600160a01b038116810361060357916044356001600160a01b038116810361060357916064356001600160401b038111610603578261389291600401613750565b91608435906001600160401b038211610603576138b1916004016137be565b9060a4356001600160801b0381168103610603579060c43590565b60e0600319820112610603576004356001600160a01b038116810361060357916024356001600160a01b03811681036106035791604435916064356001600160401b038111610603578261389291600401613750565b6080906003190112610603576004356001600160a01b038116810361060357906024356001600160a01b038116810361060357906044359060643590565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b81601f820112156106035780359061399b82613560565b926139a9604051948561353f565b8284526020606081860194028301019181831161060357602001925b8284106139d3575050505090565b606084830312610603576040519060608201908282106001600160401b0383111761352b57606092602092604052863581528287013583820152604087013560408201528152019301926139c5565b51906001600160a01b038216820361060357565b908160a091031261060357613a4a81613a22565b91613a5760208301613a22565b60408301519092906001600160a01b0381168103610603579161374d6080613a8160608501613a22565b9301613a22565b9080602083519182815201916020808360051b8301019401925f915b838310613ab357505050505090565b9091929394602080613b0b600193601f19868203018752608060608b51878060a01b038151168452878060a01b03868201511686850152878060a01b0360408201511660408501520151918160608201520190613960565b97019301930191939290613aa4565b939290613b4b926001600160801b039160018060a01b03168652166020850152608060408501526080840190613a88565b9160606001910152565b6001600160801b0361374d949360609360018060a01b031683521660208201528160408201520190613960565b51906001600160801b038216820361060357565b81601f8201121561060357805190613bad82613577565b92613bbb604051948561353f565b8284526020838301011161060357815f9260208093018386015e8301015290565b9160608383031261060357613bf083613a22565b92613bfd60208201613b82565b9260408201516001600160401b0381116106035761374d9201613b96565b908160609103126106035780518015158103610603579161374d6040613c4360208501613b82565b9301613b82565b6001600160a01b039182168152911660208201526001600160801b039182166040820152918116606083015291909116608082015260c060a0820181905261374d92910190613960565b90602080835192838152019201905f5b818110613cb15750505090565b82516001600160a01b0316845260209384019390920191600101613ca4565b90602080835192838152019201905f5b818110613ced5750505090565b82516001600160801b0316845260209384019390920191600101613ce0565b6001600160a01b0391821681529116602082015260a06040820181905290949392608092613d4f92613d419190880190613c94565b908682036060880152613cd0565b930152565b91908201809211613d6157565b634e487b7160e01b5f52601160045260245ffd5b91908203918211613d6157565b906004811015613d935760051b0190565b634e487b7160e01b5f52603260045260245ffd5b8051821015613d935760209160051b010190565b8115613dc5570490565b634e487b7160e01b5f52601260045260245ffd5b91908260409103126106035761374d602083519301613b82565b9080601f8301121561060357815191613e0b83613560565b92613e19604051948561353f565b80845260208085019160051b830101918383116106035760208101915b838310613e4557505050505090565b82516001600160401b038111610603578201906080828703601f1901126106035760405190613e7382613510565b613e7f60208401613a22565b8252613e8d60408401613a22565b6020830152613e9e60608401613a22565b60408301526080830151916001600160401b03831161060357613ec988602080969581960101613b96565b6060820152815201920191613e36565b3d15613f03573d90613eea82613577565b91613ef8604051938461353f565b82523d5f602084013e565b606090565b6001600160a01b03909116815260406020820181905261374d92910190613960565b90602080835192838152019201905f5b818110613f475750505090565b9091926020606060019260408751805183528481015185840152015160408201520194019101919091613f3a565b61374d916020613f8e8351604084526040840190613f2a565b920151906020818403910152613f2a565b60ff5f5160206148975f395f51905f525416613fb757565b63d93c066560e01b5f5260045ffd5b90925f19811461404b576001600160a01b03848116908416148015614043575b61403d576040516323b872dd60e01b60208201526001600160a01b039485166024820152929093166044830152606482019290925261403b9161403682608481015b03601f19810184528361353f565b6147a0565b565b50505050565b508015613fe6565b630d550c3b60e11b5f5260045ffd5b821580156141ad575b6141a857604051636eb1769f60e11b81523060048201526001600160a01b03838116602483018190529490831691602081604481865afa9081156130e1575f91614174575b506140f0946140fe6140bd6020945f94613d54565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529687906064820190565b03601f19810188528761353f565b85519082865af1903d5f519083614155575b5050501561411d57505050565b61403661403b936040519063095ea7b360e01b602083015260248201525f60448201526044815261414f60648261353f565b826147a0565b9192509061416a57503b15155b5f8080614110565b6001915014614162565b90506020813d6020116141a0575b8161418f6020938361353f565b8101031261060357516140f06140a8565b3d9150614182565b505050565b506001600160a01b0382163014614063565b6001600160801b0381116141d9576001600160801b031690565b6306dfcc6560e41b5f52608060045260245260445ffd5b5f9190825b81518410156142265761421e6001916001600160801b036142168786613da7565b511690613d54565b9301926141f5565b925050565b929590939194955f978151845103614370575f985b82518a101561432f578760208860c4895f8f6001600160801b0361428c828c8f946142729060018060a01b0392613da7565b5116936115b0846142838484613da7565b5116868961405a565b51604051632cfdfa9360e11b81526001600160a01b03958616600482015296851660248801529390971660448601529590911660648401526084830181905260a483018990529193849283915af19081156130e1575f916142fd575b506142f590600192613d54565b990198614240565b90506020813d8211614327575b816143176020938361353f565b81010312610603575160016142e8565b3d915061430a565b9850966001600160801b031695505050838610915061434e9050575050565b83906319aae4c960e11b5f5260018060a01b031660045260245260445260645ffd5b631f77022160e11b5f5260045ffd5b5f5160206148575f395f51905f52546001600160a01b0316330361439f57565b63118cdaa760e01b5f523360045260245ffd5b5f5160206148d75f395f51905f5280546001600160a01b03199081169091555f5160206148575f395f51905f5280549182166001600160a01b0393841690811790915591167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b92969590939491945f978051825103614370575f985b81518a101561451e578760208860c4895f8f806001600160801b0361447c818f946144668e9160018060a01b0392613da7565b511694169261447684868961405a565b8d613da7565b51166040519889978896637a633c3f60e11b885260018060a01b0316600488015260018060a01b0316602487015260018060a01b03166044860152606485015260848401528a60a48401525af19081156130e1575f916144ec575b506144e490600192613d54565b990198614433565b90506020813d8211614516575b816145066020938361353f565b81010312610603575160016144d7565b3d91506144f9565b98505050509092506001600160801b039150169081841161453d575050565b839063f60dba4560e01b5f5260018060a01b031660045260245260445260645ffd5b9091905f19821461404b576001600160a01b038316301480156145bb575b6141a85760405163a9059cbb60e01b60208201526001600160a01b039093166024840152604483019190915261403b91906140368260648101614028565b50811561457d565b6040519060208201526020815261374d60408261353f565b919091825115614766575f905b8351821015614226576001600160a01b036146038386613da7565b5151165f525f60205260ff60405f2054161561473f575f9081906001600160a01b0360206146318689613da7565b510151166146a76001600160a01b03604061464c888b613da7565b51015116614028606061465f898c613da7565b510151614695604051968794602086019763e0a8041360e01b8952602487015260448601526080606486015260a4850190613960565b83810360231901608485015290613960565b6001600160a01b036146b98689613da7565b5151169151915af46146c9613ed9565b901561470d578051810190602081830312610603576020810151906001600160401b038211610603576020614705928160019501920101613b96565b9101906145e8565b6001600160a01b0361471f8386613da7565b5151604051630de816ad60e31b8152928392611bde921660048401613f08565b6001600160a01b036147518386613da7565b51511663616d132960e01b5f5260045260245ffd5b639f6de0d560e01b5f5260045ffd5b60ff5f5160206148b75f395f51905f525460401c161561479157565b631afcd79f60e31b5f5260045ffd5b905f602091828151910182855af1156130e1575f513d6147ef57506001600160a01b0381163b155b6147cf5750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156147c8565b9061481c575080511561480d57805190602001fd5b63d6bda27560e01b5f5260045ffd5b8151158061484d575b61482d575090565b639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b50803b1561482556fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbccd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00a2646970667358221220e106c62c73be28f2dbb47262f64239ed9170f58d193346eca506e5e79d5afc1364736f6c634300081b0033", + "nonce": "0x370", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xbe5df407fa72780b002befbd26a581cf2da506e2784a251b88c7eb3cbae35f3b", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "gas": "0x1077f", + "value": "0x0", + "input": "0x27e87808000000000000000000000000c47591f5c023e44931c78d5a993834875b79fb110000000000000000000000008ffc4da23ee650ffdd3cb4880a644ce17d2e562300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x371", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x12f48fc", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x38269b852581d4528fe48065c5f52a299037abc3175a7c7652d168747a9fb0dc", + "transactionIndex": "0x46", + "blockHash": "0xf81041784fabdec11e163476aa16f818236cb72dcc3567657cf94acc71327bee", + "blockNumber": "0x15bb1f6", + "gasUsed": "0x3e9f71", + "effectiveGasPrice": "0x4955e6ea", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": null, + "contractAddress": "0x8ffc4da23ee650ffdd3cb4880a644ce17d2e5623" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x13007c1", + "logs": [ + { + "address": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x0000000000000000000000008ffc4da23ee650ffdd3cb4880a644ce17d2e5623" + ], + "data": "0x", + "blockHash": "0xf81041784fabdec11e163476aa16f818236cb72dcc3567657cf94acc71327bee", + "blockNumber": "0x15bb1f6", + "blockTimestamp": "0x685cdba3", + "transactionHash": "0xbe5df407fa72780b002befbd26a581cf2da506e2784a251b88c7eb3cbae35f3b", + "transactionIndex": "0x47", + "logIndex": "0x160", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000400000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000004002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000100000000000000000000000001000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000", + "type": "0x2", + "transactionHash": "0xbe5df407fa72780b002befbd26a581cf2da506e2784a251b88c7eb3cbae35f3b", + "transactionIndex": "0x47", + "blockHash": "0xf81041784fabdec11e163476aa16f818236cb72dcc3567657cf94acc71327bee", + "blockNumber": "0x15bb1f6", + "gasUsed": "0xbec5", + "effectiveGasPrice": "0x4955e6ea", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "contractAddress": null + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1750916028, + "chain": 1, + "commit": "c6cbea8" +} \ No newline at end of file diff --git a/broadcast/UpgradeRouterForRepayingGt.s.sol/1/run-latest.json b/broadcast/UpgradeRouterForRepayingGt.s.sol/1/run-latest.json new file mode 100644 index 0000000..1d04c65 --- /dev/null +++ b/broadcast/UpgradeRouterForRepayingGt.s.sol/1/run-latest.json @@ -0,0 +1,97 @@ +{ + "transactions": [ + { + "hash": "0x38269b852581d4528fe48065c5f52a299037abc3175a7c7652d168747a9fb0dc", + "transactionType": "CREATE", + "contractName": "TermMaxRouter_Repay_Gt", + "contractAddress": "0x8ffc4da23ee650ffdd3cb4880a644ce17d2e5623", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "gas": "0x5168df", + "value": "0x0", + "input": "0x60a080604052346029573060805261492c908161002e82396080518181816128dc015261296f0152f35b5f80fdfe60806040526004361015610011575f80fd5b5f5f3560e01c80631443c4d61461322c578063150b7a02146131d75780631ac100a41461314f5780632a51cf5114612faa5780632e3e3ef214612f6c5780632f20734514612ee95780633f4ba83a14612e6957806345618d2b14612b195780634f1ef2861461293057806352d1902d146128c95780635c975abb1461289a578063715018a61461281b57806379ba5097146127ce5780638456cb591461275b57806384e090911461252257806389c3584d146121ca5780638da5cb5b14612195578063943189f414611eb257806395320fd014611c1357806399a54a5a14611974578063ad3cb1cc14611927578063c4d66de81461177a578063c71c700c146113bd578063d3e052cf146110a5578063df3e1e0514610d2f578063e30c397814610cfa578063e9919e5c14610c5c578063ef8b4968146109f5578063f1a229ad1461070e578063f2fde38b14610688578063f38743f3146104755763fc1c1b211461017a575f80fd5b3461035057610188366138cc565b91929690959394610197613f9f565b604051634eb1c24560e11b81526001600160a01b039190911697909260a0846004818c5afa9485156103d657839288859486978799610432575b506001600160a01b0390811697169461020291906101f18230338a613fc6565b6001600160a01b031695869061405a565b604061022f8c6102118c6145c3565b8884519e8f9485938492637a0ee4f960e11b84523060048501613b55565b03925af196871561042757859a86986103e5575b509187918961025395948961441d565b92610267846001600160801b038716613d75565b8281610362575b9150503b1561035e57604051632142170760e11b81523060048201526001600160a01b0386166024820152604481018890529082908290818381606481015b03925af180156103535761033b575b602087808a7fdc3efdf28701077a23ef0beb0f3260ca639658ce2676bbc9d83030fac6ce56128a8a6103308b6102f18c6141bf565b604080513381526001600160a01b0390951660208601528401949094526001600160801b039081166060840152909216608082015290819060a0820190565b0390a3604051908152f35b61034682809261353f565b61035057806102bc565b80fd5b6040513d84823e3d90fd5b5080fd5b81610370916103759461405a565b6141bf565b813b156103e1576001600160801b0360405191636f965f9f60e11b8352896004840152166024820152826044820152828160648183865af180156103d6579083916103c1575b8261026e565b816103cb9161353f565b61035e57815f6103bb565b6040513d85823e3d90fd5b8280fd5b610253949391929b508998506104129060403d604011610420575b61040a818361353f565b810190613dd9565b9b909b985091909293610243565b503d610400565b6040513d87823e3d90fd5b9198505061045e919650610202945060a03d60a01161046e575b610456818361353f565b810190613a36565b99909891969193909250906101d1565b503d61044c565b50346103505760a03660031901126103505761048f613478565b9061049861348e565b90604435926064356001600160401b0381116103e1576104bc9036906004016135d8565b608435936104c8613f9f565b604051634eb1c24560e11b81526001600160a01b039190911693909160a083600481885afa928315610353578588918490859661065b575b506105219291906001600160a01b031661051c83303384613fc6565b61405a565b604051633def417960e11b815260048101889052306024820152908282604481838a5af180156103d65783928491610607575b509061055f916145db565b90602082519281808201948592010103126106035761057f915190613d54565b948086106105e2575050602094826105bb867fc1822dac55540066416ffa59d2eb79715d05171ecf435ac5226726b50686d9419560809561455f565b604051918252338783015260018060a01b03166040820152846060820152a2604051908152f35b856064936319aae4c960e11b845260018060a01b0316600452602452604452fd5b5f80fd5b9250503d8084843e610619818461353f565b8201604083820312610657578251926020810151906001600160401b038211610653579161064c9161055f949301613b96565b9091610554565b8580fd5b8380fd5b6105219392965061067b915060a03d60a01161046e57610456818361353f565b9894959250610500915050565b5034610350576020366003190112610350576106a2613478565b6106aa61437f565b5f5160206148d75f395f51905f5280546001600160a01b0319166001600160a01b039283169081179091555f5160206148575f395f51905f52549091167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b50346103505761010036600319011261035057610729613478565b9061073261348e565b916044356064356001600160401b03811161065757610755903690600401613750565b6084356001600160401b0381116109f1576107749036906004016137be565b9160a435918215158093036106535760c4356001600160401b0381116109ed5760a06107a5600492369084016135d8565b986107ae613f9f565b604051634eb1c24560e11b815292839182905f196001861b01165afa9788156109e25787918890899a6109bb575b506001600160a01b031695863b156109ac57604051635c46a7ef60e11b815233600482015230602482015285604482015260806064820152896084820152898160a481838c5af180156109b057908a91610997575b50506108a69261085d979695949261086f610890936040519a8b9660a0602089015260c0880190613c94565b868103601f1901604088015290613cd0565b6001600160a01b039092166060850152838203601f19016080850152613a88565b60e43560a083015203601f19810186528561353f565b823b1561065357916108e593918680946040519687958694859363078ad17360e31b855260048501526024840152606060448401526064830190613960565b03925af180156103d657908391610982575b50506040516370a0823160e01b81523060048201526020816024816001600160a01b0388165afa9283156109765792610941575b50816109399160209461455f565b604051908152f35b9091506020813d60201161096e575b8161095d6020938361353f565b81010312610603575190602061092b565b3d9150610950565b604051903d90823e3d90fd5b8161098c9161353f565b61035e57815f6108f7565b816109a19161353f565b6109ac57885f610831565b8880fd5b6040513d8c823e3d90fd5b919950506109d8915060a03d60a01161046e57610456818361353f565b9a9250505f6107dc565b6040513d89823e3d90fd5b8680fd5b8480fd5b50346103505760a036600319011261035057610a0f613478565b6024356001600160801b0381168091036103e157610a2b6134a4565b506064356001600160401b03811161065757610a4b903690600401613592565b916084356001600160401b0381116109f157610a6b903690600401613592565b805181019360a082602087019603126106535760208201516001600160401b0381116109ed5782019480603f870112156109ed57602086015195610aae87613560565b96610abc604051988961353f565b808852602080808a019260051b8401010191838311610c2057604001905b828210610c445750505060408301516001600160401b038111610c4057830181603f82011215610c4057602081015190610b1382613560565b91610b21604051938461353f565b8083526020808085019260051b8401010191848311610c3c57604001905b828210610c2457505050610b5560608501613a22565b916080850151946001600160401b038611610c2057610b7e610b8992602060a098840101613df3565b9586910151946145db565b936001600160a01b0386811690841614610bad575b88610baa88338961405a565b80f35b80515f198101908111610c0c576001600160a01b0391604091610bcf91613da7565b51015116966020855195818082019788920101031261060357610baa97610bf9610c0196516141bf565b93309161441d565b505f80808080610b9e565b634e487b7160e01b8a52601160045260248afd5b8980fd5b60208091610c3184613b82565b815201910190610b3f565b8a80fd5b8780fd5b60208091610c5184613a22565b815201910190610ada565b5034610350576020610cd5610330610cdc7f18f137cdb80704341c5da72a0f5776e3361de90e2a157d704a4b79d96b753aa6610ccc610c9a3661382c565b869a9596949992939791610cac613f9f565b84898c8a6001600160801b03851699610cc78b303384613fc6565b61441d565b998a8094613d75565b338a61455f565b6040516001600160a01b039485169890941696939485943386613d0c565b50346103505780600319360112610350575f5160206148d75f395f51905f52546040516001600160a01b039091168152602090f35b503461035057610d3e36613922565b91610d4a939193613f9f565b604051634eb1c24560e11b81526001600160a01b0391909116929060a081600481875afa90811561109a5786908790889361106c575b506040516331a9108f60e11b8152600481018890526001600160a01b0391821693909160209183916024918391165afa908115611018578891611032575b50336001600160a01b039091160361102357604051633f5ffaf560e01b8152602081600481895afa908115611018578891610fe6575b506305f5e1008402908482046305f5e1001485151715610fd2576305f5e10003906305f5e1008211610fd257610e2d9161037091613dbb565b906001600160801b03604051926339a380ed60e01b845230600485015216938460248401528760448401526020836064818c8b5af18015610fc75787938a91610f74575b509293610eaf93859261051c916001600160801b031680821015610f695750809681955b610ea183303388613fc6565b6001600160a01b031661405a565b833b1561065357604051632770a7eb60e21b81526001600160a01b03841660048201526024810182905286908181604481838a5af1801561035357610f50575b5050916001600160801b0360a092610f277fdc3efdf28701077a23ef0beb0f3260ca639658ce2676bbc9d83030fac6ce5612956141bf565b9060405193338552600180871b031660208501528860408501526060840152166080820152a380f35b81610f5d9195939561353f565b6106535791855f610eef565b905080968195610e95565b9350506020833d602011610fbf575b81610f906020938361353f565b810103126109ac57869361051c85926001600160801b03610fb3610eaf97613b82565b93975050929450610e71565b3d9150610f83565b6040513d8b823e3d90fd5b634e487b7160e01b89526011600452602489fd5b90506020813d602011611010575b816110016020938361353f565b8101031261060357515f610df4565b3d9150610ff4565b6040513d8a823e3d90fd5b6315e69dc560e21b8752600487fd5b90506020813d602011611064575b8161104d6020938361353f565b81010312610c405761105e90613a22565b5f610dbe565b3d9150611040565b602493506020925061108d915060a03d60a01161046e57610456818361353f565b5050939192909150610d80565b6040513d88823e3d90fd5b503461035057610100366003190112610350576110c0613478565b6110c861348e565b6064356001600160a01b03811693919084900361035e57608435936110eb6134e4565b936110f46134fa565b9260e435916001600160401b03831161065357604060031984360301126106535760405192604084018481106001600160401b038211176113a95760405280600401356001600160401b038111610c40576111559060043691840101613984565b845260248101356001600160401b038111610c405761117991369101600401613984565b6020840152611186613f9f565b604051634eb1c24560e11b8152966001600160a01b0391909116949060a088600481895afa9687156109765780978199829161137d575b5060405163887bb98960e01b81526001600160a01b03909516600486018190526044803560248801528601979097526080606486015260208580611204608482018a613f75565b0381858c5af1948515610353578295611341575b508a6112dc575b5050927fac20b37c6c923070aa8deac25d6e9bf9f6eecd727d9c2b89d0451685ecf4ba5294926001600160801b03610330938160209c9716998a806112bd575b50501698898061129e575b505060018060a01b031697889760405195869586528b8601526040850152606084015260a0608084015260a0830190613f75565b6112b6916001600160a01b0384811691339116613fc6565b5f8961126a565b6112d5916001600160a01b0386811691339116613fc6565b5f8a61125f565b8a886112ee9261051c83303384613fc6565b863b15610350576040516340c10f1960e01b81526001600160a01b0385166004820152602481018b90528181604481838c5af18015610353571561121f5761133782809261353f565b610350578061121f565b9094506020813d602011611375575b8161135d6020938361353f565b8101031261035e5761136e90613a22565b935f611218565b3d9150611350565b9198505061139b91985060a03d60a01161046e57610456818361353f565b9a939150509790985f6111bd565b634e487b7160e01b88526041600452602488fd5b503461035057610100366003190112610350576113d8613478565b6113e061348e565b6113e86134ce565b92606435926001600160801b038416928385036103e1576084356001600160401b0381116106575761141e903690600401613750565b9460a4356001600160401b0381116109f15761143e9036906004016137be565b916114476134fa565b9260e43591611454613f9f565b604051634eb1c24560e11b81526001600160a01b039190911698909360a0856004818d5afa958615611018578a9b899a9b998b978c99611746575b506001600160a01b03908116976001600160801b0392909216939116908c84111561173457966001600160801b0381985b169a8b906114d086303386613fc6565b6114d99261405a565b898d6114e78e303386613fc6565b6114f09261405a565b8b3b15610c2057604051632770a7eb60e21b81526001600160a01b0389166004820152602481018a90528a818e8183816044810103925af1801561172957908b91611714575b5050899b835185510361170557999b989a8c9a6001600160a01b03998a169a988a16998816989091908c5b8651111561164d578b8f8c8f8d60c4918e8e6001600160801b038f8f986115b5916115b060209b6115998460018060a01b0392613da7565b51169687866115a88686613da7565b51169161405a565b613da7565b51166040519889978896632cfdfa9360e11b8852600488015260248701526044860152606485015282608485015260a48401525af1908115611640578e9161160e575b5061160590600192613d54565b9e019d8e611561565b90506020813d8211611638575b816116286020938361353f565b81010312610603575160016115f8565b3d915061161b565b8e604051903d90823e3d90fd5b858c928f8f906001600160801b038f91611668908d97613d54565b9816908189106116ea57505050602096926116cb7f482c5c16eb3726edd4dc0b4e52fdb8488530e472f26df2a268d3d94edfc135a095936116d9936040519687963388528c8801526040870152606086015260e0608086015260e0850190613c94565b9083820360a0850152613cd0565b8560c08301520390a2604051908152f35b6319aae4c960e11b8352600452602488905260445260649150fd5b631f77022160e11b8b5260048bfd5b8161171e9161353f565b610c2057895f611536565b6040513d8d823e3d90fd5b5082966001600160801b0382986114c0565b90506001600160801b03985061176c91975060a03d60a01161046e57610456818361353f565b9a92999392915061148f9050565b503461035057602036600319011261035057611794613478565b5f5160206148b75f395f51905f52549060ff8260401c1615916001600160401b0381168015908161191f575b6001149081611915575b15908161190c575b506118fd5767ffffffffffffffff1981166001175f5160206148b75f395f51905f5255826118d1575b50611804614775565b61180c614775565b611814614775565b60ff195f5160206148975f395f51905f5254165f5160206148975f395f51905f525561183e614775565b611846614775565b6001600160a01b038116156118bd5761185e906143b2565b6118655780f35b68ff0000000000000000195f5160206148b75f395f51905f5254165f5160206148b75f395f51905f52557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a180f35b631e4fbdf760e01b83526004839052602483fd5b68ffffffffffffffffff191668010000000000000001175f5160206148b75f395f51905f52555f6117fb565b63f92ee8a960e01b8452600484fd5b9050155f6117d2565b303b1591506117ca565b8491506117c0565b50346103505780600319360112610350575061197060405161194a60408261353f565b60058152640352e302e360dc1b6020820152604051918291602083526020830190613960565b0390f35b50346103505760803660031901126103505761198e613478565b5061199761348e565b506064356001600160401b03811161035e576119b7903690600401613592565b908151820160808382031261035e5760208301516001600160a01b03811693908490036103e1576040810151916060820151906001600160401b0382116109f157608091602080611a0c930191850101613df3565b9101519160028310156106575781611a29611a4692604435613d54565b60405190602082015260208152611a4160408261353f565b6145db565b815190915f198201918211611bff5790611a5f91613da7565b5180516001600160a01b031684526020849052604084205490929060ff1615611be25780611b2457505060409081015190516370a0823160e01b81523060048201526001600160a01b039091169190602081602481865afa9182156109765791611af0575b508061197093611ad6611adc936145c3565b9361405a565b604051918291602083526020830190613960565b90506020813d602011611b1c575b81611b0b6020938361353f565b810103126106035751611970611ac4565b3d9150611afe565b9193909291600114611b3d575b50506119709150611adc565b8190604085019460018060a01b0386511690604051926020840192639df3032560e01b84526024850152604484015260606064840152611b9283611b846084820189613960565b03601f19810185528461353f565b519151916001600160a01b03165af491611baa613ed9565b9215611bb65780611b31565b51604051631d039b4360e11b815292839250611bde916001600160a01b031660048401613f08565b0390fd5b825163616d132960e01b85526001600160a01b0316600452602484fd5b634e487b7160e01b85526011600452602485fd5b503461035057611c2236613922565b93929091611c2e613f9f565b604051634eb1c24560e11b81526001600160a01b0391909116949060a081600481895afa8015610427578590858788948993611e81575b506001600160a01b0392831694921691611c979190611c8682303389613fc6565b6001600160a01b031694859061405a565b604051633f5ffaf560e01b81526020816004818c5afa908115611018578891611e4f575b506305f5e1008502908582046305f5e1001486151715610fd2576305f5e10003906305f5e1008211610fd2576103708995949392611cf892613dbb565b946040611d258b611d088b6145c3565b83519c8d80948193637a0ee4f960e11b83528d3060048501613b55565b03925af18015610427579085949392918b969a8691611e12575b509161051c87926001600160801b03611d6e9695168082105f14611e07575080988195610ea183303388613fc6565b873b1561035e57604051632770a7eb60e21b81526001600160a01b0386166004820152602481018490528281604481838d5af180156103d657908391611df2575b5050803b1561035e57604051632142170760e11b81523060048201526001600160a01b0386166024820152604481018890529082908290818381606481016102ad565b81611dfc9161353f565b61035e57815f611daf565b905080988195610e95565b6001600160801b039b50611d6e949391508792611e4061051c9260403d6040116104205761040a818361353f565b9d909d93959650509250611d3f565b90506020813d602011611e79575b81611e6a6020938361353f565b8101031261060357515f611cbb565b3d9150611e5d565b91935050611c979350611ea3915060a03d60a01161046e57610456818361353f565b50909492939092909190611c65565b503461035057611ec1366136be565b9194929593611ece613f9f565b604051634eb1c24560e11b81526001600160a01b03919091169560a0826004818a5afa90811561109a57611f978899611fbc9994602094611f83948b8c938d93612157575b506001600160801b03948516989394611f5894909291611f44918b916001600160a01b031661051c83303384613fc6565b1690309033906001600160a01b0316613fc6565b60018060a01b03169560405192839188868401528a60408401526080606084015260a0830190613a88565b89608083015203601f19810183528261353f565b611fa0836141bf565b604051639ea1c1c960e01b815298899283928960048501613b55565b0381888b5af1958615610427578596612123575b506040516341a4eb5f60e11b815260048101879052918583602481875afa92831561109a5786936120f8575b50606060249394604051948580926350ef5c3560e01b82528b60048301525afa92831561109a5786936120b9575b506001600160801b0392831692168083116120a25750926103307f6cc7689f3960393f975bc636577345ee34fd6fd0b516b15c923e7885e518b098938796936020999660405195869533875260018060a01b03168c87015260408601526060850152608084015260c060a084015260c0830190613960565b6370d1969b60e01b86526004526024829052604485fd5b6001600160801b039193506120e6829160603d6060116120f1575b6120de818361353f565b810190613c1b565b50905093915061202a565b503d6120d4565b602493506121196060913d808a833e612111818361353f565b810190613bdc565b9150509350611ffc565b9095506020813d60201161214f575b8161213f6020938361353f565b810103126106035751945f611fd0565b3d9150612132565b611f5894506001600160801b03935083929150612185611f449160a03d60a01161046e57610456818361353f565b509097509550929350611f139050565b50346103505780600319360112610350575f5160206148575f395f51905f52546040516001600160a01b039091168152602090f35b5034610350576040366003190112610350576121e4613478565b6121ec61348e565b90608092600460405192612200868561353f565b8536853760a060405191612214888461353f565b87368437604051634eb1c24560e11b815293849182905f196001861b01165afa80156103d6578392848594869287946124f6575b506001600160a01b039081168852908116602088015290811660408701529081166060860152851691835b6004811061247057506040516370a0823160e01b815260048101939093526001600160a01b031690602083602481855afa928315612465578493612431575b5095949391906122c182613560565b916122cf604051938461353f565b8083526122db81613560565b602084019690601f1901368837855b82811061239e575050506040519687966101408801948887905b6004821061237b57505050870185905b600482106123615750505061010086015261014061012086015251809152610160840192915b818110612348575050500390f35b825184528594506020938401939092019160010161233a565b825181528998506020928301926001929092019101612314565b82516001600160a01b031681528b9a506020928301926001929092019101612304565b604051632f745c5960e01b81526001600160a01b038316600482015260248101829052989997989597949593949390602082604481895afa80156110185788906123ff575b600192506123f18289613da7565b5201989796949392986122ea565b506020823d8211612429575b816124186020938361353f565b8101031261060357600191516123e3565b3d915061240b565b9092506020813d60201161245d575b8161244d6020938361353f565b810103126106035751915f6122b2565b3d9150612440565b6040513d86823e3d90fd5b60249060206001600160a01b03612487838a613d82565b5116604051938480926370a0823160e01b82528960048301525afa801561109a5786906124c4575b600192506124bd8286613d82565b5201612273565b506020823d82116124ee575b816124dd6020938361353f565b8101031261060357600191516124af565b3d91506124d0565b935050505061251591925060a03d60a01161046e57610456818361353f565b919493919290915f612248565b503461035057612531366138cc565b909291939461253e613f9f565b604051634eb1c24560e11b81526001600160a01b039190911694909260a084600481895afa928315610fc757898a958b95612728575b506001600160a01b0316956001600160801b038116926125b0926125aa92909186906125a28730338c613fc6565b308b8a61441d565b926141f0565b6040516341a4eb5f60e11b8152600481018990526001600160a01b0390951699909481816024818e5afa90811561035357829161270b575b506001600160801b03811686106126f2575b6001600160801b03169961260f8b828961405a565b803b1561035e57818b60648b836040519586948593636f965f9f60e11b8552600485015260248401528160448401525af18015610353576126dd575b5050977ff2960dbf8545963973c9df7f52bdbdd6803dbf97c4597938fa37510b1218aece948860809561268e8296612686869760209f613d75565b9c8d9161455f565b8381116126c1575b505050506040519133835260018060a01b0316888301526040820152856060820152a3604051908152f35b6126d4936126ce91613d75565b9161455f565b805f8381612696565b6126e882809261353f565b610350578061264b565b506001600160801b03612704866141bf565b90506125fa565b61271f91503d8084833e612111818361353f565b5090505f6125e8565b6125aa96506125b092955061274c915060a03d60a01161046e57610456818361353f565b91985090969391506125749050565b503461035057806003193601126103505761277461437f565b61277c613f9f565b600160ff195f5160206148975f395f51905f525416175f5160206148975f395f51905f52557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a180f35b50346103505780600319360112610350575f5160206148d75f395f51905f5254336001600160a01b039091160361280857610baa336143b2565b63118cdaa760e01b815233600452602490fd5b503461035057806003193601126103505761283461437f565b5f5160206148d75f395f51905f5280546001600160a01b03199081169091555f5160206148575f395f51905f528054918216905581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5034610350578060031936011261035057602060ff5f5160206148975f395f51905f5254166040519015158152f35b50346103505780600319360112610350577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630036129215760206040515f5160206148775f395f51905f528152f35b63703e46dd60e11b8152600490fd5b50604036600319011261035057612945613478565b906024356001600160401b03811161035e57612965903690600401613592565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016308114908115612af7575b50612ae8576129a761437f565b6040516352d1902d60e01b8152926001600160a01b0381169190602085600481865afa80958596612ab4575b506129ec57634c9c8ce360e01b84526004839052602484fd5b9091845f5160206148775f395f51905f528103612aa25750813b15612a90575f5160206148775f395f51905f5280546001600160a01b031916821790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8480a28151839015612a765780836020612a7295519101845af4612a6c613ed9565b916147f8565b5080f35b50505034612a815780f35b63b398979f60e01b8152600490fd5b634c9c8ce360e01b8452600452602483fd5b632a87526960e21b8552600452602484fd5b9095506020813d602011612ae0575b81612ad06020938361353f565b810103126109f15751945f6129d3565b3d9150612ac3565b63703e46dd60e11b8252600482fd5b5f5160206148775f395f51905f52546001600160a01b0316141590505f61299a565b50346103505761012036600319011261035057612b34613478565b612b3c61348e565b906044356001600160401b03811161065757612b5c903690600401613750565b916064356001600160401b0381116109f157612b7c9036906004016137be565b93608435916001600160801b038316830361035e57612b996134e4565b94612ba26134fa565b9360e4356001600160401b0381116109f157612bc29036906004016135d8565b92612bcb613f9f565b604051634eb1c24560e11b81526001600160a01b039190911698909160a0836004818d5afa91821561109a578997948794602094612cad9c9894612c88948f9d9b9489948a94612e31575b50612c4b612c43612c58969760018060a01b03169d6001600160801b03612c3c866141f0565b9116613d54565b303387613fc6565b61010435938c309161422b565b998a9160018060a01b03169761051c8b612c7a6040519788928d8b8501613b1a565b03601f19810187528661353f565b612c91886141bf565b604051639ea1c1c960e01b8152998a9283928960048501613b55565b0381848c5af1968715612e24578197612df0575b506040516341a4eb5f60e11b815260048101889052918183602481875afa928315610353578293612dcd575b50606060249394604051948580926350ef5c3560e01b82528c60048301525afa928315610353578293612da0575b506001600160801b03166001600160801b03831690808211612d8a575050509260409692612d7b7f6cc7689f3960393f975bc636577345ee34fd6fd0b516b15c923e7885e518b098938896612d6f896141bf565b8b519586953387613c4a565b0390a382519182526020820152f35b6370d1969b60e01b835260045260245260449150fd5b6001600160801b03919350612dc39060603d6060116120f1576120de818361353f565b5090509290612d1b565b60249350612de66060913d8086833e612111818361353f565b9150509350612ced565b9096506020813d602011612e1c575b81612e0c6020938361353f565b810103126106035751955f612cc1565b3d9150612dff565b50604051903d90823e3d90fd5b612c4b9650612c589550612c439450612e589060a03d60a01161046e57610456818361353f565b92999198509196509150612c169050565b5034610350578060031936011261035057612e8261437f565b5f5160206148975f395f51905f525460ff811615612eda5760ff19165f5160206148975f395f51905f52557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a180f35b638dfc202b60e01b8252600482fd5b503461035057604036600319011261035057612f03613478565b602435908115158092036103e1577f4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca91604091612f3e61437f565b60018060a01b0316908185528460205282852060ff1981541660ff831617905582519182526020820152a180f35b50346103505760203660031901126103505760209060ff906040906001600160a01b03612f97613478565b1681528084522054166040519015158152f35b3461060357608036600319011261060357612fc3613478565b60243590612fcf6134ce565b9160643592831515908185036106035760a0600494612fec613f9f565b604051634eb1c24560e11b815295869182905f196001861b01165afa9485156130e1575f945f905f97613124575b506040516341a4eb5f60e11b8152600481018690526001600160a01b0391909116965f826024818b5afa9687156130e1578897613089956001600160801b03945f92613105575b5081851681861611156130fd5750935b156130ec5750915b1694859161051c83303384613fc6565b833b156106035760645f92836040519687948593636f965f9f60e11b8552600485015287602485015260448401525af19182156130e1576020926130d1575b50604051908152f35b5f6130db9161353f565b5f6130c8565b6040513d5f823e3d90fd5b6001600160a01b0316929050613079565b905093613071565b61311a9192503d805f833e612111818361353f565b509050908b613061565b9195505061314291955060a03d60a01161046e57610456818361353f565b979396925088905061301a565b346106035760207f93065b6ca8f9c36086d73ad337c4138513e460fcb4367c4880651b03da29494f6103306131b66131863661382c565b90613198999698939594979299613f9f565b6131ac6131a48b6141f0565b30338c613fc6565b898689878c61422b565b809760405194859460018060a01b03169860018060a01b0316973386613d0c565b34610603576080366003190112610603576131f0613478565b506131f961348e565b506064356001600160401b03811161060357613219903690600401613592565b50604051630a85bd0160e11b8152602090f35b346106035761323a366136be565b9094919293613247613f9f565b604051634eb1c24560e11b81526001600160a01b039190911695909460a0866004818a5afa80156130e157611b84611fa0896103706132e99a6020955f905f915f91613447575b6001600160801b038a16959293506132d0926132bc918791906001600160a01b031661051c83303384613fc6565b6001600160801b038d169030903390613fc6565b60018060a01b0316976040519485918c8b898501613b1a565b03815f8b5af19586156130e1575f96613413575b506040516341a4eb5f60e11b815260048101879052915f83602481875afa9283156130e1575f936133f0575b50606060249394604051948580926350ef5c3560e01b82528b60048301525afa9283156130e1575f936133c3575b506001600160801b03166001600160801b038316908082116133ae57602088808b7f6cc7689f3960393f975bc636577345ee34fd6fd0b516b15c923e7885e518b0988b8b6103308c8c8c6040519586953387613c4a565b6370d1969b60e01b5f5260045260245260445ffd5b6001600160801b039193506133e69060603d6060116120f1576120de818361353f565b5090509290613357565b602493506134096060913d805f833e612111818361353f565b9150509350613329565b9095506020813d60201161343f575b8161342f6020938361353f565b81010312610603575194876132fd565b3d9150613422565b5050506132d06134686132bc9260a03d60a01161046e57610456818361353f565b91955085945090925061328e9050565b600435906001600160a01b038216820361060357565b602435906001600160a01b038216820361060357565b604435906001600160a01b038216820361060357565b35906001600160a01b038216820361060357565b604435906001600160801b038216820361060357565b60a435906001600160801b038216820361060357565b60c435906001600160801b038216820361060357565b608081019081106001600160401b0382111761352b57604052565b634e487b7160e01b5f52604160045260245ffd5b90601f801991011681019081106001600160401b0382111761352b57604052565b6001600160401b03811161352b5760051b60200190565b6001600160401b03811161352b57601f01601f191660200190565b81601f82011215610603578035906135a982613577565b926135b7604051948561353f565b8284526020838301011161060357815f926020809301838601378301015290565b9080601f83011215610603578135916135f083613560565b926135fe604051948561353f565b80845260208085019160051b830101918383116106035760208101915b83831061362a57505050505090565b82356001600160401b038111610603578201906080828703601f190112610603576040519061365882613510565b613664602084016134ba565b8252613672604084016134ba565b6020830152613683606084016134ba565b60408301526080830135916001600160401b038311610603576136ae88602080969581960101613592565b606082015281520192019161361b565b9060c0600319830112610603576004356001600160a01b038116810361060357916024356001600160a01b038116810361060357916044356001600160801b038116810361060357916064356001600160801b038116810361060357916084356001600160801b0381168103610603579160a435906001600160401b0382116106035761374d916004016135d8565b90565b9080601f830112156106035781359061376882613560565b92613776604051948561353f565b82845260208085019360051b82010191821161060357602001915b81831061379e5750505090565b82356001600160a01b038116810361060357815260209283019201613791565b9080601f83011215610603578135906137d682613560565b926137e4604051948561353f565b82845260208085019360051b82010191821161060357602001915b81831061380c5750505090565b82356001600160801b0381168103610603578152602092830192016137ff565b60e0600319820112610603576004356001600160a01b038116810361060357916024356001600160a01b038116810361060357916044356001600160a01b038116810361060357916064356001600160401b038111610603578261389291600401613750565b91608435906001600160401b038211610603576138b1916004016137be565b9060a4356001600160801b0381168103610603579060c43590565b60e0600319820112610603576004356001600160a01b038116810361060357916024356001600160a01b03811681036106035791604435916064356001600160401b038111610603578261389291600401613750565b6080906003190112610603576004356001600160a01b038116810361060357906024356001600160a01b038116810361060357906044359060643590565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b81601f820112156106035780359061399b82613560565b926139a9604051948561353f565b8284526020606081860194028301019181831161060357602001925b8284106139d3575050505090565b606084830312610603576040519060608201908282106001600160401b0383111761352b57606092602092604052863581528287013583820152604087013560408201528152019301926139c5565b51906001600160a01b038216820361060357565b908160a091031261060357613a4a81613a22565b91613a5760208301613a22565b60408301519092906001600160a01b0381168103610603579161374d6080613a8160608501613a22565b9301613a22565b9080602083519182815201916020808360051b8301019401925f915b838310613ab357505050505090565b9091929394602080613b0b600193601f19868203018752608060608b51878060a01b038151168452878060a01b03868201511686850152878060a01b0360408201511660408501520151918160608201520190613960565b97019301930191939290613aa4565b939290613b4b926001600160801b039160018060a01b03168652166020850152608060408501526080840190613a88565b9160606001910152565b6001600160801b0361374d949360609360018060a01b031683521660208201528160408201520190613960565b51906001600160801b038216820361060357565b81601f8201121561060357805190613bad82613577565b92613bbb604051948561353f565b8284526020838301011161060357815f9260208093018386015e8301015290565b9160608383031261060357613bf083613a22565b92613bfd60208201613b82565b9260408201516001600160401b0381116106035761374d9201613b96565b908160609103126106035780518015158103610603579161374d6040613c4360208501613b82565b9301613b82565b6001600160a01b039182168152911660208201526001600160801b039182166040820152918116606083015291909116608082015260c060a0820181905261374d92910190613960565b90602080835192838152019201905f5b818110613cb15750505090565b82516001600160a01b0316845260209384019390920191600101613ca4565b90602080835192838152019201905f5b818110613ced5750505090565b82516001600160801b0316845260209384019390920191600101613ce0565b6001600160a01b0391821681529116602082015260a06040820181905290949392608092613d4f92613d419190880190613c94565b908682036060880152613cd0565b930152565b91908201809211613d6157565b634e487b7160e01b5f52601160045260245ffd5b91908203918211613d6157565b906004811015613d935760051b0190565b634e487b7160e01b5f52603260045260245ffd5b8051821015613d935760209160051b010190565b8115613dc5570490565b634e487b7160e01b5f52601260045260245ffd5b91908260409103126106035761374d602083519301613b82565b9080601f8301121561060357815191613e0b83613560565b92613e19604051948561353f565b80845260208085019160051b830101918383116106035760208101915b838310613e4557505050505090565b82516001600160401b038111610603578201906080828703601f1901126106035760405190613e7382613510565b613e7f60208401613a22565b8252613e8d60408401613a22565b6020830152613e9e60608401613a22565b60408301526080830151916001600160401b03831161060357613ec988602080969581960101613b96565b6060820152815201920191613e36565b3d15613f03573d90613eea82613577565b91613ef8604051938461353f565b82523d5f602084013e565b606090565b6001600160a01b03909116815260406020820181905261374d92910190613960565b90602080835192838152019201905f5b818110613f475750505090565b9091926020606060019260408751805183528481015185840152015160408201520194019101919091613f3a565b61374d916020613f8e8351604084526040840190613f2a565b920151906020818403910152613f2a565b60ff5f5160206148975f395f51905f525416613fb757565b63d93c066560e01b5f5260045ffd5b90925f19811461404b576001600160a01b03848116908416148015614043575b61403d576040516323b872dd60e01b60208201526001600160a01b039485166024820152929093166044830152606482019290925261403b9161403682608481015b03601f19810184528361353f565b6147a0565b565b50505050565b508015613fe6565b630d550c3b60e11b5f5260045ffd5b821580156141ad575b6141a857604051636eb1769f60e11b81523060048201526001600160a01b03838116602483018190529490831691602081604481865afa9081156130e1575f91614174575b506140f0946140fe6140bd6020945f94613d54565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529687906064820190565b03601f19810188528761353f565b85519082865af1903d5f519083614155575b5050501561411d57505050565b61403661403b936040519063095ea7b360e01b602083015260248201525f60448201526044815261414f60648261353f565b826147a0565b9192509061416a57503b15155b5f8080614110565b6001915014614162565b90506020813d6020116141a0575b8161418f6020938361353f565b8101031261060357516140f06140a8565b3d9150614182565b505050565b506001600160a01b0382163014614063565b6001600160801b0381116141d9576001600160801b031690565b6306dfcc6560e41b5f52608060045260245260445ffd5b5f9190825b81518410156142265761421e6001916001600160801b036142168786613da7565b511690613d54565b9301926141f5565b925050565b929590939194955f978151845103614370575f985b82518a101561432f578760208860c4895f8f6001600160801b0361428c828c8f946142729060018060a01b0392613da7565b5116936115b0846142838484613da7565b5116868961405a565b51604051632cfdfa9360e11b81526001600160a01b03958616600482015296851660248801529390971660448601529590911660648401526084830181905260a483018990529193849283915af19081156130e1575f916142fd575b506142f590600192613d54565b990198614240565b90506020813d8211614327575b816143176020938361353f565b81010312610603575160016142e8565b3d915061430a565b9850966001600160801b031695505050838610915061434e9050575050565b83906319aae4c960e11b5f5260018060a01b031660045260245260445260645ffd5b631f77022160e11b5f5260045ffd5b5f5160206148575f395f51905f52546001600160a01b0316330361439f57565b63118cdaa760e01b5f523360045260245ffd5b5f5160206148d75f395f51905f5280546001600160a01b03199081169091555f5160206148575f395f51905f5280549182166001600160a01b0393841690811790915591167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b92969590939491945f978051825103614370575f985b81518a101561451e578760208860c4895f8f806001600160801b0361447c818f946144668e9160018060a01b0392613da7565b511694169261447684868961405a565b8d613da7565b51166040519889978896637a633c3f60e11b885260018060a01b0316600488015260018060a01b0316602487015260018060a01b03166044860152606485015260848401528a60a48401525af19081156130e1575f916144ec575b506144e490600192613d54565b990198614433565b90506020813d8211614516575b816145066020938361353f565b81010312610603575160016144d7565b3d91506144f9565b98505050509092506001600160801b039150169081841161453d575050565b839063f60dba4560e01b5f5260018060a01b031660045260245260445260645ffd5b9091905f19821461404b576001600160a01b038316301480156145bb575b6141a85760405163a9059cbb60e01b60208201526001600160a01b039093166024840152604483019190915261403b91906140368260648101614028565b50811561457d565b6040519060208201526020815261374d60408261353f565b919091825115614766575f905b8351821015614226576001600160a01b036146038386613da7565b5151165f525f60205260ff60405f2054161561473f575f9081906001600160a01b0360206146318689613da7565b510151166146a76001600160a01b03604061464c888b613da7565b51015116614028606061465f898c613da7565b510151614695604051968794602086019763e0a8041360e01b8952602487015260448601526080606486015260a4850190613960565b83810360231901608485015290613960565b6001600160a01b036146b98689613da7565b5151169151915af46146c9613ed9565b901561470d578051810190602081830312610603576020810151906001600160401b038211610603576020614705928160019501920101613b96565b9101906145e8565b6001600160a01b0361471f8386613da7565b5151604051630de816ad60e31b8152928392611bde921660048401613f08565b6001600160a01b036147518386613da7565b51511663616d132960e01b5f5260045260245ffd5b639f6de0d560e01b5f5260045ffd5b60ff5f5160206148b75f395f51905f525460401c161561479157565b631afcd79f60e31b5f5260045ffd5b905f602091828151910182855af1156130e1575f513d6147ef57506001600160a01b0381163b155b6147cf5750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156147c8565b9061481c575080511561480d57805190602001fd5b63d6bda27560e01b5f5260045ffd5b8151158061484d575b61482d575090565b639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b50803b1561482556fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbccd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00a2646970667358221220e106c62c73be28f2dbb47262f64239ed9170f58d193346eca506e5e79d5afc1364736f6c634300081b0033", + "nonce": "0x370", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xbe5df407fa72780b002befbd26a581cf2da506e2784a251b88c7eb3cbae35f3b", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "gas": "0x1077f", + "value": "0x0", + "input": "0x27e87808000000000000000000000000c47591f5c023e44931c78d5a993834875b79fb110000000000000000000000008ffc4da23ee650ffdd3cb4880a644ce17d2e562300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x371", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x12f48fc", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x38269b852581d4528fe48065c5f52a299037abc3175a7c7652d168747a9fb0dc", + "transactionIndex": "0x46", + "blockHash": "0xf81041784fabdec11e163476aa16f818236cb72dcc3567657cf94acc71327bee", + "blockNumber": "0x15bb1f6", + "gasUsed": "0x3e9f71", + "effectiveGasPrice": "0x4955e6ea", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": null, + "contractAddress": "0x8ffc4da23ee650ffdd3cb4880a644ce17d2e5623" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x13007c1", + "logs": [ + { + "address": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x0000000000000000000000008ffc4da23ee650ffdd3cb4880a644ce17d2e5623" + ], + "data": "0x", + "blockHash": "0xf81041784fabdec11e163476aa16f818236cb72dcc3567657cf94acc71327bee", + "blockNumber": "0x15bb1f6", + "blockTimestamp": "0x685cdba3", + "transactionHash": "0xbe5df407fa72780b002befbd26a581cf2da506e2784a251b88c7eb3cbae35f3b", + "transactionIndex": "0x47", + "logIndex": "0x160", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000400000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000004002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000100000000000000000000000001000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000", + "type": "0x2", + "transactionHash": "0xbe5df407fa72780b002befbd26a581cf2da506e2784a251b88c7eb3cbae35f3b", + "transactionIndex": "0x47", + "blockHash": "0xf81041784fabdec11e163476aa16f818236cb72dcc3567657cf94acc71327bee", + "blockNumber": "0x15bb1f6", + "gasUsed": "0xbec5", + "effectiveGasPrice": "0x4955e6ea", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "contractAddress": null + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1750916028, + "chain": 1, + "commit": "c6cbea8" +} \ No newline at end of file diff --git a/broadcast/UpgradeRouterForRepayingGt.s.sol/42161/run-latest.json b/broadcast/UpgradeRouterForRepayingGt.s.sol/42161/run-latest.json new file mode 100644 index 0000000..d3284ee --- /dev/null +++ b/broadcast/UpgradeRouterForRepayingGt.s.sol/42161/run-latest.json @@ -0,0 +1,106 @@ +{ + "transactions": [ + { + "hash": "0x3cd29d5d965861371409e93ee8dd7d86f83484a66244e19443038390d6d43409", + "transactionType": "CREATE", + "contractName": "TermMaxRouter_Repay_Gt", + "contractAddress": "0x04b945a67b799e87034b5f6ad4dedb57d08ef588", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "gas": "0x5ac26e", + "value": "0x0", + "input": "0x60a080604052346029573060805261492c908161002e82396080518181816128dc015261296f0152f35b5f80fdfe60806040526004361015610011575f80fd5b5f5f3560e01c80631443c4d61461322c578063150b7a02146131d75780631ac100a41461314f5780632a51cf5114612faa5780632e3e3ef214612f6c5780632f20734514612ee95780633f4ba83a14612e6957806345618d2b14612b195780634f1ef2861461293057806352d1902d146128c95780635c975abb1461289a578063715018a61461281b57806379ba5097146127ce5780638456cb591461275b57806384e090911461252257806389c3584d146121ca5780638da5cb5b14612195578063943189f414611eb257806395320fd014611c1357806399a54a5a14611974578063ad3cb1cc14611927578063c4d66de81461177a578063c71c700c146113bd578063d3e052cf146110a5578063df3e1e0514610d2f578063e30c397814610cfa578063e9919e5c14610c5c578063ef8b4968146109f5578063f1a229ad1461070e578063f2fde38b14610688578063f38743f3146104755763fc1c1b211461017a575f80fd5b3461035057610188366138cc565b91929690959394610197613f9f565b604051634eb1c24560e11b81526001600160a01b039190911697909260a0846004818c5afa9485156103d657839288859486978799610432575b506001600160a01b0390811697169461020291906101f18230338a613fc6565b6001600160a01b031695869061405a565b604061022f8c6102118c6145c3565b8884519e8f9485938492637a0ee4f960e11b84523060048501613b55565b03925af196871561042757859a86986103e5575b509187918961025395948961441d565b92610267846001600160801b038716613d75565b8281610362575b9150503b1561035e57604051632142170760e11b81523060048201526001600160a01b0386166024820152604481018890529082908290818381606481015b03925af180156103535761033b575b602087808a7fdc3efdf28701077a23ef0beb0f3260ca639658ce2676bbc9d83030fac6ce56128a8a6103308b6102f18c6141bf565b604080513381526001600160a01b0390951660208601528401949094526001600160801b039081166060840152909216608082015290819060a0820190565b0390a3604051908152f35b61034682809261353f565b61035057806102bc565b80fd5b6040513d84823e3d90fd5b5080fd5b81610370916103759461405a565b6141bf565b813b156103e1576001600160801b0360405191636f965f9f60e11b8352896004840152166024820152826044820152828160648183865af180156103d6579083916103c1575b8261026e565b816103cb9161353f565b61035e57815f6103bb565b6040513d85823e3d90fd5b8280fd5b610253949391929b508998506104129060403d604011610420575b61040a818361353f565b810190613dd9565b9b909b985091909293610243565b503d610400565b6040513d87823e3d90fd5b9198505061045e919650610202945060a03d60a01161046e575b610456818361353f565b810190613a36565b99909891969193909250906101d1565b503d61044c565b50346103505760a03660031901126103505761048f613478565b9061049861348e565b90604435926064356001600160401b0381116103e1576104bc9036906004016135d8565b608435936104c8613f9f565b604051634eb1c24560e11b81526001600160a01b039190911693909160a083600481885afa928315610353578588918490859661065b575b506105219291906001600160a01b031661051c83303384613fc6565b61405a565b604051633def417960e11b815260048101889052306024820152908282604481838a5af180156103d65783928491610607575b509061055f916145db565b90602082519281808201948592010103126106035761057f915190613d54565b948086106105e2575050602094826105bb867fc1822dac55540066416ffa59d2eb79715d05171ecf435ac5226726b50686d9419560809561455f565b604051918252338783015260018060a01b03166040820152846060820152a2604051908152f35b856064936319aae4c960e11b845260018060a01b0316600452602452604452fd5b5f80fd5b9250503d8084843e610619818461353f565b8201604083820312610657578251926020810151906001600160401b038211610653579161064c9161055f949301613b96565b9091610554565b8580fd5b8380fd5b6105219392965061067b915060a03d60a01161046e57610456818361353f565b9894959250610500915050565b5034610350576020366003190112610350576106a2613478565b6106aa61437f565b5f5160206148d75f395f51905f5280546001600160a01b0319166001600160a01b039283169081179091555f5160206148575f395f51905f52549091167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b50346103505761010036600319011261035057610729613478565b9061073261348e565b916044356064356001600160401b03811161065757610755903690600401613750565b6084356001600160401b0381116109f1576107749036906004016137be565b9160a435918215158093036106535760c4356001600160401b0381116109ed5760a06107a5600492369084016135d8565b986107ae613f9f565b604051634eb1c24560e11b815292839182905f196001861b01165afa9788156109e25787918890899a6109bb575b506001600160a01b031695863b156109ac57604051635c46a7ef60e11b815233600482015230602482015285604482015260806064820152896084820152898160a481838c5af180156109b057908a91610997575b50506108a69261085d979695949261086f610890936040519a8b9660a0602089015260c0880190613c94565b868103601f1901604088015290613cd0565b6001600160a01b039092166060850152838203601f19016080850152613a88565b60e43560a083015203601f19810186528561353f565b823b1561065357916108e593918680946040519687958694859363078ad17360e31b855260048501526024840152606060448401526064830190613960565b03925af180156103d657908391610982575b50506040516370a0823160e01b81523060048201526020816024816001600160a01b0388165afa9283156109765792610941575b50816109399160209461455f565b604051908152f35b9091506020813d60201161096e575b8161095d6020938361353f565b81010312610603575190602061092b565b3d9150610950565b604051903d90823e3d90fd5b8161098c9161353f565b61035e57815f6108f7565b816109a19161353f565b6109ac57885f610831565b8880fd5b6040513d8c823e3d90fd5b919950506109d8915060a03d60a01161046e57610456818361353f565b9a9250505f6107dc565b6040513d89823e3d90fd5b8680fd5b8480fd5b50346103505760a036600319011261035057610a0f613478565b6024356001600160801b0381168091036103e157610a2b6134a4565b506064356001600160401b03811161065757610a4b903690600401613592565b916084356001600160401b0381116109f157610a6b903690600401613592565b805181019360a082602087019603126106535760208201516001600160401b0381116109ed5782019480603f870112156109ed57602086015195610aae87613560565b96610abc604051988961353f565b808852602080808a019260051b8401010191838311610c2057604001905b828210610c445750505060408301516001600160401b038111610c4057830181603f82011215610c4057602081015190610b1382613560565b91610b21604051938461353f565b8083526020808085019260051b8401010191848311610c3c57604001905b828210610c2457505050610b5560608501613a22565b916080850151946001600160401b038611610c2057610b7e610b8992602060a098840101613df3565b9586910151946145db565b936001600160a01b0386811690841614610bad575b88610baa88338961405a565b80f35b80515f198101908111610c0c576001600160a01b0391604091610bcf91613da7565b51015116966020855195818082019788920101031261060357610baa97610bf9610c0196516141bf565b93309161441d565b505f80808080610b9e565b634e487b7160e01b8a52601160045260248afd5b8980fd5b60208091610c3184613b82565b815201910190610b3f565b8a80fd5b8780fd5b60208091610c5184613a22565b815201910190610ada565b5034610350576020610cd5610330610cdc7f18f137cdb80704341c5da72a0f5776e3361de90e2a157d704a4b79d96b753aa6610ccc610c9a3661382c565b869a9596949992939791610cac613f9f565b84898c8a6001600160801b03851699610cc78b303384613fc6565b61441d565b998a8094613d75565b338a61455f565b6040516001600160a01b039485169890941696939485943386613d0c565b50346103505780600319360112610350575f5160206148d75f395f51905f52546040516001600160a01b039091168152602090f35b503461035057610d3e36613922565b91610d4a939193613f9f565b604051634eb1c24560e11b81526001600160a01b0391909116929060a081600481875afa90811561109a5786908790889361106c575b506040516331a9108f60e11b8152600481018890526001600160a01b0391821693909160209183916024918391165afa908115611018578891611032575b50336001600160a01b039091160361102357604051633f5ffaf560e01b8152602081600481895afa908115611018578891610fe6575b506305f5e1008402908482046305f5e1001485151715610fd2576305f5e10003906305f5e1008211610fd257610e2d9161037091613dbb565b906001600160801b03604051926339a380ed60e01b845230600485015216938460248401528760448401526020836064818c8b5af18015610fc75787938a91610f74575b509293610eaf93859261051c916001600160801b031680821015610f695750809681955b610ea183303388613fc6565b6001600160a01b031661405a565b833b1561065357604051632770a7eb60e21b81526001600160a01b03841660048201526024810182905286908181604481838a5af1801561035357610f50575b5050916001600160801b0360a092610f277fdc3efdf28701077a23ef0beb0f3260ca639658ce2676bbc9d83030fac6ce5612956141bf565b9060405193338552600180871b031660208501528860408501526060840152166080820152a380f35b81610f5d9195939561353f565b6106535791855f610eef565b905080968195610e95565b9350506020833d602011610fbf575b81610f906020938361353f565b810103126109ac57869361051c85926001600160801b03610fb3610eaf97613b82565b93975050929450610e71565b3d9150610f83565b6040513d8b823e3d90fd5b634e487b7160e01b89526011600452602489fd5b90506020813d602011611010575b816110016020938361353f565b8101031261060357515f610df4565b3d9150610ff4565b6040513d8a823e3d90fd5b6315e69dc560e21b8752600487fd5b90506020813d602011611064575b8161104d6020938361353f565b81010312610c405761105e90613a22565b5f610dbe565b3d9150611040565b602493506020925061108d915060a03d60a01161046e57610456818361353f565b5050939192909150610d80565b6040513d88823e3d90fd5b503461035057610100366003190112610350576110c0613478565b6110c861348e565b6064356001600160a01b03811693919084900361035e57608435936110eb6134e4565b936110f46134fa565b9260e435916001600160401b03831161065357604060031984360301126106535760405192604084018481106001600160401b038211176113a95760405280600401356001600160401b038111610c40576111559060043691840101613984565b845260248101356001600160401b038111610c405761117991369101600401613984565b6020840152611186613f9f565b604051634eb1c24560e11b8152966001600160a01b0391909116949060a088600481895afa9687156109765780978199829161137d575b5060405163887bb98960e01b81526001600160a01b03909516600486018190526044803560248801528601979097526080606486015260208580611204608482018a613f75565b0381858c5af1948515610353578295611341575b508a6112dc575b5050927fac20b37c6c923070aa8deac25d6e9bf9f6eecd727d9c2b89d0451685ecf4ba5294926001600160801b03610330938160209c9716998a806112bd575b50501698898061129e575b505060018060a01b031697889760405195869586528b8601526040850152606084015260a0608084015260a0830190613f75565b6112b6916001600160a01b0384811691339116613fc6565b5f8961126a565b6112d5916001600160a01b0386811691339116613fc6565b5f8a61125f565b8a886112ee9261051c83303384613fc6565b863b15610350576040516340c10f1960e01b81526001600160a01b0385166004820152602481018b90528181604481838c5af18015610353571561121f5761133782809261353f565b610350578061121f565b9094506020813d602011611375575b8161135d6020938361353f565b8101031261035e5761136e90613a22565b935f611218565b3d9150611350565b9198505061139b91985060a03d60a01161046e57610456818361353f565b9a939150509790985f6111bd565b634e487b7160e01b88526041600452602488fd5b503461035057610100366003190112610350576113d8613478565b6113e061348e565b6113e86134ce565b92606435926001600160801b038416928385036103e1576084356001600160401b0381116106575761141e903690600401613750565b9460a4356001600160401b0381116109f15761143e9036906004016137be565b916114476134fa565b9260e43591611454613f9f565b604051634eb1c24560e11b81526001600160a01b039190911698909360a0856004818d5afa958615611018578a9b899a9b998b978c99611746575b506001600160a01b03908116976001600160801b0392909216939116908c84111561173457966001600160801b0381985b169a8b906114d086303386613fc6565b6114d99261405a565b898d6114e78e303386613fc6565b6114f09261405a565b8b3b15610c2057604051632770a7eb60e21b81526001600160a01b0389166004820152602481018a90528a818e8183816044810103925af1801561172957908b91611714575b5050899b835185510361170557999b989a8c9a6001600160a01b03998a169a988a16998816989091908c5b8651111561164d578b8f8c8f8d60c4918e8e6001600160801b038f8f986115b5916115b060209b6115998460018060a01b0392613da7565b51169687866115a88686613da7565b51169161405a565b613da7565b51166040519889978896632cfdfa9360e11b8852600488015260248701526044860152606485015282608485015260a48401525af1908115611640578e9161160e575b5061160590600192613d54565b9e019d8e611561565b90506020813d8211611638575b816116286020938361353f565b81010312610603575160016115f8565b3d915061161b565b8e604051903d90823e3d90fd5b858c928f8f906001600160801b038f91611668908d97613d54565b9816908189106116ea57505050602096926116cb7f482c5c16eb3726edd4dc0b4e52fdb8488530e472f26df2a268d3d94edfc135a095936116d9936040519687963388528c8801526040870152606086015260e0608086015260e0850190613c94565b9083820360a0850152613cd0565b8560c08301520390a2604051908152f35b6319aae4c960e11b8352600452602488905260445260649150fd5b631f77022160e11b8b5260048bfd5b8161171e9161353f565b610c2057895f611536565b6040513d8d823e3d90fd5b5082966001600160801b0382986114c0565b90506001600160801b03985061176c91975060a03d60a01161046e57610456818361353f565b9a92999392915061148f9050565b503461035057602036600319011261035057611794613478565b5f5160206148b75f395f51905f52549060ff8260401c1615916001600160401b0381168015908161191f575b6001149081611915575b15908161190c575b506118fd5767ffffffffffffffff1981166001175f5160206148b75f395f51905f5255826118d1575b50611804614775565b61180c614775565b611814614775565b60ff195f5160206148975f395f51905f5254165f5160206148975f395f51905f525561183e614775565b611846614775565b6001600160a01b038116156118bd5761185e906143b2565b6118655780f35b68ff0000000000000000195f5160206148b75f395f51905f5254165f5160206148b75f395f51905f52557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a180f35b631e4fbdf760e01b83526004839052602483fd5b68ffffffffffffffffff191668010000000000000001175f5160206148b75f395f51905f52555f6117fb565b63f92ee8a960e01b8452600484fd5b9050155f6117d2565b303b1591506117ca565b8491506117c0565b50346103505780600319360112610350575061197060405161194a60408261353f565b60058152640352e302e360dc1b6020820152604051918291602083526020830190613960565b0390f35b50346103505760803660031901126103505761198e613478565b5061199761348e565b506064356001600160401b03811161035e576119b7903690600401613592565b908151820160808382031261035e5760208301516001600160a01b03811693908490036103e1576040810151916060820151906001600160401b0382116109f157608091602080611a0c930191850101613df3565b9101519160028310156106575781611a29611a4692604435613d54565b60405190602082015260208152611a4160408261353f565b6145db565b815190915f198201918211611bff5790611a5f91613da7565b5180516001600160a01b031684526020849052604084205490929060ff1615611be25780611b2457505060409081015190516370a0823160e01b81523060048201526001600160a01b039091169190602081602481865afa9182156109765791611af0575b508061197093611ad6611adc936145c3565b9361405a565b604051918291602083526020830190613960565b90506020813d602011611b1c575b81611b0b6020938361353f565b810103126106035751611970611ac4565b3d9150611afe565b9193909291600114611b3d575b50506119709150611adc565b8190604085019460018060a01b0386511690604051926020840192639df3032560e01b84526024850152604484015260606064840152611b9283611b846084820189613960565b03601f19810185528461353f565b519151916001600160a01b03165af491611baa613ed9565b9215611bb65780611b31565b51604051631d039b4360e11b815292839250611bde916001600160a01b031660048401613f08565b0390fd5b825163616d132960e01b85526001600160a01b0316600452602484fd5b634e487b7160e01b85526011600452602485fd5b503461035057611c2236613922565b93929091611c2e613f9f565b604051634eb1c24560e11b81526001600160a01b0391909116949060a081600481895afa8015610427578590858788948993611e81575b506001600160a01b0392831694921691611c979190611c8682303389613fc6565b6001600160a01b031694859061405a565b604051633f5ffaf560e01b81526020816004818c5afa908115611018578891611e4f575b506305f5e1008502908582046305f5e1001486151715610fd2576305f5e10003906305f5e1008211610fd2576103708995949392611cf892613dbb565b946040611d258b611d088b6145c3565b83519c8d80948193637a0ee4f960e11b83528d3060048501613b55565b03925af18015610427579085949392918b969a8691611e12575b509161051c87926001600160801b03611d6e9695168082105f14611e07575080988195610ea183303388613fc6565b873b1561035e57604051632770a7eb60e21b81526001600160a01b0386166004820152602481018490528281604481838d5af180156103d657908391611df2575b5050803b1561035e57604051632142170760e11b81523060048201526001600160a01b0386166024820152604481018890529082908290818381606481016102ad565b81611dfc9161353f565b61035e57815f611daf565b905080988195610e95565b6001600160801b039b50611d6e949391508792611e4061051c9260403d6040116104205761040a818361353f565b9d909d93959650509250611d3f565b90506020813d602011611e79575b81611e6a6020938361353f565b8101031261060357515f611cbb565b3d9150611e5d565b91935050611c979350611ea3915060a03d60a01161046e57610456818361353f565b50909492939092909190611c65565b503461035057611ec1366136be565b9194929593611ece613f9f565b604051634eb1c24560e11b81526001600160a01b03919091169560a0826004818a5afa90811561109a57611f978899611fbc9994602094611f83948b8c938d93612157575b506001600160801b03948516989394611f5894909291611f44918b916001600160a01b031661051c83303384613fc6565b1690309033906001600160a01b0316613fc6565b60018060a01b03169560405192839188868401528a60408401526080606084015260a0830190613a88565b89608083015203601f19810183528261353f565b611fa0836141bf565b604051639ea1c1c960e01b815298899283928960048501613b55565b0381888b5af1958615610427578596612123575b506040516341a4eb5f60e11b815260048101879052918583602481875afa92831561109a5786936120f8575b50606060249394604051948580926350ef5c3560e01b82528b60048301525afa92831561109a5786936120b9575b506001600160801b0392831692168083116120a25750926103307f6cc7689f3960393f975bc636577345ee34fd6fd0b516b15c923e7885e518b098938796936020999660405195869533875260018060a01b03168c87015260408601526060850152608084015260c060a084015260c0830190613960565b6370d1969b60e01b86526004526024829052604485fd5b6001600160801b039193506120e6829160603d6060116120f1575b6120de818361353f565b810190613c1b565b50905093915061202a565b503d6120d4565b602493506121196060913d808a833e612111818361353f565b810190613bdc565b9150509350611ffc565b9095506020813d60201161214f575b8161213f6020938361353f565b810103126106035751945f611fd0565b3d9150612132565b611f5894506001600160801b03935083929150612185611f449160a03d60a01161046e57610456818361353f565b509097509550929350611f139050565b50346103505780600319360112610350575f5160206148575f395f51905f52546040516001600160a01b039091168152602090f35b5034610350576040366003190112610350576121e4613478565b6121ec61348e565b90608092600460405192612200868561353f565b8536853760a060405191612214888461353f565b87368437604051634eb1c24560e11b815293849182905f196001861b01165afa80156103d6578392848594869287946124f6575b506001600160a01b039081168852908116602088015290811660408701529081166060860152851691835b6004811061247057506040516370a0823160e01b815260048101939093526001600160a01b031690602083602481855afa928315612465578493612431575b5095949391906122c182613560565b916122cf604051938461353f565b8083526122db81613560565b602084019690601f1901368837855b82811061239e575050506040519687966101408801948887905b6004821061237b57505050870185905b600482106123615750505061010086015261014061012086015251809152610160840192915b818110612348575050500390f35b825184528594506020938401939092019160010161233a565b825181528998506020928301926001929092019101612314565b82516001600160a01b031681528b9a506020928301926001929092019101612304565b604051632f745c5960e01b81526001600160a01b038316600482015260248101829052989997989597949593949390602082604481895afa80156110185788906123ff575b600192506123f18289613da7565b5201989796949392986122ea565b506020823d8211612429575b816124186020938361353f565b8101031261060357600191516123e3565b3d915061240b565b9092506020813d60201161245d575b8161244d6020938361353f565b810103126106035751915f6122b2565b3d9150612440565b6040513d86823e3d90fd5b60249060206001600160a01b03612487838a613d82565b5116604051938480926370a0823160e01b82528960048301525afa801561109a5786906124c4575b600192506124bd8286613d82565b5201612273565b506020823d82116124ee575b816124dd6020938361353f565b8101031261060357600191516124af565b3d91506124d0565b935050505061251591925060a03d60a01161046e57610456818361353f565b919493919290915f612248565b503461035057612531366138cc565b909291939461253e613f9f565b604051634eb1c24560e11b81526001600160a01b039190911694909260a084600481895afa928315610fc757898a958b95612728575b506001600160a01b0316956001600160801b038116926125b0926125aa92909186906125a28730338c613fc6565b308b8a61441d565b926141f0565b6040516341a4eb5f60e11b8152600481018990526001600160a01b0390951699909481816024818e5afa90811561035357829161270b575b506001600160801b03811686106126f2575b6001600160801b03169961260f8b828961405a565b803b1561035e57818b60648b836040519586948593636f965f9f60e11b8552600485015260248401528160448401525af18015610353576126dd575b5050977ff2960dbf8545963973c9df7f52bdbdd6803dbf97c4597938fa37510b1218aece948860809561268e8296612686869760209f613d75565b9c8d9161455f565b8381116126c1575b505050506040519133835260018060a01b0316888301526040820152856060820152a3604051908152f35b6126d4936126ce91613d75565b9161455f565b805f8381612696565b6126e882809261353f565b610350578061264b565b506001600160801b03612704866141bf565b90506125fa565b61271f91503d8084833e612111818361353f565b5090505f6125e8565b6125aa96506125b092955061274c915060a03d60a01161046e57610456818361353f565b91985090969391506125749050565b503461035057806003193601126103505761277461437f565b61277c613f9f565b600160ff195f5160206148975f395f51905f525416175f5160206148975f395f51905f52557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a180f35b50346103505780600319360112610350575f5160206148d75f395f51905f5254336001600160a01b039091160361280857610baa336143b2565b63118cdaa760e01b815233600452602490fd5b503461035057806003193601126103505761283461437f565b5f5160206148d75f395f51905f5280546001600160a01b03199081169091555f5160206148575f395f51905f528054918216905581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5034610350578060031936011261035057602060ff5f5160206148975f395f51905f5254166040519015158152f35b50346103505780600319360112610350577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630036129215760206040515f5160206148775f395f51905f528152f35b63703e46dd60e11b8152600490fd5b50604036600319011261035057612945613478565b906024356001600160401b03811161035e57612965903690600401613592565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016308114908115612af7575b50612ae8576129a761437f565b6040516352d1902d60e01b8152926001600160a01b0381169190602085600481865afa80958596612ab4575b506129ec57634c9c8ce360e01b84526004839052602484fd5b9091845f5160206148775f395f51905f528103612aa25750813b15612a90575f5160206148775f395f51905f5280546001600160a01b031916821790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8480a28151839015612a765780836020612a7295519101845af4612a6c613ed9565b916147f8565b5080f35b50505034612a815780f35b63b398979f60e01b8152600490fd5b634c9c8ce360e01b8452600452602483fd5b632a87526960e21b8552600452602484fd5b9095506020813d602011612ae0575b81612ad06020938361353f565b810103126109f15751945f6129d3565b3d9150612ac3565b63703e46dd60e11b8252600482fd5b5f5160206148775f395f51905f52546001600160a01b0316141590505f61299a565b50346103505761012036600319011261035057612b34613478565b612b3c61348e565b906044356001600160401b03811161065757612b5c903690600401613750565b916064356001600160401b0381116109f157612b7c9036906004016137be565b93608435916001600160801b038316830361035e57612b996134e4565b94612ba26134fa565b9360e4356001600160401b0381116109f157612bc29036906004016135d8565b92612bcb613f9f565b604051634eb1c24560e11b81526001600160a01b039190911698909160a0836004818d5afa91821561109a578997948794602094612cad9c9894612c88948f9d9b9489948a94612e31575b50612c4b612c43612c58969760018060a01b03169d6001600160801b03612c3c866141f0565b9116613d54565b303387613fc6565b61010435938c309161422b565b998a9160018060a01b03169761051c8b612c7a6040519788928d8b8501613b1a565b03601f19810187528661353f565b612c91886141bf565b604051639ea1c1c960e01b8152998a9283928960048501613b55565b0381848c5af1968715612e24578197612df0575b506040516341a4eb5f60e11b815260048101889052918183602481875afa928315610353578293612dcd575b50606060249394604051948580926350ef5c3560e01b82528c60048301525afa928315610353578293612da0575b506001600160801b03166001600160801b03831690808211612d8a575050509260409692612d7b7f6cc7689f3960393f975bc636577345ee34fd6fd0b516b15c923e7885e518b098938896612d6f896141bf565b8b519586953387613c4a565b0390a382519182526020820152f35b6370d1969b60e01b835260045260245260449150fd5b6001600160801b03919350612dc39060603d6060116120f1576120de818361353f565b5090509290612d1b565b60249350612de66060913d8086833e612111818361353f565b9150509350612ced565b9096506020813d602011612e1c575b81612e0c6020938361353f565b810103126106035751955f612cc1565b3d9150612dff565b50604051903d90823e3d90fd5b612c4b9650612c589550612c439450612e589060a03d60a01161046e57610456818361353f565b92999198509196509150612c169050565b5034610350578060031936011261035057612e8261437f565b5f5160206148975f395f51905f525460ff811615612eda5760ff19165f5160206148975f395f51905f52557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a180f35b638dfc202b60e01b8252600482fd5b503461035057604036600319011261035057612f03613478565b602435908115158092036103e1577f4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca91604091612f3e61437f565b60018060a01b0316908185528460205282852060ff1981541660ff831617905582519182526020820152a180f35b50346103505760203660031901126103505760209060ff906040906001600160a01b03612f97613478565b1681528084522054166040519015158152f35b3461060357608036600319011261060357612fc3613478565b60243590612fcf6134ce565b9160643592831515908185036106035760a0600494612fec613f9f565b604051634eb1c24560e11b815295869182905f196001861b01165afa9485156130e1575f945f905f97613124575b506040516341a4eb5f60e11b8152600481018690526001600160a01b0391909116965f826024818b5afa9687156130e1578897613089956001600160801b03945f92613105575b5081851681861611156130fd5750935b156130ec5750915b1694859161051c83303384613fc6565b833b156106035760645f92836040519687948593636f965f9f60e11b8552600485015287602485015260448401525af19182156130e1576020926130d1575b50604051908152f35b5f6130db9161353f565b5f6130c8565b6040513d5f823e3d90fd5b6001600160a01b0316929050613079565b905093613071565b61311a9192503d805f833e612111818361353f565b509050908b613061565b9195505061314291955060a03d60a01161046e57610456818361353f565b979396925088905061301a565b346106035760207f93065b6ca8f9c36086d73ad337c4138513e460fcb4367c4880651b03da29494f6103306131b66131863661382c565b90613198999698939594979299613f9f565b6131ac6131a48b6141f0565b30338c613fc6565b898689878c61422b565b809760405194859460018060a01b03169860018060a01b0316973386613d0c565b34610603576080366003190112610603576131f0613478565b506131f961348e565b506064356001600160401b03811161060357613219903690600401613592565b50604051630a85bd0160e11b8152602090f35b346106035761323a366136be565b9094919293613247613f9f565b604051634eb1c24560e11b81526001600160a01b039190911695909460a0866004818a5afa80156130e157611b84611fa0896103706132e99a6020955f905f915f91613447575b6001600160801b038a16959293506132d0926132bc918791906001600160a01b031661051c83303384613fc6565b6001600160801b038d169030903390613fc6565b60018060a01b0316976040519485918c8b898501613b1a565b03815f8b5af19586156130e1575f96613413575b506040516341a4eb5f60e11b815260048101879052915f83602481875afa9283156130e1575f936133f0575b50606060249394604051948580926350ef5c3560e01b82528b60048301525afa9283156130e1575f936133c3575b506001600160801b03166001600160801b038316908082116133ae57602088808b7f6cc7689f3960393f975bc636577345ee34fd6fd0b516b15c923e7885e518b0988b8b6103308c8c8c6040519586953387613c4a565b6370d1969b60e01b5f5260045260245260445ffd5b6001600160801b039193506133e69060603d6060116120f1576120de818361353f565b5090509290613357565b602493506134096060913d805f833e612111818361353f565b9150509350613329565b9095506020813d60201161343f575b8161342f6020938361353f565b81010312610603575194876132fd565b3d9150613422565b5050506132d06134686132bc9260a03d60a01161046e57610456818361353f565b91955085945090925061328e9050565b600435906001600160a01b038216820361060357565b602435906001600160a01b038216820361060357565b604435906001600160a01b038216820361060357565b35906001600160a01b038216820361060357565b604435906001600160801b038216820361060357565b60a435906001600160801b038216820361060357565b60c435906001600160801b038216820361060357565b608081019081106001600160401b0382111761352b57604052565b634e487b7160e01b5f52604160045260245ffd5b90601f801991011681019081106001600160401b0382111761352b57604052565b6001600160401b03811161352b5760051b60200190565b6001600160401b03811161352b57601f01601f191660200190565b81601f82011215610603578035906135a982613577565b926135b7604051948561353f565b8284526020838301011161060357815f926020809301838601378301015290565b9080601f83011215610603578135916135f083613560565b926135fe604051948561353f565b80845260208085019160051b830101918383116106035760208101915b83831061362a57505050505090565b82356001600160401b038111610603578201906080828703601f190112610603576040519061365882613510565b613664602084016134ba565b8252613672604084016134ba565b6020830152613683606084016134ba565b60408301526080830135916001600160401b038311610603576136ae88602080969581960101613592565b606082015281520192019161361b565b9060c0600319830112610603576004356001600160a01b038116810361060357916024356001600160a01b038116810361060357916044356001600160801b038116810361060357916064356001600160801b038116810361060357916084356001600160801b0381168103610603579160a435906001600160401b0382116106035761374d916004016135d8565b90565b9080601f830112156106035781359061376882613560565b92613776604051948561353f565b82845260208085019360051b82010191821161060357602001915b81831061379e5750505090565b82356001600160a01b038116810361060357815260209283019201613791565b9080601f83011215610603578135906137d682613560565b926137e4604051948561353f565b82845260208085019360051b82010191821161060357602001915b81831061380c5750505090565b82356001600160801b0381168103610603578152602092830192016137ff565b60e0600319820112610603576004356001600160a01b038116810361060357916024356001600160a01b038116810361060357916044356001600160a01b038116810361060357916064356001600160401b038111610603578261389291600401613750565b91608435906001600160401b038211610603576138b1916004016137be565b9060a4356001600160801b0381168103610603579060c43590565b60e0600319820112610603576004356001600160a01b038116810361060357916024356001600160a01b03811681036106035791604435916064356001600160401b038111610603578261389291600401613750565b6080906003190112610603576004356001600160a01b038116810361060357906024356001600160a01b038116810361060357906044359060643590565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b81601f820112156106035780359061399b82613560565b926139a9604051948561353f565b8284526020606081860194028301019181831161060357602001925b8284106139d3575050505090565b606084830312610603576040519060608201908282106001600160401b0383111761352b57606092602092604052863581528287013583820152604087013560408201528152019301926139c5565b51906001600160a01b038216820361060357565b908160a091031261060357613a4a81613a22565b91613a5760208301613a22565b60408301519092906001600160a01b0381168103610603579161374d6080613a8160608501613a22565b9301613a22565b9080602083519182815201916020808360051b8301019401925f915b838310613ab357505050505090565b9091929394602080613b0b600193601f19868203018752608060608b51878060a01b038151168452878060a01b03868201511686850152878060a01b0360408201511660408501520151918160608201520190613960565b97019301930191939290613aa4565b939290613b4b926001600160801b039160018060a01b03168652166020850152608060408501526080840190613a88565b9160606001910152565b6001600160801b0361374d949360609360018060a01b031683521660208201528160408201520190613960565b51906001600160801b038216820361060357565b81601f8201121561060357805190613bad82613577565b92613bbb604051948561353f565b8284526020838301011161060357815f9260208093018386015e8301015290565b9160608383031261060357613bf083613a22565b92613bfd60208201613b82565b9260408201516001600160401b0381116106035761374d9201613b96565b908160609103126106035780518015158103610603579161374d6040613c4360208501613b82565b9301613b82565b6001600160a01b039182168152911660208201526001600160801b039182166040820152918116606083015291909116608082015260c060a0820181905261374d92910190613960565b90602080835192838152019201905f5b818110613cb15750505090565b82516001600160a01b0316845260209384019390920191600101613ca4565b90602080835192838152019201905f5b818110613ced5750505090565b82516001600160801b0316845260209384019390920191600101613ce0565b6001600160a01b0391821681529116602082015260a06040820181905290949392608092613d4f92613d419190880190613c94565b908682036060880152613cd0565b930152565b91908201809211613d6157565b634e487b7160e01b5f52601160045260245ffd5b91908203918211613d6157565b906004811015613d935760051b0190565b634e487b7160e01b5f52603260045260245ffd5b8051821015613d935760209160051b010190565b8115613dc5570490565b634e487b7160e01b5f52601260045260245ffd5b91908260409103126106035761374d602083519301613b82565b9080601f8301121561060357815191613e0b83613560565b92613e19604051948561353f565b80845260208085019160051b830101918383116106035760208101915b838310613e4557505050505090565b82516001600160401b038111610603578201906080828703601f1901126106035760405190613e7382613510565b613e7f60208401613a22565b8252613e8d60408401613a22565b6020830152613e9e60608401613a22565b60408301526080830151916001600160401b03831161060357613ec988602080969581960101613b96565b6060820152815201920191613e36565b3d15613f03573d90613eea82613577565b91613ef8604051938461353f565b82523d5f602084013e565b606090565b6001600160a01b03909116815260406020820181905261374d92910190613960565b90602080835192838152019201905f5b818110613f475750505090565b9091926020606060019260408751805183528481015185840152015160408201520194019101919091613f3a565b61374d916020613f8e8351604084526040840190613f2a565b920151906020818403910152613f2a565b60ff5f5160206148975f395f51905f525416613fb757565b63d93c066560e01b5f5260045ffd5b90925f19811461404b576001600160a01b03848116908416148015614043575b61403d576040516323b872dd60e01b60208201526001600160a01b039485166024820152929093166044830152606482019290925261403b9161403682608481015b03601f19810184528361353f565b6147a0565b565b50505050565b508015613fe6565b630d550c3b60e11b5f5260045ffd5b821580156141ad575b6141a857604051636eb1769f60e11b81523060048201526001600160a01b03838116602483018190529490831691602081604481865afa9081156130e1575f91614174575b506140f0946140fe6140bd6020945f94613d54565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529687906064820190565b03601f19810188528761353f565b85519082865af1903d5f519083614155575b5050501561411d57505050565b61403661403b936040519063095ea7b360e01b602083015260248201525f60448201526044815261414f60648261353f565b826147a0565b9192509061416a57503b15155b5f8080614110565b6001915014614162565b90506020813d6020116141a0575b8161418f6020938361353f565b8101031261060357516140f06140a8565b3d9150614182565b505050565b506001600160a01b0382163014614063565b6001600160801b0381116141d9576001600160801b031690565b6306dfcc6560e41b5f52608060045260245260445ffd5b5f9190825b81518410156142265761421e6001916001600160801b036142168786613da7565b511690613d54565b9301926141f5565b925050565b929590939194955f978151845103614370575f985b82518a101561432f578760208860c4895f8f6001600160801b0361428c828c8f946142729060018060a01b0392613da7565b5116936115b0846142838484613da7565b5116868961405a565b51604051632cfdfa9360e11b81526001600160a01b03958616600482015296851660248801529390971660448601529590911660648401526084830181905260a483018990529193849283915af19081156130e1575f916142fd575b506142f590600192613d54565b990198614240565b90506020813d8211614327575b816143176020938361353f565b81010312610603575160016142e8565b3d915061430a565b9850966001600160801b031695505050838610915061434e9050575050565b83906319aae4c960e11b5f5260018060a01b031660045260245260445260645ffd5b631f77022160e11b5f5260045ffd5b5f5160206148575f395f51905f52546001600160a01b0316330361439f57565b63118cdaa760e01b5f523360045260245ffd5b5f5160206148d75f395f51905f5280546001600160a01b03199081169091555f5160206148575f395f51905f5280549182166001600160a01b0393841690811790915591167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b92969590939491945f978051825103614370575f985b81518a101561451e578760208860c4895f8f806001600160801b0361447c818f946144668e9160018060a01b0392613da7565b511694169261447684868961405a565b8d613da7565b51166040519889978896637a633c3f60e11b885260018060a01b0316600488015260018060a01b0316602487015260018060a01b03166044860152606485015260848401528a60a48401525af19081156130e1575f916144ec575b506144e490600192613d54565b990198614433565b90506020813d8211614516575b816145066020938361353f565b81010312610603575160016144d7565b3d91506144f9565b98505050509092506001600160801b039150169081841161453d575050565b839063f60dba4560e01b5f5260018060a01b031660045260245260445260645ffd5b9091905f19821461404b576001600160a01b038316301480156145bb575b6141a85760405163a9059cbb60e01b60208201526001600160a01b039093166024840152604483019190915261403b91906140368260648101614028565b50811561457d565b6040519060208201526020815261374d60408261353f565b919091825115614766575f905b8351821015614226576001600160a01b036146038386613da7565b5151165f525f60205260ff60405f2054161561473f575f9081906001600160a01b0360206146318689613da7565b510151166146a76001600160a01b03604061464c888b613da7565b51015116614028606061465f898c613da7565b510151614695604051968794602086019763e0a8041360e01b8952602487015260448601526080606486015260a4850190613960565b83810360231901608485015290613960565b6001600160a01b036146b98689613da7565b5151169151915af46146c9613ed9565b901561470d578051810190602081830312610603576020810151906001600160401b038211610603576020614705928160019501920101613b96565b9101906145e8565b6001600160a01b0361471f8386613da7565b5151604051630de816ad60e31b8152928392611bde921660048401613f08565b6001600160a01b036147518386613da7565b51511663616d132960e01b5f5260045260245ffd5b639f6de0d560e01b5f5260045ffd5b60ff5f5160206148b75f395f51905f525460401c161561479157565b631afcd79f60e31b5f5260045ffd5b905f602091828151910182855af1156130e1575f513d6147ef57506001600160a01b0381163b155b6147cf5750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156147c8565b9061481c575080511561480d57805190602001fd5b63d6bda27560e01b5f5260045ffd5b8151158061484d575b61482d575090565b639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b50803b1561482556fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbccd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00a2646970667358221220e106c62c73be28f2dbb47262f64239ed9170f58d193346eca506e5e79d5afc1364736f6c634300081b0033", + "nonce": "0x11f", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xf12d4709d92bfecaa05ecd23d84f0f3bbc1d23811c27b5ebfc3248689bc4bcfa", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", + "function": "upgradeSubContract(address,address,bytes)", + "arguments": [ + "0x7fa333b184868d88aC78a82eC06d5e87d4B0322E", + "0x04B945a67B799E87034b5F6AD4dEDb57D08Ef588", + "0x" + ], + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", + "gas": "0x1077f", + "value": "0x0", + "input": "0x27e878080000000000000000000000007fa333b184868d88ac78a82ec06d5e87d4b0322e00000000000000000000000004b945a67b799e87034b5f6ad4dedb57d08ef58800000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x120", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x570a80", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x3cd29d5d965861371409e93ee8dd7d86f83484a66244e19443038390d6d43409", + "transactionIndex": "0x4", + "blockHash": "0xaaa5012ae19858d6b5be15ae93d945bb7bfdf794c667bae3ddc48fd8b6f386e8", + "blockNumber": "0x14f06b20", + "gasUsed": "0x4487bd", + "effectiveGasPrice": "0x989680", + "blobGasUsed": "0x0", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": null, + "contractAddress": "0x04b945a67b799e87034b5f6ad4dedb57d08ef588", + "gasUsedForL1": "0x5e84c", + "l1BlockNumber": "0x15bb212" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x27d2b", + "logs": [ + { + "address": "0x7fa333b184868d88ac78a82ec06d5e87d4b0322e", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x00000000000000000000000004b945a67b799e87034b5f6ad4dedb57d08ef588" + ], + "data": "0x", + "blockHash": "0xa977dadb9b6cdb2558e4f65dd42a761e58dffba8557937fbfa41c5235cba0534", + "blockNumber": "0x14f06b29", + "transactionHash": "0xf12d4709d92bfecaa05ecd23d84f0f3bbc1d23811c27b5ebfc3248689bc4bcfa", + "transactionIndex": "0x3", + "logIndex": "0x2", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000008002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000001020000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xf12d4709d92bfecaa05ecd23d84f0f3bbc1d23811c27b5ebfc3248689bc4bcfa", + "transactionIndex": "0x3", + "blockHash": "0xa977dadb9b6cdb2558e4f65dd42a761e58dffba8557937fbfa41c5235cba0534", + "blockNumber": "0x14f06b29", + "gasUsed": "0xe0da", + "effectiveGasPrice": "0x989680", + "blobGasUsed": "0x0", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", + "contractAddress": null, + "gasUsedForL1": "0x2215", + "l1BlockNumber": "0x15bb212" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1750916357, + "chain": 42161, + "commit": "c6cbea8" +} \ No newline at end of file diff --git a/broadcast/UpgradeRouterForRepayingGt.s.sol/56/run-latest.json b/broadcast/UpgradeRouterForRepayingGt.s.sol/56/run-latest.json new file mode 100644 index 0000000..b8b939a --- /dev/null +++ b/broadcast/UpgradeRouterForRepayingGt.s.sol/56/run-latest.json @@ -0,0 +1,100 @@ +{ + "transactions": [ + { + "hash": "0x82e7611a8fced5b1ed92a43fa41e87295b4020a568413e277bfbaac3ad81003a", + "transactionType": "CREATE", + "contractName": "TermMaxRouter_Repay_Gt", + "contractAddress": "0x112f47001514d0e16553f9f7683432a5cdada88f", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "gas": "0x5168df", + "value": "0x0", + "input": "0x60a080604052346029573060805261492c908161002e82396080518181816128dc015261296f0152f35b5f80fdfe60806040526004361015610011575f80fd5b5f5f3560e01c80631443c4d61461322c578063150b7a02146131d75780631ac100a41461314f5780632a51cf5114612faa5780632e3e3ef214612f6c5780632f20734514612ee95780633f4ba83a14612e6957806345618d2b14612b195780634f1ef2861461293057806352d1902d146128c95780635c975abb1461289a578063715018a61461281b57806379ba5097146127ce5780638456cb591461275b57806384e090911461252257806389c3584d146121ca5780638da5cb5b14612195578063943189f414611eb257806395320fd014611c1357806399a54a5a14611974578063ad3cb1cc14611927578063c4d66de81461177a578063c71c700c146113bd578063d3e052cf146110a5578063df3e1e0514610d2f578063e30c397814610cfa578063e9919e5c14610c5c578063ef8b4968146109f5578063f1a229ad1461070e578063f2fde38b14610688578063f38743f3146104755763fc1c1b211461017a575f80fd5b3461035057610188366138cc565b91929690959394610197613f9f565b604051634eb1c24560e11b81526001600160a01b039190911697909260a0846004818c5afa9485156103d657839288859486978799610432575b506001600160a01b0390811697169461020291906101f18230338a613fc6565b6001600160a01b031695869061405a565b604061022f8c6102118c6145c3565b8884519e8f9485938492637a0ee4f960e11b84523060048501613b55565b03925af196871561042757859a86986103e5575b509187918961025395948961441d565b92610267846001600160801b038716613d75565b8281610362575b9150503b1561035e57604051632142170760e11b81523060048201526001600160a01b0386166024820152604481018890529082908290818381606481015b03925af180156103535761033b575b602087808a7fdc3efdf28701077a23ef0beb0f3260ca639658ce2676bbc9d83030fac6ce56128a8a6103308b6102f18c6141bf565b604080513381526001600160a01b0390951660208601528401949094526001600160801b039081166060840152909216608082015290819060a0820190565b0390a3604051908152f35b61034682809261353f565b61035057806102bc565b80fd5b6040513d84823e3d90fd5b5080fd5b81610370916103759461405a565b6141bf565b813b156103e1576001600160801b0360405191636f965f9f60e11b8352896004840152166024820152826044820152828160648183865af180156103d6579083916103c1575b8261026e565b816103cb9161353f565b61035e57815f6103bb565b6040513d85823e3d90fd5b8280fd5b610253949391929b508998506104129060403d604011610420575b61040a818361353f565b810190613dd9565b9b909b985091909293610243565b503d610400565b6040513d87823e3d90fd5b9198505061045e919650610202945060a03d60a01161046e575b610456818361353f565b810190613a36565b99909891969193909250906101d1565b503d61044c565b50346103505760a03660031901126103505761048f613478565b9061049861348e565b90604435926064356001600160401b0381116103e1576104bc9036906004016135d8565b608435936104c8613f9f565b604051634eb1c24560e11b81526001600160a01b039190911693909160a083600481885afa928315610353578588918490859661065b575b506105219291906001600160a01b031661051c83303384613fc6565b61405a565b604051633def417960e11b815260048101889052306024820152908282604481838a5af180156103d65783928491610607575b509061055f916145db565b90602082519281808201948592010103126106035761057f915190613d54565b948086106105e2575050602094826105bb867fc1822dac55540066416ffa59d2eb79715d05171ecf435ac5226726b50686d9419560809561455f565b604051918252338783015260018060a01b03166040820152846060820152a2604051908152f35b856064936319aae4c960e11b845260018060a01b0316600452602452604452fd5b5f80fd5b9250503d8084843e610619818461353f565b8201604083820312610657578251926020810151906001600160401b038211610653579161064c9161055f949301613b96565b9091610554565b8580fd5b8380fd5b6105219392965061067b915060a03d60a01161046e57610456818361353f565b9894959250610500915050565b5034610350576020366003190112610350576106a2613478565b6106aa61437f565b5f5160206148d75f395f51905f5280546001600160a01b0319166001600160a01b039283169081179091555f5160206148575f395f51905f52549091167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b50346103505761010036600319011261035057610729613478565b9061073261348e565b916044356064356001600160401b03811161065757610755903690600401613750565b6084356001600160401b0381116109f1576107749036906004016137be565b9160a435918215158093036106535760c4356001600160401b0381116109ed5760a06107a5600492369084016135d8565b986107ae613f9f565b604051634eb1c24560e11b815292839182905f196001861b01165afa9788156109e25787918890899a6109bb575b506001600160a01b031695863b156109ac57604051635c46a7ef60e11b815233600482015230602482015285604482015260806064820152896084820152898160a481838c5af180156109b057908a91610997575b50506108a69261085d979695949261086f610890936040519a8b9660a0602089015260c0880190613c94565b868103601f1901604088015290613cd0565b6001600160a01b039092166060850152838203601f19016080850152613a88565b60e43560a083015203601f19810186528561353f565b823b1561065357916108e593918680946040519687958694859363078ad17360e31b855260048501526024840152606060448401526064830190613960565b03925af180156103d657908391610982575b50506040516370a0823160e01b81523060048201526020816024816001600160a01b0388165afa9283156109765792610941575b50816109399160209461455f565b604051908152f35b9091506020813d60201161096e575b8161095d6020938361353f565b81010312610603575190602061092b565b3d9150610950565b604051903d90823e3d90fd5b8161098c9161353f565b61035e57815f6108f7565b816109a19161353f565b6109ac57885f610831565b8880fd5b6040513d8c823e3d90fd5b919950506109d8915060a03d60a01161046e57610456818361353f565b9a9250505f6107dc565b6040513d89823e3d90fd5b8680fd5b8480fd5b50346103505760a036600319011261035057610a0f613478565b6024356001600160801b0381168091036103e157610a2b6134a4565b506064356001600160401b03811161065757610a4b903690600401613592565b916084356001600160401b0381116109f157610a6b903690600401613592565b805181019360a082602087019603126106535760208201516001600160401b0381116109ed5782019480603f870112156109ed57602086015195610aae87613560565b96610abc604051988961353f565b808852602080808a019260051b8401010191838311610c2057604001905b828210610c445750505060408301516001600160401b038111610c4057830181603f82011215610c4057602081015190610b1382613560565b91610b21604051938461353f565b8083526020808085019260051b8401010191848311610c3c57604001905b828210610c2457505050610b5560608501613a22565b916080850151946001600160401b038611610c2057610b7e610b8992602060a098840101613df3565b9586910151946145db565b936001600160a01b0386811690841614610bad575b88610baa88338961405a565b80f35b80515f198101908111610c0c576001600160a01b0391604091610bcf91613da7565b51015116966020855195818082019788920101031261060357610baa97610bf9610c0196516141bf565b93309161441d565b505f80808080610b9e565b634e487b7160e01b8a52601160045260248afd5b8980fd5b60208091610c3184613b82565b815201910190610b3f565b8a80fd5b8780fd5b60208091610c5184613a22565b815201910190610ada565b5034610350576020610cd5610330610cdc7f18f137cdb80704341c5da72a0f5776e3361de90e2a157d704a4b79d96b753aa6610ccc610c9a3661382c565b869a9596949992939791610cac613f9f565b84898c8a6001600160801b03851699610cc78b303384613fc6565b61441d565b998a8094613d75565b338a61455f565b6040516001600160a01b039485169890941696939485943386613d0c565b50346103505780600319360112610350575f5160206148d75f395f51905f52546040516001600160a01b039091168152602090f35b503461035057610d3e36613922565b91610d4a939193613f9f565b604051634eb1c24560e11b81526001600160a01b0391909116929060a081600481875afa90811561109a5786908790889361106c575b506040516331a9108f60e11b8152600481018890526001600160a01b0391821693909160209183916024918391165afa908115611018578891611032575b50336001600160a01b039091160361102357604051633f5ffaf560e01b8152602081600481895afa908115611018578891610fe6575b506305f5e1008402908482046305f5e1001485151715610fd2576305f5e10003906305f5e1008211610fd257610e2d9161037091613dbb565b906001600160801b03604051926339a380ed60e01b845230600485015216938460248401528760448401526020836064818c8b5af18015610fc75787938a91610f74575b509293610eaf93859261051c916001600160801b031680821015610f695750809681955b610ea183303388613fc6565b6001600160a01b031661405a565b833b1561065357604051632770a7eb60e21b81526001600160a01b03841660048201526024810182905286908181604481838a5af1801561035357610f50575b5050916001600160801b0360a092610f277fdc3efdf28701077a23ef0beb0f3260ca639658ce2676bbc9d83030fac6ce5612956141bf565b9060405193338552600180871b031660208501528860408501526060840152166080820152a380f35b81610f5d9195939561353f565b6106535791855f610eef565b905080968195610e95565b9350506020833d602011610fbf575b81610f906020938361353f565b810103126109ac57869361051c85926001600160801b03610fb3610eaf97613b82565b93975050929450610e71565b3d9150610f83565b6040513d8b823e3d90fd5b634e487b7160e01b89526011600452602489fd5b90506020813d602011611010575b816110016020938361353f565b8101031261060357515f610df4565b3d9150610ff4565b6040513d8a823e3d90fd5b6315e69dc560e21b8752600487fd5b90506020813d602011611064575b8161104d6020938361353f565b81010312610c405761105e90613a22565b5f610dbe565b3d9150611040565b602493506020925061108d915060a03d60a01161046e57610456818361353f565b5050939192909150610d80565b6040513d88823e3d90fd5b503461035057610100366003190112610350576110c0613478565b6110c861348e565b6064356001600160a01b03811693919084900361035e57608435936110eb6134e4565b936110f46134fa565b9260e435916001600160401b03831161065357604060031984360301126106535760405192604084018481106001600160401b038211176113a95760405280600401356001600160401b038111610c40576111559060043691840101613984565b845260248101356001600160401b038111610c405761117991369101600401613984565b6020840152611186613f9f565b604051634eb1c24560e11b8152966001600160a01b0391909116949060a088600481895afa9687156109765780978199829161137d575b5060405163887bb98960e01b81526001600160a01b03909516600486018190526044803560248801528601979097526080606486015260208580611204608482018a613f75565b0381858c5af1948515610353578295611341575b508a6112dc575b5050927fac20b37c6c923070aa8deac25d6e9bf9f6eecd727d9c2b89d0451685ecf4ba5294926001600160801b03610330938160209c9716998a806112bd575b50501698898061129e575b505060018060a01b031697889760405195869586528b8601526040850152606084015260a0608084015260a0830190613f75565b6112b6916001600160a01b0384811691339116613fc6565b5f8961126a565b6112d5916001600160a01b0386811691339116613fc6565b5f8a61125f565b8a886112ee9261051c83303384613fc6565b863b15610350576040516340c10f1960e01b81526001600160a01b0385166004820152602481018b90528181604481838c5af18015610353571561121f5761133782809261353f565b610350578061121f565b9094506020813d602011611375575b8161135d6020938361353f565b8101031261035e5761136e90613a22565b935f611218565b3d9150611350565b9198505061139b91985060a03d60a01161046e57610456818361353f565b9a939150509790985f6111bd565b634e487b7160e01b88526041600452602488fd5b503461035057610100366003190112610350576113d8613478565b6113e061348e565b6113e86134ce565b92606435926001600160801b038416928385036103e1576084356001600160401b0381116106575761141e903690600401613750565b9460a4356001600160401b0381116109f15761143e9036906004016137be565b916114476134fa565b9260e43591611454613f9f565b604051634eb1c24560e11b81526001600160a01b039190911698909360a0856004818d5afa958615611018578a9b899a9b998b978c99611746575b506001600160a01b03908116976001600160801b0392909216939116908c84111561173457966001600160801b0381985b169a8b906114d086303386613fc6565b6114d99261405a565b898d6114e78e303386613fc6565b6114f09261405a565b8b3b15610c2057604051632770a7eb60e21b81526001600160a01b0389166004820152602481018a90528a818e8183816044810103925af1801561172957908b91611714575b5050899b835185510361170557999b989a8c9a6001600160a01b03998a169a988a16998816989091908c5b8651111561164d578b8f8c8f8d60c4918e8e6001600160801b038f8f986115b5916115b060209b6115998460018060a01b0392613da7565b51169687866115a88686613da7565b51169161405a565b613da7565b51166040519889978896632cfdfa9360e11b8852600488015260248701526044860152606485015282608485015260a48401525af1908115611640578e9161160e575b5061160590600192613d54565b9e019d8e611561565b90506020813d8211611638575b816116286020938361353f565b81010312610603575160016115f8565b3d915061161b565b8e604051903d90823e3d90fd5b858c928f8f906001600160801b038f91611668908d97613d54565b9816908189106116ea57505050602096926116cb7f482c5c16eb3726edd4dc0b4e52fdb8488530e472f26df2a268d3d94edfc135a095936116d9936040519687963388528c8801526040870152606086015260e0608086015260e0850190613c94565b9083820360a0850152613cd0565b8560c08301520390a2604051908152f35b6319aae4c960e11b8352600452602488905260445260649150fd5b631f77022160e11b8b5260048bfd5b8161171e9161353f565b610c2057895f611536565b6040513d8d823e3d90fd5b5082966001600160801b0382986114c0565b90506001600160801b03985061176c91975060a03d60a01161046e57610456818361353f565b9a92999392915061148f9050565b503461035057602036600319011261035057611794613478565b5f5160206148b75f395f51905f52549060ff8260401c1615916001600160401b0381168015908161191f575b6001149081611915575b15908161190c575b506118fd5767ffffffffffffffff1981166001175f5160206148b75f395f51905f5255826118d1575b50611804614775565b61180c614775565b611814614775565b60ff195f5160206148975f395f51905f5254165f5160206148975f395f51905f525561183e614775565b611846614775565b6001600160a01b038116156118bd5761185e906143b2565b6118655780f35b68ff0000000000000000195f5160206148b75f395f51905f5254165f5160206148b75f395f51905f52557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a180f35b631e4fbdf760e01b83526004839052602483fd5b68ffffffffffffffffff191668010000000000000001175f5160206148b75f395f51905f52555f6117fb565b63f92ee8a960e01b8452600484fd5b9050155f6117d2565b303b1591506117ca565b8491506117c0565b50346103505780600319360112610350575061197060405161194a60408261353f565b60058152640352e302e360dc1b6020820152604051918291602083526020830190613960565b0390f35b50346103505760803660031901126103505761198e613478565b5061199761348e565b506064356001600160401b03811161035e576119b7903690600401613592565b908151820160808382031261035e5760208301516001600160a01b03811693908490036103e1576040810151916060820151906001600160401b0382116109f157608091602080611a0c930191850101613df3565b9101519160028310156106575781611a29611a4692604435613d54565b60405190602082015260208152611a4160408261353f565b6145db565b815190915f198201918211611bff5790611a5f91613da7565b5180516001600160a01b031684526020849052604084205490929060ff1615611be25780611b2457505060409081015190516370a0823160e01b81523060048201526001600160a01b039091169190602081602481865afa9182156109765791611af0575b508061197093611ad6611adc936145c3565b9361405a565b604051918291602083526020830190613960565b90506020813d602011611b1c575b81611b0b6020938361353f565b810103126106035751611970611ac4565b3d9150611afe565b9193909291600114611b3d575b50506119709150611adc565b8190604085019460018060a01b0386511690604051926020840192639df3032560e01b84526024850152604484015260606064840152611b9283611b846084820189613960565b03601f19810185528461353f565b519151916001600160a01b03165af491611baa613ed9565b9215611bb65780611b31565b51604051631d039b4360e11b815292839250611bde916001600160a01b031660048401613f08565b0390fd5b825163616d132960e01b85526001600160a01b0316600452602484fd5b634e487b7160e01b85526011600452602485fd5b503461035057611c2236613922565b93929091611c2e613f9f565b604051634eb1c24560e11b81526001600160a01b0391909116949060a081600481895afa8015610427578590858788948993611e81575b506001600160a01b0392831694921691611c979190611c8682303389613fc6565b6001600160a01b031694859061405a565b604051633f5ffaf560e01b81526020816004818c5afa908115611018578891611e4f575b506305f5e1008502908582046305f5e1001486151715610fd2576305f5e10003906305f5e1008211610fd2576103708995949392611cf892613dbb565b946040611d258b611d088b6145c3565b83519c8d80948193637a0ee4f960e11b83528d3060048501613b55565b03925af18015610427579085949392918b969a8691611e12575b509161051c87926001600160801b03611d6e9695168082105f14611e07575080988195610ea183303388613fc6565b873b1561035e57604051632770a7eb60e21b81526001600160a01b0386166004820152602481018490528281604481838d5af180156103d657908391611df2575b5050803b1561035e57604051632142170760e11b81523060048201526001600160a01b0386166024820152604481018890529082908290818381606481016102ad565b81611dfc9161353f565b61035e57815f611daf565b905080988195610e95565b6001600160801b039b50611d6e949391508792611e4061051c9260403d6040116104205761040a818361353f565b9d909d93959650509250611d3f565b90506020813d602011611e79575b81611e6a6020938361353f565b8101031261060357515f611cbb565b3d9150611e5d565b91935050611c979350611ea3915060a03d60a01161046e57610456818361353f565b50909492939092909190611c65565b503461035057611ec1366136be565b9194929593611ece613f9f565b604051634eb1c24560e11b81526001600160a01b03919091169560a0826004818a5afa90811561109a57611f978899611fbc9994602094611f83948b8c938d93612157575b506001600160801b03948516989394611f5894909291611f44918b916001600160a01b031661051c83303384613fc6565b1690309033906001600160a01b0316613fc6565b60018060a01b03169560405192839188868401528a60408401526080606084015260a0830190613a88565b89608083015203601f19810183528261353f565b611fa0836141bf565b604051639ea1c1c960e01b815298899283928960048501613b55565b0381888b5af1958615610427578596612123575b506040516341a4eb5f60e11b815260048101879052918583602481875afa92831561109a5786936120f8575b50606060249394604051948580926350ef5c3560e01b82528b60048301525afa92831561109a5786936120b9575b506001600160801b0392831692168083116120a25750926103307f6cc7689f3960393f975bc636577345ee34fd6fd0b516b15c923e7885e518b098938796936020999660405195869533875260018060a01b03168c87015260408601526060850152608084015260c060a084015260c0830190613960565b6370d1969b60e01b86526004526024829052604485fd5b6001600160801b039193506120e6829160603d6060116120f1575b6120de818361353f565b810190613c1b565b50905093915061202a565b503d6120d4565b602493506121196060913d808a833e612111818361353f565b810190613bdc565b9150509350611ffc565b9095506020813d60201161214f575b8161213f6020938361353f565b810103126106035751945f611fd0565b3d9150612132565b611f5894506001600160801b03935083929150612185611f449160a03d60a01161046e57610456818361353f565b509097509550929350611f139050565b50346103505780600319360112610350575f5160206148575f395f51905f52546040516001600160a01b039091168152602090f35b5034610350576040366003190112610350576121e4613478565b6121ec61348e565b90608092600460405192612200868561353f565b8536853760a060405191612214888461353f565b87368437604051634eb1c24560e11b815293849182905f196001861b01165afa80156103d6578392848594869287946124f6575b506001600160a01b039081168852908116602088015290811660408701529081166060860152851691835b6004811061247057506040516370a0823160e01b815260048101939093526001600160a01b031690602083602481855afa928315612465578493612431575b5095949391906122c182613560565b916122cf604051938461353f565b8083526122db81613560565b602084019690601f1901368837855b82811061239e575050506040519687966101408801948887905b6004821061237b57505050870185905b600482106123615750505061010086015261014061012086015251809152610160840192915b818110612348575050500390f35b825184528594506020938401939092019160010161233a565b825181528998506020928301926001929092019101612314565b82516001600160a01b031681528b9a506020928301926001929092019101612304565b604051632f745c5960e01b81526001600160a01b038316600482015260248101829052989997989597949593949390602082604481895afa80156110185788906123ff575b600192506123f18289613da7565b5201989796949392986122ea565b506020823d8211612429575b816124186020938361353f565b8101031261060357600191516123e3565b3d915061240b565b9092506020813d60201161245d575b8161244d6020938361353f565b810103126106035751915f6122b2565b3d9150612440565b6040513d86823e3d90fd5b60249060206001600160a01b03612487838a613d82565b5116604051938480926370a0823160e01b82528960048301525afa801561109a5786906124c4575b600192506124bd8286613d82565b5201612273565b506020823d82116124ee575b816124dd6020938361353f565b8101031261060357600191516124af565b3d91506124d0565b935050505061251591925060a03d60a01161046e57610456818361353f565b919493919290915f612248565b503461035057612531366138cc565b909291939461253e613f9f565b604051634eb1c24560e11b81526001600160a01b039190911694909260a084600481895afa928315610fc757898a958b95612728575b506001600160a01b0316956001600160801b038116926125b0926125aa92909186906125a28730338c613fc6565b308b8a61441d565b926141f0565b6040516341a4eb5f60e11b8152600481018990526001600160a01b0390951699909481816024818e5afa90811561035357829161270b575b506001600160801b03811686106126f2575b6001600160801b03169961260f8b828961405a565b803b1561035e57818b60648b836040519586948593636f965f9f60e11b8552600485015260248401528160448401525af18015610353576126dd575b5050977ff2960dbf8545963973c9df7f52bdbdd6803dbf97c4597938fa37510b1218aece948860809561268e8296612686869760209f613d75565b9c8d9161455f565b8381116126c1575b505050506040519133835260018060a01b0316888301526040820152856060820152a3604051908152f35b6126d4936126ce91613d75565b9161455f565b805f8381612696565b6126e882809261353f565b610350578061264b565b506001600160801b03612704866141bf565b90506125fa565b61271f91503d8084833e612111818361353f565b5090505f6125e8565b6125aa96506125b092955061274c915060a03d60a01161046e57610456818361353f565b91985090969391506125749050565b503461035057806003193601126103505761277461437f565b61277c613f9f565b600160ff195f5160206148975f395f51905f525416175f5160206148975f395f51905f52557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a180f35b50346103505780600319360112610350575f5160206148d75f395f51905f5254336001600160a01b039091160361280857610baa336143b2565b63118cdaa760e01b815233600452602490fd5b503461035057806003193601126103505761283461437f565b5f5160206148d75f395f51905f5280546001600160a01b03199081169091555f5160206148575f395f51905f528054918216905581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5034610350578060031936011261035057602060ff5f5160206148975f395f51905f5254166040519015158152f35b50346103505780600319360112610350577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630036129215760206040515f5160206148775f395f51905f528152f35b63703e46dd60e11b8152600490fd5b50604036600319011261035057612945613478565b906024356001600160401b03811161035e57612965903690600401613592565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016308114908115612af7575b50612ae8576129a761437f565b6040516352d1902d60e01b8152926001600160a01b0381169190602085600481865afa80958596612ab4575b506129ec57634c9c8ce360e01b84526004839052602484fd5b9091845f5160206148775f395f51905f528103612aa25750813b15612a90575f5160206148775f395f51905f5280546001600160a01b031916821790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8480a28151839015612a765780836020612a7295519101845af4612a6c613ed9565b916147f8565b5080f35b50505034612a815780f35b63b398979f60e01b8152600490fd5b634c9c8ce360e01b8452600452602483fd5b632a87526960e21b8552600452602484fd5b9095506020813d602011612ae0575b81612ad06020938361353f565b810103126109f15751945f6129d3565b3d9150612ac3565b63703e46dd60e11b8252600482fd5b5f5160206148775f395f51905f52546001600160a01b0316141590505f61299a565b50346103505761012036600319011261035057612b34613478565b612b3c61348e565b906044356001600160401b03811161065757612b5c903690600401613750565b916064356001600160401b0381116109f157612b7c9036906004016137be565b93608435916001600160801b038316830361035e57612b996134e4565b94612ba26134fa565b9360e4356001600160401b0381116109f157612bc29036906004016135d8565b92612bcb613f9f565b604051634eb1c24560e11b81526001600160a01b039190911698909160a0836004818d5afa91821561109a578997948794602094612cad9c9894612c88948f9d9b9489948a94612e31575b50612c4b612c43612c58969760018060a01b03169d6001600160801b03612c3c866141f0565b9116613d54565b303387613fc6565b61010435938c309161422b565b998a9160018060a01b03169761051c8b612c7a6040519788928d8b8501613b1a565b03601f19810187528661353f565b612c91886141bf565b604051639ea1c1c960e01b8152998a9283928960048501613b55565b0381848c5af1968715612e24578197612df0575b506040516341a4eb5f60e11b815260048101889052918183602481875afa928315610353578293612dcd575b50606060249394604051948580926350ef5c3560e01b82528c60048301525afa928315610353578293612da0575b506001600160801b03166001600160801b03831690808211612d8a575050509260409692612d7b7f6cc7689f3960393f975bc636577345ee34fd6fd0b516b15c923e7885e518b098938896612d6f896141bf565b8b519586953387613c4a565b0390a382519182526020820152f35b6370d1969b60e01b835260045260245260449150fd5b6001600160801b03919350612dc39060603d6060116120f1576120de818361353f565b5090509290612d1b565b60249350612de66060913d8086833e612111818361353f565b9150509350612ced565b9096506020813d602011612e1c575b81612e0c6020938361353f565b810103126106035751955f612cc1565b3d9150612dff565b50604051903d90823e3d90fd5b612c4b9650612c589550612c439450612e589060a03d60a01161046e57610456818361353f565b92999198509196509150612c169050565b5034610350578060031936011261035057612e8261437f565b5f5160206148975f395f51905f525460ff811615612eda5760ff19165f5160206148975f395f51905f52557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a180f35b638dfc202b60e01b8252600482fd5b503461035057604036600319011261035057612f03613478565b602435908115158092036103e1577f4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca91604091612f3e61437f565b60018060a01b0316908185528460205282852060ff1981541660ff831617905582519182526020820152a180f35b50346103505760203660031901126103505760209060ff906040906001600160a01b03612f97613478565b1681528084522054166040519015158152f35b3461060357608036600319011261060357612fc3613478565b60243590612fcf6134ce565b9160643592831515908185036106035760a0600494612fec613f9f565b604051634eb1c24560e11b815295869182905f196001861b01165afa9485156130e1575f945f905f97613124575b506040516341a4eb5f60e11b8152600481018690526001600160a01b0391909116965f826024818b5afa9687156130e1578897613089956001600160801b03945f92613105575b5081851681861611156130fd5750935b156130ec5750915b1694859161051c83303384613fc6565b833b156106035760645f92836040519687948593636f965f9f60e11b8552600485015287602485015260448401525af19182156130e1576020926130d1575b50604051908152f35b5f6130db9161353f565b5f6130c8565b6040513d5f823e3d90fd5b6001600160a01b0316929050613079565b905093613071565b61311a9192503d805f833e612111818361353f565b509050908b613061565b9195505061314291955060a03d60a01161046e57610456818361353f565b979396925088905061301a565b346106035760207f93065b6ca8f9c36086d73ad337c4138513e460fcb4367c4880651b03da29494f6103306131b66131863661382c565b90613198999698939594979299613f9f565b6131ac6131a48b6141f0565b30338c613fc6565b898689878c61422b565b809760405194859460018060a01b03169860018060a01b0316973386613d0c565b34610603576080366003190112610603576131f0613478565b506131f961348e565b506064356001600160401b03811161060357613219903690600401613592565b50604051630a85bd0160e11b8152602090f35b346106035761323a366136be565b9094919293613247613f9f565b604051634eb1c24560e11b81526001600160a01b039190911695909460a0866004818a5afa80156130e157611b84611fa0896103706132e99a6020955f905f915f91613447575b6001600160801b038a16959293506132d0926132bc918791906001600160a01b031661051c83303384613fc6565b6001600160801b038d169030903390613fc6565b60018060a01b0316976040519485918c8b898501613b1a565b03815f8b5af19586156130e1575f96613413575b506040516341a4eb5f60e11b815260048101879052915f83602481875afa9283156130e1575f936133f0575b50606060249394604051948580926350ef5c3560e01b82528b60048301525afa9283156130e1575f936133c3575b506001600160801b03166001600160801b038316908082116133ae57602088808b7f6cc7689f3960393f975bc636577345ee34fd6fd0b516b15c923e7885e518b0988b8b6103308c8c8c6040519586953387613c4a565b6370d1969b60e01b5f5260045260245260445ffd5b6001600160801b039193506133e69060603d6060116120f1576120de818361353f565b5090509290613357565b602493506134096060913d805f833e612111818361353f565b9150509350613329565b9095506020813d60201161343f575b8161342f6020938361353f565b81010312610603575194876132fd565b3d9150613422565b5050506132d06134686132bc9260a03d60a01161046e57610456818361353f565b91955085945090925061328e9050565b600435906001600160a01b038216820361060357565b602435906001600160a01b038216820361060357565b604435906001600160a01b038216820361060357565b35906001600160a01b038216820361060357565b604435906001600160801b038216820361060357565b60a435906001600160801b038216820361060357565b60c435906001600160801b038216820361060357565b608081019081106001600160401b0382111761352b57604052565b634e487b7160e01b5f52604160045260245ffd5b90601f801991011681019081106001600160401b0382111761352b57604052565b6001600160401b03811161352b5760051b60200190565b6001600160401b03811161352b57601f01601f191660200190565b81601f82011215610603578035906135a982613577565b926135b7604051948561353f565b8284526020838301011161060357815f926020809301838601378301015290565b9080601f83011215610603578135916135f083613560565b926135fe604051948561353f565b80845260208085019160051b830101918383116106035760208101915b83831061362a57505050505090565b82356001600160401b038111610603578201906080828703601f190112610603576040519061365882613510565b613664602084016134ba565b8252613672604084016134ba565b6020830152613683606084016134ba565b60408301526080830135916001600160401b038311610603576136ae88602080969581960101613592565b606082015281520192019161361b565b9060c0600319830112610603576004356001600160a01b038116810361060357916024356001600160a01b038116810361060357916044356001600160801b038116810361060357916064356001600160801b038116810361060357916084356001600160801b0381168103610603579160a435906001600160401b0382116106035761374d916004016135d8565b90565b9080601f830112156106035781359061376882613560565b92613776604051948561353f565b82845260208085019360051b82010191821161060357602001915b81831061379e5750505090565b82356001600160a01b038116810361060357815260209283019201613791565b9080601f83011215610603578135906137d682613560565b926137e4604051948561353f565b82845260208085019360051b82010191821161060357602001915b81831061380c5750505090565b82356001600160801b0381168103610603578152602092830192016137ff565b60e0600319820112610603576004356001600160a01b038116810361060357916024356001600160a01b038116810361060357916044356001600160a01b038116810361060357916064356001600160401b038111610603578261389291600401613750565b91608435906001600160401b038211610603576138b1916004016137be565b9060a4356001600160801b0381168103610603579060c43590565b60e0600319820112610603576004356001600160a01b038116810361060357916024356001600160a01b03811681036106035791604435916064356001600160401b038111610603578261389291600401613750565b6080906003190112610603576004356001600160a01b038116810361060357906024356001600160a01b038116810361060357906044359060643590565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b81601f820112156106035780359061399b82613560565b926139a9604051948561353f565b8284526020606081860194028301019181831161060357602001925b8284106139d3575050505090565b606084830312610603576040519060608201908282106001600160401b0383111761352b57606092602092604052863581528287013583820152604087013560408201528152019301926139c5565b51906001600160a01b038216820361060357565b908160a091031261060357613a4a81613a22565b91613a5760208301613a22565b60408301519092906001600160a01b0381168103610603579161374d6080613a8160608501613a22565b9301613a22565b9080602083519182815201916020808360051b8301019401925f915b838310613ab357505050505090565b9091929394602080613b0b600193601f19868203018752608060608b51878060a01b038151168452878060a01b03868201511686850152878060a01b0360408201511660408501520151918160608201520190613960565b97019301930191939290613aa4565b939290613b4b926001600160801b039160018060a01b03168652166020850152608060408501526080840190613a88565b9160606001910152565b6001600160801b0361374d949360609360018060a01b031683521660208201528160408201520190613960565b51906001600160801b038216820361060357565b81601f8201121561060357805190613bad82613577565b92613bbb604051948561353f565b8284526020838301011161060357815f9260208093018386015e8301015290565b9160608383031261060357613bf083613a22565b92613bfd60208201613b82565b9260408201516001600160401b0381116106035761374d9201613b96565b908160609103126106035780518015158103610603579161374d6040613c4360208501613b82565b9301613b82565b6001600160a01b039182168152911660208201526001600160801b039182166040820152918116606083015291909116608082015260c060a0820181905261374d92910190613960565b90602080835192838152019201905f5b818110613cb15750505090565b82516001600160a01b0316845260209384019390920191600101613ca4565b90602080835192838152019201905f5b818110613ced5750505090565b82516001600160801b0316845260209384019390920191600101613ce0565b6001600160a01b0391821681529116602082015260a06040820181905290949392608092613d4f92613d419190880190613c94565b908682036060880152613cd0565b930152565b91908201809211613d6157565b634e487b7160e01b5f52601160045260245ffd5b91908203918211613d6157565b906004811015613d935760051b0190565b634e487b7160e01b5f52603260045260245ffd5b8051821015613d935760209160051b010190565b8115613dc5570490565b634e487b7160e01b5f52601260045260245ffd5b91908260409103126106035761374d602083519301613b82565b9080601f8301121561060357815191613e0b83613560565b92613e19604051948561353f565b80845260208085019160051b830101918383116106035760208101915b838310613e4557505050505090565b82516001600160401b038111610603578201906080828703601f1901126106035760405190613e7382613510565b613e7f60208401613a22565b8252613e8d60408401613a22565b6020830152613e9e60608401613a22565b60408301526080830151916001600160401b03831161060357613ec988602080969581960101613b96565b6060820152815201920191613e36565b3d15613f03573d90613eea82613577565b91613ef8604051938461353f565b82523d5f602084013e565b606090565b6001600160a01b03909116815260406020820181905261374d92910190613960565b90602080835192838152019201905f5b818110613f475750505090565b9091926020606060019260408751805183528481015185840152015160408201520194019101919091613f3a565b61374d916020613f8e8351604084526040840190613f2a565b920151906020818403910152613f2a565b60ff5f5160206148975f395f51905f525416613fb757565b63d93c066560e01b5f5260045ffd5b90925f19811461404b576001600160a01b03848116908416148015614043575b61403d576040516323b872dd60e01b60208201526001600160a01b039485166024820152929093166044830152606482019290925261403b9161403682608481015b03601f19810184528361353f565b6147a0565b565b50505050565b508015613fe6565b630d550c3b60e11b5f5260045ffd5b821580156141ad575b6141a857604051636eb1769f60e11b81523060048201526001600160a01b03838116602483018190529490831691602081604481865afa9081156130e1575f91614174575b506140f0946140fe6140bd6020945f94613d54565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529687906064820190565b03601f19810188528761353f565b85519082865af1903d5f519083614155575b5050501561411d57505050565b61403661403b936040519063095ea7b360e01b602083015260248201525f60448201526044815261414f60648261353f565b826147a0565b9192509061416a57503b15155b5f8080614110565b6001915014614162565b90506020813d6020116141a0575b8161418f6020938361353f565b8101031261060357516140f06140a8565b3d9150614182565b505050565b506001600160a01b0382163014614063565b6001600160801b0381116141d9576001600160801b031690565b6306dfcc6560e41b5f52608060045260245260445ffd5b5f9190825b81518410156142265761421e6001916001600160801b036142168786613da7565b511690613d54565b9301926141f5565b925050565b929590939194955f978151845103614370575f985b82518a101561432f578760208860c4895f8f6001600160801b0361428c828c8f946142729060018060a01b0392613da7565b5116936115b0846142838484613da7565b5116868961405a565b51604051632cfdfa9360e11b81526001600160a01b03958616600482015296851660248801529390971660448601529590911660648401526084830181905260a483018990529193849283915af19081156130e1575f916142fd575b506142f590600192613d54565b990198614240565b90506020813d8211614327575b816143176020938361353f565b81010312610603575160016142e8565b3d915061430a565b9850966001600160801b031695505050838610915061434e9050575050565b83906319aae4c960e11b5f5260018060a01b031660045260245260445260645ffd5b631f77022160e11b5f5260045ffd5b5f5160206148575f395f51905f52546001600160a01b0316330361439f57565b63118cdaa760e01b5f523360045260245ffd5b5f5160206148d75f395f51905f5280546001600160a01b03199081169091555f5160206148575f395f51905f5280549182166001600160a01b0393841690811790915591167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b92969590939491945f978051825103614370575f985b81518a101561451e578760208860c4895f8f806001600160801b0361447c818f946144668e9160018060a01b0392613da7565b511694169261447684868961405a565b8d613da7565b51166040519889978896637a633c3f60e11b885260018060a01b0316600488015260018060a01b0316602487015260018060a01b03166044860152606485015260848401528a60a48401525af19081156130e1575f916144ec575b506144e490600192613d54565b990198614433565b90506020813d8211614516575b816145066020938361353f565b81010312610603575160016144d7565b3d91506144f9565b98505050509092506001600160801b039150169081841161453d575050565b839063f60dba4560e01b5f5260018060a01b031660045260245260445260645ffd5b9091905f19821461404b576001600160a01b038316301480156145bb575b6141a85760405163a9059cbb60e01b60208201526001600160a01b039093166024840152604483019190915261403b91906140368260648101614028565b50811561457d565b6040519060208201526020815261374d60408261353f565b919091825115614766575f905b8351821015614226576001600160a01b036146038386613da7565b5151165f525f60205260ff60405f2054161561473f575f9081906001600160a01b0360206146318689613da7565b510151166146a76001600160a01b03604061464c888b613da7565b51015116614028606061465f898c613da7565b510151614695604051968794602086019763e0a8041360e01b8952602487015260448601526080606486015260a4850190613960565b83810360231901608485015290613960565b6001600160a01b036146b98689613da7565b5151169151915af46146c9613ed9565b901561470d578051810190602081830312610603576020810151906001600160401b038211610603576020614705928160019501920101613b96565b9101906145e8565b6001600160a01b0361471f8386613da7565b5151604051630de816ad60e31b8152928392611bde921660048401613f08565b6001600160a01b036147518386613da7565b51511663616d132960e01b5f5260045260245ffd5b639f6de0d560e01b5f5260045ffd5b60ff5f5160206148b75f395f51905f525460401c161561479157565b631afcd79f60e31b5f5260045ffd5b905f602091828151910182855af1156130e1575f513d6147ef57506001600160a01b0381163b155b6147cf5750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156147c8565b9061481c575080511561480d57805190602001fd5b63d6bda27560e01b5f5260045ffd5b8151158061484d575b61482d575090565b639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b50803b1561482556fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbccd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00a2646970667358221220925c1201bddd2c612c7e7a01c3eaa77415c87efeb132fc181591bb88087eb69d64736f6c634300081d0033", + "nonce": "0x77", + "chainId": "0x38" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x06b6b9322aa03be75f51bc6e5bdbcf44ae52866a4bc9a3af3dcfd2b3034a4253", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x9498764f0c62257b83a04e2a757de30908ec793d", + "function": "upgradeSubContract(address,address,bytes)", + "arguments": [ + "0xb7634dB4f4710bb992118bC37d1F63e00e2704A4", + "0x112F47001514d0E16553F9F7683432a5cDADa88f", + "0x" + ], + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0x9498764f0c62257b83a04e2a757de30908ec793d", + "gas": "0x116ee", + "value": "0x0", + "input": "0x27e87808000000000000000000000000b7634db4f4710bb992118bc37d1f63e00e2704a4000000000000000000000000112f47001514d0e16553f9f7683432a5cdada88f00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x78", + "chainId": "0x38" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x23cf29a", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x0", + "transactionHash": "0x82e7611a8fced5b1ed92a43fa41e87295b4020a568413e277bfbaac3ad81003a", + "transactionIndex": "0xc3", + "blockHash": "0x8b45825253bfe823e8777e774496168661a9a861bf976cacedba46a98fff3878", + "blockNumber": "0x31b3ff9", + "gasUsed": "0x3e9f71", + "effectiveGasPrice": "0x5f5e100", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": null, + "contractAddress": "0x112f47001514d0e16553f9f7683432a5cdada88f" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x25859ae", + "logs": [ + { + "address": "0xb7634db4f4710bb992118bc37d1f63e00e2704a4", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x000000000000000000000000112f47001514d0e16553f9f7683432a5cdada88f" + ], + "data": "0x", + "blockHash": "0x8b45825253bfe823e8777e774496168661a9a861bf976cacedba46a98fff3878", + "blockNumber": "0x31b3ff9", + "transactionHash": "0x06b6b9322aa03be75f51bc6e5bdbcf44ae52866a4bc9a3af3dcfd2b3034a4253", + "transactionIndex": "0xd2", + "logIndex": "0x57c", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000400000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000020000000000000000000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004", + "type": "0x0", + "transactionHash": "0x06b6b9322aa03be75f51bc6e5bdbcf44ae52866a4bc9a3af3dcfd2b3034a4253", + "transactionIndex": "0xd2", + "blockHash": "0x8b45825253bfe823e8777e774496168661a9a861bf976cacedba46a98fff3878", + "blockNumber": "0x31b3ff9", + "gasUsed": "0xbeb9", + "effectiveGasPrice": "0x5f5e100", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0x9498764f0c62257b83a04e2a757de30908ec793d", + "contractAddress": null + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1750920571, + "chain": 56, + "commit": "c6cbea8" +} \ No newline at end of file From 2a236e08c95eadcad245ce5d385a33cb27a90622 Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 26 Jun 2025 15:09:32 +0800 Subject: [PATCH 131/194] fix issue 58 --- contracts/v2/vault/TermMaxVaultV2.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/v2/vault/TermMaxVaultV2.sol b/contracts/v2/vault/TermMaxVaultV2.sol index 4fee9d2..e0c2599 100644 --- a/contracts/v2/vault/TermMaxVaultV2.sol +++ b/contracts/v2/vault/TermMaxVaultV2.sol @@ -128,6 +128,7 @@ contract TermMaxVaultV2 is function _setPerformanceFeeRate(uint64 newPerformanceFeeRate) internal { _delegateCall(abi.encodeCall(IOrderManager.accruedInterest, ())); _performanceFeeRate = newPerformanceFeeRate; + emit SetPerformanceFeeRate(_msgSender(), newPerformanceFeeRate); } /// @notice View functions From 15748ae51305d51f99ce02216bd068323ac4904d Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 26 Jun 2025 15:11:21 +0800 Subject: [PATCH 132/194] fix issue 60 --- contracts/v2/vault/TermMaxVaultV2.sol | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/contracts/v2/vault/TermMaxVaultV2.sol b/contracts/v2/vault/TermMaxVaultV2.sol index e0c2599..3122120 100644 --- a/contracts/v2/vault/TermMaxVaultV2.sol +++ b/contracts/v2/vault/TermMaxVaultV2.sol @@ -272,8 +272,9 @@ contract TermMaxVaultV2 is * @inheritdoc ITermMaxVaultV2 */ function apy() external view virtual override returns (uint256) { - if (_accretingPrincipal == 0) return 0; - return (_annualizedInterest * (Constants.DECIMAL_BASE - _performanceFeeRate)) / (_accretingPrincipal); + uint256 accretingPrincipal_ = _accretingPrincipal; + if (accretingPrincipal_ == 0) return 0; + return (accretingPrincipal_ * (Constants.DECIMAL_BASE - _performanceFeeRate)) / (accretingPrincipal_); } /** From 01da9cc9e7c4982f5a5840edcc918442679cc0f4 Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 26 Jun 2025 15:13:37 +0800 Subject: [PATCH 133/194] fix issue 60 --- contracts/v2/vault/TermMaxVaultV2.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/v2/vault/TermMaxVaultV2.sol b/contracts/v2/vault/TermMaxVaultV2.sol index 3122120..6e3a2db 100644 --- a/contracts/v2/vault/TermMaxVaultV2.sol +++ b/contracts/v2/vault/TermMaxVaultV2.sol @@ -274,7 +274,7 @@ contract TermMaxVaultV2 is function apy() external view virtual override returns (uint256) { uint256 accretingPrincipal_ = _accretingPrincipal; if (accretingPrincipal_ == 0) return 0; - return (accretingPrincipal_ * (Constants.DECIMAL_BASE - _performanceFeeRate)) / (accretingPrincipal_); + return (_annualizedInterest * (Constants.DECIMAL_BASE - _performanceFeeRate)) / (accretingPrincipal_); } /** From 455369dfae9ed6b2b96b2e7b3206bd7acd37d4a8 Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 26 Jun 2025 15:52:33 +0800 Subject: [PATCH 134/194] fix issue 67 --- contracts/v2/lib/TransactionReentrancyGuard.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/v2/lib/TransactionReentrancyGuard.sol b/contracts/v2/lib/TransactionReentrancyGuard.sol index 29d307e..c6499d3 100644 --- a/contracts/v2/lib/TransactionReentrancyGuard.sol +++ b/contracts/v2/lib/TransactionReentrancyGuard.sol @@ -6,7 +6,7 @@ abstract contract TransactionReentrancyGuard { error ReentrantCall(); /// @notice Error thrown when a reentrant call is detected between actions. error ReentrantCallBetweenActions(uint256 actionId, uint256 oldActionId); - /// @notice Error thrown when an invalid action ID is provided. (0 and 1 are reserved for the guard itself) + /// @notice Error thrown when using reserved ID. (0 and 1 are reserved id) error InvalidActionId(); // keccak256(abi.encode(uint256(keccak256("termmax.tsstorage.TransactionReentrancyGuard")) - 1)) & ~bytes32(uint256(0xff)) From 2c69968d62031e2a3e13a01e47be64f5b117c471 Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 26 Jun 2025 16:00:39 +0800 Subject: [PATCH 135/194] fix issue 74 --- contracts/v2/vault/VaultStorageV2.sol | 3 +++ 1 file changed, 3 insertions(+) diff --git a/contracts/v2/vault/VaultStorageV2.sol b/contracts/v2/vault/VaultStorageV2.sol index 5cbd00e..3213471 100644 --- a/contracts/v2/vault/VaultStorageV2.sol +++ b/contracts/v2/vault/VaultStorageV2.sol @@ -31,6 +31,9 @@ contract VaultStorageV2 { /// @dev A mapping from collateral address to bad debt mapping(address => uint256) internal _badDebtMapping; + /// @dev A mapping from order address to their order information + /// @dev The order information includes the market address, the ft token address, + /// the xt token, the maximum supply, and the maturity mapping(address => OrderInfo) internal _orderMapping; /// @dev A one-way linked list presented using a mapping structure, recorded in order according to matiruty From 1a78bdf451bd0583b20ccd6d0cfd5728cd8a769e Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 26 Jun 2025 16:06:49 +0800 Subject: [PATCH 136/194] add repay gt function to avoid ddos attack --- contracts/v2/router/ITermMaxRouterV2.sol | 12 ++++++++++++ contracts/v2/router/TermMaxRouterV2.sol | 22 ++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/contracts/v2/router/ITermMaxRouterV2.sol b/contracts/v2/router/ITermMaxRouterV2.sol index 41d5896..e516761 100644 --- a/contracts/v2/router/ITermMaxRouterV2.sol +++ b/contracts/v2/router/ITermMaxRouterV2.sol @@ -289,6 +289,18 @@ interface ITermMaxRouterV2 { uint256 deadline ) external returns (uint256 returnAmt); + /** + * @notice Repays a GT in a TermMax market + * @param market The TermMax market to repay in + * @param gtId The ID of the GT to repay + * @param maxRepayAmt Maximum amount of tokens to repay + * @param byDebtToken Whether to repay using debt tokens + * @return repayAmt The actual amount repaid + */ + function repayGt(ITermMaxMarket market, uint256 gtId, uint128 maxRepayAmt, bool byDebtToken) + external + returns (uint128 repayAmt); + /** * @notice Redeems FT tokens and swaps for underlying tokens * @dev Executes a swap to redeem FT tokens diff --git a/contracts/v2/router/TermMaxRouterV2.sol b/contracts/v2/router/TermMaxRouterV2.sol index dc7dc38..ff15064 100644 --- a/contracts/v2/router/TermMaxRouterV2.sol +++ b/contracts/v2/router/TermMaxRouterV2.sol @@ -433,6 +433,28 @@ contract TermMaxRouterV2 is emit RepayByTokenThroughFt(market, gtId, msg.sender, recipient, repayAmt, returnAmt); } + /** + * @inheritdoc ITermMaxRouterV2 + */ + function repayGt(ITermMaxMarket market, uint256 gtId, uint128 maxRepayAmt, bool byDebtToken) + external + override + whenNotPaused + returns (uint128 repayAmt) + { + (IERC20 ft,, IGearingToken gt,, IERC20 debtToken) = market.tokens(); + (, uint128 debtAmt,) = gt.loanInfo(gtId); // Ensure gtId is valid + if (maxRepayAmt > debtAmt) { + repayAmt = debtAmt; + } else { + repayAmt = maxRepayAmt; + } + IERC20 repayToken = byDebtToken ? debtToken : ft; + repayToken.safeTransferFrom(msg.sender, address(this), repayAmt); + repayToken.safeIncreaseAllowance(address(gt), repayAmt); + gt.repay(gtId, repayAmt, byDebtToken); + } + /** * @inheritdoc ITermMaxRouterV2 */ From 863c198e108d8659d86e344efa57b1cfc4884df0 Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 26 Jun 2025 16:28:23 +0800 Subject: [PATCH 137/194] Compatible with V1 market --- contracts/v2/router/TermMaxRouterV2.sol | 44 +++++++++++++++---------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/contracts/v2/router/TermMaxRouterV2.sol b/contracts/v2/router/TermMaxRouterV2.sol index ff15064..331c324 100644 --- a/contracts/v2/router/TermMaxRouterV2.sol +++ b/contracts/v2/router/TermMaxRouterV2.sol @@ -191,7 +191,9 @@ contract TermMaxRouterV2 is (uint256 maxBurn, IERC20 toenToSell) = ftInAmt > xtInAmt ? (xtInAmt, ft) : (ftInAmt, xt); ft.transferFrom(msg.sender, address(this), ftInAmt); xt.transferFrom(msg.sender, address(this), xtInAmt); - ITermMaxMarketV2(address(market)).burn(address(this), recipient, maxBurn); + ft.safeIncreaseAllowance(address(market), ftInAmt); + xt.safeIncreaseAllowance(address(market), xtInAmt); + market.burn(recipient, maxBurn); netTokenOut = _swapExactTokenToToken(toenToSell, debtToken, recipient, orders, amtsToSellTokens, 0, deadline); netTokenOut += maxBurn; @@ -214,10 +216,9 @@ contract TermMaxRouterV2 is uint256 totalAmtToBuyXt = sum(amtsToBuyXt); debtToken.safeTransferFrom(msg.sender, address(this), tokenToSwap + totalAmtToBuyXt); netXtOut = _swapExactTokenToToken(debtToken, xt, address(this), orders, amtsToBuyXt, minXtOut, deadline); - + xt.safeIncreaseAllowance(address(market), netXtOut); bytes memory callbackData = abi.encode(address(gt), tokenToSwap, units, FlashLoanType.DEBT); - gtId = - ITermMaxMarketV2(address(market)).leverageByXt(address(this), recipient, netXtOut.toUint128(), callbackData); + gtId = market.leverageByXt(recipient, netXtOut.toUint128(), callbackData); (,, bytes memory collateralData) = gt.loanInfo(gtId); (, uint128 ltv,) = gt.getLiquidationInfo(gtId); if (ltv > maxLtv) { @@ -237,11 +238,13 @@ contract TermMaxRouterV2 is uint128 maxLtv, SwapUnit[] memory units ) external whenNotPaused returns (uint256 gtId) { - (,, IGearingToken gt,, IERC20 debtToken) = market.tokens(); + (, IERC20 xt, IGearingToken gt,, IERC20 debtToken) = market.tokens(); debtToken.safeTransferFrom(msg.sender, address(this), tokenInAmt); + xt.safeTransferFrom(msg.sender, address(this), xtInAmt); + xt.safeIncreaseAllowance(address(market), xtInAmt); bytes memory callbackData = abi.encode(address(gt), tokenInAmt, units, FlashLoanType.DEBT); - gtId = ITermMaxMarketV2(address(market)).leverageByXt(msg.sender, recipient, xtInAmt.toUint128(), callbackData); + gtId = market.leverageByXt(recipient, xtInAmt.toUint128(), callbackData); (,, bytes memory collateralData) = gt.loanInfo(gtId); (, uint128 ltv,) = gt.getLiquidationInfo(gtId); @@ -262,13 +265,17 @@ contract TermMaxRouterV2 is uint128 maxLtv, SwapUnit[] memory units ) external whenNotPaused returns (uint256 gtId) { - (,, IGearingToken gt, address collAddr,) = market.tokens(); + (, IERC20 xt, IGearingToken gt, address collAddr,) = market.tokens(); IERC20 collateral = IERC20(collAddr); collateral.safeTransferFrom(msg.sender, address(this), collateralInAmt); + collateral.safeIncreaseAllowance(address(market), collateralInAmt); + + xt.safeTransferFrom(msg.sender, address(this), xtInAmt); + xt.safeIncreaseAllowance(address(market), xtInAmt); bytes memory callbackData = abi.encode(address(gt), 0, units, FlashLoanType.COLLATERAL); - gtId = ITermMaxMarketV2(address(market)).leverageByXt(msg.sender, recipient, xtInAmt.toUint128(), callbackData); + gtId = market.leverageByXt(recipient, xtInAmt.toUint128(), callbackData); (,, bytes memory collateralData) = gt.loanInfo(gtId); (, uint128 ltv,) = gt.getLiquidationInfo(gtId); @@ -313,7 +320,7 @@ contract TermMaxRouterV2 is whenNotPaused returns (uint256) { - (, IERC20 xt, IGearingToken gt, address collateralAddr,) = market.tokens(); + (IERC20 ft, IERC20 xt, IGearingToken gt, address collateralAddr,) = market.tokens(); IERC20(collateralAddr).safeTransferFrom(msg.sender, address(this), collInAmt); IERC20(collateralAddr).safeIncreaseAllowance(address(gt), collInAmt); @@ -324,8 +331,9 @@ contract TermMaxRouterV2 is (uint256 gtId, uint128 ftOutAmt) = market.issueFt(address(this), debtAmt, _encodeAmount(collInAmt)); borrowAmt = borrowAmt.min(ftOutAmt); xt.safeTransferFrom(msg.sender, address(this), borrowAmt); - - ITermMaxMarketV2(address(market)).burn(address(this), recipient, borrowAmt); + ft.safeIncreaseAllowance(address(market), borrowAmt); + xt.safeIncreaseAllowance(address(market), borrowAmt); + market.burn(recipient, borrowAmt); gt.safeTransferFrom(address(this), recipient, gtId); emit Borrow(market, gtId, msg.sender, recipient, collInAmt, debtAmt, borrowAmt.toUint128()); @@ -336,7 +344,7 @@ contract TermMaxRouterV2 is external whenNotPaused { - (, IERC20 xt, IGearingToken gt,,) = market.tokens(); + (IERC20 ft, IERC20 xt, IGearingToken gt,,) = market.tokens(); if (gt.ownerOf(gtId) != msg.sender) { revert GtNotOwnedBySender(); @@ -348,8 +356,9 @@ contract TermMaxRouterV2 is uint256 ftOutAmt = market.issueFtByExistedGt(address(this), debtAmt, gtId); borrowAmt = borrowAmt.min(ftOutAmt); xt.safeTransferFrom(msg.sender, address(this), borrowAmt); - - ITermMaxMarketV2(address(market)).burn(address(this), recipient, borrowAmt); + ft.safeIncreaseAllowance(address(market), borrowAmt); + xt.safeIncreaseAllowance(address(market), borrowAmt); + market.burn(recipient, borrowAmt); emit Borrow(market, gtId, msg.sender, recipient, 0, debtAmt, borrowAmt.toUint128()); } @@ -465,9 +474,10 @@ contract TermMaxRouterV2 is SwapUnit[] memory units, uint256 minTokenOut ) external whenNotPaused returns (uint256) { - (,,,, IERC20 debtToken) = market.tokens(); - (uint256 redeemedAmt, bytes memory collateralData) = - ITermMaxMarketV2(address(market)).redeem(msg.sender, address(this), ftAmount); + (IERC20 ft,,,, IERC20 debtToken) = market.tokens(); + ft.safeTransferFrom(msg.sender, address(this), ftAmount); + ft.safeIncreaseAllowance(address(market), ftAmount); + (uint256 redeemedAmt, bytes memory collateralData) = market.redeem(ftAmount, address(this)); redeemedAmt += _doSwap(_decodeAmount(collateralData), units); if (redeemedAmt < minTokenOut) { revert InsufficientTokenOut(address(debtToken), redeemedAmt, minTokenOut); From 01db0f8091230ac2c6befb08cc423cd7c3551428 Mon Sep 17 00:00:00 2001 From: "Aaron C.-W. Liang" Date: Fri, 27 Jun 2025 15:50:45 +0800 Subject: [PATCH 138/194] update DeployAdapters and script.sh --- .../11155111/run-1751008985.json | 354 +++++++++++++++++ .../11155111/run-latest.json | 354 +++++++++++++++++ .../421614/run-1751010328.json | 374 ++++++++++++++++++ .../421614/run-latest.json | 374 ++++++++++++++++++ .../97/run-1751010534.json | 350 ++++++++++++++++ .../DeployAdapters.s.sol/97/run-latest.json | 350 ++++++++++++++++ .../arb-sepolia-access-manager.json | 0 .../arb-sepolia-adapters-20250627.json | 18 + .../arb-sepolia-core.json | 0 ...arb-sepolia-market-USDC-ARB@26DEC2025.json | 0 ...rb-sepolia-market-USDC-WBTC@26SEP2025.json | 0 ...rb-sepolia-market-USDC-WETH@26DEC2025.json | 0 ...-sepolia-market-USDC-wstETH@26SEP2025.json | 0 ...ket-WETH-PT-weETH-26JUN2025@26DEC2025.json | 0 ...b-sepolia-market-WETH-weETH@26SEP2025.json | 0 ...-sepolia-market-WETH-wstETH@26SEP2025.json | 0 .../bnb-testnet-adapters-20250627.json | 18 + .../eth-sepolia-access-manager.json | 0 .../eth-sepolia-adapters-20250627.json | 18 + .../eth-sepolia-core.json | 0 ...ket-USDC-PT-sUSDE-31JUL2025@26SEP2025.json | 0 ...th-sepolia-market-USDC-WBTC@26DEC2025.json | 0 ...h-sepolia-market-USDC-eUSDe@26DEC2025.json | 0 ...h-sepolia-market-USDC-sUSDe@26SEP2025.json | 0 ...-sepolia-market-USDC-wstETH@26SEP2025.json | 0 ...-sepolia-market-WETH-pufETH@26DEC2025.json | 0 ...h-sepolia-market-WETH-weETH@26SEP2025.json | 0 ...epolia-vault-TMX-USDC-Vault-07JUN2025.json | 0 script/deploy/DeployAdapters.s.sol | 65 ++- script/deploy/DeployBase.s.sol | 4 +- script/utils/StringHelper.sol | 43 +- 31 files changed, 2277 insertions(+), 45 deletions(-) create mode 100644 broadcast/DeployAdapters.s.sol/11155111/run-1751008985.json create mode 100644 broadcast/DeployAdapters.s.sol/11155111/run-latest.json create mode 100644 broadcast/DeployAdapters.s.sol/421614/run-1751010328.json create mode 100644 broadcast/DeployAdapters.s.sol/421614/run-latest.json create mode 100644 broadcast/DeployAdapters.s.sol/97/run-1751010534.json create mode 100644 broadcast/DeployAdapters.s.sol/97/run-latest.json rename deployments/{arb-sepolia-v1.0.9-testnet-20250603 => arb-sepolia}/arb-sepolia-access-manager.json (100%) create mode 100644 deployments/arb-sepolia/arb-sepolia-adapters-20250627.json rename deployments/{arb-sepolia-v1.0.9-testnet-20250603 => arb-sepolia}/arb-sepolia-core.json (100%) rename deployments/{arb-sepolia-v1.0.9-testnet-20250603 => arb-sepolia}/arb-sepolia-market-USDC-ARB@26DEC2025.json (100%) rename deployments/{arb-sepolia-v1.0.9-testnet-20250603 => arb-sepolia}/arb-sepolia-market-USDC-WBTC@26SEP2025.json (100%) rename deployments/{arb-sepolia-v1.0.9-testnet-20250603 => arb-sepolia}/arb-sepolia-market-USDC-WETH@26DEC2025.json (100%) rename deployments/{arb-sepolia-v1.0.9-testnet-20250603 => arb-sepolia}/arb-sepolia-market-USDC-wstETH@26SEP2025.json (100%) rename deployments/{arb-sepolia-v1.0.9-testnet-20250603 => arb-sepolia}/arb-sepolia-market-WETH-PT-weETH-26JUN2025@26DEC2025.json (100%) rename deployments/{arb-sepolia-v1.0.9-testnet-20250603 => arb-sepolia}/arb-sepolia-market-WETH-weETH@26SEP2025.json (100%) rename deployments/{arb-sepolia-v1.0.9-testnet-20250603 => arb-sepolia}/arb-sepolia-market-WETH-wstETH@26SEP2025.json (100%) create mode 100644 deployments/bnb-testnet/bnb-testnet-adapters-20250627.json rename deployments/{eth-sepolia-v1.0.9-testnet-20250609 => eth-sepolia}/eth-sepolia-access-manager.json (100%) create mode 100644 deployments/eth-sepolia/eth-sepolia-adapters-20250627.json rename deployments/{eth-sepolia-v1.0.9-testnet-20250609 => eth-sepolia}/eth-sepolia-core.json (100%) rename deployments/{eth-sepolia-v1.0.9-testnet-20250609 => eth-sepolia}/eth-sepolia-market-USDC-PT-sUSDE-31JUL2025@26SEP2025.json (100%) rename deployments/{eth-sepolia-v1.0.9-testnet-20250609 => eth-sepolia}/eth-sepolia-market-USDC-WBTC@26DEC2025.json (100%) rename deployments/{eth-sepolia-v1.0.9-testnet-20250609 => eth-sepolia}/eth-sepolia-market-USDC-eUSDe@26DEC2025.json (100%) rename deployments/{eth-sepolia-v1.0.9-testnet-20250609 => eth-sepolia}/eth-sepolia-market-USDC-sUSDe@26SEP2025.json (100%) rename deployments/{eth-sepolia-v1.0.9-testnet-20250609 => eth-sepolia}/eth-sepolia-market-USDC-wstETH@26SEP2025.json (100%) rename deployments/{eth-sepolia-v1.0.9-testnet-20250609 => eth-sepolia}/eth-sepolia-market-WETH-pufETH@26DEC2025.json (100%) rename deployments/{eth-sepolia-v1.0.9-testnet-20250609 => eth-sepolia}/eth-sepolia-market-WETH-weETH@26SEP2025.json (100%) rename deployments/{eth-sepolia-v1.0.9-testnet-20250609 => eth-sepolia}/eth-sepolia-vault-TMX-USDC-Vault-07JUN2025.json (100%) diff --git a/broadcast/DeployAdapters.s.sol/11155111/run-1751008985.json b/broadcast/DeployAdapters.s.sol/11155111/run-1751008985.json new file mode 100644 index 0000000..bf2d17c --- /dev/null +++ b/broadcast/DeployAdapters.s.sol/11155111/run-1751008985.json @@ -0,0 +1,354 @@ +{ + "transactions": [ + { + "hash": "0xe599fd5a860139b87e95bf0c34c844bd0d77a73e94eb6e84354329c645913c16", + "transactionType": "CREATE", + "contractName": "UniswapV3AdapterV2", + "contractAddress": "0x92659d8b9354576d5ba0556158da0244aca4032e", + "function": null, + "arguments": [ + "0x0000000000000000000000000000000000000000" + ], + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "gas": "0xba937", + "value": "0x0", + "input": "0x60c034607a57601f610a3738819003918201601f19168301916001600160401b03831184841017607e57808492602094604052833981010312607a57516001600160a01b03811690819003607a573060805260a0526040516109a4908161009382396080518160fd015260a051818181606501526101610152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146106c15780636563c0e9146105f55780639df3032514610495578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b161072d565b6100b9610743565b5060443567ffffffffffffffff8111610094576100da903690600401610797565b60643567ffffffffffffffff8111610094576100fa903690600401610797565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630146104865781516001600160a01b039190911691602080820192820191909103126100945751604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316602482018190529193919290602081604481855afa80156103bd5785905f90610450575b6101b79250610857565b60405163095ea7b360e01b60208083019182526001600160a01b03871660248401526044808401949094529282529091905f906101f5606485610759565b83519082865af15f513d82610434575b5050156103f0575b505080518101916080826020850194031261009457602082015167ffffffffffffffff811161009457820183603f82011215610094576020810151906102528261077b565b946102606040519687610759565b8286526040828401011161009457815f926040602093018388015e85010152604082015191608060608201519101519061029b8187846108d0565b9080156103dc57866102b09309151590610857565b9260405160a081019080821067ffffffffffffffff8311176103c857602095610322935f936040528252868201903082526040830196875260608301988952608083019081526040519889978896879563c04b8d5960e01b87528b60048801525160a0602488015260c4870190610833565b93516001600160a01b031660448601525160648501525160848401525160a483015203925af180156103bd575f90610389575b6103859060405190602082015260208152610371604082610759565b604051918291602083526020830190610833565b0390f35b506020813d6020116103b5575b816103a360209383610759565b81010312610094576103859051610355565b3d9150610396565b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b61042d9161042860405163095ea7b360e01b60208201528660248201525f604482015260448152610422606482610759565b82610878565b610878565b838061020d565b9091506104485750813b15155b8680610205565b600114610441565b50506020813d60201161047e575b8161046b60209383610759565b8101031261009457846101b791516101ad565b3d915061045e565b6302f3451d60e21b5f5260045ffd5b34610094576104a3366107dd565b80516001600160a01b039093169260208083019291820191909103126100945751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa9081156103bd575f916105c1575b5061054a936105586105176020945f94610857565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f198101875286610759565b84519082855af15f513d826105a5575b50501561057157005b6104286105a3936040519063095ea7b360e01b602083015260248201525f604482015260448152610422606482610759565b005b9091506105b95750803b15155b8480610568565b6001146105b2565b90506020813d6020116105ed575b816105dc60209383610759565b81010312610094575161054a610502565b3d91506105cf565b346100945760803660031901126100945761060e61072d565b610616610743565b6044356001600160a01b03811692908390036100945760643567ffffffffffffffff81116100945761064c903690600401610797565b6020815191818082019384920101031261009457515f1981146106b2576105a393604051936323b872dd60e01b602086015260018060a01b0316602485015260448401526064830152606482526106a4608483610759565b6001600160a01b0316610878565b630d550c3b60e11b5f5260045ffd5b34610094576106cf366107dd565b602081939293519181808201938492010103126100945751905f1982146106b25760405163a9059cbb60e01b60208201526001600160a01b039390931660248401526044808401929092529082526105a391906106a4606483610759565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff8211176103c857604052565b67ffffffffffffffff81116103c857601f01601f191660200190565b81601f82011215610094578035906107ae8261077b565b926107bc6040519485610759565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff82116100945761083091600401610797565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9190820180921161086457565b634e487b7160e01b5f52601160045260245ffd5b905f602091828151910182855af1156103bd575f513d6108c757506001600160a01b0381163b155b6108a75750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156108a0565b91818302915f198185099383808610950394808603951461096057848311156109485790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b5050809250156103dc57049056fea2646970667358221220f6000c9f1bdef97179fd0d632833ccb7f8eb8b0c4e5d5beef7139a47675404a964736f6c634300081b00330000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0xd8c", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x2756addf24b3676ccedb8c3c545053195a5076a21b75f6c94e6c3185c41eeed1", + "transactionType": "CREATE", + "contractName": "OdosV2AdapterV2", + "contractAddress": "0x5902a019c5534f11eaf1676f708ae2be0b1371ef", + "function": null, + "arguments": [ + "0x0000000000000000000000000000000000000000" + ], + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "gas": "0xc9b6e", + "value": "0x0", + "input": "0x60c034607a57601f610b1438819003918201601f19168301916001600160401b03831184841017607e57808492602094604052833981010312607a57516001600160a01b03811690819003607a573060805260a052604051610a81908161009382396080518160fd015260a051818181606501526101610152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146107565780636563c0e91461068a5780639df303251461052a578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b16107c2565b6100b96107d8565b5060443567ffffffffffffffff8111610094576100da90369060040161082c565b60643567ffffffffffffffff8111610094576100fa90369060040161082c565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316301461051b5781516001600160a01b039190911691602080820192820191909103126100945751604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031660248201819052919290602081604481855afa80156104665784905f906104e5575b6101b59250610900565b60405163095ea7b360e01b60208083019182526001600160a01b03861660248401526044808401949094529282529091905f906101f36064856107ee565b83519082865af15f513d826104c9575b505015610485575b505082518301908360208301920361014081126100945760e013610094576040519160e0830183811067ffffffffffffffff82111761047157604052610253602086016108ec565b83526040850151906020840191825261026e606087016108ec565b9360408101948552610282608088016108ec565b966060820197885260a0810151926080830193845260c08201519760a084019889526102b060e084016108ec565b9160c0850192835261010084015167ffffffffffffffff811161009457840181603f82011215610094576020810151906102e982610810565b926102f760405194856107ee565b8284526040828401011161009457815f926040602093018386015e830101526101208401516001600160a01b03811694908590036100945761014001519263ffffffff84168094036100945760209a876103e09461035a5f9a51828d5191610921565b825261036a8351828d5191610921565b83528a52308352604051630ed8d73960e21b815297516001600160a01b0390811660048a0152995160248901529a51891660448801529b518816606487015298516084860152995160a4850152965190941660c483015261014060e48301529096879586948593929091906101448501906108c8565b9161010484015261012483015203925af18015610466575f90610432575b61042e906040519060208201526020815261041a6040826107ee565b6040519182916020835260208301906108c8565b0390f35b506020813d60201161045e575b8161044c602093836107ee565b810103126100945761042e90516103fe565b3d915061043f565b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b6104c2916104bd60405163095ea7b360e01b60208201528560248201525f6044820152604481526104b76064826107ee565b82610955565b610955565b838061020b565b9091506104dd5750813b15155b8680610203565b6001146104d6565b50506020813d602011610513575b81610500602093836107ee565b8101031261009457836101b591516101ab565b3d91506104f3565b6302f3451d60e21b5f5260045ffd5b346100945761053836610872565b80516001600160a01b039093169260208083019291820191909103126100945751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa908115610466575f91610656575b506105df936105ed6105ac6020945f94610900565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f1981018752866107ee565b84519082855af15f513d8261063a575b50501561060657005b6104bd610638936040519063095ea7b360e01b602083015260248201525f6044820152604481526104b76064826107ee565b005b90915061064e5750803b15155b84806105fd565b600114610647565b90506020813d602011610682575b81610671602093836107ee565b8101031261009457516105df610597565b3d9150610664565b34610094576080366003190112610094576106a36107c2565b6106ab6107d8565b6044356001600160a01b03811692908390036100945760643567ffffffffffffffff8111610094576106e190369060040161082c565b6020815191818082019384920101031261009457515f1981146107475761063893604051936323b872dd60e01b602086015260018060a01b0316602485015260448401526064830152606482526107396084836107ee565b6001600160a01b0316610955565b630d550c3b60e11b5f5260045ffd5b346100945761076436610872565b602081939293519181808201938492010103126100945751905f1982146107475760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261063891906107396064836107ee565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff82111761047157604052565b67ffffffffffffffff811161047157601f01601f191660200190565b81601f820112156100945780359061084382610810565b9261085160405194856107ee565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff8211610094576108c59160040161082c565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b51906001600160a01b038216820361009457565b9190820180921161090d57565b634e487b7160e01b5f52601160045260245ffd5b9161092d8183856109ad565b918115610941576108c59309151590610900565b634e487b7160e01b5f52601260045260245ffd5b905f602091828151910182855af115610466575f513d6109a457506001600160a01b0381163b155b6109845750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b6001141561097d565b91818302915f1981850993838086109503948086039514610a3d5784831115610a255790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b50508092501561094157049056fea26469706673582212201a43e03d554ef4508b4ce4929a5e2c8c851ee4de243e12f6b2b1267ec83a42f164736f6c634300081b00330000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0xd8d", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x7b9c09a57a991d0f8750539c12402f5b0cb613f7e4be3b248b1c1f3792e78a1f", + "transactionType": "CREATE", + "contractName": "PendleSwapV3AdapterV2", + "contractAddress": "0xb51c2bf67ff00172450d7f3d4cbaacc8821779dd", + "function": null, + "arguments": [ + "0x0000000000000000000000000000000000000000" + ], + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "gas": "0x166f6b", + "value": "0x0", + "input": "0x60c0604052346100f757604051601f61132138819003918201601f19168301916001600160401b038311848410176100e3578084926020946040528339810103126100f757516001600160a01b038116908190036100f7573060805260405160a081016001600160401b038111828210176100e357655af3107a4000916080916040525f81525f1960208201525f6040820152610100606082015201525f6008555f196009555f600a55610100600b55655af3107a4000600c5560a05260405161122590816100fc82396080518161025d015260a0518181816089015261031d0152f35b634e487b7160e01b5f52604160045260245ffd5b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816309316dd314610b30575080633268263b14610ac45780634ebfc81414610a855780636563c0e9146109b95780639df303251461084e578063e0a80413146101f8578063f66a7749146100bc5763f887ea4014610074575f80fd5b346100b8575f3660031901126100b8576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b346100b8575f3660031901126100b8575f54604051905f6001548060011c91600182169182156101ee575b6020841083146101da5783865285929081156101bb575060011461015c575b61011292500383610cd2565b60ff60025416610150604051938361012e8660ff819716610e04565b60081c6001600160a01b03166020850152608060408501819052840190610d08565b90151560608301520390f35b5060015f90815290917fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b81831061019f57505090602061011292820101610106565b6020919350806001915483858901015201910190918492610187565b6020925061011294915060ff191682840152151560051b820101610106565b634e487b7160e01b5f52602260045260245ffd5b92607f16926100e7565b346100b85760803660031901126100b857610211610d2c565b610219610d42565b60443567ffffffffffffffff81116100b857610239903690600401610d58565b9160643567ffffffffffffffff81116100b85761025a903690600401610d58565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316301461083f5783516001600160a01b0393841694919093169260208083019291820191909103126100b85751916060828051810103126100b85760208201516001600160a01b03811691908290036100b857606060408401519301519460405195630b2339af60e21b8752606087600481875afa968715610508575f976107d2575b50604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316602482018190529590602081604481885afa80156105085788905f9061079c575b6103709250611041565b60405163095ea7b360e01b60208083019182526001600160a01b038a1660248401526044808401949094529282529091905f906103ae606485610cd2565b83519082895af15f513d82610780575b50501561073c575b506103d2818884611151565b90801561072857876103e79309151590611041565b956001600160a01b0316818103610513575050935f606094939261047e9661040d611062565b95818752602087015260408601526104906040519788968795869463640fc23d60e11b86523060048701526024860152604485015260085460648501526009546084850152600a5460a4850152600b5460c4850152600c5460e4850152610140610104850152610144840190610e40565b82810360031901610124840152610ff1565b03925af18015610508576104d3915f916104d7575b505b604051906020820152602081526104bf604082610cd2565b604051918291602083526020830190610d08565b0390f35b6104f9915060603d606011610501575b6104f18183610cd2565b810190610e25565b5050826104a5565b503d6104e7565b6040513d5f823e3d90fd5b9150949391604051630bc4ed8360e21b8152602081600481865afa908115610508575f916106ed575b50156106535750936020600494956040519586809263781c18db60e01b82525afa938415610508575f9461060b575b50905f61057f6105bc9660409695946110d2565b938551968795869485936323f8ef1160e11b855230600486015260018060a01b031660248501526044840152608060648401526084830190610e40565b03925af18015610508575f906105d7575b6104d391506104a7565b506040813d604011610603575b816105f160409383610cd2565b810103126100b8576104d390516105cd565b3d91506105e4565b90929193506020813d60201161064b575b8161062960209383610cd2565b810103126100b85751926001600160a01b03841684036100b85790915f61056b565b3d915061061c565b929190505f6106676060956106a0976110d2565b936106b160405197889687958694631652a23360e21b86523060048701526024860152604485015260a0606485015260a4840190610e40565b828103600319016084840152610ff1565b03925af18015610508576104d3915f916106cc575b506104a7565b6106e5915060603d606011610501576104f18183610cd2565b5050826106c6565b90506020813d602011610720575b8161070860209383610cd2565b810103126100b8575180151581036100b8578761053c565b3d91506106fb565b634e487b7160e01b5f52601260045260245ffd5b61077a9061077460405163095ea7b360e01b60208201528960248201525f60448201526044815261076e606482610cd2565b876110f9565b856110f9565b886103c6565b9091506107945750843b15155b8a806103be565b60011461078d565b50506020813d6020116107ca575b816107b760209383610cd2565b810103126100b857876103709151610366565b3d91506107aa565b9096506060813d606011610837575b816107ee60609383610cd2565b810103126100b85780516001600160a01b038116036100b8576020810151906001600160a01b03821682036100b857604001516001600160a01b038116036100b8579587610307565b3d91506107e1565b6302f3451d60e21b5f5260045ffd5b346100b85761085c36610dae565b80516001600160a01b039093169260208083019291820191909103126100b85751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa908115610508575f91610985575b50610903936109116108d06020945f94611041565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f198101875286610cd2565b84519082855af15f513d82610969575b50501561092a57005b610962610967936040519063095ea7b360e01b602083015260248201525f60448201526044815261095c606482610cd2565b826110f9565b6110f9565b005b90915061097d5750803b15155b8480610921565b600114610976565b90506020813d6020116109b1575b816109a060209383610cd2565b810103126100b857516109036108bb565b3d9150610993565b346100b85760803660031901126100b8576109d2610d2c565b6109da610d42565b6044356001600160a01b03811692908390036100b85760643567ffffffffffffffff81116100b857610a10903690600401610d58565b602081519181808201938492010103126100b857515f198114610a765761096793604051936323b872dd60e01b602086015260018060a01b031660248501526044840152606483015260648252610a68608483610cd2565b6001600160a01b03166110f9565b630d550c3b60e11b5f5260045ffd5b346100b8575f3660031901126100b85760a0600854600954600a54600b5490600c54926040519485526020850152604084015260608301526080820152f35b346100b857610ad236610dae565b602081939293519181808201938492010103126100b85751905f198214610a765760405163a9059cbb60e01b60208201526001600160a01b039390931660248401526044808401929092529082526109679190610a68606483610cd2565b346100b8575f3660031901126100b85760018060a01b0360035416600454915f6007548060011c90600181168015610c31575b6020831081146101da57828552908115610c0d5750600114610baf575b5090610b91816104d3930382610cd2565b60405193849384526020840152606060408401526060830190610d08565b60075f9081527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688939250905b808210610bf357509091508101602001610b91610b80565b919260018160209254838588010152019101909291610bdb565b60ff191660208086019190915291151560051b84019091019150610b919050610b80565b91607f1691610b63565b5f92918154918260011c92600181168015610cc8575b6020851081146101da57848452908115610cab5750600114610c7257505050565b5f9081526020812093945091925b838310610c91575060209250010190565b600181602092949394548385870101520191019190610c80565b915050602093945060ff929192191683830152151560051b010190565b93607f1693610c51565b90601f8019910116810190811067ffffffffffffffff821117610cf457604052565b634e487b7160e01b5f52604160045260245ffd5b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036100b857565b602435906001600160a01b03821682036100b857565b81601f820112156100b85780359067ffffffffffffffff8211610cf45760405192610d8d601f8401601f191660200185610cd2565b828452602083830101116100b857815f926020809301838601378301015290565b60606003198201126100b8576004356001600160a01b03811681036100b857916024356001600160a01b03811681036100b857916044359067ffffffffffffffff82116100b857610e0191600401610d58565b90565b90600b821015610e115752565b634e487b7160e01b5f52602160045260245ffd5b908160609103126100b8578051916040602083015192015190565b60809060018060a01b0381511683526020810151602084015260018060a01b03604082015116604084015260018060a01b03606082015116606084015201519060a06080820152610e9560a082018351610e04565b60208201516001600160a01b031660c08201526040820151608060e083015261010090606090610eca90610120850190610d08565b930151151591015290565b908060208354918281520160208260051b840101935f5260205f20925f905b838210610f0357505050505090565b9091929394601f19828203018452606081528554606082015260018601546080820152600286015460a0820152600386015460ff81166004811015610e115760c08301526001600160a01b03600891821c811660e0840152600488015481166101008401526005880154811661012084015260068801541661014083015260078701546101608301528601546101808083019190915260098701546101a08301526101c0820152600190602090600d90610fd7610fc76101e08301600a8c01610c3b565b82810385840152600b8b01610c3b565b906040600c8b015491015297019401920190939293610ef4565b610e019060018060a01b03600354168152600454602082015260a0604082015261103161102260a083016005610ed5565b82810360608401526006610ed5565b9060808183039101526007610c3b565b9190820180921161104e57565b634e487b7160e01b5f52601160045260245ffd5b6040519060a0820182811067ffffffffffffffff821117610cf457604052815f81525f60208201525f60408201525f606082015260405190608082019082821067ffffffffffffffff831117610cf4576080916040525f83525f6020840152606060408401525f60608401520152565b91906110dc611062565b6001600160a01b0390931680845260208401919091526040830152565b905f602091828151910182855af115610508575f513d61114857506001600160a01b0381163b155b6111285750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b60011415611121565b91818302915f19818509938380861095039480860395146111e157848311156111c95790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b50508092501561072857049056fea2646970667358221220d7c8c2f17efce607284d62466051aec3e13f6f1e6deb7e056420af021f77a8ae64736f6c634300081b00330000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0xd8e", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x4544ff953f9ef69a92479d1a787d359e1d1ab514582bbb91aaedf134f57f1602", + "transactionType": "CREATE", + "contractName": "ERC4626VaultAdapterV2", + "contractAddress": "0xbff9f6c01c056127957fb9f0436bb07368ddbe2e", + "function": null, + "arguments": null, + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "gas": "0xaf02f", + "value": "0x0", + "input": "0x60a0806040523460215730608052610900908161002682396080518160aa0152f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146106395780636563c0e91461056d5780639df303251461040d5763e0a8041314610045575f80fd5b346102a35760803660031901126102a35761005e6106a5565b6100666106bb565b9060443567ffffffffffffffff81116102a357610087903690600401610707565b60643567ffffffffffffffff81116102a3576100a7903690600401610707565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630146103fe5781516001600160a01b039182169490911691602080820192820191909103126102a35751926060838051810103126102a35760208301519260028410156102a357606060408201519101519061012f81878461082c565b9080156103ea578661014493091515906107b3565b92806103525750604051636eb1769f60e11b815230600482015260248101839052602081604481855afa9081156102af575f9161031a575b50846020939261018f5f976044946107b3565b60405163095ea7b360e01b8782019081526001600160a01b038716602483015260448083019390935291815290869089906101cb6064856106d1565b83519082865af188513d826102fb575b5050156102ba575b50506040519586938492636e553f6560e01b845260048401523060248401525af19182156102af575f92610277575b50818181106102625750505b60408051602081019283526020815261023782826106d1565b8151928391602083525180918160208501528484015e5f828201840152601f01601f19168101030190f35b63eb7f211d60e01b5f5260045260245260445ffd5b9091506020813d6020116102a7575b81610293602093836106d1565b810103126102a35751905f610212565b5f80fd5b3d9150610286565b6040513d5f823e3d90fd5b6102f4916102ef60405163095ea7b360e01b898201528760248201528a878201528681526102e96064826106d1565b826107d4565b6107d4565b5f806101e3565b9091501589146103125750813b15155b5f806101db565b60011461030b565b90506020929192813d60201161034a575b81610338602093836106d1565b810103126102a357519091908461017c565b3d915061032b565b909391506001036103db575f9260646020926040519586938492635d043b2960e11b845260048401523060248401523060448401525af19182156102af575f926103a7575b508181811061026257505061021e565b9091506020813d6020116103d3575b816103c3602093836106d1565b810103126102a35751905f610397565b3d91506103b6565b634a7f394f60e01b5f5260045ffd5b634e487b7160e01b5f52601260045260245ffd5b6302f3451d60e21b5f5260045ffd5b346102a35761041b3661075d565b80516001600160a01b039093169260208083019291820191909103126102a35751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa9081156102af575f91610539575b506104c2936104d061048f6020945f946107b3565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f1981018752866106d1565b84519082855af15f513d8261051d575b5050156104e957005b6102ef61051b936040519063095ea7b360e01b602083015260248201525f6044820152604481526102e96064826106d1565b005b9091506105315750803b15155b84806104e0565b60011461052a565b90506020813d602011610565575b81610554602093836106d1565b810103126102a357516104c261047a565b3d9150610547565b346102a35760803660031901126102a3576105866106a5565b61058e6106bb565b6044356001600160a01b03811692908390036102a35760643567ffffffffffffffff81116102a3576105c4903690600401610707565b602081519181808201938492010103126102a357515f19811461062a5761051b93604051936323b872dd60e01b602086015260018060a01b03166024850152604484015260648301526064825261061c6084836106d1565b6001600160a01b03166107d4565b630d550c3b60e11b5f5260045ffd5b346102a3576106473661075d565b602081939293519181808201938492010103126102a35751905f19821461062a5760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261051b919061061c6064836106d1565b600435906001600160a01b03821682036102a357565b602435906001600160a01b03821682036102a357565b90601f8019910116810190811067ffffffffffffffff8211176106f357604052565b634e487b7160e01b5f52604160045260245ffd5b81601f820112156102a35780359067ffffffffffffffff82116106f3576040519261073c601f8401601f1916602001856106d1565b828452602083830101116102a357815f926020809301838601378301015290565b60606003198201126102a3576004356001600160a01b03811681036102a357916024356001600160a01b03811681036102a357916044359067ffffffffffffffff82116102a3576107b091600401610707565b90565b919082018092116107c057565b634e487b7160e01b5f52601160045260245ffd5b905f602091828151910182855af1156102af575f513d61082357506001600160a01b0381163b155b6108035750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156107fc565b91818302915f19818509938380861095039480860395146108bc57848311156108a45790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b5050809250156103ea57049056fea2646970667358221220b9f441923fe75e1f6e0f37bda35dde1cbac73c1e69240288bd35172a90f8e35164736f6c634300081b0033", + "nonce": "0xd8f", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x8091c719b06ddef01b439d4668e660d3679da2e9a1b2fbc9db1d5360e823bdeb", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0x7662fcf152a9e18280a77f4a8108229e86d398ab", + "function": null, + "arguments": null, + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0x7662fcf152a9e18280a77f4a8108229e86d398ab", + "gas": "0x16bfc", + "value": "0x0", + "input": "0xb6b07b8e0000000000000000000000002f68071bac2be3332c8107dd15a76f7230f3401300000000000000000000000092659d8b9354576d5ba0556158da0244aca4032e0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xd90", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x71f6467e8eaccdaf0915b7f24f40bbea1eab211d28fda9b72d0a74db363776cb", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0x7662fcf152a9e18280a77f4a8108229e86d398ab", + "function": null, + "arguments": null, + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0x7662fcf152a9e18280a77f4a8108229e86d398ab", + "gas": "0x16bfc", + "value": "0x0", + "input": "0xb6b07b8e0000000000000000000000002f68071bac2be3332c8107dd15a76f7230f340130000000000000000000000005902a019c5534f11eaf1676f708ae2be0b1371ef0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xd91", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x3cd2b233f06e3aca670e844336c0d2878cebbcdc750c7383dacc7092b6e24010", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0x7662fcf152a9e18280a77f4a8108229e86d398ab", + "function": null, + "arguments": null, + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0x7662fcf152a9e18280a77f4a8108229e86d398ab", + "gas": "0x16bfc", + "value": "0x0", + "input": "0xb6b07b8e0000000000000000000000002f68071bac2be3332c8107dd15a76f7230f34013000000000000000000000000b51c2bf67ff00172450d7f3d4cbaacc8821779dd0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xd92", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x71321c8b1f41954a04c7dabee3e6009b15384e9871e6d0d53eb1b5b68cc57b71", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0x7662fcf152a9e18280a77f4a8108229e86d398ab", + "function": null, + "arguments": null, + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0x7662fcf152a9e18280a77f4a8108229e86d398ab", + "gas": "0x16bfc", + "value": "0x0", + "input": "0xb6b07b8e0000000000000000000000002f68071bac2be3332c8107dd15a76f7230f34013000000000000000000000000bff9f6c01c056127957fb9f0436bb07368ddbe2e0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xd93", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x209770b", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xe599fd5a860139b87e95bf0c34c844bd0d77a73e94eb6e84354329c645913c16", + "transactionIndex": "0xf8", + "blockHash": "0x05d1bed121125a1f987ac1c6fda0f55c6cf2a1b9c203e21f9c76496092ddf45d", + "blockNumber": "0x83d0c0", + "gasUsed": "0x8f852", + "effectiveGasPrice": "0x267f8c", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": null, + "contractAddress": "0x92659d8b9354576d5ba0556158da0244aca4032e" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1d87d02", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x2756addf24b3676ccedb8c3c545053195a5076a21b75f6c94e6c3185c41eeed1", + "transactionIndex": "0xff", + "blockHash": "0x253256c8f92b514339b97052b50cdc1c1178452623ff07bd7f7f76b39589f9ca", + "blockNumber": "0x83d0c1", + "gasUsed": "0x9b2a4", + "effectiveGasPrice": "0x2728ab", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": null, + "contractAddress": "0x5902a019c5534f11eaf1676f708ae2be0b1371ef" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x168eee9", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x7b9c09a57a991d0f8750539c12402f5b0cb613f7e4be3b248b1c1f3792e78a1f", + "transactionIndex": "0xb7", + "blockHash": "0x6f18993c672fa75101ab6f00a23e2fc5eb1481923927766d8f7d44e7a804c1d8", + "blockNumber": "0x83d0c2", + "gasUsed": "0x114204", + "effectiveGasPrice": "0x2796bd", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": null, + "contractAddress": "0xb51c2bf67ff00172450d7f3d4cbaacc8821779dd" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x2877fd3", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x4544ff953f9ef69a92479d1a787d359e1d1ab514582bbb91aaedf134f57f1602", + "transactionIndex": "0x182", + "blockHash": "0x017bad3db34c019d052002daf41fec98ac552a9d8561b3c185e053fb17afd028", + "blockNumber": "0x83d0c4", + "gasUsed": "0x869fd", + "effectiveGasPrice": "0x25dfac", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": null, + "contractAddress": "0xbff9f6c01c056127957fb9f0436bb07368ddbe2e" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x12d00a8", + "logs": [ + { + "address": "0x2f68071bac2be3332c8107dd15a76f7230f34013", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x00000000000000000000000092659d8b9354576d5ba0556158da0244aca4032e0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x19427d6c36acc95d934c94483cad09dc6c91a74300fb16b04d6bfb9535e803ad", + "blockNumber": "0x83d0c5", + "blockTimestamp": "0x685e4668", + "transactionHash": "0x8091c719b06ddef01b439d4668e660d3679da2e9a1b2fbc9db1d5360e823bdeb", + "transactionIndex": "0xa3", + "logIndex": "0x100", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000", + "type": "0x2", + "transactionHash": "0x8091c719b06ddef01b439d4668e660d3679da2e9a1b2fbc9db1d5360e823bdeb", + "transactionIndex": "0xa3", + "blockHash": "0x19427d6c36acc95d934c94483cad09dc6c91a74300fb16b04d6bfb9535e803ad", + "blockNumber": "0x83d0c5", + "gasUsed": "0xf8e1", + "effectiveGasPrice": "0x27668c", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0x7662fcf152a9e18280a77f4a8108229e86d398ab", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x176f425", + "logs": [ + { + "address": "0x2f68071bac2be3332c8107dd15a76f7230f34013", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x0000000000000000000000005902a019c5534f11eaf1676f708ae2be0b1371ef0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x97f4cf0d2769369e2b6c57da0efd414b62bac7aaecfed93a99a92ba4bcda2018", + "blockNumber": "0x83d0c6", + "blockTimestamp": "0x685e4674", + "transactionHash": "0x71f6467e8eaccdaf0915b7f24f40bbea1eab211d28fda9b72d0a74db363776cb", + "transactionIndex": "0xd0", + "logIndex": "0x135", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000", + "type": "0x2", + "transactionHash": "0x71f6467e8eaccdaf0915b7f24f40bbea1eab211d28fda9b72d0a74db363776cb", + "transactionIndex": "0xd0", + "blockHash": "0x97f4cf0d2769369e2b6c57da0efd414b62bac7aaecfed93a99a92ba4bcda2018", + "blockNumber": "0x83d0c6", + "gasUsed": "0xf8e1", + "effectiveGasPrice": "0x26d7ee", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0x7662fcf152a9e18280a77f4a8108229e86d398ab", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x14c94cf", + "logs": [ + { + "address": "0x2f68071bac2be3332c8107dd15a76f7230f34013", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x000000000000000000000000b51c2bf67ff00172450d7f3d4cbaacc8821779dd0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x54db9516055c0c69e5c9137c952b9f4e8edcc14dba028049117e2f4172d0438e", + "blockNumber": "0x83d0c7", + "blockTimestamp": "0x685e4680", + "transactionHash": "0x3cd2b233f06e3aca670e844336c0d2878cebbcdc750c7383dacc7092b6e24010", + "transactionIndex": "0xda", + "logIndex": "0x16a", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000", + "type": "0x2", + "transactionHash": "0x3cd2b233f06e3aca670e844336c0d2878cebbcdc750c7383dacc7092b6e24010", + "transactionIndex": "0xda", + "blockHash": "0x54db9516055c0c69e5c9137c952b9f4e8edcc14dba028049117e2f4172d0438e", + "blockNumber": "0x83d0c7", + "gasUsed": "0xf8e1", + "effectiveGasPrice": "0x26a16d", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0x7662fcf152a9e18280a77f4a8108229e86d398ab", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x148fbf8", + "logs": [ + { + "address": "0x2f68071bac2be3332c8107dd15a76f7230f34013", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x000000000000000000000000bff9f6c01c056127957fb9f0436bb07368ddbe2e0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x841da9e799a7ddb8f29b967b6edda3244ad2272a296e86fb4108a711d7de7b96", + "blockNumber": "0x83d0c8", + "blockTimestamp": "0x685e468c", + "transactionHash": "0x71321c8b1f41954a04c7dabee3e6009b15384e9871e6d0d53eb1b5b68cc57b71", + "transactionIndex": "0xd7", + "logIndex": "0x133", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000", + "type": "0x2", + "transactionHash": "0x71321c8b1f41954a04c7dabee3e6009b15384e9871e6d0d53eb1b5b68cc57b71", + "transactionIndex": "0xd7", + "blockHash": "0x841da9e799a7ddb8f29b967b6edda3244ad2272a296e86fb4108a711d7de7b96", + "blockNumber": "0x83d0c8", + "gasUsed": "0xf8e1", + "effectiveGasPrice": "0x263d36", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0x7662fcf152a9e18280a77f4a8108229e86d398ab", + "contractAddress": null + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1751008985, + "chain": 11155111, + "commit": "23b76ca" +} \ No newline at end of file diff --git a/broadcast/DeployAdapters.s.sol/11155111/run-latest.json b/broadcast/DeployAdapters.s.sol/11155111/run-latest.json new file mode 100644 index 0000000..bf2d17c --- /dev/null +++ b/broadcast/DeployAdapters.s.sol/11155111/run-latest.json @@ -0,0 +1,354 @@ +{ + "transactions": [ + { + "hash": "0xe599fd5a860139b87e95bf0c34c844bd0d77a73e94eb6e84354329c645913c16", + "transactionType": "CREATE", + "contractName": "UniswapV3AdapterV2", + "contractAddress": "0x92659d8b9354576d5ba0556158da0244aca4032e", + "function": null, + "arguments": [ + "0x0000000000000000000000000000000000000000" + ], + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "gas": "0xba937", + "value": "0x0", + "input": "0x60c034607a57601f610a3738819003918201601f19168301916001600160401b03831184841017607e57808492602094604052833981010312607a57516001600160a01b03811690819003607a573060805260a0526040516109a4908161009382396080518160fd015260a051818181606501526101610152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146106c15780636563c0e9146105f55780639df3032514610495578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b161072d565b6100b9610743565b5060443567ffffffffffffffff8111610094576100da903690600401610797565b60643567ffffffffffffffff8111610094576100fa903690600401610797565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630146104865781516001600160a01b039190911691602080820192820191909103126100945751604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316602482018190529193919290602081604481855afa80156103bd5785905f90610450575b6101b79250610857565b60405163095ea7b360e01b60208083019182526001600160a01b03871660248401526044808401949094529282529091905f906101f5606485610759565b83519082865af15f513d82610434575b5050156103f0575b505080518101916080826020850194031261009457602082015167ffffffffffffffff811161009457820183603f82011215610094576020810151906102528261077b565b946102606040519687610759565b8286526040828401011161009457815f926040602093018388015e85010152604082015191608060608201519101519061029b8187846108d0565b9080156103dc57866102b09309151590610857565b9260405160a081019080821067ffffffffffffffff8311176103c857602095610322935f936040528252868201903082526040830196875260608301988952608083019081526040519889978896879563c04b8d5960e01b87528b60048801525160a0602488015260c4870190610833565b93516001600160a01b031660448601525160648501525160848401525160a483015203925af180156103bd575f90610389575b6103859060405190602082015260208152610371604082610759565b604051918291602083526020830190610833565b0390f35b506020813d6020116103b5575b816103a360209383610759565b81010312610094576103859051610355565b3d9150610396565b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b61042d9161042860405163095ea7b360e01b60208201528660248201525f604482015260448152610422606482610759565b82610878565b610878565b838061020d565b9091506104485750813b15155b8680610205565b600114610441565b50506020813d60201161047e575b8161046b60209383610759565b8101031261009457846101b791516101ad565b3d915061045e565b6302f3451d60e21b5f5260045ffd5b34610094576104a3366107dd565b80516001600160a01b039093169260208083019291820191909103126100945751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa9081156103bd575f916105c1575b5061054a936105586105176020945f94610857565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f198101875286610759565b84519082855af15f513d826105a5575b50501561057157005b6104286105a3936040519063095ea7b360e01b602083015260248201525f604482015260448152610422606482610759565b005b9091506105b95750803b15155b8480610568565b6001146105b2565b90506020813d6020116105ed575b816105dc60209383610759565b81010312610094575161054a610502565b3d91506105cf565b346100945760803660031901126100945761060e61072d565b610616610743565b6044356001600160a01b03811692908390036100945760643567ffffffffffffffff81116100945761064c903690600401610797565b6020815191818082019384920101031261009457515f1981146106b2576105a393604051936323b872dd60e01b602086015260018060a01b0316602485015260448401526064830152606482526106a4608483610759565b6001600160a01b0316610878565b630d550c3b60e11b5f5260045ffd5b34610094576106cf366107dd565b602081939293519181808201938492010103126100945751905f1982146106b25760405163a9059cbb60e01b60208201526001600160a01b039390931660248401526044808401929092529082526105a391906106a4606483610759565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff8211176103c857604052565b67ffffffffffffffff81116103c857601f01601f191660200190565b81601f82011215610094578035906107ae8261077b565b926107bc6040519485610759565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff82116100945761083091600401610797565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9190820180921161086457565b634e487b7160e01b5f52601160045260245ffd5b905f602091828151910182855af1156103bd575f513d6108c757506001600160a01b0381163b155b6108a75750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156108a0565b91818302915f198185099383808610950394808603951461096057848311156109485790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b5050809250156103dc57049056fea2646970667358221220f6000c9f1bdef97179fd0d632833ccb7f8eb8b0c4e5d5beef7139a47675404a964736f6c634300081b00330000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0xd8c", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x2756addf24b3676ccedb8c3c545053195a5076a21b75f6c94e6c3185c41eeed1", + "transactionType": "CREATE", + "contractName": "OdosV2AdapterV2", + "contractAddress": "0x5902a019c5534f11eaf1676f708ae2be0b1371ef", + "function": null, + "arguments": [ + "0x0000000000000000000000000000000000000000" + ], + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "gas": "0xc9b6e", + "value": "0x0", + "input": "0x60c034607a57601f610b1438819003918201601f19168301916001600160401b03831184841017607e57808492602094604052833981010312607a57516001600160a01b03811690819003607a573060805260a052604051610a81908161009382396080518160fd015260a051818181606501526101610152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146107565780636563c0e91461068a5780639df303251461052a578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b16107c2565b6100b96107d8565b5060443567ffffffffffffffff8111610094576100da90369060040161082c565b60643567ffffffffffffffff8111610094576100fa90369060040161082c565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316301461051b5781516001600160a01b039190911691602080820192820191909103126100945751604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031660248201819052919290602081604481855afa80156104665784905f906104e5575b6101b59250610900565b60405163095ea7b360e01b60208083019182526001600160a01b03861660248401526044808401949094529282529091905f906101f36064856107ee565b83519082865af15f513d826104c9575b505015610485575b505082518301908360208301920361014081126100945760e013610094576040519160e0830183811067ffffffffffffffff82111761047157604052610253602086016108ec565b83526040850151906020840191825261026e606087016108ec565b9360408101948552610282608088016108ec565b966060820197885260a0810151926080830193845260c08201519760a084019889526102b060e084016108ec565b9160c0850192835261010084015167ffffffffffffffff811161009457840181603f82011215610094576020810151906102e982610810565b926102f760405194856107ee565b8284526040828401011161009457815f926040602093018386015e830101526101208401516001600160a01b03811694908590036100945761014001519263ffffffff84168094036100945760209a876103e09461035a5f9a51828d5191610921565b825261036a8351828d5191610921565b83528a52308352604051630ed8d73960e21b815297516001600160a01b0390811660048a0152995160248901529a51891660448801529b518816606487015298516084860152995160a4850152965190941660c483015261014060e48301529096879586948593929091906101448501906108c8565b9161010484015261012483015203925af18015610466575f90610432575b61042e906040519060208201526020815261041a6040826107ee565b6040519182916020835260208301906108c8565b0390f35b506020813d60201161045e575b8161044c602093836107ee565b810103126100945761042e90516103fe565b3d915061043f565b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b6104c2916104bd60405163095ea7b360e01b60208201528560248201525f6044820152604481526104b76064826107ee565b82610955565b610955565b838061020b565b9091506104dd5750813b15155b8680610203565b6001146104d6565b50506020813d602011610513575b81610500602093836107ee565b8101031261009457836101b591516101ab565b3d91506104f3565b6302f3451d60e21b5f5260045ffd5b346100945761053836610872565b80516001600160a01b039093169260208083019291820191909103126100945751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa908115610466575f91610656575b506105df936105ed6105ac6020945f94610900565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f1981018752866107ee565b84519082855af15f513d8261063a575b50501561060657005b6104bd610638936040519063095ea7b360e01b602083015260248201525f6044820152604481526104b76064826107ee565b005b90915061064e5750803b15155b84806105fd565b600114610647565b90506020813d602011610682575b81610671602093836107ee565b8101031261009457516105df610597565b3d9150610664565b34610094576080366003190112610094576106a36107c2565b6106ab6107d8565b6044356001600160a01b03811692908390036100945760643567ffffffffffffffff8111610094576106e190369060040161082c565b6020815191818082019384920101031261009457515f1981146107475761063893604051936323b872dd60e01b602086015260018060a01b0316602485015260448401526064830152606482526107396084836107ee565b6001600160a01b0316610955565b630d550c3b60e11b5f5260045ffd5b346100945761076436610872565b602081939293519181808201938492010103126100945751905f1982146107475760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261063891906107396064836107ee565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff82111761047157604052565b67ffffffffffffffff811161047157601f01601f191660200190565b81601f820112156100945780359061084382610810565b9261085160405194856107ee565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff8211610094576108c59160040161082c565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b51906001600160a01b038216820361009457565b9190820180921161090d57565b634e487b7160e01b5f52601160045260245ffd5b9161092d8183856109ad565b918115610941576108c59309151590610900565b634e487b7160e01b5f52601260045260245ffd5b905f602091828151910182855af115610466575f513d6109a457506001600160a01b0381163b155b6109845750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b6001141561097d565b91818302915f1981850993838086109503948086039514610a3d5784831115610a255790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b50508092501561094157049056fea26469706673582212201a43e03d554ef4508b4ce4929a5e2c8c851ee4de243e12f6b2b1267ec83a42f164736f6c634300081b00330000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0xd8d", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x7b9c09a57a991d0f8750539c12402f5b0cb613f7e4be3b248b1c1f3792e78a1f", + "transactionType": "CREATE", + "contractName": "PendleSwapV3AdapterV2", + "contractAddress": "0xb51c2bf67ff00172450d7f3d4cbaacc8821779dd", + "function": null, + "arguments": [ + "0x0000000000000000000000000000000000000000" + ], + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "gas": "0x166f6b", + "value": "0x0", + "input": "0x60c0604052346100f757604051601f61132138819003918201601f19168301916001600160401b038311848410176100e3578084926020946040528339810103126100f757516001600160a01b038116908190036100f7573060805260405160a081016001600160401b038111828210176100e357655af3107a4000916080916040525f81525f1960208201525f6040820152610100606082015201525f6008555f196009555f600a55610100600b55655af3107a4000600c5560a05260405161122590816100fc82396080518161025d015260a0518181816089015261031d0152f35b634e487b7160e01b5f52604160045260245ffd5b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816309316dd314610b30575080633268263b14610ac45780634ebfc81414610a855780636563c0e9146109b95780639df303251461084e578063e0a80413146101f8578063f66a7749146100bc5763f887ea4014610074575f80fd5b346100b8575f3660031901126100b8576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b346100b8575f3660031901126100b8575f54604051905f6001548060011c91600182169182156101ee575b6020841083146101da5783865285929081156101bb575060011461015c575b61011292500383610cd2565b60ff60025416610150604051938361012e8660ff819716610e04565b60081c6001600160a01b03166020850152608060408501819052840190610d08565b90151560608301520390f35b5060015f90815290917fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b81831061019f57505090602061011292820101610106565b6020919350806001915483858901015201910190918492610187565b6020925061011294915060ff191682840152151560051b820101610106565b634e487b7160e01b5f52602260045260245ffd5b92607f16926100e7565b346100b85760803660031901126100b857610211610d2c565b610219610d42565b60443567ffffffffffffffff81116100b857610239903690600401610d58565b9160643567ffffffffffffffff81116100b85761025a903690600401610d58565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316301461083f5783516001600160a01b0393841694919093169260208083019291820191909103126100b85751916060828051810103126100b85760208201516001600160a01b03811691908290036100b857606060408401519301519460405195630b2339af60e21b8752606087600481875afa968715610508575f976107d2575b50604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316602482018190529590602081604481885afa80156105085788905f9061079c575b6103709250611041565b60405163095ea7b360e01b60208083019182526001600160a01b038a1660248401526044808401949094529282529091905f906103ae606485610cd2565b83519082895af15f513d82610780575b50501561073c575b506103d2818884611151565b90801561072857876103e79309151590611041565b956001600160a01b0316818103610513575050935f606094939261047e9661040d611062565b95818752602087015260408601526104906040519788968795869463640fc23d60e11b86523060048701526024860152604485015260085460648501526009546084850152600a5460a4850152600b5460c4850152600c5460e4850152610140610104850152610144840190610e40565b82810360031901610124840152610ff1565b03925af18015610508576104d3915f916104d7575b505b604051906020820152602081526104bf604082610cd2565b604051918291602083526020830190610d08565b0390f35b6104f9915060603d606011610501575b6104f18183610cd2565b810190610e25565b5050826104a5565b503d6104e7565b6040513d5f823e3d90fd5b9150949391604051630bc4ed8360e21b8152602081600481865afa908115610508575f916106ed575b50156106535750936020600494956040519586809263781c18db60e01b82525afa938415610508575f9461060b575b50905f61057f6105bc9660409695946110d2565b938551968795869485936323f8ef1160e11b855230600486015260018060a01b031660248501526044840152608060648401526084830190610e40565b03925af18015610508575f906105d7575b6104d391506104a7565b506040813d604011610603575b816105f160409383610cd2565b810103126100b8576104d390516105cd565b3d91506105e4565b90929193506020813d60201161064b575b8161062960209383610cd2565b810103126100b85751926001600160a01b03841684036100b85790915f61056b565b3d915061061c565b929190505f6106676060956106a0976110d2565b936106b160405197889687958694631652a23360e21b86523060048701526024860152604485015260a0606485015260a4840190610e40565b828103600319016084840152610ff1565b03925af18015610508576104d3915f916106cc575b506104a7565b6106e5915060603d606011610501576104f18183610cd2565b5050826106c6565b90506020813d602011610720575b8161070860209383610cd2565b810103126100b8575180151581036100b8578761053c565b3d91506106fb565b634e487b7160e01b5f52601260045260245ffd5b61077a9061077460405163095ea7b360e01b60208201528960248201525f60448201526044815261076e606482610cd2565b876110f9565b856110f9565b886103c6565b9091506107945750843b15155b8a806103be565b60011461078d565b50506020813d6020116107ca575b816107b760209383610cd2565b810103126100b857876103709151610366565b3d91506107aa565b9096506060813d606011610837575b816107ee60609383610cd2565b810103126100b85780516001600160a01b038116036100b8576020810151906001600160a01b03821682036100b857604001516001600160a01b038116036100b8579587610307565b3d91506107e1565b6302f3451d60e21b5f5260045ffd5b346100b85761085c36610dae565b80516001600160a01b039093169260208083019291820191909103126100b85751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa908115610508575f91610985575b50610903936109116108d06020945f94611041565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f198101875286610cd2565b84519082855af15f513d82610969575b50501561092a57005b610962610967936040519063095ea7b360e01b602083015260248201525f60448201526044815261095c606482610cd2565b826110f9565b6110f9565b005b90915061097d5750803b15155b8480610921565b600114610976565b90506020813d6020116109b1575b816109a060209383610cd2565b810103126100b857516109036108bb565b3d9150610993565b346100b85760803660031901126100b8576109d2610d2c565b6109da610d42565b6044356001600160a01b03811692908390036100b85760643567ffffffffffffffff81116100b857610a10903690600401610d58565b602081519181808201938492010103126100b857515f198114610a765761096793604051936323b872dd60e01b602086015260018060a01b031660248501526044840152606483015260648252610a68608483610cd2565b6001600160a01b03166110f9565b630d550c3b60e11b5f5260045ffd5b346100b8575f3660031901126100b85760a0600854600954600a54600b5490600c54926040519485526020850152604084015260608301526080820152f35b346100b857610ad236610dae565b602081939293519181808201938492010103126100b85751905f198214610a765760405163a9059cbb60e01b60208201526001600160a01b039390931660248401526044808401929092529082526109679190610a68606483610cd2565b346100b8575f3660031901126100b85760018060a01b0360035416600454915f6007548060011c90600181168015610c31575b6020831081146101da57828552908115610c0d5750600114610baf575b5090610b91816104d3930382610cd2565b60405193849384526020840152606060408401526060830190610d08565b60075f9081527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688939250905b808210610bf357509091508101602001610b91610b80565b919260018160209254838588010152019101909291610bdb565b60ff191660208086019190915291151560051b84019091019150610b919050610b80565b91607f1691610b63565b5f92918154918260011c92600181168015610cc8575b6020851081146101da57848452908115610cab5750600114610c7257505050565b5f9081526020812093945091925b838310610c91575060209250010190565b600181602092949394548385870101520191019190610c80565b915050602093945060ff929192191683830152151560051b010190565b93607f1693610c51565b90601f8019910116810190811067ffffffffffffffff821117610cf457604052565b634e487b7160e01b5f52604160045260245ffd5b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036100b857565b602435906001600160a01b03821682036100b857565b81601f820112156100b85780359067ffffffffffffffff8211610cf45760405192610d8d601f8401601f191660200185610cd2565b828452602083830101116100b857815f926020809301838601378301015290565b60606003198201126100b8576004356001600160a01b03811681036100b857916024356001600160a01b03811681036100b857916044359067ffffffffffffffff82116100b857610e0191600401610d58565b90565b90600b821015610e115752565b634e487b7160e01b5f52602160045260245ffd5b908160609103126100b8578051916040602083015192015190565b60809060018060a01b0381511683526020810151602084015260018060a01b03604082015116604084015260018060a01b03606082015116606084015201519060a06080820152610e9560a082018351610e04565b60208201516001600160a01b031660c08201526040820151608060e083015261010090606090610eca90610120850190610d08565b930151151591015290565b908060208354918281520160208260051b840101935f5260205f20925f905b838210610f0357505050505090565b9091929394601f19828203018452606081528554606082015260018601546080820152600286015460a0820152600386015460ff81166004811015610e115760c08301526001600160a01b03600891821c811660e0840152600488015481166101008401526005880154811661012084015260068801541661014083015260078701546101608301528601546101808083019190915260098701546101a08301526101c0820152600190602090600d90610fd7610fc76101e08301600a8c01610c3b565b82810385840152600b8b01610c3b565b906040600c8b015491015297019401920190939293610ef4565b610e019060018060a01b03600354168152600454602082015260a0604082015261103161102260a083016005610ed5565b82810360608401526006610ed5565b9060808183039101526007610c3b565b9190820180921161104e57565b634e487b7160e01b5f52601160045260245ffd5b6040519060a0820182811067ffffffffffffffff821117610cf457604052815f81525f60208201525f60408201525f606082015260405190608082019082821067ffffffffffffffff831117610cf4576080916040525f83525f6020840152606060408401525f60608401520152565b91906110dc611062565b6001600160a01b0390931680845260208401919091526040830152565b905f602091828151910182855af115610508575f513d61114857506001600160a01b0381163b155b6111285750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b60011415611121565b91818302915f19818509938380861095039480860395146111e157848311156111c95790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b50508092501561072857049056fea2646970667358221220d7c8c2f17efce607284d62466051aec3e13f6f1e6deb7e056420af021f77a8ae64736f6c634300081b00330000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0xd8e", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x4544ff953f9ef69a92479d1a787d359e1d1ab514582bbb91aaedf134f57f1602", + "transactionType": "CREATE", + "contractName": "ERC4626VaultAdapterV2", + "contractAddress": "0xbff9f6c01c056127957fb9f0436bb07368ddbe2e", + "function": null, + "arguments": null, + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "gas": "0xaf02f", + "value": "0x0", + "input": "0x60a0806040523460215730608052610900908161002682396080518160aa0152f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146106395780636563c0e91461056d5780639df303251461040d5763e0a8041314610045575f80fd5b346102a35760803660031901126102a35761005e6106a5565b6100666106bb565b9060443567ffffffffffffffff81116102a357610087903690600401610707565b60643567ffffffffffffffff81116102a3576100a7903690600401610707565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630146103fe5781516001600160a01b039182169490911691602080820192820191909103126102a35751926060838051810103126102a35760208301519260028410156102a357606060408201519101519061012f81878461082c565b9080156103ea578661014493091515906107b3565b92806103525750604051636eb1769f60e11b815230600482015260248101839052602081604481855afa9081156102af575f9161031a575b50846020939261018f5f976044946107b3565b60405163095ea7b360e01b8782019081526001600160a01b038716602483015260448083019390935291815290869089906101cb6064856106d1565b83519082865af188513d826102fb575b5050156102ba575b50506040519586938492636e553f6560e01b845260048401523060248401525af19182156102af575f92610277575b50818181106102625750505b60408051602081019283526020815261023782826106d1565b8151928391602083525180918160208501528484015e5f828201840152601f01601f19168101030190f35b63eb7f211d60e01b5f5260045260245260445ffd5b9091506020813d6020116102a7575b81610293602093836106d1565b810103126102a35751905f610212565b5f80fd5b3d9150610286565b6040513d5f823e3d90fd5b6102f4916102ef60405163095ea7b360e01b898201528760248201528a878201528681526102e96064826106d1565b826107d4565b6107d4565b5f806101e3565b9091501589146103125750813b15155b5f806101db565b60011461030b565b90506020929192813d60201161034a575b81610338602093836106d1565b810103126102a357519091908461017c565b3d915061032b565b909391506001036103db575f9260646020926040519586938492635d043b2960e11b845260048401523060248401523060448401525af19182156102af575f926103a7575b508181811061026257505061021e565b9091506020813d6020116103d3575b816103c3602093836106d1565b810103126102a35751905f610397565b3d91506103b6565b634a7f394f60e01b5f5260045ffd5b634e487b7160e01b5f52601260045260245ffd5b6302f3451d60e21b5f5260045ffd5b346102a35761041b3661075d565b80516001600160a01b039093169260208083019291820191909103126102a35751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa9081156102af575f91610539575b506104c2936104d061048f6020945f946107b3565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f1981018752866106d1565b84519082855af15f513d8261051d575b5050156104e957005b6102ef61051b936040519063095ea7b360e01b602083015260248201525f6044820152604481526102e96064826106d1565b005b9091506105315750803b15155b84806104e0565b60011461052a565b90506020813d602011610565575b81610554602093836106d1565b810103126102a357516104c261047a565b3d9150610547565b346102a35760803660031901126102a3576105866106a5565b61058e6106bb565b6044356001600160a01b03811692908390036102a35760643567ffffffffffffffff81116102a3576105c4903690600401610707565b602081519181808201938492010103126102a357515f19811461062a5761051b93604051936323b872dd60e01b602086015260018060a01b03166024850152604484015260648301526064825261061c6084836106d1565b6001600160a01b03166107d4565b630d550c3b60e11b5f5260045ffd5b346102a3576106473661075d565b602081939293519181808201938492010103126102a35751905f19821461062a5760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261051b919061061c6064836106d1565b600435906001600160a01b03821682036102a357565b602435906001600160a01b03821682036102a357565b90601f8019910116810190811067ffffffffffffffff8211176106f357604052565b634e487b7160e01b5f52604160045260245ffd5b81601f820112156102a35780359067ffffffffffffffff82116106f3576040519261073c601f8401601f1916602001856106d1565b828452602083830101116102a357815f926020809301838601378301015290565b60606003198201126102a3576004356001600160a01b03811681036102a357916024356001600160a01b03811681036102a357916044359067ffffffffffffffff82116102a3576107b091600401610707565b90565b919082018092116107c057565b634e487b7160e01b5f52601160045260245ffd5b905f602091828151910182855af1156102af575f513d61082357506001600160a01b0381163b155b6108035750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156107fc565b91818302915f19818509938380861095039480860395146108bc57848311156108a45790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b5050809250156103ea57049056fea2646970667358221220b9f441923fe75e1f6e0f37bda35dde1cbac73c1e69240288bd35172a90f8e35164736f6c634300081b0033", + "nonce": "0xd8f", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x8091c719b06ddef01b439d4668e660d3679da2e9a1b2fbc9db1d5360e823bdeb", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0x7662fcf152a9e18280a77f4a8108229e86d398ab", + "function": null, + "arguments": null, + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0x7662fcf152a9e18280a77f4a8108229e86d398ab", + "gas": "0x16bfc", + "value": "0x0", + "input": "0xb6b07b8e0000000000000000000000002f68071bac2be3332c8107dd15a76f7230f3401300000000000000000000000092659d8b9354576d5ba0556158da0244aca4032e0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xd90", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x71f6467e8eaccdaf0915b7f24f40bbea1eab211d28fda9b72d0a74db363776cb", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0x7662fcf152a9e18280a77f4a8108229e86d398ab", + "function": null, + "arguments": null, + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0x7662fcf152a9e18280a77f4a8108229e86d398ab", + "gas": "0x16bfc", + "value": "0x0", + "input": "0xb6b07b8e0000000000000000000000002f68071bac2be3332c8107dd15a76f7230f340130000000000000000000000005902a019c5534f11eaf1676f708ae2be0b1371ef0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xd91", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x3cd2b233f06e3aca670e844336c0d2878cebbcdc750c7383dacc7092b6e24010", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0x7662fcf152a9e18280a77f4a8108229e86d398ab", + "function": null, + "arguments": null, + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0x7662fcf152a9e18280a77f4a8108229e86d398ab", + "gas": "0x16bfc", + "value": "0x0", + "input": "0xb6b07b8e0000000000000000000000002f68071bac2be3332c8107dd15a76f7230f34013000000000000000000000000b51c2bf67ff00172450d7f3d4cbaacc8821779dd0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xd92", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x71321c8b1f41954a04c7dabee3e6009b15384e9871e6d0d53eb1b5b68cc57b71", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0x7662fcf152a9e18280a77f4a8108229e86d398ab", + "function": null, + "arguments": null, + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0x7662fcf152a9e18280a77f4a8108229e86d398ab", + "gas": "0x16bfc", + "value": "0x0", + "input": "0xb6b07b8e0000000000000000000000002f68071bac2be3332c8107dd15a76f7230f34013000000000000000000000000bff9f6c01c056127957fb9f0436bb07368ddbe2e0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xd93", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x209770b", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xe599fd5a860139b87e95bf0c34c844bd0d77a73e94eb6e84354329c645913c16", + "transactionIndex": "0xf8", + "blockHash": "0x05d1bed121125a1f987ac1c6fda0f55c6cf2a1b9c203e21f9c76496092ddf45d", + "blockNumber": "0x83d0c0", + "gasUsed": "0x8f852", + "effectiveGasPrice": "0x267f8c", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": null, + "contractAddress": "0x92659d8b9354576d5ba0556158da0244aca4032e" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1d87d02", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x2756addf24b3676ccedb8c3c545053195a5076a21b75f6c94e6c3185c41eeed1", + "transactionIndex": "0xff", + "blockHash": "0x253256c8f92b514339b97052b50cdc1c1178452623ff07bd7f7f76b39589f9ca", + "blockNumber": "0x83d0c1", + "gasUsed": "0x9b2a4", + "effectiveGasPrice": "0x2728ab", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": null, + "contractAddress": "0x5902a019c5534f11eaf1676f708ae2be0b1371ef" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x168eee9", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x7b9c09a57a991d0f8750539c12402f5b0cb613f7e4be3b248b1c1f3792e78a1f", + "transactionIndex": "0xb7", + "blockHash": "0x6f18993c672fa75101ab6f00a23e2fc5eb1481923927766d8f7d44e7a804c1d8", + "blockNumber": "0x83d0c2", + "gasUsed": "0x114204", + "effectiveGasPrice": "0x2796bd", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": null, + "contractAddress": "0xb51c2bf67ff00172450d7f3d4cbaacc8821779dd" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x2877fd3", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x4544ff953f9ef69a92479d1a787d359e1d1ab514582bbb91aaedf134f57f1602", + "transactionIndex": "0x182", + "blockHash": "0x017bad3db34c019d052002daf41fec98ac552a9d8561b3c185e053fb17afd028", + "blockNumber": "0x83d0c4", + "gasUsed": "0x869fd", + "effectiveGasPrice": "0x25dfac", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": null, + "contractAddress": "0xbff9f6c01c056127957fb9f0436bb07368ddbe2e" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x12d00a8", + "logs": [ + { + "address": "0x2f68071bac2be3332c8107dd15a76f7230f34013", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x00000000000000000000000092659d8b9354576d5ba0556158da0244aca4032e0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x19427d6c36acc95d934c94483cad09dc6c91a74300fb16b04d6bfb9535e803ad", + "blockNumber": "0x83d0c5", + "blockTimestamp": "0x685e4668", + "transactionHash": "0x8091c719b06ddef01b439d4668e660d3679da2e9a1b2fbc9db1d5360e823bdeb", + "transactionIndex": "0xa3", + "logIndex": "0x100", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000", + "type": "0x2", + "transactionHash": "0x8091c719b06ddef01b439d4668e660d3679da2e9a1b2fbc9db1d5360e823bdeb", + "transactionIndex": "0xa3", + "blockHash": "0x19427d6c36acc95d934c94483cad09dc6c91a74300fb16b04d6bfb9535e803ad", + "blockNumber": "0x83d0c5", + "gasUsed": "0xf8e1", + "effectiveGasPrice": "0x27668c", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0x7662fcf152a9e18280a77f4a8108229e86d398ab", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x176f425", + "logs": [ + { + "address": "0x2f68071bac2be3332c8107dd15a76f7230f34013", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x0000000000000000000000005902a019c5534f11eaf1676f708ae2be0b1371ef0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x97f4cf0d2769369e2b6c57da0efd414b62bac7aaecfed93a99a92ba4bcda2018", + "blockNumber": "0x83d0c6", + "blockTimestamp": "0x685e4674", + "transactionHash": "0x71f6467e8eaccdaf0915b7f24f40bbea1eab211d28fda9b72d0a74db363776cb", + "transactionIndex": "0xd0", + "logIndex": "0x135", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000", + "type": "0x2", + "transactionHash": "0x71f6467e8eaccdaf0915b7f24f40bbea1eab211d28fda9b72d0a74db363776cb", + "transactionIndex": "0xd0", + "blockHash": "0x97f4cf0d2769369e2b6c57da0efd414b62bac7aaecfed93a99a92ba4bcda2018", + "blockNumber": "0x83d0c6", + "gasUsed": "0xf8e1", + "effectiveGasPrice": "0x26d7ee", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0x7662fcf152a9e18280a77f4a8108229e86d398ab", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x14c94cf", + "logs": [ + { + "address": "0x2f68071bac2be3332c8107dd15a76f7230f34013", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x000000000000000000000000b51c2bf67ff00172450d7f3d4cbaacc8821779dd0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x54db9516055c0c69e5c9137c952b9f4e8edcc14dba028049117e2f4172d0438e", + "blockNumber": "0x83d0c7", + "blockTimestamp": "0x685e4680", + "transactionHash": "0x3cd2b233f06e3aca670e844336c0d2878cebbcdc750c7383dacc7092b6e24010", + "transactionIndex": "0xda", + "logIndex": "0x16a", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000", + "type": "0x2", + "transactionHash": "0x3cd2b233f06e3aca670e844336c0d2878cebbcdc750c7383dacc7092b6e24010", + "transactionIndex": "0xda", + "blockHash": "0x54db9516055c0c69e5c9137c952b9f4e8edcc14dba028049117e2f4172d0438e", + "blockNumber": "0x83d0c7", + "gasUsed": "0xf8e1", + "effectiveGasPrice": "0x26a16d", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0x7662fcf152a9e18280a77f4a8108229e86d398ab", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x148fbf8", + "logs": [ + { + "address": "0x2f68071bac2be3332c8107dd15a76f7230f34013", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x000000000000000000000000bff9f6c01c056127957fb9f0436bb07368ddbe2e0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x841da9e799a7ddb8f29b967b6edda3244ad2272a296e86fb4108a711d7de7b96", + "blockNumber": "0x83d0c8", + "blockTimestamp": "0x685e468c", + "transactionHash": "0x71321c8b1f41954a04c7dabee3e6009b15384e9871e6d0d53eb1b5b68cc57b71", + "transactionIndex": "0xd7", + "logIndex": "0x133", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000", + "type": "0x2", + "transactionHash": "0x71321c8b1f41954a04c7dabee3e6009b15384e9871e6d0d53eb1b5b68cc57b71", + "transactionIndex": "0xd7", + "blockHash": "0x841da9e799a7ddb8f29b967b6edda3244ad2272a296e86fb4108a711d7de7b96", + "blockNumber": "0x83d0c8", + "gasUsed": "0xf8e1", + "effectiveGasPrice": "0x263d36", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0x7662fcf152a9e18280a77f4a8108229e86d398ab", + "contractAddress": null + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1751008985, + "chain": 11155111, + "commit": "23b76ca" +} \ No newline at end of file diff --git a/broadcast/DeployAdapters.s.sol/421614/run-1751010328.json b/broadcast/DeployAdapters.s.sol/421614/run-1751010328.json new file mode 100644 index 0000000..e3e2cf3 --- /dev/null +++ b/broadcast/DeployAdapters.s.sol/421614/run-1751010328.json @@ -0,0 +1,374 @@ +{ + "transactions": [ + { + "hash": "0x23d0595a78fe1792e0fa2938c52af24df12ee20e6740a1057287b3e2aa76890b", + "transactionType": "CREATE", + "contractName": "UniswapV3AdapterV2", + "contractAddress": "0x32d60d4a462f5a4b145aa225643e5066aec1611b", + "function": null, + "arguments": [ + "0x0000000000000000000000000000000000000000" + ], + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "gas": "0xbc6d6", + "value": "0x0", + "input": "0x60c034607a57601f610a3738819003918201601f19168301916001600160401b03831184841017607e57808492602094604052833981010312607a57516001600160a01b03811690819003607a573060805260a0526040516109a4908161009382396080518160fd015260a051818181606501526101610152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146106c15780636563c0e9146105f55780639df3032514610495578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b161072d565b6100b9610743565b5060443567ffffffffffffffff8111610094576100da903690600401610797565b60643567ffffffffffffffff8111610094576100fa903690600401610797565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630146104865781516001600160a01b039190911691602080820192820191909103126100945751604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316602482018190529193919290602081604481855afa80156103bd5785905f90610450575b6101b79250610857565b60405163095ea7b360e01b60208083019182526001600160a01b03871660248401526044808401949094529282529091905f906101f5606485610759565b83519082865af15f513d82610434575b5050156103f0575b505080518101916080826020850194031261009457602082015167ffffffffffffffff811161009457820183603f82011215610094576020810151906102528261077b565b946102606040519687610759565b8286526040828401011161009457815f926040602093018388015e85010152604082015191608060608201519101519061029b8187846108d0565b9080156103dc57866102b09309151590610857565b9260405160a081019080821067ffffffffffffffff8311176103c857602095610322935f936040528252868201903082526040830196875260608301988952608083019081526040519889978896879563c04b8d5960e01b87528b60048801525160a0602488015260c4870190610833565b93516001600160a01b031660448601525160648501525160848401525160a483015203925af180156103bd575f90610389575b6103859060405190602082015260208152610371604082610759565b604051918291602083526020830190610833565b0390f35b506020813d6020116103b5575b816103a360209383610759565b81010312610094576103859051610355565b3d9150610396565b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b61042d9161042860405163095ea7b360e01b60208201528660248201525f604482015260448152610422606482610759565b82610878565b610878565b838061020d565b9091506104485750813b15155b8680610205565b600114610441565b50506020813d60201161047e575b8161046b60209383610759565b8101031261009457846101b791516101ad565b3d915061045e565b6302f3451d60e21b5f5260045ffd5b34610094576104a3366107dd565b80516001600160a01b039093169260208083019291820191909103126100945751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa9081156103bd575f916105c1575b5061054a936105586105176020945f94610857565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f198101875286610759565b84519082855af15f513d826105a5575b50501561057157005b6104286105a3936040519063095ea7b360e01b602083015260248201525f604482015260448152610422606482610759565b005b9091506105b95750803b15155b8480610568565b6001146105b2565b90506020813d6020116105ed575b816105dc60209383610759565b81010312610094575161054a610502565b3d91506105cf565b346100945760803660031901126100945761060e61072d565b610616610743565b6044356001600160a01b03811692908390036100945760643567ffffffffffffffff81116100945761064c903690600401610797565b6020815191818082019384920101031261009457515f1981146106b2576105a393604051936323b872dd60e01b602086015260018060a01b0316602485015260448401526064830152606482526106a4608483610759565b6001600160a01b0316610878565b630d550c3b60e11b5f5260045ffd5b34610094576106cf366107dd565b602081939293519181808201938492010103126100945751905f1982146106b25760405163a9059cbb60e01b60208201526001600160a01b039390931660248401526044808401929092529082526105a391906106a4606483610759565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff8211176103c857604052565b67ffffffffffffffff81116103c857601f01601f191660200190565b81601f82011215610094578035906107ae8261077b565b926107bc6040519485610759565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff82116100945761083091600401610797565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9190820180921161086457565b634e487b7160e01b5f52601160045260245ffd5b905f602091828151910182855af1156103bd575f513d6108c757506001600160a01b0381163b155b6108a75750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156108a0565b91818302915f198185099383808610950394808603951461096057848311156109485790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b5050809250156103dc57049056fea2646970667358221220f6000c9f1bdef97179fd0d632833ccb7f8eb8b0c4e5d5beef7139a47675404a964736f6c634300081b00330000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0xc7f", + "chainId": "0x66eee" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xf4d740f8b40579b2845737dc420c0505335f96513db13a0c38a4762b7076dac4", + "transactionType": "CREATE", + "contractName": "OdosV2AdapterV2", + "contractAddress": "0x03f45de2ab1b976e27acbaa4a9945e5ea7f4ed32", + "function": null, + "arguments": [ + "0x0000000000000000000000000000000000000000" + ], + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "gas": "0xcbaf9", + "value": "0x0", + "input": "0x60c034607a57601f610b1438819003918201601f19168301916001600160401b03831184841017607e57808492602094604052833981010312607a57516001600160a01b03811690819003607a573060805260a052604051610a81908161009382396080518160fd015260a051818181606501526101610152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146107565780636563c0e91461068a5780639df303251461052a578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b16107c2565b6100b96107d8565b5060443567ffffffffffffffff8111610094576100da90369060040161082c565b60643567ffffffffffffffff8111610094576100fa90369060040161082c565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316301461051b5781516001600160a01b039190911691602080820192820191909103126100945751604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031660248201819052919290602081604481855afa80156104665784905f906104e5575b6101b59250610900565b60405163095ea7b360e01b60208083019182526001600160a01b03861660248401526044808401949094529282529091905f906101f36064856107ee565b83519082865af15f513d826104c9575b505015610485575b505082518301908360208301920361014081126100945760e013610094576040519160e0830183811067ffffffffffffffff82111761047157604052610253602086016108ec565b83526040850151906020840191825261026e606087016108ec565b9360408101948552610282608088016108ec565b966060820197885260a0810151926080830193845260c08201519760a084019889526102b060e084016108ec565b9160c0850192835261010084015167ffffffffffffffff811161009457840181603f82011215610094576020810151906102e982610810565b926102f760405194856107ee565b8284526040828401011161009457815f926040602093018386015e830101526101208401516001600160a01b03811694908590036100945761014001519263ffffffff84168094036100945760209a876103e09461035a5f9a51828d5191610921565b825261036a8351828d5191610921565b83528a52308352604051630ed8d73960e21b815297516001600160a01b0390811660048a0152995160248901529a51891660448801529b518816606487015298516084860152995160a4850152965190941660c483015261014060e48301529096879586948593929091906101448501906108c8565b9161010484015261012483015203925af18015610466575f90610432575b61042e906040519060208201526020815261041a6040826107ee565b6040519182916020835260208301906108c8565b0390f35b506020813d60201161045e575b8161044c602093836107ee565b810103126100945761042e90516103fe565b3d915061043f565b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b6104c2916104bd60405163095ea7b360e01b60208201528560248201525f6044820152604481526104b76064826107ee565b82610955565b610955565b838061020b565b9091506104dd5750813b15155b8680610203565b6001146104d6565b50506020813d602011610513575b81610500602093836107ee565b8101031261009457836101b591516101ab565b3d91506104f3565b6302f3451d60e21b5f5260045ffd5b346100945761053836610872565b80516001600160a01b039093169260208083019291820191909103126100945751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa908115610466575f91610656575b506105df936105ed6105ac6020945f94610900565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f1981018752866107ee565b84519082855af15f513d8261063a575b50501561060657005b6104bd610638936040519063095ea7b360e01b602083015260248201525f6044820152604481526104b76064826107ee565b005b90915061064e5750803b15155b84806105fd565b600114610647565b90506020813d602011610682575b81610671602093836107ee565b8101031261009457516105df610597565b3d9150610664565b34610094576080366003190112610094576106a36107c2565b6106ab6107d8565b6044356001600160a01b03811692908390036100945760643567ffffffffffffffff8111610094576106e190369060040161082c565b6020815191818082019384920101031261009457515f1981146107475761063893604051936323b872dd60e01b602086015260018060a01b0316602485015260448401526064830152606482526107396084836107ee565b6001600160a01b0316610955565b630d550c3b60e11b5f5260045ffd5b346100945761076436610872565b602081939293519181808201938492010103126100945751905f1982146107475760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261063891906107396064836107ee565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff82111761047157604052565b67ffffffffffffffff811161047157601f01601f191660200190565b81601f820112156100945780359061084382610810565b9261085160405194856107ee565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff8211610094576108c59160040161082c565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b51906001600160a01b038216820361009457565b9190820180921161090d57565b634e487b7160e01b5f52601160045260245ffd5b9161092d8183856109ad565b918115610941576108c59309151590610900565b634e487b7160e01b5f52601260045260245ffd5b905f602091828151910182855af115610466575f513d6109a457506001600160a01b0381163b155b6109845750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b6001141561097d565b91818302915f1981850993838086109503948086039514610a3d5784831115610a255790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b50508092501561094157049056fea26469706673582212201a43e03d554ef4508b4ce4929a5e2c8c851ee4de243e12f6b2b1267ec83a42f164736f6c634300081b00330000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0xc80", + "chainId": "0x66eee" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xdcad5f76b99d21a8ba3747106f6a29b5ac04bb3e048b53f0c4d5c6059e86af09", + "transactionType": "CREATE", + "contractName": "PendleSwapV3AdapterV2", + "contractAddress": "0x624e405a53d1f3fcdf52cebae469bfd6472294fa", + "function": null, + "arguments": [ + "0x0000000000000000000000000000000000000000" + ], + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "gas": "0x16a2ee", + "value": "0x0", + "input": "0x60c0604052346100f757604051601f61132138819003918201601f19168301916001600160401b038311848410176100e3578084926020946040528339810103126100f757516001600160a01b038116908190036100f7573060805260405160a081016001600160401b038111828210176100e357655af3107a4000916080916040525f81525f1960208201525f6040820152610100606082015201525f6008555f196009555f600a55610100600b55655af3107a4000600c5560a05260405161122590816100fc82396080518161025d015260a0518181816089015261031d0152f35b634e487b7160e01b5f52604160045260245ffd5b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816309316dd314610b30575080633268263b14610ac45780634ebfc81414610a855780636563c0e9146109b95780639df303251461084e578063e0a80413146101f8578063f66a7749146100bc5763f887ea4014610074575f80fd5b346100b8575f3660031901126100b8576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b346100b8575f3660031901126100b8575f54604051905f6001548060011c91600182169182156101ee575b6020841083146101da5783865285929081156101bb575060011461015c575b61011292500383610cd2565b60ff60025416610150604051938361012e8660ff819716610e04565b60081c6001600160a01b03166020850152608060408501819052840190610d08565b90151560608301520390f35b5060015f90815290917fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b81831061019f57505090602061011292820101610106565b6020919350806001915483858901015201910190918492610187565b6020925061011294915060ff191682840152151560051b820101610106565b634e487b7160e01b5f52602260045260245ffd5b92607f16926100e7565b346100b85760803660031901126100b857610211610d2c565b610219610d42565b60443567ffffffffffffffff81116100b857610239903690600401610d58565b9160643567ffffffffffffffff81116100b85761025a903690600401610d58565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316301461083f5783516001600160a01b0393841694919093169260208083019291820191909103126100b85751916060828051810103126100b85760208201516001600160a01b03811691908290036100b857606060408401519301519460405195630b2339af60e21b8752606087600481875afa968715610508575f976107d2575b50604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316602482018190529590602081604481885afa80156105085788905f9061079c575b6103709250611041565b60405163095ea7b360e01b60208083019182526001600160a01b038a1660248401526044808401949094529282529091905f906103ae606485610cd2565b83519082895af15f513d82610780575b50501561073c575b506103d2818884611151565b90801561072857876103e79309151590611041565b956001600160a01b0316818103610513575050935f606094939261047e9661040d611062565b95818752602087015260408601526104906040519788968795869463640fc23d60e11b86523060048701526024860152604485015260085460648501526009546084850152600a5460a4850152600b5460c4850152600c5460e4850152610140610104850152610144840190610e40565b82810360031901610124840152610ff1565b03925af18015610508576104d3915f916104d7575b505b604051906020820152602081526104bf604082610cd2565b604051918291602083526020830190610d08565b0390f35b6104f9915060603d606011610501575b6104f18183610cd2565b810190610e25565b5050826104a5565b503d6104e7565b6040513d5f823e3d90fd5b9150949391604051630bc4ed8360e21b8152602081600481865afa908115610508575f916106ed575b50156106535750936020600494956040519586809263781c18db60e01b82525afa938415610508575f9461060b575b50905f61057f6105bc9660409695946110d2565b938551968795869485936323f8ef1160e11b855230600486015260018060a01b031660248501526044840152608060648401526084830190610e40565b03925af18015610508575f906105d7575b6104d391506104a7565b506040813d604011610603575b816105f160409383610cd2565b810103126100b8576104d390516105cd565b3d91506105e4565b90929193506020813d60201161064b575b8161062960209383610cd2565b810103126100b85751926001600160a01b03841684036100b85790915f61056b565b3d915061061c565b929190505f6106676060956106a0976110d2565b936106b160405197889687958694631652a23360e21b86523060048701526024860152604485015260a0606485015260a4840190610e40565b828103600319016084840152610ff1565b03925af18015610508576104d3915f916106cc575b506104a7565b6106e5915060603d606011610501576104f18183610cd2565b5050826106c6565b90506020813d602011610720575b8161070860209383610cd2565b810103126100b8575180151581036100b8578761053c565b3d91506106fb565b634e487b7160e01b5f52601260045260245ffd5b61077a9061077460405163095ea7b360e01b60208201528960248201525f60448201526044815261076e606482610cd2565b876110f9565b856110f9565b886103c6565b9091506107945750843b15155b8a806103be565b60011461078d565b50506020813d6020116107ca575b816107b760209383610cd2565b810103126100b857876103709151610366565b3d91506107aa565b9096506060813d606011610837575b816107ee60609383610cd2565b810103126100b85780516001600160a01b038116036100b8576020810151906001600160a01b03821682036100b857604001516001600160a01b038116036100b8579587610307565b3d91506107e1565b6302f3451d60e21b5f5260045ffd5b346100b85761085c36610dae565b80516001600160a01b039093169260208083019291820191909103126100b85751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa908115610508575f91610985575b50610903936109116108d06020945f94611041565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f198101875286610cd2565b84519082855af15f513d82610969575b50501561092a57005b610962610967936040519063095ea7b360e01b602083015260248201525f60448201526044815261095c606482610cd2565b826110f9565b6110f9565b005b90915061097d5750803b15155b8480610921565b600114610976565b90506020813d6020116109b1575b816109a060209383610cd2565b810103126100b857516109036108bb565b3d9150610993565b346100b85760803660031901126100b8576109d2610d2c565b6109da610d42565b6044356001600160a01b03811692908390036100b85760643567ffffffffffffffff81116100b857610a10903690600401610d58565b602081519181808201938492010103126100b857515f198114610a765761096793604051936323b872dd60e01b602086015260018060a01b031660248501526044840152606483015260648252610a68608483610cd2565b6001600160a01b03166110f9565b630d550c3b60e11b5f5260045ffd5b346100b8575f3660031901126100b85760a0600854600954600a54600b5490600c54926040519485526020850152604084015260608301526080820152f35b346100b857610ad236610dae565b602081939293519181808201938492010103126100b85751905f198214610a765760405163a9059cbb60e01b60208201526001600160a01b039390931660248401526044808401929092529082526109679190610a68606483610cd2565b346100b8575f3660031901126100b85760018060a01b0360035416600454915f6007548060011c90600181168015610c31575b6020831081146101da57828552908115610c0d5750600114610baf575b5090610b91816104d3930382610cd2565b60405193849384526020840152606060408401526060830190610d08565b60075f9081527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688939250905b808210610bf357509091508101602001610b91610b80565b919260018160209254838588010152019101909291610bdb565b60ff191660208086019190915291151560051b84019091019150610b919050610b80565b91607f1691610b63565b5f92918154918260011c92600181168015610cc8575b6020851081146101da57848452908115610cab5750600114610c7257505050565b5f9081526020812093945091925b838310610c91575060209250010190565b600181602092949394548385870101520191019190610c80565b915050602093945060ff929192191683830152151560051b010190565b93607f1693610c51565b90601f8019910116810190811067ffffffffffffffff821117610cf457604052565b634e487b7160e01b5f52604160045260245ffd5b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036100b857565b602435906001600160a01b03821682036100b857565b81601f820112156100b85780359067ffffffffffffffff8211610cf45760405192610d8d601f8401601f191660200185610cd2565b828452602083830101116100b857815f926020809301838601378301015290565b60606003198201126100b8576004356001600160a01b03811681036100b857916024356001600160a01b03811681036100b857916044359067ffffffffffffffff82116100b857610e0191600401610d58565b90565b90600b821015610e115752565b634e487b7160e01b5f52602160045260245ffd5b908160609103126100b8578051916040602083015192015190565b60809060018060a01b0381511683526020810151602084015260018060a01b03604082015116604084015260018060a01b03606082015116606084015201519060a06080820152610e9560a082018351610e04565b60208201516001600160a01b031660c08201526040820151608060e083015261010090606090610eca90610120850190610d08565b930151151591015290565b908060208354918281520160208260051b840101935f5260205f20925f905b838210610f0357505050505090565b9091929394601f19828203018452606081528554606082015260018601546080820152600286015460a0820152600386015460ff81166004811015610e115760c08301526001600160a01b03600891821c811660e0840152600488015481166101008401526005880154811661012084015260068801541661014083015260078701546101608301528601546101808083019190915260098701546101a08301526101c0820152600190602090600d90610fd7610fc76101e08301600a8c01610c3b565b82810385840152600b8b01610c3b565b906040600c8b015491015297019401920190939293610ef4565b610e019060018060a01b03600354168152600454602082015260a0604082015261103161102260a083016005610ed5565b82810360608401526006610ed5565b9060808183039101526007610c3b565b9190820180921161104e57565b634e487b7160e01b5f52601160045260245ffd5b6040519060a0820182811067ffffffffffffffff821117610cf457604052815f81525f60208201525f60408201525f606082015260405190608082019082821067ffffffffffffffff831117610cf4576080916040525f83525f6020840152606060408401525f60608401520152565b91906110dc611062565b6001600160a01b0390931680845260208401919091526040830152565b905f602091828151910182855af115610508575f513d61114857506001600160a01b0381163b155b6111285750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b60011415611121565b91818302915f19818509938380861095039480860395146111e157848311156111c95790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b50508092501561072857049056fea2646970667358221220d7c8c2f17efce607284d62466051aec3e13f6f1e6deb7e056420af021f77a8ae64736f6c634300081b00330000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0xc81", + "chainId": "0x66eee" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x3f5d594bfbbd914eb5fefcb4f062797e025aeb4fbe4f902fd585dcdbe0e6aa57", + "transactionType": "CREATE", + "contractName": "ERC4626VaultAdapterV2", + "contractAddress": "0xb50b0c9c835e8f4f9436214f6f5219207c3b58cf", + "function": null, + "arguments": null, + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "gas": "0xb0c56", + "value": "0x0", + "input": "0x60a0806040523460215730608052610900908161002682396080518160aa0152f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146106395780636563c0e91461056d5780639df303251461040d5763e0a8041314610045575f80fd5b346102a35760803660031901126102a35761005e6106a5565b6100666106bb565b9060443567ffffffffffffffff81116102a357610087903690600401610707565b60643567ffffffffffffffff81116102a3576100a7903690600401610707565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630146103fe5781516001600160a01b039182169490911691602080820192820191909103126102a35751926060838051810103126102a35760208301519260028410156102a357606060408201519101519061012f81878461082c565b9080156103ea578661014493091515906107b3565b92806103525750604051636eb1769f60e11b815230600482015260248101839052602081604481855afa9081156102af575f9161031a575b50846020939261018f5f976044946107b3565b60405163095ea7b360e01b8782019081526001600160a01b038716602483015260448083019390935291815290869089906101cb6064856106d1565b83519082865af188513d826102fb575b5050156102ba575b50506040519586938492636e553f6560e01b845260048401523060248401525af19182156102af575f92610277575b50818181106102625750505b60408051602081019283526020815261023782826106d1565b8151928391602083525180918160208501528484015e5f828201840152601f01601f19168101030190f35b63eb7f211d60e01b5f5260045260245260445ffd5b9091506020813d6020116102a7575b81610293602093836106d1565b810103126102a35751905f610212565b5f80fd5b3d9150610286565b6040513d5f823e3d90fd5b6102f4916102ef60405163095ea7b360e01b898201528760248201528a878201528681526102e96064826106d1565b826107d4565b6107d4565b5f806101e3565b9091501589146103125750813b15155b5f806101db565b60011461030b565b90506020929192813d60201161034a575b81610338602093836106d1565b810103126102a357519091908461017c565b3d915061032b565b909391506001036103db575f9260646020926040519586938492635d043b2960e11b845260048401523060248401523060448401525af19182156102af575f926103a7575b508181811061026257505061021e565b9091506020813d6020116103d3575b816103c3602093836106d1565b810103126102a35751905f610397565b3d91506103b6565b634a7f394f60e01b5f5260045ffd5b634e487b7160e01b5f52601260045260245ffd5b6302f3451d60e21b5f5260045ffd5b346102a35761041b3661075d565b80516001600160a01b039093169260208083019291820191909103126102a35751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa9081156102af575f91610539575b506104c2936104d061048f6020945f946107b3565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f1981018752866106d1565b84519082855af15f513d8261051d575b5050156104e957005b6102ef61051b936040519063095ea7b360e01b602083015260248201525f6044820152604481526102e96064826106d1565b005b9091506105315750803b15155b84806104e0565b60011461052a565b90506020813d602011610565575b81610554602093836106d1565b810103126102a357516104c261047a565b3d9150610547565b346102a35760803660031901126102a3576105866106a5565b61058e6106bb565b6044356001600160a01b03811692908390036102a35760643567ffffffffffffffff81116102a3576105c4903690600401610707565b602081519181808201938492010103126102a357515f19811461062a5761051b93604051936323b872dd60e01b602086015260018060a01b03166024850152604484015260648301526064825261061c6084836106d1565b6001600160a01b03166107d4565b630d550c3b60e11b5f5260045ffd5b346102a3576106473661075d565b602081939293519181808201938492010103126102a35751905f19821461062a5760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261051b919061061c6064836106d1565b600435906001600160a01b03821682036102a357565b602435906001600160a01b03821682036102a357565b90601f8019910116810190811067ffffffffffffffff8211176106f357604052565b634e487b7160e01b5f52604160045260245ffd5b81601f820112156102a35780359067ffffffffffffffff82116106f3576040519261073c601f8401601f1916602001856106d1565b828452602083830101116102a357815f926020809301838601378301015290565b60606003198201126102a3576004356001600160a01b03811681036102a357916024356001600160a01b03811681036102a357916044359067ffffffffffffffff82116102a3576107b091600401610707565b90565b919082018092116107c057565b634e487b7160e01b5f52601160045260245ffd5b905f602091828151910182855af1156102af575f513d61082357506001600160a01b0381163b155b6108035750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156107fc565b91818302915f19818509938380861095039480860395146108bc57848311156108a45790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b5050809250156103ea57049056fea2646970667358221220b9f441923fe75e1f6e0f37bda35dde1cbac73c1e69240288bd35172a90f8e35164736f6c634300081b0033", + "nonce": "0xc82", + "chainId": "0x66eee" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x9ff65dedade293e16b745bc1ce54fed43f299d59f8d411197b042d21d9861cae", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0x0709f8b7bdea284c7352a5b12505f3d70bf9c21b", + "function": null, + "arguments": null, + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0x0709f8b7bdea284c7352a5b12505f3d70bf9c21b", + "gas": "0x14c09", + "value": "0x0", + "input": "0xb6b07b8e0000000000000000000000009c9832dd2ead3d0752a22acd50b112fd36e063b500000000000000000000000032d60d4a462f5a4b145aa225643e5066aec1611b0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xc83", + "chainId": "0x66eee" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xae9bbc6d4e0d728526ae0d84f9b74788dccd1cd47df8f256c8bf8d35672959ff", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0x0709f8b7bdea284c7352a5b12505f3d70bf9c21b", + "function": null, + "arguments": null, + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0x0709f8b7bdea284c7352a5b12505f3d70bf9c21b", + "gas": "0x14c09", + "value": "0x0", + "input": "0xb6b07b8e0000000000000000000000009c9832dd2ead3d0752a22acd50b112fd36e063b500000000000000000000000003f45de2ab1b976e27acbaa4a9945e5ea7f4ed320000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xc84", + "chainId": "0x66eee" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xb8c77dd22717d8fb4bb15cdf59204014ecc7060878bb115587ec0745a46852e1", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0x0709f8b7bdea284c7352a5b12505f3d70bf9c21b", + "function": null, + "arguments": null, + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0x0709f8b7bdea284c7352a5b12505f3d70bf9c21b", + "gas": "0x14c09", + "value": "0x0", + "input": "0xb6b07b8e0000000000000000000000009c9832dd2ead3d0752a22acd50b112fd36e063b5000000000000000000000000624e405a53d1f3fcdf52cebae469bfd6472294fa0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xc85", + "chainId": "0x66eee" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x7830ce9eac36e7ebd3f86ffdf0a65af7ac7a2b35206578bb3eee85eddbee9f26", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0x0709f8b7bdea284c7352a5b12505f3d70bf9c21b", + "function": null, + "arguments": null, + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0x0709f8b7bdea284c7352a5b12505f3d70bf9c21b", + "gas": "0x14c09", + "value": "0x0", + "input": "0xb6b07b8e0000000000000000000000009c9832dd2ead3d0752a22acd50b112fd36e063b5000000000000000000000000b50b0c9c835e8f4f9436214f6f5219207c3b58cf0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xc86", + "chainId": "0x66eee" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x134d54", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x23d0595a78fe1792e0fa2938c52af24df12ee20e6740a1057287b3e2aa76890b", + "transactionIndex": "0x2", + "blockHash": "0xe6b68fb89def57c5d3a6e1e67987a06e4cf945e08130cd7c0749d002febe1c76", + "blockNumber": "0x9fec298", + "gasUsed": "0x8f852", + "effectiveGasPrice": "0x5f5e100", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": null, + "contractAddress": "0x32d60d4a462f5a4b145aa225643e5066aec1611b", + "gasUsedForL1": "0x0", + "l1BlockNumber": "0x83d136", + "timeboosted": false + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xb708c", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xf4d740f8b40579b2845737dc420c0505335f96513db13a0c38a4762b7076dac4", + "transactionIndex": "0x2", + "blockHash": "0xffd60c91a90fb9bc6336e4850d04a8211359b80ab12a9339ce22ab75ae3d373f", + "blockNumber": "0x9fec2a0", + "gasUsed": "0x9b2a4", + "effectiveGasPrice": "0x5f5e100", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": null, + "contractAddress": "0x03f45de2ab1b976e27acbaa4a9945e5ea7f4ed32", + "gasUsedForL1": "0x0", + "l1BlockNumber": "0x83d136", + "timeboosted": false + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x13b4bf", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xdcad5f76b99d21a8ba3747106f6a29b5ac04bb3e048b53f0c4d5c6059e86af09", + "transactionIndex": "0x3", + "blockHash": "0x217f810ff1e7144d796949c6ea1c4d6211f428e766fb4c8e42427e01d6ffd992", + "blockNumber": "0x9fec2a9", + "gasUsed": "0x114204", + "effectiveGasPrice": "0x5f5e100", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": null, + "contractAddress": "0x624e405a53d1f3fcdf52cebae469bfd6472294fa", + "gasUsedForL1": "0x0", + "l1BlockNumber": "0x83d136", + "timeboosted": false + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x869fd", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x3f5d594bfbbd914eb5fefcb4f062797e025aeb4fbe4f902fd585dcdbe0e6aa57", + "transactionIndex": "0x1", + "blockHash": "0xe3ad43cf645eedbd1b1d916be7f3352161e39dd61791603c822a95b2f5ef1adf", + "blockNumber": "0x9fec2b1", + "gasUsed": "0x869fd", + "effectiveGasPrice": "0x5f5e100", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": null, + "contractAddress": "0xb50b0c9c835e8f4f9436214f6f5219207c3b58cf", + "gasUsedForL1": "0x0", + "l1BlockNumber": "0x83d136", + "timeboosted": false + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x2b10d", + "logs": [ + { + "address": "0x9c9832dd2ead3d0752a22acd50b112fd36e063b5", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x00000000000000000000000032d60d4a462f5a4b145aa225643e5066aec1611b0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x140321df400970d98ed65331a8949656950f7dca0905a6ae8f2c54fedddd62f9", + "blockNumber": "0x9fec2ba", + "transactionHash": "0x9ff65dedade293e16b745bc1ce54fed43f299d59f8d411197b042d21d9861cae", + "transactionIndex": "0x2", + "logIndex": "0x3", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000800000100000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000008000000000000000000000", + "type": "0x2", + "transactionHash": "0x9ff65dedade293e16b745bc1ce54fed43f299d59f8d411197b042d21d9861cae", + "transactionIndex": "0x2", + "blockHash": "0x140321df400970d98ed65331a8949656950f7dca0905a6ae8f2c54fedddd62f9", + "blockNumber": "0x9fec2ba", + "gasUsed": "0xf8e1", + "effectiveGasPrice": "0x5f5e100", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0x0709f8b7bdea284c7352a5b12505f3d70bf9c21b", + "contractAddress": null, + "gasUsedForL1": "0x0", + "l1BlockNumber": "0x83d136", + "timeboosted": false + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xe0eee", + "logs": [ + { + "address": "0x9c9832dd2ead3d0752a22acd50b112fd36e063b5", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x00000000000000000000000003f45de2ab1b976e27acbaa4a9945e5ea7f4ed320000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x9a76221447a2ffe4958a9912512df765cf53b578bb00f434d0002ce3f0d57b8a", + "blockNumber": "0x9fec2c1", + "transactionHash": "0xae9bbc6d4e0d728526ae0d84f9b74788dccd1cd47df8f256c8bf8d35672959ff", + "transactionIndex": "0x6", + "logIndex": "0x1b", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000800000100000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000008000000000000000000000", + "type": "0x2", + "transactionHash": "0xae9bbc6d4e0d728526ae0d84f9b74788dccd1cd47df8f256c8bf8d35672959ff", + "transactionIndex": "0x6", + "blockHash": "0x9a76221447a2ffe4958a9912512df765cf53b578bb00f434d0002ce3f0d57b8a", + "blockNumber": "0x9fec2c1", + "gasUsed": "0xf8e1", + "effectiveGasPrice": "0x5f5e100", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0x0709f8b7bdea284c7352a5b12505f3d70bf9c21b", + "contractAddress": null, + "gasUsedForL1": "0x0", + "l1BlockNumber": "0x83d136", + "timeboosted": false + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x2b6c9", + "logs": [ + { + "address": "0x9c9832dd2ead3d0752a22acd50b112fd36e063b5", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x000000000000000000000000624e405a53d1f3fcdf52cebae469bfd6472294fa0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xc1f5d3b7953e154d4eac02ecae9660219590847b01ed909b5707d9b4eea7b4eb", + "blockNumber": "0x9fec2c9", + "transactionHash": "0xb8c77dd22717d8fb4bb15cdf59204014ecc7060878bb115587ec0745a46852e1", + "transactionIndex": "0x2", + "logIndex": "0x4", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000800000100000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000008000000000000000000000", + "type": "0x2", + "transactionHash": "0xb8c77dd22717d8fb4bb15cdf59204014ecc7060878bb115587ec0745a46852e1", + "transactionIndex": "0x2", + "blockHash": "0xc1f5d3b7953e154d4eac02ecae9660219590847b01ed909b5707d9b4eea7b4eb", + "blockNumber": "0x9fec2c9", + "gasUsed": "0xf8e1", + "effectiveGasPrice": "0x5f5e100", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0x0709f8b7bdea284c7352a5b12505f3d70bf9c21b", + "contractAddress": null, + "gasUsedForL1": "0x0", + "l1BlockNumber": "0x83d136", + "timeboosted": false + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xf8e1", + "logs": [ + { + "address": "0x9c9832dd2ead3d0752a22acd50b112fd36e063b5", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x000000000000000000000000b50b0c9c835e8f4f9436214f6f5219207c3b58cf0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x47a029380ae77c5ea4fd8bdfc958473c49dad60c59a7208d4207947869d8f4b7", + "blockNumber": "0x9fec2d1", + "transactionHash": "0x7830ce9eac36e7ebd3f86ffdf0a65af7ac7a2b35206578bb3eee85eddbee9f26", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000800000100000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000008000000000000000000000", + "type": "0x2", + "transactionHash": "0x7830ce9eac36e7ebd3f86ffdf0a65af7ac7a2b35206578bb3eee85eddbee9f26", + "transactionIndex": "0x1", + "blockHash": "0x47a029380ae77c5ea4fd8bdfc958473c49dad60c59a7208d4207947869d8f4b7", + "blockNumber": "0x9fec2d1", + "gasUsed": "0xf8e1", + "effectiveGasPrice": "0x5f5e100", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0x0709f8b7bdea284c7352a5b12505f3d70bf9c21b", + "contractAddress": null, + "gasUsedForL1": "0x0", + "l1BlockNumber": "0x83d137", + "timeboosted": false + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1751010328, + "chain": 421614, + "commit": "23b76ca" +} \ No newline at end of file diff --git a/broadcast/DeployAdapters.s.sol/421614/run-latest.json b/broadcast/DeployAdapters.s.sol/421614/run-latest.json new file mode 100644 index 0000000..e3e2cf3 --- /dev/null +++ b/broadcast/DeployAdapters.s.sol/421614/run-latest.json @@ -0,0 +1,374 @@ +{ + "transactions": [ + { + "hash": "0x23d0595a78fe1792e0fa2938c52af24df12ee20e6740a1057287b3e2aa76890b", + "transactionType": "CREATE", + "contractName": "UniswapV3AdapterV2", + "contractAddress": "0x32d60d4a462f5a4b145aa225643e5066aec1611b", + "function": null, + "arguments": [ + "0x0000000000000000000000000000000000000000" + ], + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "gas": "0xbc6d6", + "value": "0x0", + "input": "0x60c034607a57601f610a3738819003918201601f19168301916001600160401b03831184841017607e57808492602094604052833981010312607a57516001600160a01b03811690819003607a573060805260a0526040516109a4908161009382396080518160fd015260a051818181606501526101610152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146106c15780636563c0e9146105f55780639df3032514610495578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b161072d565b6100b9610743565b5060443567ffffffffffffffff8111610094576100da903690600401610797565b60643567ffffffffffffffff8111610094576100fa903690600401610797565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630146104865781516001600160a01b039190911691602080820192820191909103126100945751604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316602482018190529193919290602081604481855afa80156103bd5785905f90610450575b6101b79250610857565b60405163095ea7b360e01b60208083019182526001600160a01b03871660248401526044808401949094529282529091905f906101f5606485610759565b83519082865af15f513d82610434575b5050156103f0575b505080518101916080826020850194031261009457602082015167ffffffffffffffff811161009457820183603f82011215610094576020810151906102528261077b565b946102606040519687610759565b8286526040828401011161009457815f926040602093018388015e85010152604082015191608060608201519101519061029b8187846108d0565b9080156103dc57866102b09309151590610857565b9260405160a081019080821067ffffffffffffffff8311176103c857602095610322935f936040528252868201903082526040830196875260608301988952608083019081526040519889978896879563c04b8d5960e01b87528b60048801525160a0602488015260c4870190610833565b93516001600160a01b031660448601525160648501525160848401525160a483015203925af180156103bd575f90610389575b6103859060405190602082015260208152610371604082610759565b604051918291602083526020830190610833565b0390f35b506020813d6020116103b5575b816103a360209383610759565b81010312610094576103859051610355565b3d9150610396565b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b61042d9161042860405163095ea7b360e01b60208201528660248201525f604482015260448152610422606482610759565b82610878565b610878565b838061020d565b9091506104485750813b15155b8680610205565b600114610441565b50506020813d60201161047e575b8161046b60209383610759565b8101031261009457846101b791516101ad565b3d915061045e565b6302f3451d60e21b5f5260045ffd5b34610094576104a3366107dd565b80516001600160a01b039093169260208083019291820191909103126100945751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa9081156103bd575f916105c1575b5061054a936105586105176020945f94610857565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f198101875286610759565b84519082855af15f513d826105a5575b50501561057157005b6104286105a3936040519063095ea7b360e01b602083015260248201525f604482015260448152610422606482610759565b005b9091506105b95750803b15155b8480610568565b6001146105b2565b90506020813d6020116105ed575b816105dc60209383610759565b81010312610094575161054a610502565b3d91506105cf565b346100945760803660031901126100945761060e61072d565b610616610743565b6044356001600160a01b03811692908390036100945760643567ffffffffffffffff81116100945761064c903690600401610797565b6020815191818082019384920101031261009457515f1981146106b2576105a393604051936323b872dd60e01b602086015260018060a01b0316602485015260448401526064830152606482526106a4608483610759565b6001600160a01b0316610878565b630d550c3b60e11b5f5260045ffd5b34610094576106cf366107dd565b602081939293519181808201938492010103126100945751905f1982146106b25760405163a9059cbb60e01b60208201526001600160a01b039390931660248401526044808401929092529082526105a391906106a4606483610759565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff8211176103c857604052565b67ffffffffffffffff81116103c857601f01601f191660200190565b81601f82011215610094578035906107ae8261077b565b926107bc6040519485610759565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff82116100945761083091600401610797565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9190820180921161086457565b634e487b7160e01b5f52601160045260245ffd5b905f602091828151910182855af1156103bd575f513d6108c757506001600160a01b0381163b155b6108a75750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156108a0565b91818302915f198185099383808610950394808603951461096057848311156109485790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b5050809250156103dc57049056fea2646970667358221220f6000c9f1bdef97179fd0d632833ccb7f8eb8b0c4e5d5beef7139a47675404a964736f6c634300081b00330000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0xc7f", + "chainId": "0x66eee" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xf4d740f8b40579b2845737dc420c0505335f96513db13a0c38a4762b7076dac4", + "transactionType": "CREATE", + "contractName": "OdosV2AdapterV2", + "contractAddress": "0x03f45de2ab1b976e27acbaa4a9945e5ea7f4ed32", + "function": null, + "arguments": [ + "0x0000000000000000000000000000000000000000" + ], + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "gas": "0xcbaf9", + "value": "0x0", + "input": "0x60c034607a57601f610b1438819003918201601f19168301916001600160401b03831184841017607e57808492602094604052833981010312607a57516001600160a01b03811690819003607a573060805260a052604051610a81908161009382396080518160fd015260a051818181606501526101610152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146107565780636563c0e91461068a5780639df303251461052a578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b16107c2565b6100b96107d8565b5060443567ffffffffffffffff8111610094576100da90369060040161082c565b60643567ffffffffffffffff8111610094576100fa90369060040161082c565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316301461051b5781516001600160a01b039190911691602080820192820191909103126100945751604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031660248201819052919290602081604481855afa80156104665784905f906104e5575b6101b59250610900565b60405163095ea7b360e01b60208083019182526001600160a01b03861660248401526044808401949094529282529091905f906101f36064856107ee565b83519082865af15f513d826104c9575b505015610485575b505082518301908360208301920361014081126100945760e013610094576040519160e0830183811067ffffffffffffffff82111761047157604052610253602086016108ec565b83526040850151906020840191825261026e606087016108ec565b9360408101948552610282608088016108ec565b966060820197885260a0810151926080830193845260c08201519760a084019889526102b060e084016108ec565b9160c0850192835261010084015167ffffffffffffffff811161009457840181603f82011215610094576020810151906102e982610810565b926102f760405194856107ee565b8284526040828401011161009457815f926040602093018386015e830101526101208401516001600160a01b03811694908590036100945761014001519263ffffffff84168094036100945760209a876103e09461035a5f9a51828d5191610921565b825261036a8351828d5191610921565b83528a52308352604051630ed8d73960e21b815297516001600160a01b0390811660048a0152995160248901529a51891660448801529b518816606487015298516084860152995160a4850152965190941660c483015261014060e48301529096879586948593929091906101448501906108c8565b9161010484015261012483015203925af18015610466575f90610432575b61042e906040519060208201526020815261041a6040826107ee565b6040519182916020835260208301906108c8565b0390f35b506020813d60201161045e575b8161044c602093836107ee565b810103126100945761042e90516103fe565b3d915061043f565b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b6104c2916104bd60405163095ea7b360e01b60208201528560248201525f6044820152604481526104b76064826107ee565b82610955565b610955565b838061020b565b9091506104dd5750813b15155b8680610203565b6001146104d6565b50506020813d602011610513575b81610500602093836107ee565b8101031261009457836101b591516101ab565b3d91506104f3565b6302f3451d60e21b5f5260045ffd5b346100945761053836610872565b80516001600160a01b039093169260208083019291820191909103126100945751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa908115610466575f91610656575b506105df936105ed6105ac6020945f94610900565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f1981018752866107ee565b84519082855af15f513d8261063a575b50501561060657005b6104bd610638936040519063095ea7b360e01b602083015260248201525f6044820152604481526104b76064826107ee565b005b90915061064e5750803b15155b84806105fd565b600114610647565b90506020813d602011610682575b81610671602093836107ee565b8101031261009457516105df610597565b3d9150610664565b34610094576080366003190112610094576106a36107c2565b6106ab6107d8565b6044356001600160a01b03811692908390036100945760643567ffffffffffffffff8111610094576106e190369060040161082c565b6020815191818082019384920101031261009457515f1981146107475761063893604051936323b872dd60e01b602086015260018060a01b0316602485015260448401526064830152606482526107396084836107ee565b6001600160a01b0316610955565b630d550c3b60e11b5f5260045ffd5b346100945761076436610872565b602081939293519181808201938492010103126100945751905f1982146107475760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261063891906107396064836107ee565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff82111761047157604052565b67ffffffffffffffff811161047157601f01601f191660200190565b81601f820112156100945780359061084382610810565b9261085160405194856107ee565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff8211610094576108c59160040161082c565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b51906001600160a01b038216820361009457565b9190820180921161090d57565b634e487b7160e01b5f52601160045260245ffd5b9161092d8183856109ad565b918115610941576108c59309151590610900565b634e487b7160e01b5f52601260045260245ffd5b905f602091828151910182855af115610466575f513d6109a457506001600160a01b0381163b155b6109845750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b6001141561097d565b91818302915f1981850993838086109503948086039514610a3d5784831115610a255790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b50508092501561094157049056fea26469706673582212201a43e03d554ef4508b4ce4929a5e2c8c851ee4de243e12f6b2b1267ec83a42f164736f6c634300081b00330000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0xc80", + "chainId": "0x66eee" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xdcad5f76b99d21a8ba3747106f6a29b5ac04bb3e048b53f0c4d5c6059e86af09", + "transactionType": "CREATE", + "contractName": "PendleSwapV3AdapterV2", + "contractAddress": "0x624e405a53d1f3fcdf52cebae469bfd6472294fa", + "function": null, + "arguments": [ + "0x0000000000000000000000000000000000000000" + ], + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "gas": "0x16a2ee", + "value": "0x0", + "input": "0x60c0604052346100f757604051601f61132138819003918201601f19168301916001600160401b038311848410176100e3578084926020946040528339810103126100f757516001600160a01b038116908190036100f7573060805260405160a081016001600160401b038111828210176100e357655af3107a4000916080916040525f81525f1960208201525f6040820152610100606082015201525f6008555f196009555f600a55610100600b55655af3107a4000600c5560a05260405161122590816100fc82396080518161025d015260a0518181816089015261031d0152f35b634e487b7160e01b5f52604160045260245ffd5b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816309316dd314610b30575080633268263b14610ac45780634ebfc81414610a855780636563c0e9146109b95780639df303251461084e578063e0a80413146101f8578063f66a7749146100bc5763f887ea4014610074575f80fd5b346100b8575f3660031901126100b8576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b346100b8575f3660031901126100b8575f54604051905f6001548060011c91600182169182156101ee575b6020841083146101da5783865285929081156101bb575060011461015c575b61011292500383610cd2565b60ff60025416610150604051938361012e8660ff819716610e04565b60081c6001600160a01b03166020850152608060408501819052840190610d08565b90151560608301520390f35b5060015f90815290917fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b81831061019f57505090602061011292820101610106565b6020919350806001915483858901015201910190918492610187565b6020925061011294915060ff191682840152151560051b820101610106565b634e487b7160e01b5f52602260045260245ffd5b92607f16926100e7565b346100b85760803660031901126100b857610211610d2c565b610219610d42565b60443567ffffffffffffffff81116100b857610239903690600401610d58565b9160643567ffffffffffffffff81116100b85761025a903690600401610d58565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316301461083f5783516001600160a01b0393841694919093169260208083019291820191909103126100b85751916060828051810103126100b85760208201516001600160a01b03811691908290036100b857606060408401519301519460405195630b2339af60e21b8752606087600481875afa968715610508575f976107d2575b50604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316602482018190529590602081604481885afa80156105085788905f9061079c575b6103709250611041565b60405163095ea7b360e01b60208083019182526001600160a01b038a1660248401526044808401949094529282529091905f906103ae606485610cd2565b83519082895af15f513d82610780575b50501561073c575b506103d2818884611151565b90801561072857876103e79309151590611041565b956001600160a01b0316818103610513575050935f606094939261047e9661040d611062565b95818752602087015260408601526104906040519788968795869463640fc23d60e11b86523060048701526024860152604485015260085460648501526009546084850152600a5460a4850152600b5460c4850152600c5460e4850152610140610104850152610144840190610e40565b82810360031901610124840152610ff1565b03925af18015610508576104d3915f916104d7575b505b604051906020820152602081526104bf604082610cd2565b604051918291602083526020830190610d08565b0390f35b6104f9915060603d606011610501575b6104f18183610cd2565b810190610e25565b5050826104a5565b503d6104e7565b6040513d5f823e3d90fd5b9150949391604051630bc4ed8360e21b8152602081600481865afa908115610508575f916106ed575b50156106535750936020600494956040519586809263781c18db60e01b82525afa938415610508575f9461060b575b50905f61057f6105bc9660409695946110d2565b938551968795869485936323f8ef1160e11b855230600486015260018060a01b031660248501526044840152608060648401526084830190610e40565b03925af18015610508575f906105d7575b6104d391506104a7565b506040813d604011610603575b816105f160409383610cd2565b810103126100b8576104d390516105cd565b3d91506105e4565b90929193506020813d60201161064b575b8161062960209383610cd2565b810103126100b85751926001600160a01b03841684036100b85790915f61056b565b3d915061061c565b929190505f6106676060956106a0976110d2565b936106b160405197889687958694631652a23360e21b86523060048701526024860152604485015260a0606485015260a4840190610e40565b828103600319016084840152610ff1565b03925af18015610508576104d3915f916106cc575b506104a7565b6106e5915060603d606011610501576104f18183610cd2565b5050826106c6565b90506020813d602011610720575b8161070860209383610cd2565b810103126100b8575180151581036100b8578761053c565b3d91506106fb565b634e487b7160e01b5f52601260045260245ffd5b61077a9061077460405163095ea7b360e01b60208201528960248201525f60448201526044815261076e606482610cd2565b876110f9565b856110f9565b886103c6565b9091506107945750843b15155b8a806103be565b60011461078d565b50506020813d6020116107ca575b816107b760209383610cd2565b810103126100b857876103709151610366565b3d91506107aa565b9096506060813d606011610837575b816107ee60609383610cd2565b810103126100b85780516001600160a01b038116036100b8576020810151906001600160a01b03821682036100b857604001516001600160a01b038116036100b8579587610307565b3d91506107e1565b6302f3451d60e21b5f5260045ffd5b346100b85761085c36610dae565b80516001600160a01b039093169260208083019291820191909103126100b85751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa908115610508575f91610985575b50610903936109116108d06020945f94611041565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f198101875286610cd2565b84519082855af15f513d82610969575b50501561092a57005b610962610967936040519063095ea7b360e01b602083015260248201525f60448201526044815261095c606482610cd2565b826110f9565b6110f9565b005b90915061097d5750803b15155b8480610921565b600114610976565b90506020813d6020116109b1575b816109a060209383610cd2565b810103126100b857516109036108bb565b3d9150610993565b346100b85760803660031901126100b8576109d2610d2c565b6109da610d42565b6044356001600160a01b03811692908390036100b85760643567ffffffffffffffff81116100b857610a10903690600401610d58565b602081519181808201938492010103126100b857515f198114610a765761096793604051936323b872dd60e01b602086015260018060a01b031660248501526044840152606483015260648252610a68608483610cd2565b6001600160a01b03166110f9565b630d550c3b60e11b5f5260045ffd5b346100b8575f3660031901126100b85760a0600854600954600a54600b5490600c54926040519485526020850152604084015260608301526080820152f35b346100b857610ad236610dae565b602081939293519181808201938492010103126100b85751905f198214610a765760405163a9059cbb60e01b60208201526001600160a01b039390931660248401526044808401929092529082526109679190610a68606483610cd2565b346100b8575f3660031901126100b85760018060a01b0360035416600454915f6007548060011c90600181168015610c31575b6020831081146101da57828552908115610c0d5750600114610baf575b5090610b91816104d3930382610cd2565b60405193849384526020840152606060408401526060830190610d08565b60075f9081527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688939250905b808210610bf357509091508101602001610b91610b80565b919260018160209254838588010152019101909291610bdb565b60ff191660208086019190915291151560051b84019091019150610b919050610b80565b91607f1691610b63565b5f92918154918260011c92600181168015610cc8575b6020851081146101da57848452908115610cab5750600114610c7257505050565b5f9081526020812093945091925b838310610c91575060209250010190565b600181602092949394548385870101520191019190610c80565b915050602093945060ff929192191683830152151560051b010190565b93607f1693610c51565b90601f8019910116810190811067ffffffffffffffff821117610cf457604052565b634e487b7160e01b5f52604160045260245ffd5b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036100b857565b602435906001600160a01b03821682036100b857565b81601f820112156100b85780359067ffffffffffffffff8211610cf45760405192610d8d601f8401601f191660200185610cd2565b828452602083830101116100b857815f926020809301838601378301015290565b60606003198201126100b8576004356001600160a01b03811681036100b857916024356001600160a01b03811681036100b857916044359067ffffffffffffffff82116100b857610e0191600401610d58565b90565b90600b821015610e115752565b634e487b7160e01b5f52602160045260245ffd5b908160609103126100b8578051916040602083015192015190565b60809060018060a01b0381511683526020810151602084015260018060a01b03604082015116604084015260018060a01b03606082015116606084015201519060a06080820152610e9560a082018351610e04565b60208201516001600160a01b031660c08201526040820151608060e083015261010090606090610eca90610120850190610d08565b930151151591015290565b908060208354918281520160208260051b840101935f5260205f20925f905b838210610f0357505050505090565b9091929394601f19828203018452606081528554606082015260018601546080820152600286015460a0820152600386015460ff81166004811015610e115760c08301526001600160a01b03600891821c811660e0840152600488015481166101008401526005880154811661012084015260068801541661014083015260078701546101608301528601546101808083019190915260098701546101a08301526101c0820152600190602090600d90610fd7610fc76101e08301600a8c01610c3b565b82810385840152600b8b01610c3b565b906040600c8b015491015297019401920190939293610ef4565b610e019060018060a01b03600354168152600454602082015260a0604082015261103161102260a083016005610ed5565b82810360608401526006610ed5565b9060808183039101526007610c3b565b9190820180921161104e57565b634e487b7160e01b5f52601160045260245ffd5b6040519060a0820182811067ffffffffffffffff821117610cf457604052815f81525f60208201525f60408201525f606082015260405190608082019082821067ffffffffffffffff831117610cf4576080916040525f83525f6020840152606060408401525f60608401520152565b91906110dc611062565b6001600160a01b0390931680845260208401919091526040830152565b905f602091828151910182855af115610508575f513d61114857506001600160a01b0381163b155b6111285750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b60011415611121565b91818302915f19818509938380861095039480860395146111e157848311156111c95790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b50508092501561072857049056fea2646970667358221220d7c8c2f17efce607284d62466051aec3e13f6f1e6deb7e056420af021f77a8ae64736f6c634300081b00330000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0xc81", + "chainId": "0x66eee" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x3f5d594bfbbd914eb5fefcb4f062797e025aeb4fbe4f902fd585dcdbe0e6aa57", + "transactionType": "CREATE", + "contractName": "ERC4626VaultAdapterV2", + "contractAddress": "0xb50b0c9c835e8f4f9436214f6f5219207c3b58cf", + "function": null, + "arguments": null, + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "gas": "0xb0c56", + "value": "0x0", + "input": "0x60a0806040523460215730608052610900908161002682396080518160aa0152f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146106395780636563c0e91461056d5780639df303251461040d5763e0a8041314610045575f80fd5b346102a35760803660031901126102a35761005e6106a5565b6100666106bb565b9060443567ffffffffffffffff81116102a357610087903690600401610707565b60643567ffffffffffffffff81116102a3576100a7903690600401610707565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630146103fe5781516001600160a01b039182169490911691602080820192820191909103126102a35751926060838051810103126102a35760208301519260028410156102a357606060408201519101519061012f81878461082c565b9080156103ea578661014493091515906107b3565b92806103525750604051636eb1769f60e11b815230600482015260248101839052602081604481855afa9081156102af575f9161031a575b50846020939261018f5f976044946107b3565b60405163095ea7b360e01b8782019081526001600160a01b038716602483015260448083019390935291815290869089906101cb6064856106d1565b83519082865af188513d826102fb575b5050156102ba575b50506040519586938492636e553f6560e01b845260048401523060248401525af19182156102af575f92610277575b50818181106102625750505b60408051602081019283526020815261023782826106d1565b8151928391602083525180918160208501528484015e5f828201840152601f01601f19168101030190f35b63eb7f211d60e01b5f5260045260245260445ffd5b9091506020813d6020116102a7575b81610293602093836106d1565b810103126102a35751905f610212565b5f80fd5b3d9150610286565b6040513d5f823e3d90fd5b6102f4916102ef60405163095ea7b360e01b898201528760248201528a878201528681526102e96064826106d1565b826107d4565b6107d4565b5f806101e3565b9091501589146103125750813b15155b5f806101db565b60011461030b565b90506020929192813d60201161034a575b81610338602093836106d1565b810103126102a357519091908461017c565b3d915061032b565b909391506001036103db575f9260646020926040519586938492635d043b2960e11b845260048401523060248401523060448401525af19182156102af575f926103a7575b508181811061026257505061021e565b9091506020813d6020116103d3575b816103c3602093836106d1565b810103126102a35751905f610397565b3d91506103b6565b634a7f394f60e01b5f5260045ffd5b634e487b7160e01b5f52601260045260245ffd5b6302f3451d60e21b5f5260045ffd5b346102a35761041b3661075d565b80516001600160a01b039093169260208083019291820191909103126102a35751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa9081156102af575f91610539575b506104c2936104d061048f6020945f946107b3565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f1981018752866106d1565b84519082855af15f513d8261051d575b5050156104e957005b6102ef61051b936040519063095ea7b360e01b602083015260248201525f6044820152604481526102e96064826106d1565b005b9091506105315750803b15155b84806104e0565b60011461052a565b90506020813d602011610565575b81610554602093836106d1565b810103126102a357516104c261047a565b3d9150610547565b346102a35760803660031901126102a3576105866106a5565b61058e6106bb565b6044356001600160a01b03811692908390036102a35760643567ffffffffffffffff81116102a3576105c4903690600401610707565b602081519181808201938492010103126102a357515f19811461062a5761051b93604051936323b872dd60e01b602086015260018060a01b03166024850152604484015260648301526064825261061c6084836106d1565b6001600160a01b03166107d4565b630d550c3b60e11b5f5260045ffd5b346102a3576106473661075d565b602081939293519181808201938492010103126102a35751905f19821461062a5760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261051b919061061c6064836106d1565b600435906001600160a01b03821682036102a357565b602435906001600160a01b03821682036102a357565b90601f8019910116810190811067ffffffffffffffff8211176106f357604052565b634e487b7160e01b5f52604160045260245ffd5b81601f820112156102a35780359067ffffffffffffffff82116106f3576040519261073c601f8401601f1916602001856106d1565b828452602083830101116102a357815f926020809301838601378301015290565b60606003198201126102a3576004356001600160a01b03811681036102a357916024356001600160a01b03811681036102a357916044359067ffffffffffffffff82116102a3576107b091600401610707565b90565b919082018092116107c057565b634e487b7160e01b5f52601160045260245ffd5b905f602091828151910182855af1156102af575f513d61082357506001600160a01b0381163b155b6108035750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156107fc565b91818302915f19818509938380861095039480860395146108bc57848311156108a45790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b5050809250156103ea57049056fea2646970667358221220b9f441923fe75e1f6e0f37bda35dde1cbac73c1e69240288bd35172a90f8e35164736f6c634300081b0033", + "nonce": "0xc82", + "chainId": "0x66eee" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x9ff65dedade293e16b745bc1ce54fed43f299d59f8d411197b042d21d9861cae", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0x0709f8b7bdea284c7352a5b12505f3d70bf9c21b", + "function": null, + "arguments": null, + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0x0709f8b7bdea284c7352a5b12505f3d70bf9c21b", + "gas": "0x14c09", + "value": "0x0", + "input": "0xb6b07b8e0000000000000000000000009c9832dd2ead3d0752a22acd50b112fd36e063b500000000000000000000000032d60d4a462f5a4b145aa225643e5066aec1611b0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xc83", + "chainId": "0x66eee" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xae9bbc6d4e0d728526ae0d84f9b74788dccd1cd47df8f256c8bf8d35672959ff", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0x0709f8b7bdea284c7352a5b12505f3d70bf9c21b", + "function": null, + "arguments": null, + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0x0709f8b7bdea284c7352a5b12505f3d70bf9c21b", + "gas": "0x14c09", + "value": "0x0", + "input": "0xb6b07b8e0000000000000000000000009c9832dd2ead3d0752a22acd50b112fd36e063b500000000000000000000000003f45de2ab1b976e27acbaa4a9945e5ea7f4ed320000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xc84", + "chainId": "0x66eee" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xb8c77dd22717d8fb4bb15cdf59204014ecc7060878bb115587ec0745a46852e1", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0x0709f8b7bdea284c7352a5b12505f3d70bf9c21b", + "function": null, + "arguments": null, + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0x0709f8b7bdea284c7352a5b12505f3d70bf9c21b", + "gas": "0x14c09", + "value": "0x0", + "input": "0xb6b07b8e0000000000000000000000009c9832dd2ead3d0752a22acd50b112fd36e063b5000000000000000000000000624e405a53d1f3fcdf52cebae469bfd6472294fa0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xc85", + "chainId": "0x66eee" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x7830ce9eac36e7ebd3f86ffdf0a65af7ac7a2b35206578bb3eee85eddbee9f26", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0x0709f8b7bdea284c7352a5b12505f3d70bf9c21b", + "function": null, + "arguments": null, + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0x0709f8b7bdea284c7352a5b12505f3d70bf9c21b", + "gas": "0x14c09", + "value": "0x0", + "input": "0xb6b07b8e0000000000000000000000009c9832dd2ead3d0752a22acd50b112fd36e063b5000000000000000000000000b50b0c9c835e8f4f9436214f6f5219207c3b58cf0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0xc86", + "chainId": "0x66eee" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x134d54", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x23d0595a78fe1792e0fa2938c52af24df12ee20e6740a1057287b3e2aa76890b", + "transactionIndex": "0x2", + "blockHash": "0xe6b68fb89def57c5d3a6e1e67987a06e4cf945e08130cd7c0749d002febe1c76", + "blockNumber": "0x9fec298", + "gasUsed": "0x8f852", + "effectiveGasPrice": "0x5f5e100", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": null, + "contractAddress": "0x32d60d4a462f5a4b145aa225643e5066aec1611b", + "gasUsedForL1": "0x0", + "l1BlockNumber": "0x83d136", + "timeboosted": false + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xb708c", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xf4d740f8b40579b2845737dc420c0505335f96513db13a0c38a4762b7076dac4", + "transactionIndex": "0x2", + "blockHash": "0xffd60c91a90fb9bc6336e4850d04a8211359b80ab12a9339ce22ab75ae3d373f", + "blockNumber": "0x9fec2a0", + "gasUsed": "0x9b2a4", + "effectiveGasPrice": "0x5f5e100", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": null, + "contractAddress": "0x03f45de2ab1b976e27acbaa4a9945e5ea7f4ed32", + "gasUsedForL1": "0x0", + "l1BlockNumber": "0x83d136", + "timeboosted": false + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x13b4bf", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xdcad5f76b99d21a8ba3747106f6a29b5ac04bb3e048b53f0c4d5c6059e86af09", + "transactionIndex": "0x3", + "blockHash": "0x217f810ff1e7144d796949c6ea1c4d6211f428e766fb4c8e42427e01d6ffd992", + "blockNumber": "0x9fec2a9", + "gasUsed": "0x114204", + "effectiveGasPrice": "0x5f5e100", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": null, + "contractAddress": "0x624e405a53d1f3fcdf52cebae469bfd6472294fa", + "gasUsedForL1": "0x0", + "l1BlockNumber": "0x83d136", + "timeboosted": false + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x869fd", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x3f5d594bfbbd914eb5fefcb4f062797e025aeb4fbe4f902fd585dcdbe0e6aa57", + "transactionIndex": "0x1", + "blockHash": "0xe3ad43cf645eedbd1b1d916be7f3352161e39dd61791603c822a95b2f5ef1adf", + "blockNumber": "0x9fec2b1", + "gasUsed": "0x869fd", + "effectiveGasPrice": "0x5f5e100", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": null, + "contractAddress": "0xb50b0c9c835e8f4f9436214f6f5219207c3b58cf", + "gasUsedForL1": "0x0", + "l1BlockNumber": "0x83d136", + "timeboosted": false + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x2b10d", + "logs": [ + { + "address": "0x9c9832dd2ead3d0752a22acd50b112fd36e063b5", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x00000000000000000000000032d60d4a462f5a4b145aa225643e5066aec1611b0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x140321df400970d98ed65331a8949656950f7dca0905a6ae8f2c54fedddd62f9", + "blockNumber": "0x9fec2ba", + "transactionHash": "0x9ff65dedade293e16b745bc1ce54fed43f299d59f8d411197b042d21d9861cae", + "transactionIndex": "0x2", + "logIndex": "0x3", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000800000100000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000008000000000000000000000", + "type": "0x2", + "transactionHash": "0x9ff65dedade293e16b745bc1ce54fed43f299d59f8d411197b042d21d9861cae", + "transactionIndex": "0x2", + "blockHash": "0x140321df400970d98ed65331a8949656950f7dca0905a6ae8f2c54fedddd62f9", + "blockNumber": "0x9fec2ba", + "gasUsed": "0xf8e1", + "effectiveGasPrice": "0x5f5e100", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0x0709f8b7bdea284c7352a5b12505f3d70bf9c21b", + "contractAddress": null, + "gasUsedForL1": "0x0", + "l1BlockNumber": "0x83d136", + "timeboosted": false + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xe0eee", + "logs": [ + { + "address": "0x9c9832dd2ead3d0752a22acd50b112fd36e063b5", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x00000000000000000000000003f45de2ab1b976e27acbaa4a9945e5ea7f4ed320000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x9a76221447a2ffe4958a9912512df765cf53b578bb00f434d0002ce3f0d57b8a", + "blockNumber": "0x9fec2c1", + "transactionHash": "0xae9bbc6d4e0d728526ae0d84f9b74788dccd1cd47df8f256c8bf8d35672959ff", + "transactionIndex": "0x6", + "logIndex": "0x1b", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000800000100000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000008000000000000000000000", + "type": "0x2", + "transactionHash": "0xae9bbc6d4e0d728526ae0d84f9b74788dccd1cd47df8f256c8bf8d35672959ff", + "transactionIndex": "0x6", + "blockHash": "0x9a76221447a2ffe4958a9912512df765cf53b578bb00f434d0002ce3f0d57b8a", + "blockNumber": "0x9fec2c1", + "gasUsed": "0xf8e1", + "effectiveGasPrice": "0x5f5e100", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0x0709f8b7bdea284c7352a5b12505f3d70bf9c21b", + "contractAddress": null, + "gasUsedForL1": "0x0", + "l1BlockNumber": "0x83d136", + "timeboosted": false + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x2b6c9", + "logs": [ + { + "address": "0x9c9832dd2ead3d0752a22acd50b112fd36e063b5", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x000000000000000000000000624e405a53d1f3fcdf52cebae469bfd6472294fa0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xc1f5d3b7953e154d4eac02ecae9660219590847b01ed909b5707d9b4eea7b4eb", + "blockNumber": "0x9fec2c9", + "transactionHash": "0xb8c77dd22717d8fb4bb15cdf59204014ecc7060878bb115587ec0745a46852e1", + "transactionIndex": "0x2", + "logIndex": "0x4", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000800000100000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000008000000000000000000000", + "type": "0x2", + "transactionHash": "0xb8c77dd22717d8fb4bb15cdf59204014ecc7060878bb115587ec0745a46852e1", + "transactionIndex": "0x2", + "blockHash": "0xc1f5d3b7953e154d4eac02ecae9660219590847b01ed909b5707d9b4eea7b4eb", + "blockNumber": "0x9fec2c9", + "gasUsed": "0xf8e1", + "effectiveGasPrice": "0x5f5e100", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0x0709f8b7bdea284c7352a5b12505f3d70bf9c21b", + "contractAddress": null, + "gasUsedForL1": "0x0", + "l1BlockNumber": "0x83d136", + "timeboosted": false + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xf8e1", + "logs": [ + { + "address": "0x9c9832dd2ead3d0752a22acd50b112fd36e063b5", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x000000000000000000000000b50b0c9c835e8f4f9436214f6f5219207c3b58cf0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x47a029380ae77c5ea4fd8bdfc958473c49dad60c59a7208d4207947869d8f4b7", + "blockNumber": "0x9fec2d1", + "transactionHash": "0x7830ce9eac36e7ebd3f86ffdf0a65af7ac7a2b35206578bb3eee85eddbee9f26", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000800000100000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000008000000000000000000000", + "type": "0x2", + "transactionHash": "0x7830ce9eac36e7ebd3f86ffdf0a65af7ac7a2b35206578bb3eee85eddbee9f26", + "transactionIndex": "0x1", + "blockHash": "0x47a029380ae77c5ea4fd8bdfc958473c49dad60c59a7208d4207947869d8f4b7", + "blockNumber": "0x9fec2d1", + "gasUsed": "0xf8e1", + "effectiveGasPrice": "0x5f5e100", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0x0709f8b7bdea284c7352a5b12505f3d70bf9c21b", + "contractAddress": null, + "gasUsedForL1": "0x0", + "l1BlockNumber": "0x83d137", + "timeboosted": false + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1751010328, + "chain": 421614, + "commit": "23b76ca" +} \ No newline at end of file diff --git a/broadcast/DeployAdapters.s.sol/97/run-1751010534.json b/broadcast/DeployAdapters.s.sol/97/run-1751010534.json new file mode 100644 index 0000000..4bccf33 --- /dev/null +++ b/broadcast/DeployAdapters.s.sol/97/run-1751010534.json @@ -0,0 +1,350 @@ +{ + "transactions": [ + { + "hash": "0xba60b43fa9140f38461326c6c7b67e28c5a813c0ec8f7e581880730b71b6332b", + "transactionType": "CREATE", + "contractName": "UniswapV3AdapterV2", + "contractAddress": "0xc8175570536849923d2a38fdfc33f2ea9ace4134", + "function": null, + "arguments": [ + "0x0000000000000000000000000000000000000000" + ], + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "gas": "0xba937", + "value": "0x0", + "input": "0x60c034607a57601f610a3738819003918201601f19168301916001600160401b03831184841017607e57808492602094604052833981010312607a57516001600160a01b03811690819003607a573060805260a0526040516109a4908161009382396080518160fd015260a051818181606501526101610152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146106c15780636563c0e9146105f55780639df3032514610495578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b161072d565b6100b9610743565b5060443567ffffffffffffffff8111610094576100da903690600401610797565b60643567ffffffffffffffff8111610094576100fa903690600401610797565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630146104865781516001600160a01b039190911691602080820192820191909103126100945751604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316602482018190529193919290602081604481855afa80156103bd5785905f90610450575b6101b79250610857565b60405163095ea7b360e01b60208083019182526001600160a01b03871660248401526044808401949094529282529091905f906101f5606485610759565b83519082865af15f513d82610434575b5050156103f0575b505080518101916080826020850194031261009457602082015167ffffffffffffffff811161009457820183603f82011215610094576020810151906102528261077b565b946102606040519687610759565b8286526040828401011161009457815f926040602093018388015e85010152604082015191608060608201519101519061029b8187846108d0565b9080156103dc57866102b09309151590610857565b9260405160a081019080821067ffffffffffffffff8311176103c857602095610322935f936040528252868201903082526040830196875260608301988952608083019081526040519889978896879563c04b8d5960e01b87528b60048801525160a0602488015260c4870190610833565b93516001600160a01b031660448601525160648501525160848401525160a483015203925af180156103bd575f90610389575b6103859060405190602082015260208152610371604082610759565b604051918291602083526020830190610833565b0390f35b506020813d6020116103b5575b816103a360209383610759565b81010312610094576103859051610355565b3d9150610396565b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b61042d9161042860405163095ea7b360e01b60208201528660248201525f604482015260448152610422606482610759565b82610878565b610878565b838061020d565b9091506104485750813b15155b8680610205565b600114610441565b50506020813d60201161047e575b8161046b60209383610759565b8101031261009457846101b791516101ad565b3d915061045e565b6302f3451d60e21b5f5260045ffd5b34610094576104a3366107dd565b80516001600160a01b039093169260208083019291820191909103126100945751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa9081156103bd575f916105c1575b5061054a936105586105176020945f94610857565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f198101875286610759565b84519082855af15f513d826105a5575b50501561057157005b6104286105a3936040519063095ea7b360e01b602083015260248201525f604482015260448152610422606482610759565b005b9091506105b95750803b15155b8480610568565b6001146105b2565b90506020813d6020116105ed575b816105dc60209383610759565b81010312610094575161054a610502565b3d91506105cf565b346100945760803660031901126100945761060e61072d565b610616610743565b6044356001600160a01b03811692908390036100945760643567ffffffffffffffff81116100945761064c903690600401610797565b6020815191818082019384920101031261009457515f1981146106b2576105a393604051936323b872dd60e01b602086015260018060a01b0316602485015260448401526064830152606482526106a4608483610759565b6001600160a01b0316610878565b630d550c3b60e11b5f5260045ffd5b34610094576106cf366107dd565b602081939293519181808201938492010103126100945751905f1982146106b25760405163a9059cbb60e01b60208201526001600160a01b039390931660248401526044808401929092529082526105a391906106a4606483610759565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff8211176103c857604052565b67ffffffffffffffff81116103c857601f01601f191660200190565b81601f82011215610094578035906107ae8261077b565b926107bc6040519485610759565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff82116100945761083091600401610797565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9190820180921161086457565b634e487b7160e01b5f52601160045260245ffd5b905f602091828151910182855af1156103bd575f513d6108c757506001600160a01b0381163b155b6108a75750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156108a0565b91818302915f198185099383808610950394808603951461096057848311156109485790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b5050809250156103dc57049056fea2646970667358221220f6000c9f1bdef97179fd0d632833ccb7f8eb8b0c4e5d5beef7139a47675404a964736f6c634300081b00330000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x30", + "chainId": "0x61" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x94b7e404499a97ab65c21dfaf519c3a3bb7c4e649ba12e019844f50c9794d472", + "transactionType": "CREATE", + "contractName": "OdosV2AdapterV2", + "contractAddress": "0x55f73c3d6f90e0858423a813969270d735ff0015", + "function": null, + "arguments": [ + "0x0000000000000000000000000000000000000000" + ], + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "gas": "0xc9b6e", + "value": "0x0", + "input": "0x60c034607a57601f610b1438819003918201601f19168301916001600160401b03831184841017607e57808492602094604052833981010312607a57516001600160a01b03811690819003607a573060805260a052604051610a81908161009382396080518160fd015260a051818181606501526101610152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146107565780636563c0e91461068a5780639df303251461052a578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b16107c2565b6100b96107d8565b5060443567ffffffffffffffff8111610094576100da90369060040161082c565b60643567ffffffffffffffff8111610094576100fa90369060040161082c565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316301461051b5781516001600160a01b039190911691602080820192820191909103126100945751604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031660248201819052919290602081604481855afa80156104665784905f906104e5575b6101b59250610900565b60405163095ea7b360e01b60208083019182526001600160a01b03861660248401526044808401949094529282529091905f906101f36064856107ee565b83519082865af15f513d826104c9575b505015610485575b505082518301908360208301920361014081126100945760e013610094576040519160e0830183811067ffffffffffffffff82111761047157604052610253602086016108ec565b83526040850151906020840191825261026e606087016108ec565b9360408101948552610282608088016108ec565b966060820197885260a0810151926080830193845260c08201519760a084019889526102b060e084016108ec565b9160c0850192835261010084015167ffffffffffffffff811161009457840181603f82011215610094576020810151906102e982610810565b926102f760405194856107ee565b8284526040828401011161009457815f926040602093018386015e830101526101208401516001600160a01b03811694908590036100945761014001519263ffffffff84168094036100945760209a876103e09461035a5f9a51828d5191610921565b825261036a8351828d5191610921565b83528a52308352604051630ed8d73960e21b815297516001600160a01b0390811660048a0152995160248901529a51891660448801529b518816606487015298516084860152995160a4850152965190941660c483015261014060e48301529096879586948593929091906101448501906108c8565b9161010484015261012483015203925af18015610466575f90610432575b61042e906040519060208201526020815261041a6040826107ee565b6040519182916020835260208301906108c8565b0390f35b506020813d60201161045e575b8161044c602093836107ee565b810103126100945761042e90516103fe565b3d915061043f565b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b6104c2916104bd60405163095ea7b360e01b60208201528560248201525f6044820152604481526104b76064826107ee565b82610955565b610955565b838061020b565b9091506104dd5750813b15155b8680610203565b6001146104d6565b50506020813d602011610513575b81610500602093836107ee565b8101031261009457836101b591516101ab565b3d91506104f3565b6302f3451d60e21b5f5260045ffd5b346100945761053836610872565b80516001600160a01b039093169260208083019291820191909103126100945751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa908115610466575f91610656575b506105df936105ed6105ac6020945f94610900565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f1981018752866107ee565b84519082855af15f513d8261063a575b50501561060657005b6104bd610638936040519063095ea7b360e01b602083015260248201525f6044820152604481526104b76064826107ee565b005b90915061064e5750803b15155b84806105fd565b600114610647565b90506020813d602011610682575b81610671602093836107ee565b8101031261009457516105df610597565b3d9150610664565b34610094576080366003190112610094576106a36107c2565b6106ab6107d8565b6044356001600160a01b03811692908390036100945760643567ffffffffffffffff8111610094576106e190369060040161082c565b6020815191818082019384920101031261009457515f1981146107475761063893604051936323b872dd60e01b602086015260018060a01b0316602485015260448401526064830152606482526107396084836107ee565b6001600160a01b0316610955565b630d550c3b60e11b5f5260045ffd5b346100945761076436610872565b602081939293519181808201938492010103126100945751905f1982146107475760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261063891906107396064836107ee565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff82111761047157604052565b67ffffffffffffffff811161047157601f01601f191660200190565b81601f820112156100945780359061084382610810565b9261085160405194856107ee565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff8211610094576108c59160040161082c565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b51906001600160a01b038216820361009457565b9190820180921161090d57565b634e487b7160e01b5f52601160045260245ffd5b9161092d8183856109ad565b918115610941576108c59309151590610900565b634e487b7160e01b5f52601260045260245ffd5b905f602091828151910182855af115610466575f513d6109a457506001600160a01b0381163b155b6109845750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b6001141561097d565b91818302915f1981850993838086109503948086039514610a3d5784831115610a255790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b50508092501561094157049056fea26469706673582212201a43e03d554ef4508b4ce4929a5e2c8c851ee4de243e12f6b2b1267ec83a42f164736f6c634300081b00330000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x31", + "chainId": "0x61" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xeee1e911e60cec84f21e5942d1a5241a2717f8294818e959da6c1877ce2153ea", + "transactionType": "CREATE", + "contractName": "PendleSwapV3AdapterV2", + "contractAddress": "0x7d799fe4ea4b4fea5ba8545f2b4f04f0c151b2ac", + "function": null, + "arguments": [ + "0x0000000000000000000000000000000000000000" + ], + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "gas": "0x166f6b", + "value": "0x0", + "input": "0x60c0604052346100f757604051601f61132138819003918201601f19168301916001600160401b038311848410176100e3578084926020946040528339810103126100f757516001600160a01b038116908190036100f7573060805260405160a081016001600160401b038111828210176100e357655af3107a4000916080916040525f81525f1960208201525f6040820152610100606082015201525f6008555f196009555f600a55610100600b55655af3107a4000600c5560a05260405161122590816100fc82396080518161025d015260a0518181816089015261031d0152f35b634e487b7160e01b5f52604160045260245ffd5b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816309316dd314610b30575080633268263b14610ac45780634ebfc81414610a855780636563c0e9146109b95780639df303251461084e578063e0a80413146101f8578063f66a7749146100bc5763f887ea4014610074575f80fd5b346100b8575f3660031901126100b8576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b346100b8575f3660031901126100b8575f54604051905f6001548060011c91600182169182156101ee575b6020841083146101da5783865285929081156101bb575060011461015c575b61011292500383610cd2565b60ff60025416610150604051938361012e8660ff819716610e04565b60081c6001600160a01b03166020850152608060408501819052840190610d08565b90151560608301520390f35b5060015f90815290917fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b81831061019f57505090602061011292820101610106565b6020919350806001915483858901015201910190918492610187565b6020925061011294915060ff191682840152151560051b820101610106565b634e487b7160e01b5f52602260045260245ffd5b92607f16926100e7565b346100b85760803660031901126100b857610211610d2c565b610219610d42565b60443567ffffffffffffffff81116100b857610239903690600401610d58565b9160643567ffffffffffffffff81116100b85761025a903690600401610d58565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316301461083f5783516001600160a01b0393841694919093169260208083019291820191909103126100b85751916060828051810103126100b85760208201516001600160a01b03811691908290036100b857606060408401519301519460405195630b2339af60e21b8752606087600481875afa968715610508575f976107d2575b50604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316602482018190529590602081604481885afa80156105085788905f9061079c575b6103709250611041565b60405163095ea7b360e01b60208083019182526001600160a01b038a1660248401526044808401949094529282529091905f906103ae606485610cd2565b83519082895af15f513d82610780575b50501561073c575b506103d2818884611151565b90801561072857876103e79309151590611041565b956001600160a01b0316818103610513575050935f606094939261047e9661040d611062565b95818752602087015260408601526104906040519788968795869463640fc23d60e11b86523060048701526024860152604485015260085460648501526009546084850152600a5460a4850152600b5460c4850152600c5460e4850152610140610104850152610144840190610e40565b82810360031901610124840152610ff1565b03925af18015610508576104d3915f916104d7575b505b604051906020820152602081526104bf604082610cd2565b604051918291602083526020830190610d08565b0390f35b6104f9915060603d606011610501575b6104f18183610cd2565b810190610e25565b5050826104a5565b503d6104e7565b6040513d5f823e3d90fd5b9150949391604051630bc4ed8360e21b8152602081600481865afa908115610508575f916106ed575b50156106535750936020600494956040519586809263781c18db60e01b82525afa938415610508575f9461060b575b50905f61057f6105bc9660409695946110d2565b938551968795869485936323f8ef1160e11b855230600486015260018060a01b031660248501526044840152608060648401526084830190610e40565b03925af18015610508575f906105d7575b6104d391506104a7565b506040813d604011610603575b816105f160409383610cd2565b810103126100b8576104d390516105cd565b3d91506105e4565b90929193506020813d60201161064b575b8161062960209383610cd2565b810103126100b85751926001600160a01b03841684036100b85790915f61056b565b3d915061061c565b929190505f6106676060956106a0976110d2565b936106b160405197889687958694631652a23360e21b86523060048701526024860152604485015260a0606485015260a4840190610e40565b828103600319016084840152610ff1565b03925af18015610508576104d3915f916106cc575b506104a7565b6106e5915060603d606011610501576104f18183610cd2565b5050826106c6565b90506020813d602011610720575b8161070860209383610cd2565b810103126100b8575180151581036100b8578761053c565b3d91506106fb565b634e487b7160e01b5f52601260045260245ffd5b61077a9061077460405163095ea7b360e01b60208201528960248201525f60448201526044815261076e606482610cd2565b876110f9565b856110f9565b886103c6565b9091506107945750843b15155b8a806103be565b60011461078d565b50506020813d6020116107ca575b816107b760209383610cd2565b810103126100b857876103709151610366565b3d91506107aa565b9096506060813d606011610837575b816107ee60609383610cd2565b810103126100b85780516001600160a01b038116036100b8576020810151906001600160a01b03821682036100b857604001516001600160a01b038116036100b8579587610307565b3d91506107e1565b6302f3451d60e21b5f5260045ffd5b346100b85761085c36610dae565b80516001600160a01b039093169260208083019291820191909103126100b85751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa908115610508575f91610985575b50610903936109116108d06020945f94611041565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f198101875286610cd2565b84519082855af15f513d82610969575b50501561092a57005b610962610967936040519063095ea7b360e01b602083015260248201525f60448201526044815261095c606482610cd2565b826110f9565b6110f9565b005b90915061097d5750803b15155b8480610921565b600114610976565b90506020813d6020116109b1575b816109a060209383610cd2565b810103126100b857516109036108bb565b3d9150610993565b346100b85760803660031901126100b8576109d2610d2c565b6109da610d42565b6044356001600160a01b03811692908390036100b85760643567ffffffffffffffff81116100b857610a10903690600401610d58565b602081519181808201938492010103126100b857515f198114610a765761096793604051936323b872dd60e01b602086015260018060a01b031660248501526044840152606483015260648252610a68608483610cd2565b6001600160a01b03166110f9565b630d550c3b60e11b5f5260045ffd5b346100b8575f3660031901126100b85760a0600854600954600a54600b5490600c54926040519485526020850152604084015260608301526080820152f35b346100b857610ad236610dae565b602081939293519181808201938492010103126100b85751905f198214610a765760405163a9059cbb60e01b60208201526001600160a01b039390931660248401526044808401929092529082526109679190610a68606483610cd2565b346100b8575f3660031901126100b85760018060a01b0360035416600454915f6007548060011c90600181168015610c31575b6020831081146101da57828552908115610c0d5750600114610baf575b5090610b91816104d3930382610cd2565b60405193849384526020840152606060408401526060830190610d08565b60075f9081527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688939250905b808210610bf357509091508101602001610b91610b80565b919260018160209254838588010152019101909291610bdb565b60ff191660208086019190915291151560051b84019091019150610b919050610b80565b91607f1691610b63565b5f92918154918260011c92600181168015610cc8575b6020851081146101da57848452908115610cab5750600114610c7257505050565b5f9081526020812093945091925b838310610c91575060209250010190565b600181602092949394548385870101520191019190610c80565b915050602093945060ff929192191683830152151560051b010190565b93607f1693610c51565b90601f8019910116810190811067ffffffffffffffff821117610cf457604052565b634e487b7160e01b5f52604160045260245ffd5b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036100b857565b602435906001600160a01b03821682036100b857565b81601f820112156100b85780359067ffffffffffffffff8211610cf45760405192610d8d601f8401601f191660200185610cd2565b828452602083830101116100b857815f926020809301838601378301015290565b60606003198201126100b8576004356001600160a01b03811681036100b857916024356001600160a01b03811681036100b857916044359067ffffffffffffffff82116100b857610e0191600401610d58565b90565b90600b821015610e115752565b634e487b7160e01b5f52602160045260245ffd5b908160609103126100b8578051916040602083015192015190565b60809060018060a01b0381511683526020810151602084015260018060a01b03604082015116604084015260018060a01b03606082015116606084015201519060a06080820152610e9560a082018351610e04565b60208201516001600160a01b031660c08201526040820151608060e083015261010090606090610eca90610120850190610d08565b930151151591015290565b908060208354918281520160208260051b840101935f5260205f20925f905b838210610f0357505050505090565b9091929394601f19828203018452606081528554606082015260018601546080820152600286015460a0820152600386015460ff81166004811015610e115760c08301526001600160a01b03600891821c811660e0840152600488015481166101008401526005880154811661012084015260068801541661014083015260078701546101608301528601546101808083019190915260098701546101a08301526101c0820152600190602090600d90610fd7610fc76101e08301600a8c01610c3b565b82810385840152600b8b01610c3b565b906040600c8b015491015297019401920190939293610ef4565b610e019060018060a01b03600354168152600454602082015260a0604082015261103161102260a083016005610ed5565b82810360608401526006610ed5565b9060808183039101526007610c3b565b9190820180921161104e57565b634e487b7160e01b5f52601160045260245ffd5b6040519060a0820182811067ffffffffffffffff821117610cf457604052815f81525f60208201525f60408201525f606082015260405190608082019082821067ffffffffffffffff831117610cf4576080916040525f83525f6020840152606060408401525f60608401520152565b91906110dc611062565b6001600160a01b0390931680845260208401919091526040830152565b905f602091828151910182855af115610508575f513d61114857506001600160a01b0381163b155b6111285750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b60011415611121565b91818302915f19818509938380861095039480860395146111e157848311156111c95790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b50508092501561072857049056fea2646970667358221220d7c8c2f17efce607284d62466051aec3e13f6f1e6deb7e056420af021f77a8ae64736f6c634300081b00330000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x32", + "chainId": "0x61" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x1e6a0ea37630efac2d8a94689260a6d137bfe6fa660df6ed543b620e1e936fc1", + "transactionType": "CREATE", + "contractName": "ERC4626VaultAdapterV2", + "contractAddress": "0xae3c3a1677ec9f061c768edd6c0d50a6a67f4656", + "function": null, + "arguments": null, + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "gas": "0xaf02f", + "value": "0x0", + "input": "0x60a0806040523460215730608052610900908161002682396080518160aa0152f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146106395780636563c0e91461056d5780639df303251461040d5763e0a8041314610045575f80fd5b346102a35760803660031901126102a35761005e6106a5565b6100666106bb565b9060443567ffffffffffffffff81116102a357610087903690600401610707565b60643567ffffffffffffffff81116102a3576100a7903690600401610707565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630146103fe5781516001600160a01b039182169490911691602080820192820191909103126102a35751926060838051810103126102a35760208301519260028410156102a357606060408201519101519061012f81878461082c565b9080156103ea578661014493091515906107b3565b92806103525750604051636eb1769f60e11b815230600482015260248101839052602081604481855afa9081156102af575f9161031a575b50846020939261018f5f976044946107b3565b60405163095ea7b360e01b8782019081526001600160a01b038716602483015260448083019390935291815290869089906101cb6064856106d1565b83519082865af188513d826102fb575b5050156102ba575b50506040519586938492636e553f6560e01b845260048401523060248401525af19182156102af575f92610277575b50818181106102625750505b60408051602081019283526020815261023782826106d1565b8151928391602083525180918160208501528484015e5f828201840152601f01601f19168101030190f35b63eb7f211d60e01b5f5260045260245260445ffd5b9091506020813d6020116102a7575b81610293602093836106d1565b810103126102a35751905f610212565b5f80fd5b3d9150610286565b6040513d5f823e3d90fd5b6102f4916102ef60405163095ea7b360e01b898201528760248201528a878201528681526102e96064826106d1565b826107d4565b6107d4565b5f806101e3565b9091501589146103125750813b15155b5f806101db565b60011461030b565b90506020929192813d60201161034a575b81610338602093836106d1565b810103126102a357519091908461017c565b3d915061032b565b909391506001036103db575f9260646020926040519586938492635d043b2960e11b845260048401523060248401523060448401525af19182156102af575f926103a7575b508181811061026257505061021e565b9091506020813d6020116103d3575b816103c3602093836106d1565b810103126102a35751905f610397565b3d91506103b6565b634a7f394f60e01b5f5260045ffd5b634e487b7160e01b5f52601260045260245ffd5b6302f3451d60e21b5f5260045ffd5b346102a35761041b3661075d565b80516001600160a01b039093169260208083019291820191909103126102a35751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa9081156102af575f91610539575b506104c2936104d061048f6020945f946107b3565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f1981018752866106d1565b84519082855af15f513d8261051d575b5050156104e957005b6102ef61051b936040519063095ea7b360e01b602083015260248201525f6044820152604481526102e96064826106d1565b005b9091506105315750803b15155b84806104e0565b60011461052a565b90506020813d602011610565575b81610554602093836106d1565b810103126102a357516104c261047a565b3d9150610547565b346102a35760803660031901126102a3576105866106a5565b61058e6106bb565b6044356001600160a01b03811692908390036102a35760643567ffffffffffffffff81116102a3576105c4903690600401610707565b602081519181808201938492010103126102a357515f19811461062a5761051b93604051936323b872dd60e01b602086015260018060a01b03166024850152604484015260648301526064825261061c6084836106d1565b6001600160a01b03166107d4565b630d550c3b60e11b5f5260045ffd5b346102a3576106473661075d565b602081939293519181808201938492010103126102a35751905f19821461062a5760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261051b919061061c6064836106d1565b600435906001600160a01b03821682036102a357565b602435906001600160a01b03821682036102a357565b90601f8019910116810190811067ffffffffffffffff8211176106f357604052565b634e487b7160e01b5f52604160045260245ffd5b81601f820112156102a35780359067ffffffffffffffff82116106f3576040519261073c601f8401601f1916602001856106d1565b828452602083830101116102a357815f926020809301838601378301015290565b60606003198201126102a3576004356001600160a01b03811681036102a357916024356001600160a01b03811681036102a357916044359067ffffffffffffffff82116102a3576107b091600401610707565b90565b919082018092116107c057565b634e487b7160e01b5f52601160045260245ffd5b905f602091828151910182855af1156102af575f513d61082357506001600160a01b0381163b155b6108035750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156107fc565b91818302915f19818509938380861095039480860395146108bc57848311156108a45790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b5050809250156103ea57049056fea2646970667358221220b9f441923fe75e1f6e0f37bda35dde1cbac73c1e69240288bd35172a90f8e35164736f6c634300081b0033", + "nonce": "0x33", + "chainId": "0x61" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x10f912a74a9ba8e7cc6236a0036edc34bdf516c9e1edd07e8b58f0b7f9ace78e", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0xf28546cfbbbb0474aa77ec692e35abebb6ba98e1", + "function": null, + "arguments": null, + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0xf28546cfbbbb0474aa77ec692e35abebb6ba98e1", + "gas": "0x16bfc", + "value": "0x0", + "input": "0xb6b07b8e000000000000000000000000fe1dfce548e8aebe2964d5c0c9906fce981d7e47000000000000000000000000c8175570536849923d2a38fdfc33f2ea9ace41340000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x34", + "chainId": "0x61" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x5d3e796e8811e1449d7defe88ab0018e0599377032e4d2922c34ac78616191bd", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0xf28546cfbbbb0474aa77ec692e35abebb6ba98e1", + "function": null, + "arguments": null, + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0xf28546cfbbbb0474aa77ec692e35abebb6ba98e1", + "gas": "0x157b2", + "value": "0x0", + "input": "0xb6b07b8e000000000000000000000000fe1dfce548e8aebe2964d5c0c9906fce981d7e4700000000000000000000000055f73c3d6f90e0858423a813969270d735ff00150000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x35", + "chainId": "0x61" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xb565c3e163ae0d7c79fdc372b42fb7a98f11c6f314e709fa005f106162ab95fa", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0xf28546cfbbbb0474aa77ec692e35abebb6ba98e1", + "function": null, + "arguments": null, + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0xf28546cfbbbb0474aa77ec692e35abebb6ba98e1", + "gas": "0x16bfc", + "value": "0x0", + "input": "0xb6b07b8e000000000000000000000000fe1dfce548e8aebe2964d5c0c9906fce981d7e470000000000000000000000007d799fe4ea4b4fea5ba8545f2b4f04f0c151b2ac0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x36", + "chainId": "0x61" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x97a98efb79292bdae9e410fb5d0a08a8253a9c5b40dd752794294258a2e7549a", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0xf28546cfbbbb0474aa77ec692e35abebb6ba98e1", + "function": null, + "arguments": null, + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0xf28546cfbbbb0474aa77ec692e35abebb6ba98e1", + "gas": "0x16bfc", + "value": "0x0", + "input": "0xb6b07b8e000000000000000000000000fe1dfce548e8aebe2964d5c0c9906fce981d7e47000000000000000000000000ae3c3a1677ec9f061c768edd6c0d50a6a67f46560000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x37", + "chainId": "0x61" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x10d561", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xba60b43fa9140f38461326c6c7b67e28c5a813c0ec8f7e581880730b71b6332b", + "transactionIndex": "0x2", + "blockHash": "0xf4b29dfcc1aff6e328a06c7f07ab957b7258085c448d631c9a8038f6b90cf478", + "blockNumber": "0x35a2bb3", + "gasUsed": "0x8f852", + "effectiveGasPrice": "0x5f5e100", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": null, + "contractAddress": "0xc8175570536849923d2a38fdfc33f2ea9ace4134" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xbe116", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x94b7e404499a97ab65c21dfaf519c3a3bb7c4e649ba12e019844f50c9794d472", + "transactionIndex": "0x2", + "blockHash": "0xa8e341316b187d93e6d487d56ae05fc0463549d002fe2d5f9cd0dd4d54b5faf0", + "blockNumber": "0x35a2bb7", + "gasUsed": "0x9b2a4", + "effectiveGasPrice": "0x5f5e100", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": null, + "contractAddress": "0x55f73c3d6f90e0858423a813969270d735ff0015" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x17c22c", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xeee1e911e60cec84f21e5942d1a5241a2717f8294818e959da6c1877ce2153ea", + "transactionIndex": "0x2", + "blockHash": "0x151f08407abf0008ac9f0922683b6f02e1ced3940ddf1bda5ef3e48a58090bea", + "blockNumber": "0x35a2bbc", + "gasUsed": "0x114204", + "effectiveGasPrice": "0x5f5e100", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": null, + "contractAddress": "0x7d799fe4ea4b4fea5ba8545f2b4f04f0c151b2ac" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xcaca3", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x1e6a0ea37630efac2d8a94689260a6d137bfe6fa660df6ed543b620e1e936fc1", + "transactionIndex": "0x2", + "blockHash": "0xc05e334186d449cf7bce02f985cd64bee5bf65a5ed64305c17c061507d0cec5e", + "blockNumber": "0x35a2bbf", + "gasUsed": "0x869fd", + "effectiveGasPrice": "0x5f5e100", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": null, + "contractAddress": "0xae3c3a1677ec9f061c768edd6c0d50a6a67f4656" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xf8e1", + "logs": [ + { + "address": "0xfe1dfce548e8aebe2964d5c0c9906fce981d7e47", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x000000000000000000000000c8175570536849923d2a38fdfc33f2ea9ace41340000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x044c5d2e125ae6bbd630ae8d9d529ae2288d73712158665543bf923e8d76dcd1", + "blockNumber": "0x35a2bc1", + "transactionHash": "0x10f912a74a9ba8e7cc6236a0036edc34bdf516c9e1edd07e8b58f0b7f9ace78e", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000400000000000010000000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x10f912a74a9ba8e7cc6236a0036edc34bdf516c9e1edd07e8b58f0b7f9ace78e", + "transactionIndex": "0x0", + "blockHash": "0x044c5d2e125ae6bbd630ae8d9d529ae2288d73712158665543bf923e8d76dcd1", + "blockNumber": "0x35a2bc1", + "gasUsed": "0xf8e1", + "effectiveGasPrice": "0x5f5e100", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0xf28546cfbbbb0474aa77ec692e35abebb6ba98e1", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xd9c7d", + "logs": [ + { + "address": "0xfe1dfce548e8aebe2964d5c0c9906fce981d7e47", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x00000000000000000000000055f73c3d6f90e0858423a813969270d735ff00150000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x68931ddf7ecd42ff4ca3246cc8ae092c8e6d441de8aeaa0d63dbe802d01c1f24", + "blockNumber": "0x35a2bc5", + "transactionHash": "0x5d3e796e8811e1449d7defe88ab0018e0599377032e4d2922c34ac78616191bd", + "transactionIndex": "0x4", + "logIndex": "0xd", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000400000000000010000000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x5d3e796e8811e1449d7defe88ab0018e0599377032e4d2922c34ac78616191bd", + "transactionIndex": "0x4", + "blockHash": "0x68931ddf7ecd42ff4ca3246cc8ae092c8e6d441de8aeaa0d63dbe802d01c1f24", + "blockNumber": "0x35a2bc5", + "gasUsed": "0xf8d5", + "effectiveGasPrice": "0x5f5e100", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0xf28546cfbbbb0474aa77ec692e35abebb6ba98e1", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x37c62", + "logs": [ + { + "address": "0xfe1dfce548e8aebe2964d5c0c9906fce981d7e47", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x0000000000000000000000007d799fe4ea4b4fea5ba8545f2b4f04f0c151b2ac0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xab9368f282a7005cd30af9b4e137ff6f258e6ebdb7fce384e9ffdd34b28df0ba", + "blockNumber": "0x35a2bc9", + "transactionHash": "0xb565c3e163ae0d7c79fdc372b42fb7a98f11c6f314e709fa005f106162ab95fa", + "transactionIndex": "0x2", + "logIndex": "0x4", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000400000000000010000000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xb565c3e163ae0d7c79fdc372b42fb7a98f11c6f314e709fa005f106162ab95fa", + "transactionIndex": "0x2", + "blockHash": "0xab9368f282a7005cd30af9b4e137ff6f258e6ebdb7fce384e9ffdd34b28df0ba", + "blockNumber": "0x35a2bc9", + "gasUsed": "0xf8e1", + "effectiveGasPrice": "0x5f5e100", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0xf28546cfbbbb0474aa77ec692e35abebb6ba98e1", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xf1904", + "logs": [ + { + "address": "0xfe1dfce548e8aebe2964d5c0c9906fce981d7e47", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x000000000000000000000000ae3c3a1677ec9f061c768edd6c0d50a6a67f46560000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xc15167a21c521d1e08eb622ee4f96493e672e0194b037de2d2ee54ce019d844b", + "blockNumber": "0x35a2bcb", + "transactionHash": "0x97a98efb79292bdae9e410fb5d0a08a8253a9c5b40dd752794294258a2e7549a", + "transactionIndex": "0x6", + "logIndex": "0xf", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000400000000000010000000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x97a98efb79292bdae9e410fb5d0a08a8253a9c5b40dd752794294258a2e7549a", + "transactionIndex": "0x6", + "blockHash": "0xc15167a21c521d1e08eb622ee4f96493e672e0194b037de2d2ee54ce019d844b", + "blockNumber": "0x35a2bcb", + "gasUsed": "0xf8e1", + "effectiveGasPrice": "0x5f5e100", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0xf28546cfbbbb0474aa77ec692e35abebb6ba98e1", + "contractAddress": null + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1751010534, + "chain": 97, + "commit": "23b76ca" +} \ No newline at end of file diff --git a/broadcast/DeployAdapters.s.sol/97/run-latest.json b/broadcast/DeployAdapters.s.sol/97/run-latest.json new file mode 100644 index 0000000..4bccf33 --- /dev/null +++ b/broadcast/DeployAdapters.s.sol/97/run-latest.json @@ -0,0 +1,350 @@ +{ + "transactions": [ + { + "hash": "0xba60b43fa9140f38461326c6c7b67e28c5a813c0ec8f7e581880730b71b6332b", + "transactionType": "CREATE", + "contractName": "UniswapV3AdapterV2", + "contractAddress": "0xc8175570536849923d2a38fdfc33f2ea9ace4134", + "function": null, + "arguments": [ + "0x0000000000000000000000000000000000000000" + ], + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "gas": "0xba937", + "value": "0x0", + "input": "0x60c034607a57601f610a3738819003918201601f19168301916001600160401b03831184841017607e57808492602094604052833981010312607a57516001600160a01b03811690819003607a573060805260a0526040516109a4908161009382396080518160fd015260a051818181606501526101610152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146106c15780636563c0e9146105f55780639df3032514610495578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b161072d565b6100b9610743565b5060443567ffffffffffffffff8111610094576100da903690600401610797565b60643567ffffffffffffffff8111610094576100fa903690600401610797565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630146104865781516001600160a01b039190911691602080820192820191909103126100945751604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316602482018190529193919290602081604481855afa80156103bd5785905f90610450575b6101b79250610857565b60405163095ea7b360e01b60208083019182526001600160a01b03871660248401526044808401949094529282529091905f906101f5606485610759565b83519082865af15f513d82610434575b5050156103f0575b505080518101916080826020850194031261009457602082015167ffffffffffffffff811161009457820183603f82011215610094576020810151906102528261077b565b946102606040519687610759565b8286526040828401011161009457815f926040602093018388015e85010152604082015191608060608201519101519061029b8187846108d0565b9080156103dc57866102b09309151590610857565b9260405160a081019080821067ffffffffffffffff8311176103c857602095610322935f936040528252868201903082526040830196875260608301988952608083019081526040519889978896879563c04b8d5960e01b87528b60048801525160a0602488015260c4870190610833565b93516001600160a01b031660448601525160648501525160848401525160a483015203925af180156103bd575f90610389575b6103859060405190602082015260208152610371604082610759565b604051918291602083526020830190610833565b0390f35b506020813d6020116103b5575b816103a360209383610759565b81010312610094576103859051610355565b3d9150610396565b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b61042d9161042860405163095ea7b360e01b60208201528660248201525f604482015260448152610422606482610759565b82610878565b610878565b838061020d565b9091506104485750813b15155b8680610205565b600114610441565b50506020813d60201161047e575b8161046b60209383610759565b8101031261009457846101b791516101ad565b3d915061045e565b6302f3451d60e21b5f5260045ffd5b34610094576104a3366107dd565b80516001600160a01b039093169260208083019291820191909103126100945751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa9081156103bd575f916105c1575b5061054a936105586105176020945f94610857565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f198101875286610759565b84519082855af15f513d826105a5575b50501561057157005b6104286105a3936040519063095ea7b360e01b602083015260248201525f604482015260448152610422606482610759565b005b9091506105b95750803b15155b8480610568565b6001146105b2565b90506020813d6020116105ed575b816105dc60209383610759565b81010312610094575161054a610502565b3d91506105cf565b346100945760803660031901126100945761060e61072d565b610616610743565b6044356001600160a01b03811692908390036100945760643567ffffffffffffffff81116100945761064c903690600401610797565b6020815191818082019384920101031261009457515f1981146106b2576105a393604051936323b872dd60e01b602086015260018060a01b0316602485015260448401526064830152606482526106a4608483610759565b6001600160a01b0316610878565b630d550c3b60e11b5f5260045ffd5b34610094576106cf366107dd565b602081939293519181808201938492010103126100945751905f1982146106b25760405163a9059cbb60e01b60208201526001600160a01b039390931660248401526044808401929092529082526105a391906106a4606483610759565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff8211176103c857604052565b67ffffffffffffffff81116103c857601f01601f191660200190565b81601f82011215610094578035906107ae8261077b565b926107bc6040519485610759565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff82116100945761083091600401610797565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9190820180921161086457565b634e487b7160e01b5f52601160045260245ffd5b905f602091828151910182855af1156103bd575f513d6108c757506001600160a01b0381163b155b6108a75750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156108a0565b91818302915f198185099383808610950394808603951461096057848311156109485790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b5050809250156103dc57049056fea2646970667358221220f6000c9f1bdef97179fd0d632833ccb7f8eb8b0c4e5d5beef7139a47675404a964736f6c634300081b00330000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x30", + "chainId": "0x61" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x94b7e404499a97ab65c21dfaf519c3a3bb7c4e649ba12e019844f50c9794d472", + "transactionType": "CREATE", + "contractName": "OdosV2AdapterV2", + "contractAddress": "0x55f73c3d6f90e0858423a813969270d735ff0015", + "function": null, + "arguments": [ + "0x0000000000000000000000000000000000000000" + ], + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "gas": "0xc9b6e", + "value": "0x0", + "input": "0x60c034607a57601f610b1438819003918201601f19168301916001600160401b03831184841017607e57808492602094604052833981010312607a57516001600160a01b03811690819003607a573060805260a052604051610a81908161009382396080518160fd015260a051818181606501526101610152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146107565780636563c0e91461068a5780639df303251461052a578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b16107c2565b6100b96107d8565b5060443567ffffffffffffffff8111610094576100da90369060040161082c565b60643567ffffffffffffffff8111610094576100fa90369060040161082c565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316301461051b5781516001600160a01b039190911691602080820192820191909103126100945751604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031660248201819052919290602081604481855afa80156104665784905f906104e5575b6101b59250610900565b60405163095ea7b360e01b60208083019182526001600160a01b03861660248401526044808401949094529282529091905f906101f36064856107ee565b83519082865af15f513d826104c9575b505015610485575b505082518301908360208301920361014081126100945760e013610094576040519160e0830183811067ffffffffffffffff82111761047157604052610253602086016108ec565b83526040850151906020840191825261026e606087016108ec565b9360408101948552610282608088016108ec565b966060820197885260a0810151926080830193845260c08201519760a084019889526102b060e084016108ec565b9160c0850192835261010084015167ffffffffffffffff811161009457840181603f82011215610094576020810151906102e982610810565b926102f760405194856107ee565b8284526040828401011161009457815f926040602093018386015e830101526101208401516001600160a01b03811694908590036100945761014001519263ffffffff84168094036100945760209a876103e09461035a5f9a51828d5191610921565b825261036a8351828d5191610921565b83528a52308352604051630ed8d73960e21b815297516001600160a01b0390811660048a0152995160248901529a51891660448801529b518816606487015298516084860152995160a4850152965190941660c483015261014060e48301529096879586948593929091906101448501906108c8565b9161010484015261012483015203925af18015610466575f90610432575b61042e906040519060208201526020815261041a6040826107ee565b6040519182916020835260208301906108c8565b0390f35b506020813d60201161045e575b8161044c602093836107ee565b810103126100945761042e90516103fe565b3d915061043f565b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b6104c2916104bd60405163095ea7b360e01b60208201528560248201525f6044820152604481526104b76064826107ee565b82610955565b610955565b838061020b565b9091506104dd5750813b15155b8680610203565b6001146104d6565b50506020813d602011610513575b81610500602093836107ee565b8101031261009457836101b591516101ab565b3d91506104f3565b6302f3451d60e21b5f5260045ffd5b346100945761053836610872565b80516001600160a01b039093169260208083019291820191909103126100945751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa908115610466575f91610656575b506105df936105ed6105ac6020945f94610900565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f1981018752866107ee565b84519082855af15f513d8261063a575b50501561060657005b6104bd610638936040519063095ea7b360e01b602083015260248201525f6044820152604481526104b76064826107ee565b005b90915061064e5750803b15155b84806105fd565b600114610647565b90506020813d602011610682575b81610671602093836107ee565b8101031261009457516105df610597565b3d9150610664565b34610094576080366003190112610094576106a36107c2565b6106ab6107d8565b6044356001600160a01b03811692908390036100945760643567ffffffffffffffff8111610094576106e190369060040161082c565b6020815191818082019384920101031261009457515f1981146107475761063893604051936323b872dd60e01b602086015260018060a01b0316602485015260448401526064830152606482526107396084836107ee565b6001600160a01b0316610955565b630d550c3b60e11b5f5260045ffd5b346100945761076436610872565b602081939293519181808201938492010103126100945751905f1982146107475760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261063891906107396064836107ee565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff82111761047157604052565b67ffffffffffffffff811161047157601f01601f191660200190565b81601f820112156100945780359061084382610810565b9261085160405194856107ee565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff8211610094576108c59160040161082c565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b51906001600160a01b038216820361009457565b9190820180921161090d57565b634e487b7160e01b5f52601160045260245ffd5b9161092d8183856109ad565b918115610941576108c59309151590610900565b634e487b7160e01b5f52601260045260245ffd5b905f602091828151910182855af115610466575f513d6109a457506001600160a01b0381163b155b6109845750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b6001141561097d565b91818302915f1981850993838086109503948086039514610a3d5784831115610a255790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b50508092501561094157049056fea26469706673582212201a43e03d554ef4508b4ce4929a5e2c8c851ee4de243e12f6b2b1267ec83a42f164736f6c634300081b00330000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x31", + "chainId": "0x61" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xeee1e911e60cec84f21e5942d1a5241a2717f8294818e959da6c1877ce2153ea", + "transactionType": "CREATE", + "contractName": "PendleSwapV3AdapterV2", + "contractAddress": "0x7d799fe4ea4b4fea5ba8545f2b4f04f0c151b2ac", + "function": null, + "arguments": [ + "0x0000000000000000000000000000000000000000" + ], + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "gas": "0x166f6b", + "value": "0x0", + "input": "0x60c0604052346100f757604051601f61132138819003918201601f19168301916001600160401b038311848410176100e3578084926020946040528339810103126100f757516001600160a01b038116908190036100f7573060805260405160a081016001600160401b038111828210176100e357655af3107a4000916080916040525f81525f1960208201525f6040820152610100606082015201525f6008555f196009555f600a55610100600b55655af3107a4000600c5560a05260405161122590816100fc82396080518161025d015260a0518181816089015261031d0152f35b634e487b7160e01b5f52604160045260245ffd5b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816309316dd314610b30575080633268263b14610ac45780634ebfc81414610a855780636563c0e9146109b95780639df303251461084e578063e0a80413146101f8578063f66a7749146100bc5763f887ea4014610074575f80fd5b346100b8575f3660031901126100b8576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b346100b8575f3660031901126100b8575f54604051905f6001548060011c91600182169182156101ee575b6020841083146101da5783865285929081156101bb575060011461015c575b61011292500383610cd2565b60ff60025416610150604051938361012e8660ff819716610e04565b60081c6001600160a01b03166020850152608060408501819052840190610d08565b90151560608301520390f35b5060015f90815290917fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b81831061019f57505090602061011292820101610106565b6020919350806001915483858901015201910190918492610187565b6020925061011294915060ff191682840152151560051b820101610106565b634e487b7160e01b5f52602260045260245ffd5b92607f16926100e7565b346100b85760803660031901126100b857610211610d2c565b610219610d42565b60443567ffffffffffffffff81116100b857610239903690600401610d58565b9160643567ffffffffffffffff81116100b85761025a903690600401610d58565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316301461083f5783516001600160a01b0393841694919093169260208083019291820191909103126100b85751916060828051810103126100b85760208201516001600160a01b03811691908290036100b857606060408401519301519460405195630b2339af60e21b8752606087600481875afa968715610508575f976107d2575b50604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316602482018190529590602081604481885afa80156105085788905f9061079c575b6103709250611041565b60405163095ea7b360e01b60208083019182526001600160a01b038a1660248401526044808401949094529282529091905f906103ae606485610cd2565b83519082895af15f513d82610780575b50501561073c575b506103d2818884611151565b90801561072857876103e79309151590611041565b956001600160a01b0316818103610513575050935f606094939261047e9661040d611062565b95818752602087015260408601526104906040519788968795869463640fc23d60e11b86523060048701526024860152604485015260085460648501526009546084850152600a5460a4850152600b5460c4850152600c5460e4850152610140610104850152610144840190610e40565b82810360031901610124840152610ff1565b03925af18015610508576104d3915f916104d7575b505b604051906020820152602081526104bf604082610cd2565b604051918291602083526020830190610d08565b0390f35b6104f9915060603d606011610501575b6104f18183610cd2565b810190610e25565b5050826104a5565b503d6104e7565b6040513d5f823e3d90fd5b9150949391604051630bc4ed8360e21b8152602081600481865afa908115610508575f916106ed575b50156106535750936020600494956040519586809263781c18db60e01b82525afa938415610508575f9461060b575b50905f61057f6105bc9660409695946110d2565b938551968795869485936323f8ef1160e11b855230600486015260018060a01b031660248501526044840152608060648401526084830190610e40565b03925af18015610508575f906105d7575b6104d391506104a7565b506040813d604011610603575b816105f160409383610cd2565b810103126100b8576104d390516105cd565b3d91506105e4565b90929193506020813d60201161064b575b8161062960209383610cd2565b810103126100b85751926001600160a01b03841684036100b85790915f61056b565b3d915061061c565b929190505f6106676060956106a0976110d2565b936106b160405197889687958694631652a23360e21b86523060048701526024860152604485015260a0606485015260a4840190610e40565b828103600319016084840152610ff1565b03925af18015610508576104d3915f916106cc575b506104a7565b6106e5915060603d606011610501576104f18183610cd2565b5050826106c6565b90506020813d602011610720575b8161070860209383610cd2565b810103126100b8575180151581036100b8578761053c565b3d91506106fb565b634e487b7160e01b5f52601260045260245ffd5b61077a9061077460405163095ea7b360e01b60208201528960248201525f60448201526044815261076e606482610cd2565b876110f9565b856110f9565b886103c6565b9091506107945750843b15155b8a806103be565b60011461078d565b50506020813d6020116107ca575b816107b760209383610cd2565b810103126100b857876103709151610366565b3d91506107aa565b9096506060813d606011610837575b816107ee60609383610cd2565b810103126100b85780516001600160a01b038116036100b8576020810151906001600160a01b03821682036100b857604001516001600160a01b038116036100b8579587610307565b3d91506107e1565b6302f3451d60e21b5f5260045ffd5b346100b85761085c36610dae565b80516001600160a01b039093169260208083019291820191909103126100b85751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa908115610508575f91610985575b50610903936109116108d06020945f94611041565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f198101875286610cd2565b84519082855af15f513d82610969575b50501561092a57005b610962610967936040519063095ea7b360e01b602083015260248201525f60448201526044815261095c606482610cd2565b826110f9565b6110f9565b005b90915061097d5750803b15155b8480610921565b600114610976565b90506020813d6020116109b1575b816109a060209383610cd2565b810103126100b857516109036108bb565b3d9150610993565b346100b85760803660031901126100b8576109d2610d2c565b6109da610d42565b6044356001600160a01b03811692908390036100b85760643567ffffffffffffffff81116100b857610a10903690600401610d58565b602081519181808201938492010103126100b857515f198114610a765761096793604051936323b872dd60e01b602086015260018060a01b031660248501526044840152606483015260648252610a68608483610cd2565b6001600160a01b03166110f9565b630d550c3b60e11b5f5260045ffd5b346100b8575f3660031901126100b85760a0600854600954600a54600b5490600c54926040519485526020850152604084015260608301526080820152f35b346100b857610ad236610dae565b602081939293519181808201938492010103126100b85751905f198214610a765760405163a9059cbb60e01b60208201526001600160a01b039390931660248401526044808401929092529082526109679190610a68606483610cd2565b346100b8575f3660031901126100b85760018060a01b0360035416600454915f6007548060011c90600181168015610c31575b6020831081146101da57828552908115610c0d5750600114610baf575b5090610b91816104d3930382610cd2565b60405193849384526020840152606060408401526060830190610d08565b60075f9081527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688939250905b808210610bf357509091508101602001610b91610b80565b919260018160209254838588010152019101909291610bdb565b60ff191660208086019190915291151560051b84019091019150610b919050610b80565b91607f1691610b63565b5f92918154918260011c92600181168015610cc8575b6020851081146101da57848452908115610cab5750600114610c7257505050565b5f9081526020812093945091925b838310610c91575060209250010190565b600181602092949394548385870101520191019190610c80565b915050602093945060ff929192191683830152151560051b010190565b93607f1693610c51565b90601f8019910116810190811067ffffffffffffffff821117610cf457604052565b634e487b7160e01b5f52604160045260245ffd5b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036100b857565b602435906001600160a01b03821682036100b857565b81601f820112156100b85780359067ffffffffffffffff8211610cf45760405192610d8d601f8401601f191660200185610cd2565b828452602083830101116100b857815f926020809301838601378301015290565b60606003198201126100b8576004356001600160a01b03811681036100b857916024356001600160a01b03811681036100b857916044359067ffffffffffffffff82116100b857610e0191600401610d58565b90565b90600b821015610e115752565b634e487b7160e01b5f52602160045260245ffd5b908160609103126100b8578051916040602083015192015190565b60809060018060a01b0381511683526020810151602084015260018060a01b03604082015116604084015260018060a01b03606082015116606084015201519060a06080820152610e9560a082018351610e04565b60208201516001600160a01b031660c08201526040820151608060e083015261010090606090610eca90610120850190610d08565b930151151591015290565b908060208354918281520160208260051b840101935f5260205f20925f905b838210610f0357505050505090565b9091929394601f19828203018452606081528554606082015260018601546080820152600286015460a0820152600386015460ff81166004811015610e115760c08301526001600160a01b03600891821c811660e0840152600488015481166101008401526005880154811661012084015260068801541661014083015260078701546101608301528601546101808083019190915260098701546101a08301526101c0820152600190602090600d90610fd7610fc76101e08301600a8c01610c3b565b82810385840152600b8b01610c3b565b906040600c8b015491015297019401920190939293610ef4565b610e019060018060a01b03600354168152600454602082015260a0604082015261103161102260a083016005610ed5565b82810360608401526006610ed5565b9060808183039101526007610c3b565b9190820180921161104e57565b634e487b7160e01b5f52601160045260245ffd5b6040519060a0820182811067ffffffffffffffff821117610cf457604052815f81525f60208201525f60408201525f606082015260405190608082019082821067ffffffffffffffff831117610cf4576080916040525f83525f6020840152606060408401525f60608401520152565b91906110dc611062565b6001600160a01b0390931680845260208401919091526040830152565b905f602091828151910182855af115610508575f513d61114857506001600160a01b0381163b155b6111285750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b60011415611121565b91818302915f19818509938380861095039480860395146111e157848311156111c95790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b50508092501561072857049056fea2646970667358221220d7c8c2f17efce607284d62466051aec3e13f6f1e6deb7e056420af021f77a8ae64736f6c634300081b00330000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x32", + "chainId": "0x61" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x1e6a0ea37630efac2d8a94689260a6d137bfe6fa660df6ed543b620e1e936fc1", + "transactionType": "CREATE", + "contractName": "ERC4626VaultAdapterV2", + "contractAddress": "0xae3c3a1677ec9f061c768edd6c0d50a6a67f4656", + "function": null, + "arguments": null, + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "gas": "0xaf02f", + "value": "0x0", + "input": "0x60a0806040523460215730608052610900908161002682396080518160aa0152f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146106395780636563c0e91461056d5780639df303251461040d5763e0a8041314610045575f80fd5b346102a35760803660031901126102a35761005e6106a5565b6100666106bb565b9060443567ffffffffffffffff81116102a357610087903690600401610707565b60643567ffffffffffffffff81116102a3576100a7903690600401610707565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630146103fe5781516001600160a01b039182169490911691602080820192820191909103126102a35751926060838051810103126102a35760208301519260028410156102a357606060408201519101519061012f81878461082c565b9080156103ea578661014493091515906107b3565b92806103525750604051636eb1769f60e11b815230600482015260248101839052602081604481855afa9081156102af575f9161031a575b50846020939261018f5f976044946107b3565b60405163095ea7b360e01b8782019081526001600160a01b038716602483015260448083019390935291815290869089906101cb6064856106d1565b83519082865af188513d826102fb575b5050156102ba575b50506040519586938492636e553f6560e01b845260048401523060248401525af19182156102af575f92610277575b50818181106102625750505b60408051602081019283526020815261023782826106d1565b8151928391602083525180918160208501528484015e5f828201840152601f01601f19168101030190f35b63eb7f211d60e01b5f5260045260245260445ffd5b9091506020813d6020116102a7575b81610293602093836106d1565b810103126102a35751905f610212565b5f80fd5b3d9150610286565b6040513d5f823e3d90fd5b6102f4916102ef60405163095ea7b360e01b898201528760248201528a878201528681526102e96064826106d1565b826107d4565b6107d4565b5f806101e3565b9091501589146103125750813b15155b5f806101db565b60011461030b565b90506020929192813d60201161034a575b81610338602093836106d1565b810103126102a357519091908461017c565b3d915061032b565b909391506001036103db575f9260646020926040519586938492635d043b2960e11b845260048401523060248401523060448401525af19182156102af575f926103a7575b508181811061026257505061021e565b9091506020813d6020116103d3575b816103c3602093836106d1565b810103126102a35751905f610397565b3d91506103b6565b634a7f394f60e01b5f5260045ffd5b634e487b7160e01b5f52601260045260245ffd5b6302f3451d60e21b5f5260045ffd5b346102a35761041b3661075d565b80516001600160a01b039093169260208083019291820191909103126102a35751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa9081156102af575f91610539575b506104c2936104d061048f6020945f946107b3565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f1981018752866106d1565b84519082855af15f513d8261051d575b5050156104e957005b6102ef61051b936040519063095ea7b360e01b602083015260248201525f6044820152604481526102e96064826106d1565b005b9091506105315750803b15155b84806104e0565b60011461052a565b90506020813d602011610565575b81610554602093836106d1565b810103126102a357516104c261047a565b3d9150610547565b346102a35760803660031901126102a3576105866106a5565b61058e6106bb565b6044356001600160a01b03811692908390036102a35760643567ffffffffffffffff81116102a3576105c4903690600401610707565b602081519181808201938492010103126102a357515f19811461062a5761051b93604051936323b872dd60e01b602086015260018060a01b03166024850152604484015260648301526064825261061c6084836106d1565b6001600160a01b03166107d4565b630d550c3b60e11b5f5260045ffd5b346102a3576106473661075d565b602081939293519181808201938492010103126102a35751905f19821461062a5760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261051b919061061c6064836106d1565b600435906001600160a01b03821682036102a357565b602435906001600160a01b03821682036102a357565b90601f8019910116810190811067ffffffffffffffff8211176106f357604052565b634e487b7160e01b5f52604160045260245ffd5b81601f820112156102a35780359067ffffffffffffffff82116106f3576040519261073c601f8401601f1916602001856106d1565b828452602083830101116102a357815f926020809301838601378301015290565b60606003198201126102a3576004356001600160a01b03811681036102a357916024356001600160a01b03811681036102a357916044359067ffffffffffffffff82116102a3576107b091600401610707565b90565b919082018092116107c057565b634e487b7160e01b5f52601160045260245ffd5b905f602091828151910182855af1156102af575f513d61082357506001600160a01b0381163b155b6108035750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156107fc565b91818302915f19818509938380861095039480860395146108bc57848311156108a45790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b5050809250156103ea57049056fea2646970667358221220b9f441923fe75e1f6e0f37bda35dde1cbac73c1e69240288bd35172a90f8e35164736f6c634300081b0033", + "nonce": "0x33", + "chainId": "0x61" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x10f912a74a9ba8e7cc6236a0036edc34bdf516c9e1edd07e8b58f0b7f9ace78e", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0xf28546cfbbbb0474aa77ec692e35abebb6ba98e1", + "function": null, + "arguments": null, + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0xf28546cfbbbb0474aa77ec692e35abebb6ba98e1", + "gas": "0x16bfc", + "value": "0x0", + "input": "0xb6b07b8e000000000000000000000000fe1dfce548e8aebe2964d5c0c9906fce981d7e47000000000000000000000000c8175570536849923d2a38fdfc33f2ea9ace41340000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x34", + "chainId": "0x61" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x5d3e796e8811e1449d7defe88ab0018e0599377032e4d2922c34ac78616191bd", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0xf28546cfbbbb0474aa77ec692e35abebb6ba98e1", + "function": null, + "arguments": null, + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0xf28546cfbbbb0474aa77ec692e35abebb6ba98e1", + "gas": "0x157b2", + "value": "0x0", + "input": "0xb6b07b8e000000000000000000000000fe1dfce548e8aebe2964d5c0c9906fce981d7e4700000000000000000000000055f73c3d6f90e0858423a813969270d735ff00150000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x35", + "chainId": "0x61" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xb565c3e163ae0d7c79fdc372b42fb7a98f11c6f314e709fa005f106162ab95fa", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0xf28546cfbbbb0474aa77ec692e35abebb6ba98e1", + "function": null, + "arguments": null, + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0xf28546cfbbbb0474aa77ec692e35abebb6ba98e1", + "gas": "0x16bfc", + "value": "0x0", + "input": "0xb6b07b8e000000000000000000000000fe1dfce548e8aebe2964d5c0c9906fce981d7e470000000000000000000000007d799fe4ea4b4fea5ba8545f2b4f04f0c151b2ac0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x36", + "chainId": "0x61" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x97a98efb79292bdae9e410fb5d0a08a8253a9c5b40dd752794294258a2e7549a", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0xf28546cfbbbb0474aa77ec692e35abebb6ba98e1", + "function": null, + "arguments": null, + "transaction": { + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0xf28546cfbbbb0474aa77ec692e35abebb6ba98e1", + "gas": "0x16bfc", + "value": "0x0", + "input": "0xb6b07b8e000000000000000000000000fe1dfce548e8aebe2964d5c0c9906fce981d7e47000000000000000000000000ae3c3a1677ec9f061c768edd6c0d50a6a67f46560000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x37", + "chainId": "0x61" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x10d561", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xba60b43fa9140f38461326c6c7b67e28c5a813c0ec8f7e581880730b71b6332b", + "transactionIndex": "0x2", + "blockHash": "0xf4b29dfcc1aff6e328a06c7f07ab957b7258085c448d631c9a8038f6b90cf478", + "blockNumber": "0x35a2bb3", + "gasUsed": "0x8f852", + "effectiveGasPrice": "0x5f5e100", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": null, + "contractAddress": "0xc8175570536849923d2a38fdfc33f2ea9ace4134" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xbe116", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x94b7e404499a97ab65c21dfaf519c3a3bb7c4e649ba12e019844f50c9794d472", + "transactionIndex": "0x2", + "blockHash": "0xa8e341316b187d93e6d487d56ae05fc0463549d002fe2d5f9cd0dd4d54b5faf0", + "blockNumber": "0x35a2bb7", + "gasUsed": "0x9b2a4", + "effectiveGasPrice": "0x5f5e100", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": null, + "contractAddress": "0x55f73c3d6f90e0858423a813969270d735ff0015" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x17c22c", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xeee1e911e60cec84f21e5942d1a5241a2717f8294818e959da6c1877ce2153ea", + "transactionIndex": "0x2", + "blockHash": "0x151f08407abf0008ac9f0922683b6f02e1ced3940ddf1bda5ef3e48a58090bea", + "blockNumber": "0x35a2bbc", + "gasUsed": "0x114204", + "effectiveGasPrice": "0x5f5e100", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": null, + "contractAddress": "0x7d799fe4ea4b4fea5ba8545f2b4f04f0c151b2ac" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xcaca3", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x1e6a0ea37630efac2d8a94689260a6d137bfe6fa660df6ed543b620e1e936fc1", + "transactionIndex": "0x2", + "blockHash": "0xc05e334186d449cf7bce02f985cd64bee5bf65a5ed64305c17c061507d0cec5e", + "blockNumber": "0x35a2bbf", + "gasUsed": "0x869fd", + "effectiveGasPrice": "0x5f5e100", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": null, + "contractAddress": "0xae3c3a1677ec9f061c768edd6c0d50a6a67f4656" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xf8e1", + "logs": [ + { + "address": "0xfe1dfce548e8aebe2964d5c0c9906fce981d7e47", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x000000000000000000000000c8175570536849923d2a38fdfc33f2ea9ace41340000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x044c5d2e125ae6bbd630ae8d9d529ae2288d73712158665543bf923e8d76dcd1", + "blockNumber": "0x35a2bc1", + "transactionHash": "0x10f912a74a9ba8e7cc6236a0036edc34bdf516c9e1edd07e8b58f0b7f9ace78e", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000400000000000010000000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x10f912a74a9ba8e7cc6236a0036edc34bdf516c9e1edd07e8b58f0b7f9ace78e", + "transactionIndex": "0x0", + "blockHash": "0x044c5d2e125ae6bbd630ae8d9d529ae2288d73712158665543bf923e8d76dcd1", + "blockNumber": "0x35a2bc1", + "gasUsed": "0xf8e1", + "effectiveGasPrice": "0x5f5e100", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0xf28546cfbbbb0474aa77ec692e35abebb6ba98e1", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xd9c7d", + "logs": [ + { + "address": "0xfe1dfce548e8aebe2964d5c0c9906fce981d7e47", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x00000000000000000000000055f73c3d6f90e0858423a813969270d735ff00150000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x68931ddf7ecd42ff4ca3246cc8ae092c8e6d441de8aeaa0d63dbe802d01c1f24", + "blockNumber": "0x35a2bc5", + "transactionHash": "0x5d3e796e8811e1449d7defe88ab0018e0599377032e4d2922c34ac78616191bd", + "transactionIndex": "0x4", + "logIndex": "0xd", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000400000000000010000000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x5d3e796e8811e1449d7defe88ab0018e0599377032e4d2922c34ac78616191bd", + "transactionIndex": "0x4", + "blockHash": "0x68931ddf7ecd42ff4ca3246cc8ae092c8e6d441de8aeaa0d63dbe802d01c1f24", + "blockNumber": "0x35a2bc5", + "gasUsed": "0xf8d5", + "effectiveGasPrice": "0x5f5e100", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0xf28546cfbbbb0474aa77ec692e35abebb6ba98e1", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x37c62", + "logs": [ + { + "address": "0xfe1dfce548e8aebe2964d5c0c9906fce981d7e47", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x0000000000000000000000007d799fe4ea4b4fea5ba8545f2b4f04f0c151b2ac0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xab9368f282a7005cd30af9b4e137ff6f258e6ebdb7fce384e9ffdd34b28df0ba", + "blockNumber": "0x35a2bc9", + "transactionHash": "0xb565c3e163ae0d7c79fdc372b42fb7a98f11c6f314e709fa005f106162ab95fa", + "transactionIndex": "0x2", + "logIndex": "0x4", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000400000000000010000000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xb565c3e163ae0d7c79fdc372b42fb7a98f11c6f314e709fa005f106162ab95fa", + "transactionIndex": "0x2", + "blockHash": "0xab9368f282a7005cd30af9b4e137ff6f258e6ebdb7fce384e9ffdd34b28df0ba", + "blockNumber": "0x35a2bc9", + "gasUsed": "0xf8e1", + "effectiveGasPrice": "0x5f5e100", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0xf28546cfbbbb0474aa77ec692e35abebb6ba98e1", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xf1904", + "logs": [ + { + "address": "0xfe1dfce548e8aebe2964d5c0c9906fce981d7e47", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x000000000000000000000000ae3c3a1677ec9f061c768edd6c0d50a6a67f46560000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xc15167a21c521d1e08eb622ee4f96493e672e0194b037de2d2ee54ce019d844b", + "blockNumber": "0x35a2bcb", + "transactionHash": "0x97a98efb79292bdae9e410fb5d0a08a8253a9c5b40dd752794294258a2e7549a", + "transactionIndex": "0x6", + "logIndex": "0xf", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000400000000000010000000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x97a98efb79292bdae9e410fb5d0a08a8253a9c5b40dd752794294258a2e7549a", + "transactionIndex": "0x6", + "blockHash": "0xc15167a21c521d1e08eb622ee4f96493e672e0194b037de2d2ee54ce019d844b", + "blockNumber": "0x35a2bcb", + "gasUsed": "0xf8e1", + "effectiveGasPrice": "0x5f5e100", + "from": "0xe355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b", + "to": "0xf28546cfbbbb0474aa77ec692e35abebb6ba98e1", + "contractAddress": null + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1751010534, + "chain": 97, + "commit": "23b76ca" +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-access-manager.json b/deployments/arb-sepolia/arb-sepolia-access-manager.json similarity index 100% rename from deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-access-manager.json rename to deployments/arb-sepolia/arb-sepolia-access-manager.json diff --git a/deployments/arb-sepolia/arb-sepolia-adapters-20250627.json b/deployments/arb-sepolia/arb-sepolia-adapters-20250627.json new file mode 100644 index 0000000..db2f88b --- /dev/null +++ b/deployments/arb-sepolia/arb-sepolia-adapters-20250627.json @@ -0,0 +1,18 @@ +{ + "network": "arb-sepolia", + "deployedAt": "1751010232", + "gitBranch": "v1_special_adapter", + "gitCommitHash": "0x23b76ca54b9c28b2b4fc0b4d07d64b3f17c4ee36", + "blockInfo": { + "number": "8638772", + "timestamp": "1751010232" + }, + "deployer": "0xE355d5D8aa52EF0FbbD037C4a3C5E6Fd659cf46B", + "admin": "0x81f314f70702Bbe89FEd0F2cFe6841950275E0b7", + "swapAdapter": { + "uniswapV3Adapter": "0x32D60D4a462f5A4b145AA225643e5066aeC1611B", + "odosV2Adapter": "0x03F45de2Ab1B976e27ACbAa4A9945e5EA7F4ed32", + "pendleSwapV3Adapter": "0x624E405a53D1f3FcdF52cEbAE469bFD6472294fA", + "ERC4626VaultAdapter": "0xB50b0C9c835e8f4F9436214F6f5219207c3b58cF" + } +} \ No newline at end of file diff --git a/deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-core.json b/deployments/arb-sepolia/arb-sepolia-core.json similarity index 100% rename from deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-core.json rename to deployments/arb-sepolia/arb-sepolia-core.json diff --git a/deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-USDC-ARB@26DEC2025.json b/deployments/arb-sepolia/arb-sepolia-market-USDC-ARB@26DEC2025.json similarity index 100% rename from deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-USDC-ARB@26DEC2025.json rename to deployments/arb-sepolia/arb-sepolia-market-USDC-ARB@26DEC2025.json diff --git a/deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-USDC-WBTC@26SEP2025.json b/deployments/arb-sepolia/arb-sepolia-market-USDC-WBTC@26SEP2025.json similarity index 100% rename from deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-USDC-WBTC@26SEP2025.json rename to deployments/arb-sepolia/arb-sepolia-market-USDC-WBTC@26SEP2025.json diff --git a/deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-USDC-WETH@26DEC2025.json b/deployments/arb-sepolia/arb-sepolia-market-USDC-WETH@26DEC2025.json similarity index 100% rename from deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-USDC-WETH@26DEC2025.json rename to deployments/arb-sepolia/arb-sepolia-market-USDC-WETH@26DEC2025.json diff --git a/deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-USDC-wstETH@26SEP2025.json b/deployments/arb-sepolia/arb-sepolia-market-USDC-wstETH@26SEP2025.json similarity index 100% rename from deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-USDC-wstETH@26SEP2025.json rename to deployments/arb-sepolia/arb-sepolia-market-USDC-wstETH@26SEP2025.json diff --git a/deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-WETH-PT-weETH-26JUN2025@26DEC2025.json b/deployments/arb-sepolia/arb-sepolia-market-WETH-PT-weETH-26JUN2025@26DEC2025.json similarity index 100% rename from deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-WETH-PT-weETH-26JUN2025@26DEC2025.json rename to deployments/arb-sepolia/arb-sepolia-market-WETH-PT-weETH-26JUN2025@26DEC2025.json diff --git a/deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-WETH-weETH@26SEP2025.json b/deployments/arb-sepolia/arb-sepolia-market-WETH-weETH@26SEP2025.json similarity index 100% rename from deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-WETH-weETH@26SEP2025.json rename to deployments/arb-sepolia/arb-sepolia-market-WETH-weETH@26SEP2025.json diff --git a/deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-WETH-wstETH@26SEP2025.json b/deployments/arb-sepolia/arb-sepolia-market-WETH-wstETH@26SEP2025.json similarity index 100% rename from deployments/arb-sepolia-v1.0.9-testnet-20250603/arb-sepolia-market-WETH-wstETH@26SEP2025.json rename to deployments/arb-sepolia/arb-sepolia-market-WETH-wstETH@26SEP2025.json diff --git a/deployments/bnb-testnet/bnb-testnet-adapters-20250627.json b/deployments/bnb-testnet/bnb-testnet-adapters-20250627.json new file mode 100644 index 0000000..c784245 --- /dev/null +++ b/deployments/bnb-testnet/bnb-testnet-adapters-20250627.json @@ -0,0 +1,18 @@ +{ + "network": "bnb-testnet", + "deployedAt": "1751010431", + "gitBranch": "v1_special_adapter", + "gitCommitHash": "0x23b76ca54b9c28b2b4fc0b4d07d64b3f17c4ee36", + "blockInfo": { + "number": "56241046", + "timestamp": "1751010431" + }, + "deployer": "0xE355d5D8aa52EF0FbbD037C4a3C5E6Fd659cf46B", + "admin": "0x81f314f70702Bbe89FEd0F2cFe6841950275E0b7", + "swapAdapter": { + "uniswapV3Adapter": "0xC8175570536849923D2A38FDFC33f2EA9ace4134", + "odosV2Adapter": "0x55f73C3D6F90e0858423A813969270D735fF0015", + "pendleSwapV3Adapter": "0x7D799FE4Ea4b4Fea5BA8545f2b4f04f0c151B2AC", + "ERC4626VaultAdapter": "0xAe3C3a1677Ec9f061c768edD6C0d50A6A67F4656" + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-access-manager.json b/deployments/eth-sepolia/eth-sepolia-access-manager.json similarity index 100% rename from deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-access-manager.json rename to deployments/eth-sepolia/eth-sepolia-access-manager.json diff --git a/deployments/eth-sepolia/eth-sepolia-adapters-20250627.json b/deployments/eth-sepolia/eth-sepolia-adapters-20250627.json new file mode 100644 index 0000000..1e3c5de --- /dev/null +++ b/deployments/eth-sepolia/eth-sepolia-adapters-20250627.json @@ -0,0 +1,18 @@ +{ + "network": "eth-sepolia", + "deployedAt": "1751008776", + "gitBranch": "v1_special_adapter", + "gitCommitHash": "0x23b76ca54b9c28b2b4fc0b4d07d64b3f17c4ee36", + "blockInfo": { + "number": "8638653", + "timestamp": "1751008776" + }, + "deployer": "0xE355d5D8aa52EF0FbbD037C4a3C5E6Fd659cf46B", + "admin": "0x81f314f70702Bbe89FEd0F2cFe6841950275E0b7", + "swapAdapter": { + "uniswapV3Adapter": "0x92659D8b9354576d5BA0556158dA0244aCa4032e", + "odosV2Adapter": "0x5902A019c5534F11EaF1676F708Ae2bE0B1371ef", + "pendleSwapV3Adapter": "0xb51C2Bf67ff00172450d7F3d4CbaacC8821779dd", + "ERC4626VaultAdapter": "0xBff9f6C01c056127957fb9F0436bb07368ddBE2E" + } +} \ No newline at end of file diff --git a/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-core.json b/deployments/eth-sepolia/eth-sepolia-core.json similarity index 100% rename from deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-core.json rename to deployments/eth-sepolia/eth-sepolia-core.json diff --git a/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-USDC-PT-sUSDE-31JUL2025@26SEP2025.json b/deployments/eth-sepolia/eth-sepolia-market-USDC-PT-sUSDE-31JUL2025@26SEP2025.json similarity index 100% rename from deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-USDC-PT-sUSDE-31JUL2025@26SEP2025.json rename to deployments/eth-sepolia/eth-sepolia-market-USDC-PT-sUSDE-31JUL2025@26SEP2025.json diff --git a/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-USDC-WBTC@26DEC2025.json b/deployments/eth-sepolia/eth-sepolia-market-USDC-WBTC@26DEC2025.json similarity index 100% rename from deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-USDC-WBTC@26DEC2025.json rename to deployments/eth-sepolia/eth-sepolia-market-USDC-WBTC@26DEC2025.json diff --git a/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-USDC-eUSDe@26DEC2025.json b/deployments/eth-sepolia/eth-sepolia-market-USDC-eUSDe@26DEC2025.json similarity index 100% rename from deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-USDC-eUSDe@26DEC2025.json rename to deployments/eth-sepolia/eth-sepolia-market-USDC-eUSDe@26DEC2025.json diff --git a/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-USDC-sUSDe@26SEP2025.json b/deployments/eth-sepolia/eth-sepolia-market-USDC-sUSDe@26SEP2025.json similarity index 100% rename from deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-USDC-sUSDe@26SEP2025.json rename to deployments/eth-sepolia/eth-sepolia-market-USDC-sUSDe@26SEP2025.json diff --git a/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-USDC-wstETH@26SEP2025.json b/deployments/eth-sepolia/eth-sepolia-market-USDC-wstETH@26SEP2025.json similarity index 100% rename from deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-USDC-wstETH@26SEP2025.json rename to deployments/eth-sepolia/eth-sepolia-market-USDC-wstETH@26SEP2025.json diff --git a/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-WETH-pufETH@26DEC2025.json b/deployments/eth-sepolia/eth-sepolia-market-WETH-pufETH@26DEC2025.json similarity index 100% rename from deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-WETH-pufETH@26DEC2025.json rename to deployments/eth-sepolia/eth-sepolia-market-WETH-pufETH@26DEC2025.json diff --git a/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-WETH-weETH@26SEP2025.json b/deployments/eth-sepolia/eth-sepolia-market-WETH-weETH@26SEP2025.json similarity index 100% rename from deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-market-WETH-weETH@26SEP2025.json rename to deployments/eth-sepolia/eth-sepolia-market-WETH-weETH@26SEP2025.json diff --git a/deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-vault-TMX-USDC-Vault-07JUN2025.json b/deployments/eth-sepolia/eth-sepolia-vault-TMX-USDC-Vault-07JUN2025.json similarity index 100% rename from deployments/eth-sepolia-v1.0.9-testnet-20250609/eth-sepolia-vault-TMX-USDC-Vault-07JUN2025.json rename to deployments/eth-sepolia/eth-sepolia-vault-TMX-USDC-Vault-07JUN2025.json diff --git a/script/deploy/DeployAdapters.s.sol b/script/deploy/DeployAdapters.s.sol index f622e77..e11d68d 100644 --- a/script/deploy/DeployAdapters.s.sol +++ b/script/deploy/DeployAdapters.s.sol @@ -26,6 +26,7 @@ import {UniswapV3AdapterV2} from "contracts/v1/router/specAdapters/UniswapV3Adap import {OdosV2AdapterV2} from "contracts/v1/router/specAdapters/OdosV2AdapterV2.sol"; import {PendleSwapV3AdapterV2} from "contracts/v1/router/specAdapters/PendleSwapV3AdapterV2.sol"; import {ERC4626VaultAdapterV2} from "contracts/v1/router/specAdapters/ERC4626VaultAdapterV2.sol"; +import {StringHelper} from "../utils/StringHelper.sol"; contract DeployAdapters is DeployBase { // Network-specific config loaded from environment variables @@ -67,7 +68,6 @@ contract DeployAdapters is DeployBase { string memory uniswapV3RouterVar = string.concat(networkUpper, "_UNISWAP_V3_ROUTER_ADDRESS"); string memory odosV2RouterVar = string.concat(networkUpper, "_ODOS_V2_ROUTER_ADDRESS"); string memory pendleSwapV3RouterVar = string.concat(networkUpper, "_PENDLE_SWAP_V3_ROUTER_ADDRESS"); - string memory oracleTimelockVar = string.concat(networkUpper, "_ORACLE_TIMELOCK"); uniswapV3RouterAddr = vm.envAddress(uniswapV3RouterVar); odosV2RouterAddr = vm.envAddress(odosV2RouterVar); pendleSwapV3RouterAddr = vm.envAddress(pendleSwapV3RouterVar); @@ -93,17 +93,16 @@ contract DeployAdapters is DeployBase { uint256 currentTimestamp = block.timestamp; vm.startBroadcast(deployerPrivateKey); - if ( - keccak256(abi.encodePacked(network)) == keccak256(abi.encodePacked("eth-mainnet")) - || keccak256(abi.encodePacked(network)) == keccak256(abi.encodePacked("arb-mainnet")) - || keccak256(abi.encodePacked(network)) == keccak256(abi.encodePacked("bnb-mainnet")) - ) { - (uniswapV3Adapter, odosV2Adapter, pendleSwapV3Adapter, vaultAdapter) = deployAdaptersMainnet( - accessManagerAddr, routerAddr, uniswapV3RouterAddr, odosV2RouterAddr, pendleSwapV3RouterAddr - ); - } else { - revert("This script is only for mainnet deployments"); - } + // if ( + // keccak256(abi.encodePacked(network)) == keccak256(abi.encodePacked("eth-mainnet")) + // || keccak256(abi.encodePacked(network)) == keccak256(abi.encodePacked("arb-mainnet")) + // || keccak256(abi.encodePacked(network)) == keccak256(abi.encodePacked("bnb-mainnet")) + // ) { + (uniswapV3Adapter, odosV2Adapter, pendleSwapV3Adapter, vaultAdapter) = + deployAdapters(accessManagerAddr, routerAddr, uniswapV3RouterAddr, odosV2RouterAddr, pendleSwapV3RouterAddr); + // } else { + // revert("This script is only for mainnet deployments"); + // } vm.stopBroadcast(); console.log("===== Git Info ====="); @@ -149,27 +148,23 @@ contract DeployAdapters is DeployBase { ' "admin": "', vm.toString(adminAddr), '",\n', - ' "swapAdapter": ', - keccak256(abi.encodePacked(network)) == keccak256(abi.encodePacked("eth-mainnet")) - || keccak256(abi.encodePacked(network)) == keccak256(abi.encodePacked("arb-mainnet")) - || keccak256(abi.encodePacked(network)) == keccak256(abi.encodePacked("bnb-mainnet")) - ? string.concat( - "{\n", - ' "uniswapV3Adapter": "', - vm.toString(address(uniswapV3Adapter)), - '",\n', - ' "odosV2Adapter": "', - vm.toString(address(odosV2Adapter)), - '",\n', - ' "pendleSwapV3Adapter": "', - vm.toString(address(pendleSwapV3Adapter)), - '",\n', - ' "ERC4626VaultAdapter": "', - vm.toString(address(vaultAdapter)), - '"\n', - " },\n" - ) - : '"\n', + ' "swapAdapter": ', + string.concat( + "{\n", + ' "uniswapV3Adapter": "', + vm.toString(address(uniswapV3Adapter)), + '",\n', + ' "odosV2Adapter": "', + vm.toString(address(odosV2Adapter)), + '",\n', + ' "pendleSwapV3Adapter": "', + vm.toString(address(pendleSwapV3Adapter)), + '",\n', + ' "ERC4626VaultAdapter": "', + vm.toString(address(vaultAdapter)), + '"\n', + " }\n" + ), "}" ) ); @@ -181,7 +176,9 @@ contract DeployAdapters is DeployBase { vm.createDir(deploymentsDir, true); } - string memory deploymentPath = string.concat(deploymentsDir, "/", network, "-adapters.json"); + // Create filename with date string using StringHelper + string memory dateString = getDateSuffix(); + string memory deploymentPath = string.concat(deploymentsDir, "/", network, "-adapters-", dateString, ".json"); vm.writeFile(deploymentPath, deploymentJson); console.log("Deployment info written to:", deploymentPath); } diff --git a/script/deploy/DeployBase.s.sol b/script/deploy/DeployBase.s.sol index be9adb2..3caa654 100644 --- a/script/deploy/DeployBase.s.sol +++ b/script/deploy/DeployBase.s.sol @@ -167,7 +167,7 @@ contract DeployBase is Script { accessManager.setAdapterWhitelist(router, address(vaultAdapter), true); } - function deployAdaptersMainnet( + function deployAdapters( address accessManagerAddr, address routerAddr, address uniswapV3Router, @@ -452,7 +452,7 @@ contract DeployBase is Script { // Helper function to generate date suffix for JSON files function getDateSuffix() internal view returns (string memory) { - return StringHelper.convertTimestampToDateString(block.timestamp); + return StringHelper.convertTimestampToDateString(block.timestamp, "YYYYMMDD"); } // Helper function to create deployment file path with date suffix diff --git a/script/utils/StringHelper.sol b/script/utils/StringHelper.sol index abe2d0f..4723c5c 100644 --- a/script/utils/StringHelper.sol +++ b/script/utils/StringHelper.sol @@ -23,7 +23,14 @@ library StringHelper { return string(bUpper); } - function convertTimestampToDateString(uint256 timestamp) internal pure returns (string memory) { + // Format options: + // 'YYYYMMDD' = YYYYMMDD (e.g., 20250626) + // 'DDMMMYYYY' = DDMMMYYYY (e.g., 26JUN2025) + function convertTimestampToDateString(uint256 timestamp, string memory format) + internal + pure + returns (string memory) + { // Define arrays for date conversion string[12] memory months = ["JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"]; uint8[12] memory daysPerMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; @@ -69,15 +76,33 @@ library StringHelper { VmSafe vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code"))))); - // Format day with leading zero if needed - string memory dayStr; - if (day < 10) { - dayStr = string.concat("0", vm.toString(day)); + if (keccak256(abi.encodePacked(format)) == keccak256(abi.encodePacked("YYYYMMDD"))) { + // Format YYYYMMDD: (e.g., 20250626) + string memory monthStr; + if (month + 1 < 10) { + monthStr = string.concat("0", vm.toString(month + 1)); + } else { + monthStr = vm.toString(month + 1); + } + + string memory dayStr; + if (day < 10) { + dayStr = string.concat("0", vm.toString(day)); + } else { + dayStr = vm.toString(day); + } + + return string.concat(vm.toString(year), monthStr, dayStr); } else { - dayStr = vm.toString(day); - } + // Format DDMMMYYYY: (e.g., 26JUN2025) + string memory dayStr; + if (day < 10) { + dayStr = string.concat("0", vm.toString(day)); + } else { + dayStr = vm.toString(day); + } - // Combine day, month, year - return string.concat(dayStr, months[month], vm.toString(year)); + return string.concat(dayStr, months[month], vm.toString(year)); + } } } From 6df73087d0a3fea4e02a80dc2caee4bd61ca4a96 Mon Sep 17 00:00:00 2001 From: Vincent Date: Mon, 30 Jun 2025 14:29:40 +0800 Subject: [PATCH 139/194] deploye new adapters on ETH, ARB, BNB --- .../1/run-1751205191.json | 348 ++++++++++++++++ .../DeployAdapters.s.sol/1/run-latest.json | 272 +++++++------ .../42161/run-1751264345.json | 374 ++++++++++++++++++ .../42161/run-latest.json | 298 +++++++------- .../56/run-1751264857.json | 350 ++++++++++++++++ .../DeployAdapters.s.sol/56/run-latest.json | 292 +++++++------- .../arb-mainnet-adapters-20250630.json | 18 + .../bnb-mainnet-adapters-20250630.json | 18 + .../eth-mainnet-adapters-20250629.json | 18 + 9 files changed, 1541 insertions(+), 447 deletions(-) create mode 100644 broadcast/DeployAdapters.s.sol/1/run-1751205191.json create mode 100644 broadcast/DeployAdapters.s.sol/42161/run-1751264345.json create mode 100644 broadcast/DeployAdapters.s.sol/56/run-1751264857.json create mode 100644 deployments/arb-mainnet/arb-mainnet-adapters-20250630.json create mode 100644 deployments/bnb-mainnet/bnb-mainnet-adapters-20250630.json create mode 100644 deployments/eth-mainnet/eth-mainnet-adapters-20250629.json diff --git a/broadcast/DeployAdapters.s.sol/1/run-1751205191.json b/broadcast/DeployAdapters.s.sol/1/run-1751205191.json new file mode 100644 index 0000000..d48d0ac --- /dev/null +++ b/broadcast/DeployAdapters.s.sol/1/run-1751205191.json @@ -0,0 +1,348 @@ +{ + "transactions": [ + { + "hash": "0xf2daa6436d45ff83f0183aa5236377f589706adb7828bb939bb494c5acdc4535", + "transactionType": "CREATE", + "contractName": null, + "contractAddress": "0xe7a88ab1329cad4168563516e35753b979d0c7a9", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "gas": "0xbaa7f", + "value": "0x0", + "input": "0x60c034607a57601f610a3738819003918201601f19168301916001600160401b03831184841017607e57808492602094604052833981010312607a57516001600160a01b03811690819003607a573060805260a0526040516109a4908161009382396080518160fd015260a051818181606501526101610152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146106c15780636563c0e9146105f55780639df3032514610495578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b161072d565b6100b9610743565b5060443567ffffffffffffffff8111610094576100da903690600401610797565b60643567ffffffffffffffff8111610094576100fa903690600401610797565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630146104865781516001600160a01b039190911691602080820192820191909103126100945751604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316602482018190529193919290602081604481855afa80156103bd5785905f90610450575b6101b79250610857565b60405163095ea7b360e01b60208083019182526001600160a01b03871660248401526044808401949094529282529091905f906101f5606485610759565b83519082865af15f513d82610434575b5050156103f0575b505080518101916080826020850194031261009457602082015167ffffffffffffffff811161009457820183603f82011215610094576020810151906102528261077b565b946102606040519687610759565b8286526040828401011161009457815f926040602093018388015e85010152604082015191608060608201519101519061029b8187846108d0565b9080156103dc57866102b09309151590610857565b9260405160a081019080821067ffffffffffffffff8311176103c857602095610322935f936040528252868201903082526040830196875260608301988952608083019081526040519889978896879563c04b8d5960e01b87528b60048801525160a0602488015260c4870190610833565b93516001600160a01b031660448601525160648501525160848401525160a483015203925af180156103bd575f90610389575b6103859060405190602082015260208152610371604082610759565b604051918291602083526020830190610833565b0390f35b506020813d6020116103b5575b816103a360209383610759565b81010312610094576103859051610355565b3d9150610396565b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b61042d9161042860405163095ea7b360e01b60208201528660248201525f604482015260448152610422606482610759565b82610878565b610878565b838061020d565b9091506104485750813b15155b8680610205565b600114610441565b50506020813d60201161047e575b8161046b60209383610759565b8101031261009457846101b791516101ad565b3d915061045e565b6302f3451d60e21b5f5260045ffd5b34610094576104a3366107dd565b80516001600160a01b039093169260208083019291820191909103126100945751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa9081156103bd575f916105c1575b5061054a936105586105176020945f94610857565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f198101875286610759565b84519082855af15f513d826105a5575b50501561057157005b6104286105a3936040519063095ea7b360e01b602083015260248201525f604482015260448152610422606482610759565b005b9091506105b95750803b15155b8480610568565b6001146105b2565b90506020813d6020116105ed575b816105dc60209383610759565b81010312610094575161054a610502565b3d91506105cf565b346100945760803660031901126100945761060e61072d565b610616610743565b6044356001600160a01b03811692908390036100945760643567ffffffffffffffff81116100945761064c903690600401610797565b6020815191818082019384920101031261009457515f1981146106b2576105a393604051936323b872dd60e01b602086015260018060a01b0316602485015260448401526064830152606482526106a4608483610759565b6001600160a01b0316610878565b630d550c3b60e11b5f5260045ffd5b34610094576106cf366107dd565b602081939293519181808201938492010103126100945751905f1982146106b25760405163a9059cbb60e01b60208201526001600160a01b039390931660248401526044808401929092529082526105a391906106a4606483610759565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff8211176103c857604052565b67ffffffffffffffff81116103c857601f01601f191660200190565b81601f82011215610094578035906107ae8261077b565b926107bc6040519485610759565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff82116100945761083091600401610797565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9190820180921161086457565b634e487b7160e01b5f52601160045260245ffd5b905f602091828151910182855af1156103bd575f513d6108c757506001600160a01b0381163b155b6108a75750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156108a0565b91818302915f198185099383808610950394808603951461096057848311156109485790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b5050809250156103dc57049056fea2646970667358221220c66a6ef0f7fbba462fbafbd2ef2a7ef760baae0e9780be52e06dc1d37795583464736f6c634300081d0033000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564", + "nonce": "0x372", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x4ea8a0018eabfecd3b165de13922451e45676c4afb2f5c9978eb10ca30b97e9c", + "transactionType": "CREATE", + "contractName": null, + "contractAddress": "0x24c7e21a91cdb7760798e02ea5639d4c60b0c442", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "gas": "0xc9ca6", + "value": "0x0", + "input": "0x60c034607a57601f610b1438819003918201601f19168301916001600160401b03831184841017607e57808492602094604052833981010312607a57516001600160a01b03811690819003607a573060805260a052604051610a81908161009382396080518160fd015260a051818181606501526101610152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146107565780636563c0e91461068a5780639df303251461052a578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b16107c2565b6100b96107d8565b5060443567ffffffffffffffff8111610094576100da90369060040161082c565b60643567ffffffffffffffff8111610094576100fa90369060040161082c565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316301461051b5781516001600160a01b039190911691602080820192820191909103126100945751604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031660248201819052919290602081604481855afa80156104665784905f906104e5575b6101b59250610900565b60405163095ea7b360e01b60208083019182526001600160a01b03861660248401526044808401949094529282529091905f906101f36064856107ee565b83519082865af15f513d826104c9575b505015610485575b505082518301908360208301920361014081126100945760e013610094576040519160e0830183811067ffffffffffffffff82111761047157604052610253602086016108ec565b83526040850151906020840191825261026e606087016108ec565b9360408101948552610282608088016108ec565b966060820197885260a0810151926080830193845260c08201519760a084019889526102b060e084016108ec565b9160c0850192835261010084015167ffffffffffffffff811161009457840181603f82011215610094576020810151906102e982610810565b926102f760405194856107ee565b8284526040828401011161009457815f926040602093018386015e830101526101208401516001600160a01b03811694908590036100945761014001519263ffffffff84168094036100945760209a876103e09461035a5f9a51828d5191610921565b825261036a8351828d5191610921565b83528a52308352604051630ed8d73960e21b815297516001600160a01b0390811660048a0152995160248901529a51891660448801529b518816606487015298516084860152995160a4850152965190941660c483015261014060e48301529096879586948593929091906101448501906108c8565b9161010484015261012483015203925af18015610466575f90610432575b61042e906040519060208201526020815261041a6040826107ee565b6040519182916020835260208301906108c8565b0390f35b506020813d60201161045e575b8161044c602093836107ee565b810103126100945761042e90516103fe565b3d915061043f565b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b6104c2916104bd60405163095ea7b360e01b60208201528560248201525f6044820152604481526104b76064826107ee565b82610955565b610955565b838061020b565b9091506104dd5750813b15155b8680610203565b6001146104d6565b50506020813d602011610513575b81610500602093836107ee565b8101031261009457836101b591516101ab565b3d91506104f3565b6302f3451d60e21b5f5260045ffd5b346100945761053836610872565b80516001600160a01b039093169260208083019291820191909103126100945751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa908115610466575f91610656575b506105df936105ed6105ac6020945f94610900565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f1981018752866107ee565b84519082855af15f513d8261063a575b50501561060657005b6104bd610638936040519063095ea7b360e01b602083015260248201525f6044820152604481526104b76064826107ee565b005b90915061064e5750803b15155b84806105fd565b600114610647565b90506020813d602011610682575b81610671602093836107ee565b8101031261009457516105df610597565b3d9150610664565b34610094576080366003190112610094576106a36107c2565b6106ab6107d8565b6044356001600160a01b03811692908390036100945760643567ffffffffffffffff8111610094576106e190369060040161082c565b6020815191818082019384920101031261009457515f1981146107475761063893604051936323b872dd60e01b602086015260018060a01b0316602485015260448401526064830152606482526107396084836107ee565b6001600160a01b0316610955565b630d550c3b60e11b5f5260045ffd5b346100945761076436610872565b602081939293519181808201938492010103126100945751905f1982146107475760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261063891906107396064836107ee565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff82111761047157604052565b67ffffffffffffffff811161047157601f01601f191660200190565b81601f820112156100945780359061084382610810565b9261085160405194856107ee565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff8211610094576108c59160040161082c565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b51906001600160a01b038216820361009457565b9190820180921161090d57565b634e487b7160e01b5f52601160045260245ffd5b9161092d8183856109ad565b918115610941576108c59309151590610900565b634e487b7160e01b5f52601260045260245ffd5b905f602091828151910182855af115610466575f513d6109a457506001600160a01b0381163b155b6109845750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b6001141561097d565b91818302915f1981850993838086109503948086039514610a3d5784831115610a255790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b50508092501561094157049056fea2646970667358221220191f3a0969690b852c0fad405075e504d7c37835c39e58743a8dc57c2ad534da64736f6c634300081d0033000000000000000000000000cf5540fffcdc3d510b18bfca6d2b9987b0772559", + "nonce": "0x373", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xf463dfa8918b5fbd3f0519033b108b709e57252c25c8eed9fdd3ba586c0bde83", + "transactionType": "CREATE", + "contractName": null, + "contractAddress": "0x15aa533cded42c2e38d2bc3ece5bd2bfcf3dd2c0", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "gas": "0x1670a3", + "value": "0x0", + "input": "0x60c0604052346100f757604051601f61132138819003918201601f19168301916001600160401b038311848410176100e3578084926020946040528339810103126100f757516001600160a01b038116908190036100f7573060805260405160a081016001600160401b038111828210176100e357655af3107a4000916080916040525f81525f1960208201525f6040820152610100606082015201525f6008555f196009555f600a55610100600b55655af3107a4000600c5560a05260405161122590816100fc82396080518161025d015260a0518181816089015261031d0152f35b634e487b7160e01b5f52604160045260245ffd5b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816309316dd314610b30575080633268263b14610ac45780634ebfc81414610a855780636563c0e9146109b95780639df303251461084e578063e0a80413146101f8578063f66a7749146100bc5763f887ea4014610074575f80fd5b346100b8575f3660031901126100b8576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b346100b8575f3660031901126100b8575f54604051905f6001548060011c91600182169182156101ee575b6020841083146101da5783865285929081156101bb575060011461015c575b61011292500383610cd2565b60ff60025416610150604051938361012e8660ff819716610e04565b60081c6001600160a01b03166020850152608060408501819052840190610d08565b90151560608301520390f35b5060015f90815290917fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b81831061019f57505090602061011292820101610106565b6020919350806001915483858901015201910190918492610187565b6020925061011294915060ff191682840152151560051b820101610106565b634e487b7160e01b5f52602260045260245ffd5b92607f16926100e7565b346100b85760803660031901126100b857610211610d2c565b610219610d42565b60443567ffffffffffffffff81116100b857610239903690600401610d58565b9160643567ffffffffffffffff81116100b85761025a903690600401610d58565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316301461083f5783516001600160a01b0393841694919093169260208083019291820191909103126100b85751916060828051810103126100b85760208201516001600160a01b03811691908290036100b857606060408401519301519460405195630b2339af60e21b8752606087600481875afa968715610508575f976107d2575b50604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316602482018190529590602081604481885afa80156105085788905f9061079c575b6103709250611041565b60405163095ea7b360e01b60208083019182526001600160a01b038a1660248401526044808401949094529282529091905f906103ae606485610cd2565b83519082895af15f513d82610780575b50501561073c575b506103d2818884611151565b90801561072857876103e79309151590611041565b956001600160a01b0316818103610513575050935f606094939261047e9661040d611062565b95818752602087015260408601526104906040519788968795869463640fc23d60e11b86523060048701526024860152604485015260085460648501526009546084850152600a5460a4850152600b5460c4850152600c5460e4850152610140610104850152610144840190610e40565b82810360031901610124840152610ff1565b03925af18015610508576104d3915f916104d7575b505b604051906020820152602081526104bf604082610cd2565b604051918291602083526020830190610d08565b0390f35b6104f9915060603d606011610501575b6104f18183610cd2565b810190610e25565b5050826104a5565b503d6104e7565b6040513d5f823e3d90fd5b9150949391604051630bc4ed8360e21b8152602081600481865afa908115610508575f916106ed575b50156106535750936020600494956040519586809263781c18db60e01b82525afa938415610508575f9461060b575b50905f61057f6105bc9660409695946110d2565b938551968795869485936323f8ef1160e11b855230600486015260018060a01b031660248501526044840152608060648401526084830190610e40565b03925af18015610508575f906105d7575b6104d391506104a7565b506040813d604011610603575b816105f160409383610cd2565b810103126100b8576104d390516105cd565b3d91506105e4565b90929193506020813d60201161064b575b8161062960209383610cd2565b810103126100b85751926001600160a01b03841684036100b85790915f61056b565b3d915061061c565b929190505f6106676060956106a0976110d2565b936106b160405197889687958694631652a23360e21b86523060048701526024860152604485015260a0606485015260a4840190610e40565b828103600319016084840152610ff1565b03925af18015610508576104d3915f916106cc575b506104a7565b6106e5915060603d606011610501576104f18183610cd2565b5050826106c6565b90506020813d602011610720575b8161070860209383610cd2565b810103126100b8575180151581036100b8578761053c565b3d91506106fb565b634e487b7160e01b5f52601260045260245ffd5b61077a9061077460405163095ea7b360e01b60208201528960248201525f60448201526044815261076e606482610cd2565b876110f9565b856110f9565b886103c6565b9091506107945750843b15155b8a806103be565b60011461078d565b50506020813d6020116107ca575b816107b760209383610cd2565b810103126100b857876103709151610366565b3d91506107aa565b9096506060813d606011610837575b816107ee60609383610cd2565b810103126100b85780516001600160a01b038116036100b8576020810151906001600160a01b03821682036100b857604001516001600160a01b038116036100b8579587610307565b3d91506107e1565b6302f3451d60e21b5f5260045ffd5b346100b85761085c36610dae565b80516001600160a01b039093169260208083019291820191909103126100b85751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa908115610508575f91610985575b50610903936109116108d06020945f94611041565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f198101875286610cd2565b84519082855af15f513d82610969575b50501561092a57005b610962610967936040519063095ea7b360e01b602083015260248201525f60448201526044815261095c606482610cd2565b826110f9565b6110f9565b005b90915061097d5750803b15155b8480610921565b600114610976565b90506020813d6020116109b1575b816109a060209383610cd2565b810103126100b857516109036108bb565b3d9150610993565b346100b85760803660031901126100b8576109d2610d2c565b6109da610d42565b6044356001600160a01b03811692908390036100b85760643567ffffffffffffffff81116100b857610a10903690600401610d58565b602081519181808201938492010103126100b857515f198114610a765761096793604051936323b872dd60e01b602086015260018060a01b031660248501526044840152606483015260648252610a68608483610cd2565b6001600160a01b03166110f9565b630d550c3b60e11b5f5260045ffd5b346100b8575f3660031901126100b85760a0600854600954600a54600b5490600c54926040519485526020850152604084015260608301526080820152f35b346100b857610ad236610dae565b602081939293519181808201938492010103126100b85751905f198214610a765760405163a9059cbb60e01b60208201526001600160a01b039390931660248401526044808401929092529082526109679190610a68606483610cd2565b346100b8575f3660031901126100b85760018060a01b0360035416600454915f6007548060011c90600181168015610c31575b6020831081146101da57828552908115610c0d5750600114610baf575b5090610b91816104d3930382610cd2565b60405193849384526020840152606060408401526060830190610d08565b60075f9081527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688939250905b808210610bf357509091508101602001610b91610b80565b919260018160209254838588010152019101909291610bdb565b60ff191660208086019190915291151560051b84019091019150610b919050610b80565b91607f1691610b63565b5f92918154918260011c92600181168015610cc8575b6020851081146101da57848452908115610cab5750600114610c7257505050565b5f9081526020812093945091925b838310610c91575060209250010190565b600181602092949394548385870101520191019190610c80565b915050602093945060ff929192191683830152151560051b010190565b93607f1693610c51565b90601f8019910116810190811067ffffffffffffffff821117610cf457604052565b634e487b7160e01b5f52604160045260245ffd5b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036100b857565b602435906001600160a01b03821682036100b857565b81601f820112156100b85780359067ffffffffffffffff8211610cf45760405192610d8d601f8401601f191660200185610cd2565b828452602083830101116100b857815f926020809301838601378301015290565b60606003198201126100b8576004356001600160a01b03811681036100b857916024356001600160a01b03811681036100b857916044359067ffffffffffffffff82116100b857610e0191600401610d58565b90565b90600b821015610e115752565b634e487b7160e01b5f52602160045260245ffd5b908160609103126100b8578051916040602083015192015190565b60809060018060a01b0381511683526020810151602084015260018060a01b03604082015116604084015260018060a01b03606082015116606084015201519060a06080820152610e9560a082018351610e04565b60208201516001600160a01b031660c08201526040820151608060e083015261010090606090610eca90610120850190610d08565b930151151591015290565b908060208354918281520160208260051b840101935f5260205f20925f905b838210610f0357505050505090565b9091929394601f19828203018452606081528554606082015260018601546080820152600286015460a0820152600386015460ff81166004811015610e115760c08301526001600160a01b03600891821c811660e0840152600488015481166101008401526005880154811661012084015260068801541661014083015260078701546101608301528601546101808083019190915260098701546101a08301526101c0820152600190602090600d90610fd7610fc76101e08301600a8c01610c3b565b82810385840152600b8b01610c3b565b906040600c8b015491015297019401920190939293610ef4565b610e019060018060a01b03600354168152600454602082015260a0604082015261103161102260a083016005610ed5565b82810360608401526006610ed5565b9060808183039101526007610c3b565b9190820180921161104e57565b634e487b7160e01b5f52601160045260245ffd5b6040519060a0820182811067ffffffffffffffff821117610cf457604052815f81525f60208201525f60408201525f606082015260405190608082019082821067ffffffffffffffff831117610cf4576080916040525f83525f6020840152606060408401525f60608401520152565b91906110dc611062565b6001600160a01b0390931680845260208401919091526040830152565b905f602091828151910182855af115610508575f513d61114857506001600160a01b0381163b155b6111285750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b60011415611121565b91818302915f19818509938380861095039480860395146111e157848311156111c95790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b50508092501561072857049056fea26469706673582212205bf94e5371bc2f132405be99261f2b9351cbdbf49e328ca512e068eee1eda9d164736f6c634300081d0033000000000000000000000000888888888889758f76e7103c6cbf23abbf58f946", + "nonce": "0x374", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xc537405635d58ef18f7259589f1171d68a7393b7c65c29da13079607be3c14ef", + "transactionType": "CREATE", + "contractName": null, + "contractAddress": "0x98b0c4c13068c3010a809174af31061aef547fbe", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "gas": "0xaf02f", + "value": "0x0", + "input": "0x60a0806040523460215730608052610900908161002682396080518160aa0152f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146106395780636563c0e91461056d5780639df303251461040d5763e0a8041314610045575f80fd5b346102a35760803660031901126102a35761005e6106a5565b6100666106bb565b9060443567ffffffffffffffff81116102a357610087903690600401610707565b60643567ffffffffffffffff81116102a3576100a7903690600401610707565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630146103fe5781516001600160a01b039182169490911691602080820192820191909103126102a35751926060838051810103126102a35760208301519260028410156102a357606060408201519101519061012f81878461082c565b9080156103ea578661014493091515906107b3565b92806103525750604051636eb1769f60e11b815230600482015260248101839052602081604481855afa9081156102af575f9161031a575b50846020939261018f5f976044946107b3565b60405163095ea7b360e01b8782019081526001600160a01b038716602483015260448083019390935291815290869089906101cb6064856106d1565b83519082865af188513d826102fb575b5050156102ba575b50506040519586938492636e553f6560e01b845260048401523060248401525af19182156102af575f92610277575b50818181106102625750505b60408051602081019283526020815261023782826106d1565b8151928391602083525180918160208501528484015e5f828201840152601f01601f19168101030190f35b63eb7f211d60e01b5f5260045260245260445ffd5b9091506020813d6020116102a7575b81610293602093836106d1565b810103126102a35751905f610212565b5f80fd5b3d9150610286565b6040513d5f823e3d90fd5b6102f4916102ef60405163095ea7b360e01b898201528760248201528a878201528681526102e96064826106d1565b826107d4565b6107d4565b5f806101e3565b9091501589146103125750813b15155b5f806101db565b60011461030b565b90506020929192813d60201161034a575b81610338602093836106d1565b810103126102a357519091908461017c565b3d915061032b565b909391506001036103db575f9260646020926040519586938492635d043b2960e11b845260048401523060248401523060448401525af19182156102af575f926103a7575b508181811061026257505061021e565b9091506020813d6020116103d3575b816103c3602093836106d1565b810103126102a35751905f610397565b3d91506103b6565b634a7f394f60e01b5f5260045ffd5b634e487b7160e01b5f52601260045260245ffd5b6302f3451d60e21b5f5260045ffd5b346102a35761041b3661075d565b80516001600160a01b039093169260208083019291820191909103126102a35751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa9081156102af575f91610539575b506104c2936104d061048f6020945f946107b3565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f1981018752866106d1565b84519082855af15f513d8261051d575b5050156104e957005b6102ef61051b936040519063095ea7b360e01b602083015260248201525f6044820152604481526102e96064826106d1565b005b9091506105315750803b15155b84806104e0565b60011461052a565b90506020813d602011610565575b81610554602093836106d1565b810103126102a357516104c261047a565b3d9150610547565b346102a35760803660031901126102a3576105866106a5565b61058e6106bb565b6044356001600160a01b03811692908390036102a35760643567ffffffffffffffff81116102a3576105c4903690600401610707565b602081519181808201938492010103126102a357515f19811461062a5761051b93604051936323b872dd60e01b602086015260018060a01b03166024850152604484015260648301526064825261061c6084836106d1565b6001600160a01b03166107d4565b630d550c3b60e11b5f5260045ffd5b346102a3576106473661075d565b602081939293519181808201938492010103126102a35751905f19821461062a5760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261051b919061061c6064836106d1565b600435906001600160a01b03821682036102a357565b602435906001600160a01b03821682036102a357565b90601f8019910116810190811067ffffffffffffffff8211176106f357604052565b634e487b7160e01b5f52604160045260245ffd5b81601f820112156102a35780359067ffffffffffffffff82116106f3576040519261073c601f8401601f1916602001856106d1565b828452602083830101116102a357815f926020809301838601378301015290565b60606003198201126102a3576004356001600160a01b03811681036102a357916024356001600160a01b03811681036102a357916044359067ffffffffffffffff82116102a3576107b091600401610707565b90565b919082018092116107c057565b634e487b7160e01b5f52601160045260245ffd5b905f602091828151910182855af1156102af575f513d61082357506001600160a01b0381163b155b6108035750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156107fc565b91818302915f19818509938380861095039480860395146108bc57848311156108a45790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b5050809250156103ea57049056fea26469706673582212208494a0174c4f07fd048515a6e3e22a540bf8edf31a0e807f0e3019b7d5b7c74464736f6c634300081d0033", + "nonce": "0x375", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x0edabaf9bb416d8da0cc6bab22db3331f8f03687db2ae084568f6db9b29e9928", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "gas": "0x157eb", + "value": "0x0", + "input": "0xb6b07b8e000000000000000000000000c47591f5c023e44931c78d5a993834875b79fb11000000000000000000000000e7a88ab1329cad4168563516e35753b979d0c7a90000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x376", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xb86edb13b2b4accef989a5413c7ee981fe8a3816e77febc5e996b2b490d1b189", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "gas": "0x157eb", + "value": "0x0", + "input": "0xb6b07b8e000000000000000000000000c47591f5c023e44931c78d5a993834875b79fb1100000000000000000000000024c7e21a91cdb7760798e02ea5639d4c60b0c4420000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x377", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x4dcd942cf748d01d465990bc0f1327d8d7110a7fd3fe18fef6fa2e520284457c", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "gas": "0x157eb", + "value": "0x0", + "input": "0xb6b07b8e000000000000000000000000c47591f5c023e44931c78d5a993834875b79fb1100000000000000000000000015aa533cded42c2e38d2bc3ece5bd2bfcf3dd2c00000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x378", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xc646f81422b4dc30572a9330ac3cb8a9331cf27bdc77792567e32539134d9b37", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "gas": "0x157eb", + "value": "0x0", + "input": "0xb6b07b8e000000000000000000000000c47591f5c023e44931c78d5a993834875b79fb1100000000000000000000000098b0c4c13068c3010a809174af31061aef547fbe0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x379", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0xcd2725", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xf2daa6436d45ff83f0183aa5236377f589706adb7828bb939bb494c5acdc4535", + "transactionIndex": "0x99", + "blockHash": "0x97f90f4506a3f351c0fbbf91db53f4a2c20a3bc85a80044c6c15565ee7762747", + "blockNumber": "0x15c0f80", + "gasUsed": "0x8f94e", + "effectiveGasPrice": "0x1828147f", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": null, + "contractAddress": "0xe7a88ab1329cad4168563516e35753b979d0c7a9" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xcf1e14", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x4ea8a0018eabfecd3b165de13922451e45676c4afb2f5c9978eb10ca30b97e9c", + "transactionIndex": "0xa3", + "blockHash": "0x10a44b610791154ac2493e53628d7b0e698ca26c96e7540e14977b31c09d0c73", + "blockNumber": "0x15c0f81", + "gasUsed": "0x9b394", + "effectiveGasPrice": "0x179d8852", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": null, + "contractAddress": "0x24c7e21a91cdb7760798e02ea5639d4c60b0c442" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xf813a4", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xf463dfa8918b5fbd3f0519033b108b709e57252c25c8eed9fdd3ba586c0bde83", + "transactionIndex": "0xa0", + "blockHash": "0x5ad9da45f57cfc2ac085916dc03d9b5c181c9f524ce28b7bb5aa4f2fba142a2b", + "blockNumber": "0x15c0f82", + "gasUsed": "0x1142f4", + "effectiveGasPrice": "0x17682ffc", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": null, + "contractAddress": "0x15aa533cded42c2e38d2bc3ece5bd2bfcf3dd2c0" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x118be78", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xc537405635d58ef18f7259589f1171d68a7393b7c65c29da13079607be3c14ef", + "transactionIndex": "0x99", + "blockHash": "0x03749f50f32c89151673f312c1de346ff63a75a64663781f2dfc08a7e028169e", + "blockNumber": "0x15c0f83", + "gasUsed": "0x869fd", + "effectiveGasPrice": "0x17868520", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": null, + "contractAddress": "0x98b0c4c13068c3010a809174af31061aef547fbe" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xd874f9", + "logs": [ + { + "address": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x000000000000000000000000e7a88ab1329cad4168563516e35753b979d0c7a90000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x2bfa0843bfebaf4c2fb06f128d76d869ba9799fadf2188c89647dc7355736dd0", + "blockNumber": "0x15c0f84", + "blockTimestamp": "0x686144f3", + "transactionHash": "0x0edabaf9bb416d8da0cc6bab22db3331f8f03687db2ae084568f6db9b29e9928", + "transactionIndex": "0xa3", + "logIndex": "0x19d", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000010800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000020000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x0edabaf9bb416d8da0cc6bab22db3331f8f03687db2ae084568f6db9b29e9928", + "transactionIndex": "0xa3", + "blockHash": "0x2bfa0843bfebaf4c2fb06f128d76d869ba9799fadf2188c89647dc7355736dd0", + "blockNumber": "0x15c0f84", + "gasUsed": "0xf8ff", + "effectiveGasPrice": "0x17d40cc1", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x463c0f", + "logs": [ + { + "address": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x00000000000000000000000024c7e21a91cdb7760798e02ea5639d4c60b0c4420000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xa12b5c6307e27ec9ad6bacb5502299e3099c0cd4d021e3e9c6361e796d5dd299", + "blockNumber": "0x15c0f85", + "blockTimestamp": "0x686144ff", + "transactionHash": "0xb86edb13b2b4accef989a5413c7ee981fe8a3816e77febc5e996b2b490d1b189", + "transactionIndex": "0x11", + "logIndex": "0x83", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000010800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000020000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xb86edb13b2b4accef989a5413c7ee981fe8a3816e77febc5e996b2b490d1b189", + "transactionIndex": "0x11", + "blockHash": "0xa12b5c6307e27ec9ad6bacb5502299e3099c0cd4d021e3e9c6361e796d5dd299", + "blockNumber": "0x15c0f85", + "gasUsed": "0xf8ff", + "effectiveGasPrice": "0x177ba12e", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xf9c88e", + "logs": [ + { + "address": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x00000000000000000000000015aa533cded42c2e38d2bc3ece5bd2bfcf3dd2c00000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x98ffcb4005394175c4490751e43cb16db508e7af2f09fbb162d6201b01f053e7", + "blockNumber": "0x15c0f86", + "blockTimestamp": "0x6861450b", + "transactionHash": "0x4dcd942cf748d01d465990bc0f1327d8d7110a7fd3fe18fef6fa2e520284457c", + "transactionIndex": "0x9d", + "logIndex": "0x137", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000010800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000020000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x4dcd942cf748d01d465990bc0f1327d8d7110a7fd3fe18fef6fa2e520284457c", + "transactionIndex": "0x9d", + "blockHash": "0x98ffcb4005394175c4490751e43cb16db508e7af2f09fbb162d6201b01f053e7", + "blockNumber": "0x15c0f86", + "gasUsed": "0xf8ff", + "effectiveGasPrice": "0x16fcd07a", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xa69e8d", + "logs": [ + { + "address": "0xc47591f5c023e44931c78d5a993834875b79fb11", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x00000000000000000000000098b0c4c13068c3010a809174af31061aef547fbe0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xbdedf23db717ea39f9133934ff68c5298c8300608aa41f9597e6ff3f4692e922", + "blockNumber": "0x15c0f87", + "blockTimestamp": "0x68614517", + "transactionHash": "0xc646f81422b4dc30572a9330ac3cb8a9331cf27bdc77792567e32539134d9b37", + "transactionIndex": "0x81", + "logIndex": "0x11c", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000010800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000020000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xc646f81422b4dc30572a9330ac3cb8a9331cf27bdc77792567e32539134d9b37", + "transactionIndex": "0x81", + "blockHash": "0xbdedf23db717ea39f9133934ff68c5298c8300608aa41f9597e6ff3f4692e922", + "blockNumber": "0x15c0f87", + "gasUsed": "0xf8ff", + "effectiveGasPrice": "0x16e2654d", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", + "contractAddress": null + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1751205191, + "chain": 1, + "commit": "01db0f8" +} \ No newline at end of file diff --git a/broadcast/DeployAdapters.s.sol/1/run-latest.json b/broadcast/DeployAdapters.s.sol/1/run-latest.json index 24586e6..d48d0ac 100644 --- a/broadcast/DeployAdapters.s.sol/1/run-latest.json +++ b/broadcast/DeployAdapters.s.sol/1/run-latest.json @@ -1,85 +1,79 @@ { "transactions": [ { - "hash": "0x285f30cc30eaab1ac799d72d57f614051fd2e063de938a14a773335e3733e574", + "hash": "0xf2daa6436d45ff83f0183aa5236377f589706adb7828bb939bb494c5acdc4535", "transactionType": "CREATE", - "contractName": "UniswapV3Adapter", - "contractAddress": "0xece68c88d0d1789bd13a8519fba51eb870fa0cc7", + "contractName": null, + "contractAddress": "0xe7a88ab1329cad4168563516e35753b979d0c7a9", "function": null, - "arguments": [ - "0xE592427A0AEce92De3Edee1F18E0157C05861564" - ], + "arguments": null, "transaction": { "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", - "gas": "0xb9660", + "gas": "0xbaa7f", "value": "0x0", - "input": "0x60a034606e57601f610a1838819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606e57516001600160a01b03811690819003606e57608052604051610991908161008782396080518181816065015261015c0152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146105485780636563c0e9146104c85780639df303251461048c578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b1610582565b6100b9610598565b5060443567ffffffffffffffff8111610094576100da9036906004016105ec565b60643567ffffffffffffffff8111610094576100fa9036906004016105ec565b906020815191818082019384920101031261009457516040516370a0823160e01b8152306004820152926001600160a01b0316602084602481845afa9384156103b9575f94610458575b5060405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166004820181905260248201849052906020816044815f875af180156103b957610421575b5083518401906080856020840193031261009457602085015167ffffffffffffffff811161009457850182603f82011215610094576020810151906101e4826105d0565b936101f260405195866105ae565b8285526040828401011161009457815f926040602093018387015e8401015260408501519060806060870151960151928584029380850487149015171561037357861561040d5760405160a081019080821067ffffffffffffffff8311176103f9576020956102ac935f9360405282528682019030825260408301968752606083019a8a8c5260808401910481526040519a8b978896879563c04b8d5960e01b87528b60048801525160a0602488015260c4870190610688565b93516001600160a01b031660448601525160648501525160848401525160a483015203925af19283156103b9575f936103c4575b506020602491604051928380926370a0823160e01b82523060048301525afa9081156103b9575f91610387575b508361031983836106ac565b036103525761034e836040519060208201526020815261033a6040826105ae565b604051918291602083526020830190610688565b0390f35b909150820391821161037357638e17b66b60e01b5f5260045260245260445ffd5b634e487b7160e01b5f52601160045260245ffd5b90506020813d6020116103b1575b816103a2602093836105ae565b8101031261009457518461030d565b3d9150610395565b6040513d5f823e3d90fd5b9092506020813d6020116103f1575b816103e0602093836105ae565b8101031261009457519160206102e0565b3d91506103d3565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b6020813d602011610450575b8161043a602093836105ae565b81010312610094575180151581146101a0575f80fd5b3d915061042d565b9093506020813d602011610484575b81610474602093836105ae565b8101031261009457519284610144565b3d9150610467565b346100945761049a36610632565b9190602083519381808201958692010103126100945791516104c69290916001600160a01b03166107a3565b005b34610094576080366003190112610094576104e1610582565b6104e9610598565b906044356001600160a01b03811681036100945760643567ffffffffffffffff81116100945761051d9036906004016105ec565b92602084519481808201968792010103126100945792516104c69390926001600160a01b031661073b565b346100945761055636610632565b9190602083519381808201958692010103126100945791516104c69290916001600160a01b03166106b9565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff8211176103f957604052565b67ffffffffffffffff81116103f957601f01601f191660200190565b81601f8201121561009457803590610603826105d0565b9261061160405194856105ae565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff821161009457610685916004016105ec565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9190820180921161037357565b9091905f19821461072c576001600160a01b03831630148015610724575b61071f5760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261071d91906107186064836105ae565b610903565b565b505050565b5081156106d7565b630d550c3b60e11b5f5260045ffd5b9092915f19831461072c576001600160a01b03908116931691828414801561079b575b6107955761071d93604051936323b872dd60e01b6020860152602485015260448401526064830152606482526107186084836105ae565b50505050565b50801561075e565b821580156108f1575b61071f57604051636eb1769f60e11b81523060048201526001600160a01b03838116602483018190529490831691602081604481865afa9081156103b9575f916108bd575b50610839946108476108066020945f946106ac565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529687906064820190565b03601f1981018852876105ae565b85519082865af1903d5f51908361089e575b5050501561086657505050565b61071861071d936040519063095ea7b360e01b602083015260248201525f6044820152604481526108986064826105ae565b82610903565b919250906108b357503b15155b5f8080610859565b60019150146108ab565b90506020813d6020116108e9575b816108d8602093836105ae565b8101031261009457516108396107f1565b3d91506108cb565b506001600160a01b03821630146107ac565b905f602091828151910182855af1156103b9575f513d61095257506001600160a01b0381163b155b6109325750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b6001141561092b56fea26469706673582212206ad8ebc6ec787a48097d03c1fbb2ad1b7bd771674b19f2f62398a14d8b67431064736f6c634300081b0033000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564", - "nonce": "0x363", + "input": "0x60c034607a57601f610a3738819003918201601f19168301916001600160401b03831184841017607e57808492602094604052833981010312607a57516001600160a01b03811690819003607a573060805260a0526040516109a4908161009382396080518160fd015260a051818181606501526101610152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146106c15780636563c0e9146105f55780639df3032514610495578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b161072d565b6100b9610743565b5060443567ffffffffffffffff8111610094576100da903690600401610797565b60643567ffffffffffffffff8111610094576100fa903690600401610797565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630146104865781516001600160a01b039190911691602080820192820191909103126100945751604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316602482018190529193919290602081604481855afa80156103bd5785905f90610450575b6101b79250610857565b60405163095ea7b360e01b60208083019182526001600160a01b03871660248401526044808401949094529282529091905f906101f5606485610759565b83519082865af15f513d82610434575b5050156103f0575b505080518101916080826020850194031261009457602082015167ffffffffffffffff811161009457820183603f82011215610094576020810151906102528261077b565b946102606040519687610759565b8286526040828401011161009457815f926040602093018388015e85010152604082015191608060608201519101519061029b8187846108d0565b9080156103dc57866102b09309151590610857565b9260405160a081019080821067ffffffffffffffff8311176103c857602095610322935f936040528252868201903082526040830196875260608301988952608083019081526040519889978896879563c04b8d5960e01b87528b60048801525160a0602488015260c4870190610833565b93516001600160a01b031660448601525160648501525160848401525160a483015203925af180156103bd575f90610389575b6103859060405190602082015260208152610371604082610759565b604051918291602083526020830190610833565b0390f35b506020813d6020116103b5575b816103a360209383610759565b81010312610094576103859051610355565b3d9150610396565b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b61042d9161042860405163095ea7b360e01b60208201528660248201525f604482015260448152610422606482610759565b82610878565b610878565b838061020d565b9091506104485750813b15155b8680610205565b600114610441565b50506020813d60201161047e575b8161046b60209383610759565b8101031261009457846101b791516101ad565b3d915061045e565b6302f3451d60e21b5f5260045ffd5b34610094576104a3366107dd565b80516001600160a01b039093169260208083019291820191909103126100945751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa9081156103bd575f916105c1575b5061054a936105586105176020945f94610857565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f198101875286610759565b84519082855af15f513d826105a5575b50501561057157005b6104286105a3936040519063095ea7b360e01b602083015260248201525f604482015260448152610422606482610759565b005b9091506105b95750803b15155b8480610568565b6001146105b2565b90506020813d6020116105ed575b816105dc60209383610759565b81010312610094575161054a610502565b3d91506105cf565b346100945760803660031901126100945761060e61072d565b610616610743565b6044356001600160a01b03811692908390036100945760643567ffffffffffffffff81116100945761064c903690600401610797565b6020815191818082019384920101031261009457515f1981146106b2576105a393604051936323b872dd60e01b602086015260018060a01b0316602485015260448401526064830152606482526106a4608483610759565b6001600160a01b0316610878565b630d550c3b60e11b5f5260045ffd5b34610094576106cf366107dd565b602081939293519181808201938492010103126100945751905f1982146106b25760405163a9059cbb60e01b60208201526001600160a01b039390931660248401526044808401929092529082526105a391906106a4606483610759565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff8211176103c857604052565b67ffffffffffffffff81116103c857601f01601f191660200190565b81601f82011215610094578035906107ae8261077b565b926107bc6040519485610759565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff82116100945761083091600401610797565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9190820180921161086457565b634e487b7160e01b5f52601160045260245ffd5b905f602091828151910182855af1156103bd575f513d6108c757506001600160a01b0381163b155b6108a75750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156108a0565b91818302915f198185099383808610950394808603951461096057848311156109485790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b5050809250156103dc57049056fea2646970667358221220c66a6ef0f7fbba462fbafbd2ef2a7ef760baae0e9780be52e06dc1d37795583464736f6c634300081d0033000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564", + "nonce": "0x372", "chainId": "0x1" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0xbd570f787d17545500e716109468f03dcbebd9691b82268687e076a0cdee5ada", + "hash": "0x4ea8a0018eabfecd3b165de13922451e45676c4afb2f5c9978eb10ca30b97e9c", "transactionType": "CREATE", - "contractName": "OdosV2Adapter", - "contractAddress": "0xd402019cd1ec046dd74a70922f24c2e3cbb05e24", + "contractName": null, + "contractAddress": "0x24c7e21a91cdb7760798e02ea5639d4c60b0c442", "function": null, - "arguments": [ - "0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559" - ], + "arguments": null, "transaction": { "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", - "gas": "0xcfd2b", + "gas": "0xc9ca6", "value": "0x0", - "input": "0x60a034606e57601f610b5f38819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606e57516001600160a01b03811690819003606e57608052604051610ad890816100878239608051818181606501526101600152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b1461064a5780636563c0e9146105ca5780639df303251461058e578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b1610684565b6100b961069a565b9060443567ffffffffffffffff8111610094576100da9036906004016106ee565b9060643567ffffffffffffffff8111610094576100fb9036906004016106ee565b916020815191818082019384920101031261009457516040516370a0823160e01b81523060048201529390916001600160a01b031690602085602481855afa948515610493575f9561055a575b5060405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600482018190526024820185905291906020816044815f885af1801561049357610523575b5084518501948060208701960361014081126100945760e013610094576040519060e0820182811067ffffffffffffffff82111761050f576040526101ec60208201610a05565b82526040810151926020830193845261020760608301610a05565b976040840198895261021b60808401610a05565b6060850190815260a08401516080860190815260c08501519060a0870191825261024760e08701610a05565b9260c0880193845261010087015167ffffffffffffffff811161009457870185603f8201121561009457602081015190610280826106d2565b9661028e60405198896106b0565b8288526040828401011161009457815f92604060209301838a015e870101526101208701516001600160a01b03811697908890036100945761014001519563ffffffff87168097036100945781516001600160a01b039182169116036104d3578b8251906102fb91610a19565b895161030691610a2c565b82528b83519061031591610a19565b895161032091610a2c565b83528b8952308452604051630ed8d73960e21b815297516001600160a01b0390811660048a0152985160248901529b51881660448801529a518716606487015299516084860152985160a4850152975190931660c483015261014060e4830152909586928392916103969061014485019061078a565b9161010484015261012483015203815a6020945f91f1928315610493575f9361049e575b506020602491604051928380926370a0823160e01b82523060048301525afa908115610493575f91610461575b50836103f383836107ae565b0361042c5761042883604051906020820152602081526104146040826106b0565b60405191829160208352602083019061078a565b0390f35b909150820391821161044d57638e17b66b60e01b5f5260045260245260445ffd5b634e487b7160e01b5f52601160045260245ffd5b90506020813d60201161048b575b8161047c602093836106b0565b810103126100945751846103e7565b3d915061046f565b6040513d5f823e3d90fd5b9092506020813d6020116104cb575b816104ba602093836106b0565b8101031261009457519160206103ba565b3d91506104ad565b60405162461bcd60e51b815260206004820152601460248201527324a72b20a624a22fa7aaaa282aaa2faa27a5a2a760611b6044820152606490fd5b634e487b7160e01b5f52604160045260245ffd5b6020813d602011610552575b8161053c602093836106b0565b81010312610094575180151581146101a5575f80fd5b3d915061052f565b9094506020813d602011610586575b81610576602093836106b0565b8101031261009457519385610148565b3d9150610569565b346100945761059c36610734565b9190602083519381808201958692010103126100945791516105c89290916001600160a01b03166108a5565b005b34610094576080366003190112610094576105e3610684565b6105eb61069a565b906044356001600160a01b03811681036100945760643567ffffffffffffffff81116100945761061f9036906004016106ee565b92602084519481808201968792010103126100945792516105c89390926001600160a01b031661083d565b346100945761065836610734565b9190602083519381808201958692010103126100945791516105c89290916001600160a01b03166107bb565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff82111761050f57604052565b67ffffffffffffffff811161050f57601f01601f191660200190565b81601f8201121561009457803590610705826106d2565b9261071360405194856106b0565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff821161009457610787916004016106ee565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9190820180921161044d57565b9091905f19821461082e576001600160a01b03831630148015610826575b6108215760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261081f919061081a6064836106b0565b610a4a565b565b505050565b5081156107d9565b630d550c3b60e11b5f5260045ffd5b9092915f19831461082e576001600160a01b03908116931691828414801561089d575b6108975761081f93604051936323b872dd60e01b60208601526024850152604484015260648301526064825261081a6084836106b0565b50505050565b508015610860565b821580156109f3575b61082157604051636eb1769f60e11b81523060048201526001600160a01b03838116602483018190529490831691602081604481865afa908115610493575f916109bf575b5061093b946109496109086020945f946107ae565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529687906064820190565b03601f1981018852876106b0565b85519082865af1903d5f5190836109a0575b5050501561096857505050565b61081a61081f936040519063095ea7b360e01b602083015260248201525f60448201526044815261099a6064826106b0565b82610a4a565b919250906109b557503b15155b5f808061095b565b60019150146109ad565b90506020813d6020116109eb575b816109da602093836106b0565b81010312610094575161093b6108f3565b3d91506109cd565b506001600160a01b03821630146108ae565b51906001600160a01b038216820361009457565b8181029291811591840414171561044d57565b8115610a36570490565b634e487b7160e01b5f52601260045260245ffd5b905f602091828151910182855af115610493575f513d610a9957506001600160a01b0381163b155b610a795750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b60011415610a7256fea26469706673582212204763315a6411a7960fce618c8c1b5d96ae7ea3c2ea7ebb92abcf095b95bbea1c64736f6c634300081b0033000000000000000000000000cf5540fffcdc3d510b18bfca6d2b9987b0772559", - "nonce": "0x364", + "input": "0x60c034607a57601f610b1438819003918201601f19168301916001600160401b03831184841017607e57808492602094604052833981010312607a57516001600160a01b03811690819003607a573060805260a052604051610a81908161009382396080518160fd015260a051818181606501526101610152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146107565780636563c0e91461068a5780639df303251461052a578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b16107c2565b6100b96107d8565b5060443567ffffffffffffffff8111610094576100da90369060040161082c565b60643567ffffffffffffffff8111610094576100fa90369060040161082c565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316301461051b5781516001600160a01b039190911691602080820192820191909103126100945751604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031660248201819052919290602081604481855afa80156104665784905f906104e5575b6101b59250610900565b60405163095ea7b360e01b60208083019182526001600160a01b03861660248401526044808401949094529282529091905f906101f36064856107ee565b83519082865af15f513d826104c9575b505015610485575b505082518301908360208301920361014081126100945760e013610094576040519160e0830183811067ffffffffffffffff82111761047157604052610253602086016108ec565b83526040850151906020840191825261026e606087016108ec565b9360408101948552610282608088016108ec565b966060820197885260a0810151926080830193845260c08201519760a084019889526102b060e084016108ec565b9160c0850192835261010084015167ffffffffffffffff811161009457840181603f82011215610094576020810151906102e982610810565b926102f760405194856107ee565b8284526040828401011161009457815f926040602093018386015e830101526101208401516001600160a01b03811694908590036100945761014001519263ffffffff84168094036100945760209a876103e09461035a5f9a51828d5191610921565b825261036a8351828d5191610921565b83528a52308352604051630ed8d73960e21b815297516001600160a01b0390811660048a0152995160248901529a51891660448801529b518816606487015298516084860152995160a4850152965190941660c483015261014060e48301529096879586948593929091906101448501906108c8565b9161010484015261012483015203925af18015610466575f90610432575b61042e906040519060208201526020815261041a6040826107ee565b6040519182916020835260208301906108c8565b0390f35b506020813d60201161045e575b8161044c602093836107ee565b810103126100945761042e90516103fe565b3d915061043f565b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b6104c2916104bd60405163095ea7b360e01b60208201528560248201525f6044820152604481526104b76064826107ee565b82610955565b610955565b838061020b565b9091506104dd5750813b15155b8680610203565b6001146104d6565b50506020813d602011610513575b81610500602093836107ee565b8101031261009457836101b591516101ab565b3d91506104f3565b6302f3451d60e21b5f5260045ffd5b346100945761053836610872565b80516001600160a01b039093169260208083019291820191909103126100945751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa908115610466575f91610656575b506105df936105ed6105ac6020945f94610900565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f1981018752866107ee565b84519082855af15f513d8261063a575b50501561060657005b6104bd610638936040519063095ea7b360e01b602083015260248201525f6044820152604481526104b76064826107ee565b005b90915061064e5750803b15155b84806105fd565b600114610647565b90506020813d602011610682575b81610671602093836107ee565b8101031261009457516105df610597565b3d9150610664565b34610094576080366003190112610094576106a36107c2565b6106ab6107d8565b6044356001600160a01b03811692908390036100945760643567ffffffffffffffff8111610094576106e190369060040161082c565b6020815191818082019384920101031261009457515f1981146107475761063893604051936323b872dd60e01b602086015260018060a01b0316602485015260448401526064830152606482526107396084836107ee565b6001600160a01b0316610955565b630d550c3b60e11b5f5260045ffd5b346100945761076436610872565b602081939293519181808201938492010103126100945751905f1982146107475760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261063891906107396064836107ee565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff82111761047157604052565b67ffffffffffffffff811161047157601f01601f191660200190565b81601f820112156100945780359061084382610810565b9261085160405194856107ee565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff8211610094576108c59160040161082c565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b51906001600160a01b038216820361009457565b9190820180921161090d57565b634e487b7160e01b5f52601160045260245ffd5b9161092d8183856109ad565b918115610941576108c59309151590610900565b634e487b7160e01b5f52601260045260245ffd5b905f602091828151910182855af115610466575f513d6109a457506001600160a01b0381163b155b6109845750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b6001141561097d565b91818302915f1981850993838086109503948086039514610a3d5784831115610a255790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b50508092501561094157049056fea2646970667358221220191f3a0969690b852c0fad405075e504d7c37835c39e58743a8dc57c2ad534da64736f6c634300081d0033000000000000000000000000cf5540fffcdc3d510b18bfca6d2b9987b0772559", + "nonce": "0x373", "chainId": "0x1" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0xf09987959d483053d251c4b92e8f9b37964ef6082632cf0d973286115b5c289f", + "hash": "0xf463dfa8918b5fbd3f0519033b108b709e57252c25c8eed9fdd3ba586c0bde83", "transactionType": "CREATE", - "contractName": "PendleSwapV3Adapter", - "contractAddress": "0xfbbbb37aaa95a8f1c4498c9066318c2b5680fb84", + "contractName": null, + "contractAddress": "0x15aa533cded42c2e38d2bc3ece5bd2bfcf3dd2c0", "function": null, - "arguments": [ - "0x888888888889758F76e7103c6CbF23ABbF58F946" - ], + "arguments": null, "transaction": { "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", - "gas": "0x17488f", + "gas": "0x1670a3", "value": "0x0", - "input": "0x60a0604052346100ea57604051601f6113d838819003918201601f19168301916001600160401b038311848410176100d6578084926020946040528339810103126100ea57516001600160a01b038116908190036100ea5760405160a081016001600160401b038111828210176100d657655af3107a4000916080916040525f81525f1960208201525f6040820152610100606082015201525f6008555f196009555f600a55610100600b55655af3107a4000600c556080526040516112e990816100ef8239608051818181608901526103200152f35b634e487b7160e01b5f52604160045260245ffd5b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816309316dd314610a6b575080633268263b14610a315780634ebfc814146109f25780636563c0e9146109725780639df3032514610936578063e0a80413146101f8578063f66a7749146100bc5763f887ea4014610074575f80fd5b346100b8575f3660031901126100b8576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b346100b8575f3660031901126100b8575f54604051905f6001548060011c91600182169182156101ee575b6020841083146101da5783865285929081156101bb575060011461015c575b61011292500383610c0d565b60ff60025416610150604051938361012e8660ff819716610d3f565b60081c6001600160a01b03166020850152608060408501819052840190610c43565b90151560608301520390f35b5060015f90815290917fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b81831061019f57505090602061011292820101610106565b6020919350806001915483858901015201910190918492610187565b6020925061011294915060ff191682840152151560051b820101610106565b634e487b7160e01b5f52602260045260245ffd5b92607f16926100e7565b346100b85760803660031901126100b857610211610c67565b610219610c7d565b9060443567ffffffffffffffff81116100b85761023a903690600401610c93565b9060643567ffffffffffffffff81116100b85761025b903690600401610c93565b91602081519181808201938492010103126100b857516040516370a0823160e01b8152306004820152936001600160a01b03909216929091602085602481875afa948515610551575f95610902575b5060018060a01b0316906060818051810103126100b85760208101516001600160a01b038116908190036100b857606060408301519201519260405192630b2339af60e21b8452606084600481865afa938415610551575f94610895575b5060405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600482018190526024820188905295906020816044815f8d5af1801561055157610878575b508681029080820488149015171561050b5781156108645704926001600160a01b0316908082036105ba57505060405163095ea7b360e01b81526001600160a01b038416600482015260248101859052926020846044815f8a5af1928315610551576104509460609461058d575b505f6103dd6111eb565b938885528760208601528860408601526104626040519788968795869463640fc23d60e11b86523060048701526024860152604485015260085460648501526009546084850152600a5460a4850152600b5460c4850152600c5460e4850152610140610104850152610144840190610fea565b8281036003190161012484015261119b565b03925af1908115610551576024916020915f9161055c575b50935b6040516370a0823160e01b815230600482015292839182905afa908115610551575f9161051f575b50836104b18383610d60565b036104ea576104e683604051906020820152602081526104d2604082610c0d565b604051918291602083526020830190610c43565b0390f35b909150820391821161050b57638e17b66b60e01b5f5260045260245260445ffd5b634e487b7160e01b5f52601160045260245ffd5b90506020813d602011610549575b8161053a60209383610c0d565b810103126100b85751846104a5565b3d915061052d565b6040513d5f823e3d90fd5b61057e915060603d606011610586575b6105768183610c0d565b810190610fcf565b50508661047a565b503d61056c565b6105ae9060203d6020116105b3575b6105a68183610c0d565b810190610fb7565b6103d3565b503d61059c565b90929593604051630bc4ed8360e21b8152602081600481885afa908115610551575f91610845575b501561073c5750505060206004916040519283809263781c18db60e01b82525afa908115610551575f916106fa575b5060405163a9059cbb60e01b81526001600160a01b039190911660048201819052602482018490529093906020856044815f875af1908115610551575f956020926106df575b5060246040518097819363bcb7ea5d60e01b83523060048401525af1938415610551575f946106ab575b5083818110610696575050602060249161047d565b63eb7f211d60e01b5f5260045260245260445ffd5b9093506020813d6020116106d7575b816106c760209383610c0d565b810103126100b857519285610681565b3d91506106ba565b6106f590833d85116105b3576105a68183610c0d565b610657565b90506020813d602011610734575b8161071560209383610c0d565b810103126100b857516001600160a01b03811681036100b85785610611565b3d9150610708565b60405163095ea7b360e01b81526001600160a01b0382166004820152602481018790529496929491935090916020836044815f8b5af18015610551576107e8956060956107d7955f93610828575b506107936111eb565b938185526020850152604084015260405196879586948593631652a23360e21b855230600486015260248501528a604485015260a0606485015260a4840190610fea565b82810360031901608484015261119b565b03925af1908115610551576024916020915f91610807575b509361047d565b610820915060603d606011610586576105768183610c0d565b505086610800565b6108409060203d6020116105b3576105a68183610c0d565b61078a565b61085e915060203d6020116105b3576105a68183610c0d565b896105e2565b634e487b7160e01b5f52601260045260245ffd5b6108909060203d6020116105b3576105a68183610c0d565b610365565b9093506060813d6060116108fa575b816108b160609383610c0d565b810103126100b85780516001600160a01b038116036100b8576020810151906001600160a01b03821682036100b857604001516001600160a01b038116036100b8579288610308565b3d91506108a4565b9094506020813d60201161092e575b8161091e60209383610c0d565b810103126100b8575193856102aa565b3d9150610911565b346100b85761094436610ce9565b9190602083519381808201958692010103126100b85791516109709290916001600160a01b0316610e57565b005b346100b85760803660031901126100b85761098b610c67565b610993610c7d565b906044356001600160a01b03811681036100b85760643567ffffffffffffffff81116100b8576109c7903690600401610c93565b92602084519481808201968792010103126100b85792516109709390926001600160a01b0316610def565b346100b8575f3660031901126100b85760a0600854600954600a54600b5490600c54926040519485526020850152604084015260608301526080820152f35b346100b857610a3f36610ce9565b9190602083519381808201958692010103126100b85791516109709290916001600160a01b0316610d6d565b346100b8575f3660031901126100b85760018060a01b0360035416600454915f6007548060011c90600181168015610b6c575b6020831081146101da57828552908115610b485750600114610aea575b5090610acc816104e6930382610c0d565b60405193849384526020840152606060408401526060830190610c43565b60075f9081527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688939250905b808210610b2e57509091508101602001610acc610abb565b919260018160209254838588010152019101909291610b16565b60ff191660208086019190915291151560051b84019091019150610acc9050610abb565b91607f1691610a9e565b5f92918154918260011c92600181168015610c03575b6020851081146101da57848452908115610be65750600114610bad57505050565b5f9081526020812093945091925b838310610bcc575060209250010190565b600181602092949394548385870101520191019190610bbb565b915050602093945060ff929192191683830152151560051b010190565b93607f1693610b8c565b90601f8019910116810190811067ffffffffffffffff821117610c2f57604052565b634e487b7160e01b5f52604160045260245ffd5b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036100b857565b602435906001600160a01b03821682036100b857565b81601f820112156100b85780359067ffffffffffffffff8211610c2f5760405192610cc8601f8401601f191660200185610c0d565b828452602083830101116100b857815f926020809301838601378301015290565b60606003198201126100b8576004356001600160a01b03811681036100b857916024356001600160a01b03811681036100b857916044359067ffffffffffffffff82116100b857610d3c91600401610c93565b90565b90600b821015610d4c5752565b634e487b7160e01b5f52602160045260245ffd5b9190820180921161050b57565b9091905f198214610de0576001600160a01b03831630148015610dd8575b610dd35760405163a9059cbb60e01b60208201526001600160a01b03939093166024840152604480840192909252908252610dd19190610dcc606483610c0d565b61125b565b565b505050565b508115610d8b565b630d550c3b60e11b5f5260045ffd5b9092915f198314610de0576001600160a01b039081169316918284148015610e4f575b610e4957610dd193604051936323b872dd60e01b602086015260248501526044840152606483015260648252610dcc608483610c0d565b50505050565b508015610e12565b82158015610fa5575b610dd357604051636eb1769f60e11b81523060048201526001600160a01b03838116602483018190529490831691602081604481865afa908115610551575f91610f71575b50610eed94610efb610eba6020945f94610d60565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529687906064820190565b03601f198101885287610c0d565b85519082865af1903d5f519083610f52575b50505015610f1a57505050565b610dcc610dd1936040519063095ea7b360e01b602083015260248201525f604482015260448152610f4c606482610c0d565b8261125b565b91925090610f6757503b15155b5f8080610f0d565b6001915014610f5f565b90506020813d602011610f9d575b81610f8c60209383610c0d565b810103126100b85751610eed610ea5565b3d9150610f7f565b506001600160a01b0382163014610e60565b908160209103126100b8575180151581036100b85790565b908160609103126100b8578051916040602083015192015190565b60809060018060a01b0381511683526020810151602084015260018060a01b03604082015116604084015260018060a01b03606082015116606084015201519060a0608082015261103f60a082018351610d3f565b60208201516001600160a01b031660c08201526040820151608060e08301526101009060609061107490610120850190610c43565b930151151591015290565b908060208354918281520160208260051b840101935f5260205f20925f905b8382106110ad57505050505090565b9091929394601f19828203018452606081528554606082015260018601546080820152600286015460a0820152600386015460ff81166004811015610d4c5760c08301526001600160a01b03600891821c811660e0840152600488015481166101008401526005880154811661012084015260068801541661014083015260078701546101608301528601546101808083019190915260098701546101a08301526101c0820152600190602090600d906111816111716101e08301600a8c01610b76565b82810385840152600b8b01610b76565b906040600c8b01549101529701940192019093929361109e565b610d3c9060018060a01b03600354168152600454602082015260a060408201526111db6111cc60a08301600561107f565b8281036060840152600661107f565b9060808183039101526007610b76565b6040519060a0820182811067ffffffffffffffff821117610c2f57604052815f81525f60208201525f60408201525f606082015260405190608082019082821067ffffffffffffffff831117610c2f576080916040525f83525f6020840152606060408401525f60608401520152565b905f602091828151910182855af115610551575f513d6112aa57506001600160a01b0381163b155b61128a5750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b6001141561128356fea26469706673582212201ee77fd202ede4dc014cdf8b197fb2ef16d65387626d9feaaf9b419b66e37d0764736f6c634300081b0033000000000000000000000000888888888889758f76e7103c6cbf23abbf58f946", - "nonce": "0x365", + "input": "0x60c0604052346100f757604051601f61132138819003918201601f19168301916001600160401b038311848410176100e3578084926020946040528339810103126100f757516001600160a01b038116908190036100f7573060805260405160a081016001600160401b038111828210176100e357655af3107a4000916080916040525f81525f1960208201525f6040820152610100606082015201525f6008555f196009555f600a55610100600b55655af3107a4000600c5560a05260405161122590816100fc82396080518161025d015260a0518181816089015261031d0152f35b634e487b7160e01b5f52604160045260245ffd5b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816309316dd314610b30575080633268263b14610ac45780634ebfc81414610a855780636563c0e9146109b95780639df303251461084e578063e0a80413146101f8578063f66a7749146100bc5763f887ea4014610074575f80fd5b346100b8575f3660031901126100b8576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b346100b8575f3660031901126100b8575f54604051905f6001548060011c91600182169182156101ee575b6020841083146101da5783865285929081156101bb575060011461015c575b61011292500383610cd2565b60ff60025416610150604051938361012e8660ff819716610e04565b60081c6001600160a01b03166020850152608060408501819052840190610d08565b90151560608301520390f35b5060015f90815290917fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b81831061019f57505090602061011292820101610106565b6020919350806001915483858901015201910190918492610187565b6020925061011294915060ff191682840152151560051b820101610106565b634e487b7160e01b5f52602260045260245ffd5b92607f16926100e7565b346100b85760803660031901126100b857610211610d2c565b610219610d42565b60443567ffffffffffffffff81116100b857610239903690600401610d58565b9160643567ffffffffffffffff81116100b85761025a903690600401610d58565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316301461083f5783516001600160a01b0393841694919093169260208083019291820191909103126100b85751916060828051810103126100b85760208201516001600160a01b03811691908290036100b857606060408401519301519460405195630b2339af60e21b8752606087600481875afa968715610508575f976107d2575b50604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316602482018190529590602081604481885afa80156105085788905f9061079c575b6103709250611041565b60405163095ea7b360e01b60208083019182526001600160a01b038a1660248401526044808401949094529282529091905f906103ae606485610cd2565b83519082895af15f513d82610780575b50501561073c575b506103d2818884611151565b90801561072857876103e79309151590611041565b956001600160a01b0316818103610513575050935f606094939261047e9661040d611062565b95818752602087015260408601526104906040519788968795869463640fc23d60e11b86523060048701526024860152604485015260085460648501526009546084850152600a5460a4850152600b5460c4850152600c5460e4850152610140610104850152610144840190610e40565b82810360031901610124840152610ff1565b03925af18015610508576104d3915f916104d7575b505b604051906020820152602081526104bf604082610cd2565b604051918291602083526020830190610d08565b0390f35b6104f9915060603d606011610501575b6104f18183610cd2565b810190610e25565b5050826104a5565b503d6104e7565b6040513d5f823e3d90fd5b9150949391604051630bc4ed8360e21b8152602081600481865afa908115610508575f916106ed575b50156106535750936020600494956040519586809263781c18db60e01b82525afa938415610508575f9461060b575b50905f61057f6105bc9660409695946110d2565b938551968795869485936323f8ef1160e11b855230600486015260018060a01b031660248501526044840152608060648401526084830190610e40565b03925af18015610508575f906105d7575b6104d391506104a7565b506040813d604011610603575b816105f160409383610cd2565b810103126100b8576104d390516105cd565b3d91506105e4565b90929193506020813d60201161064b575b8161062960209383610cd2565b810103126100b85751926001600160a01b03841684036100b85790915f61056b565b3d915061061c565b929190505f6106676060956106a0976110d2565b936106b160405197889687958694631652a23360e21b86523060048701526024860152604485015260a0606485015260a4840190610e40565b828103600319016084840152610ff1565b03925af18015610508576104d3915f916106cc575b506104a7565b6106e5915060603d606011610501576104f18183610cd2565b5050826106c6565b90506020813d602011610720575b8161070860209383610cd2565b810103126100b8575180151581036100b8578761053c565b3d91506106fb565b634e487b7160e01b5f52601260045260245ffd5b61077a9061077460405163095ea7b360e01b60208201528960248201525f60448201526044815261076e606482610cd2565b876110f9565b856110f9565b886103c6565b9091506107945750843b15155b8a806103be565b60011461078d565b50506020813d6020116107ca575b816107b760209383610cd2565b810103126100b857876103709151610366565b3d91506107aa565b9096506060813d606011610837575b816107ee60609383610cd2565b810103126100b85780516001600160a01b038116036100b8576020810151906001600160a01b03821682036100b857604001516001600160a01b038116036100b8579587610307565b3d91506107e1565b6302f3451d60e21b5f5260045ffd5b346100b85761085c36610dae565b80516001600160a01b039093169260208083019291820191909103126100b85751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa908115610508575f91610985575b50610903936109116108d06020945f94611041565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f198101875286610cd2565b84519082855af15f513d82610969575b50501561092a57005b610962610967936040519063095ea7b360e01b602083015260248201525f60448201526044815261095c606482610cd2565b826110f9565b6110f9565b005b90915061097d5750803b15155b8480610921565b600114610976565b90506020813d6020116109b1575b816109a060209383610cd2565b810103126100b857516109036108bb565b3d9150610993565b346100b85760803660031901126100b8576109d2610d2c565b6109da610d42565b6044356001600160a01b03811692908390036100b85760643567ffffffffffffffff81116100b857610a10903690600401610d58565b602081519181808201938492010103126100b857515f198114610a765761096793604051936323b872dd60e01b602086015260018060a01b031660248501526044840152606483015260648252610a68608483610cd2565b6001600160a01b03166110f9565b630d550c3b60e11b5f5260045ffd5b346100b8575f3660031901126100b85760a0600854600954600a54600b5490600c54926040519485526020850152604084015260608301526080820152f35b346100b857610ad236610dae565b602081939293519181808201938492010103126100b85751905f198214610a765760405163a9059cbb60e01b60208201526001600160a01b039390931660248401526044808401929092529082526109679190610a68606483610cd2565b346100b8575f3660031901126100b85760018060a01b0360035416600454915f6007548060011c90600181168015610c31575b6020831081146101da57828552908115610c0d5750600114610baf575b5090610b91816104d3930382610cd2565b60405193849384526020840152606060408401526060830190610d08565b60075f9081527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688939250905b808210610bf357509091508101602001610b91610b80565b919260018160209254838588010152019101909291610bdb565b60ff191660208086019190915291151560051b84019091019150610b919050610b80565b91607f1691610b63565b5f92918154918260011c92600181168015610cc8575b6020851081146101da57848452908115610cab5750600114610c7257505050565b5f9081526020812093945091925b838310610c91575060209250010190565b600181602092949394548385870101520191019190610c80565b915050602093945060ff929192191683830152151560051b010190565b93607f1693610c51565b90601f8019910116810190811067ffffffffffffffff821117610cf457604052565b634e487b7160e01b5f52604160045260245ffd5b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036100b857565b602435906001600160a01b03821682036100b857565b81601f820112156100b85780359067ffffffffffffffff8211610cf45760405192610d8d601f8401601f191660200185610cd2565b828452602083830101116100b857815f926020809301838601378301015290565b60606003198201126100b8576004356001600160a01b03811681036100b857916024356001600160a01b03811681036100b857916044359067ffffffffffffffff82116100b857610e0191600401610d58565b90565b90600b821015610e115752565b634e487b7160e01b5f52602160045260245ffd5b908160609103126100b8578051916040602083015192015190565b60809060018060a01b0381511683526020810151602084015260018060a01b03604082015116604084015260018060a01b03606082015116606084015201519060a06080820152610e9560a082018351610e04565b60208201516001600160a01b031660c08201526040820151608060e083015261010090606090610eca90610120850190610d08565b930151151591015290565b908060208354918281520160208260051b840101935f5260205f20925f905b838210610f0357505050505090565b9091929394601f19828203018452606081528554606082015260018601546080820152600286015460a0820152600386015460ff81166004811015610e115760c08301526001600160a01b03600891821c811660e0840152600488015481166101008401526005880154811661012084015260068801541661014083015260078701546101608301528601546101808083019190915260098701546101a08301526101c0820152600190602090600d90610fd7610fc76101e08301600a8c01610c3b565b82810385840152600b8b01610c3b565b906040600c8b015491015297019401920190939293610ef4565b610e019060018060a01b03600354168152600454602082015260a0604082015261103161102260a083016005610ed5565b82810360608401526006610ed5565b9060808183039101526007610c3b565b9190820180921161104e57565b634e487b7160e01b5f52601160045260245ffd5b6040519060a0820182811067ffffffffffffffff821117610cf457604052815f81525f60208201525f60408201525f606082015260405190608082019082821067ffffffffffffffff831117610cf4576080916040525f83525f6020840152606060408401525f60608401520152565b91906110dc611062565b6001600160a01b0390931680845260208401919091526040830152565b905f602091828151910182855af115610508575f513d61114857506001600160a01b0381163b155b6111285750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b60011415611121565b91818302915f19818509938380861095039480860395146111e157848311156111c95790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b50508092501561072857049056fea26469706673582212205bf94e5371bc2f132405be99261f2b9351cbdbf49e328ca512e068eee1eda9d164736f6c634300081d0033000000000000000000000000888888888889758f76e7103c6cbf23abbf58f946", + "nonce": "0x374", "chainId": "0x1" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0x9f08285e86f6f696d8e67c8b9476df2ac90b6f6d8a455f8693fc88d56d9f6c0e", + "hash": "0xc537405635d58ef18f7259589f1171d68a7393b7c65c29da13079607be3c14ef", "transactionType": "CREATE", - "contractName": "ERC4626VaultAdapter", - "contractAddress": "0xe62567e9a8969aae406195f7c4c7e4e85d4ed879", + "contractName": null, + "contractAddress": "0x98b0c4c13068c3010a809174af31061aef547fbe", "function": null, "arguments": null, "transaction": { "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", - "gas": "0xb5b9e", + "gas": "0xaf02f", "value": "0x0", - "input": "0x60808060405234601557610961908161001a8239f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b1461051c5780636563c0e91461049c5780639df30325146104605763e0a8041314610045575f80fd5b3461029d57608036600319011261029d5761005e610556565b61006661056c565b60443567ffffffffffffffff811161029d576100869036906004016105b8565b9160643567ffffffffffffffff811161029d576100a79036906004016105b8565b926020815191818082019384920101031261029d57516040516370a0823160e01b81523060048201529290916001600160a01b031690602084602481855afa9384156102a9575f9461042c575b5060018060a01b03169360608180518101031261029d57602081015190600282101561029d57606060408201519101518481029080820486149015171561025f57811561041857049080610328575060405163095ea7b360e01b81526001600160a01b038616600482015260248101849052946020866044815f875af19081156102a9575f966020926102fd575b50604460405180988193636e553f6560e01b83528860048401523060248401525af19485156102a9575f956102c9575b50848181106102b457505060206024915b6040516370a0823160e01b815230600482015292839182905afa9081156102a9575f91610273575b50826101f78383610664565b0361024157836040805160208101928352602081526102168282610582565b8151928391602083525180918160208501528484015e5f828201840152601f01601f19168101030190f35b820391821161025f57638e17b66b60e01b5f5260045260245260445ffd5b634e487b7160e01b5f52601160045260245ffd5b90506020813d6020116102a1575b8161028e60209383610582565b8101031261029d57515f6101eb565b5f80fd5b3d9150610281565b6040513d5f823e3d90fd5b63eb7f211d60e01b5f5260045260245260445ffd5b9094506020813d6020116102f5575b816102e560209383610582565b8101031261029d5751935f6101b2565b3d91506102d8565b61031c90833d8511610321575b6103148183610582565b8101906108bb565b610182565b503d61030a565b9094506001036104095760405163095ea7b360e01b81526001600160a01b0382166004820152602481018390526020816044815f865af180156102a9576103ec575b5060405193635d043b2960e11b85528260048601523060248601523060448601526020856064815f865af19485156102a9575f956103b8575b50848181106102b457505060206024916101c3565b9094506020813d6020116103e4575b816103d460209383610582565b8101031261029d5751935f6103a3565b3d91506103c7565b6104049060203d602011610321576103148183610582565b61036a565b634a7f394f60e01b5f5260045ffd5b634e487b7160e01b5f52601260045260245ffd5b9093506020813d602011610458575b8161044860209383610582565b8101031261029d5751925f6100f4565b3d915061043b565b3461029d5761046e3661060e565b91906020835193818082019586920101031261029d57915161049a9290916001600160a01b031661075b565b005b3461029d57608036600319011261029d576104b5610556565b6104bd61056c565b906044356001600160a01b038116810361029d5760643567ffffffffffffffff811161029d576104f19036906004016105b8565b926020845194818082019687920101031261029d57925161049a9390926001600160a01b03166106f3565b3461029d5761052a3661060e565b91906020835193818082019586920101031261029d57915161049a9290916001600160a01b0316610671565b600435906001600160a01b038216820361029d57565b602435906001600160a01b038216820361029d57565b90601f8019910116810190811067ffffffffffffffff8211176105a457604052565b634e487b7160e01b5f52604160045260245ffd5b81601f8201121561029d5780359067ffffffffffffffff82116105a457604051926105ed601f8401601f191660200185610582565b8284526020838301011161029d57815f926020809301838601378301015290565b606060031982011261029d576004356001600160a01b038116810361029d57916024356001600160a01b038116810361029d57916044359067ffffffffffffffff821161029d57610661916004016105b8565b90565b9190820180921161025f57565b9091905f1982146106e4576001600160a01b038316301480156106dc575b6106d75760405163a9059cbb60e01b60208201526001600160a01b039390931660248401526044808401929092529082526106d591906106d0606483610582565b6108d3565b565b505050565b50811561068f565b630d550c3b60e11b5f5260045ffd5b9092915f1983146106e4576001600160a01b039081169316918284148015610753575b61074d576106d593604051936323b872dd60e01b6020860152602485015260448401526064830152606482526106d0608483610582565b50505050565b508015610716565b821580156108a9575b6106d757604051636eb1769f60e11b81523060048201526001600160a01b03838116602483018190529490831691602081604481865afa9081156102a9575f91610875575b506107f1946107ff6107be6020945f94610664565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529687906064820190565b03601f198101885287610582565b85519082865af1903d5f519083610856575b5050501561081e57505050565b6106d06106d5936040519063095ea7b360e01b602083015260248201525f604482015260448152610850606482610582565b826108d3565b9192509061086b57503b15155b5f8080610811565b6001915014610863565b90506020813d6020116108a1575b8161089060209383610582565b8101031261029d57516107f16107a9565b3d9150610883565b506001600160a01b0382163014610764565b9081602091031261029d5751801515810361029d5790565b905f602091828151910182855af1156102a9575f513d61092257506001600160a01b0381163b155b6109025750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156108fb56fea2646970667358221220f873473c980ff986be5bdcc90d6237af100c3efe734f2a1fd6277d6017a3857f64736f6c634300081b0033", - "nonce": "0x366", + "input": "0x60a0806040523460215730608052610900908161002682396080518160aa0152f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146106395780636563c0e91461056d5780639df303251461040d5763e0a8041314610045575f80fd5b346102a35760803660031901126102a35761005e6106a5565b6100666106bb565b9060443567ffffffffffffffff81116102a357610087903690600401610707565b60643567ffffffffffffffff81116102a3576100a7903690600401610707565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630146103fe5781516001600160a01b039182169490911691602080820192820191909103126102a35751926060838051810103126102a35760208301519260028410156102a357606060408201519101519061012f81878461082c565b9080156103ea578661014493091515906107b3565b92806103525750604051636eb1769f60e11b815230600482015260248101839052602081604481855afa9081156102af575f9161031a575b50846020939261018f5f976044946107b3565b60405163095ea7b360e01b8782019081526001600160a01b038716602483015260448083019390935291815290869089906101cb6064856106d1565b83519082865af188513d826102fb575b5050156102ba575b50506040519586938492636e553f6560e01b845260048401523060248401525af19182156102af575f92610277575b50818181106102625750505b60408051602081019283526020815261023782826106d1565b8151928391602083525180918160208501528484015e5f828201840152601f01601f19168101030190f35b63eb7f211d60e01b5f5260045260245260445ffd5b9091506020813d6020116102a7575b81610293602093836106d1565b810103126102a35751905f610212565b5f80fd5b3d9150610286565b6040513d5f823e3d90fd5b6102f4916102ef60405163095ea7b360e01b898201528760248201528a878201528681526102e96064826106d1565b826107d4565b6107d4565b5f806101e3565b9091501589146103125750813b15155b5f806101db565b60011461030b565b90506020929192813d60201161034a575b81610338602093836106d1565b810103126102a357519091908461017c565b3d915061032b565b909391506001036103db575f9260646020926040519586938492635d043b2960e11b845260048401523060248401523060448401525af19182156102af575f926103a7575b508181811061026257505061021e565b9091506020813d6020116103d3575b816103c3602093836106d1565b810103126102a35751905f610397565b3d91506103b6565b634a7f394f60e01b5f5260045ffd5b634e487b7160e01b5f52601260045260245ffd5b6302f3451d60e21b5f5260045ffd5b346102a35761041b3661075d565b80516001600160a01b039093169260208083019291820191909103126102a35751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa9081156102af575f91610539575b506104c2936104d061048f6020945f946107b3565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f1981018752866106d1565b84519082855af15f513d8261051d575b5050156104e957005b6102ef61051b936040519063095ea7b360e01b602083015260248201525f6044820152604481526102e96064826106d1565b005b9091506105315750803b15155b84806104e0565b60011461052a565b90506020813d602011610565575b81610554602093836106d1565b810103126102a357516104c261047a565b3d9150610547565b346102a35760803660031901126102a3576105866106a5565b61058e6106bb565b6044356001600160a01b03811692908390036102a35760643567ffffffffffffffff81116102a3576105c4903690600401610707565b602081519181808201938492010103126102a357515f19811461062a5761051b93604051936323b872dd60e01b602086015260018060a01b03166024850152604484015260648301526064825261061c6084836106d1565b6001600160a01b03166107d4565b630d550c3b60e11b5f5260045ffd5b346102a3576106473661075d565b602081939293519181808201938492010103126102a35751905f19821461062a5760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261051b919061061c6064836106d1565b600435906001600160a01b03821682036102a357565b602435906001600160a01b03821682036102a357565b90601f8019910116810190811067ffffffffffffffff8211176106f357604052565b634e487b7160e01b5f52604160045260245ffd5b81601f820112156102a35780359067ffffffffffffffff82116106f3576040519261073c601f8401601f1916602001856106d1565b828452602083830101116102a357815f926020809301838601378301015290565b60606003198201126102a3576004356001600160a01b03811681036102a357916024356001600160a01b03811681036102a357916044359067ffffffffffffffff82116102a3576107b091600401610707565b90565b919082018092116107c057565b634e487b7160e01b5f52601160045260245ffd5b905f602091828151910182855af1156102af575f513d61082357506001600160a01b0381163b155b6108035750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156107fc565b91818302915f19818509938380861095039480860395146108bc57848311156108a45790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b5050809250156103ea57049056fea26469706673582212208494a0174c4f07fd048515a6e3e22a540bf8edf31a0e807f0e3019b7d5b7c74464736f6c634300081d0033", + "nonce": "0x375", "chainId": "0x1" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0xf51679aa92e64d1b2a43136ad3d1f4b6e85e952cf2718156485c17bc6c245c4c", + "hash": "0x0edabaf9bb416d8da0cc6bab22db3331f8f03687db2ae084568f6db9b29e9928", "transactionType": "CALL", "contractName": "ERC1967Proxy", "contractAddress": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", @@ -88,17 +82,17 @@ "transaction": { "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", - "gas": "0x16bfc", + "gas": "0x157eb", "value": "0x0", - "input": "0xb6b07b8e000000000000000000000000c47591f5c023e44931c78d5a993834875b79fb11000000000000000000000000ece68c88d0d1789bd13a8519fba51eb870fa0cc70000000000000000000000000000000000000000000000000000000000000001", - "nonce": "0x367", + "input": "0xb6b07b8e000000000000000000000000c47591f5c023e44931c78d5a993834875b79fb11000000000000000000000000e7a88ab1329cad4168563516e35753b979d0c7a90000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x376", "chainId": "0x1" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0x13aaefcf3b68f44f31777b417c41c20ffed021babe81eed285b49a6cc9a6fbe4", + "hash": "0xb86edb13b2b4accef989a5413c7ee981fe8a3816e77febc5e996b2b490d1b189", "transactionType": "CALL", "contractName": "ERC1967Proxy", "contractAddress": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", @@ -107,17 +101,17 @@ "transaction": { "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", - "gas": "0x16bfc", + "gas": "0x157eb", "value": "0x0", - "input": "0xb6b07b8e000000000000000000000000c47591f5c023e44931c78d5a993834875b79fb11000000000000000000000000d402019cd1ec046dd74a70922f24c2e3cbb05e240000000000000000000000000000000000000000000000000000000000000001", - "nonce": "0x368", + "input": "0xb6b07b8e000000000000000000000000c47591f5c023e44931c78d5a993834875b79fb1100000000000000000000000024c7e21a91cdb7760798e02ea5639d4c60b0c4420000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x377", "chainId": "0x1" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0xce702ef3ed3c62c0725af26fb861c0e4622726d5d0ac44afdef5ac873ce4f3b9", + "hash": "0x4dcd942cf748d01d465990bc0f1327d8d7110a7fd3fe18fef6fa2e520284457c", "transactionType": "CALL", "contractName": "ERC1967Proxy", "contractAddress": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", @@ -126,17 +120,17 @@ "transaction": { "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", - "gas": "0x16bfc", + "gas": "0x157eb", "value": "0x0", - "input": "0xb6b07b8e000000000000000000000000c47591f5c023e44931c78d5a993834875b79fb11000000000000000000000000fbbbb37aaa95a8f1c4498c9066318c2b5680fb840000000000000000000000000000000000000000000000000000000000000001", - "nonce": "0x369", + "input": "0xb6b07b8e000000000000000000000000c47591f5c023e44931c78d5a993834875b79fb1100000000000000000000000015aa533cded42c2e38d2bc3ece5bd2bfcf3dd2c00000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x378", "chainId": "0x1" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0x7d2819b3e549a0d05abca93aef14e81e311cb2e8982bab1c932196ff92bc65c1", + "hash": "0xc646f81422b4dc30572a9330ac3cb8a9331cf27bdc77792567e32539134d9b37", "transactionType": "CALL", "contractName": "ERC1967Proxy", "contractAddress": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", @@ -145,10 +139,10 @@ "transaction": { "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", - "gas": "0x16bfc", + "gas": "0x157eb", "value": "0x0", - "input": "0xb6b07b8e000000000000000000000000c47591f5c023e44931c78d5a993834875b79fb11000000000000000000000000e62567e9a8969aae406195f7c4c7e4e85d4ed8790000000000000000000000000000000000000000000000000000000000000001", - "nonce": "0x36a", + "input": "0xb6b07b8e000000000000000000000000c47591f5c023e44931c78d5a993834875b79fb1100000000000000000000000098b0c4c13068c3010a809174af31061aef547fbe0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x379", "chainId": "0x1" }, "additionalContracts": [], @@ -158,188 +152,188 @@ "receipts": [ { "status": "0x1", - "cumulativeGasUsed": "0x1ca2384", + "cumulativeGasUsed": "0xcd2725", "logs": [], "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "transactionHash": "0x285f30cc30eaab1ac799d72d57f614051fd2e063de938a14a773335e3733e574", - "transactionIndex": "0x49", - "blockHash": "0xe46e6d7b8546e9a608d73c4c6e540acecf79894bdefa1b690b365fd0a9faa954", - "blockNumber": "0x15b22e7", - "gasUsed": "0x8e9d4", - "effectiveGasPrice": "0x138e318a", + "transactionHash": "0xf2daa6436d45ff83f0183aa5236377f589706adb7828bb939bb494c5acdc4535", + "transactionIndex": "0x99", + "blockHash": "0x97f90f4506a3f351c0fbbf91db53f4a2c20a3bc85a80044c6c15565ee7762747", + "blockNumber": "0x15c0f80", + "gasUsed": "0x8f94e", + "effectiveGasPrice": "0x1828147f", "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": null, - "contractAddress": "0xece68c88d0d1789bd13a8519fba51eb870fa0cc7" + "contractAddress": "0xe7a88ab1329cad4168563516e35753b979d0c7a9" }, { "status": "0x1", - "cumulativeGasUsed": "0xcf9c58", + "cumulativeGasUsed": "0xcf1e14", "logs": [], "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "transactionHash": "0xbd570f787d17545500e716109468f03dcbebd9691b82268687e076a0cdee5ada", - "transactionIndex": "0x51", - "blockHash": "0x7d647b9f9ec28158fab0580a0c6c0b03f40c4d8e4e76709726091f286a50ef47", - "blockNumber": "0x15b22e8", - "gasUsed": "0x9fdd3", - "effectiveGasPrice": "0x158bda72", + "transactionHash": "0x4ea8a0018eabfecd3b165de13922451e45676c4afb2f5c9978eb10ca30b97e9c", + "transactionIndex": "0xa3", + "blockHash": "0x10a44b610791154ac2493e53628d7b0e698ca26c96e7540e14977b31c09d0c73", + "blockNumber": "0x15c0f81", + "gasUsed": "0x9b394", + "effectiveGasPrice": "0x179d8852", "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": null, - "contractAddress": "0xd402019cd1ec046dd74a70922f24c2e3cbb05e24" + "contractAddress": "0x24c7e21a91cdb7760798e02ea5639d4c60b0c442" }, { "status": "0x1", - "cumulativeGasUsed": "0x2e525c", + "cumulativeGasUsed": "0xf813a4", "logs": [], "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "transactionHash": "0xf09987959d483053d251c4b92e8f9b37964ef6082632cf0d973286115b5c289f", - "transactionIndex": "0x1a", - "blockHash": "0x49fe8d4a454bb8a6f0e3fd05ecc3817c3a120346ab0fb9f390b76bf922f412ed", - "blockNumber": "0x15b22e9", - "gasUsed": "0x11e90c", - "effectiveGasPrice": "0x157d4bdd", + "transactionHash": "0xf463dfa8918b5fbd3f0519033b108b709e57252c25c8eed9fdd3ba586c0bde83", + "transactionIndex": "0xa0", + "blockHash": "0x5ad9da45f57cfc2ac085916dc03d9b5c181c9f524ce28b7bb5aa4f2fba142a2b", + "blockNumber": "0x15c0f82", + "gasUsed": "0x1142f4", + "effectiveGasPrice": "0x17682ffc", "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": null, - "contractAddress": "0xfbbbb37aaa95a8f1c4498c9066318c2b5680fb84" + "contractAddress": "0x15aa533cded42c2e38d2bc3ece5bd2bfcf3dd2c0" }, { "status": "0x1", - "cumulativeGasUsed": "0x2eebd6", + "cumulativeGasUsed": "0x118be78", "logs": [], "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "transactionHash": "0x9f08285e86f6f696d8e67c8b9476df2ac90b6f6d8a455f8693fc88d56d9f6c0e", - "transactionIndex": "0x1a", - "blockHash": "0xb84536ececacfa64eec52695167109296b8207045d0828c979a045c1f74c5bce", - "blockNumber": "0x15b22ea", - "gasUsed": "0x8bca1", - "effectiveGasPrice": "0x14e873ba", + "transactionHash": "0xc537405635d58ef18f7259589f1171d68a7393b7c65c29da13079607be3c14ef", + "transactionIndex": "0x99", + "blockHash": "0x03749f50f32c89151673f312c1de346ff63a75a64663781f2dfc08a7e028169e", + "blockNumber": "0x15c0f83", + "gasUsed": "0x869fd", + "effectiveGasPrice": "0x17868520", "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": null, - "contractAddress": "0xe62567e9a8969aae406195f7c4c7e4e85d4ed879" + "contractAddress": "0x98b0c4c13068c3010a809174af31061aef547fbe" }, { "status": "0x1", - "cumulativeGasUsed": "0x7e9721", + "cumulativeGasUsed": "0xd874f9", "logs": [ { "address": "0xc47591f5c023e44931c78d5a993834875b79fb11", "topics": [ "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" ], - "data": "0x000000000000000000000000ece68c88d0d1789bd13a8519fba51eb870fa0cc70000000000000000000000000000000000000000000000000000000000000001", - "blockHash": "0x310141b63ea64f7af53e1e836f407d4d2217cc7b2a26ae6b3ce8ee4abbec8447", - "blockNumber": "0x15b22eb", - "blockTimestamp": "0x68561c63", - "transactionHash": "0xf51679aa92e64d1b2a43136ad3d1f4b6e85e952cf2718156485c17bc6c245c4c", - "transactionIndex": "0x5f", - "logIndex": "0xc9", + "data": "0x000000000000000000000000e7a88ab1329cad4168563516e35753b979d0c7a90000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x2bfa0843bfebaf4c2fb06f128d76d869ba9799fadf2188c89647dc7355736dd0", + "blockNumber": "0x15c0f84", + "blockTimestamp": "0x686144f3", + "transactionHash": "0x0edabaf9bb416d8da0cc6bab22db3331f8f03687db2ae084568f6db9b29e9928", + "transactionIndex": "0xa3", + "logIndex": "0x19d", "removed": false } ], "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000010800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000020000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "transactionHash": "0xf51679aa92e64d1b2a43136ad3d1f4b6e85e952cf2718156485c17bc6c245c4c", - "transactionIndex": "0x5f", - "blockHash": "0x310141b63ea64f7af53e1e836f407d4d2217cc7b2a26ae6b3ce8ee4abbec8447", - "blockNumber": "0x15b22eb", - "gasUsed": "0xf8e1", - "effectiveGasPrice": "0x1433f020", + "transactionHash": "0x0edabaf9bb416d8da0cc6bab22db3331f8f03687db2ae084568f6db9b29e9928", + "transactionIndex": "0xa3", + "blockHash": "0x2bfa0843bfebaf4c2fb06f128d76d869ba9799fadf2188c89647dc7355736dd0", + "blockNumber": "0x15c0f84", + "gasUsed": "0xf8ff", + "effectiveGasPrice": "0x17d40cc1", "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", "contractAddress": null }, { "status": "0x1", - "cumulativeGasUsed": "0xc35bd1", + "cumulativeGasUsed": "0x463c0f", "logs": [ { "address": "0xc47591f5c023e44931c78d5a993834875b79fb11", "topics": [ "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" ], - "data": "0x000000000000000000000000d402019cd1ec046dd74a70922f24c2e3cbb05e240000000000000000000000000000000000000000000000000000000000000001", - "blockHash": "0x833160887b2326060161125e15a7fb8d6122b2e68abc1f39a3ec152f59fc07ef", - "blockNumber": "0x15b22ec", - "blockTimestamp": "0x68561c6f", - "transactionHash": "0x13aaefcf3b68f44f31777b417c41c20ffed021babe81eed285b49a6cc9a6fbe4", - "transactionIndex": "0x79", - "logIndex": "0x182", + "data": "0x00000000000000000000000024c7e21a91cdb7760798e02ea5639d4c60b0c4420000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xa12b5c6307e27ec9ad6bacb5502299e3099c0cd4d021e3e9c6361e796d5dd299", + "blockNumber": "0x15c0f85", + "blockTimestamp": "0x686144ff", + "transactionHash": "0xb86edb13b2b4accef989a5413c7ee981fe8a3816e77febc5e996b2b490d1b189", + "transactionIndex": "0x11", + "logIndex": "0x83", "removed": false } ], "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000010800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000020000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "transactionHash": "0x13aaefcf3b68f44f31777b417c41c20ffed021babe81eed285b49a6cc9a6fbe4", - "transactionIndex": "0x79", - "blockHash": "0x833160887b2326060161125e15a7fb8d6122b2e68abc1f39a3ec152f59fc07ef", - "blockNumber": "0x15b22ec", - "gasUsed": "0xf8e1", - "effectiveGasPrice": "0x131fbd43", + "transactionHash": "0xb86edb13b2b4accef989a5413c7ee981fe8a3816e77febc5e996b2b490d1b189", + "transactionIndex": "0x11", + "blockHash": "0xa12b5c6307e27ec9ad6bacb5502299e3099c0cd4d021e3e9c6361e796d5dd299", + "blockNumber": "0x15c0f85", + "gasUsed": "0xf8ff", + "effectiveGasPrice": "0x177ba12e", "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", "contractAddress": null }, { "status": "0x1", - "cumulativeGasUsed": "0xb8ac90", + "cumulativeGasUsed": "0xf9c88e", "logs": [ { "address": "0xc47591f5c023e44931c78d5a993834875b79fb11", "topics": [ "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" ], - "data": "0x000000000000000000000000fbbbb37aaa95a8f1c4498c9066318c2b5680fb840000000000000000000000000000000000000000000000000000000000000001", - "blockHash": "0x19f4a8952fcac1e486efc47516c2ed84ead42dec315c1d53a6b8bd6af1030fd0", - "blockNumber": "0x15b22ee", - "blockTimestamp": "0x68561c87", - "transactionHash": "0xce702ef3ed3c62c0725af26fb861c0e4622726d5d0ac44afdef5ac873ce4f3b9", - "transactionIndex": "0x72", - "logIndex": "0x14e", + "data": "0x00000000000000000000000015aa533cded42c2e38d2bc3ece5bd2bfcf3dd2c00000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x98ffcb4005394175c4490751e43cb16db508e7af2f09fbb162d6201b01f053e7", + "blockNumber": "0x15c0f86", + "blockTimestamp": "0x6861450b", + "transactionHash": "0x4dcd942cf748d01d465990bc0f1327d8d7110a7fd3fe18fef6fa2e520284457c", + "transactionIndex": "0x9d", + "logIndex": "0x137", "removed": false } ], "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000010800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000020000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "transactionHash": "0xce702ef3ed3c62c0725af26fb861c0e4622726d5d0ac44afdef5ac873ce4f3b9", - "transactionIndex": "0x72", - "blockHash": "0x19f4a8952fcac1e486efc47516c2ed84ead42dec315c1d53a6b8bd6af1030fd0", - "blockNumber": "0x15b22ee", - "gasUsed": "0xf8e1", - "effectiveGasPrice": "0x151d3141", + "transactionHash": "0x4dcd942cf748d01d465990bc0f1327d8d7110a7fd3fe18fef6fa2e520284457c", + "transactionIndex": "0x9d", + "blockHash": "0x98ffcb4005394175c4490751e43cb16db508e7af2f09fbb162d6201b01f053e7", + "blockNumber": "0x15c0f86", + "gasUsed": "0xf8ff", + "effectiveGasPrice": "0x16fcd07a", "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", "contractAddress": null }, { "status": "0x1", - "cumulativeGasUsed": "0x7826ba", + "cumulativeGasUsed": "0xa69e8d", "logs": [ { "address": "0xc47591f5c023e44931c78d5a993834875b79fb11", "topics": [ "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" ], - "data": "0x000000000000000000000000e62567e9a8969aae406195f7c4c7e4e85d4ed8790000000000000000000000000000000000000000000000000000000000000001", - "blockHash": "0xc2ee0f69f9c8e334c1ce84be36b4b6ca52bb6729d0fade6d80e8c0bccfcafc2f", - "blockNumber": "0x15b22ef", - "blockTimestamp": "0x68561c93", - "transactionHash": "0x7d2819b3e549a0d05abca93aef14e81e311cb2e8982bab1c932196ff92bc65c1", - "transactionIndex": "0x40", - "logIndex": "0xc7", + "data": "0x00000000000000000000000098b0c4c13068c3010a809174af31061aef547fbe0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xbdedf23db717ea39f9133934ff68c5298c8300608aa41f9597e6ff3f4692e922", + "blockNumber": "0x15c0f87", + "blockTimestamp": "0x68614517", + "transactionHash": "0xc646f81422b4dc30572a9330ac3cb8a9331cf27bdc77792567e32539134d9b37", + "transactionIndex": "0x81", + "logIndex": "0x11c", "removed": false } ], "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000010800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000020000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "transactionHash": "0x7d2819b3e549a0d05abca93aef14e81e311cb2e8982bab1c932196ff92bc65c1", - "transactionIndex": "0x40", - "blockHash": "0xc2ee0f69f9c8e334c1ce84be36b4b6ca52bb6729d0fade6d80e8c0bccfcafc2f", - "blockNumber": "0x15b22ef", - "gasUsed": "0xf8e1", - "effectiveGasPrice": "0x153bba18", + "transactionHash": "0xc646f81422b4dc30572a9330ac3cb8a9331cf27bdc77792567e32539134d9b37", + "transactionIndex": "0x81", + "blockHash": "0xbdedf23db717ea39f9133934ff68c5298c8300608aa41f9597e6ff3f4692e922", + "blockNumber": "0x15c0f87", + "gasUsed": "0xf8ff", + "effectiveGasPrice": "0x16e2654d", "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": "0xda4aaf85bb924b53dcc2dffa9e1a9c2ef97acfdf", "contractAddress": null @@ -348,7 +342,7 @@ "libraries": [], "pending": [], "returns": {}, - "timestamp": 1750473958, + "timestamp": 1751205191, "chain": 1, - "commit": "53496c4" + "commit": "01db0f8" } \ No newline at end of file diff --git a/broadcast/DeployAdapters.s.sol/42161/run-1751264345.json b/broadcast/DeployAdapters.s.sol/42161/run-1751264345.json new file mode 100644 index 0000000..8f978f9 --- /dev/null +++ b/broadcast/DeployAdapters.s.sol/42161/run-1751264345.json @@ -0,0 +1,374 @@ +{ + "transactions": [ + { + "hash": "0x44d6344afc28390b198396e90f16dafceabab7e2c409672a4fac2e04447809f6", + "transactionType": "CREATE", + "contractName": "UniswapV3AdapterV2", + "contractAddress": "0x048a54deae47c41f760c42622b114bb89b836a9f", + "function": null, + "arguments": [ + "0xE592427A0AEce92De3Edee1F18E0157C05861564" + ], + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "gas": "0xc2e36", + "value": "0x0", + "input": "0x60c034607a57601f610a3738819003918201601f19168301916001600160401b03831184841017607e57808492602094604052833981010312607a57516001600160a01b03811690819003607a573060805260a0526040516109a4908161009382396080518160fd015260a051818181606501526101610152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146106c15780636563c0e9146105f55780639df3032514610495578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b161072d565b6100b9610743565b5060443567ffffffffffffffff8111610094576100da903690600401610797565b60643567ffffffffffffffff8111610094576100fa903690600401610797565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630146104865781516001600160a01b039190911691602080820192820191909103126100945751604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316602482018190529193919290602081604481855afa80156103bd5785905f90610450575b6101b79250610857565b60405163095ea7b360e01b60208083019182526001600160a01b03871660248401526044808401949094529282529091905f906101f5606485610759565b83519082865af15f513d82610434575b5050156103f0575b505080518101916080826020850194031261009457602082015167ffffffffffffffff811161009457820183603f82011215610094576020810151906102528261077b565b946102606040519687610759565b8286526040828401011161009457815f926040602093018388015e85010152604082015191608060608201519101519061029b8187846108d0565b9080156103dc57866102b09309151590610857565b9260405160a081019080821067ffffffffffffffff8311176103c857602095610322935f936040528252868201903082526040830196875260608301988952608083019081526040519889978896879563c04b8d5960e01b87528b60048801525160a0602488015260c4870190610833565b93516001600160a01b031660448601525160648501525160848401525160a483015203925af180156103bd575f90610389575b6103859060405190602082015260208152610371604082610759565b604051918291602083526020830190610833565b0390f35b506020813d6020116103b5575b816103a360209383610759565b81010312610094576103859051610355565b3d9150610396565b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b61042d9161042860405163095ea7b360e01b60208201528660248201525f604482015260448152610422606482610759565b82610878565b610878565b838061020d565b9091506104485750813b15155b8680610205565b600114610441565b50506020813d60201161047e575b8161046b60209383610759565b8101031261009457846101b791516101ad565b3d915061045e565b6302f3451d60e21b5f5260045ffd5b34610094576104a3366107dd565b80516001600160a01b039093169260208083019291820191909103126100945751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa9081156103bd575f916105c1575b5061054a936105586105176020945f94610857565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f198101875286610759565b84519082855af15f513d826105a5575b50501561057157005b6104286105a3936040519063095ea7b360e01b602083015260248201525f604482015260448152610422606482610759565b005b9091506105b95750803b15155b8480610568565b6001146105b2565b90506020813d6020116105ed575b816105dc60209383610759565b81010312610094575161054a610502565b3d91506105cf565b346100945760803660031901126100945761060e61072d565b610616610743565b6044356001600160a01b03811692908390036100945760643567ffffffffffffffff81116100945761064c903690600401610797565b6020815191818082019384920101031261009457515f1981146106b2576105a393604051936323b872dd60e01b602086015260018060a01b0316602485015260448401526064830152606482526106a4608483610759565b6001600160a01b0316610878565b630d550c3b60e11b5f5260045ffd5b34610094576106cf366107dd565b602081939293519181808201938492010103126100945751905f1982146106b25760405163a9059cbb60e01b60208201526001600160a01b039390931660248401526044808401929092529082526105a391906106a4606483610759565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff8211176103c857604052565b67ffffffffffffffff81116103c857601f01601f191660200190565b81601f82011215610094578035906107ae8261077b565b926107bc6040519485610759565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff82116100945761083091600401610797565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9190820180921161086457565b634e487b7160e01b5f52601160045260245ffd5b905f602091828151910182855af1156103bd575f513d6108c757506001600160a01b0381163b155b6108a75750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156108a0565b91818302915f198185099383808610950394808603951461096057848311156109485790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b5050809250156103dc57049056fea2646970667358221220c66a6ef0f7fbba462fbafbd2ef2a7ef760baae0e9780be52e06dc1d37795583464736f6c634300081d0033000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564", + "nonce": "0x131", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x119e5c0964ab69c002349edb04debe3dcc2f671fbb1afac6fede6aede244c454", + "transactionType": "CREATE", + "contractName": "OdosV2AdapterV2", + "contractAddress": "0xb986312024c8e0f895b00eba32c81b5759c91fff", + "function": null, + "arguments": [ + "0xa669e7A0d4b3e4Fa48af2dE86BD4CD7126Be4e13" + ], + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "gas": "0xd28ab", + "value": "0x0", + "input": "0x60c034607a57601f610b1438819003918201601f19168301916001600160401b03831184841017607e57808492602094604052833981010312607a57516001600160a01b03811690819003607a573060805260a052604051610a81908161009382396080518160fd015260a051818181606501526101610152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146107565780636563c0e91461068a5780639df303251461052a578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b16107c2565b6100b96107d8565b5060443567ffffffffffffffff8111610094576100da90369060040161082c565b60643567ffffffffffffffff8111610094576100fa90369060040161082c565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316301461051b5781516001600160a01b039190911691602080820192820191909103126100945751604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031660248201819052919290602081604481855afa80156104665784905f906104e5575b6101b59250610900565b60405163095ea7b360e01b60208083019182526001600160a01b03861660248401526044808401949094529282529091905f906101f36064856107ee565b83519082865af15f513d826104c9575b505015610485575b505082518301908360208301920361014081126100945760e013610094576040519160e0830183811067ffffffffffffffff82111761047157604052610253602086016108ec565b83526040850151906020840191825261026e606087016108ec565b9360408101948552610282608088016108ec565b966060820197885260a0810151926080830193845260c08201519760a084019889526102b060e084016108ec565b9160c0850192835261010084015167ffffffffffffffff811161009457840181603f82011215610094576020810151906102e982610810565b926102f760405194856107ee565b8284526040828401011161009457815f926040602093018386015e830101526101208401516001600160a01b03811694908590036100945761014001519263ffffffff84168094036100945760209a876103e09461035a5f9a51828d5191610921565b825261036a8351828d5191610921565b83528a52308352604051630ed8d73960e21b815297516001600160a01b0390811660048a0152995160248901529a51891660448801529b518816606487015298516084860152995160a4850152965190941660c483015261014060e48301529096879586948593929091906101448501906108c8565b9161010484015261012483015203925af18015610466575f90610432575b61042e906040519060208201526020815261041a6040826107ee565b6040519182916020835260208301906108c8565b0390f35b506020813d60201161045e575b8161044c602093836107ee565b810103126100945761042e90516103fe565b3d915061043f565b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b6104c2916104bd60405163095ea7b360e01b60208201528560248201525f6044820152604481526104b76064826107ee565b82610955565b610955565b838061020b565b9091506104dd5750813b15155b8680610203565b6001146104d6565b50506020813d602011610513575b81610500602093836107ee565b8101031261009457836101b591516101ab565b3d91506104f3565b6302f3451d60e21b5f5260045ffd5b346100945761053836610872565b80516001600160a01b039093169260208083019291820191909103126100945751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa908115610466575f91610656575b506105df936105ed6105ac6020945f94610900565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f1981018752866107ee565b84519082855af15f513d8261063a575b50501561060657005b6104bd610638936040519063095ea7b360e01b602083015260248201525f6044820152604481526104b76064826107ee565b005b90915061064e5750803b15155b84806105fd565b600114610647565b90506020813d602011610682575b81610671602093836107ee565b8101031261009457516105df610597565b3d9150610664565b34610094576080366003190112610094576106a36107c2565b6106ab6107d8565b6044356001600160a01b03811692908390036100945760643567ffffffffffffffff8111610094576106e190369060040161082c565b6020815191818082019384920101031261009457515f1981146107475761063893604051936323b872dd60e01b602086015260018060a01b0316602485015260448401526064830152606482526107396084836107ee565b6001600160a01b0316610955565b630d550c3b60e11b5f5260045ffd5b346100945761076436610872565b602081939293519181808201938492010103126100945751905f1982146107475760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261063891906107396064836107ee565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff82111761047157604052565b67ffffffffffffffff811161047157601f01601f191660200190565b81601f820112156100945780359061084382610810565b9261085160405194856107ee565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff8211610094576108c59160040161082c565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b51906001600160a01b038216820361009457565b9190820180921161090d57565b634e487b7160e01b5f52601160045260245ffd5b9161092d8183856109ad565b918115610941576108c59309151590610900565b634e487b7160e01b5f52601260045260245ffd5b905f602091828151910182855af115610466575f513d6109a457506001600160a01b0381163b155b6109845750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b6001141561097d565b91818302915f1981850993838086109503948086039514610a3d5784831115610a255790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b50508092501561094157049056fea2646970667358221220191f3a0969690b852c0fad405075e504d7c37835c39e58743a8dc57c2ad534da64736f6c634300081d0033000000000000000000000000a669e7a0d4b3e4fa48af2de86bd4cd7126be4e13", + "nonce": "0x132", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xb698009eba2aad0c2392f30168fe4094ef1d28a37a735d81a715c446d92b75d0", + "transactionType": "CREATE", + "contractName": "PendleSwapV3AdapterV2", + "contractAddress": "0xf95130ddfa9eb132a25b121a29991cea989ebb7c", + "function": null, + "arguments": [ + "0x888888888889758F76e7103c6CbF23ABbF58F946" + ], + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "gas": "0x175849", + "value": "0x0", + "input": "0x60c0604052346100f757604051601f61132138819003918201601f19168301916001600160401b038311848410176100e3578084926020946040528339810103126100f757516001600160a01b038116908190036100f7573060805260405160a081016001600160401b038111828210176100e357655af3107a4000916080916040525f81525f1960208201525f6040820152610100606082015201525f6008555f196009555f600a55610100600b55655af3107a4000600c5560a05260405161122590816100fc82396080518161025d015260a0518181816089015261031d0152f35b634e487b7160e01b5f52604160045260245ffd5b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816309316dd314610b30575080633268263b14610ac45780634ebfc81414610a855780636563c0e9146109b95780639df303251461084e578063e0a80413146101f8578063f66a7749146100bc5763f887ea4014610074575f80fd5b346100b8575f3660031901126100b8576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b346100b8575f3660031901126100b8575f54604051905f6001548060011c91600182169182156101ee575b6020841083146101da5783865285929081156101bb575060011461015c575b61011292500383610cd2565b60ff60025416610150604051938361012e8660ff819716610e04565b60081c6001600160a01b03166020850152608060408501819052840190610d08565b90151560608301520390f35b5060015f90815290917fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b81831061019f57505090602061011292820101610106565b6020919350806001915483858901015201910190918492610187565b6020925061011294915060ff191682840152151560051b820101610106565b634e487b7160e01b5f52602260045260245ffd5b92607f16926100e7565b346100b85760803660031901126100b857610211610d2c565b610219610d42565b60443567ffffffffffffffff81116100b857610239903690600401610d58565b9160643567ffffffffffffffff81116100b85761025a903690600401610d58565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316301461083f5783516001600160a01b0393841694919093169260208083019291820191909103126100b85751916060828051810103126100b85760208201516001600160a01b03811691908290036100b857606060408401519301519460405195630b2339af60e21b8752606087600481875afa968715610508575f976107d2575b50604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316602482018190529590602081604481885afa80156105085788905f9061079c575b6103709250611041565b60405163095ea7b360e01b60208083019182526001600160a01b038a1660248401526044808401949094529282529091905f906103ae606485610cd2565b83519082895af15f513d82610780575b50501561073c575b506103d2818884611151565b90801561072857876103e79309151590611041565b956001600160a01b0316818103610513575050935f606094939261047e9661040d611062565b95818752602087015260408601526104906040519788968795869463640fc23d60e11b86523060048701526024860152604485015260085460648501526009546084850152600a5460a4850152600b5460c4850152600c5460e4850152610140610104850152610144840190610e40565b82810360031901610124840152610ff1565b03925af18015610508576104d3915f916104d7575b505b604051906020820152602081526104bf604082610cd2565b604051918291602083526020830190610d08565b0390f35b6104f9915060603d606011610501575b6104f18183610cd2565b810190610e25565b5050826104a5565b503d6104e7565b6040513d5f823e3d90fd5b9150949391604051630bc4ed8360e21b8152602081600481865afa908115610508575f916106ed575b50156106535750936020600494956040519586809263781c18db60e01b82525afa938415610508575f9461060b575b50905f61057f6105bc9660409695946110d2565b938551968795869485936323f8ef1160e11b855230600486015260018060a01b031660248501526044840152608060648401526084830190610e40565b03925af18015610508575f906105d7575b6104d391506104a7565b506040813d604011610603575b816105f160409383610cd2565b810103126100b8576104d390516105cd565b3d91506105e4565b90929193506020813d60201161064b575b8161062960209383610cd2565b810103126100b85751926001600160a01b03841684036100b85790915f61056b565b3d915061061c565b929190505f6106676060956106a0976110d2565b936106b160405197889687958694631652a23360e21b86523060048701526024860152604485015260a0606485015260a4840190610e40565b828103600319016084840152610ff1565b03925af18015610508576104d3915f916106cc575b506104a7565b6106e5915060603d606011610501576104f18183610cd2565b5050826106c6565b90506020813d602011610720575b8161070860209383610cd2565b810103126100b8575180151581036100b8578761053c565b3d91506106fb565b634e487b7160e01b5f52601260045260245ffd5b61077a9061077460405163095ea7b360e01b60208201528960248201525f60448201526044815261076e606482610cd2565b876110f9565b856110f9565b886103c6565b9091506107945750843b15155b8a806103be565b60011461078d565b50506020813d6020116107ca575b816107b760209383610cd2565b810103126100b857876103709151610366565b3d91506107aa565b9096506060813d606011610837575b816107ee60609383610cd2565b810103126100b85780516001600160a01b038116036100b8576020810151906001600160a01b03821682036100b857604001516001600160a01b038116036100b8579587610307565b3d91506107e1565b6302f3451d60e21b5f5260045ffd5b346100b85761085c36610dae565b80516001600160a01b039093169260208083019291820191909103126100b85751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa908115610508575f91610985575b50610903936109116108d06020945f94611041565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f198101875286610cd2565b84519082855af15f513d82610969575b50501561092a57005b610962610967936040519063095ea7b360e01b602083015260248201525f60448201526044815261095c606482610cd2565b826110f9565b6110f9565b005b90915061097d5750803b15155b8480610921565b600114610976565b90506020813d6020116109b1575b816109a060209383610cd2565b810103126100b857516109036108bb565b3d9150610993565b346100b85760803660031901126100b8576109d2610d2c565b6109da610d42565b6044356001600160a01b03811692908390036100b85760643567ffffffffffffffff81116100b857610a10903690600401610d58565b602081519181808201938492010103126100b857515f198114610a765761096793604051936323b872dd60e01b602086015260018060a01b031660248501526044840152606483015260648252610a68608483610cd2565b6001600160a01b03166110f9565b630d550c3b60e11b5f5260045ffd5b346100b8575f3660031901126100b85760a0600854600954600a54600b5490600c54926040519485526020850152604084015260608301526080820152f35b346100b857610ad236610dae565b602081939293519181808201938492010103126100b85751905f198214610a765760405163a9059cbb60e01b60208201526001600160a01b039390931660248401526044808401929092529082526109679190610a68606483610cd2565b346100b8575f3660031901126100b85760018060a01b0360035416600454915f6007548060011c90600181168015610c31575b6020831081146101da57828552908115610c0d5750600114610baf575b5090610b91816104d3930382610cd2565b60405193849384526020840152606060408401526060830190610d08565b60075f9081527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688939250905b808210610bf357509091508101602001610b91610b80565b919260018160209254838588010152019101909291610bdb565b60ff191660208086019190915291151560051b84019091019150610b919050610b80565b91607f1691610b63565b5f92918154918260011c92600181168015610cc8575b6020851081146101da57848452908115610cab5750600114610c7257505050565b5f9081526020812093945091925b838310610c91575060209250010190565b600181602092949394548385870101520191019190610c80565b915050602093945060ff929192191683830152151560051b010190565b93607f1693610c51565b90601f8019910116810190811067ffffffffffffffff821117610cf457604052565b634e487b7160e01b5f52604160045260245ffd5b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036100b857565b602435906001600160a01b03821682036100b857565b81601f820112156100b85780359067ffffffffffffffff8211610cf45760405192610d8d601f8401601f191660200185610cd2565b828452602083830101116100b857815f926020809301838601378301015290565b60606003198201126100b8576004356001600160a01b03811681036100b857916024356001600160a01b03811681036100b857916044359067ffffffffffffffff82116100b857610e0191600401610d58565b90565b90600b821015610e115752565b634e487b7160e01b5f52602160045260245ffd5b908160609103126100b8578051916040602083015192015190565b60809060018060a01b0381511683526020810151602084015260018060a01b03604082015116604084015260018060a01b03606082015116606084015201519060a06080820152610e9560a082018351610e04565b60208201516001600160a01b031660c08201526040820151608060e083015261010090606090610eca90610120850190610d08565b930151151591015290565b908060208354918281520160208260051b840101935f5260205f20925f905b838210610f0357505050505090565b9091929394601f19828203018452606081528554606082015260018601546080820152600286015460a0820152600386015460ff81166004811015610e115760c08301526001600160a01b03600891821c811660e0840152600488015481166101008401526005880154811661012084015260068801541661014083015260078701546101608301528601546101808083019190915260098701546101a08301526101c0820152600190602090600d90610fd7610fc76101e08301600a8c01610c3b565b82810385840152600b8b01610c3b565b906040600c8b015491015297019401920190939293610ef4565b610e019060018060a01b03600354168152600454602082015260a0604082015261103161102260a083016005610ed5565b82810360608401526006610ed5565b9060808183039101526007610c3b565b9190820180921161104e57565b634e487b7160e01b5f52601160045260245ffd5b6040519060a0820182811067ffffffffffffffff821117610cf457604052815f81525f60208201525f60408201525f606082015260405190608082019082821067ffffffffffffffff831117610cf4576080916040525f83525f6020840152606060408401525f60608401520152565b91906110dc611062565b6001600160a01b0390931680845260208401919091526040830152565b905f602091828151910182855af115610508575f513d61114857506001600160a01b0381163b155b6111285750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b60011415611121565b91818302915f19818509938380861095039480860395146111e157848311156111c95790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b50508092501561072857049056fea26469706673582212205bf94e5371bc2f132405be99261f2b9351cbdbf49e328ca512e068eee1eda9d164736f6c634300081d0033000000000000000000000000888888888889758f76e7103c6cbf23abbf58f946", + "nonce": "0x133", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x50ad93617ae78c5088118139211ea9f5e6e8ac1c4fe5e302996707ba5b713519", + "transactionType": "CREATE", + "contractName": "ERC4626VaultAdapterV2", + "contractAddress": "0x133bf41c23edfb2f0ef586b5b01063a17470e294", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "gas": "0xb69d7", + "value": "0x0", + "input": "0x60a0806040523460215730608052610900908161002682396080518160aa0152f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146106395780636563c0e91461056d5780639df303251461040d5763e0a8041314610045575f80fd5b346102a35760803660031901126102a35761005e6106a5565b6100666106bb565b9060443567ffffffffffffffff81116102a357610087903690600401610707565b60643567ffffffffffffffff81116102a3576100a7903690600401610707565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630146103fe5781516001600160a01b039182169490911691602080820192820191909103126102a35751926060838051810103126102a35760208301519260028410156102a357606060408201519101519061012f81878461082c565b9080156103ea578661014493091515906107b3565b92806103525750604051636eb1769f60e11b815230600482015260248101839052602081604481855afa9081156102af575f9161031a575b50846020939261018f5f976044946107b3565b60405163095ea7b360e01b8782019081526001600160a01b038716602483015260448083019390935291815290869089906101cb6064856106d1565b83519082865af188513d826102fb575b5050156102ba575b50506040519586938492636e553f6560e01b845260048401523060248401525af19182156102af575f92610277575b50818181106102625750505b60408051602081019283526020815261023782826106d1565b8151928391602083525180918160208501528484015e5f828201840152601f01601f19168101030190f35b63eb7f211d60e01b5f5260045260245260445ffd5b9091506020813d6020116102a7575b81610293602093836106d1565b810103126102a35751905f610212565b5f80fd5b3d9150610286565b6040513d5f823e3d90fd5b6102f4916102ef60405163095ea7b360e01b898201528760248201528a878201528681526102e96064826106d1565b826107d4565b6107d4565b5f806101e3565b9091501589146103125750813b15155b5f806101db565b60011461030b565b90506020929192813d60201161034a575b81610338602093836106d1565b810103126102a357519091908461017c565b3d915061032b565b909391506001036103db575f9260646020926040519586938492635d043b2960e11b845260048401523060248401523060448401525af19182156102af575f926103a7575b508181811061026257505061021e565b9091506020813d6020116103d3575b816103c3602093836106d1565b810103126102a35751905f610397565b3d91506103b6565b634a7f394f60e01b5f5260045ffd5b634e487b7160e01b5f52601260045260245ffd5b6302f3451d60e21b5f5260045ffd5b346102a35761041b3661075d565b80516001600160a01b039093169260208083019291820191909103126102a35751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa9081156102af575f91610539575b506104c2936104d061048f6020945f946107b3565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f1981018752866106d1565b84519082855af15f513d8261051d575b5050156104e957005b6102ef61051b936040519063095ea7b360e01b602083015260248201525f6044820152604481526102e96064826106d1565b005b9091506105315750803b15155b84806104e0565b60011461052a565b90506020813d602011610565575b81610554602093836106d1565b810103126102a357516104c261047a565b3d9150610547565b346102a35760803660031901126102a3576105866106a5565b61058e6106bb565b6044356001600160a01b03811692908390036102a35760643567ffffffffffffffff81116102a3576105c4903690600401610707565b602081519181808201938492010103126102a357515f19811461062a5761051b93604051936323b872dd60e01b602086015260018060a01b03166024850152604484015260648301526064825261061c6084836106d1565b6001600160a01b03166107d4565b630d550c3b60e11b5f5260045ffd5b346102a3576106473661075d565b602081939293519181808201938492010103126102a35751905f19821461062a5760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261051b919061061c6064836106d1565b600435906001600160a01b03821682036102a357565b602435906001600160a01b03821682036102a357565b90601f8019910116810190811067ffffffffffffffff8211176106f357604052565b634e487b7160e01b5f52604160045260245ffd5b81601f820112156102a35780359067ffffffffffffffff82116106f3576040519261073c601f8401601f1916602001856106d1565b828452602083830101116102a357815f926020809301838601378301015290565b60606003198201126102a3576004356001600160a01b03811681036102a357916024356001600160a01b03811681036102a357916044359067ffffffffffffffff82116102a3576107b091600401610707565b90565b919082018092116107c057565b634e487b7160e01b5f52601160045260245ffd5b905f602091828151910182855af1156102af575f513d61082357506001600160a01b0381163b155b6108035750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156107fc565b91818302915f19818509938380861095039480860395146108bc57848311156108a45790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b5050809250156103ea57049056fea26469706673582212208494a0174c4f07fd048515a6e3e22a540bf8edf31a0e807f0e3019b7d5b7c74464736f6c634300081d0033", + "nonce": "0x134", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x94ffcc659f0febbae7c4e1083f9e33cfc035fa6c6cbee932cf7ae5661bd95684", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", + "gas": "0x159e8", + "value": "0x0", + "input": "0xb6b07b8e0000000000000000000000007fa333b184868d88ac78a82ec06d5e87d4b0322e000000000000000000000000048a54deae47c41f760c42622b114bb89b836a9f0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x135", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xc93f5bd547e801e17220d4421ac0491a351e6432f6ab3165d10f1d9a1310ad1f", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", + "gas": "0x159e8", + "value": "0x0", + "input": "0xb6b07b8e0000000000000000000000007fa333b184868d88ac78a82ec06d5e87d4b0322e000000000000000000000000b986312024c8e0f895b00eba32c81b5759c91fff0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x136", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x19c043e76febde999a5b532fffe0b2eb7706790b2ba4ff5a0402e84df4b4e71c", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", + "gas": "0x159e8", + "value": "0x0", + "input": "0xb6b07b8e0000000000000000000000007fa333b184868d88ac78a82ec06d5e87d4b0322e000000000000000000000000f95130ddfa9eb132a25b121a29991cea989ebb7c0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x137", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x5862d2f315f787edbcc2848c0ab189ded71a509e0fa0853ceeee3f925fb04c42", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", + "gas": "0x159e8", + "value": "0x0", + "input": "0xb6b07b8e0000000000000000000000007fa333b184868d88ac78a82ec06d5e87d4b0322e000000000000000000000000133bf41c23edfb2f0ef586b5b01063a17470e2940000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x138", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0xa709b", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x44d6344afc28390b198396e90f16dafceabab7e2c409672a4fac2e04447809f6", + "transactionIndex": "0x4", + "blockHash": "0x3d1f80154ea5340b93a48da4f578b0ea0c413a12c2bd7525f6d5b0820f68a456", + "blockNumber": "0x15059d02", + "gasUsed": "0x93e45", + "effectiveGasPrice": "0x989680", + "blobGasUsed": "0x0", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": null, + "contractAddress": "0x048a54deae47c41f760c42622b114bb89b836a9f", + "gasUsedForL1": "0x44f7", + "l1BlockNumber": "0x15c2299" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xcf106", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x119e5c0964ab69c002349edb04debe3dcc2f671fbb1afac6fede6aede244c454", + "transactionIndex": "0x6", + "blockHash": "0x517c068ee2540ba8ebd2de1f7778337506c1191864511e2c91645f623f9a8adc", + "blockNumber": "0x15059d2b", + "gasUsed": "0x9fcf7", + "effectiveGasPrice": "0x989680", + "blobGasUsed": "0x0", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": null, + "contractAddress": "0xb986312024c8e0f895b00eba32c81b5759c91fff", + "gasUsedForL1": "0x4963", + "l1BlockNumber": "0x15c2299" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1214fc", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xb698009eba2aad0c2392f30168fe4094ef1d28a37a735d81a715c446d92b75d0", + "transactionIndex": "0x2", + "blockHash": "0xe62cf643bd339557317ca215fd06cdd1f32036f1a182183a6175682c916c882c", + "blockNumber": "0x15059d30", + "gasUsed": "0x11be43", + "effectiveGasPrice": "0x989680", + "blobGasUsed": "0x0", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": null, + "contractAddress": "0xf95130ddfa9eb132a25b121a29991cea989ebb7c", + "gasUsedForL1": "0x7b4f", + "l1BlockNumber": "0x15c2299" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x13ba1b", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x50ad93617ae78c5088118139211ea9f5e6e8ac1c4fe5e302996707ba5b713519", + "transactionIndex": "0x6", + "blockHash": "0xa5da3545c009341f01470d615eaa05a48356edfc32f775d90900171b73539443", + "blockNumber": "0x15059d34", + "gasUsed": "0x8a8e7", + "effectiveGasPrice": "0x989680", + "blobGasUsed": "0x0", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": null, + "contractAddress": "0x133bf41c23edfb2f0ef586b5b01063a17470e294", + "gasUsedForL1": "0x3eea", + "l1BlockNumber": "0x15c2299" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x23bc5a", + "logs": [ + { + "address": "0x7fa333b184868d88ac78a82ec06d5e87d4b0322e", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x000000000000000000000000048a54deae47c41f760c42622b114bb89b836a9f0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xa0826f26a0f69a6276f476b313416252af434368b4f5f28b1c692da29f3c69b9", + "blockNumber": "0x15059d39", + "transactionHash": "0x94ffcc659f0febbae7c4e1083f9e33cfc035fa6c6cbee932cf7ae5661bd95684", + "transactionIndex": "0x7", + "logIndex": "0x35", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x94ffcc659f0febbae7c4e1083f9e33cfc035fa6c6cbee932cf7ae5661bd95684", + "transactionIndex": "0x7", + "blockHash": "0xa0826f26a0f69a6276f476b313416252af434368b4f5f28b1c692da29f3c69b9", + "blockNumber": "0x15059d39", + "gasUsed": "0x10155", + "effectiveGasPrice": "0x989680", + "blobGasUsed": "0x0", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", + "contractAddress": null, + "gasUsedForL1": "0x856", + "l1BlockNumber": "0x15c229a" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x2e72e", + "logs": [ + { + "address": "0x7fa333b184868d88ac78a82ec06d5e87d4b0322e", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x000000000000000000000000b986312024c8e0f895b00eba32c81b5759c91fff0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x07dae7d94ae47c872a0acdbe3a0370e458422898c7efefcc6cf71bb12562aaf3", + "blockNumber": "0x15059d45", + "transactionHash": "0xc93f5bd547e801e17220d4421ac0491a351e6432f6ab3165d10f1d9a1310ad1f", + "transactionIndex": "0x2", + "logIndex": "0x2", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xc93f5bd547e801e17220d4421ac0491a351e6432f6ab3165d10f1d9a1310ad1f", + "transactionIndex": "0x2", + "blockHash": "0x07dae7d94ae47c872a0acdbe3a0370e458422898c7efefcc6cf71bb12562aaf3", + "blockNumber": "0x15059d45", + "gasUsed": "0x10155", + "effectiveGasPrice": "0x989680", + "blobGasUsed": "0x0", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", + "contractAddress": null, + "gasUsedForL1": "0x856", + "l1BlockNumber": "0x15c229a" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x7a1d5", + "logs": [ + { + "address": "0x7fa333b184868d88ac78a82ec06d5e87d4b0322e", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x000000000000000000000000f95130ddfa9eb132a25b121a29991cea989ebb7c0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xf8e4ea19c7d396382d12ef127c21c05d2d0e2ec9a6a4a5a344b1007d40ac29d1", + "blockNumber": "0x15059d4a", + "transactionHash": "0x19c043e76febde999a5b532fffe0b2eb7706790b2ba4ff5a0402e84df4b4e71c", + "transactionIndex": "0x4", + "logIndex": "0xd", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x19c043e76febde999a5b532fffe0b2eb7706790b2ba4ff5a0402e84df4b4e71c", + "transactionIndex": "0x4", + "blockHash": "0xf8e4ea19c7d396382d12ef127c21c05d2d0e2ec9a6a4a5a344b1007d40ac29d1", + "blockNumber": "0x15059d4a", + "gasUsed": "0x10155", + "effectiveGasPrice": "0x989680", + "blobGasUsed": "0x0", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", + "contractAddress": null, + "gasUsedForL1": "0x856", + "l1BlockNumber": "0x15c229a" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x10155", + "logs": [ + { + "address": "0x7fa333b184868d88ac78a82ec06d5e87d4b0322e", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x000000000000000000000000133bf41c23edfb2f0ef586b5b01063a17470e2940000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x376034b48ff05b4990ec3f7eb2ab24905e092d52c2e99e196a3c43ea610b1a56", + "blockNumber": "0x15059d4f", + "transactionHash": "0x5862d2f315f787edbcc2848c0ab189ded71a509e0fa0853ceeee3f925fb04c42", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x5862d2f315f787edbcc2848c0ab189ded71a509e0fa0853ceeee3f925fb04c42", + "transactionIndex": "0x1", + "blockHash": "0x376034b48ff05b4990ec3f7eb2ab24905e092d52c2e99e196a3c43ea610b1a56", + "blockNumber": "0x15059d4f", + "gasUsed": "0x10155", + "effectiveGasPrice": "0x989680", + "blobGasUsed": "0x0", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", + "contractAddress": null, + "gasUsedForL1": "0x856", + "l1BlockNumber": "0x15c229a" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1751264345, + "chain": 42161, + "commit": "01db0f8" +} \ No newline at end of file diff --git a/broadcast/DeployAdapters.s.sol/42161/run-latest.json b/broadcast/DeployAdapters.s.sol/42161/run-latest.json index ab283ef..8f978f9 100644 --- a/broadcast/DeployAdapters.s.sol/42161/run-latest.json +++ b/broadcast/DeployAdapters.s.sol/42161/run-latest.json @@ -1,170 +1,154 @@ { "transactions": [ { - "hash": "0x4df862fd2444842c869f2d44d11555de94e8cebea16cda7ef15c14cc27039563", + "hash": "0x44d6344afc28390b198396e90f16dafceabab7e2c409672a4fac2e04447809f6", "transactionType": "CREATE", - "contractName": "UniswapV3Adapter", - "contractAddress": "0x25e4889346f04b4e005ffab35bf2c3cb395e74d5", + "contractName": "UniswapV3AdapterV2", + "contractAddress": "0x048a54deae47c41f760c42622b114bb89b836a9f", "function": null, "arguments": [ "0xE592427A0AEce92De3Edee1F18E0157C05861564" ], "transaction": { "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", - "gas": "0xc221f", + "gas": "0xc2e36", "value": "0x0", - "input": "0x60a034606e57601f610a1838819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606e57516001600160a01b03811690819003606e57608052604051610991908161008782396080518181816065015261015c0152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146105485780636563c0e9146104c85780639df303251461048c578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b1610582565b6100b9610598565b5060443567ffffffffffffffff8111610094576100da9036906004016105ec565b60643567ffffffffffffffff8111610094576100fa9036906004016105ec565b906020815191818082019384920101031261009457516040516370a0823160e01b8152306004820152926001600160a01b0316602084602481845afa9384156103b9575f94610458575b5060405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166004820181905260248201849052906020816044815f875af180156103b957610421575b5083518401906080856020840193031261009457602085015167ffffffffffffffff811161009457850182603f82011215610094576020810151906101e4826105d0565b936101f260405195866105ae565b8285526040828401011161009457815f926040602093018387015e8401015260408501519060806060870151960151928584029380850487149015171561037357861561040d5760405160a081019080821067ffffffffffffffff8311176103f9576020956102ac935f9360405282528682019030825260408301968752606083019a8a8c5260808401910481526040519a8b978896879563c04b8d5960e01b87528b60048801525160a0602488015260c4870190610688565b93516001600160a01b031660448601525160648501525160848401525160a483015203925af19283156103b9575f936103c4575b506020602491604051928380926370a0823160e01b82523060048301525afa9081156103b9575f91610387575b508361031983836106ac565b036103525761034e836040519060208201526020815261033a6040826105ae565b604051918291602083526020830190610688565b0390f35b909150820391821161037357638e17b66b60e01b5f5260045260245260445ffd5b634e487b7160e01b5f52601160045260245ffd5b90506020813d6020116103b1575b816103a2602093836105ae565b8101031261009457518461030d565b3d9150610395565b6040513d5f823e3d90fd5b9092506020813d6020116103f1575b816103e0602093836105ae565b8101031261009457519160206102e0565b3d91506103d3565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b6020813d602011610450575b8161043a602093836105ae565b81010312610094575180151581146101a0575f80fd5b3d915061042d565b9093506020813d602011610484575b81610474602093836105ae565b8101031261009457519284610144565b3d9150610467565b346100945761049a36610632565b9190602083519381808201958692010103126100945791516104c69290916001600160a01b03166107a3565b005b34610094576080366003190112610094576104e1610582565b6104e9610598565b906044356001600160a01b03811681036100945760643567ffffffffffffffff81116100945761051d9036906004016105ec565b92602084519481808201968792010103126100945792516104c69390926001600160a01b031661073b565b346100945761055636610632565b9190602083519381808201958692010103126100945791516104c69290916001600160a01b03166106b9565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff8211176103f957604052565b67ffffffffffffffff81116103f957601f01601f191660200190565b81601f8201121561009457803590610603826105d0565b9261061160405194856105ae565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff821161009457610685916004016105ec565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9190820180921161037357565b9091905f19821461072c576001600160a01b03831630148015610724575b61071f5760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261071d91906107186064836105ae565b610903565b565b505050565b5081156106d7565b630d550c3b60e11b5f5260045ffd5b9092915f19831461072c576001600160a01b03908116931691828414801561079b575b6107955761071d93604051936323b872dd60e01b6020860152602485015260448401526064830152606482526107186084836105ae565b50505050565b50801561075e565b821580156108f1575b61071f57604051636eb1769f60e11b81523060048201526001600160a01b03838116602483018190529490831691602081604481865afa9081156103b9575f916108bd575b50610839946108476108066020945f946106ac565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529687906064820190565b03601f1981018852876105ae565b85519082865af1903d5f51908361089e575b5050501561086657505050565b61071861071d936040519063095ea7b360e01b602083015260248201525f6044820152604481526108986064826105ae565b82610903565b919250906108b357503b15155b5f8080610859565b60019150146108ab565b90506020813d6020116108e9575b816108d8602093836105ae565b8101031261009457516108396107f1565b3d91506108cb565b506001600160a01b03821630146107ac565b905f602091828151910182855af1156103b9575f513d61095257506001600160a01b0381163b155b6109325750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b6001141561092b56fea26469706673582212206ad8ebc6ec787a48097d03c1fbb2ad1b7bd771674b19f2f62398a14d8b67431064736f6c634300081b0033000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564", - "nonce": "0x117", + "input": "0x60c034607a57601f610a3738819003918201601f19168301916001600160401b03831184841017607e57808492602094604052833981010312607a57516001600160a01b03811690819003607a573060805260a0526040516109a4908161009382396080518160fd015260a051818181606501526101610152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146106c15780636563c0e9146105f55780639df3032514610495578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b161072d565b6100b9610743565b5060443567ffffffffffffffff8111610094576100da903690600401610797565b60643567ffffffffffffffff8111610094576100fa903690600401610797565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630146104865781516001600160a01b039190911691602080820192820191909103126100945751604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316602482018190529193919290602081604481855afa80156103bd5785905f90610450575b6101b79250610857565b60405163095ea7b360e01b60208083019182526001600160a01b03871660248401526044808401949094529282529091905f906101f5606485610759565b83519082865af15f513d82610434575b5050156103f0575b505080518101916080826020850194031261009457602082015167ffffffffffffffff811161009457820183603f82011215610094576020810151906102528261077b565b946102606040519687610759565b8286526040828401011161009457815f926040602093018388015e85010152604082015191608060608201519101519061029b8187846108d0565b9080156103dc57866102b09309151590610857565b9260405160a081019080821067ffffffffffffffff8311176103c857602095610322935f936040528252868201903082526040830196875260608301988952608083019081526040519889978896879563c04b8d5960e01b87528b60048801525160a0602488015260c4870190610833565b93516001600160a01b031660448601525160648501525160848401525160a483015203925af180156103bd575f90610389575b6103859060405190602082015260208152610371604082610759565b604051918291602083526020830190610833565b0390f35b506020813d6020116103b5575b816103a360209383610759565b81010312610094576103859051610355565b3d9150610396565b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b61042d9161042860405163095ea7b360e01b60208201528660248201525f604482015260448152610422606482610759565b82610878565b610878565b838061020d565b9091506104485750813b15155b8680610205565b600114610441565b50506020813d60201161047e575b8161046b60209383610759565b8101031261009457846101b791516101ad565b3d915061045e565b6302f3451d60e21b5f5260045ffd5b34610094576104a3366107dd565b80516001600160a01b039093169260208083019291820191909103126100945751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa9081156103bd575f916105c1575b5061054a936105586105176020945f94610857565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f198101875286610759565b84519082855af15f513d826105a5575b50501561057157005b6104286105a3936040519063095ea7b360e01b602083015260248201525f604482015260448152610422606482610759565b005b9091506105b95750803b15155b8480610568565b6001146105b2565b90506020813d6020116105ed575b816105dc60209383610759565b81010312610094575161054a610502565b3d91506105cf565b346100945760803660031901126100945761060e61072d565b610616610743565b6044356001600160a01b03811692908390036100945760643567ffffffffffffffff81116100945761064c903690600401610797565b6020815191818082019384920101031261009457515f1981146106b2576105a393604051936323b872dd60e01b602086015260018060a01b0316602485015260448401526064830152606482526106a4608483610759565b6001600160a01b0316610878565b630d550c3b60e11b5f5260045ffd5b34610094576106cf366107dd565b602081939293519181808201938492010103126100945751905f1982146106b25760405163a9059cbb60e01b60208201526001600160a01b039390931660248401526044808401929092529082526105a391906106a4606483610759565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff8211176103c857604052565b67ffffffffffffffff81116103c857601f01601f191660200190565b81601f82011215610094578035906107ae8261077b565b926107bc6040519485610759565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff82116100945761083091600401610797565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9190820180921161086457565b634e487b7160e01b5f52601160045260245ffd5b905f602091828151910182855af1156103bd575f513d6108c757506001600160a01b0381163b155b6108a75750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156108a0565b91818302915f198185099383808610950394808603951461096057848311156109485790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b5050809250156103dc57049056fea2646970667358221220c66a6ef0f7fbba462fbafbd2ef2a7ef760baae0e9780be52e06dc1d37795583464736f6c634300081d0033000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564", + "nonce": "0x131", "chainId": "0xa4b1" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0xf2ef3b49657979ab628163410dddfcef7ffa4b6c2983671005e9d40e48243dd9", + "hash": "0x119e5c0964ab69c002349edb04debe3dcc2f671fbb1afac6fede6aede244c454", "transactionType": "CREATE", - "contractName": "OdosV2Adapter", - "contractAddress": "0x003e6f7f6071a4e33f9324c125deae2615998010", + "contractName": "OdosV2AdapterV2", + "contractAddress": "0xb986312024c8e0f895b00eba32c81b5759c91fff", "function": null, "arguments": [ "0xa669e7A0d4b3e4Fa48af2dE86BD4CD7126Be4e13" ], "transaction": { "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", - "gas": "0xd97f5", + "gas": "0xd28ab", "value": "0x0", - "input": "0x60a034606e57601f610b5f38819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606e57516001600160a01b03811690819003606e57608052604051610ad890816100878239608051818181606501526101600152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b1461064a5780636563c0e9146105ca5780639df303251461058e578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b1610684565b6100b961069a565b9060443567ffffffffffffffff8111610094576100da9036906004016106ee565b9060643567ffffffffffffffff8111610094576100fb9036906004016106ee565b916020815191818082019384920101031261009457516040516370a0823160e01b81523060048201529390916001600160a01b031690602085602481855afa948515610493575f9561055a575b5060405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600482018190526024820185905291906020816044815f885af1801561049357610523575b5084518501948060208701960361014081126100945760e013610094576040519060e0820182811067ffffffffffffffff82111761050f576040526101ec60208201610a05565b82526040810151926020830193845261020760608301610a05565b976040840198895261021b60808401610a05565b6060850190815260a08401516080860190815260c08501519060a0870191825261024760e08701610a05565b9260c0880193845261010087015167ffffffffffffffff811161009457870185603f8201121561009457602081015190610280826106d2565b9661028e60405198896106b0565b8288526040828401011161009457815f92604060209301838a015e870101526101208701516001600160a01b03811697908890036100945761014001519563ffffffff87168097036100945781516001600160a01b039182169116036104d3578b8251906102fb91610a19565b895161030691610a2c565b82528b83519061031591610a19565b895161032091610a2c565b83528b8952308452604051630ed8d73960e21b815297516001600160a01b0390811660048a0152985160248901529b51881660448801529a518716606487015299516084860152985160a4850152975190931660c483015261014060e4830152909586928392916103969061014485019061078a565b9161010484015261012483015203815a6020945f91f1928315610493575f9361049e575b506020602491604051928380926370a0823160e01b82523060048301525afa908115610493575f91610461575b50836103f383836107ae565b0361042c5761042883604051906020820152602081526104146040826106b0565b60405191829160208352602083019061078a565b0390f35b909150820391821161044d57638e17b66b60e01b5f5260045260245260445ffd5b634e487b7160e01b5f52601160045260245ffd5b90506020813d60201161048b575b8161047c602093836106b0565b810103126100945751846103e7565b3d915061046f565b6040513d5f823e3d90fd5b9092506020813d6020116104cb575b816104ba602093836106b0565b8101031261009457519160206103ba565b3d91506104ad565b60405162461bcd60e51b815260206004820152601460248201527324a72b20a624a22fa7aaaa282aaa2faa27a5a2a760611b6044820152606490fd5b634e487b7160e01b5f52604160045260245ffd5b6020813d602011610552575b8161053c602093836106b0565b81010312610094575180151581146101a5575f80fd5b3d915061052f565b9094506020813d602011610586575b81610576602093836106b0565b8101031261009457519385610148565b3d9150610569565b346100945761059c36610734565b9190602083519381808201958692010103126100945791516105c89290916001600160a01b03166108a5565b005b34610094576080366003190112610094576105e3610684565b6105eb61069a565b906044356001600160a01b03811681036100945760643567ffffffffffffffff81116100945761061f9036906004016106ee565b92602084519481808201968792010103126100945792516105c89390926001600160a01b031661083d565b346100945761065836610734565b9190602083519381808201958692010103126100945791516105c89290916001600160a01b03166107bb565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff82111761050f57604052565b67ffffffffffffffff811161050f57601f01601f191660200190565b81601f8201121561009457803590610705826106d2565b9261071360405194856106b0565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff821161009457610787916004016106ee565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9190820180921161044d57565b9091905f19821461082e576001600160a01b03831630148015610826575b6108215760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261081f919061081a6064836106b0565b610a4a565b565b505050565b5081156107d9565b630d550c3b60e11b5f5260045ffd5b9092915f19831461082e576001600160a01b03908116931691828414801561089d575b6108975761081f93604051936323b872dd60e01b60208601526024850152604484015260648301526064825261081a6084836106b0565b50505050565b508015610860565b821580156109f3575b61082157604051636eb1769f60e11b81523060048201526001600160a01b03838116602483018190529490831691602081604481865afa908115610493575f916109bf575b5061093b946109496109086020945f946107ae565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529687906064820190565b03601f1981018852876106b0565b85519082865af1903d5f5190836109a0575b5050501561096857505050565b61081a61081f936040519063095ea7b360e01b602083015260248201525f60448201526044815261099a6064826106b0565b82610a4a565b919250906109b557503b15155b5f808061095b565b60019150146109ad565b90506020813d6020116109eb575b816109da602093836106b0565b81010312610094575161093b6108f3565b3d91506109cd565b506001600160a01b03821630146108ae565b51906001600160a01b038216820361009457565b8181029291811591840414171561044d57565b8115610a36570490565b634e487b7160e01b5f52601260045260245ffd5b905f602091828151910182855af115610493575f513d610a9957506001600160a01b0381163b155b610a795750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b60011415610a7256fea26469706673582212204763315a6411a7960fce618c8c1b5d96ae7ea3c2ea7ebb92abcf095b95bbea1c64736f6c634300081b0033000000000000000000000000a669e7a0d4b3e4fa48af2de86bd4cd7126be4e13", - "nonce": "0x118", + "input": "0x60c034607a57601f610b1438819003918201601f19168301916001600160401b03831184841017607e57808492602094604052833981010312607a57516001600160a01b03811690819003607a573060805260a052604051610a81908161009382396080518160fd015260a051818181606501526101610152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146107565780636563c0e91461068a5780639df303251461052a578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b16107c2565b6100b96107d8565b5060443567ffffffffffffffff8111610094576100da90369060040161082c565b60643567ffffffffffffffff8111610094576100fa90369060040161082c565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316301461051b5781516001600160a01b039190911691602080820192820191909103126100945751604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031660248201819052919290602081604481855afa80156104665784905f906104e5575b6101b59250610900565b60405163095ea7b360e01b60208083019182526001600160a01b03861660248401526044808401949094529282529091905f906101f36064856107ee565b83519082865af15f513d826104c9575b505015610485575b505082518301908360208301920361014081126100945760e013610094576040519160e0830183811067ffffffffffffffff82111761047157604052610253602086016108ec565b83526040850151906020840191825261026e606087016108ec565b9360408101948552610282608088016108ec565b966060820197885260a0810151926080830193845260c08201519760a084019889526102b060e084016108ec565b9160c0850192835261010084015167ffffffffffffffff811161009457840181603f82011215610094576020810151906102e982610810565b926102f760405194856107ee565b8284526040828401011161009457815f926040602093018386015e830101526101208401516001600160a01b03811694908590036100945761014001519263ffffffff84168094036100945760209a876103e09461035a5f9a51828d5191610921565b825261036a8351828d5191610921565b83528a52308352604051630ed8d73960e21b815297516001600160a01b0390811660048a0152995160248901529a51891660448801529b518816606487015298516084860152995160a4850152965190941660c483015261014060e48301529096879586948593929091906101448501906108c8565b9161010484015261012483015203925af18015610466575f90610432575b61042e906040519060208201526020815261041a6040826107ee565b6040519182916020835260208301906108c8565b0390f35b506020813d60201161045e575b8161044c602093836107ee565b810103126100945761042e90516103fe565b3d915061043f565b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b6104c2916104bd60405163095ea7b360e01b60208201528560248201525f6044820152604481526104b76064826107ee565b82610955565b610955565b838061020b565b9091506104dd5750813b15155b8680610203565b6001146104d6565b50506020813d602011610513575b81610500602093836107ee565b8101031261009457836101b591516101ab565b3d91506104f3565b6302f3451d60e21b5f5260045ffd5b346100945761053836610872565b80516001600160a01b039093169260208083019291820191909103126100945751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa908115610466575f91610656575b506105df936105ed6105ac6020945f94610900565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f1981018752866107ee565b84519082855af15f513d8261063a575b50501561060657005b6104bd610638936040519063095ea7b360e01b602083015260248201525f6044820152604481526104b76064826107ee565b005b90915061064e5750803b15155b84806105fd565b600114610647565b90506020813d602011610682575b81610671602093836107ee565b8101031261009457516105df610597565b3d9150610664565b34610094576080366003190112610094576106a36107c2565b6106ab6107d8565b6044356001600160a01b03811692908390036100945760643567ffffffffffffffff8111610094576106e190369060040161082c565b6020815191818082019384920101031261009457515f1981146107475761063893604051936323b872dd60e01b602086015260018060a01b0316602485015260448401526064830152606482526107396084836107ee565b6001600160a01b0316610955565b630d550c3b60e11b5f5260045ffd5b346100945761076436610872565b602081939293519181808201938492010103126100945751905f1982146107475760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261063891906107396064836107ee565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff82111761047157604052565b67ffffffffffffffff811161047157601f01601f191660200190565b81601f820112156100945780359061084382610810565b9261085160405194856107ee565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff8211610094576108c59160040161082c565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b51906001600160a01b038216820361009457565b9190820180921161090d57565b634e487b7160e01b5f52601160045260245ffd5b9161092d8183856109ad565b918115610941576108c59309151590610900565b634e487b7160e01b5f52601260045260245ffd5b905f602091828151910182855af115610466575f513d6109a457506001600160a01b0381163b155b6109845750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b6001141561097d565b91818302915f1981850993838086109503948086039514610a3d5784831115610a255790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b50508092501561094157049056fea2646970667358221220191f3a0969690b852c0fad405075e504d7c37835c39e58743a8dc57c2ad534da64736f6c634300081d0033000000000000000000000000a669e7a0d4b3e4fa48af2de86bd4cd7126be4e13", + "nonce": "0x132", "chainId": "0xa4b1" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0x6a0adee2b9b03931714160c9cb43a3a61bb55a257fa170fc20528d253cca9dbf", + "hash": "0xb698009eba2aad0c2392f30168fe4094ef1d28a37a735d81a715c446d92b75d0", "transactionType": "CREATE", - "contractName": "PendleSwapV3Adapter", - "contractAddress": "0xdf69dda7ba69ddeeb4182b821eb2356744180405", + "contractName": "PendleSwapV3AdapterV2", + "contractAddress": "0xf95130ddfa9eb132a25b121a29991cea989ebb7c", "function": null, "arguments": [ "0x888888888889758F76e7103c6CbF23ABbF58F946" ], "transaction": { "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", - "gas": "0x1845fd", + "gas": "0x175849", "value": "0x0", - "input": "0x60a0604052346100ea57604051601f6113d838819003918201601f19168301916001600160401b038311848410176100d6578084926020946040528339810103126100ea57516001600160a01b038116908190036100ea5760405160a081016001600160401b038111828210176100d657655af3107a4000916080916040525f81525f1960208201525f6040820152610100606082015201525f6008555f196009555f600a55610100600b55655af3107a4000600c556080526040516112e990816100ef8239608051818181608901526103200152f35b634e487b7160e01b5f52604160045260245ffd5b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816309316dd314610a6b575080633268263b14610a315780634ebfc814146109f25780636563c0e9146109725780639df3032514610936578063e0a80413146101f8578063f66a7749146100bc5763f887ea4014610074575f80fd5b346100b8575f3660031901126100b8576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b346100b8575f3660031901126100b8575f54604051905f6001548060011c91600182169182156101ee575b6020841083146101da5783865285929081156101bb575060011461015c575b61011292500383610c0d565b60ff60025416610150604051938361012e8660ff819716610d3f565b60081c6001600160a01b03166020850152608060408501819052840190610c43565b90151560608301520390f35b5060015f90815290917fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b81831061019f57505090602061011292820101610106565b6020919350806001915483858901015201910190918492610187565b6020925061011294915060ff191682840152151560051b820101610106565b634e487b7160e01b5f52602260045260245ffd5b92607f16926100e7565b346100b85760803660031901126100b857610211610c67565b610219610c7d565b9060443567ffffffffffffffff81116100b85761023a903690600401610c93565b9060643567ffffffffffffffff81116100b85761025b903690600401610c93565b91602081519181808201938492010103126100b857516040516370a0823160e01b8152306004820152936001600160a01b03909216929091602085602481875afa948515610551575f95610902575b5060018060a01b0316906060818051810103126100b85760208101516001600160a01b038116908190036100b857606060408301519201519260405192630b2339af60e21b8452606084600481865afa938415610551575f94610895575b5060405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600482018190526024820188905295906020816044815f8d5af1801561055157610878575b508681029080820488149015171561050b5781156108645704926001600160a01b0316908082036105ba57505060405163095ea7b360e01b81526001600160a01b038416600482015260248101859052926020846044815f8a5af1928315610551576104509460609461058d575b505f6103dd6111eb565b938885528760208601528860408601526104626040519788968795869463640fc23d60e11b86523060048701526024860152604485015260085460648501526009546084850152600a5460a4850152600b5460c4850152600c5460e4850152610140610104850152610144840190610fea565b8281036003190161012484015261119b565b03925af1908115610551576024916020915f9161055c575b50935b6040516370a0823160e01b815230600482015292839182905afa908115610551575f9161051f575b50836104b18383610d60565b036104ea576104e683604051906020820152602081526104d2604082610c0d565b604051918291602083526020830190610c43565b0390f35b909150820391821161050b57638e17b66b60e01b5f5260045260245260445ffd5b634e487b7160e01b5f52601160045260245ffd5b90506020813d602011610549575b8161053a60209383610c0d565b810103126100b85751846104a5565b3d915061052d565b6040513d5f823e3d90fd5b61057e915060603d606011610586575b6105768183610c0d565b810190610fcf565b50508661047a565b503d61056c565b6105ae9060203d6020116105b3575b6105a68183610c0d565b810190610fb7565b6103d3565b503d61059c565b90929593604051630bc4ed8360e21b8152602081600481885afa908115610551575f91610845575b501561073c5750505060206004916040519283809263781c18db60e01b82525afa908115610551575f916106fa575b5060405163a9059cbb60e01b81526001600160a01b039190911660048201819052602482018490529093906020856044815f875af1908115610551575f956020926106df575b5060246040518097819363bcb7ea5d60e01b83523060048401525af1938415610551575f946106ab575b5083818110610696575050602060249161047d565b63eb7f211d60e01b5f5260045260245260445ffd5b9093506020813d6020116106d7575b816106c760209383610c0d565b810103126100b857519285610681565b3d91506106ba565b6106f590833d85116105b3576105a68183610c0d565b610657565b90506020813d602011610734575b8161071560209383610c0d565b810103126100b857516001600160a01b03811681036100b85785610611565b3d9150610708565b60405163095ea7b360e01b81526001600160a01b0382166004820152602481018790529496929491935090916020836044815f8b5af18015610551576107e8956060956107d7955f93610828575b506107936111eb565b938185526020850152604084015260405196879586948593631652a23360e21b855230600486015260248501528a604485015260a0606485015260a4840190610fea565b82810360031901608484015261119b565b03925af1908115610551576024916020915f91610807575b509361047d565b610820915060603d606011610586576105768183610c0d565b505086610800565b6108409060203d6020116105b3576105a68183610c0d565b61078a565b61085e915060203d6020116105b3576105a68183610c0d565b896105e2565b634e487b7160e01b5f52601260045260245ffd5b6108909060203d6020116105b3576105a68183610c0d565b610365565b9093506060813d6060116108fa575b816108b160609383610c0d565b810103126100b85780516001600160a01b038116036100b8576020810151906001600160a01b03821682036100b857604001516001600160a01b038116036100b8579288610308565b3d91506108a4565b9094506020813d60201161092e575b8161091e60209383610c0d565b810103126100b8575193856102aa565b3d9150610911565b346100b85761094436610ce9565b9190602083519381808201958692010103126100b85791516109709290916001600160a01b0316610e57565b005b346100b85760803660031901126100b85761098b610c67565b610993610c7d565b906044356001600160a01b03811681036100b85760643567ffffffffffffffff81116100b8576109c7903690600401610c93565b92602084519481808201968792010103126100b85792516109709390926001600160a01b0316610def565b346100b8575f3660031901126100b85760a0600854600954600a54600b5490600c54926040519485526020850152604084015260608301526080820152f35b346100b857610a3f36610ce9565b9190602083519381808201958692010103126100b85791516109709290916001600160a01b0316610d6d565b346100b8575f3660031901126100b85760018060a01b0360035416600454915f6007548060011c90600181168015610b6c575b6020831081146101da57828552908115610b485750600114610aea575b5090610acc816104e6930382610c0d565b60405193849384526020840152606060408401526060830190610c43565b60075f9081527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688939250905b808210610b2e57509091508101602001610acc610abb565b919260018160209254838588010152019101909291610b16565b60ff191660208086019190915291151560051b84019091019150610acc9050610abb565b91607f1691610a9e565b5f92918154918260011c92600181168015610c03575b6020851081146101da57848452908115610be65750600114610bad57505050565b5f9081526020812093945091925b838310610bcc575060209250010190565b600181602092949394548385870101520191019190610bbb565b915050602093945060ff929192191683830152151560051b010190565b93607f1693610b8c565b90601f8019910116810190811067ffffffffffffffff821117610c2f57604052565b634e487b7160e01b5f52604160045260245ffd5b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036100b857565b602435906001600160a01b03821682036100b857565b81601f820112156100b85780359067ffffffffffffffff8211610c2f5760405192610cc8601f8401601f191660200185610c0d565b828452602083830101116100b857815f926020809301838601378301015290565b60606003198201126100b8576004356001600160a01b03811681036100b857916024356001600160a01b03811681036100b857916044359067ffffffffffffffff82116100b857610d3c91600401610c93565b90565b90600b821015610d4c5752565b634e487b7160e01b5f52602160045260245ffd5b9190820180921161050b57565b9091905f198214610de0576001600160a01b03831630148015610dd8575b610dd35760405163a9059cbb60e01b60208201526001600160a01b03939093166024840152604480840192909252908252610dd19190610dcc606483610c0d565b61125b565b565b505050565b508115610d8b565b630d550c3b60e11b5f5260045ffd5b9092915f198314610de0576001600160a01b039081169316918284148015610e4f575b610e4957610dd193604051936323b872dd60e01b602086015260248501526044840152606483015260648252610dcc608483610c0d565b50505050565b508015610e12565b82158015610fa5575b610dd357604051636eb1769f60e11b81523060048201526001600160a01b03838116602483018190529490831691602081604481865afa908115610551575f91610f71575b50610eed94610efb610eba6020945f94610d60565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529687906064820190565b03601f198101885287610c0d565b85519082865af1903d5f519083610f52575b50505015610f1a57505050565b610dcc610dd1936040519063095ea7b360e01b602083015260248201525f604482015260448152610f4c606482610c0d565b8261125b565b91925090610f6757503b15155b5f8080610f0d565b6001915014610f5f565b90506020813d602011610f9d575b81610f8c60209383610c0d565b810103126100b85751610eed610ea5565b3d9150610f7f565b506001600160a01b0382163014610e60565b908160209103126100b8575180151581036100b85790565b908160609103126100b8578051916040602083015192015190565b60809060018060a01b0381511683526020810151602084015260018060a01b03604082015116604084015260018060a01b03606082015116606084015201519060a0608082015261103f60a082018351610d3f565b60208201516001600160a01b031660c08201526040820151608060e08301526101009060609061107490610120850190610c43565b930151151591015290565b908060208354918281520160208260051b840101935f5260205f20925f905b8382106110ad57505050505090565b9091929394601f19828203018452606081528554606082015260018601546080820152600286015460a0820152600386015460ff81166004811015610d4c5760c08301526001600160a01b03600891821c811660e0840152600488015481166101008401526005880154811661012084015260068801541661014083015260078701546101608301528601546101808083019190915260098701546101a08301526101c0820152600190602090600d906111816111716101e08301600a8c01610b76565b82810385840152600b8b01610b76565b906040600c8b01549101529701940192019093929361109e565b610d3c9060018060a01b03600354168152600454602082015260a060408201526111db6111cc60a08301600561107f565b8281036060840152600661107f565b9060808183039101526007610b76565b6040519060a0820182811067ffffffffffffffff821117610c2f57604052815f81525f60208201525f60408201525f606082015260405190608082019082821067ffffffffffffffff831117610c2f576080916040525f83525f6020840152606060408401525f60608401520152565b905f602091828151910182855af115610551575f513d6112aa57506001600160a01b0381163b155b61128a5750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b6001141561128356fea26469706673582212201ee77fd202ede4dc014cdf8b197fb2ef16d65387626d9feaaf9b419b66e37d0764736f6c634300081b0033000000000000000000000000888888888889758f76e7103c6cbf23abbf58f946", - "nonce": "0x119", + "input": "0x60c0604052346100f757604051601f61132138819003918201601f19168301916001600160401b038311848410176100e3578084926020946040528339810103126100f757516001600160a01b038116908190036100f7573060805260405160a081016001600160401b038111828210176100e357655af3107a4000916080916040525f81525f1960208201525f6040820152610100606082015201525f6008555f196009555f600a55610100600b55655af3107a4000600c5560a05260405161122590816100fc82396080518161025d015260a0518181816089015261031d0152f35b634e487b7160e01b5f52604160045260245ffd5b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816309316dd314610b30575080633268263b14610ac45780634ebfc81414610a855780636563c0e9146109b95780639df303251461084e578063e0a80413146101f8578063f66a7749146100bc5763f887ea4014610074575f80fd5b346100b8575f3660031901126100b8576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b346100b8575f3660031901126100b8575f54604051905f6001548060011c91600182169182156101ee575b6020841083146101da5783865285929081156101bb575060011461015c575b61011292500383610cd2565b60ff60025416610150604051938361012e8660ff819716610e04565b60081c6001600160a01b03166020850152608060408501819052840190610d08565b90151560608301520390f35b5060015f90815290917fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b81831061019f57505090602061011292820101610106565b6020919350806001915483858901015201910190918492610187565b6020925061011294915060ff191682840152151560051b820101610106565b634e487b7160e01b5f52602260045260245ffd5b92607f16926100e7565b346100b85760803660031901126100b857610211610d2c565b610219610d42565b60443567ffffffffffffffff81116100b857610239903690600401610d58565b9160643567ffffffffffffffff81116100b85761025a903690600401610d58565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316301461083f5783516001600160a01b0393841694919093169260208083019291820191909103126100b85751916060828051810103126100b85760208201516001600160a01b03811691908290036100b857606060408401519301519460405195630b2339af60e21b8752606087600481875afa968715610508575f976107d2575b50604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316602482018190529590602081604481885afa80156105085788905f9061079c575b6103709250611041565b60405163095ea7b360e01b60208083019182526001600160a01b038a1660248401526044808401949094529282529091905f906103ae606485610cd2565b83519082895af15f513d82610780575b50501561073c575b506103d2818884611151565b90801561072857876103e79309151590611041565b956001600160a01b0316818103610513575050935f606094939261047e9661040d611062565b95818752602087015260408601526104906040519788968795869463640fc23d60e11b86523060048701526024860152604485015260085460648501526009546084850152600a5460a4850152600b5460c4850152600c5460e4850152610140610104850152610144840190610e40565b82810360031901610124840152610ff1565b03925af18015610508576104d3915f916104d7575b505b604051906020820152602081526104bf604082610cd2565b604051918291602083526020830190610d08565b0390f35b6104f9915060603d606011610501575b6104f18183610cd2565b810190610e25565b5050826104a5565b503d6104e7565b6040513d5f823e3d90fd5b9150949391604051630bc4ed8360e21b8152602081600481865afa908115610508575f916106ed575b50156106535750936020600494956040519586809263781c18db60e01b82525afa938415610508575f9461060b575b50905f61057f6105bc9660409695946110d2565b938551968795869485936323f8ef1160e11b855230600486015260018060a01b031660248501526044840152608060648401526084830190610e40565b03925af18015610508575f906105d7575b6104d391506104a7565b506040813d604011610603575b816105f160409383610cd2565b810103126100b8576104d390516105cd565b3d91506105e4565b90929193506020813d60201161064b575b8161062960209383610cd2565b810103126100b85751926001600160a01b03841684036100b85790915f61056b565b3d915061061c565b929190505f6106676060956106a0976110d2565b936106b160405197889687958694631652a23360e21b86523060048701526024860152604485015260a0606485015260a4840190610e40565b828103600319016084840152610ff1565b03925af18015610508576104d3915f916106cc575b506104a7565b6106e5915060603d606011610501576104f18183610cd2565b5050826106c6565b90506020813d602011610720575b8161070860209383610cd2565b810103126100b8575180151581036100b8578761053c565b3d91506106fb565b634e487b7160e01b5f52601260045260245ffd5b61077a9061077460405163095ea7b360e01b60208201528960248201525f60448201526044815261076e606482610cd2565b876110f9565b856110f9565b886103c6565b9091506107945750843b15155b8a806103be565b60011461078d565b50506020813d6020116107ca575b816107b760209383610cd2565b810103126100b857876103709151610366565b3d91506107aa565b9096506060813d606011610837575b816107ee60609383610cd2565b810103126100b85780516001600160a01b038116036100b8576020810151906001600160a01b03821682036100b857604001516001600160a01b038116036100b8579587610307565b3d91506107e1565b6302f3451d60e21b5f5260045ffd5b346100b85761085c36610dae565b80516001600160a01b039093169260208083019291820191909103126100b85751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa908115610508575f91610985575b50610903936109116108d06020945f94611041565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f198101875286610cd2565b84519082855af15f513d82610969575b50501561092a57005b610962610967936040519063095ea7b360e01b602083015260248201525f60448201526044815261095c606482610cd2565b826110f9565b6110f9565b005b90915061097d5750803b15155b8480610921565b600114610976565b90506020813d6020116109b1575b816109a060209383610cd2565b810103126100b857516109036108bb565b3d9150610993565b346100b85760803660031901126100b8576109d2610d2c565b6109da610d42565b6044356001600160a01b03811692908390036100b85760643567ffffffffffffffff81116100b857610a10903690600401610d58565b602081519181808201938492010103126100b857515f198114610a765761096793604051936323b872dd60e01b602086015260018060a01b031660248501526044840152606483015260648252610a68608483610cd2565b6001600160a01b03166110f9565b630d550c3b60e11b5f5260045ffd5b346100b8575f3660031901126100b85760a0600854600954600a54600b5490600c54926040519485526020850152604084015260608301526080820152f35b346100b857610ad236610dae565b602081939293519181808201938492010103126100b85751905f198214610a765760405163a9059cbb60e01b60208201526001600160a01b039390931660248401526044808401929092529082526109679190610a68606483610cd2565b346100b8575f3660031901126100b85760018060a01b0360035416600454915f6007548060011c90600181168015610c31575b6020831081146101da57828552908115610c0d5750600114610baf575b5090610b91816104d3930382610cd2565b60405193849384526020840152606060408401526060830190610d08565b60075f9081527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688939250905b808210610bf357509091508101602001610b91610b80565b919260018160209254838588010152019101909291610bdb565b60ff191660208086019190915291151560051b84019091019150610b919050610b80565b91607f1691610b63565b5f92918154918260011c92600181168015610cc8575b6020851081146101da57848452908115610cab5750600114610c7257505050565b5f9081526020812093945091925b838310610c91575060209250010190565b600181602092949394548385870101520191019190610c80565b915050602093945060ff929192191683830152151560051b010190565b93607f1693610c51565b90601f8019910116810190811067ffffffffffffffff821117610cf457604052565b634e487b7160e01b5f52604160045260245ffd5b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036100b857565b602435906001600160a01b03821682036100b857565b81601f820112156100b85780359067ffffffffffffffff8211610cf45760405192610d8d601f8401601f191660200185610cd2565b828452602083830101116100b857815f926020809301838601378301015290565b60606003198201126100b8576004356001600160a01b03811681036100b857916024356001600160a01b03811681036100b857916044359067ffffffffffffffff82116100b857610e0191600401610d58565b90565b90600b821015610e115752565b634e487b7160e01b5f52602160045260245ffd5b908160609103126100b8578051916040602083015192015190565b60809060018060a01b0381511683526020810151602084015260018060a01b03604082015116604084015260018060a01b03606082015116606084015201519060a06080820152610e9560a082018351610e04565b60208201516001600160a01b031660c08201526040820151608060e083015261010090606090610eca90610120850190610d08565b930151151591015290565b908060208354918281520160208260051b840101935f5260205f20925f905b838210610f0357505050505090565b9091929394601f19828203018452606081528554606082015260018601546080820152600286015460a0820152600386015460ff81166004811015610e115760c08301526001600160a01b03600891821c811660e0840152600488015481166101008401526005880154811661012084015260068801541661014083015260078701546101608301528601546101808083019190915260098701546101a08301526101c0820152600190602090600d90610fd7610fc76101e08301600a8c01610c3b565b82810385840152600b8b01610c3b565b906040600c8b015491015297019401920190939293610ef4565b610e019060018060a01b03600354168152600454602082015260a0604082015261103161102260a083016005610ed5565b82810360608401526006610ed5565b9060808183039101526007610c3b565b9190820180921161104e57565b634e487b7160e01b5f52601160045260245ffd5b6040519060a0820182811067ffffffffffffffff821117610cf457604052815f81525f60208201525f60408201525f606082015260405190608082019082821067ffffffffffffffff831117610cf4576080916040525f83525f6020840152606060408401525f60608401520152565b91906110dc611062565b6001600160a01b0390931680845260208401919091526040830152565b905f602091828151910182855af115610508575f513d61114857506001600160a01b0381163b155b6111285750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b60011415611121565b91818302915f19818509938380861095039480860395146111e157848311156111c95790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b50508092501561072857049056fea26469706673582212205bf94e5371bc2f132405be99261f2b9351cbdbf49e328ca512e068eee1eda9d164736f6c634300081d0033000000000000000000000000888888888889758f76e7103c6cbf23abbf58f946", + "nonce": "0x133", "chainId": "0xa4b1" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0x7954626b30f44904a2364a8a45c6059396adc8aae48e0648e2273ad345d4884d", + "hash": "0x50ad93617ae78c5088118139211ea9f5e6e8ac1c4fe5e302996707ba5b713519", "transactionType": "CREATE", - "contractName": "ERC4626VaultAdapter", - "contractAddress": "0x1084fcddee1526a2331095207bf7e35e716c01bd", + "contractName": "ERC4626VaultAdapterV2", + "contractAddress": "0x133bf41c23edfb2f0ef586b5b01063a17470e294", "function": null, "arguments": null, "transaction": { "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", - "gas": "0xbdf66", + "gas": "0xb69d7", "value": "0x0", - "input": "0x60808060405234601557610961908161001a8239f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b1461051c5780636563c0e91461049c5780639df30325146104605763e0a8041314610045575f80fd5b3461029d57608036600319011261029d5761005e610556565b61006661056c565b60443567ffffffffffffffff811161029d576100869036906004016105b8565b9160643567ffffffffffffffff811161029d576100a79036906004016105b8565b926020815191818082019384920101031261029d57516040516370a0823160e01b81523060048201529290916001600160a01b031690602084602481855afa9384156102a9575f9461042c575b5060018060a01b03169360608180518101031261029d57602081015190600282101561029d57606060408201519101518481029080820486149015171561025f57811561041857049080610328575060405163095ea7b360e01b81526001600160a01b038616600482015260248101849052946020866044815f875af19081156102a9575f966020926102fd575b50604460405180988193636e553f6560e01b83528860048401523060248401525af19485156102a9575f956102c9575b50848181106102b457505060206024915b6040516370a0823160e01b815230600482015292839182905afa9081156102a9575f91610273575b50826101f78383610664565b0361024157836040805160208101928352602081526102168282610582565b8151928391602083525180918160208501528484015e5f828201840152601f01601f19168101030190f35b820391821161025f57638e17b66b60e01b5f5260045260245260445ffd5b634e487b7160e01b5f52601160045260245ffd5b90506020813d6020116102a1575b8161028e60209383610582565b8101031261029d57515f6101eb565b5f80fd5b3d9150610281565b6040513d5f823e3d90fd5b63eb7f211d60e01b5f5260045260245260445ffd5b9094506020813d6020116102f5575b816102e560209383610582565b8101031261029d5751935f6101b2565b3d91506102d8565b61031c90833d8511610321575b6103148183610582565b8101906108bb565b610182565b503d61030a565b9094506001036104095760405163095ea7b360e01b81526001600160a01b0382166004820152602481018390526020816044815f865af180156102a9576103ec575b5060405193635d043b2960e11b85528260048601523060248601523060448601526020856064815f865af19485156102a9575f956103b8575b50848181106102b457505060206024916101c3565b9094506020813d6020116103e4575b816103d460209383610582565b8101031261029d5751935f6103a3565b3d91506103c7565b6104049060203d602011610321576103148183610582565b61036a565b634a7f394f60e01b5f5260045ffd5b634e487b7160e01b5f52601260045260245ffd5b9093506020813d602011610458575b8161044860209383610582565b8101031261029d5751925f6100f4565b3d915061043b565b3461029d5761046e3661060e565b91906020835193818082019586920101031261029d57915161049a9290916001600160a01b031661075b565b005b3461029d57608036600319011261029d576104b5610556565b6104bd61056c565b906044356001600160a01b038116810361029d5760643567ffffffffffffffff811161029d576104f19036906004016105b8565b926020845194818082019687920101031261029d57925161049a9390926001600160a01b03166106f3565b3461029d5761052a3661060e565b91906020835193818082019586920101031261029d57915161049a9290916001600160a01b0316610671565b600435906001600160a01b038216820361029d57565b602435906001600160a01b038216820361029d57565b90601f8019910116810190811067ffffffffffffffff8211176105a457604052565b634e487b7160e01b5f52604160045260245ffd5b81601f8201121561029d5780359067ffffffffffffffff82116105a457604051926105ed601f8401601f191660200185610582565b8284526020838301011161029d57815f926020809301838601378301015290565b606060031982011261029d576004356001600160a01b038116810361029d57916024356001600160a01b038116810361029d57916044359067ffffffffffffffff821161029d57610661916004016105b8565b90565b9190820180921161025f57565b9091905f1982146106e4576001600160a01b038316301480156106dc575b6106d75760405163a9059cbb60e01b60208201526001600160a01b039390931660248401526044808401929092529082526106d591906106d0606483610582565b6108d3565b565b505050565b50811561068f565b630d550c3b60e11b5f5260045ffd5b9092915f1983146106e4576001600160a01b039081169316918284148015610753575b61074d576106d593604051936323b872dd60e01b6020860152602485015260448401526064830152606482526106d0608483610582565b50505050565b508015610716565b821580156108a9575b6106d757604051636eb1769f60e11b81523060048201526001600160a01b03838116602483018190529490831691602081604481865afa9081156102a9575f91610875575b506107f1946107ff6107be6020945f94610664565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529687906064820190565b03601f198101885287610582565b85519082865af1903d5f519083610856575b5050501561081e57505050565b6106d06106d5936040519063095ea7b360e01b602083015260248201525f604482015260448152610850606482610582565b826108d3565b9192509061086b57503b15155b5f8080610811565b6001915014610863565b90506020813d6020116108a1575b8161089060209383610582565b8101031261029d57516107f16107a9565b3d9150610883565b506001600160a01b0382163014610764565b9081602091031261029d5751801515810361029d5790565b905f602091828151910182855af1156102a9575f513d61092257506001600160a01b0381163b155b6109025750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156108fb56fea2646970667358221220f873473c980ff986be5bdcc90d6237af100c3efe734f2a1fd6277d6017a3857f64736f6c634300081b0033", - "nonce": "0x11a", + "input": "0x60a0806040523460215730608052610900908161002682396080518160aa0152f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146106395780636563c0e91461056d5780639df303251461040d5763e0a8041314610045575f80fd5b346102a35760803660031901126102a35761005e6106a5565b6100666106bb565b9060443567ffffffffffffffff81116102a357610087903690600401610707565b60643567ffffffffffffffff81116102a3576100a7903690600401610707565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630146103fe5781516001600160a01b039182169490911691602080820192820191909103126102a35751926060838051810103126102a35760208301519260028410156102a357606060408201519101519061012f81878461082c565b9080156103ea578661014493091515906107b3565b92806103525750604051636eb1769f60e11b815230600482015260248101839052602081604481855afa9081156102af575f9161031a575b50846020939261018f5f976044946107b3565b60405163095ea7b360e01b8782019081526001600160a01b038716602483015260448083019390935291815290869089906101cb6064856106d1565b83519082865af188513d826102fb575b5050156102ba575b50506040519586938492636e553f6560e01b845260048401523060248401525af19182156102af575f92610277575b50818181106102625750505b60408051602081019283526020815261023782826106d1565b8151928391602083525180918160208501528484015e5f828201840152601f01601f19168101030190f35b63eb7f211d60e01b5f5260045260245260445ffd5b9091506020813d6020116102a7575b81610293602093836106d1565b810103126102a35751905f610212565b5f80fd5b3d9150610286565b6040513d5f823e3d90fd5b6102f4916102ef60405163095ea7b360e01b898201528760248201528a878201528681526102e96064826106d1565b826107d4565b6107d4565b5f806101e3565b9091501589146103125750813b15155b5f806101db565b60011461030b565b90506020929192813d60201161034a575b81610338602093836106d1565b810103126102a357519091908461017c565b3d915061032b565b909391506001036103db575f9260646020926040519586938492635d043b2960e11b845260048401523060248401523060448401525af19182156102af575f926103a7575b508181811061026257505061021e565b9091506020813d6020116103d3575b816103c3602093836106d1565b810103126102a35751905f610397565b3d91506103b6565b634a7f394f60e01b5f5260045ffd5b634e487b7160e01b5f52601260045260245ffd5b6302f3451d60e21b5f5260045ffd5b346102a35761041b3661075d565b80516001600160a01b039093169260208083019291820191909103126102a35751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa9081156102af575f91610539575b506104c2936104d061048f6020945f946107b3565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f1981018752866106d1565b84519082855af15f513d8261051d575b5050156104e957005b6102ef61051b936040519063095ea7b360e01b602083015260248201525f6044820152604481526102e96064826106d1565b005b9091506105315750803b15155b84806104e0565b60011461052a565b90506020813d602011610565575b81610554602093836106d1565b810103126102a357516104c261047a565b3d9150610547565b346102a35760803660031901126102a3576105866106a5565b61058e6106bb565b6044356001600160a01b03811692908390036102a35760643567ffffffffffffffff81116102a3576105c4903690600401610707565b602081519181808201938492010103126102a357515f19811461062a5761051b93604051936323b872dd60e01b602086015260018060a01b03166024850152604484015260648301526064825261061c6084836106d1565b6001600160a01b03166107d4565b630d550c3b60e11b5f5260045ffd5b346102a3576106473661075d565b602081939293519181808201938492010103126102a35751905f19821461062a5760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261051b919061061c6064836106d1565b600435906001600160a01b03821682036102a357565b602435906001600160a01b03821682036102a357565b90601f8019910116810190811067ffffffffffffffff8211176106f357604052565b634e487b7160e01b5f52604160045260245ffd5b81601f820112156102a35780359067ffffffffffffffff82116106f3576040519261073c601f8401601f1916602001856106d1565b828452602083830101116102a357815f926020809301838601378301015290565b60606003198201126102a3576004356001600160a01b03811681036102a357916024356001600160a01b03811681036102a357916044359067ffffffffffffffff82116102a3576107b091600401610707565b90565b919082018092116107c057565b634e487b7160e01b5f52601160045260245ffd5b905f602091828151910182855af1156102af575f513d61082357506001600160a01b0381163b155b6108035750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156107fc565b91818302915f19818509938380861095039480860395146108bc57848311156108a45790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b5050809250156103ea57049056fea26469706673582212208494a0174c4f07fd048515a6e3e22a540bf8edf31a0e807f0e3019b7d5b7c74464736f6c634300081d0033", + "nonce": "0x134", "chainId": "0xa4b1" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0xafaf74b2e749ca0e5b571953f380fd40933ea43c017b64f88c207c2568b30c42", + "hash": "0x94ffcc659f0febbae7c4e1083f9e33cfc035fa6c6cbee932cf7ae5661bd95684", "transactionType": "CALL", - "contractName": null, + "contractName": "ERC1967Proxy", "contractAddress": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", - "function": "setAdapterWhitelist(address,address,bool)", - "arguments": [ - "0x7fa333b184868d88aC78a82eC06d5e87d4B0322E", - "0x25e4889346F04B4E005FFab35Bf2C3CB395E74d5", - "true" - ], + "function": null, + "arguments": null, "transaction": { "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", - "gas": "0x15ac9", + "gas": "0x159e8", "value": "0x0", - "input": "0xb6b07b8e0000000000000000000000007fa333b184868d88ac78a82ec06d5e87d4b0322e00000000000000000000000025e4889346f04b4e005ffab35bf2c3cb395e74d50000000000000000000000000000000000000000000000000000000000000001", - "nonce": "0x11b", + "input": "0xb6b07b8e0000000000000000000000007fa333b184868d88ac78a82ec06d5e87d4b0322e000000000000000000000000048a54deae47c41f760c42622b114bb89b836a9f0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x135", "chainId": "0xa4b1" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0x23bbfc3740ffc675ccda95c09e0ebf7e2443089b2455de950b0e436d244478b6", + "hash": "0xc93f5bd547e801e17220d4421ac0491a351e6432f6ab3165d10f1d9a1310ad1f", "transactionType": "CALL", - "contractName": null, + "contractName": "ERC1967Proxy", "contractAddress": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", - "function": "setAdapterWhitelist(address,address,bool)", - "arguments": [ - "0x7fa333b184868d88aC78a82eC06d5e87d4B0322E", - "0x003E6F7f6071a4E33F9324C125dEaE2615998010", - "true" - ], + "function": null, + "arguments": null, "transaction": { "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", - "gas": "0x15ac9", + "gas": "0x159e8", "value": "0x0", - "input": "0xb6b07b8e0000000000000000000000007fa333b184868d88ac78a82ec06d5e87d4b0322e000000000000000000000000003e6f7f6071a4e33f9324c125deae26159980100000000000000000000000000000000000000000000000000000000000000001", - "nonce": "0x11c", + "input": "0xb6b07b8e0000000000000000000000007fa333b184868d88ac78a82ec06d5e87d4b0322e000000000000000000000000b986312024c8e0f895b00eba32c81b5759c91fff0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x136", "chainId": "0xa4b1" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0xae334ad4c19f4eb1caa7dbdf334bbf822b65b2cdb57f796303524d2bd3ae6940", + "hash": "0x19c043e76febde999a5b532fffe0b2eb7706790b2ba4ff5a0402e84df4b4e71c", "transactionType": "CALL", - "contractName": null, + "contractName": "ERC1967Proxy", "contractAddress": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", - "function": "setAdapterWhitelist(address,address,bool)", - "arguments": [ - "0x7fa333b184868d88aC78a82eC06d5e87d4B0322E", - "0xDf69dDA7ba69ddEEB4182b821eb2356744180405", - "true" - ], + "function": null, + "arguments": null, "transaction": { "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", - "gas": "0x15ad8", + "gas": "0x159e8", "value": "0x0", - "input": "0xb6b07b8e0000000000000000000000007fa333b184868d88ac78a82ec06d5e87d4b0322e000000000000000000000000df69dda7ba69ddeeb4182b821eb23567441804050000000000000000000000000000000000000000000000000000000000000001", - "nonce": "0x11d", + "input": "0xb6b07b8e0000000000000000000000007fa333b184868d88ac78a82ec06d5e87d4b0322e000000000000000000000000f95130ddfa9eb132a25b121a29991cea989ebb7c0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x137", "chainId": "0xa4b1" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0x82070274c1fa6384c4f0fc5cb582bfbd674a2e341ffeb0af29715da474b5c721", + "hash": "0x5862d2f315f787edbcc2848c0ab189ded71a509e0fa0853ceeee3f925fb04c42", "transactionType": "CALL", - "contractName": null, + "contractName": "ERC1967Proxy", "contractAddress": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", - "function": "setAdapterWhitelist(address,address,bool)", - "arguments": [ - "0x7fa333b184868d88aC78a82eC06d5e87d4B0322E", - "0x1084fCdDee1526a2331095207bf7e35e716c01bd", - "true" - ], + "function": null, + "arguments": null, "transaction": { "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", - "gas": "0x15ad8", + "gas": "0x159e8", "value": "0x0", - "input": "0xb6b07b8e0000000000000000000000007fa333b184868d88ac78a82ec06d5e87d4b0322e0000000000000000000000001084fcddee1526a2331095207bf7e35e716c01bd0000000000000000000000000000000000000000000000000000000000000001", - "nonce": "0x11e", + "input": "0xb6b07b8e0000000000000000000000007fa333b184868d88ac78a82ec06d5e87d4b0322e000000000000000000000000133bf41c23edfb2f0ef586b5b01063a17470e2940000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x138", "chainId": "0xa4b1" }, "additionalContracts": [], @@ -174,192 +158,192 @@ "receipts": [ { "status": "0x1", - "cumulativeGasUsed": "0x98b21", + "cumulativeGasUsed": "0xa709b", "logs": [], "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "transactionHash": "0x4df862fd2444842c869f2d44d11555de94e8cebea16cda7ef15c14cc27039563", - "transactionIndex": "0x2", - "blockHash": "0x47597d6970b43c3847e851e75206095d72367dfd22718f1c87d6c60d8ad5b29a", - "blockNumber": "0x14d57677", - "gasUsed": "0x93433", + "transactionHash": "0x44d6344afc28390b198396e90f16dafceabab7e2c409672a4fac2e04447809f6", + "transactionIndex": "0x4", + "blockHash": "0x3d1f80154ea5340b93a48da4f578b0ea0c413a12c2bd7525f6d5b0820f68a456", + "blockNumber": "0x15059d02", + "gasUsed": "0x93e45", "effectiveGasPrice": "0x989680", "blobGasUsed": "0x0", "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": null, - "contractAddress": "0x25e4889346f04b4e005ffab35bf2c3cb395e74d5", - "gasUsedForL1": "0x4a5f", - "l1BlockNumber": "0x15b230c" + "contractAddress": "0x048a54deae47c41f760c42622b114bb89b836a9f", + "gasUsedForL1": "0x44f7", + "l1BlockNumber": "0x15c2299" }, { "status": "0x1", - "cumulativeGasUsed": "0xbb251", + "cumulativeGasUsed": "0xcf106", "logs": [], "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "transactionHash": "0xf2ef3b49657979ab628163410dddfcef7ffa4b6c2983671005e9d40e48243dd9", - "transactionIndex": "0x2", - "blockHash": "0x003ce234b469546396c990a9ded9f5575e1c0bde2cd6165a8d18f4cf2b7e056c", - "blockNumber": "0x14d5767f", - "gasUsed": "0xa50b2", + "transactionHash": "0x119e5c0964ab69c002349edb04debe3dcc2f671fbb1afac6fede6aede244c454", + "transactionIndex": "0x6", + "blockHash": "0x517c068ee2540ba8ebd2de1f7778337506c1191864511e2c91645f623f9a8adc", + "blockNumber": "0x15059d2b", + "gasUsed": "0x9fcf7", "effectiveGasPrice": "0x989680", "blobGasUsed": "0x0", "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": null, - "contractAddress": "0x003e6f7f6071a4e33f9324c125deae2615998010", - "gasUsedForL1": "0x52df", - "l1BlockNumber": "0x15b230c" + "contractAddress": "0xb986312024c8e0f895b00eba32c81b5759c91fff", + "gasUsedForL1": "0x4963", + "l1BlockNumber": "0x15c2299" }, { "status": "0x1", - "cumulativeGasUsed": "0x176e7e", + "cumulativeGasUsed": "0x1214fc", "logs": [], "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "transactionHash": "0x6a0adee2b9b03931714160c9cb43a3a61bb55a257fa170fc20528d253cca9dbf", - "transactionIndex": "0x4", - "blockHash": "0x79887d947b102d21f4b79e1966d3031ce5baa2e7c27e9ea53c013e090e537c9a", - "blockNumber": "0x14d57688", - "gasUsed": "0x12717b", + "transactionHash": "0xb698009eba2aad0c2392f30168fe4094ef1d28a37a735d81a715c446d92b75d0", + "transactionIndex": "0x2", + "blockHash": "0xe62cf643bd339557317ca215fd06cdd1f32036f1a182183a6175682c916c882c", + "blockNumber": "0x15059d30", + "gasUsed": "0x11be43", "effectiveGasPrice": "0x989680", "blobGasUsed": "0x0", "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": null, - "contractAddress": "0xdf69dda7ba69ddeeb4182b821eb2356744180405", - "gasUsedForL1": "0x886f", - "l1BlockNumber": "0x15b230c" + "contractAddress": "0xf95130ddfa9eb132a25b121a29991cea989ebb7c", + "gasUsedForL1": "0x7b4f", + "l1BlockNumber": "0x15c2299" }, { "status": "0x1", - "cumulativeGasUsed": "0xa657c", + "cumulativeGasUsed": "0x13ba1b", "logs": [], "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "transactionHash": "0x7954626b30f44904a2364a8a45c6059396adc8aae48e0648e2273ad345d4884d", - "transactionIndex": "0x4", - "blockHash": "0xf252c397a91923333adac5ab8ab5f066b4ff1ae3e0913547fc7d290754a4f570", - "blockNumber": "0x14d576ae", - "gasUsed": "0x901e4", + "transactionHash": "0x50ad93617ae78c5088118139211ea9f5e6e8ac1c4fe5e302996707ba5b713519", + "transactionIndex": "0x6", + "blockHash": "0xa5da3545c009341f01470d615eaa05a48356edfc32f775d90900171b73539443", + "blockNumber": "0x15059d34", + "gasUsed": "0x8a8e7", "effectiveGasPrice": "0x989680", "blobGasUsed": "0x0", "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": null, - "contractAddress": "0x1084fcddee1526a2331095207bf7e35e716c01bd", - "gasUsedForL1": "0x4543", - "l1BlockNumber": "0x15b230c" + "contractAddress": "0x133bf41c23edfb2f0ef586b5b01063a17470e294", + "gasUsedForL1": "0x3eea", + "l1BlockNumber": "0x15c2299" }, { "status": "0x1", - "cumulativeGasUsed": "0x43e7c", + "cumulativeGasUsed": "0x23bc5a", "logs": [ { "address": "0x7fa333b184868d88ac78a82ec06d5e87d4b0322e", "topics": [ "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" ], - "data": "0x00000000000000000000000025e4889346f04b4e005ffab35bf2c3cb395e74d50000000000000000000000000000000000000000000000000000000000000001", - "blockHash": "0x980d7fc755bf816082e5dd7aa5cc883e7f5f84ed95822d9997d86c5a9f8a018a", - "blockNumber": "0x14d576b5", - "transactionHash": "0xafaf74b2e749ca0e5b571953f380fd40933ea43c017b64f88c207c2568b30c42", - "transactionIndex": "0x5", - "logIndex": "0x3", + "data": "0x000000000000000000000000048a54deae47c41f760c42622b114bb89b836a9f0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xa0826f26a0f69a6276f476b313416252af434368b4f5f28b1c692da29f3c69b9", + "blockNumber": "0x15059d39", + "transactionHash": "0x94ffcc659f0febbae7c4e1083f9e33cfc035fa6c6cbee932cf7ae5661bd95684", + "transactionIndex": "0x7", + "logIndex": "0x35", "removed": false } ], "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "transactionHash": "0xafaf74b2e749ca0e5b571953f380fd40933ea43c017b64f88c207c2568b30c42", - "transactionIndex": "0x5", - "blockHash": "0x980d7fc755bf816082e5dd7aa5cc883e7f5f84ed95822d9997d86c5a9f8a018a", - "blockNumber": "0x14d576b5", - "gasUsed": "0x101d5", + "transactionHash": "0x94ffcc659f0febbae7c4e1083f9e33cfc035fa6c6cbee932cf7ae5661bd95684", + "transactionIndex": "0x7", + "blockHash": "0xa0826f26a0f69a6276f476b313416252af434368b4f5f28b1c692da29f3c69b9", + "blockNumber": "0x15059d39", + "gasUsed": "0x10155", "effectiveGasPrice": "0x989680", "blobGasUsed": "0x0", "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", "contractAddress": null, - "gasUsedForL1": "0x900", - "l1BlockNumber": "0x15b230d" + "gasUsedForL1": "0x856", + "l1BlockNumber": "0x15c229a" }, { "status": "0x1", - "cumulativeGasUsed": "0x4a6ac0", + "cumulativeGasUsed": "0x2e72e", "logs": [ { "address": "0x7fa333b184868d88ac78a82ec06d5e87d4b0322e", "topics": [ "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" ], - "data": "0x000000000000000000000000003e6f7f6071a4e33f9324c125deae26159980100000000000000000000000000000000000000000000000000000000000000001", - "blockHash": "0xd625cc450c95aaef0fc260034a2b8e2d756067a33f65aa78f1e0e89e2a4b91e9", - "blockNumber": "0x14d576bc", - "transactionHash": "0x23bbfc3740ffc675ccda95c09e0ebf7e2443089b2455de950b0e436d244478b6", - "transactionIndex": "0xb", - "logIndex": "0x10", + "data": "0x000000000000000000000000b986312024c8e0f895b00eba32c81b5759c91fff0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x07dae7d94ae47c872a0acdbe3a0370e458422898c7efefcc6cf71bb12562aaf3", + "blockNumber": "0x15059d45", + "transactionHash": "0xc93f5bd547e801e17220d4421ac0491a351e6432f6ab3165d10f1d9a1310ad1f", + "transactionIndex": "0x2", + "logIndex": "0x2", "removed": false } ], "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "transactionHash": "0x23bbfc3740ffc675ccda95c09e0ebf7e2443089b2455de950b0e436d244478b6", - "transactionIndex": "0xb", - "blockHash": "0xd625cc450c95aaef0fc260034a2b8e2d756067a33f65aa78f1e0e89e2a4b91e9", - "blockNumber": "0x14d576bc", - "gasUsed": "0x101d5", + "transactionHash": "0xc93f5bd547e801e17220d4421ac0491a351e6432f6ab3165d10f1d9a1310ad1f", + "transactionIndex": "0x2", + "blockHash": "0x07dae7d94ae47c872a0acdbe3a0370e458422898c7efefcc6cf71bb12562aaf3", + "blockNumber": "0x15059d45", + "gasUsed": "0x10155", "effectiveGasPrice": "0x989680", "blobGasUsed": "0x0", "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", "contractAddress": null, - "gasUsedForL1": "0x900", - "l1BlockNumber": "0x15b230d" + "gasUsedForL1": "0x856", + "l1BlockNumber": "0x15c229a" }, { "status": "0x1", - "cumulativeGasUsed": "0x59226", + "cumulativeGasUsed": "0x7a1d5", "logs": [ { "address": "0x7fa333b184868d88ac78a82ec06d5e87d4b0322e", "topics": [ "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" ], - "data": "0x000000000000000000000000df69dda7ba69ddeeb4182b821eb23567441804050000000000000000000000000000000000000000000000000000000000000001", - "blockHash": "0xe8dd43f2a0b6cd615a0189ba6d81c8d8f66dccdacf7899d28e239b706f401570", - "blockNumber": "0x14d576c4", - "transactionHash": "0xae334ad4c19f4eb1caa7dbdf334bbf822b65b2cdb57f796303524d2bd3ae6940", + "data": "0x000000000000000000000000f95130ddfa9eb132a25b121a29991cea989ebb7c0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xf8e4ea19c7d396382d12ef127c21c05d2d0e2ec9a6a4a5a344b1007d40ac29d1", + "blockNumber": "0x15059d4a", + "transactionHash": "0x19c043e76febde999a5b532fffe0b2eb7706790b2ba4ff5a0402e84df4b4e71c", "transactionIndex": "0x4", - "logIndex": "0x9", + "logIndex": "0xd", "removed": false } ], "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "transactionHash": "0xae334ad4c19f4eb1caa7dbdf334bbf822b65b2cdb57f796303524d2bd3ae6940", + "transactionHash": "0x19c043e76febde999a5b532fffe0b2eb7706790b2ba4ff5a0402e84df4b4e71c", "transactionIndex": "0x4", - "blockHash": "0xe8dd43f2a0b6cd615a0189ba6d81c8d8f66dccdacf7899d28e239b706f401570", - "blockNumber": "0x14d576c4", - "gasUsed": "0x101e1", + "blockHash": "0xf8e4ea19c7d396382d12ef127c21c05d2d0e2ec9a6a4a5a344b1007d40ac29d1", + "blockNumber": "0x15059d4a", + "gasUsed": "0x10155", "effectiveGasPrice": "0x989680", "blobGasUsed": "0x0", "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", "contractAddress": null, - "gasUsedForL1": "0x900", - "l1BlockNumber": "0x15b230d" + "gasUsedForL1": "0x856", + "l1BlockNumber": "0x15c229a" }, { "status": "0x1", - "cumulativeGasUsed": "0x101e1", + "cumulativeGasUsed": "0x10155", "logs": [ { "address": "0x7fa333b184868d88ac78a82ec06d5e87d4b0322e", "topics": [ "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" ], - "data": "0x0000000000000000000000001084fcddee1526a2331095207bf7e35e716c01bd0000000000000000000000000000000000000000000000000000000000000001", - "blockHash": "0x85e0d67d494bd1e4a4cb5b6013b61f4d159bda180cb70c73f5f9aa5b065d8d2c", - "blockNumber": "0x14d576cc", - "transactionHash": "0x82070274c1fa6384c4f0fc5cb582bfbd674a2e341ffeb0af29715da474b5c721", + "data": "0x000000000000000000000000133bf41c23edfb2f0ef586b5b01063a17470e2940000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x376034b48ff05b4990ec3f7eb2ab24905e092d52c2e99e196a3c43ea610b1a56", + "blockNumber": "0x15059d4f", + "transactionHash": "0x5862d2f315f787edbcc2848c0ab189ded71a509e0fa0853ceeee3f925fb04c42", "transactionIndex": "0x1", "logIndex": "0x0", "removed": false @@ -367,24 +351,24 @@ ], "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "transactionHash": "0x82070274c1fa6384c4f0fc5cb582bfbd674a2e341ffeb0af29715da474b5c721", + "transactionHash": "0x5862d2f315f787edbcc2848c0ab189ded71a509e0fa0853ceeee3f925fb04c42", "transactionIndex": "0x1", - "blockHash": "0x85e0d67d494bd1e4a4cb5b6013b61f4d159bda180cb70c73f5f9aa5b065d8d2c", - "blockNumber": "0x14d576cc", - "gasUsed": "0x101e1", + "blockHash": "0x376034b48ff05b4990ec3f7eb2ab24905e092d52c2e99e196a3c43ea610b1a56", + "blockNumber": "0x15059d4f", + "gasUsed": "0x10155", "effectiveGasPrice": "0x989680", "blobGasUsed": "0x0", "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": "0xfad175caf9b0ac0ebca3b1816ec799884eb04b9c", "contractAddress": null, - "gasUsedForL1": "0x900", - "l1BlockNumber": "0x15b230d" + "gasUsedForL1": "0x856", + "l1BlockNumber": "0x15c229a" } ], "libraries": [], "pending": [], "returns": {}, - "timestamp": 1750474250, + "timestamp": 1751264345, "chain": 42161, - "commit": "53496c4" + "commit": "01db0f8" } \ No newline at end of file diff --git a/broadcast/DeployAdapters.s.sol/56/run-1751264857.json b/broadcast/DeployAdapters.s.sol/56/run-1751264857.json new file mode 100644 index 0000000..16df07d --- /dev/null +++ b/broadcast/DeployAdapters.s.sol/56/run-1751264857.json @@ -0,0 +1,350 @@ +{ + "transactions": [ + { + "hash": "0x5a8363cd7ce4fe7b65f82b1ea3faf2d6f44fed481f7c30aab763fdae5feebbb9", + "transactionType": "CREATE", + "contractName": "UniswapV3AdapterV2", + "contractAddress": "0xc82473b4b712440e3fc311d8439f65aa38556c38", + "function": null, + "arguments": [ + "0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2" + ], + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "gas": "0xbaa7f", + "value": "0x0", + "input": "0x60c034607a57601f610a3738819003918201601f19168301916001600160401b03831184841017607e57808492602094604052833981010312607a57516001600160a01b03811690819003607a573060805260a0526040516109a4908161009382396080518160fd015260a051818181606501526101610152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146106c15780636563c0e9146105f55780639df3032514610495578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b161072d565b6100b9610743565b5060443567ffffffffffffffff8111610094576100da903690600401610797565b60643567ffffffffffffffff8111610094576100fa903690600401610797565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630146104865781516001600160a01b039190911691602080820192820191909103126100945751604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316602482018190529193919290602081604481855afa80156103bd5785905f90610450575b6101b79250610857565b60405163095ea7b360e01b60208083019182526001600160a01b03871660248401526044808401949094529282529091905f906101f5606485610759565b83519082865af15f513d82610434575b5050156103f0575b505080518101916080826020850194031261009457602082015167ffffffffffffffff811161009457820183603f82011215610094576020810151906102528261077b565b946102606040519687610759565b8286526040828401011161009457815f926040602093018388015e85010152604082015191608060608201519101519061029b8187846108d0565b9080156103dc57866102b09309151590610857565b9260405160a081019080821067ffffffffffffffff8311176103c857602095610322935f936040528252868201903082526040830196875260608301988952608083019081526040519889978896879563c04b8d5960e01b87528b60048801525160a0602488015260c4870190610833565b93516001600160a01b031660448601525160648501525160848401525160a483015203925af180156103bd575f90610389575b6103859060405190602082015260208152610371604082610759565b604051918291602083526020830190610833565b0390f35b506020813d6020116103b5575b816103a360209383610759565b81010312610094576103859051610355565b3d9150610396565b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b61042d9161042860405163095ea7b360e01b60208201528660248201525f604482015260448152610422606482610759565b82610878565b610878565b838061020d565b9091506104485750813b15155b8680610205565b600114610441565b50506020813d60201161047e575b8161046b60209383610759565b8101031261009457846101b791516101ad565b3d915061045e565b6302f3451d60e21b5f5260045ffd5b34610094576104a3366107dd565b80516001600160a01b039093169260208083019291820191909103126100945751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa9081156103bd575f916105c1575b5061054a936105586105176020945f94610857565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f198101875286610759565b84519082855af15f513d826105a5575b50501561057157005b6104286105a3936040519063095ea7b360e01b602083015260248201525f604482015260448152610422606482610759565b005b9091506105b95750803b15155b8480610568565b6001146105b2565b90506020813d6020116105ed575b816105dc60209383610759565b81010312610094575161054a610502565b3d91506105cf565b346100945760803660031901126100945761060e61072d565b610616610743565b6044356001600160a01b03811692908390036100945760643567ffffffffffffffff81116100945761064c903690600401610797565b6020815191818082019384920101031261009457515f1981146106b2576105a393604051936323b872dd60e01b602086015260018060a01b0316602485015260448401526064830152606482526106a4608483610759565b6001600160a01b0316610878565b630d550c3b60e11b5f5260045ffd5b34610094576106cf366107dd565b602081939293519181808201938492010103126100945751905f1982146106b25760405163a9059cbb60e01b60208201526001600160a01b039390931660248401526044808401929092529082526105a391906106a4606483610759565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff8211176103c857604052565b67ffffffffffffffff81116103c857601f01601f191660200190565b81601f82011215610094578035906107ae8261077b565b926107bc6040519485610759565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff82116100945761083091600401610797565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9190820180921161086457565b634e487b7160e01b5f52601160045260245ffd5b905f602091828151910182855af1156103bd575f513d6108c757506001600160a01b0381163b155b6108a75750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156108a0565b91818302915f198185099383808610950394808603951461096057848311156109485790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b5050809250156103dc57049056fea2646970667358221220c66a6ef0f7fbba462fbafbd2ef2a7ef760baae0e9780be52e06dc1d37795583464736f6c634300081d0033000000000000000000000000b971ef87ede563556b2ed4b1c0b0019111dd85d2", + "nonce": "0x91", + "chainId": "0x38" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xa85ce580b099d8dc8e505fea81d56fb795f70a6719dd24aceea8424d3e1cf59f", + "transactionType": "CREATE", + "contractName": "OdosV2AdapterV2", + "contractAddress": "0x5bbc23e84c248b0563fcfd25b100891625de90cd", + "function": null, + "arguments": [ + "0x89b8AA89FDd0507a99d334CBe3C808fAFC7d850E" + ], + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "gas": "0xc9ca6", + "value": "0x0", + "input": "0x60c034607a57601f610b1438819003918201601f19168301916001600160401b03831184841017607e57808492602094604052833981010312607a57516001600160a01b03811690819003607a573060805260a052604051610a81908161009382396080518160fd015260a051818181606501526101610152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146107565780636563c0e91461068a5780639df303251461052a578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b16107c2565b6100b96107d8565b5060443567ffffffffffffffff8111610094576100da90369060040161082c565b60643567ffffffffffffffff8111610094576100fa90369060040161082c565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316301461051b5781516001600160a01b039190911691602080820192820191909103126100945751604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031660248201819052919290602081604481855afa80156104665784905f906104e5575b6101b59250610900565b60405163095ea7b360e01b60208083019182526001600160a01b03861660248401526044808401949094529282529091905f906101f36064856107ee565b83519082865af15f513d826104c9575b505015610485575b505082518301908360208301920361014081126100945760e013610094576040519160e0830183811067ffffffffffffffff82111761047157604052610253602086016108ec565b83526040850151906020840191825261026e606087016108ec565b9360408101948552610282608088016108ec565b966060820197885260a0810151926080830193845260c08201519760a084019889526102b060e084016108ec565b9160c0850192835261010084015167ffffffffffffffff811161009457840181603f82011215610094576020810151906102e982610810565b926102f760405194856107ee565b8284526040828401011161009457815f926040602093018386015e830101526101208401516001600160a01b03811694908590036100945761014001519263ffffffff84168094036100945760209a876103e09461035a5f9a51828d5191610921565b825261036a8351828d5191610921565b83528a52308352604051630ed8d73960e21b815297516001600160a01b0390811660048a0152995160248901529a51891660448801529b518816606487015298516084860152995160a4850152965190941660c483015261014060e48301529096879586948593929091906101448501906108c8565b9161010484015261012483015203925af18015610466575f90610432575b61042e906040519060208201526020815261041a6040826107ee565b6040519182916020835260208301906108c8565b0390f35b506020813d60201161045e575b8161044c602093836107ee565b810103126100945761042e90516103fe565b3d915061043f565b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b6104c2916104bd60405163095ea7b360e01b60208201528560248201525f6044820152604481526104b76064826107ee565b82610955565b610955565b838061020b565b9091506104dd5750813b15155b8680610203565b6001146104d6565b50506020813d602011610513575b81610500602093836107ee565b8101031261009457836101b591516101ab565b3d91506104f3565b6302f3451d60e21b5f5260045ffd5b346100945761053836610872565b80516001600160a01b039093169260208083019291820191909103126100945751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa908115610466575f91610656575b506105df936105ed6105ac6020945f94610900565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f1981018752866107ee565b84519082855af15f513d8261063a575b50501561060657005b6104bd610638936040519063095ea7b360e01b602083015260248201525f6044820152604481526104b76064826107ee565b005b90915061064e5750803b15155b84806105fd565b600114610647565b90506020813d602011610682575b81610671602093836107ee565b8101031261009457516105df610597565b3d9150610664565b34610094576080366003190112610094576106a36107c2565b6106ab6107d8565b6044356001600160a01b03811692908390036100945760643567ffffffffffffffff8111610094576106e190369060040161082c565b6020815191818082019384920101031261009457515f1981146107475761063893604051936323b872dd60e01b602086015260018060a01b0316602485015260448401526064830152606482526107396084836107ee565b6001600160a01b0316610955565b630d550c3b60e11b5f5260045ffd5b346100945761076436610872565b602081939293519181808201938492010103126100945751905f1982146107475760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261063891906107396064836107ee565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff82111761047157604052565b67ffffffffffffffff811161047157601f01601f191660200190565b81601f820112156100945780359061084382610810565b9261085160405194856107ee565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff8211610094576108c59160040161082c565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b51906001600160a01b038216820361009457565b9190820180921161090d57565b634e487b7160e01b5f52601160045260245ffd5b9161092d8183856109ad565b918115610941576108c59309151590610900565b634e487b7160e01b5f52601260045260245ffd5b905f602091828151910182855af115610466575f513d6109a457506001600160a01b0381163b155b6109845750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b6001141561097d565b91818302915f1981850993838086109503948086039514610a3d5784831115610a255790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b50508092501561094157049056fea2646970667358221220191f3a0969690b852c0fad405075e504d7c37835c39e58743a8dc57c2ad534da64736f6c634300081d003300000000000000000000000089b8aa89fdd0507a99d334cbe3c808fafc7d850e", + "nonce": "0x92", + "chainId": "0x38" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xb2df9e463fe051f79052b99af12b7beff77f8f59e5b76286ea830c67b696bd82", + "transactionType": "CREATE", + "contractName": "PendleSwapV3AdapterV2", + "contractAddress": "0x05d171617fe60ba27992f238686d3eb3b3cadca0", + "function": null, + "arguments": [ + "0x888888888889758F76e7103c6CbF23ABbF58F946" + ], + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "gas": "0x1670a3", + "value": "0x0", + "input": "0x60c0604052346100f757604051601f61132138819003918201601f19168301916001600160401b038311848410176100e3578084926020946040528339810103126100f757516001600160a01b038116908190036100f7573060805260405160a081016001600160401b038111828210176100e357655af3107a4000916080916040525f81525f1960208201525f6040820152610100606082015201525f6008555f196009555f600a55610100600b55655af3107a4000600c5560a05260405161122590816100fc82396080518161025d015260a0518181816089015261031d0152f35b634e487b7160e01b5f52604160045260245ffd5b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816309316dd314610b30575080633268263b14610ac45780634ebfc81414610a855780636563c0e9146109b95780639df303251461084e578063e0a80413146101f8578063f66a7749146100bc5763f887ea4014610074575f80fd5b346100b8575f3660031901126100b8576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b346100b8575f3660031901126100b8575f54604051905f6001548060011c91600182169182156101ee575b6020841083146101da5783865285929081156101bb575060011461015c575b61011292500383610cd2565b60ff60025416610150604051938361012e8660ff819716610e04565b60081c6001600160a01b03166020850152608060408501819052840190610d08565b90151560608301520390f35b5060015f90815290917fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b81831061019f57505090602061011292820101610106565b6020919350806001915483858901015201910190918492610187565b6020925061011294915060ff191682840152151560051b820101610106565b634e487b7160e01b5f52602260045260245ffd5b92607f16926100e7565b346100b85760803660031901126100b857610211610d2c565b610219610d42565b60443567ffffffffffffffff81116100b857610239903690600401610d58565b9160643567ffffffffffffffff81116100b85761025a903690600401610d58565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316301461083f5783516001600160a01b0393841694919093169260208083019291820191909103126100b85751916060828051810103126100b85760208201516001600160a01b03811691908290036100b857606060408401519301519460405195630b2339af60e21b8752606087600481875afa968715610508575f976107d2575b50604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316602482018190529590602081604481885afa80156105085788905f9061079c575b6103709250611041565b60405163095ea7b360e01b60208083019182526001600160a01b038a1660248401526044808401949094529282529091905f906103ae606485610cd2565b83519082895af15f513d82610780575b50501561073c575b506103d2818884611151565b90801561072857876103e79309151590611041565b956001600160a01b0316818103610513575050935f606094939261047e9661040d611062565b95818752602087015260408601526104906040519788968795869463640fc23d60e11b86523060048701526024860152604485015260085460648501526009546084850152600a5460a4850152600b5460c4850152600c5460e4850152610140610104850152610144840190610e40565b82810360031901610124840152610ff1565b03925af18015610508576104d3915f916104d7575b505b604051906020820152602081526104bf604082610cd2565b604051918291602083526020830190610d08565b0390f35b6104f9915060603d606011610501575b6104f18183610cd2565b810190610e25565b5050826104a5565b503d6104e7565b6040513d5f823e3d90fd5b9150949391604051630bc4ed8360e21b8152602081600481865afa908115610508575f916106ed575b50156106535750936020600494956040519586809263781c18db60e01b82525afa938415610508575f9461060b575b50905f61057f6105bc9660409695946110d2565b938551968795869485936323f8ef1160e11b855230600486015260018060a01b031660248501526044840152608060648401526084830190610e40565b03925af18015610508575f906105d7575b6104d391506104a7565b506040813d604011610603575b816105f160409383610cd2565b810103126100b8576104d390516105cd565b3d91506105e4565b90929193506020813d60201161064b575b8161062960209383610cd2565b810103126100b85751926001600160a01b03841684036100b85790915f61056b565b3d915061061c565b929190505f6106676060956106a0976110d2565b936106b160405197889687958694631652a23360e21b86523060048701526024860152604485015260a0606485015260a4840190610e40565b828103600319016084840152610ff1565b03925af18015610508576104d3915f916106cc575b506104a7565b6106e5915060603d606011610501576104f18183610cd2565b5050826106c6565b90506020813d602011610720575b8161070860209383610cd2565b810103126100b8575180151581036100b8578761053c565b3d91506106fb565b634e487b7160e01b5f52601260045260245ffd5b61077a9061077460405163095ea7b360e01b60208201528960248201525f60448201526044815261076e606482610cd2565b876110f9565b856110f9565b886103c6565b9091506107945750843b15155b8a806103be565b60011461078d565b50506020813d6020116107ca575b816107b760209383610cd2565b810103126100b857876103709151610366565b3d91506107aa565b9096506060813d606011610837575b816107ee60609383610cd2565b810103126100b85780516001600160a01b038116036100b8576020810151906001600160a01b03821682036100b857604001516001600160a01b038116036100b8579587610307565b3d91506107e1565b6302f3451d60e21b5f5260045ffd5b346100b85761085c36610dae565b80516001600160a01b039093169260208083019291820191909103126100b85751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa908115610508575f91610985575b50610903936109116108d06020945f94611041565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f198101875286610cd2565b84519082855af15f513d82610969575b50501561092a57005b610962610967936040519063095ea7b360e01b602083015260248201525f60448201526044815261095c606482610cd2565b826110f9565b6110f9565b005b90915061097d5750803b15155b8480610921565b600114610976565b90506020813d6020116109b1575b816109a060209383610cd2565b810103126100b857516109036108bb565b3d9150610993565b346100b85760803660031901126100b8576109d2610d2c565b6109da610d42565b6044356001600160a01b03811692908390036100b85760643567ffffffffffffffff81116100b857610a10903690600401610d58565b602081519181808201938492010103126100b857515f198114610a765761096793604051936323b872dd60e01b602086015260018060a01b031660248501526044840152606483015260648252610a68608483610cd2565b6001600160a01b03166110f9565b630d550c3b60e11b5f5260045ffd5b346100b8575f3660031901126100b85760a0600854600954600a54600b5490600c54926040519485526020850152604084015260608301526080820152f35b346100b857610ad236610dae565b602081939293519181808201938492010103126100b85751905f198214610a765760405163a9059cbb60e01b60208201526001600160a01b039390931660248401526044808401929092529082526109679190610a68606483610cd2565b346100b8575f3660031901126100b85760018060a01b0360035416600454915f6007548060011c90600181168015610c31575b6020831081146101da57828552908115610c0d5750600114610baf575b5090610b91816104d3930382610cd2565b60405193849384526020840152606060408401526060830190610d08565b60075f9081527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688939250905b808210610bf357509091508101602001610b91610b80565b919260018160209254838588010152019101909291610bdb565b60ff191660208086019190915291151560051b84019091019150610b919050610b80565b91607f1691610b63565b5f92918154918260011c92600181168015610cc8575b6020851081146101da57848452908115610cab5750600114610c7257505050565b5f9081526020812093945091925b838310610c91575060209250010190565b600181602092949394548385870101520191019190610c80565b915050602093945060ff929192191683830152151560051b010190565b93607f1693610c51565b90601f8019910116810190811067ffffffffffffffff821117610cf457604052565b634e487b7160e01b5f52604160045260245ffd5b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036100b857565b602435906001600160a01b03821682036100b857565b81601f820112156100b85780359067ffffffffffffffff8211610cf45760405192610d8d601f8401601f191660200185610cd2565b828452602083830101116100b857815f926020809301838601378301015290565b60606003198201126100b8576004356001600160a01b03811681036100b857916024356001600160a01b03811681036100b857916044359067ffffffffffffffff82116100b857610e0191600401610d58565b90565b90600b821015610e115752565b634e487b7160e01b5f52602160045260245ffd5b908160609103126100b8578051916040602083015192015190565b60809060018060a01b0381511683526020810151602084015260018060a01b03604082015116604084015260018060a01b03606082015116606084015201519060a06080820152610e9560a082018351610e04565b60208201516001600160a01b031660c08201526040820151608060e083015261010090606090610eca90610120850190610d08565b930151151591015290565b908060208354918281520160208260051b840101935f5260205f20925f905b838210610f0357505050505090565b9091929394601f19828203018452606081528554606082015260018601546080820152600286015460a0820152600386015460ff81166004811015610e115760c08301526001600160a01b03600891821c811660e0840152600488015481166101008401526005880154811661012084015260068801541661014083015260078701546101608301528601546101808083019190915260098701546101a08301526101c0820152600190602090600d90610fd7610fc76101e08301600a8c01610c3b565b82810385840152600b8b01610c3b565b906040600c8b015491015297019401920190939293610ef4565b610e019060018060a01b03600354168152600454602082015260a0604082015261103161102260a083016005610ed5565b82810360608401526006610ed5565b9060808183039101526007610c3b565b9190820180921161104e57565b634e487b7160e01b5f52601160045260245ffd5b6040519060a0820182811067ffffffffffffffff821117610cf457604052815f81525f60208201525f60408201525f606082015260405190608082019082821067ffffffffffffffff831117610cf4576080916040525f83525f6020840152606060408401525f60608401520152565b91906110dc611062565b6001600160a01b0390931680845260208401919091526040830152565b905f602091828151910182855af115610508575f513d61114857506001600160a01b0381163b155b6111285750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b60011415611121565b91818302915f19818509938380861095039480860395146111e157848311156111c95790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b50508092501561072857049056fea26469706673582212205bf94e5371bc2f132405be99261f2b9351cbdbf49e328ca512e068eee1eda9d164736f6c634300081d0033000000000000000000000000888888888889758f76e7103c6cbf23abbf58f946", + "nonce": "0x93", + "chainId": "0x38" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x01a7ad0206efe61d71d44c27771a17bfd3236340b7099e2d53ac412de3545478", + "transactionType": "CREATE", + "contractName": "ERC4626VaultAdapterV2", + "contractAddress": "0x4f97afab57dc87401558059790445c65c3dc58b8", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "gas": "0xaf02f", + "value": "0x0", + "input": "0x60a0806040523460215730608052610900908161002682396080518160aa0152f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146106395780636563c0e91461056d5780639df303251461040d5763e0a8041314610045575f80fd5b346102a35760803660031901126102a35761005e6106a5565b6100666106bb565b9060443567ffffffffffffffff81116102a357610087903690600401610707565b60643567ffffffffffffffff81116102a3576100a7903690600401610707565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630146103fe5781516001600160a01b039182169490911691602080820192820191909103126102a35751926060838051810103126102a35760208301519260028410156102a357606060408201519101519061012f81878461082c565b9080156103ea578661014493091515906107b3565b92806103525750604051636eb1769f60e11b815230600482015260248101839052602081604481855afa9081156102af575f9161031a575b50846020939261018f5f976044946107b3565b60405163095ea7b360e01b8782019081526001600160a01b038716602483015260448083019390935291815290869089906101cb6064856106d1565b83519082865af188513d826102fb575b5050156102ba575b50506040519586938492636e553f6560e01b845260048401523060248401525af19182156102af575f92610277575b50818181106102625750505b60408051602081019283526020815261023782826106d1565b8151928391602083525180918160208501528484015e5f828201840152601f01601f19168101030190f35b63eb7f211d60e01b5f5260045260245260445ffd5b9091506020813d6020116102a7575b81610293602093836106d1565b810103126102a35751905f610212565b5f80fd5b3d9150610286565b6040513d5f823e3d90fd5b6102f4916102ef60405163095ea7b360e01b898201528760248201528a878201528681526102e96064826106d1565b826107d4565b6107d4565b5f806101e3565b9091501589146103125750813b15155b5f806101db565b60011461030b565b90506020929192813d60201161034a575b81610338602093836106d1565b810103126102a357519091908461017c565b3d915061032b565b909391506001036103db575f9260646020926040519586938492635d043b2960e11b845260048401523060248401523060448401525af19182156102af575f926103a7575b508181811061026257505061021e565b9091506020813d6020116103d3575b816103c3602093836106d1565b810103126102a35751905f610397565b3d91506103b6565b634a7f394f60e01b5f5260045ffd5b634e487b7160e01b5f52601260045260245ffd5b6302f3451d60e21b5f5260045ffd5b346102a35761041b3661075d565b80516001600160a01b039093169260208083019291820191909103126102a35751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa9081156102af575f91610539575b506104c2936104d061048f6020945f946107b3565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f1981018752866106d1565b84519082855af15f513d8261051d575b5050156104e957005b6102ef61051b936040519063095ea7b360e01b602083015260248201525f6044820152604481526102e96064826106d1565b005b9091506105315750803b15155b84806104e0565b60011461052a565b90506020813d602011610565575b81610554602093836106d1565b810103126102a357516104c261047a565b3d9150610547565b346102a35760803660031901126102a3576105866106a5565b61058e6106bb565b6044356001600160a01b03811692908390036102a35760643567ffffffffffffffff81116102a3576105c4903690600401610707565b602081519181808201938492010103126102a357515f19811461062a5761051b93604051936323b872dd60e01b602086015260018060a01b03166024850152604484015260648301526064825261061c6084836106d1565b6001600160a01b03166107d4565b630d550c3b60e11b5f5260045ffd5b346102a3576106473661075d565b602081939293519181808201938492010103126102a35751905f19821461062a5760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261051b919061061c6064836106d1565b600435906001600160a01b03821682036102a357565b602435906001600160a01b03821682036102a357565b90601f8019910116810190811067ffffffffffffffff8211176106f357604052565b634e487b7160e01b5f52604160045260245ffd5b81601f820112156102a35780359067ffffffffffffffff82116106f3576040519261073c601f8401601f1916602001856106d1565b828452602083830101116102a357815f926020809301838601378301015290565b60606003198201126102a3576004356001600160a01b03811681036102a357916024356001600160a01b03811681036102a357916044359067ffffffffffffffff82116102a3576107b091600401610707565b90565b919082018092116107c057565b634e487b7160e01b5f52601160045260245ffd5b905f602091828151910182855af1156102af575f513d61082357506001600160a01b0381163b155b6108035750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156107fc565b91818302915f19818509938380861095039480860395146108bc57848311156108a45790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b5050809250156103ea57049056fea26469706673582212208494a0174c4f07fd048515a6e3e22a540bf8edf31a0e807f0e3019b7d5b7c74464736f6c634300081d0033", + "nonce": "0x94", + "chainId": "0x38" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x1aa51ef1edbfe18d2df2424e675220763cc6da7b8a8164f10f262ebf04fd2e70", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0x9498764f0c62257b83a04e2a757de30908ec793d", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0x9498764f0c62257b83a04e2a757de30908ec793d", + "gas": "0x157eb", + "value": "0x0", + "input": "0xb6b07b8e000000000000000000000000b7634db4f4710bb992118bc37d1f63e00e2704a4000000000000000000000000c82473b4b712440e3fc311d8439f65aa38556c380000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x95", + "chainId": "0x38" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x3e64090a8e39d325a6c6360879122272bdb7808a0947a2b5023269bcb121a91b", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0x9498764f0c62257b83a04e2a757de30908ec793d", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0x9498764f0c62257b83a04e2a757de30908ec793d", + "gas": "0x16c16", + "value": "0x0", + "input": "0xb6b07b8e000000000000000000000000b7634db4f4710bb992118bc37d1f63e00e2704a40000000000000000000000005bbc23e84c248b0563fcfd25b100891625de90cd0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x96", + "chainId": "0x38" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xe9c94ee38972d870abd7e19e9f9fe3b2ecfa6187e4598c3e745a25ac7186546b", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0x9498764f0c62257b83a04e2a757de30908ec793d", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0x9498764f0c62257b83a04e2a757de30908ec793d", + "gas": "0x157eb", + "value": "0x0", + "input": "0xb6b07b8e000000000000000000000000b7634db4f4710bb992118bc37d1f63e00e2704a400000000000000000000000005d171617fe60ba27992f238686d3eb3b3cadca00000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x97", + "chainId": "0x38" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x21ccc140d2149087fd6de3428c89061b7fa5f7c126d70ce7a51f6b3ce3cfcbbd", + "transactionType": "CALL", + "contractName": "ERC1967Proxy", + "contractAddress": "0x9498764f0c62257b83a04e2a757de30908ec793d", + "function": null, + "arguments": null, + "transaction": { + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0x9498764f0c62257b83a04e2a757de30908ec793d", + "gas": "0x157eb", + "value": "0x0", + "input": "0xb6b07b8e000000000000000000000000b7634db4f4710bb992118bc37d1f63e00e2704a40000000000000000000000004f97afab57dc87401558059790445c65c3dc58b80000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x98", + "chainId": "0x38" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x1232150", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x5a8363cd7ce4fe7b65f82b1ea3faf2d6f44fed481f7c30aab763fdae5feebbb9", + "transactionIndex": "0x64", + "blockHash": "0x1a876ac50193a1bb2df3420361ba2e5c2c41f5903ef8f1526093806164292455", + "blockNumber": "0x31ee37a", + "gasUsed": "0x8f94e", + "effectiveGasPrice": "0x5f5e100", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": null, + "contractAddress": "0xc82473b4b712440e3fc311d8439f65aa38556c38" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xf63232", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xa85ce580b099d8dc8e505fea81d56fb795f70a6719dd24aceea8424d3e1cf59f", + "transactionIndex": "0x5b", + "blockHash": "0x3f2e355c16e55682dabed4cb0b4586c4789b36b8631ffbfbeb339da5ef747136", + "blockNumber": "0x31ee37e", + "gasUsed": "0x9b394", + "effectiveGasPrice": "0x5f5e100", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": null, + "contractAddress": "0x5bbc23e84c248b0563fcfd25b100891625de90cd" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x16456e9", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xb2df9e463fe051f79052b99af12b7beff77f8f59e5b76286ea830c67b696bd82", + "transactionIndex": "0x85", + "blockHash": "0xa565832078c5e7e77aad47380d4cf9b800c701bb59f25baa07e46fc91faa77f0", + "blockNumber": "0x31ee382", + "gasUsed": "0x1142f4", + "effectiveGasPrice": "0x5f5e100", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": null, + "contractAddress": "0x05d171617fe60ba27992f238686d3eb3b3cadca0" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x10dd6f5", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x01a7ad0206efe61d71d44c27771a17bfd3236340b7099e2d53ac412de3545478", + "transactionIndex": "0x77", + "blockHash": "0xab0ef41d455d8f3a57f160fd4d3a85c519f315bc0ef508143868cf8f7965d3b7", + "blockNumber": "0x31ee387", + "gasUsed": "0x869fd", + "effectiveGasPrice": "0x5f5e100", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": null, + "contractAddress": "0x4f97afab57dc87401558059790445c65c3dc58b8" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1518178", + "logs": [ + { + "address": "0xb7634db4f4710bb992118bc37d1f63e00e2704a4", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x000000000000000000000000c82473b4b712440e3fc311d8439f65aa38556c380000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x28bcf1f06ef77a9aa314560e9111e1ba6fffb5f632d0ab3bbfc76a6d42bccb13", + "blockNumber": "0x31ee38b", + "transactionHash": "0x1aa51ef1edbfe18d2df2424e675220763cc6da7b8a8164f10f262ebf04fd2e70", + "transactionIndex": "0x7a", + "logIndex": "0x33d", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000008000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000020000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x1aa51ef1edbfe18d2df2424e675220763cc6da7b8a8164f10f262ebf04fd2e70", + "transactionIndex": "0x7a", + "blockHash": "0x28bcf1f06ef77a9aa314560e9111e1ba6fffb5f632d0ab3bbfc76a6d42bccb13", + "blockNumber": "0x31ee38b", + "gasUsed": "0xf8ff", + "effectiveGasPrice": "0x5f5e100", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0x9498764f0c62257b83a04e2a757de30908ec793d", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x9a4d3b", + "logs": [ + { + "address": "0xb7634db4f4710bb992118bc37d1f63e00e2704a4", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x0000000000000000000000005bbc23e84c248b0563fcfd25b100891625de90cd0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x6bd8082b4410f630b00623c95227c81b130b0e6f13edd412e219676b2429e8f8", + "blockNumber": "0x31ee390", + "transactionHash": "0x3e64090a8e39d325a6c6360879122272bdb7808a0947a2b5023269bcb121a91b", + "transactionIndex": "0x3d", + "logIndex": "0x189", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000008000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000020000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x3e64090a8e39d325a6c6360879122272bdb7808a0947a2b5023269bcb121a91b", + "transactionIndex": "0x3d", + "blockHash": "0x6bd8082b4410f630b00623c95227c81b130b0e6f13edd412e219676b2429e8f8", + "blockNumber": "0x31ee390", + "gasUsed": "0xf8f3", + "effectiveGasPrice": "0x5f5e100", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0x9498764f0c62257b83a04e2a757de30908ec793d", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xdd243c", + "logs": [ + { + "address": "0xb7634db4f4710bb992118bc37d1f63e00e2704a4", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x00000000000000000000000005d171617fe60ba27992f238686d3eb3b3cadca00000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xbc85ddbeccc09a93289da4f0bfa65daa489f580256b67f913807335e22750b2d", + "blockNumber": "0x31ee394", + "transactionHash": "0xe9c94ee38972d870abd7e19e9f9fe3b2ecfa6187e4598c3e745a25ac7186546b", + "transactionIndex": "0x4b", + "logIndex": "0x1d3", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000008000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000020000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xe9c94ee38972d870abd7e19e9f9fe3b2ecfa6187e4598c3e745a25ac7186546b", + "transactionIndex": "0x4b", + "blockHash": "0xbc85ddbeccc09a93289da4f0bfa65daa489f580256b67f913807335e22750b2d", + "blockNumber": "0x31ee394", + "gasUsed": "0xf8ff", + "effectiveGasPrice": "0x5f5e100", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0x9498764f0c62257b83a04e2a757de30908ec793d", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x192348c", + "logs": [ + { + "address": "0xb7634db4f4710bb992118bc37d1f63e00e2704a4", + "topics": [ + "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" + ], + "data": "0x0000000000000000000000004f97afab57dc87401558059790445c65c3dc58b80000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xf97fd76c8b3bd016291ea9789351e9024f1fb362b27c792444f70ddefbb9465c", + "blockNumber": "0x31ee398", + "transactionHash": "0x21ccc140d2149087fd6de3428c89061b7fa5f7c126d70ce7a51f6b3ce3cfcbbd", + "transactionIndex": "0x7f", + "logIndex": "0x48d", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000008000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000020000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x21ccc140d2149087fd6de3428c89061b7fa5f7c126d70ce7a51f6b3ce3cfcbbd", + "transactionIndex": "0x7f", + "blockHash": "0xf97fd76c8b3bd016291ea9789351e9024f1fb362b27c792444f70ddefbb9465c", + "blockNumber": "0x31ee398", + "gasUsed": "0xf8ff", + "effectiveGasPrice": "0x5f5e100", + "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", + "to": "0x9498764f0c62257b83a04e2a757de30908ec793d", + "contractAddress": null + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1751264857, + "chain": 56, + "commit": "01db0f8" +} \ No newline at end of file diff --git a/broadcast/DeployAdapters.s.sol/56/run-latest.json b/broadcast/DeployAdapters.s.sol/56/run-latest.json index ead5137..16df07d 100644 --- a/broadcast/DeployAdapters.s.sol/56/run-latest.json +++ b/broadcast/DeployAdapters.s.sol/56/run-latest.json @@ -1,164 +1,154 @@ { "transactions": [ { - "hash": "0xb32193b7701f1ac3b05a64bbba6a975bd5c8c127c560012ff8465a5225bd6394", + "hash": "0x5a8363cd7ce4fe7b65f82b1ea3faf2d6f44fed481f7c30aab763fdae5feebbb9", "transactionType": "CREATE", - "contractName": null, - "contractAddress": "0xa715005c1a8524c0790029153b8a860f96a2a856", + "contractName": "UniswapV3AdapterV2", + "contractAddress": "0xc82473b4b712440e3fc311d8439f65aa38556c38", "function": null, - "arguments": null, + "arguments": [ + "0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2" + ], "transaction": { "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", - "gas": "0xbaa6f", + "gas": "0xbaa7f", "value": "0x0", - "input": "0x60c034607a57601f610a3738819003918201601f19168301916001600160401b03831184841017607e57808492602094604052833981010312607a57516001600160a01b03811690819003607a573060805260a0526040516109a4908161009382396080518160fd015260a051818181606501526101610152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146106c15780636563c0e9146105f55780639df3032514610495578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b161072d565b6100b9610743565b5060443567ffffffffffffffff8111610094576100da903690600401610797565b60643567ffffffffffffffff8111610094576100fa903690600401610797565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630146104865781516001600160a01b039190911691602080820192820191909103126100945751604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316602482018190529193919290602081604481855afa80156103bd5785905f90610450575b6101b79250610857565b60405163095ea7b360e01b60208083019182526001600160a01b03871660248401526044808401949094529282529091905f906101f5606485610759565b83519082865af15f513d82610434575b5050156103f0575b505080518101916080826020850194031261009457602082015167ffffffffffffffff811161009457820183603f82011215610094576020810151906102528261077b565b946102606040519687610759565b8286526040828401011161009457815f926040602093018388015e85010152604082015191608060608201519101519061029b8187846108d0565b9080156103dc57866102b09309151590610857565b9260405160a081019080821067ffffffffffffffff8311176103c857602095610322935f936040528252868201903082526040830196875260608301988952608083019081526040519889978896879563c04b8d5960e01b87528b60048801525160a0602488015260c4870190610833565b93516001600160a01b031660448601525160648501525160848401525160a483015203925af180156103bd575f90610389575b6103859060405190602082015260208152610371604082610759565b604051918291602083526020830190610833565b0390f35b506020813d6020116103b5575b816103a360209383610759565b81010312610094576103859051610355565b3d9150610396565b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b61042d9161042860405163095ea7b360e01b60208201528660248201525f604482015260448152610422606482610759565b82610878565b610878565b838061020d565b9091506104485750813b15155b8680610205565b600114610441565b50506020813d60201161047e575b8161046b60209383610759565b8101031261009457846101b791516101ad565b3d915061045e565b6302f3451d60e21b5f5260045ffd5b34610094576104a3366107dd565b80516001600160a01b039093169260208083019291820191909103126100945751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa9081156103bd575f916105c1575b5061054a936105586105176020945f94610857565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f198101875286610759565b84519082855af15f513d826105a5575b50501561057157005b6104286105a3936040519063095ea7b360e01b602083015260248201525f604482015260448152610422606482610759565b005b9091506105b95750803b15155b8480610568565b6001146105b2565b90506020813d6020116105ed575b816105dc60209383610759565b81010312610094575161054a610502565b3d91506105cf565b346100945760803660031901126100945761060e61072d565b610616610743565b6044356001600160a01b03811692908390036100945760643567ffffffffffffffff81116100945761064c903690600401610797565b6020815191818082019384920101031261009457515f1981146106b2576105a393604051936323b872dd60e01b602086015260018060a01b0316602485015260448401526064830152606482526106a4608483610759565b6001600160a01b0316610878565b630d550c3b60e11b5f5260045ffd5b34610094576106cf366107dd565b602081939293519181808201938492010103126100945751905f1982146106b25760405163a9059cbb60e01b60208201526001600160a01b039390931660248401526044808401929092529082526105a391906106a4606483610759565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff8211176103c857604052565b67ffffffffffffffff81116103c857601f01601f191660200190565b81601f82011215610094578035906107ae8261077b565b926107bc6040519485610759565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff82116100945761083091600401610797565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9190820180921161086457565b634e487b7160e01b5f52601160045260245ffd5b905f602091828151910182855af1156103bd575f513d6108c757506001600160a01b0381163b155b6108a75750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156108a0565b91818302915f198185099383808610950394808603951461096057848311156109485790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b5050809250156103dc57049056fea2646970667358221220f6000c9f1bdef97179fd0d632833ccb7f8eb8b0c4e5d5beef7139a47675404a964736f6c634300081b0033000000000000000000000000b971ef87ede563556b2ed4b1c0b0019111dd85d2", - "nonce": "0x68", + "input": "0x60c034607a57601f610a3738819003918201601f19168301916001600160401b03831184841017607e57808492602094604052833981010312607a57516001600160a01b03811690819003607a573060805260a0526040516109a4908161009382396080518160fd015260a051818181606501526101610152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146106c15780636563c0e9146105f55780639df3032514610495578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b161072d565b6100b9610743565b5060443567ffffffffffffffff8111610094576100da903690600401610797565b60643567ffffffffffffffff8111610094576100fa903690600401610797565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630146104865781516001600160a01b039190911691602080820192820191909103126100945751604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316602482018190529193919290602081604481855afa80156103bd5785905f90610450575b6101b79250610857565b60405163095ea7b360e01b60208083019182526001600160a01b03871660248401526044808401949094529282529091905f906101f5606485610759565b83519082865af15f513d82610434575b5050156103f0575b505080518101916080826020850194031261009457602082015167ffffffffffffffff811161009457820183603f82011215610094576020810151906102528261077b565b946102606040519687610759565b8286526040828401011161009457815f926040602093018388015e85010152604082015191608060608201519101519061029b8187846108d0565b9080156103dc57866102b09309151590610857565b9260405160a081019080821067ffffffffffffffff8311176103c857602095610322935f936040528252868201903082526040830196875260608301988952608083019081526040519889978896879563c04b8d5960e01b87528b60048801525160a0602488015260c4870190610833565b93516001600160a01b031660448601525160648501525160848401525160a483015203925af180156103bd575f90610389575b6103859060405190602082015260208152610371604082610759565b604051918291602083526020830190610833565b0390f35b506020813d6020116103b5575b816103a360209383610759565b81010312610094576103859051610355565b3d9150610396565b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b61042d9161042860405163095ea7b360e01b60208201528660248201525f604482015260448152610422606482610759565b82610878565b610878565b838061020d565b9091506104485750813b15155b8680610205565b600114610441565b50506020813d60201161047e575b8161046b60209383610759565b8101031261009457846101b791516101ad565b3d915061045e565b6302f3451d60e21b5f5260045ffd5b34610094576104a3366107dd565b80516001600160a01b039093169260208083019291820191909103126100945751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa9081156103bd575f916105c1575b5061054a936105586105176020945f94610857565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f198101875286610759565b84519082855af15f513d826105a5575b50501561057157005b6104286105a3936040519063095ea7b360e01b602083015260248201525f604482015260448152610422606482610759565b005b9091506105b95750803b15155b8480610568565b6001146105b2565b90506020813d6020116105ed575b816105dc60209383610759565b81010312610094575161054a610502565b3d91506105cf565b346100945760803660031901126100945761060e61072d565b610616610743565b6044356001600160a01b03811692908390036100945760643567ffffffffffffffff81116100945761064c903690600401610797565b6020815191818082019384920101031261009457515f1981146106b2576105a393604051936323b872dd60e01b602086015260018060a01b0316602485015260448401526064830152606482526106a4608483610759565b6001600160a01b0316610878565b630d550c3b60e11b5f5260045ffd5b34610094576106cf366107dd565b602081939293519181808201938492010103126100945751905f1982146106b25760405163a9059cbb60e01b60208201526001600160a01b039390931660248401526044808401929092529082526105a391906106a4606483610759565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff8211176103c857604052565b67ffffffffffffffff81116103c857601f01601f191660200190565b81601f82011215610094578035906107ae8261077b565b926107bc6040519485610759565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff82116100945761083091600401610797565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9190820180921161086457565b634e487b7160e01b5f52601160045260245ffd5b905f602091828151910182855af1156103bd575f513d6108c757506001600160a01b0381163b155b6108a75750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156108a0565b91818302915f198185099383808610950394808603951461096057848311156109485790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b5050809250156103dc57049056fea2646970667358221220c66a6ef0f7fbba462fbafbd2ef2a7ef760baae0e9780be52e06dc1d37795583464736f6c634300081d0033000000000000000000000000b971ef87ede563556b2ed4b1c0b0019111dd85d2", + "nonce": "0x91", "chainId": "0x38" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0x40a0b6934d478af6b50604988e0b8ba77ade700fe2cd94c5c96d2c176d5b709a", + "hash": "0xa85ce580b099d8dc8e505fea81d56fb795f70a6719dd24aceea8424d3e1cf59f", "transactionType": "CREATE", - "contractName": null, - "contractAddress": "0x954529f8f103bde464fc6d02a94cd40c5bd322d1", + "contractName": "OdosV2AdapterV2", + "contractAddress": "0x5bbc23e84c248b0563fcfd25b100891625de90cd", "function": null, - "arguments": null, + "arguments": [ + "0x89b8AA89FDd0507a99d334CBe3C808fAFC7d850E" + ], "transaction": { "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "gas": "0xc9ca6", "value": "0x0", - "input": "0x60c034607a57601f610b1438819003918201601f19168301916001600160401b03831184841017607e57808492602094604052833981010312607a57516001600160a01b03811690819003607a573060805260a052604051610a81908161009382396080518160fd015260a051818181606501526101610152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146107565780636563c0e91461068a5780639df303251461052a578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b16107c2565b6100b96107d8565b5060443567ffffffffffffffff8111610094576100da90369060040161082c565b60643567ffffffffffffffff8111610094576100fa90369060040161082c565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316301461051b5781516001600160a01b039190911691602080820192820191909103126100945751604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031660248201819052919290602081604481855afa80156104665784905f906104e5575b6101b59250610900565b60405163095ea7b360e01b60208083019182526001600160a01b03861660248401526044808401949094529282529091905f906101f36064856107ee565b83519082865af15f513d826104c9575b505015610485575b505082518301908360208301920361014081126100945760e013610094576040519160e0830183811067ffffffffffffffff82111761047157604052610253602086016108ec565b83526040850151906020840191825261026e606087016108ec565b9360408101948552610282608088016108ec565b966060820197885260a0810151926080830193845260c08201519760a084019889526102b060e084016108ec565b9160c0850192835261010084015167ffffffffffffffff811161009457840181603f82011215610094576020810151906102e982610810565b926102f760405194856107ee565b8284526040828401011161009457815f926040602093018386015e830101526101208401516001600160a01b03811694908590036100945761014001519263ffffffff84168094036100945760209a876103e09461035a5f9a51828d5191610921565b825261036a8351828d5191610921565b83528a52308352604051630ed8d73960e21b815297516001600160a01b0390811660048a0152995160248901529a51891660448801529b518816606487015298516084860152995160a4850152965190941660c483015261014060e48301529096879586948593929091906101448501906108c8565b9161010484015261012483015203925af18015610466575f90610432575b61042e906040519060208201526020815261041a6040826107ee565b6040519182916020835260208301906108c8565b0390f35b506020813d60201161045e575b8161044c602093836107ee565b810103126100945761042e90516103fe565b3d915061043f565b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b6104c2916104bd60405163095ea7b360e01b60208201528560248201525f6044820152604481526104b76064826107ee565b82610955565b610955565b838061020b565b9091506104dd5750813b15155b8680610203565b6001146104d6565b50506020813d602011610513575b81610500602093836107ee565b8101031261009457836101b591516101ab565b3d91506104f3565b6302f3451d60e21b5f5260045ffd5b346100945761053836610872565b80516001600160a01b039093169260208083019291820191909103126100945751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa908115610466575f91610656575b506105df936105ed6105ac6020945f94610900565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f1981018752866107ee565b84519082855af15f513d8261063a575b50501561060657005b6104bd610638936040519063095ea7b360e01b602083015260248201525f6044820152604481526104b76064826107ee565b005b90915061064e5750803b15155b84806105fd565b600114610647565b90506020813d602011610682575b81610671602093836107ee565b8101031261009457516105df610597565b3d9150610664565b34610094576080366003190112610094576106a36107c2565b6106ab6107d8565b6044356001600160a01b03811692908390036100945760643567ffffffffffffffff8111610094576106e190369060040161082c565b6020815191818082019384920101031261009457515f1981146107475761063893604051936323b872dd60e01b602086015260018060a01b0316602485015260448401526064830152606482526107396084836107ee565b6001600160a01b0316610955565b630d550c3b60e11b5f5260045ffd5b346100945761076436610872565b602081939293519181808201938492010103126100945751905f1982146107475760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261063891906107396064836107ee565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff82111761047157604052565b67ffffffffffffffff811161047157601f01601f191660200190565b81601f820112156100945780359061084382610810565b9261085160405194856107ee565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff8211610094576108c59160040161082c565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b51906001600160a01b038216820361009457565b9190820180921161090d57565b634e487b7160e01b5f52601160045260245ffd5b9161092d8183856109ad565b918115610941576108c59309151590610900565b634e487b7160e01b5f52601260045260245ffd5b905f602091828151910182855af115610466575f513d6109a457506001600160a01b0381163b155b6109845750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b6001141561097d565b91818302915f1981850993838086109503948086039514610a3d5784831115610a255790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b50508092501561094157049056fea26469706673582212201a43e03d554ef4508b4ce4929a5e2c8c851ee4de243e12f6b2b1267ec83a42f164736f6c634300081b003300000000000000000000000089b8aa89fdd0507a99d334cbe3c808fafc7d850e", - "nonce": "0x69", + "input": "0x60c034607a57601f610b1438819003918201601f19168301916001600160401b03831184841017607e57808492602094604052833981010312607a57516001600160a01b03811690819003607a573060805260a052604051610a81908161009382396080518160fd015260a051818181606501526101610152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146107565780636563c0e91461068a5780639df303251461052a578063e0a80413146100985763f887ea4014610050575f80fd5b34610094575f366003190112610094576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b34610094576080366003190112610094576100b16107c2565b6100b96107d8565b5060443567ffffffffffffffff8111610094576100da90369060040161082c565b60643567ffffffffffffffff8111610094576100fa90369060040161082c565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316301461051b5781516001600160a01b039190911691602080820192820191909103126100945751604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031660248201819052919290602081604481855afa80156104665784905f906104e5575b6101b59250610900565b60405163095ea7b360e01b60208083019182526001600160a01b03861660248401526044808401949094529282529091905f906101f36064856107ee565b83519082865af15f513d826104c9575b505015610485575b505082518301908360208301920361014081126100945760e013610094576040519160e0830183811067ffffffffffffffff82111761047157604052610253602086016108ec565b83526040850151906020840191825261026e606087016108ec565b9360408101948552610282608088016108ec565b966060820197885260a0810151926080830193845260c08201519760a084019889526102b060e084016108ec565b9160c0850192835261010084015167ffffffffffffffff811161009457840181603f82011215610094576020810151906102e982610810565b926102f760405194856107ee565b8284526040828401011161009457815f926040602093018386015e830101526101208401516001600160a01b03811694908590036100945761014001519263ffffffff84168094036100945760209a876103e09461035a5f9a51828d5191610921565b825261036a8351828d5191610921565b83528a52308352604051630ed8d73960e21b815297516001600160a01b0390811660048a0152995160248901529a51891660448801529b518816606487015298516084860152995160a4850152965190941660c483015261014060e48301529096879586948593929091906101448501906108c8565b9161010484015261012483015203925af18015610466575f90610432575b61042e906040519060208201526020815261041a6040826107ee565b6040519182916020835260208301906108c8565b0390f35b506020813d60201161045e575b8161044c602093836107ee565b810103126100945761042e90516103fe565b3d915061043f565b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b6104c2916104bd60405163095ea7b360e01b60208201528560248201525f6044820152604481526104b76064826107ee565b82610955565b610955565b838061020b565b9091506104dd5750813b15155b8680610203565b6001146104d6565b50506020813d602011610513575b81610500602093836107ee565b8101031261009457836101b591516101ab565b3d91506104f3565b6302f3451d60e21b5f5260045ffd5b346100945761053836610872565b80516001600160a01b039093169260208083019291820191909103126100945751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa908115610466575f91610656575b506105df936105ed6105ac6020945f94610900565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f1981018752866107ee565b84519082855af15f513d8261063a575b50501561060657005b6104bd610638936040519063095ea7b360e01b602083015260248201525f6044820152604481526104b76064826107ee565b005b90915061064e5750803b15155b84806105fd565b600114610647565b90506020813d602011610682575b81610671602093836107ee565b8101031261009457516105df610597565b3d9150610664565b34610094576080366003190112610094576106a36107c2565b6106ab6107d8565b6044356001600160a01b03811692908390036100945760643567ffffffffffffffff8111610094576106e190369060040161082c565b6020815191818082019384920101031261009457515f1981146107475761063893604051936323b872dd60e01b602086015260018060a01b0316602485015260448401526064830152606482526107396084836107ee565b6001600160a01b0316610955565b630d550c3b60e11b5f5260045ffd5b346100945761076436610872565b602081939293519181808201938492010103126100945751905f1982146107475760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261063891906107396064836107ee565b600435906001600160a01b038216820361009457565b602435906001600160a01b038216820361009457565b90601f8019910116810190811067ffffffffffffffff82111761047157604052565b67ffffffffffffffff811161047157601f01601f191660200190565b81601f820112156100945780359061084382610810565b9261085160405194856107ee565b8284526020838301011161009457815f926020809301838601378301015290565b6060600319820112610094576004356001600160a01b038116810361009457916024356001600160a01b038116810361009457916044359067ffffffffffffffff8211610094576108c59160040161082c565b90565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b51906001600160a01b038216820361009457565b9190820180921161090d57565b634e487b7160e01b5f52601160045260245ffd5b9161092d8183856109ad565b918115610941576108c59309151590610900565b634e487b7160e01b5f52601260045260245ffd5b905f602091828151910182855af115610466575f513d6109a457506001600160a01b0381163b155b6109845750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b6001141561097d565b91818302915f1981850993838086109503948086039514610a3d5784831115610a255790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b50508092501561094157049056fea2646970667358221220191f3a0969690b852c0fad405075e504d7c37835c39e58743a8dc57c2ad534da64736f6c634300081d003300000000000000000000000089b8aa89fdd0507a99d334cbe3c808fafc7d850e", + "nonce": "0x92", "chainId": "0x38" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0x5a2688b1f57dd655d926a6ca0a0b8a785e9620074522e880f0404daf7aed6670", + "hash": "0xb2df9e463fe051f79052b99af12b7beff77f8f59e5b76286ea830c67b696bd82", "transactionType": "CREATE", - "contractName": null, - "contractAddress": "0x883192efdd5a3417b2c0a14b25f7536b2018f853", + "contractName": "PendleSwapV3AdapterV2", + "contractAddress": "0x05d171617fe60ba27992f238686d3eb3b3cadca0", "function": null, - "arguments": null, + "arguments": [ + "0x888888888889758F76e7103c6CbF23ABbF58F946" + ], "transaction": { "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "gas": "0x1670a3", "value": "0x0", - "input": "0x60c0604052346100f757604051601f61132138819003918201601f19168301916001600160401b038311848410176100e3578084926020946040528339810103126100f757516001600160a01b038116908190036100f7573060805260405160a081016001600160401b038111828210176100e357655af3107a4000916080916040525f81525f1960208201525f6040820152610100606082015201525f6008555f196009555f600a55610100600b55655af3107a4000600c5560a05260405161122590816100fc82396080518161025d015260a0518181816089015261031d0152f35b634e487b7160e01b5f52604160045260245ffd5b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816309316dd314610b30575080633268263b14610ac45780634ebfc81414610a855780636563c0e9146109b95780639df303251461084e578063e0a80413146101f8578063f66a7749146100bc5763f887ea4014610074575f80fd5b346100b8575f3660031901126100b8576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b346100b8575f3660031901126100b8575f54604051905f6001548060011c91600182169182156101ee575b6020841083146101da5783865285929081156101bb575060011461015c575b61011292500383610cd2565b60ff60025416610150604051938361012e8660ff819716610e04565b60081c6001600160a01b03166020850152608060408501819052840190610d08565b90151560608301520390f35b5060015f90815290917fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b81831061019f57505090602061011292820101610106565b6020919350806001915483858901015201910190918492610187565b6020925061011294915060ff191682840152151560051b820101610106565b634e487b7160e01b5f52602260045260245ffd5b92607f16926100e7565b346100b85760803660031901126100b857610211610d2c565b610219610d42565b60443567ffffffffffffffff81116100b857610239903690600401610d58565b9160643567ffffffffffffffff81116100b85761025a903690600401610d58565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316301461083f5783516001600160a01b0393841694919093169260208083019291820191909103126100b85751916060828051810103126100b85760208201516001600160a01b03811691908290036100b857606060408401519301519460405195630b2339af60e21b8752606087600481875afa968715610508575f976107d2575b50604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316602482018190529590602081604481885afa80156105085788905f9061079c575b6103709250611041565b60405163095ea7b360e01b60208083019182526001600160a01b038a1660248401526044808401949094529282529091905f906103ae606485610cd2565b83519082895af15f513d82610780575b50501561073c575b506103d2818884611151565b90801561072857876103e79309151590611041565b956001600160a01b0316818103610513575050935f606094939261047e9661040d611062565b95818752602087015260408601526104906040519788968795869463640fc23d60e11b86523060048701526024860152604485015260085460648501526009546084850152600a5460a4850152600b5460c4850152600c5460e4850152610140610104850152610144840190610e40565b82810360031901610124840152610ff1565b03925af18015610508576104d3915f916104d7575b505b604051906020820152602081526104bf604082610cd2565b604051918291602083526020830190610d08565b0390f35b6104f9915060603d606011610501575b6104f18183610cd2565b810190610e25565b5050826104a5565b503d6104e7565b6040513d5f823e3d90fd5b9150949391604051630bc4ed8360e21b8152602081600481865afa908115610508575f916106ed575b50156106535750936020600494956040519586809263781c18db60e01b82525afa938415610508575f9461060b575b50905f61057f6105bc9660409695946110d2565b938551968795869485936323f8ef1160e11b855230600486015260018060a01b031660248501526044840152608060648401526084830190610e40565b03925af18015610508575f906105d7575b6104d391506104a7565b506040813d604011610603575b816105f160409383610cd2565b810103126100b8576104d390516105cd565b3d91506105e4565b90929193506020813d60201161064b575b8161062960209383610cd2565b810103126100b85751926001600160a01b03841684036100b85790915f61056b565b3d915061061c565b929190505f6106676060956106a0976110d2565b936106b160405197889687958694631652a23360e21b86523060048701526024860152604485015260a0606485015260a4840190610e40565b828103600319016084840152610ff1565b03925af18015610508576104d3915f916106cc575b506104a7565b6106e5915060603d606011610501576104f18183610cd2565b5050826106c6565b90506020813d602011610720575b8161070860209383610cd2565b810103126100b8575180151581036100b8578761053c565b3d91506106fb565b634e487b7160e01b5f52601260045260245ffd5b61077a9061077460405163095ea7b360e01b60208201528960248201525f60448201526044815261076e606482610cd2565b876110f9565b856110f9565b886103c6565b9091506107945750843b15155b8a806103be565b60011461078d565b50506020813d6020116107ca575b816107b760209383610cd2565b810103126100b857876103709151610366565b3d91506107aa565b9096506060813d606011610837575b816107ee60609383610cd2565b810103126100b85780516001600160a01b038116036100b8576020810151906001600160a01b03821682036100b857604001516001600160a01b038116036100b8579587610307565b3d91506107e1565b6302f3451d60e21b5f5260045ffd5b346100b85761085c36610dae565b80516001600160a01b039093169260208083019291820191909103126100b85751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa908115610508575f91610985575b50610903936109116108d06020945f94611041565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f198101875286610cd2565b84519082855af15f513d82610969575b50501561092a57005b610962610967936040519063095ea7b360e01b602083015260248201525f60448201526044815261095c606482610cd2565b826110f9565b6110f9565b005b90915061097d5750803b15155b8480610921565b600114610976565b90506020813d6020116109b1575b816109a060209383610cd2565b810103126100b857516109036108bb565b3d9150610993565b346100b85760803660031901126100b8576109d2610d2c565b6109da610d42565b6044356001600160a01b03811692908390036100b85760643567ffffffffffffffff81116100b857610a10903690600401610d58565b602081519181808201938492010103126100b857515f198114610a765761096793604051936323b872dd60e01b602086015260018060a01b031660248501526044840152606483015260648252610a68608483610cd2565b6001600160a01b03166110f9565b630d550c3b60e11b5f5260045ffd5b346100b8575f3660031901126100b85760a0600854600954600a54600b5490600c54926040519485526020850152604084015260608301526080820152f35b346100b857610ad236610dae565b602081939293519181808201938492010103126100b85751905f198214610a765760405163a9059cbb60e01b60208201526001600160a01b039390931660248401526044808401929092529082526109679190610a68606483610cd2565b346100b8575f3660031901126100b85760018060a01b0360035416600454915f6007548060011c90600181168015610c31575b6020831081146101da57828552908115610c0d5750600114610baf575b5090610b91816104d3930382610cd2565b60405193849384526020840152606060408401526060830190610d08565b60075f9081527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688939250905b808210610bf357509091508101602001610b91610b80565b919260018160209254838588010152019101909291610bdb565b60ff191660208086019190915291151560051b84019091019150610b919050610b80565b91607f1691610b63565b5f92918154918260011c92600181168015610cc8575b6020851081146101da57848452908115610cab5750600114610c7257505050565b5f9081526020812093945091925b838310610c91575060209250010190565b600181602092949394548385870101520191019190610c80565b915050602093945060ff929192191683830152151560051b010190565b93607f1693610c51565b90601f8019910116810190811067ffffffffffffffff821117610cf457604052565b634e487b7160e01b5f52604160045260245ffd5b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036100b857565b602435906001600160a01b03821682036100b857565b81601f820112156100b85780359067ffffffffffffffff8211610cf45760405192610d8d601f8401601f191660200185610cd2565b828452602083830101116100b857815f926020809301838601378301015290565b60606003198201126100b8576004356001600160a01b03811681036100b857916024356001600160a01b03811681036100b857916044359067ffffffffffffffff82116100b857610e0191600401610d58565b90565b90600b821015610e115752565b634e487b7160e01b5f52602160045260245ffd5b908160609103126100b8578051916040602083015192015190565b60809060018060a01b0381511683526020810151602084015260018060a01b03604082015116604084015260018060a01b03606082015116606084015201519060a06080820152610e9560a082018351610e04565b60208201516001600160a01b031660c08201526040820151608060e083015261010090606090610eca90610120850190610d08565b930151151591015290565b908060208354918281520160208260051b840101935f5260205f20925f905b838210610f0357505050505090565b9091929394601f19828203018452606081528554606082015260018601546080820152600286015460a0820152600386015460ff81166004811015610e115760c08301526001600160a01b03600891821c811660e0840152600488015481166101008401526005880154811661012084015260068801541661014083015260078701546101608301528601546101808083019190915260098701546101a08301526101c0820152600190602090600d90610fd7610fc76101e08301600a8c01610c3b565b82810385840152600b8b01610c3b565b906040600c8b015491015297019401920190939293610ef4565b610e019060018060a01b03600354168152600454602082015260a0604082015261103161102260a083016005610ed5565b82810360608401526006610ed5565b9060808183039101526007610c3b565b9190820180921161104e57565b634e487b7160e01b5f52601160045260245ffd5b6040519060a0820182811067ffffffffffffffff821117610cf457604052815f81525f60208201525f60408201525f606082015260405190608082019082821067ffffffffffffffff831117610cf4576080916040525f83525f6020840152606060408401525f60608401520152565b91906110dc611062565b6001600160a01b0390931680845260208401919091526040830152565b905f602091828151910182855af115610508575f513d61114857506001600160a01b0381163b155b6111285750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b60011415611121565b91818302915f19818509938380861095039480860395146111e157848311156111c95790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b50508092501561072857049056fea2646970667358221220d7c8c2f17efce607284d62466051aec3e13f6f1e6deb7e056420af021f77a8ae64736f6c634300081b0033000000000000000000000000888888888889758f76e7103c6cbf23abbf58f946", - "nonce": "0x6a", + "input": "0x60c0604052346100f757604051601f61132138819003918201601f19168301916001600160401b038311848410176100e3578084926020946040528339810103126100f757516001600160a01b038116908190036100f7573060805260405160a081016001600160401b038111828210176100e357655af3107a4000916080916040525f81525f1960208201525f6040820152610100606082015201525f6008555f196009555f600a55610100600b55655af3107a4000600c5560a05260405161122590816100fc82396080518161025d015260a0518181816089015261031d0152f35b634e487b7160e01b5f52604160045260245ffd5b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816309316dd314610b30575080633268263b14610ac45780634ebfc81414610a855780636563c0e9146109b95780639df303251461084e578063e0a80413146101f8578063f66a7749146100bc5763f887ea4014610074575f80fd5b346100b8575f3660031901126100b8576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b346100b8575f3660031901126100b8575f54604051905f6001548060011c91600182169182156101ee575b6020841083146101da5783865285929081156101bb575060011461015c575b61011292500383610cd2565b60ff60025416610150604051938361012e8660ff819716610e04565b60081c6001600160a01b03166020850152608060408501819052840190610d08565b90151560608301520390f35b5060015f90815290917fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b81831061019f57505090602061011292820101610106565b6020919350806001915483858901015201910190918492610187565b6020925061011294915060ff191682840152151560051b820101610106565b634e487b7160e01b5f52602260045260245ffd5b92607f16926100e7565b346100b85760803660031901126100b857610211610d2c565b610219610d42565b60443567ffffffffffffffff81116100b857610239903690600401610d58565b9160643567ffffffffffffffff81116100b85761025a903690600401610d58565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316301461083f5783516001600160a01b0393841694919093169260208083019291820191909103126100b85751916060828051810103126100b85760208201516001600160a01b03811691908290036100b857606060408401519301519460405195630b2339af60e21b8752606087600481875afa968715610508575f976107d2575b50604051636eb1769f60e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316602482018190529590602081604481885afa80156105085788905f9061079c575b6103709250611041565b60405163095ea7b360e01b60208083019182526001600160a01b038a1660248401526044808401949094529282529091905f906103ae606485610cd2565b83519082895af15f513d82610780575b50501561073c575b506103d2818884611151565b90801561072857876103e79309151590611041565b956001600160a01b0316818103610513575050935f606094939261047e9661040d611062565b95818752602087015260408601526104906040519788968795869463640fc23d60e11b86523060048701526024860152604485015260085460648501526009546084850152600a5460a4850152600b5460c4850152600c5460e4850152610140610104850152610144840190610e40565b82810360031901610124840152610ff1565b03925af18015610508576104d3915f916104d7575b505b604051906020820152602081526104bf604082610cd2565b604051918291602083526020830190610d08565b0390f35b6104f9915060603d606011610501575b6104f18183610cd2565b810190610e25565b5050826104a5565b503d6104e7565b6040513d5f823e3d90fd5b9150949391604051630bc4ed8360e21b8152602081600481865afa908115610508575f916106ed575b50156106535750936020600494956040519586809263781c18db60e01b82525afa938415610508575f9461060b575b50905f61057f6105bc9660409695946110d2565b938551968795869485936323f8ef1160e11b855230600486015260018060a01b031660248501526044840152608060648401526084830190610e40565b03925af18015610508575f906105d7575b6104d391506104a7565b506040813d604011610603575b816105f160409383610cd2565b810103126100b8576104d390516105cd565b3d91506105e4565b90929193506020813d60201161064b575b8161062960209383610cd2565b810103126100b85751926001600160a01b03841684036100b85790915f61056b565b3d915061061c565b929190505f6106676060956106a0976110d2565b936106b160405197889687958694631652a23360e21b86523060048701526024860152604485015260a0606485015260a4840190610e40565b828103600319016084840152610ff1565b03925af18015610508576104d3915f916106cc575b506104a7565b6106e5915060603d606011610501576104f18183610cd2565b5050826106c6565b90506020813d602011610720575b8161070860209383610cd2565b810103126100b8575180151581036100b8578761053c565b3d91506106fb565b634e487b7160e01b5f52601260045260245ffd5b61077a9061077460405163095ea7b360e01b60208201528960248201525f60448201526044815261076e606482610cd2565b876110f9565b856110f9565b886103c6565b9091506107945750843b15155b8a806103be565b60011461078d565b50506020813d6020116107ca575b816107b760209383610cd2565b810103126100b857876103709151610366565b3d91506107aa565b9096506060813d606011610837575b816107ee60609383610cd2565b810103126100b85780516001600160a01b038116036100b8576020810151906001600160a01b03821682036100b857604001516001600160a01b038116036100b8579587610307565b3d91506107e1565b6302f3451d60e21b5f5260045ffd5b346100b85761085c36610dae565b80516001600160a01b039093169260208083019291820191909103126100b85751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa908115610508575f91610985575b50610903936109116108d06020945f94611041565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f198101875286610cd2565b84519082855af15f513d82610969575b50501561092a57005b610962610967936040519063095ea7b360e01b602083015260248201525f60448201526044815261095c606482610cd2565b826110f9565b6110f9565b005b90915061097d5750803b15155b8480610921565b600114610976565b90506020813d6020116109b1575b816109a060209383610cd2565b810103126100b857516109036108bb565b3d9150610993565b346100b85760803660031901126100b8576109d2610d2c565b6109da610d42565b6044356001600160a01b03811692908390036100b85760643567ffffffffffffffff81116100b857610a10903690600401610d58565b602081519181808201938492010103126100b857515f198114610a765761096793604051936323b872dd60e01b602086015260018060a01b031660248501526044840152606483015260648252610a68608483610cd2565b6001600160a01b03166110f9565b630d550c3b60e11b5f5260045ffd5b346100b8575f3660031901126100b85760a0600854600954600a54600b5490600c54926040519485526020850152604084015260608301526080820152f35b346100b857610ad236610dae565b602081939293519181808201938492010103126100b85751905f198214610a765760405163a9059cbb60e01b60208201526001600160a01b039390931660248401526044808401929092529082526109679190610a68606483610cd2565b346100b8575f3660031901126100b85760018060a01b0360035416600454915f6007548060011c90600181168015610c31575b6020831081146101da57828552908115610c0d5750600114610baf575b5090610b91816104d3930382610cd2565b60405193849384526020840152606060408401526060830190610d08565b60075f9081527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688939250905b808210610bf357509091508101602001610b91610b80565b919260018160209254838588010152019101909291610bdb565b60ff191660208086019190915291151560051b84019091019150610b919050610b80565b91607f1691610b63565b5f92918154918260011c92600181168015610cc8575b6020851081146101da57848452908115610cab5750600114610c7257505050565b5f9081526020812093945091925b838310610c91575060209250010190565b600181602092949394548385870101520191019190610c80565b915050602093945060ff929192191683830152151560051b010190565b93607f1693610c51565b90601f8019910116810190811067ffffffffffffffff821117610cf457604052565b634e487b7160e01b5f52604160045260245ffd5b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036100b857565b602435906001600160a01b03821682036100b857565b81601f820112156100b85780359067ffffffffffffffff8211610cf45760405192610d8d601f8401601f191660200185610cd2565b828452602083830101116100b857815f926020809301838601378301015290565b60606003198201126100b8576004356001600160a01b03811681036100b857916024356001600160a01b03811681036100b857916044359067ffffffffffffffff82116100b857610e0191600401610d58565b90565b90600b821015610e115752565b634e487b7160e01b5f52602160045260245ffd5b908160609103126100b8578051916040602083015192015190565b60809060018060a01b0381511683526020810151602084015260018060a01b03604082015116604084015260018060a01b03606082015116606084015201519060a06080820152610e9560a082018351610e04565b60208201516001600160a01b031660c08201526040820151608060e083015261010090606090610eca90610120850190610d08565b930151151591015290565b908060208354918281520160208260051b840101935f5260205f20925f905b838210610f0357505050505090565b9091929394601f19828203018452606081528554606082015260018601546080820152600286015460a0820152600386015460ff81166004811015610e115760c08301526001600160a01b03600891821c811660e0840152600488015481166101008401526005880154811661012084015260068801541661014083015260078701546101608301528601546101808083019190915260098701546101a08301526101c0820152600190602090600d90610fd7610fc76101e08301600a8c01610c3b565b82810385840152600b8b01610c3b565b906040600c8b015491015297019401920190939293610ef4565b610e019060018060a01b03600354168152600454602082015260a0604082015261103161102260a083016005610ed5565b82810360608401526006610ed5565b9060808183039101526007610c3b565b9190820180921161104e57565b634e487b7160e01b5f52601160045260245ffd5b6040519060a0820182811067ffffffffffffffff821117610cf457604052815f81525f60208201525f60408201525f606082015260405190608082019082821067ffffffffffffffff831117610cf4576080916040525f83525f6020840152606060408401525f60608401520152565b91906110dc611062565b6001600160a01b0390931680845260208401919091526040830152565b905f602091828151910182855af115610508575f513d61114857506001600160a01b0381163b155b6111285750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b60011415611121565b91818302915f19818509938380861095039480860395146111e157848311156111c95790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b50508092501561072857049056fea26469706673582212205bf94e5371bc2f132405be99261f2b9351cbdbf49e328ca512e068eee1eda9d164736f6c634300081d0033000000000000000000000000888888888889758f76e7103c6cbf23abbf58f946", + "nonce": "0x93", "chainId": "0x38" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0x709bea00a7c8fa356f7319c373ae8d41091418bda63325bb1c3eed74a3a52f63", + "hash": "0x01a7ad0206efe61d71d44c27771a17bfd3236340b7099e2d53ac412de3545478", "transactionType": "CREATE", - "contractName": null, - "contractAddress": "0x37ba9934aaba7a49cc29d0952c6a91d7c7043dbc", + "contractName": "ERC4626VaultAdapterV2", + "contractAddress": "0x4f97afab57dc87401558059790445c65c3dc58b8", "function": null, "arguments": null, "transaction": { "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "gas": "0xaf02f", "value": "0x0", - "input": "0x60a0806040523460215730608052610900908161002682396080518160aa0152f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146106395780636563c0e91461056d5780639df303251461040d5763e0a8041314610045575f80fd5b346102a35760803660031901126102a35761005e6106a5565b6100666106bb565b9060443567ffffffffffffffff81116102a357610087903690600401610707565b60643567ffffffffffffffff81116102a3576100a7903690600401610707565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630146103fe5781516001600160a01b039182169490911691602080820192820191909103126102a35751926060838051810103126102a35760208301519260028410156102a357606060408201519101519061012f81878461082c565b9080156103ea578661014493091515906107b3565b92806103525750604051636eb1769f60e11b815230600482015260248101839052602081604481855afa9081156102af575f9161031a575b50846020939261018f5f976044946107b3565b60405163095ea7b360e01b8782019081526001600160a01b038716602483015260448083019390935291815290869089906101cb6064856106d1565b83519082865af188513d826102fb575b5050156102ba575b50506040519586938492636e553f6560e01b845260048401523060248401525af19182156102af575f92610277575b50818181106102625750505b60408051602081019283526020815261023782826106d1565b8151928391602083525180918160208501528484015e5f828201840152601f01601f19168101030190f35b63eb7f211d60e01b5f5260045260245260445ffd5b9091506020813d6020116102a7575b81610293602093836106d1565b810103126102a35751905f610212565b5f80fd5b3d9150610286565b6040513d5f823e3d90fd5b6102f4916102ef60405163095ea7b360e01b898201528760248201528a878201528681526102e96064826106d1565b826107d4565b6107d4565b5f806101e3565b9091501589146103125750813b15155b5f806101db565b60011461030b565b90506020929192813d60201161034a575b81610338602093836106d1565b810103126102a357519091908461017c565b3d915061032b565b909391506001036103db575f9260646020926040519586938492635d043b2960e11b845260048401523060248401523060448401525af19182156102af575f926103a7575b508181811061026257505061021e565b9091506020813d6020116103d3575b816103c3602093836106d1565b810103126102a35751905f610397565b3d91506103b6565b634a7f394f60e01b5f5260045ffd5b634e487b7160e01b5f52601260045260245ffd5b6302f3451d60e21b5f5260045ffd5b346102a35761041b3661075d565b80516001600160a01b039093169260208083019291820191909103126102a35751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa9081156102af575f91610539575b506104c2936104d061048f6020945f946107b3565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f1981018752866106d1565b84519082855af15f513d8261051d575b5050156104e957005b6102ef61051b936040519063095ea7b360e01b602083015260248201525f6044820152604481526102e96064826106d1565b005b9091506105315750803b15155b84806104e0565b60011461052a565b90506020813d602011610565575b81610554602093836106d1565b810103126102a357516104c261047a565b3d9150610547565b346102a35760803660031901126102a3576105866106a5565b61058e6106bb565b6044356001600160a01b03811692908390036102a35760643567ffffffffffffffff81116102a3576105c4903690600401610707565b602081519181808201938492010103126102a357515f19811461062a5761051b93604051936323b872dd60e01b602086015260018060a01b03166024850152604484015260648301526064825261061c6084836106d1565b6001600160a01b03166107d4565b630d550c3b60e11b5f5260045ffd5b346102a3576106473661075d565b602081939293519181808201938492010103126102a35751905f19821461062a5760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261051b919061061c6064836106d1565b600435906001600160a01b03821682036102a357565b602435906001600160a01b03821682036102a357565b90601f8019910116810190811067ffffffffffffffff8211176106f357604052565b634e487b7160e01b5f52604160045260245ffd5b81601f820112156102a35780359067ffffffffffffffff82116106f3576040519261073c601f8401601f1916602001856106d1565b828452602083830101116102a357815f926020809301838601378301015290565b60606003198201126102a3576004356001600160a01b03811681036102a357916024356001600160a01b03811681036102a357916044359067ffffffffffffffff82116102a3576107b091600401610707565b90565b919082018092116107c057565b634e487b7160e01b5f52601160045260245ffd5b905f602091828151910182855af1156102af575f513d61082357506001600160a01b0381163b155b6108035750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156107fc565b91818302915f19818509938380861095039480860395146108bc57848311156108a45790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b5050809250156103ea57049056fea2646970667358221220b9f441923fe75e1f6e0f37bda35dde1cbac73c1e69240288bd35172a90f8e35164736f6c634300081b0033", - "nonce": "0x6b", + "input": "0x60a0806040523460215730608052610900908161002682396080518160aa0152f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c80633268263b146106395780636563c0e91461056d5780639df303251461040d5763e0a8041314610045575f80fd5b346102a35760803660031901126102a35761005e6106a5565b6100666106bb565b9060443567ffffffffffffffff81116102a357610087903690600401610707565b60643567ffffffffffffffff81116102a3576100a7903690600401610707565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630146103fe5781516001600160a01b039182169490911691602080820192820191909103126102a35751926060838051810103126102a35760208301519260028410156102a357606060408201519101519061012f81878461082c565b9080156103ea578661014493091515906107b3565b92806103525750604051636eb1769f60e11b815230600482015260248101839052602081604481855afa9081156102af575f9161031a575b50846020939261018f5f976044946107b3565b60405163095ea7b360e01b8782019081526001600160a01b038716602483015260448083019390935291815290869089906101cb6064856106d1565b83519082865af188513d826102fb575b5050156102ba575b50506040519586938492636e553f6560e01b845260048401523060248401525af19182156102af575f92610277575b50818181106102625750505b60408051602081019283526020815261023782826106d1565b8151928391602083525180918160208501528484015e5f828201840152601f01601f19168101030190f35b63eb7f211d60e01b5f5260045260245260445ffd5b9091506020813d6020116102a7575b81610293602093836106d1565b810103126102a35751905f610212565b5f80fd5b3d9150610286565b6040513d5f823e3d90fd5b6102f4916102ef60405163095ea7b360e01b898201528760248201528a878201528681526102e96064826106d1565b826107d4565b6107d4565b5f806101e3565b9091501589146103125750813b15155b5f806101db565b60011461030b565b90506020929192813d60201161034a575b81610338602093836106d1565b810103126102a357519091908461017c565b3d915061032b565b909391506001036103db575f9260646020926040519586938492635d043b2960e11b845260048401523060248401523060448401525af19182156102af575f926103a7575b508181811061026257505061021e565b9091506020813d6020116103d3575b816103c3602093836106d1565b810103126102a35751905f610397565b3d91506103b6565b634a7f394f60e01b5f5260045ffd5b634e487b7160e01b5f52601260045260245ffd5b6302f3451d60e21b5f5260045ffd5b346102a35761041b3661075d565b80516001600160a01b039093169260208083019291820191909103126102a35751604051636eb1769f60e11b81523060048201526001600160a01b03831660248201819052939190602081604481865afa9081156102af575f91610539575b506104c2936104d061048f6020945f946107b3565b60405163095ea7b360e01b8682019081526001600160a01b03909416602482015260448101919091529586906064820190565b03601f1981018752866106d1565b84519082855af15f513d8261051d575b5050156104e957005b6102ef61051b936040519063095ea7b360e01b602083015260248201525f6044820152604481526102e96064826106d1565b005b9091506105315750803b15155b84806104e0565b60011461052a565b90506020813d602011610565575b81610554602093836106d1565b810103126102a357516104c261047a565b3d9150610547565b346102a35760803660031901126102a3576105866106a5565b61058e6106bb565b6044356001600160a01b03811692908390036102a35760643567ffffffffffffffff81116102a3576105c4903690600401610707565b602081519181808201938492010103126102a357515f19811461062a5761051b93604051936323b872dd60e01b602086015260018060a01b03166024850152604484015260648301526064825261061c6084836106d1565b6001600160a01b03166107d4565b630d550c3b60e11b5f5260045ffd5b346102a3576106473661075d565b602081939293519181808201938492010103126102a35751905f19821461062a5760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261051b919061061c6064836106d1565b600435906001600160a01b03821682036102a357565b602435906001600160a01b03821682036102a357565b90601f8019910116810190811067ffffffffffffffff8211176106f357604052565b634e487b7160e01b5f52604160045260245ffd5b81601f820112156102a35780359067ffffffffffffffff82116106f3576040519261073c601f8401601f1916602001856106d1565b828452602083830101116102a357815f926020809301838601378301015290565b60606003198201126102a3576004356001600160a01b03811681036102a357916024356001600160a01b03811681036102a357916044359067ffffffffffffffff82116102a3576107b091600401610707565b90565b919082018092116107c057565b634e487b7160e01b5f52601160045260245ffd5b905f602091828151910182855af1156102af575f513d61082357506001600160a01b0381163b155b6108035750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156107fc565b91818302915f19818509938380861095039480860395146108bc57848311156108a45790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b5050809250156103ea57049056fea26469706673582212208494a0174c4f07fd048515a6e3e22a540bf8edf31a0e807f0e3019b7d5b7c74464736f6c634300081d0033", + "nonce": "0x94", "chainId": "0x38" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0x724d2e4ac0e7a0bb1ded7e087a57ce13bcb1a738f07297bbd90bdc246ee0c507", + "hash": "0x1aa51ef1edbfe18d2df2424e675220763cc6da7b8a8164f10f262ebf04fd2e70", "transactionType": "CALL", - "contractName": null, + "contractName": "ERC1967Proxy", "contractAddress": "0x9498764f0c62257b83a04e2a757de30908ec793d", - "function": "setAdapterWhitelist(address,address,bool)", - "arguments": [ - "0xb7634dB4f4710bb992118bC37d1F63e00e2704A4", - "0xa715005c1A8524C0790029153B8a860F96a2a856", - "true" - ], + "function": null, + "arguments": null, "transaction": { "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": "0x9498764f0c62257b83a04e2a757de30908ec793d", - "gas": "0x16bd9", + "gas": "0x157eb", "value": "0x0", - "input": "0xb6b07b8e000000000000000000000000b7634db4f4710bb992118bc37d1f63e00e2704a4000000000000000000000000a715005c1a8524c0790029153b8a860f96a2a8560000000000000000000000000000000000000000000000000000000000000001", - "nonce": "0x6c", + "input": "0xb6b07b8e000000000000000000000000b7634db4f4710bb992118bc37d1f63e00e2704a4000000000000000000000000c82473b4b712440e3fc311d8439f65aa38556c380000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x95", "chainId": "0x38" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0x47a97180396aa6437c248d3d22f9f98ae5d6be5a7ed978df6067fdc572ec69ee", + "hash": "0x3e64090a8e39d325a6c6360879122272bdb7808a0947a2b5023269bcb121a91b", "transactionType": "CALL", - "contractName": null, + "contractName": "ERC1967Proxy", "contractAddress": "0x9498764f0c62257b83a04e2a757de30908ec793d", - "function": "setAdapterWhitelist(address,address,bool)", - "arguments": [ - "0xb7634dB4f4710bb992118bC37d1F63e00e2704A4", - "0x954529F8f103bde464fc6d02a94CD40c5BD322D1", - "true" - ], + "function": null, + "arguments": null, "transaction": { "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": "0x9498764f0c62257b83a04e2a757de30908ec793d", - "gas": "0x16bfc", + "gas": "0x16c16", "value": "0x0", - "input": "0xb6b07b8e000000000000000000000000b7634db4f4710bb992118bc37d1f63e00e2704a4000000000000000000000000954529f8f103bde464fc6d02a94cd40c5bd322d10000000000000000000000000000000000000000000000000000000000000001", - "nonce": "0x6d", + "input": "0xb6b07b8e000000000000000000000000b7634db4f4710bb992118bc37d1f63e00e2704a40000000000000000000000005bbc23e84c248b0563fcfd25b100891625de90cd0000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x96", "chainId": "0x38" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0xfe8da01c9f5bbf05f6977ae46e9abf20fec80443b55230617a466681ad49c165", + "hash": "0xe9c94ee38972d870abd7e19e9f9fe3b2ecfa6187e4598c3e745a25ac7186546b", "transactionType": "CALL", - "contractName": null, + "contractName": "ERC1967Proxy", "contractAddress": "0x9498764f0c62257b83a04e2a757de30908ec793d", - "function": "setAdapterWhitelist(address,address,bool)", - "arguments": [ - "0xb7634dB4f4710bb992118bC37d1F63e00e2704A4", - "0x883192eFdD5a3417B2C0A14B25F7536B2018f853", - "true" - ], + "function": null, + "arguments": null, "transaction": { "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": "0x9498764f0c62257b83a04e2a757de30908ec793d", - "gas": "0x16bfc", + "gas": "0x157eb", "value": "0x0", - "input": "0xb6b07b8e000000000000000000000000b7634db4f4710bb992118bc37d1f63e00e2704a4000000000000000000000000883192efdd5a3417b2c0a14b25f7536b2018f8530000000000000000000000000000000000000000000000000000000000000001", - "nonce": "0x6e", + "input": "0xb6b07b8e000000000000000000000000b7634db4f4710bb992118bc37d1f63e00e2704a400000000000000000000000005d171617fe60ba27992f238686d3eb3b3cadca00000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x97", "chainId": "0x38" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0x85e1ff3ae45a12bf2c85ec58786f498fbee7e9336f0bc59866804f9a2c20f57c", + "hash": "0x21ccc140d2149087fd6de3428c89061b7fa5f7c126d70ce7a51f6b3ce3cfcbbd", "transactionType": "CALL", - "contractName": null, + "contractName": "ERC1967Proxy", "contractAddress": "0x9498764f0c62257b83a04e2a757de30908ec793d", - "function": "setAdapterWhitelist(address,address,bool)", - "arguments": [ - "0xb7634dB4f4710bb992118bC37d1F63e00e2704A4", - "0x37Ba9934aAbA7a49cC29d0952C6a91d7c7043dbc", - "true" - ], + "function": null, + "arguments": null, "transaction": { "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": "0x9498764f0c62257b83a04e2a757de30908ec793d", - "gas": "0x16bfc", + "gas": "0x157eb", "value": "0x0", - "input": "0xb6b07b8e000000000000000000000000b7634db4f4710bb992118bc37d1f63e00e2704a400000000000000000000000037ba9934aaba7a49cc29d0952c6a91d7c7043dbc0000000000000000000000000000000000000000000000000000000000000001", - "nonce": "0x6f", + "input": "0xb6b07b8e000000000000000000000000b7634db4f4710bb992118bc37d1f63e00e2704a40000000000000000000000004f97afab57dc87401558059790445c65c3dc58b80000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x98", "chainId": "0x38" }, "additionalContracts": [], @@ -168,93 +158,93 @@ "receipts": [ { "status": "0x1", - "cumulativeGasUsed": "0x1dcc851", + "cumulativeGasUsed": "0x1232150", "logs": [], "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "type": "0x0", - "transactionHash": "0xb32193b7701f1ac3b05a64bbba6a975bd5c8c127c560012ff8465a5225bd6394", - "transactionIndex": "0xaa", - "blockHash": "0xebb1abc4b4c26953dc48c046130ff80aa6ebd5fd6e165e515e9a9d96ffb99d4b", - "blockNumber": "0x3172a9f", - "gasUsed": "0x8f942", + "type": "0x2", + "transactionHash": "0x5a8363cd7ce4fe7b65f82b1ea3faf2d6f44fed481f7c30aab763fdae5feebbb9", + "transactionIndex": "0x64", + "blockHash": "0x1a876ac50193a1bb2df3420361ba2e5c2c41f5903ef8f1526093806164292455", + "blockNumber": "0x31ee37a", + "gasUsed": "0x8f94e", "effectiveGasPrice": "0x5f5e100", "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": null, - "contractAddress": "0xa715005c1a8524c0790029153b8a860f96a2a856" + "contractAddress": "0xc82473b4b712440e3fc311d8439f65aa38556c38" }, { "status": "0x1", - "cumulativeGasUsed": "0x2bed985", + "cumulativeGasUsed": "0xf63232", "logs": [], "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "type": "0x0", - "transactionHash": "0x40a0b6934d478af6b50604988e0b8ba77ade700fe2cd94c5c96d2c176d5b709a", - "transactionIndex": "0xca", - "blockHash": "0x948f7b1fe8745b3436a405ebfd8c87fa22951a3943dd20a8274ef4645461f60b", - "blockNumber": "0x3172aa5", + "type": "0x2", + "transactionHash": "0xa85ce580b099d8dc8e505fea81d56fb795f70a6719dd24aceea8424d3e1cf59f", + "transactionIndex": "0x5b", + "blockHash": "0x3f2e355c16e55682dabed4cb0b4586c4789b36b8631ffbfbeb339da5ef747136", + "blockNumber": "0x31ee37e", "gasUsed": "0x9b394", "effectiveGasPrice": "0x5f5e100", "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": null, - "contractAddress": "0x954529f8f103bde464fc6d02a94cd40c5bd322d1" + "contractAddress": "0x5bbc23e84c248b0563fcfd25b100891625de90cd" }, { "status": "0x1", - "cumulativeGasUsed": "0x23598f4", + "cumulativeGasUsed": "0x16456e9", "logs": [], "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "type": "0x0", - "transactionHash": "0x5a2688b1f57dd655d926a6ca0a0b8a785e9620074522e880f0404daf7aed6670", - "transactionIndex": "0xe7", - "blockHash": "0x10ddd55d604533607682c18f04e653254dd10e6eb35ef891f2dfe155a40a0fa3", - "blockNumber": "0x3172aab", + "type": "0x2", + "transactionHash": "0xb2df9e463fe051f79052b99af12b7beff77f8f59e5b76286ea830c67b696bd82", + "transactionIndex": "0x85", + "blockHash": "0xa565832078c5e7e77aad47380d4cf9b800c701bb59f25baa07e46fc91faa77f0", + "blockNumber": "0x31ee382", "gasUsed": "0x1142f4", "effectiveGasPrice": "0x5f5e100", "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": null, - "contractAddress": "0x883192efdd5a3417b2c0a14b25f7536b2018f853" + "contractAddress": "0x05d171617fe60ba27992f238686d3eb3b3cadca0" }, { "status": "0x1", - "cumulativeGasUsed": "0x1c32760", + "cumulativeGasUsed": "0x10dd6f5", "logs": [], "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "type": "0x0", - "transactionHash": "0x709bea00a7c8fa356f7319c373ae8d41091418bda63325bb1c3eed74a3a52f63", - "transactionIndex": "0xbd", - "blockHash": "0x99620fdfcb6ce61efe98e50614933d0793c1d2828f3b6343cf6def450c92e48f", - "blockNumber": "0x3172ab1", + "type": "0x2", + "transactionHash": "0x01a7ad0206efe61d71d44c27771a17bfd3236340b7099e2d53ac412de3545478", + "transactionIndex": "0x77", + "blockHash": "0xab0ef41d455d8f3a57f160fd4d3a85c519f315bc0ef508143868cf8f7965d3b7", + "blockNumber": "0x31ee387", "gasUsed": "0x869fd", "effectiveGasPrice": "0x5f5e100", "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": null, - "contractAddress": "0x37ba9934aaba7a49cc29d0952c6a91d7c7043dbc" + "contractAddress": "0x4f97afab57dc87401558059790445c65c3dc58b8" }, { "status": "0x1", - "cumulativeGasUsed": "0xd23815", + "cumulativeGasUsed": "0x1518178", "logs": [ { "address": "0xb7634db4f4710bb992118bc37d1f63e00e2704a4", "topics": [ "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" ], - "data": "0x000000000000000000000000a715005c1a8524c0790029153b8a860f96a2a8560000000000000000000000000000000000000000000000000000000000000001", - "blockHash": "0x90dce315acbe5ac18306df007f6a2c449655dfb4a4fcdbda37efc947b9e79493", - "blockNumber": "0x3172ab7", - "transactionHash": "0x724d2e4ac0e7a0bb1ded7e087a57ce13bcb1a738f07297bbd90bdc246ee0c507", - "transactionIndex": "0x55", - "logIndex": "0x20e", + "data": "0x000000000000000000000000c82473b4b712440e3fc311d8439f65aa38556c380000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x28bcf1f06ef77a9aa314560e9111e1ba6fffb5f632d0ab3bbfc76a6d42bccb13", + "blockNumber": "0x31ee38b", + "transactionHash": "0x1aa51ef1edbfe18d2df2424e675220763cc6da7b8a8164f10f262ebf04fd2e70", + "transactionIndex": "0x7a", + "logIndex": "0x33d", "removed": false } ], "logsBloom": "0x00000000000000000000000000000000000000000000008000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000020000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "type": "0x0", - "transactionHash": "0x724d2e4ac0e7a0bb1ded7e087a57ce13bcb1a738f07297bbd90bdc246ee0c507", - "transactionIndex": "0x55", - "blockHash": "0x90dce315acbe5ac18306df007f6a2c449655dfb4a4fcdbda37efc947b9e79493", - "blockNumber": "0x3172ab7", - "gasUsed": "0xf8c9", + "type": "0x2", + "transactionHash": "0x1aa51ef1edbfe18d2df2424e675220763cc6da7b8a8164f10f262ebf04fd2e70", + "transactionIndex": "0x7a", + "blockHash": "0x28bcf1f06ef77a9aa314560e9111e1ba6fffb5f632d0ab3bbfc76a6d42bccb13", + "blockNumber": "0x31ee38b", + "gasUsed": "0xf8ff", "effectiveGasPrice": "0x5f5e100", "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": "0x9498764f0c62257b83a04e2a757de30908ec793d", @@ -262,29 +252,29 @@ }, { "status": "0x1", - "cumulativeGasUsed": "0x1c08189", + "cumulativeGasUsed": "0x9a4d3b", "logs": [ { "address": "0xb7634db4f4710bb992118bc37d1f63e00e2704a4", "topics": [ "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" ], - "data": "0x000000000000000000000000954529f8f103bde464fc6d02a94cd40c5bd322d10000000000000000000000000000000000000000000000000000000000000001", - "blockHash": "0x2159815fbbdf47cbd5977899ab4310575f978b1e1f07f68a064e8974884f253b", - "blockNumber": "0x3172abd", - "transactionHash": "0x47a97180396aa6437c248d3d22f9f98ae5d6be5a7ed978df6067fdc572ec69ee", - "transactionIndex": "0xbb", - "logIndex": "0x442", + "data": "0x0000000000000000000000005bbc23e84c248b0563fcfd25b100891625de90cd0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x6bd8082b4410f630b00623c95227c81b130b0e6f13edd412e219676b2429e8f8", + "blockNumber": "0x31ee390", + "transactionHash": "0x3e64090a8e39d325a6c6360879122272bdb7808a0947a2b5023269bcb121a91b", + "transactionIndex": "0x3d", + "logIndex": "0x189", "removed": false } ], "logsBloom": "0x00000000000000000000000000000000000000000000008000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000020000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "type": "0x0", - "transactionHash": "0x47a97180396aa6437c248d3d22f9f98ae5d6be5a7ed978df6067fdc572ec69ee", - "transactionIndex": "0xbb", - "blockHash": "0x2159815fbbdf47cbd5977899ab4310575f978b1e1f07f68a064e8974884f253b", - "blockNumber": "0x3172abd", - "gasUsed": "0xf8e1", + "type": "0x2", + "transactionHash": "0x3e64090a8e39d325a6c6360879122272bdb7808a0947a2b5023269bcb121a91b", + "transactionIndex": "0x3d", + "blockHash": "0x6bd8082b4410f630b00623c95227c81b130b0e6f13edd412e219676b2429e8f8", + "blockNumber": "0x31ee390", + "gasUsed": "0xf8f3", "effectiveGasPrice": "0x5f5e100", "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": "0x9498764f0c62257b83a04e2a757de30908ec793d", @@ -292,29 +282,29 @@ }, { "status": "0x1", - "cumulativeGasUsed": "0x1afbd5d", + "cumulativeGasUsed": "0xdd243c", "logs": [ { "address": "0xb7634db4f4710bb992118bc37d1f63e00e2704a4", "topics": [ "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" ], - "data": "0x000000000000000000000000883192efdd5a3417b2c0a14b25f7536b2018f8530000000000000000000000000000000000000000000000000000000000000001", - "blockHash": "0x45e5b88ceb76c660bcac0af5a7a69390b2f6c5d93cadd2884dd13cc6f6b763a2", - "blockNumber": "0x3172ac3", - "transactionHash": "0xfe8da01c9f5bbf05f6977ae46e9abf20fec80443b55230617a466681ad49c165", - "transactionIndex": "0xb9", - "logIndex": "0x414", + "data": "0x00000000000000000000000005d171617fe60ba27992f238686d3eb3b3cadca00000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xbc85ddbeccc09a93289da4f0bfa65daa489f580256b67f913807335e22750b2d", + "blockNumber": "0x31ee394", + "transactionHash": "0xe9c94ee38972d870abd7e19e9f9fe3b2ecfa6187e4598c3e745a25ac7186546b", + "transactionIndex": "0x4b", + "logIndex": "0x1d3", "removed": false } ], "logsBloom": "0x00000000000000000000000000000000000000000000008000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000020000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "type": "0x0", - "transactionHash": "0xfe8da01c9f5bbf05f6977ae46e9abf20fec80443b55230617a466681ad49c165", - "transactionIndex": "0xb9", - "blockHash": "0x45e5b88ceb76c660bcac0af5a7a69390b2f6c5d93cadd2884dd13cc6f6b763a2", - "blockNumber": "0x3172ac3", - "gasUsed": "0xf8e1", + "type": "0x2", + "transactionHash": "0xe9c94ee38972d870abd7e19e9f9fe3b2ecfa6187e4598c3e745a25ac7186546b", + "transactionIndex": "0x4b", + "blockHash": "0xbc85ddbeccc09a93289da4f0bfa65daa489f580256b67f913807335e22750b2d", + "blockNumber": "0x31ee394", + "gasUsed": "0xf8ff", "effectiveGasPrice": "0x5f5e100", "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": "0x9498764f0c62257b83a04e2a757de30908ec793d", @@ -322,29 +312,29 @@ }, { "status": "0x1", - "cumulativeGasUsed": "0x18b7719", + "cumulativeGasUsed": "0x192348c", "logs": [ { "address": "0xb7634db4f4710bb992118bc37d1f63e00e2704a4", "topics": [ "0x4d0e05cb869768b74ed4952b2ce5d7d372bbf3f709dfe4e523da085a593ecfca" ], - "data": "0x00000000000000000000000037ba9934aaba7a49cc29d0952c6a91d7c7043dbc0000000000000000000000000000000000000000000000000000000000000001", - "blockHash": "0x5b47b3a43939983f321b1d50a9796ce32920e93f8a94ebb41f55bc612f3a4712", - "blockNumber": "0x3172ac9", - "transactionHash": "0x85e1ff3ae45a12bf2c85ec58786f498fbee7e9336f0bc59866804f9a2c20f57c", - "transactionIndex": "0xa7", - "logIndex": "0x3cc", + "data": "0x0000000000000000000000004f97afab57dc87401558059790445c65c3dc58b80000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0xf97fd76c8b3bd016291ea9789351e9024f1fb362b27c792444f70ddefbb9465c", + "blockNumber": "0x31ee398", + "transactionHash": "0x21ccc140d2149087fd6de3428c89061b7fa5f7c126d70ce7a51f6b3ce3cfcbbd", + "transactionIndex": "0x7f", + "logIndex": "0x48d", "removed": false } ], "logsBloom": "0x00000000000000000000000000000000000000000000008000000000000000000000000000800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000020000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "type": "0x0", - "transactionHash": "0x85e1ff3ae45a12bf2c85ec58786f498fbee7e9336f0bc59866804f9a2c20f57c", - "transactionIndex": "0xa7", - "blockHash": "0x5b47b3a43939983f321b1d50a9796ce32920e93f8a94ebb41f55bc612f3a4712", - "blockNumber": "0x3172ac9", - "gasUsed": "0xf8e1", + "type": "0x2", + "transactionHash": "0x21ccc140d2149087fd6de3428c89061b7fa5f7c126d70ce7a51f6b3ce3cfcbbd", + "transactionIndex": "0x7f", + "blockHash": "0xf97fd76c8b3bd016291ea9789351e9024f1fb362b27c792444f70ddefbb9465c", + "blockNumber": "0x31ee398", + "gasUsed": "0xf8ff", "effectiveGasPrice": "0x5f5e100", "from": "0x56e3665038c5f0b56cc7d81ac66c86521274b251", "to": "0x9498764f0c62257b83a04e2a757de30908ec793d", @@ -354,7 +344,7 @@ "libraries": [], "pending": [], "returns": {}, - "timestamp": 1750519209, + "timestamp": 1751264857, "chain": 56, - "commit": "907b45e" + "commit": "01db0f8" } \ No newline at end of file diff --git a/deployments/arb-mainnet/arb-mainnet-adapters-20250630.json b/deployments/arb-mainnet/arb-mainnet-adapters-20250630.json new file mode 100644 index 0000000..4120d87 --- /dev/null +++ b/deployments/arb-mainnet/arb-mainnet-adapters-20250630.json @@ -0,0 +1,18 @@ +{ + "network": "arb-mainnet", + "deployedAt": "1751264239", + "gitBranch": "v1_special_adapter", + "gitCommitHash": "0x01db0f8091230ac2c6befb08cc423cd7c3551428", + "blockInfo": { + "number": "352689369", + "timestamp": "1751264239" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "swapAdapter": { + "uniswapV3Adapter": "0x048a54Deae47c41f760c42622B114bB89B836A9f", + "odosV2Adapter": "0xb986312024C8e0f895B00eBA32C81B5759C91ffF", + "pendleSwapV3Adapter": "0xf95130ddFA9EB132a25B121a29991cEA989eBB7c", + "ERC4626VaultAdapter": "0x133BF41c23eDFb2F0EF586B5B01063a17470e294" + } +} \ No newline at end of file diff --git a/deployments/bnb-mainnet/bnb-mainnet-adapters-20250630.json b/deployments/bnb-mainnet/bnb-mainnet-adapters-20250630.json new file mode 100644 index 0000000..6d2af25 --- /dev/null +++ b/deployments/bnb-mainnet/bnb-mainnet-adapters-20250630.json @@ -0,0 +1,18 @@ +{ + "network": "bnb-mainnet", + "deployedAt": "1751264736", + "gitBranch": "v1_special_adapter", + "gitCommitHash": "0x01db0f8091230ac2c6befb08cc423cd7c3551428", + "blockInfo": { + "number": "52355938", + "timestamp": "1751264736" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "swapAdapter": { + "uniswapV3Adapter": "0xC82473B4b712440e3FC311D8439F65AA38556c38", + "odosV2Adapter": "0x5BBc23e84C248b0563FCfd25B100891625dE90CD", + "pendleSwapV3Adapter": "0x05D171617fE60BA27992f238686D3eB3B3cADCa0", + "ERC4626VaultAdapter": "0x4F97aFAb57dc87401558059790445C65c3Dc58b8" + } +} \ No newline at end of file diff --git a/deployments/eth-mainnet/eth-mainnet-adapters-20250629.json b/deployments/eth-mainnet/eth-mainnet-adapters-20250629.json new file mode 100644 index 0000000..fe474c0 --- /dev/null +++ b/deployments/eth-mainnet/eth-mainnet-adapters-20250629.json @@ -0,0 +1,18 @@ +{ + "network": "eth-mainnet", + "deployedAt": "1751205023", + "gitBranch": "v1_special_adapter", + "gitCommitHash": "0x01db0f8091230ac2c6befb08cc423cd7c3551428", + "blockInfo": { + "number": "22810493", + "timestamp": "1751205023" + }, + "deployer": "0x56E3665038C5F0b56Cc7D81aC66C86521274B251", + "admin": "0x8409a9C1A911CED491892c5694E43994c9d47E8f", + "swapAdapter": { + "uniswapV3Adapter": "0xE7a88Ab1329cAD4168563516E35753b979d0c7a9", + "odosV2Adapter": "0x24c7e21a91cDB7760798e02EA5639d4C60b0C442", + "pendleSwapV3Adapter": "0x15Aa533cdEd42c2E38d2BC3ece5Bd2bFcf3dD2c0", + "ERC4626VaultAdapter": "0x98b0C4c13068C3010a809174Af31061AeF547Fbe" + } +} \ No newline at end of file From 1fe579217606e38614b2461c71e110b433f73cac Mon Sep 17 00:00:00 2001 From: "Aaron C.-W. Liang" Date: Thu, 3 Jul 2025 22:16:28 +0800 Subject: [PATCH 140/194] fix warning and compile error --- script/deploy/DeployMarket.s.sol | 6 +++--- script/utils/ScriptBase.sol | 4 ++-- test/v1/Vault.t.sol | 2 +- test/v2/VaultV2.t.sol | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/script/deploy/DeployMarket.s.sol b/script/deploy/DeployMarket.s.sol index 4ea79d1..b91f3cb 100644 --- a/script/deploy/DeployMarket.s.sol +++ b/script/deploy/DeployMarket.s.sol @@ -168,7 +168,7 @@ contract DeloyMarket is DeployBase { console.log(); console.log("Treasurer:", treasurerAddr); - console.log("Maturity:", StringHelper.convertTimestampToDateString(marketConfig.maturity)); + console.log("Maturity:", StringHelper.convertTimestampToDateString(marketConfig.maturity, "YYYY-MM-DD")); console.log("Salt:", config.salt); console.log("Lend Taker Fee Ratio:", marketConfig.feeConfig.lendTakerFeeRatio); console.log("Lend Maker Fee Ratio:", marketConfig.feeConfig.lendMakerFeeRatio); @@ -218,7 +218,7 @@ contract DeloyMarket is DeployBase { "-", IERC20Metadata(collateralAddr).symbol(), "@", - StringHelper.convertTimestampToDateString(maturity), + StringHelper.convertTimestampToDateString(maturity, "YYYY-MM-DD"), ".json" ); } @@ -338,7 +338,7 @@ contract DeloyMarket is DeployBase { vm.toString(marketConfig.treasurer), '",\n', ' "maturity": "', - StringHelper.convertTimestampToDateString(marketConfig.maturity), + StringHelper.convertTimestampToDateString(marketConfig.maturity, "YYYY-MM-DD"), '",\n', ' "salt": "', vm.toString(salt), diff --git a/script/utils/ScriptBase.sol b/script/utils/ScriptBase.sol index d422941..636f102 100644 --- a/script/utils/ScriptBase.sol +++ b/script/utils/ScriptBase.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.27; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; -import {StringHelper} from "./StringHelper.sol"; +import {StringHelper} from "../utils/StringHelper.sol"; /** * @title ScriptBase @@ -12,7 +12,7 @@ import {StringHelper} from "./StringHelper.sol"; contract ScriptBase is Script { // Helper function to generate date suffix for JSON files function getDateSuffix() internal view returns (string memory) { - return StringHelper.convertTimestampToDateString(block.timestamp); + return StringHelper.convertTimestampToDateString(block.timestamp, "YYYY-MM-DD"); } // Helper function to create script execution file path with date suffix diff --git a/test/v1/Vault.t.sol b/test/v1/Vault.t.sol index 86615b6..695c0d5 100644 --- a/test/v1/Vault.t.sol +++ b/test/v1/Vault.t.sol @@ -1063,7 +1063,7 @@ contract VaultTest is Test { function testFixFindings101() public { vm.prank(curator); vault.createOrder(res.market, maxCapacity, 0, orderConfig.curveCuts); - address lper = vm.randomAddress(); + lper = vm.randomAddress(); res.debt.mint(lper, 100 ether); diff --git a/test/v2/VaultV2.t.sol b/test/v2/VaultV2.t.sol index 06d06b6..c3ecb00 100644 --- a/test/v2/VaultV2.t.sol +++ b/test/v2/VaultV2.t.sol @@ -938,7 +938,7 @@ contract VaultTestV2 is Test { function testFixFindings101() public { vm.prank(curator); vault.createOrder(res.market, maxCapacity, 0, orderConfig.curveCuts); - address lper = vm.randomAddress(); + lper = vm.randomAddress(); res.debt.mint(lper, 100 ether); From 4d69bfa6683038f9cd51de4a60eee4c97500046c Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 8 Jul 2025 11:58:37 +0800 Subject: [PATCH 141/194] update license --- LICENSE | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/LICENSE b/LICENSE index 63c2856..7b922f8 100644 --- a/LICENSE +++ b/LICENSE @@ -60,13 +60,13 @@ The Business Source License (this document, or the "License") is not an Open Sou This project incorporates code from or depends upon the following projects: ### GPL-licensed dependencies: -- **Uniswap V3 Core and Periphery** ([v3-core](https://github.com/Uniswap/v3-core), [v3-periphery](https://github.com/Uniswap/v3-periphery)), licensed under GPL-2.0-or-later -- **Morpho's MetaMorpho** ([metamorpho](https://github.com/morpho-org/metamorpho)), licensed under GPL-2.0 +- **Uniswap V3 Core and Periphery** (use its interface for the AMM model without modification to the dependency) ([v3-core](https://github.com/Uniswap/v3-core), [v3-periphery](https://github.com/Uniswap/v3-periphery)), licensed under GPL-2.0-or-later +- **Morpho's MetaMorpho**( use its interface to swap tokens on Morpho without modification to the dependency) ([metamorpho](https://github.com/morpho-org/metamorpho)), licensed under GPL-2.0 +- **Pendle Core V2** (use its interface to swap tokens on Pendle without modification to the dependency) ([pendle-core-v2-public](https://github.com/pendle-finance/pendle-core-v2-public)), licensed under GPL-3.0-or-later -### Other dependencies: +### MIT-licensed dependencies: - **OpenZeppelin Contracts** ([openzeppelin-contracts](https://github.com/OpenZeppelin/openzeppelin-contracts), [openzeppelin-contracts-upgradeable](https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable)), licensed under MIT - **Chainlink** ([chainlink](https://github.com/smartcontractkit/chainlink)), licensed under MIT -- **Pendle Core V2** ([pendle-core-v2-public](https://github.com/pendle-finance/pendle-core-v2-public)), licensed under BUSL-1.1 - **Foundry's forge-std** ([forge-std](https://github.com/foundry-rs/forge-std)), licensed under MIT Users of this software must comply with the terms of all applicable licenses. \ No newline at end of file From a62a9f650a1e95c68dcdf1067daa8df75fece34d Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 17 Jul 2025 09:53:00 +0800 Subject: [PATCH 142/194] fix issues 1 --- contracts/v2/tokens/AbstractGearingTokenV2.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/v2/tokens/AbstractGearingTokenV2.sol b/contracts/v2/tokens/AbstractGearingTokenV2.sol index 83fd13d..7e9d472 100644 --- a/contracts/v2/tokens/AbstractGearingTokenV2.sol +++ b/contracts/v2/tokens/AbstractGearingTokenV2.sol @@ -297,6 +297,7 @@ abstract contract AbstractGearingTokenV2 is if (ownerOf(id) != msg.sender) { revert CallerIsNotTheOwner(id); } + // All collteral will be removed in _repay function if repayAll is true (LoanInfo memory loan, bool repayAll) = _repay(id, repayAmt); // Check ltv after partial repayment if (!repayAll) { From afc2126bafb3a18f621cd4aa6376bfb694790b49 Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 17 Jul 2025 10:43:19 +0800 Subject: [PATCH 143/194] fix issues 4 --- contracts/v2/tokens/GearingTokenWithERC20V2.sol | 2 -- 1 file changed, 2 deletions(-) diff --git a/contracts/v2/tokens/GearingTokenWithERC20V2.sol b/contracts/v2/tokens/GearingTokenWithERC20V2.sol index bd5f111..4a6aa2c 100644 --- a/contracts/v2/tokens/GearingTokenWithERC20V2.sol +++ b/contracts/v2/tokens/GearingTokenWithERC20V2.sol @@ -209,13 +209,11 @@ contract GearingTokenWithERC20V2 is AbstractGearingTokenV2 { if (removedCollateralAmt <= cEqualRepayAmt + rewardToLiquidator) { cToLiquidator = _encodeAmount(removedCollateralAmt); cToTreasurer = _encodeAmount(0); - remainningC = _encodeAmount(0); } // Case 2: removed collateral can cover repayAmt + rewardToLiquidator but not rewardToProtocol else if (removedCollateralAmt < cEqualRepayAmt + rewardToLiquidator + rewardToProtocol) { cToLiquidator = _encodeAmount(cEqualRepayAmt + rewardToLiquidator); cToTreasurer = _encodeAmount(removedCollateralAmt - cEqualRepayAmt - rewardToLiquidator); - remainningC = _encodeAmount(0); } // Case 3: removed collateral equal repayAmt + rewardToLiquidator + rewardToProtocol else { From 854402a456ca84fd91726033824abd694cd84110 Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 17 Jul 2025 10:50:08 +0800 Subject: [PATCH 144/194] fix issue 5 --- contracts/v2/tokenomics/PreTMX.sol | 2 +- test/v2/tokenomics/PreTMX.t.sol | 43 +++++++++++++++++++----------- 2 files changed, 29 insertions(+), 16 deletions(-) diff --git a/contracts/v2/tokenomics/PreTMX.sol b/contracts/v2/tokenomics/PreTMX.sol index 4ef590f..5e167b9 100644 --- a/contracts/v2/tokenomics/PreTMX.sol +++ b/contracts/v2/tokenomics/PreTMX.sol @@ -54,7 +54,7 @@ contract PreTMX is ERC20, Ownable2Step { _mint(to, amount); } - function burn(uint256 amount) external { + function burn(uint256 amount) external onlyOwner { _burn(msg.sender, amount); } diff --git a/test/v2/tokenomics/PreTMX.t.sol b/test/v2/tokenomics/PreTMX.t.sol index 8fed31d..339f329 100644 --- a/test/v2/tokenomics/PreTMX.t.sol +++ b/test/v2/tokenomics/PreTMX.t.sol @@ -174,39 +174,51 @@ contract PreTMXTest is Test { vm.prank(admin); preTMX.mint(user1, 5000); - vm.prank(user1); + // Only admin (owner) can burn tokens, not user1 + vm.prank(admin); vm.expectEmit(true, true, false, true); - emit IERC20.Transfer(user1, address(0), 2000); + emit IERC20.Transfer(admin, address(0), 2000); preTMX.burn(2000); - assertEq(preTMX.balanceOf(user1), 3000); + assertEq(preTMX.balanceOf(admin), initialSupply - 2000); assertEq(preTMX.totalSupply(), initialSupply + 5000 - 2000); } function test_Burn_WhenNotRestricted() public { - // First give some tokens to user1 + // First transfer some tokens to user1 vm.startPrank(admin); preTMX.enableTransfer(); preTMX.transfer(user1, 5000); - vm.stopPrank(); - - vm.prank(user1); - + + // Only admin (owner) can burn tokens vm.expectEmit(true, true, false, true); - emit IERC20.Transfer(user1, address(0), 2000); + emit IERC20.Transfer(admin, address(0), 2000); preTMX.burn(2000); - assertEq(preTMX.balanceOf(user1), 3000); + assertEq(preTMX.balanceOf(admin), initialSupply - 5000 - 2000); assertEq(preTMX.totalSupply(), initialSupply - 2000); + vm.stopPrank(); } function test_Burn_InsufficientBalance() public { + // Admin tries to burn more than they have + vm.prank(admin); + vm.expectRevert(abi.encodeWithSelector(IERC20Errors.ERC20InsufficientBalance.selector, admin, initialSupply, initialSupply + 1)); + preTMX.burn(initialSupply + 1); + } + + function test_Burn_NotOwner() public { + // Give tokens to user1 via minting + vm.prank(admin); + preTMX.mint(user1, 1000); + + // user1 tries to burn but should fail because only owner can burn vm.prank(user1); - vm.expectRevert(abi.encodeWithSelector(IERC20Errors.ERC20InsufficientBalance.selector, user1, 0, 1)); - preTMX.burn(1); + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, user1)); + preTMX.burn(500); } function test_FuzzTransfer_WhenNotRestricted(uint256 amount) public { @@ -495,10 +507,11 @@ contract PreTMXTest is Test { preTMX.mint(user1, 1000); assertEq(preTMX.balanceOf(user1), 1000); - // Burn from non-whitelisted user should work - vm.prank(user1); + // Only owner can burn tokens (admin in this case) + vm.prank(admin); preTMX.burn(500); - assertEq(preTMX.balanceOf(user1), 500); + assertEq(preTMX.balanceOf(admin), initialSupply - 500); + assertEq(preTMX.totalSupply(), initialSupply + 1000 - 500); } function test_FuzzWhitelisting(address user, bool fromWhitelisted, bool toWhitelisted) public { From 5f0edc1abe8a20b7e3c32659ac7bf912d3597d5c Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 17 Jul 2025 13:24:21 +0800 Subject: [PATCH 145/194] fix issue 7 --- contracts/v2/router/TermMaxRouterV2.sol | 4 ++-- .../v2/router/swapAdapters/TermMaxSwapAdapter.sol | 3 ++- test/v2/tokenomics/PreTMX.t.sol | 10 +++++++--- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/contracts/v2/router/TermMaxRouterV2.sol b/contracts/v2/router/TermMaxRouterV2.sol index 331c324..914c7e6 100644 --- a/contracts/v2/router/TermMaxRouterV2.sol +++ b/contracts/v2/router/TermMaxRouterV2.sol @@ -189,8 +189,8 @@ contract TermMaxRouterV2 is ) external whenNotPaused returns (uint256 netTokenOut) { (IERC20 ft, IERC20 xt,,, IERC20 debtToken) = market.tokens(); (uint256 maxBurn, IERC20 toenToSell) = ftInAmt > xtInAmt ? (xtInAmt, ft) : (ftInAmt, xt); - ft.transferFrom(msg.sender, address(this), ftInAmt); - xt.transferFrom(msg.sender, address(this), xtInAmt); + ft.safeTransferFrom(msg.sender, address(this), ftInAmt); + xt.safeTransferFrom(msg.sender, address(this), xtInAmt); ft.safeIncreaseAllowance(address(market), ftInAmt); xt.safeIncreaseAllowance(address(market), xtInAmt); market.burn(recipient, maxBurn); diff --git a/contracts/v2/router/swapAdapters/TermMaxSwapAdapter.sol b/contracts/v2/router/swapAdapters/TermMaxSwapAdapter.sol index 4a37b25..fbabda3 100644 --- a/contracts/v2/router/swapAdapters/TermMaxSwapAdapter.sol +++ b/contracts/v2/router/swapAdapters/TermMaxSwapAdapter.sol @@ -32,7 +32,7 @@ contract TermMaxSwapAdapter is ERC20SwapAdapterV2 { if (data.swapExactTokenForToken) { for (uint256 i = 0; i < data.orders.length; ++i) { address order = data.orders[i]; - tokenIn.forceApprove(order, data.netTokenAmt); + tokenIn.forceApprove(order, data.tradingAmts[i]); netTokenOutOrIn += ITermMaxOrder(order).swapExactTokenToToken( tokenIn, tokenOut, recipient, data.tradingAmts[i], 0, data.deadline ); @@ -41,6 +41,7 @@ contract TermMaxSwapAdapter is ERC20SwapAdapterV2 { } else { for (uint256 i = 0; i < data.orders.length; ++i) { address order = data.orders[i]; + // Use maximum allowance for the swap because the final input amount is unknown tokenIn.forceApprove(order, data.netTokenAmt); netTokenOutOrIn += ITermMaxOrder(order).swapTokenToExactToken( tokenIn, tokenOut, recipient, data.tradingAmts[i], data.netTokenAmt, data.deadline diff --git a/test/v2/tokenomics/PreTMX.t.sol b/test/v2/tokenomics/PreTMX.t.sol index 339f329..cdf0eb3 100644 --- a/test/v2/tokenomics/PreTMX.t.sol +++ b/test/v2/tokenomics/PreTMX.t.sol @@ -191,7 +191,7 @@ contract PreTMXTest is Test { vm.startPrank(admin); preTMX.enableTransfer(); preTMX.transfer(user1, 5000); - + // Only admin (owner) can burn tokens vm.expectEmit(true, true, false, true); emit IERC20.Transfer(admin, address(0), 2000); @@ -206,12 +206,16 @@ contract PreTMXTest is Test { function test_Burn_InsufficientBalance() public { // Admin tries to burn more than they have vm.prank(admin); - vm.expectRevert(abi.encodeWithSelector(IERC20Errors.ERC20InsufficientBalance.selector, admin, initialSupply, initialSupply + 1)); + vm.expectRevert( + abi.encodeWithSelector( + IERC20Errors.ERC20InsufficientBalance.selector, admin, initialSupply, initialSupply + 1 + ) + ); preTMX.burn(initialSupply + 1); } function test_Burn_NotOwner() public { - // Give tokens to user1 via minting + // Give tokens to user1 via minting vm.prank(admin); preTMX.mint(user1, 1000); From 728252f49293bab5a25b26f440741d42e5a1fb41 Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 17 Jul 2025 14:07:28 +0800 Subject: [PATCH 146/194] fix issue 8 --- contracts/v2/errors/RouterErrorsV2.sol | 7 ++ contracts/v2/router/TermMaxRouterV2.sol | 102 ++++++++++++++++++------ 2 files changed, 84 insertions(+), 25 deletions(-) create mode 100644 contracts/v2/errors/RouterErrorsV2.sol diff --git a/contracts/v2/errors/RouterErrorsV2.sol b/contracts/v2/errors/RouterErrorsV2.sol new file mode 100644 index 0000000..06716c6 --- /dev/null +++ b/contracts/v2/errors/RouterErrorsV2.sol @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface RouterErrorsV2 { + error CallbackAddressNotMatch(); + error CallbackReentrant(); +} diff --git a/contracts/v2/router/TermMaxRouterV2.sol b/contracts/v2/router/TermMaxRouterV2.sol index 914c7e6..f860c5c 100644 --- a/contracts/v2/router/TermMaxRouterV2.sol +++ b/contracts/v2/router/TermMaxRouterV2.sol @@ -28,6 +28,7 @@ import {Constants} from "../../v1/lib/Constants.sol"; import {MathLib} from "../../v1/lib/MathLib.sol"; import {IERC20SwapAdapter} from "./IERC20SwapAdapter.sol"; import {RouterEventsV2} from "../events/RouterEventsV2.sol"; +import {RouterErrorsV2} from "../errors/RouterErrorsV2.sol"; /** * @title TermMax Router V2 @@ -62,6 +63,33 @@ contract TermMaxRouterV2 is mapping(address => bool) public adapterWhitelist; uint256 private constant T_ROLLOVER_GT_RESERVE_STORE = 0; + uint256 private constant T_CALLBACK_ADDRESS_STORE = 1; + + modifier onlyCallbackAddress() { + address callbackAddress; + assembly { + callbackAddress := tload(T_CALLBACK_ADDRESS_STORE) + } + if (msg.sender != callbackAddress) { + revert RouterErrorsV2.CallbackAddressNotMatch(); + } + _; + assembly { + // clear callback address after use + tstore(T_CALLBACK_ADDRESS_STORE, 0) + } + } + + modifier noCallbackReentrant() { + address callbackAddress; + assembly { + callbackAddress := tload(T_CALLBACK_ADDRESS_STORE) + } + if (callbackAddress != address(0)) { + revert RouterErrorsV2.CallbackReentrant(); + } + _; + } function _authorizeUpgrade(address newImplementation) internal virtual override onlyOwner {} @@ -211,7 +239,10 @@ contract TermMaxRouterV2 is uint128 maxLtv, SwapUnit[] memory units, uint256 deadline - ) external whenNotPaused returns (uint256 gtId, uint256 netXtOut) { + ) external whenNotPaused noCallbackReentrant returns (uint256 gtId, uint256 netXtOut) { + assembly { + tstore(T_CALLBACK_ADDRESS_STORE, market) // set callback address + } (, IERC20 xt, IGearingToken gt,, IERC20 debtToken) = market.tokens(); uint256 totalAmtToBuyXt = sum(amtsToBuyXt); debtToken.safeTransferFrom(msg.sender, address(this), tokenToSwap + totalAmtToBuyXt); @@ -237,7 +268,10 @@ contract TermMaxRouterV2 is uint128 tokenInAmt, uint128 maxLtv, SwapUnit[] memory units - ) external whenNotPaused returns (uint256 gtId) { + ) external whenNotPaused noCallbackReentrant returns (uint256 gtId) { + assembly { + tstore(T_CALLBACK_ADDRESS_STORE, market) // set callback address + } (, IERC20 xt, IGearingToken gt,, IERC20 debtToken) = market.tokens(); debtToken.safeTransferFrom(msg.sender, address(this), tokenInAmt); xt.safeTransferFrom(msg.sender, address(this), xtInAmt); @@ -264,7 +298,10 @@ contract TermMaxRouterV2 is uint128 collateralInAmt, uint128 maxLtv, SwapUnit[] memory units - ) external whenNotPaused returns (uint256 gtId) { + ) external whenNotPaused noCallbackReentrant returns (uint256 gtId) { + assembly { + tstore(T_CALLBACK_ADDRESS_STORE, market) // set callback address + } (, IERC20 xt, IGearingToken gt, address collAddr,) = market.tokens(); IERC20 collateral = IERC20(collAddr); @@ -374,12 +411,15 @@ contract TermMaxRouterV2 is bool byDebtToken, SwapUnit[] memory units, TermMaxSwapData memory swapData - ) external whenNotPaused returns (uint256 netTokenOut) { - (,, IGearingToken gt,, IERC20 debtToken) = market.tokens(); - gt.safeTransferFrom(msg.sender, address(this), gtId, ""); + ) external whenNotPaused noCallbackReentrant returns (uint256 netTokenOut) { + (,, IGearingToken gtToken,, IERC20 debtToken) = market.tokens(); + assembly { + tstore(T_CALLBACK_ADDRESS_STORE, gtToken) // set callback address + } + gtToken.safeTransferFrom(msg.sender, address(this), gtId, ""); bytes memory callbackData = abi.encode(units, swapData); callbackData = abi.encode(FlashRepayOptions.REPAY, callbackData); - gt.flashRepay(gtId, byDebtToken, callbackData); + gtToken.flashRepay(gtId, byDebtToken, callbackData); netTokenOut = debtToken.balanceOf(address(this)); debtToken.safeTransfer(recipient, netTokenOut); } @@ -393,15 +433,18 @@ contract TermMaxRouterV2 is bytes memory removedCollateral, SwapUnit[] memory units, TermMaxSwapData memory swapData - ) external whenNotPaused returns (uint256 netTokenOut) { - (,, IGearingToken gt,, IERC20 debtToken) = market.tokens(); - gt.safeTransferFrom(msg.sender, address(this), gtId, ""); + ) external whenNotPaused noCallbackReentrant returns (uint256 netTokenOut) { + (,, IGearingToken gtToken,, IERC20 debtToken) = market.tokens(); + assembly { + tstore(T_CALLBACK_ADDRESS_STORE, gtToken) // set callback address + } + gtToken.safeTransferFrom(msg.sender, address(this), gtId, ""); bytes memory callbackData = abi.encode(units, swapData); callbackData = abi.encode(FlashRepayOptions.REPAY, callbackData); bool repayAll = - IGearingTokenV2(address(gt)).flashRepay(gtId, repayAmt, byDebtToken, removedCollateral, callbackData); + IGearingTokenV2(address(gtToken)).flashRepay(gtId, repayAmt, byDebtToken, removedCollateral, callbackData); if (!repayAll) { - gt.safeTransferFrom(address(this), msg.sender, gtId); + gtToken.safeTransferFrom(address(this), msg.sender, gtId); } netTokenOut = debtToken.balanceOf(address(this)); debtToken.safeTransfer(recipient, netTokenOut); @@ -552,7 +595,7 @@ contract TermMaxRouterV2 is */ function rolloverGt( address recipient, - IGearingToken gt, + IGearingToken gtToken, uint256 gtId, uint128 additionalAssets, SwapUnit[] memory units, @@ -560,9 +603,11 @@ contract TermMaxRouterV2 is uint256 additionalNextCollateral, TermMaxSwapData memory swapData, uint128 maxLtv - ) external whenNotPaused returns (uint256 newGtId) { - // clear ts stograge + ) external whenNotPaused noCallbackReentrant returns (uint256 newGtId) { assembly { + // set callback address + tstore(T_CALLBACK_ADDRESS_STORE, gtToken) + // clear ts stograge tstore(T_ROLLOVER_GT_RESERVE_STORE, 0) } // additional debt token to reduce the ltv @@ -575,11 +620,11 @@ contract TermMaxRouterV2 is msg.sender, address(this), additionalNextCollateral ); } - gt.safeTransferFrom(msg.sender, address(this), gtId, ""); + gtToken.safeTransferFrom(msg.sender, address(this), gtId, ""); bytes memory callbackData = abi.encode(recipient, maxLtv, additionalAssets, nextMarket, additionalNextCollateral, units, swapData); callbackData = abi.encode(FlashRepayOptions.ROLLOVER, callbackData); - gt.flashRepay(gtId, true, callbackData); + gtToken.flashRepay(gtId, true, callbackData); assembly { newGtId := tload(T_ROLLOVER_GT_RESERVE_STORE) } @@ -590,7 +635,7 @@ contract TermMaxRouterV2 is */ function rolloverGtV2( address recipient, - IGearingToken gt, + IGearingToken gtToken, uint256 gtId, uint128 repayAmt, uint128 additionalAssets, @@ -600,9 +645,11 @@ contract TermMaxRouterV2 is uint256 additionalNextCollateral, TermMaxSwapData memory swapData, uint128 maxLtv - ) external whenNotPaused returns (uint256 newGtId) { - // clear ts stograge + ) external whenNotPaused noCallbackReentrant returns (uint256 newGtId) { assembly { + // set callback address + tstore(T_CALLBACK_ADDRESS_STORE, gtToken) + // clear ts stograge tstore(T_ROLLOVER_GT_RESERVE_STORE, 0) } // additional debt token to reduce the ltv @@ -615,13 +662,16 @@ contract TermMaxRouterV2 is msg.sender, address(this), additionalNextCollateral ); } - gt.safeTransferFrom(msg.sender, address(this), gtId, ""); + gtToken.safeTransferFrom(msg.sender, address(this), gtId, ""); bytes memory callbackData = abi.encode(recipient, maxLtv, additionalAssets, nextMarket, additionalNextCollateral, units, swapData); callbackData = abi.encode(FlashRepayOptions.ROLLOVER, callbackData); - if (!IGearingTokenV2(address(gt)).flashRepay(gtId, repayAmt, true, abi.encode(removedCollateral), callbackData)) - { - gt.safeTransferFrom(address(this), recipient, gtId); + if ( + !IGearingTokenV2(address(gtToken)).flashRepay( + gtId, repayAmt, true, abi.encode(removedCollateral), callbackData + ) + ) { + gtToken.safeTransferFrom(address(this), recipient, gtId); } assembly { newGtId := tload(T_ROLLOVER_GT_RESERVE_STORE) @@ -631,6 +681,8 @@ contract TermMaxRouterV2 is /// @dev Market flash leverage flashloan callback function executeOperation(address, IERC20, uint256 amount, bytes memory data) external + override + onlyCallbackAddress returns (bytes memory collateralData) { (address gt, uint256 tokenInAmt, SwapUnit[] memory units, FlashLoanType flashLoanType) = @@ -668,7 +720,7 @@ contract TermMaxRouterV2 is address, bytes memory collateralData, bytes memory callbackData - ) external override { + ) external override onlyCallbackAddress { (FlashRepayOptions option, bytes memory data) = abi.decode(callbackData, (FlashRepayOptions, bytes)); if (option == FlashRepayOptions.REPAY) { _flashRepay(repayToken, collateralData, data); From 2aa37c0b50686dbb7432acbebf260659e17aa49c Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 17 Jul 2025 14:11:16 +0800 Subject: [PATCH 147/194] add flash repay output checking --- contracts/v2/router/ITermMaxRouterV2.sol | 2 ++ contracts/v2/router/TermMaxRouterV2.sol | 8 ++++++++ test/v2/RouterV2.t.sol | 4 ++-- test/v2/mainnet-fork/GtBaseTestV2.t.sol | 4 ++-- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/contracts/v2/router/ITermMaxRouterV2.sol b/contracts/v2/router/ITermMaxRouterV2.sol index e516761..da89e61 100644 --- a/contracts/v2/router/ITermMaxRouterV2.sol +++ b/contracts/v2/router/ITermMaxRouterV2.sol @@ -252,6 +252,7 @@ interface ITermMaxRouterV2 { ITermMaxMarket market, uint256 gtId, bool byDebtToken, + uint256 expectedOutput, SwapUnit[] memory units, TermMaxSwapData memory swapData ) external returns (uint256 netTokenOut); @@ -262,6 +263,7 @@ interface ITermMaxRouterV2 { uint256 gtId, uint128 repayAmt, bool byDebtToken, + uint256 expectedOutput, bytes memory removedCollateral, SwapUnit[] memory units, TermMaxSwapData memory swapData diff --git a/contracts/v2/router/TermMaxRouterV2.sol b/contracts/v2/router/TermMaxRouterV2.sol index f860c5c..848670b 100644 --- a/contracts/v2/router/TermMaxRouterV2.sol +++ b/contracts/v2/router/TermMaxRouterV2.sol @@ -409,6 +409,7 @@ contract TermMaxRouterV2 is ITermMaxMarket market, uint256 gtId, bool byDebtToken, + uint256 expectedOutput, SwapUnit[] memory units, TermMaxSwapData memory swapData ) external whenNotPaused noCallbackReentrant returns (uint256 netTokenOut) { @@ -421,6 +422,9 @@ contract TermMaxRouterV2 is callbackData = abi.encode(FlashRepayOptions.REPAY, callbackData); gtToken.flashRepay(gtId, byDebtToken, callbackData); netTokenOut = debtToken.balanceOf(address(this)); + if (netTokenOut < expectedOutput) { + revert InsufficientTokenOut(address(debtToken), expectedOutput, netTokenOut); + } debtToken.safeTransfer(recipient, netTokenOut); } @@ -430,6 +434,7 @@ contract TermMaxRouterV2 is uint256 gtId, uint128 repayAmt, bool byDebtToken, + uint256 expectedOutput, bytes memory removedCollateral, SwapUnit[] memory units, TermMaxSwapData memory swapData @@ -447,6 +452,9 @@ contract TermMaxRouterV2 is gtToken.safeTransferFrom(address(this), msg.sender, gtId); } netTokenOut = debtToken.balanceOf(address(this)); + if (netTokenOut < expectedOutput) { + revert InsufficientTokenOut(address(debtToken), expectedOutput, netTokenOut); + } debtToken.safeTransfer(recipient, netTokenOut); } diff --git a/test/v2/RouterV2.t.sol b/test/v2/RouterV2.t.sol index 911b51c..bf1a3ba 100644 --- a/test/v2/RouterV2.t.sol +++ b/test/v2/RouterV2.t.sol @@ -492,7 +492,7 @@ contract RouterTestV2 is Test { res.gt.approve(address(res.router), gtId); ITermMaxRouterV2.TermMaxSwapData memory swapData; - res.router.flashRepayFromColl(sender, res.market, gtId, byDebtToken, units, swapData); + res.router.flashRepayFromColl(sender, res.market, gtId, byDebtToken, 0, units, swapData); assertEq(res.collateral.balanceOf(sender), 0); assertEq(res.debt.balanceOf(sender), mintTokenOut - debtAmt); @@ -528,7 +528,7 @@ contract RouterTestV2 is Test { swapData.deadline = block.timestamp + 1 hours; res.gt.approve(address(res.router), gtId); - res.router.flashRepayFromColl(sender, res.market, gtId, byDebtToken, units, swapData); + res.router.flashRepayFromColl(sender, res.market, gtId, byDebtToken, 0, units, swapData); assertEq(res.collateral.balanceOf(sender), 0); assert(res.debt.balanceOf(sender) > mintTokenOut - debtAmt); diff --git a/test/v2/mainnet-fork/GtBaseTestV2.t.sol b/test/v2/mainnet-fork/GtBaseTestV2.t.sol index 5a3c88c..11a97f4 100644 --- a/test/v2/mainnet-fork/GtBaseTestV2.t.sol +++ b/test/v2/mainnet-fork/GtBaseTestV2.t.sol @@ -332,7 +332,7 @@ abstract contract GtBaseTestV2 is ForkBaseTestV2 { (, uint128 debtAmt, bytes memory collateralData) = res.gt.loanInfo(gtId); uint256 netTokenOut = res.router.flashRepayFromCollV2( - taker, res.market, gtId, debtAmt, byDebtToken, collateralData, units, swapData + taker, res.market, gtId, debtAmt, byDebtToken, 0, collateralData, units, swapData ); uint256 debtTokenBalanceAfterRepay = res.debtToken.balanceOf(taker); @@ -365,7 +365,7 @@ abstract contract GtBaseTestV2 is ForkBaseTestV2 { swapData.deadline = block.timestamp + 1 hours; uint256 netTokenOut = res.router.flashRepayFromCollV2( - taker, res.market, gtId, debtAmt, byDebtToken, collateralData, units, swapData + taker, res.market, gtId, debtAmt, byDebtToken, 0, collateralData, units, swapData ); uint256 debtTokenBalanceAfterRepay = res.debtToken.balanceOf(taker); From 45746fdad3e1bc7b89432d381b4a4239e453acac Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 17 Jul 2025 15:19:52 +0800 Subject: [PATCH 148/194] fix issue 10 --- contracts/v2/oracle/OracleAggregatorV2.sol | 27 +++++---- test/v2/OracleAggregatorV2.t.sol | 67 +++++++++++---------- test/v2/integration/ForkPrdFlashRepay.t.sol | 4 +- 3 files changed, 53 insertions(+), 45 deletions(-) diff --git a/contracts/v2/oracle/OracleAggregatorV2.sol b/contracts/v2/oracle/OracleAggregatorV2.sol index 3c94498..f024e98 100644 --- a/contracts/v2/oracle/OracleAggregatorV2.sol +++ b/contracts/v2/oracle/OracleAggregatorV2.sol @@ -205,8 +205,10 @@ contract OracleAggregatorV2 is IOracleV2, Ownable2Step { { (, int256 answer,, uint256 updatedAt,) = oracle.aggregator.latestRoundData(); // Check if primary oracle is fresh and has positive price - if ((oracle.heartbeat == 0 || oracle.heartbeat + updatedAt >= block.timestamp) && answer > 0) { - return (uint256(_processPriceRange(answer, oracle)), oracle.aggregator.decimals()); + if (oracle.heartbeat == 0 || oracle.heartbeat + updatedAt >= block.timestamp) { + if (_checkAnswer(answer, oracle)) { + return (uint256(answer), oracle.aggregator.decimals()); + } } } @@ -214,8 +216,10 @@ contract OracleAggregatorV2 is IOracleV2, Ownable2Step { if (address(oracle.backupAggregator) != address(0)) { (, int256 answer,, uint256 updatedAt,) = oracle.backupAggregator.latestRoundData(); // Check if backup oracle is fresh and has positive price - if ((oracle.backupHeartbeat == 0 || oracle.backupHeartbeat + updatedAt >= block.timestamp) && answer > 0) { - return (uint256(_processPriceRange(answer, oracle)), oracle.backupAggregator.decimals()); + if (oracle.backupHeartbeat == 0 || oracle.backupHeartbeat + updatedAt >= block.timestamp) { + if (_checkAnswer(answer, oracle)) { + return (uint256(answer), oracle.backupAggregator.decimals()); + } } } @@ -223,13 +227,14 @@ contract OracleAggregatorV2 is IOracleV2, Ownable2Step { revert OracleIsNotWorking(asset); } - function _processPriceRange(int256 price, Oracle memory oracle) internal pure returns (int256) { - if (oracle.maxPrice != 0 && price > oracle.maxPrice) { - return oracle.maxPrice; + function _checkAnswer(int256 answer, Oracle memory oracle) internal pure returns (bool) { + if (answer < 0) { + return false; // Negative prices are invalid + } else if (oracle.maxPrice != 0 && answer > oracle.maxPrice) { + return false; // Price exceeds maximum cap + } else if (oracle.minPrice != 0 && answer < oracle.minPrice) { + return false; // Price is below minimum floor } - if (oracle.minPrice != 0 && price < oracle.minPrice) { - return oracle.minPrice; - } - return price; + return true; // Price is valid } } diff --git a/test/v2/OracleAggregatorV2.t.sol b/test/v2/OracleAggregatorV2.t.sol index 0c500b6..71e8f4b 100644 --- a/test/v2/OracleAggregatorV2.t.sol +++ b/test/v2/OracleAggregatorV2.t.sol @@ -342,10 +342,9 @@ contract OracleAggregatorTestV2 is Test { vm.prank(OWNER); primaryFeed.updateRoundData(roundData); - // Get price - should return maxPrice instead of actual price - (uint256 price, uint8 decimals) = oracleAggregator.getPrice(ASSET); - assertEq(price, uint256(MAX_PRICE)); - assertEq(decimals, DECIMALS); + // Should revert since primary exceeds maxPrice and no backup exists + vm.expectRevert(abi.encodeWithSignature("OracleIsNotWorking(address)", ASSET)); + oracleAggregator.getPrice(ASSET); } function test_GetPrice_PrimaryExceedsMaxPrice_WithBackup() public { @@ -376,7 +375,7 @@ contract OracleAggregatorTestV2 is Test { answeredInRound: 2 }); - // Set backup price below maxPrice + // Set backup price below maxPrice (valid) int256 backupPrice = MAX_PRICE - 1000e8; MockPriceFeedV2.RoundData memory backupRoundData = MockPriceFeedV2.RoundData({ roundId: 2, @@ -391,13 +390,13 @@ contract OracleAggregatorTestV2 is Test { backupFeed.updateRoundData(backupRoundData); vm.stopPrank(); - // Get price - should fallback to backup oracle + // Get price - should fallback to backup oracle since primary exceeds maxPrice (uint256 price, uint8 decimals) = oracleAggregator.getPrice(ASSET); - assertEq(price, uint256(MAX_PRICE)); + assertEq(price, uint256(backupPrice)); assertEq(decimals, DECIMALS); } - function test_GetPrice_BothExceedMaxPrice() public { + function test_RevertGetPrice_BothExceedMaxPrice() public { // Create an oracle with maxPrice IOracleV2.Oracle memory oracle = IOracleV2.Oracle({ aggregator: primaryFeed, @@ -439,10 +438,9 @@ contract OracleAggregatorTestV2 is Test { backupFeed.updateRoundData(backupRoundData); vm.stopPrank(); - // Get price - should use backup capped at maxPrice - (uint256 price, uint8 decimals) = oracleAggregator.getPrice(ASSET); - assertEq(price, uint256(MAX_PRICE)); - assertEq(decimals, DECIMALS); + // Should revert since both oracles exceed maxPrice + vm.expectRevert(abi.encodeWithSignature("OracleIsNotWorking(address)", ASSET)); + oracleAggregator.getPrice(ASSET); } function test_GetPrice_WithMaxPriceZero_PrimaryOracle() public { @@ -606,7 +604,7 @@ contract OracleAggregatorTestV2 is Test { assertEq(decimals, DECIMALS); } - function test_GetPrice_CombinedMaxMinPriceConstraints() public { + function test_RevertGetPrice_CombinedMaxMinPriceConstraints() public { // Create an oracle with both maxPrice and minPrice IOracleV2.Oracle memory oracle = IOracleV2.Oracle({ aggregator: primaryFeed, @@ -624,7 +622,7 @@ contract OracleAggregatorTestV2 is Test { oracleAggregator.acceptPendingOracle(ASSET); - // Test price below minPrice gets floored + // Test price below minPrice should revert when no valid backup int256 lowPrice = MIN_PRICE - 100e8; MockPriceFeedV2.RoundData memory roundData = MockPriceFeedV2.RoundData({ roundId: 2, @@ -633,14 +631,18 @@ contract OracleAggregatorTestV2 is Test { updatedAt: block.timestamp, answeredInRound: 2 }); - vm.prank(OWNER); + + // Set both primary and backup to invalid prices + vm.startPrank(OWNER); primaryFeed.updateRoundData(roundData); + backupFeed.updateRoundData(roundData); + vm.stopPrank(); - (uint256 price, uint8 decimals) = oracleAggregator.getPrice(ASSET); - assertEq(price, uint256(MIN_PRICE)); - assertEq(decimals, DECIMALS); + // Should revert since both oracles are below minPrice + vm.expectRevert(abi.encodeWithSignature("OracleIsNotWorking(address)", ASSET)); + oracleAggregator.getPrice(ASSET); - // Test price above maxPrice gets capped + // Test price above maxPrice should revert when no valid backup int256 highPrice = MAX_PRICE + 1000e8; roundData = MockPriceFeedV2.RoundData({ roundId: 3, @@ -649,12 +651,15 @@ contract OracleAggregatorTestV2 is Test { updatedAt: block.timestamp, answeredInRound: 3 }); - vm.prank(OWNER); + + vm.startPrank(OWNER); primaryFeed.updateRoundData(roundData); + backupFeed.updateRoundData(roundData); + vm.stopPrank(); - (price, decimals) = oracleAggregator.getPrice(ASSET); - assertEq(price, uint256(MAX_PRICE)); - assertEq(decimals, DECIMALS); + // Should revert since both oracles exceed maxPrice + vm.expectRevert(abi.encodeWithSignature("OracleIsNotWorking(address)", ASSET)); + oracleAggregator.getPrice(ASSET); // Test price within range is unchanged int256 validPrice = (MIN_PRICE + MAX_PRICE) / 2; // Middle value @@ -668,7 +673,7 @@ contract OracleAggregatorTestV2 is Test { vm.prank(OWNER); primaryFeed.updateRoundData(roundData); - (price, decimals) = oracleAggregator.getPrice(ASSET); + (uint256 price, uint8 decimals) = oracleAggregator.getPrice(ASSET); assertEq(price, uint256(validPrice)); assertEq(decimals, DECIMALS); } @@ -856,10 +861,9 @@ contract OracleAggregatorTestV2 is Test { vm.prank(OWNER); primaryFeed.updateRoundData(roundData); - // Get price - should return minPrice instead of actual price - (uint256 price, uint8 decimals) = oracleAggregator.getPrice(ASSET); - assertEq(price, uint256(MIN_PRICE)); - assertEq(decimals, DECIMALS); + // Should revert since primary is below minPrice and no backup exists + vm.expectRevert(abi.encodeWithSignature("OracleIsNotWorking(address)", ASSET)); + oracleAggregator.getPrice(ASSET); } function test_GetPrice_BothBelowMinPrice() public { @@ -904,10 +908,9 @@ contract OracleAggregatorTestV2 is Test { backupFeed.updateRoundData(backupRoundData); vm.stopPrank(); - // Get price - should use backup capped at minPrice - (uint256 price, uint8 decimals) = oracleAggregator.getPrice(ASSET); - assertEq(price, uint256(MIN_PRICE)); - assertEq(decimals, DECIMALS); + // Should revert since both oracles are below minPrice + vm.expectRevert(abi.encodeWithSignature("OracleIsNotWorking(address)", ASSET)); + oracleAggregator.getPrice(ASSET); } function test_GetPrice_WithMinPriceZero_PrimaryOracle() public { diff --git a/test/v2/integration/ForkPrdFlashRepay.t.sol b/test/v2/integration/ForkPrdFlashRepay.t.sol index 1aa955b..b30dc2b 100644 --- a/test/v2/integration/ForkPrdFlashRepay.t.sol +++ b/test/v2/integration/ForkPrdFlashRepay.t.sol @@ -182,7 +182,7 @@ contract ForkPrdFlashRepay is ForkBaseTestV2 { gt.approve(address(router), gtId1); ITermMaxRouterV2.TermMaxSwapData memory swapData; router.flashRepayFromCollV2( - borrower, market, gtId1, repayAmount, true, abi.encode(removedCollateral), swapUnits, swapData + borrower, market, gtId1, repayAmount, true, 0, abi.encode(removedCollateral), swapUnits, swapData ); console.log("usdc balance after:", IERC20(usdc).balanceOf(borrower)); @@ -247,7 +247,7 @@ contract ForkPrdFlashRepay is ForkBaseTestV2 { console.log("usdc balance before:", IERC20(usdc).balanceOf(borrower)); gt.approve(address(router2), gt1); ITermMaxRouterV2.TermMaxSwapData memory swapData; - router2.flashRepayFromColl(borrower, mmay_30, gt1, true, swapUnits, swapData); + router2.flashRepayFromColl(borrower, mmay_30, gt1, true, 0, swapUnits, swapData); console.log("usdc balance after:", IERC20(usdc).balanceOf(borrower)); vm.stopPrank(); } From e51ef561c2c1d59eb861636a7813993acd24b12e Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 17 Jul 2025 16:17:29 +0800 Subject: [PATCH 149/194] add check for gt initilization --- contracts/v2/errors/GearingTokenErrorsV2.sol | 7 ++++ .../v2/tokens/AbstractGearingTokenV2.sol | 4 +++ test/v2/FactoryV2.t.sol | 33 +++++++++++++++++++ 3 files changed, 44 insertions(+) create mode 100644 contracts/v2/errors/GearingTokenErrorsV2.sol diff --git a/contracts/v2/errors/GearingTokenErrorsV2.sol b/contracts/v2/errors/GearingTokenErrorsV2.sol new file mode 100644 index 0000000..a1975b5 --- /dev/null +++ b/contracts/v2/errors/GearingTokenErrorsV2.sol @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface GearingTokenErrorsV2 { + /// @notice Error for Liquidation LTV too excess 100% + error InvalidLiquidationLtv(); +} diff --git a/contracts/v2/tokens/AbstractGearingTokenV2.sol b/contracts/v2/tokens/AbstractGearingTokenV2.sol index 7e9d472..c197a7c 100644 --- a/contracts/v2/tokens/AbstractGearingTokenV2.sol +++ b/contracts/v2/tokens/AbstractGearingTokenV2.sol @@ -16,6 +16,7 @@ import {GearingTokenEvents} from "../../v1/events/GearingTokenEvents.sol"; import {GtConfig, IOracle} from "../../v1/storage/TermMaxStorage.sol"; import {IGearingTokenV2} from "./IGearingTokenV2.sol"; import {GearingTokenEventsV2} from "../events/GearingTokenEventsV2.sol"; +import {GearingTokenErrorsV2} from "../errors/GearingTokenErrorsV2.sol"; /** * @title TermMax Gearing Token @@ -88,6 +89,9 @@ abstract contract AbstractGearingTokenV2 is if (config_.loanConfig.liquidationLtv <= config_.loanConfig.maxLtv) { revert LiquidationLtvMustBeGreaterThanMaxLtv(); } + if (config_.loanConfig.liquidationLtv > Constants.DECIMAL_BASE) { + revert GearingTokenErrorsV2.InvalidLiquidationLtv(); + } __ERC721_init(name, symbol); __Ownable_init(msg.sender); _config = config_; diff --git a/test/v2/FactoryV2.t.sol b/test/v2/FactoryV2.t.sol index ffa6965..4f2b8cf 100644 --- a/test/v2/FactoryV2.t.sol +++ b/test/v2/FactoryV2.t.sol @@ -185,6 +185,39 @@ contract FactoryTestV2 is Test { vm.stopPrank(); } + function testInvalidLiquidationLtv() public { + vm.startPrank(deployer); + TermMaxFactoryV2 factory = DeployUtils.deployFactory(deployer); + + MockERC20 collateral = new MockERC20("ETH", "ETH", 18); + MockERC20 debt = new MockERC20("DAI", "DAI", 8); + + // Set liquidation LTV greater than 100% (Constants.DECIMAL_BASE = 1e8) + uint32 invalidLiquidationLtv = uint32(Constants.DECIMAL_BASE) + 1; + + MarketInitialParams memory params = MarketInitialParams({ + collateral: address(collateral), + debtToken: debt, + admin: deployer, + gtImplementation: address(0), + marketConfig: marketConfig, + loanConfig: LoanConfig({ + maxLtv: maxLtv, + liquidationLtv: invalidLiquidationLtv, + liquidatable: true, + oracle: IOracle(vm.randomAddress()) + }), + gtInitalParams: abi.encode(type(uint256).max), + tokenName: "test", + tokenSymbol: "test" + }); + + vm.expectRevert(abi.encodeWithSignature("InvalidLiquidationLtv()")); + factory.createMarket(DeployUtils.GT_ERC20, params, 0); + + vm.stopPrank(); + } + function testRevertByCantNotFindGtImplementation() public { vm.startPrank(deployer); TermMaxFactoryV2 factory = DeployUtils.deployFactory(deployer); From 7ef4db179c82b6084512de9a504291762a4328fe Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 17 Jul 2025 16:31:51 +0800 Subject: [PATCH 150/194] fix issue 15 --- contracts/v2/errors/GearingTokenErrorsV2.sol | 2 + .../v2/tokens/AbstractGearingTokenV2.sol | 9 +++- test/v2/GtV2.t.sol | 44 ++++--------------- 3 files changed, 19 insertions(+), 36 deletions(-) diff --git a/contracts/v2/errors/GearingTokenErrorsV2.sol b/contracts/v2/errors/GearingTokenErrorsV2.sol index a1975b5..789ff6f 100644 --- a/contracts/v2/errors/GearingTokenErrorsV2.sol +++ b/contracts/v2/errors/GearingTokenErrorsV2.sol @@ -4,4 +4,6 @@ pragma solidity ^0.8.0; interface GearingTokenErrorsV2 { /// @notice Error for Liquidation LTV too excess 100% error InvalidLiquidationLtv(); + /// @notice Error for merge empty Gearing Token id array + error GtIdArrayIsEmpty(); } diff --git a/contracts/v2/tokens/AbstractGearingTokenV2.sol b/contracts/v2/tokens/AbstractGearingTokenV2.sol index c197a7c..1ab8252 100644 --- a/contracts/v2/tokens/AbstractGearingTokenV2.sol +++ b/contracts/v2/tokens/AbstractGearingTokenV2.sol @@ -222,6 +222,13 @@ abstract contract AbstractGearingTokenV2 is * @inheritdoc IGearingToken */ function merge(uint256[] memory ids) external virtual nonReentrant returns (uint256 newId) { + if (ids.length == 0) { + revert GearingTokenErrorsV2.GtIdArrayIsEmpty(); + } + GtConfig memory config = _config; + if (config.maturity <= block.timestamp) { + revert GtIsExpired(0); + } uint128 totalDebtAmt; bytes memory mergedCollateralData; for (uint256 i = 0; i < ids.length; ++i) { @@ -236,7 +243,7 @@ abstract contract AbstractGearingTokenV2 is i == 0 ? loan.collateralData : _mergeCollateral(mergedCollateralData, loan.collateralData); _burnInternal(id); } - newId = _mintInternal(msg.sender, totalDebtAmt, mergedCollateralData, _config); + newId = _mintInternal(msg.sender, totalDebtAmt, mergedCollateralData, config); emit MergeGts(msg.sender, newId, ids); } diff --git a/test/v2/GtV2.t.sol b/test/v2/GtV2.t.sol index fcae501..3e6ef71 100644 --- a/test/v2/GtV2.t.sol +++ b/test/v2/GtV2.t.sol @@ -24,6 +24,7 @@ import { GearingTokenWithERC20V2, GearingTokenEvents, GearingTokenErrors, + GearingTokenErrorsV2, GearingTokenEventsV2, GtConfig } from "contracts/v2/tokens/GearingTokenWithERC20V2.sol"; @@ -496,41 +497,6 @@ contract GtTestV2 is Test { flashRepayer.flashRepay(gtId, repayAmt, true, abi.encode(collateralAmt)); } - // function testFlashRepayThroughFt() public { - // uint128 debtAmt = 100e8; - // uint256 collateralAmt = 1e18; - - // vm.startPrank(sender); - - // (uint256 gtId, ) = LoanUtils.fastMintGt(res, sender, debtAmt, collateralAmt); - // deal(address(res.ft), address(flashRepayer), debtAmt); - - // res.gt.approve(address(flashRepayer), gtId); - - // uint collateralBalanceBefore = res.collateral.balanceOf(sender); - // uint ftBalanceBefore = res.ft.balanceOf(sender); - // StateChecker.MarketState memory state = StateChecker.getMarketState(res); - // bool byDebtToken = false; - // vm.expectEmit(); - // emit GearingTokenEvents.Repay(gtId, debtAmt, byDebtToken); - // flashRepayer.flashRepay(gtId, byDebtToken); - - // uint collateralBalanceAfter = res.collateral.balanceOf(sender); - // uint ftBalanceAfter = res.ft.balanceOf(sender); - // state.ftReserve += debtAmt; - // state.collateralReserve -= collateralAmt; - // StateChecker.checkMarketState(res, state); - - // assert(res.collateral.balanceOf(address(flashRepayer)) == collateralAmt); - // assert(res.debt.balanceOf(address(flashRepayer)) == 0); - // assert(collateralBalanceAfter == collateralBalanceBefore); - // assert(ftBalanceAfter == ftBalanceBefore); - // vm.expectRevert(abi.encodePacked(bytes4(keccak256("ERC721NonexistentToken(uint256)")), gtId)); - // res.gt.loanInfo(gtId); - - // vm.stopPrank(); - // } - function testRevertByGtIsExpiredWhenRepay() public { uint128 debtAmt = 100e8; uint256 collateralAmt = 1e18; @@ -594,6 +560,14 @@ contract GtTestV2 is Test { vm.stopPrank(); } + function testMergeEmptyArray() public { + uint256[] memory ids = new uint256[](0); + vm.startPrank(sender); + vm.expectRevert(abi.encodeWithSelector(GearingTokenErrorsV2.GtIdArrayIsEmpty.selector)); + res.gt.merge(ids); + vm.stopPrank(); + } + function testRevertByCanNotMergeLoanWithDiffOwnerWhenMerge() public { uint40[3] memory debts = [100e8, 30e8, 5e8]; uint64[3] memory collaterals = [1e18, 0.5e18, 0.005e18]; From e5852488101526ff3f0df15385ec61d0d9574ccd Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 17 Jul 2025 16:45:51 +0800 Subject: [PATCH 151/194] fix issue 15 --- contracts/v2/tokens/AbstractGearingTokenV2.sol | 2 +- test/v2/GtV2.t.sol | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/contracts/v2/tokens/AbstractGearingTokenV2.sol b/contracts/v2/tokens/AbstractGearingTokenV2.sol index 1ab8252..a464403 100644 --- a/contracts/v2/tokens/AbstractGearingTokenV2.sol +++ b/contracts/v2/tokens/AbstractGearingTokenV2.sol @@ -236,7 +236,7 @@ abstract contract AbstractGearingTokenV2 is LoanInfo memory loan = loanMapping[id]; address owner = ownerOf(id); if (msg.sender != owner) { - revert CanNotMergeLoanWithDiffOwner(id, owner); + revert AuthorizationFailed(id, msg.sender); } totalDebtAmt += loan.debtAmt; mergedCollateralData = diff --git a/test/v2/GtV2.t.sol b/test/v2/GtV2.t.sol index 3e6ef71..6be18d8 100644 --- a/test/v2/GtV2.t.sol +++ b/test/v2/GtV2.t.sol @@ -579,10 +579,9 @@ contract GtTestV2 is Test { (ids[i],) = LoanUtils.fastMintGt(res, sender, debts[i], collaterals[i]); } vm.stopPrank(); - vm.prank(vm.randomAddress()); - vm.expectRevert( - abi.encodeWithSelector(GearingTokenErrors.CanNotMergeLoanWithDiffOwner.selector, ids[0], sender) - ); + address other = vm.randomAddress(); + vm.prank(other); + vm.expectRevert(abi.encodeWithSignature("AuthorizationFailed(uint256,address)", ids[0], other)); res.gt.merge(ids); } From 9073fdf4fd4362ba34d9e37e01917f32a560807f Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 17 Jul 2025 17:21:41 +0800 Subject: [PATCH 152/194] fix issue 17 --- contracts/v2/tokens/AbstractGearingTokenV2.sol | 18 ++++++++++-------- test/v2/GtV2.t.sol | 4 ++-- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/contracts/v2/tokens/AbstractGearingTokenV2.sol b/contracts/v2/tokens/AbstractGearingTokenV2.sol index a464403..f56bcd9 100644 --- a/contracts/v2/tokens/AbstractGearingTokenV2.sol +++ b/contracts/v2/tokens/AbstractGearingTokenV2.sol @@ -229,21 +229,23 @@ abstract contract AbstractGearingTokenV2 is if (config.maturity <= block.timestamp) { revert GtIsExpired(0); } - uint128 totalDebtAmt; - bytes memory mergedCollateralData; + newId = ids[0]; + LoanInfo memory firstLoan = loanMapping[newId]; + for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; - LoanInfo memory loan = loanMapping[id]; address owner = ownerOf(id); if (msg.sender != owner) { revert AuthorizationFailed(id, msg.sender); } - totalDebtAmt += loan.debtAmt; - mergedCollateralData = - i == 0 ? loan.collateralData : _mergeCollateral(mergedCollateralData, loan.collateralData); - _burnInternal(id); + LoanInfo memory loan = loanMapping[id]; + if (i != 0) { + firstLoan.debtAmt += loanMapping[id].debtAmt; + firstLoan.collateralData = _mergeCollateral(firstLoan.collateralData, loan.collateralData); + _burnInternal(id); + } } - newId = _mintInternal(msg.sender, totalDebtAmt, mergedCollateralData, config); + loanMapping[newId] = firstLoan; emit MergeGts(msg.sender, newId, ids); } diff --git a/test/v2/GtV2.t.sol b/test/v2/GtV2.t.sol index 6be18d8..fa78e5e 100644 --- a/test/v2/GtV2.t.sol +++ b/test/v2/GtV2.t.sol @@ -543,7 +543,7 @@ contract GtTestV2 is Test { StateChecker.MarketState memory state = StateChecker.getMarketState(res); vm.expectEmit(); - uint256 newId = 4; + uint256 newId = ids[0]; emit GearingTokenEvents.MergeGts(sender, newId, ids); newId = res.gt.merge(ids); StateChecker.checkMarketState(res, state); @@ -552,7 +552,7 @@ contract GtTestV2 is Test { assert(owner == sender); assert(d == debts[0] + debts[1] + debts[2]); assert(collaterals[0] + collaterals[1] + collaterals[2] == abi.decode(cd, (uint256))); - for (uint256 i = 0; i < ids.length; i++) { + for (uint256 i = 1; i < ids.length; i++) { vm.expectRevert(abi.encodePacked(bytes4(keccak256("ERC721NonexistentToken(uint256)")), ids[i])); res.gt.loanInfo(ids[i]); } From 15b383dc54a9315da0dcf13fda2290543c912ae9 Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 17 Jul 2025 17:35:36 +0800 Subject: [PATCH 153/194] fix issue 21 --- .../v2/tokens/AbstractGearingTokenV2.sol | 26 +++++++------------ 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/contracts/v2/tokens/AbstractGearingTokenV2.sol b/contracts/v2/tokens/AbstractGearingTokenV2.sol index f56bcd9..c6612d6 100644 --- a/contracts/v2/tokens/AbstractGearingTokenV2.sol +++ b/contracts/v2/tokens/AbstractGearingTokenV2.sol @@ -17,6 +17,7 @@ import {GtConfig, IOracle} from "../../v1/storage/TermMaxStorage.sol"; import {IGearingTokenV2} from "./IGearingTokenV2.sol"; import {GearingTokenEventsV2} from "../events/GearingTokenEventsV2.sol"; import {GearingTokenErrorsV2} from "../errors/GearingTokenErrorsV2.sol"; +import {Math} from "@openzeppelin/contracts/utils/math/Math.sol"; /** * @title TermMax Gearing Token @@ -36,6 +37,7 @@ abstract contract AbstractGearingTokenV2 is using SafeCast for int256; using TransferUtils for IERC20; using TransferUtils for IERC20Metadata; + using Math for *; struct LoanInfo { /// @notice Debt amount in debtToken token @@ -440,8 +442,9 @@ abstract contract AbstractGearingTokenV2 is } else if (ltv >= config.loanConfig.liquidationLtv) { isLiquidable = true; // collateralValue(price decimals) and HALF_LIQUIDATION_THRESHOLD(base decimals 1e8) - maxRepayAmt = (valueAndPrice.collateralValue * Constants.DECIMAL_BASE) / valueAndPrice.priceDenominator - < GearingTokenConstants.HALF_LIQUIDATION_THRESHOLD ? loan.debtAmt : loan.debtAmt / 2; + maxRepayAmt = valueAndPrice.collateralValue.mulDiv( + Constants.DECIMAL_BASE, valueAndPrice.priceDenominator + ) < GearingTokenConstants.HALF_LIQUIDATION_THRESHOLD ? loan.debtAmt : loan.debtAmt / 2; } } } @@ -488,17 +491,6 @@ abstract contract AbstractGearingTokenV2 is } else { loan.debtAmt -= repayAmt; loan.collateralData = remainningC; - - // Check ltv after partial liquidation - { - valueAndPrice.collateralValue = _getCollateralValue(remainningC, valueAndPrice.collateralPriceData); - valueAndPrice.debtValueWithDecimals = - (loan.debtAmt * valueAndPrice.debtPrice) / valueAndPrice.debtDenominator; - uint128 ltvAfter = _calculateLtv(valueAndPrice); - if (ltvBefore < ltvAfter) { - revert LtvIncreasedAfterLiquidation(id, ltvBefore, ltvAfter); - } - } // update storage loanMapping[id] = loan; } @@ -576,7 +568,8 @@ abstract contract AbstractGearingTokenV2 is valueAndPrice.debtDenominator = 10 ** debtDecimals; - valueAndPrice.debtValueWithDecimals = (loan.debtAmt * valueAndPrice.debtPrice) / valueAndPrice.debtDenominator; + valueAndPrice.debtValueWithDecimals = + loan.debtAmt.mulDiv(valueAndPrice.debtPrice, valueAndPrice.debtDenominator); } /// @notice Return the loan to value of this loan @@ -587,9 +580,8 @@ abstract contract AbstractGearingTokenV2 is return type(uint128).max; } // debtValueWithDecimals(price decimals) collateralValue(base decimals) - ltv = ( - (valueAndPrice.debtValueWithDecimals * Constants.DECIMAL_BASE_SQ) - / (valueAndPrice.collateralValue * valueAndPrice.priceDenominator) + ltv = valueAndPrice.debtValueWithDecimals.mulDiv( + Constants.DECIMAL_BASE_SQ, valueAndPrice.collateralValue * valueAndPrice.priceDenominator ).toUint128(); } From ba1e1cf08e44d8d5c31a0275b171cb0782689641 Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 17 Jul 2025 17:55:48 +0800 Subject: [PATCH 154/194] fix issues 22 --- contracts/v2/tokens/AbstractGearingTokenV2.sol | 11 ++++++----- contracts/v2/tokens/GearingTokenWithERC20V2.sol | 7 +++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/contracts/v2/tokens/AbstractGearingTokenV2.sol b/contracts/v2/tokens/AbstractGearingTokenV2.sol index c6612d6..d3fbdcd 100644 --- a/contracts/v2/tokens/AbstractGearingTokenV2.sol +++ b/contracts/v2/tokens/AbstractGearingTokenV2.sol @@ -65,11 +65,11 @@ abstract contract AbstractGearingTokenV2 is GtConfig _config; /// @notice Total supply of Gearing Token uint256 total; + /// @notice Denominator of debt token + uint256 debtDenominator; /// @notice Mapping relationship between Gearing Token id and loan mapping(uint256 => LoanInfo) loanMapping; - uint8 debtDecimals; - /** * @inheritdoc IGearingToken */ @@ -97,7 +97,7 @@ abstract contract AbstractGearingTokenV2 is __ERC721_init(name, symbol); __Ownable_init(msg.sender); _config = config_; - debtDecimals = _config.debtToken.decimals(); + debtDenominator = 10 ** _config.debtToken.decimals(); } function __GearingToken_Implement_init(bytes memory initalParams) internal virtual; @@ -458,7 +458,7 @@ abstract contract AbstractGearingTokenV2 is if (!config.loanConfig.liquidatable) { revert GtDoNotSupportLiquidation(); } - (bool isLiquidable, uint128 maxRepayAmt, uint128 ltvBefore, ValueAndPrice memory valueAndPrice) = + (bool isLiquidable, uint128 maxRepayAmt,, ValueAndPrice memory valueAndPrice) = _getLiquidationInfo(loan, config); if (!isLiquidable) { @@ -564,9 +564,10 @@ abstract contract AbstractGearingTokenV2 is uint8 priceDecimals; (valueAndPrice.debtPrice, priceDecimals) = config.loanConfig.oracle.getPrice(address(config.debtToken)); + // Price decimals may change, so we need to calculate the price denominator valueAndPrice.priceDenominator = 10 ** priceDecimals; - valueAndPrice.debtDenominator = 10 ** debtDecimals; + valueAndPrice.debtDenominator = debtDenominator; valueAndPrice.debtValueWithDecimals = loan.debtAmt.mulDiv(valueAndPrice.debtPrice, valueAndPrice.debtDenominator); diff --git a/contracts/v2/tokens/GearingTokenWithERC20V2.sol b/contracts/v2/tokens/GearingTokenWithERC20V2.sol index 4a6aa2c..0d7f6d8 100644 --- a/contracts/v2/tokens/GearingTokenWithERC20V2.sol +++ b/contracts/v2/tokens/GearingTokenWithERC20V2.sol @@ -27,7 +27,7 @@ contract GearingTokenWithERC20V2 is AbstractGearingTokenV2 { /// @notice The max capacity of collateral token uint256 public collateralCapacity; - uint8 collateralDecimals; + uint256 collateralDenominator; constructor() { _disableInitializers(); @@ -35,7 +35,7 @@ contract GearingTokenWithERC20V2 is AbstractGearingTokenV2 { function __GearingToken_Implement_init(bytes memory initalParams) internal override onlyInitializing { _updateConfig(initalParams); - collateralDecimals = IERC20Metadata(_config.collateral).decimals(); + collateralDenominator = 10 ** IERC20Metadata(_config.collateral).decimals(); } function _updateConfig(bytes memory configData) internal virtual override { @@ -113,8 +113,7 @@ contract GearingTokenWithERC20V2 is AbstractGearingTokenV2 { (uint256 price, uint8 decimals) = config.loanConfig.oracle.getPrice(config.collateral); uint256 priceDenominator = 10 ** decimals; - uint256 cTokenDenominator = 10 ** collateralDecimals; - priceData = abi.encode(price, priceDenominator, cTokenDenominator); + priceData = abi.encode(price, priceDenominator, collateralDenominator); } /// @notice Encode amount to collateral data From 3c03b86e2569fd8f460958cf02edae8eab6edb7e Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 17 Jul 2025 18:10:49 +0800 Subject: [PATCH 155/194] fix issues and remove comments --- .../v2/tokens/AbstractGearingTokenV2.sol | 4 +-- .../v2/tokens/GearingTokenWithERC20V2.sol | 33 +++++++++---------- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/contracts/v2/tokens/AbstractGearingTokenV2.sol b/contracts/v2/tokens/AbstractGearingTokenV2.sol index d3fbdcd..c375e83 100644 --- a/contracts/v2/tokens/AbstractGearingTokenV2.sol +++ b/contracts/v2/tokens/AbstractGearingTokenV2.sol @@ -5,6 +5,7 @@ import {ERC721EnumerableUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol"; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; +import {Math} from "@openzeppelin/contracts/utils/math/Math.sol"; import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; import {Constants} from "../../v1/lib/Constants.sol"; import {GearingTokenConstants} from "../../v1/lib/GearingTokenConstants.sol"; @@ -17,12 +18,11 @@ import {GtConfig, IOracle} from "../../v1/storage/TermMaxStorage.sol"; import {IGearingTokenV2} from "./IGearingTokenV2.sol"; import {GearingTokenEventsV2} from "../events/GearingTokenEventsV2.sol"; import {GearingTokenErrorsV2} from "../errors/GearingTokenErrorsV2.sol"; -import {Math} from "@openzeppelin/contracts/utils/math/Math.sol"; - /** * @title TermMax Gearing Token * @author Term Structure Labs */ + abstract contract AbstractGearingTokenV2 is OwnableUpgradeable, ERC721EnumerableUpgradeable, diff --git a/contracts/v2/tokens/GearingTokenWithERC20V2.sol b/contracts/v2/tokens/GearingTokenWithERC20V2.sol index 0d7f6d8..7260d72 100644 --- a/contracts/v2/tokens/GearingTokenWithERC20V2.sol +++ b/contracts/v2/tokens/GearingTokenWithERC20V2.sol @@ -1,7 +1,6 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.27; -import {MathLib} from "../../v1/lib/MathLib.sol"; import "./AbstractGearingTokenV2.sol"; /** @@ -13,7 +12,7 @@ contract GearingTokenWithERC20V2 is AbstractGearingTokenV2 { using SafeCast for int256; using TransferUtils for IERC20; using TransferUtils for IERC20Metadata; - using MathLib for *; + using Math for *; /// @notice The operation failed because the collateral capacity is exceeded error CollateralCapacityExceeded(); @@ -51,7 +50,7 @@ contract GearingTokenWithERC20V2 is AbstractGearingTokenV2 { function _delivery(uint256 proportion) internal view virtual override returns (bytes memory deliveryData) { uint256 collateralReserve = IERC20(_config.collateral).balanceOf(address(this)); - uint256 amount = (collateralReserve * proportion) / Constants.DECIMAL_BASE_SQ; + uint256 amount = collateralReserve.mulDiv(proportion, Constants.DECIMAL_BASE_SQ); deliveryData = abi.encode(amount); } @@ -97,7 +96,7 @@ contract GearingTokenWithERC20V2 is AbstractGearingTokenV2 { uint256 collateralAmt = _decodeAmount(collateralData); (uint256 price, uint256 priceDenominator, uint256 collateralDemonimator) = abi.decode(priceData, (uint256, uint256, uint256)); - return (collateralAmt * price * Constants.DECIMAL_BASE) / (priceDenominator * collateralDemonimator); + return collateralAmt.mulDiv(price * Constants.DECIMAL_BASE, priceDenominator * collateralDemonimator); } /** @@ -169,11 +168,6 @@ contract GearingTokenWithERC20V2 is AbstractGearingTokenV2 { (uint256 collateralPrice, uint256 cPriceDenominator, uint256 cTokenDenominator) = abi.decode(valueAndPrice.collateralPriceData, (uint256, uint256, uint256)); - // maxRomvedCollateral = min( - // (repayAmt * (1 + REWARD_TO_LIQUIDATOR + REWARD_TO_PROTOCOL)) * debtTokenPrice / collateralTokenPrice , - // collateralAmt *(repayAmt / debtAmt) - // ) - /* DP := debt token price (valueAndPrice.debtPrice) * DPD := debt token price decimal (valueAndPrice.priceDenominator) * CP := collateral token price (collateralPrice) @@ -183,25 +177,30 @@ contract GearingTokenWithERC20V2 is AbstractGearingTokenV2 { * ddPriceToCdPrice = roundUp((DP/DPD) / (CP/CPD) = (DP*CPD*SD) / (CP*DPD)) * = roundUp((DP*CPD*CPD*10) / CP) */ - uint256 ddPriceToCdPrice = ( - valueAndPrice.debtPrice * cPriceDenominator * cPriceDenominator * 10 + collateralPrice - 1 - ) / collateralPrice; + uint256 ddPriceToCdPrice = valueAndPrice.debtPrice.mulDiv( + cPriceDenominator * cPriceDenominator * 10, collateralPrice, Math.Rounding.Ceil + ); // calculate the amount of collateral that is equivalent to repayAmt // with debt to collateral price - uint256 cEqualRepayAmt = (repayAmt * ddPriceToCdPrice * cTokenDenominator) - / (valueAndPrice.debtDenominator * cPriceDenominator * valueAndPrice.priceDenominator * 10); + uint256 cEqualRepayAmt = repayAmt.mulDiv( + ddPriceToCdPrice * cTokenDenominator, + valueAndPrice.debtDenominator * cPriceDenominator * valueAndPrice.priceDenominator * 10 + ); + // uint256 cEqualRepayAmt = (repayAmt * ddPriceToCdPrice * cTokenDenominator) + // / (valueAndPrice.debtDenominator * cPriceDenominator * valueAndPrice.priceDenominator * 10); uint256 rewardToLiquidator = - (cEqualRepayAmt * GearingTokenConstants.REWARD_TO_LIQUIDATOR) / Constants.DECIMAL_BASE; - uint256 rewardToProtocol = (cEqualRepayAmt * GearingTokenConstants.REWARD_TO_PROTOCOL) / Constants.DECIMAL_BASE; + cEqualRepayAmt.mulDiv(GearingTokenConstants.REWARD_TO_LIQUIDATOR, Constants.DECIMAL_BASE); + uint256 rewardToProtocol = + cEqualRepayAmt.mulDiv(GearingTokenConstants.REWARD_TO_PROTOCOL, Constants.DECIMAL_BASE); uint256 removedCollateralAmt = cEqualRepayAmt + rewardToLiquidator + rewardToProtocol; if (loan.debtAmt == 0) { removedCollateralAmt = 0; } else { - removedCollateralAmt = removedCollateralAmt.min((collateralAmt * repayAmt) / loan.debtAmt); + removedCollateralAmt = removedCollateralAmt.min(collateralAmt.mulDiv(repayAmt, loan.debtAmt)); } // Case 1: removed collateral can not cover repayAmt + rewardToLiquidator From 1db5a507e1326af4b7db09b56365ca5c2097253f Mon Sep 17 00:00:00 2001 From: Evan Date: Fri, 18 Jul 2025 09:57:04 +0800 Subject: [PATCH 156/194] simplify liquidate process --- .../v2/tokens/GearingTokenWithERC20V2.sol | 64 ++++++++----------- 1 file changed, 28 insertions(+), 36 deletions(-) diff --git a/contracts/v2/tokens/GearingTokenWithERC20V2.sol b/contracts/v2/tokens/GearingTokenWithERC20V2.sol index 7260d72..e51f1d4 100644 --- a/contracts/v2/tokens/GearingTokenWithERC20V2.sol +++ b/contracts/v2/tokens/GearingTokenWithERC20V2.sol @@ -165,41 +165,33 @@ contract GearingTokenWithERC20V2 is AbstractGearingTokenV2 { { uint256 collateralAmt = _decodeAmount(loan.collateralData); - (uint256 collateralPrice, uint256 cPriceDenominator, uint256 cTokenDenominator) = - abi.decode(valueAndPrice.collateralPriceData, (uint256, uint256, uint256)); - - /* DP := debt token price (valueAndPrice.debtPrice) - * DPD := debt token price decimal (valueAndPrice.priceDenominator) - * CP := collateral token price (collateralPrice) - * CPD := collateral token price decimal (cPriceDenominator) - * SD := scaling decimal = DPD * CPD * 10 - * The value of 1(decimal) debt token / The value of 1(decimal) collateral token - * ddPriceToCdPrice = roundUp((DP/DPD) / (CP/CPD) = (DP*CPD*SD) / (CP*DPD)) - * = roundUp((DP*CPD*CPD*10) / CP) - */ - uint256 ddPriceToCdPrice = valueAndPrice.debtPrice.mulDiv( - cPriceDenominator * cPriceDenominator * 10, collateralPrice, Math.Rounding.Ceil - ); - - // calculate the amount of collateral that is equivalent to repayAmt - // with debt to collateral price - uint256 cEqualRepayAmt = repayAmt.mulDiv( - ddPriceToCdPrice * cTokenDenominator, - valueAndPrice.debtDenominator * cPriceDenominator * valueAndPrice.priceDenominator * 10 - ); - // uint256 cEqualRepayAmt = (repayAmt * ddPriceToCdPrice * cTokenDenominator) - // / (valueAndPrice.debtDenominator * cPriceDenominator * valueAndPrice.priceDenominator * 10); - - uint256 rewardToLiquidator = - cEqualRepayAmt.mulDiv(GearingTokenConstants.REWARD_TO_LIQUIDATOR, Constants.DECIMAL_BASE); - uint256 rewardToProtocol = - cEqualRepayAmt.mulDiv(GearingTokenConstants.REWARD_TO_PROTOCOL, Constants.DECIMAL_BASE); - - uint256 removedCollateralAmt = cEqualRepayAmt + rewardToLiquidator + rewardToProtocol; - - if (loan.debtAmt == 0) { - removedCollateralAmt = 0; - } else { + uint256 removedCollateralAmt; + uint256 cEqualRepayAmt; + uint256 rewardToLiquidator; + uint256 rewardToProtocol; + + if (loan.debtAmt != 0) { + (uint256 collateralPrice, uint256 cPriceDenominator, uint256 cTokenDenominator) = + abi.decode(valueAndPrice.collateralPriceData, (uint256, uint256, uint256)); + + /* DP := debt token price (valueAndPrice.debtPrice) + * DPD := debt token price decimal (valueAndPrice.priceDenominator) + * CP := collateral token price (collateralPrice) + * CPD := collateral token price decimal (cPriceDenominator) + * liquidate value = repayAmt * DP / debt token decimals + * collateral amount to remove = liquidate value * collateral decimals * cpd / (CP * DPD) + */ + uint256 liquidateValueInPriceScale = repayAmt.mulDiv(valueAndPrice.debtPrice, valueAndPrice.debtDenominator); + + cEqualRepayAmt = liquidateValueInPriceScale.mulDiv( + cPriceDenominator * cTokenDenominator, collateralPrice * valueAndPrice.priceDenominator + ); + + rewardToLiquidator = + cEqualRepayAmt.mulDiv(GearingTokenConstants.REWARD_TO_LIQUIDATOR, Constants.DECIMAL_BASE); + rewardToProtocol = cEqualRepayAmt.mulDiv(GearingTokenConstants.REWARD_TO_PROTOCOL, Constants.DECIMAL_BASE); + + removedCollateralAmt = cEqualRepayAmt + rewardToLiquidator + rewardToProtocol; removedCollateralAmt = removedCollateralAmt.min(collateralAmt.mulDiv(repayAmt, loan.debtAmt)); } @@ -218,7 +210,7 @@ contract GearingTokenWithERC20V2 is AbstractGearingTokenV2 { cToLiquidator = _encodeAmount(cEqualRepayAmt + rewardToLiquidator); cToTreasurer = _encodeAmount(rewardToProtocol); } - // Calculate remainning collateral + // Calculate remaining collateral remainningC = _encodeAmount(collateralAmt - removedCollateralAmt); } } From 71b56513f39442c145b008f353ce938882a29946 Mon Sep 17 00:00:00 2001 From: Evan Date: Fri, 18 Jul 2025 10:46:16 +0800 Subject: [PATCH 157/194] simplify liquidate process --- .../v2/tokens/GearingTokenWithERC20V2.sol | 26 +++++-------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/contracts/v2/tokens/GearingTokenWithERC20V2.sol b/contracts/v2/tokens/GearingTokenWithERC20V2.sol index e51f1d4..e0b668b 100644 --- a/contracts/v2/tokens/GearingTokenWithERC20V2.sol +++ b/contracts/v2/tokens/GearingTokenWithERC20V2.sol @@ -161,7 +161,7 @@ contract GearingTokenWithERC20V2 is AbstractGearingTokenV2 { internal virtual override - returns (bytes memory cToLiquidator, bytes memory cToTreasurer, bytes memory remainningC) + returns (bytes memory, bytes memory, bytes memory) { uint256 collateralAmt = _decodeAmount(loan.collateralData); @@ -194,23 +194,11 @@ contract GearingTokenWithERC20V2 is AbstractGearingTokenV2 { removedCollateralAmt = cEqualRepayAmt + rewardToLiquidator + rewardToProtocol; removedCollateralAmt = removedCollateralAmt.min(collateralAmt.mulDiv(repayAmt, loan.debtAmt)); } - - // Case 1: removed collateral can not cover repayAmt + rewardToLiquidator - if (removedCollateralAmt <= cEqualRepayAmt + rewardToLiquidator) { - cToLiquidator = _encodeAmount(removedCollateralAmt); - cToTreasurer = _encodeAmount(0); - } - // Case 2: removed collateral can cover repayAmt + rewardToLiquidator but not rewardToProtocol - else if (removedCollateralAmt < cEqualRepayAmt + rewardToLiquidator + rewardToProtocol) { - cToLiquidator = _encodeAmount(cEqualRepayAmt + rewardToLiquidator); - cToTreasurer = _encodeAmount(removedCollateralAmt - cEqualRepayAmt - rewardToLiquidator); - } - // Case 3: removed collateral equal repayAmt + rewardToLiquidator + rewardToProtocol - else { - cToLiquidator = _encodeAmount(cEqualRepayAmt + rewardToLiquidator); - cToTreasurer = _encodeAmount(rewardToProtocol); - } - // Calculate remaining collateral - remainningC = _encodeAmount(collateralAmt - removedCollateralAmt); + // Send all collateral to liquidator if + uint256 cToLiquidatorAmount = removedCollateralAmt.min(cEqualRepayAmt + rewardToLiquidator); + removedCollateralAmt -= cToLiquidatorAmount; + uint256 cToTreasurerAmount = removedCollateralAmt.min(rewardToProtocol); + uint256 remainingCollateralAmt = collateralAmt - cToLiquidatorAmount - cToTreasurerAmount; + return (abi.encode(cToLiquidatorAmount), abi.encode(cToTreasurerAmount), abi.encode(remainingCollateralAmt)); } } From 00b48c5925efed7a13fc729c71412c6fce7255f0 Mon Sep 17 00:00:00 2001 From: Evan Date: Fri, 18 Jul 2025 10:58:43 +0800 Subject: [PATCH 158/194] fix issue 31 --- contracts/v2/tokens/GearingTokenWithERC20V2.sol | 1 - contracts/v2/tokens/IMintableERC20V2.sol | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/contracts/v2/tokens/GearingTokenWithERC20V2.sol b/contracts/v2/tokens/GearingTokenWithERC20V2.sol index e0b668b..1b88d3f 100644 --- a/contracts/v2/tokens/GearingTokenWithERC20V2.sol +++ b/contracts/v2/tokens/GearingTokenWithERC20V2.sol @@ -194,7 +194,6 @@ contract GearingTokenWithERC20V2 is AbstractGearingTokenV2 { removedCollateralAmt = cEqualRepayAmt + rewardToLiquidator + rewardToProtocol; removedCollateralAmt = removedCollateralAmt.min(collateralAmt.mulDiv(repayAmt, loan.debtAmt)); } - // Send all collateral to liquidator if uint256 cToLiquidatorAmount = removedCollateralAmt.min(cEqualRepayAmt + rewardToLiquidator); removedCollateralAmt -= cToLiquidatorAmount; uint256 cToTreasurerAmount = removedCollateralAmt.min(rewardToProtocol); diff --git a/contracts/v2/tokens/IMintableERC20V2.sol b/contracts/v2/tokens/IMintableERC20V2.sol index 30ce1e3..005ee33 100644 --- a/contracts/v2/tokens/IMintableERC20V2.sol +++ b/contracts/v2/tokens/IMintableERC20V2.sol @@ -8,7 +8,7 @@ import "../../v1/tokens/IMintableERC20.sol"; * @author Term Structure Labs */ interface IMintableERC20V2 { - /// @notice Burn tokens from sender + /// @notice Burn tokens from owner, allowing spender to burn the tokens /// @param owner The address of the token holder /// @param spender The address of the token spender /// @param amount The number of tokens to be burned From 0340da503500a366b8d06e280d4af8d5c868aa94 Mon Sep 17 00:00:00 2001 From: Evan Date: Fri, 18 Jul 2025 11:24:53 +0800 Subject: [PATCH 159/194] remove trasfer to whitelist from PreTMX --- contracts/v2/tokenomics/PreTMX.sol | 18 +--- test/v2/tokenomics/PreTMX.t.sol | 157 ----------------------------- 2 files changed, 1 insertion(+), 174 deletions(-) diff --git a/contracts/v2/tokenomics/PreTMX.sol b/contracts/v2/tokenomics/PreTMX.sol index 5e167b9..933765a 100644 --- a/contracts/v2/tokenomics/PreTMX.sol +++ b/contracts/v2/tokenomics/PreTMX.sol @@ -8,20 +8,16 @@ contract PreTMX is ERC20, Ownable2Step { bool public transferRestricted; mapping(address => bool) public isTransferredFromWhitelisted; - mapping(address => bool) public isTransferredToWhitelisted; error TransferFromNotWhitelisted(address from); - error TransferToNotWhitelisted(address to); event TransferRestricted(bool restricted); event TransferFromWhitelisted(address from, bool isWhitelisted); - event TransferToWhitelisted(address to, bool isWhitelisted); constructor(address admin) ERC20("Pre TermMax Token", "pTMX") Ownable(admin) { _mint(admin, 1e9 ether); _setTransferRestricted(true); _setTransferFromWhitelisted(admin, true); - _setTransferToWhitelisted(admin, true); } function enableTransfer() external onlyOwner { @@ -36,10 +32,6 @@ contract PreTMX is ERC20, Ownable2Step { _setTransferFromWhitelisted(from, isWhitelisted); } - function whitelistTransferTo(address to, bool isWhitelisted) external onlyOwner { - _setTransferToWhitelisted(to, isWhitelisted); - } - function transfer(address to, uint256 amount) public override returns (bool) { _beforeTokenTransfer(msg.sender, to); return super.transfer(to, amount); @@ -58,13 +50,10 @@ contract PreTMX is ERC20, Ownable2Step { _burn(msg.sender, amount); } - function _beforeTokenTransfer(address from, address to) internal view { + function _beforeTokenTransfer(address from, address) internal view { if (transferRestricted && !isTransferredFromWhitelisted[from]) { revert TransferFromNotWhitelisted(from); } - if (transferRestricted && !isTransferredToWhitelisted[to]) { - revert TransferToNotWhitelisted(to); - } } function _setTransferRestricted(bool restricted) internal { @@ -76,9 +65,4 @@ contract PreTMX is ERC20, Ownable2Step { isTransferredFromWhitelisted[from] = isWhitelisted; emit TransferFromWhitelisted(from, isWhitelisted); } - - function _setTransferToWhitelisted(address to, bool isWhitelisted) internal { - isTransferredToWhitelisted[to] = isWhitelisted; - emit TransferToWhitelisted(to, isWhitelisted); - } } diff --git a/test/v2/tokenomics/PreTMX.t.sol b/test/v2/tokenomics/PreTMX.t.sol index cdf0eb3..8bd7254 100644 --- a/test/v2/tokenomics/PreTMX.t.sol +++ b/test/v2/tokenomics/PreTMX.t.sol @@ -33,7 +33,6 @@ contract PreTMXTest is Test { assertTrue(preTMX.transferRestricted()); assertEq(preTMX.owner(), admin); assertTrue(preTMX.isTransferredFromWhitelisted(admin)); - assertTrue(preTMX.isTransferredToWhitelisted(admin)); } function test_EnableTransfer() public { @@ -71,12 +70,6 @@ contract PreTMXTest is Test { preTMX.disableTransfer(); } - function test_Transfer_WhenRestricted_NotWhitelisted() public { - vm.prank(admin); - vm.expectRevert(abi.encodeWithSelector(PreTMX.TransferToNotWhitelisted.selector, user1)); - preTMX.transfer(user1, 1000); - } - function test_Transfer_WhenRestricted_AdminWhitelisted() public { // Admin can transfer to another admin (both whitelisted) vm.prank(admin); @@ -103,15 +96,6 @@ contract PreTMXTest is Test { vm.stopPrank(); } - function test_TransferFrom_WhenRestricted_NotWhitelisted() public { - vm.prank(admin); - preTMX.approve(user1, 1000); - - vm.prank(user1); - vm.expectRevert(abi.encodeWithSelector(PreTMX.TransferToNotWhitelisted.selector, user2)); - preTMX.transferFrom(admin, user2, 1000); - } - function test_TransferFrom_WhenNotRestricted() public { vm.startPrank(admin); preTMX.enableTransfer(); @@ -255,11 +239,9 @@ contract PreTMXTest is Test { function test_WhitelistingState() public { // Admin should be whitelisted by default assertTrue(preTMX.isTransferredFromWhitelisted(admin)); - assertTrue(preTMX.isTransferredToWhitelisted(admin)); // Other users should not be whitelisted assertFalse(preTMX.isTransferredFromWhitelisted(user1)); - assertFalse(preTMX.isTransferredToWhitelisted(user1)); } function test_WhitelistTransferFrom() public { @@ -298,61 +280,6 @@ contract PreTMXTest is Test { preTMX.whitelistTransferFrom(user2, true); } - function test_WhitelistTransferTo() public { - // Initially user1 is not whitelisted - assertFalse(preTMX.isTransferredToWhitelisted(user1)); - - // Admin whitelists user1 for receiving - vm.prank(admin); - - vm.expectEmit(true, true, true, true); - emit PreTMX.TransferToWhitelisted(user1, true); - - preTMX.whitelistTransferTo(user1, true); - - assertTrue(preTMX.isTransferredToWhitelisted(user1)); - } - - function test_WhitelistTransferTo_Unwhitelist() public { - // First whitelist user1 - vm.startPrank(admin); - preTMX.whitelistTransferTo(user1, true); - assertTrue(preTMX.isTransferredToWhitelisted(user1)); - - // Then unwhitelist user1 - vm.expectEmit(true, true, true, true); - emit PreTMX.TransferToWhitelisted(user1, false); - - preTMX.whitelistTransferTo(user1, false); - assertFalse(preTMX.isTransferredToWhitelisted(user1)); - vm.stopPrank(); - } - - function test_WhitelistTransferTo_NotAdmin() public { - vm.prank(user1); - vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, user1)); - preTMX.whitelistTransferTo(user2, true); - } - - function test_WhitelistTransferTo_EnablesTransfer() public { - // Whitelist user1 to receive tokens - vm.startPrank(admin); - - vm.expectEmit(true, true, true, true); - emit PreTMX.TransferToWhitelisted(user1, true); - - preTMX.whitelistTransferTo(user1, true); - - // Now admin can transfer to user1 even when restricted - vm.expectEmit(true, true, false, true); - emit IERC20.Transfer(admin, user1, 1000); - - bool success = preTMX.transfer(user1, 1000); - assertTrue(success); - assertEq(preTMX.balanceOf(user1), 1000); - vm.stopPrank(); - } - function test_WhitelistTransferFrom_EnablesTransfer() public { // Give tokens to user1 via minting and whitelist user1 to send vm.startPrank(admin); @@ -362,7 +289,6 @@ contract PreTMXTest is Test { emit PreTMX.TransferFromWhitelisted(user1, true); preTMX.whitelistTransferFrom(user1, true); - preTMX.whitelistTransferTo(admin, true); // admin already whitelisted but being explicit vm.stopPrank(); // Now user1 can transfer to admin @@ -382,11 +308,6 @@ contract PreTMXTest is Test { emit PreTMX.TransferFromWhitelisted(user1, true); preTMX.whitelistTransferFrom(user1, true); - - vm.expectEmit(true, true, true, true); - emit PreTMX.TransferToWhitelisted(user2, true); - - preTMX.whitelistTransferTo(user2, true); vm.stopPrank(); // Now user1 can transfer to user2 @@ -397,24 +318,6 @@ contract PreTMXTest is Test { assertEq(preTMX.balanceOf(user2), 300); } - function test_PartialWhitelisting_StillRestricted() public { - // Only whitelist user1 to send, but not user2 to receive - vm.startPrank(admin); - preTMX.mint(user1, 1000); - - vm.expectEmit(true, true, true, true); - emit PreTMX.TransferFromWhitelisted(user1, true); - - preTMX.whitelistTransferFrom(user1, true); - // user2 is not whitelisted to receive - vm.stopPrank(); - - // Transfer should still fail because user2 is not whitelisted to receive - vm.prank(user1); - vm.expectRevert(abi.encodeWithSelector(PreTMX.TransferToNotWhitelisted.selector, user2)); - preTMX.transfer(user2, 500); - } - function test_WhitelistTransferFrom_WithTransferFrom() public { // Test whitelisting with transferFrom function vm.startPrank(admin); @@ -424,11 +327,6 @@ contract PreTMXTest is Test { emit PreTMX.TransferFromWhitelisted(user1, true); preTMX.whitelistTransferFrom(user1, true); - - vm.expectEmit(true, true, true, true); - emit PreTMX.TransferToWhitelisted(user2, true); - - preTMX.whitelistTransferTo(user2, true); vm.stopPrank(); // user1 approves admin to spend tokens @@ -448,7 +346,6 @@ contract PreTMXTest is Test { vm.startPrank(admin); preTMX.mint(user1, 1000); preTMX.whitelistTransferFrom(user1, true); - preTMX.whitelistTransferTo(user2, true); vm.stopPrank(); // Verify transfer works @@ -481,13 +378,6 @@ contract PreTMXTest is Test { preTMX.transfer(admin, 500); } - function test_RestrictedTransfer_ToNotWhitelisted() public { - // Admin tries to transfer to non-whitelisted user1 - should fail - vm.prank(admin); - vm.expectRevert(abi.encodeWithSelector(PreTMX.TransferToNotWhitelisted.selector, user1)); - preTMX.transfer(user1, 1000); - } - function test_RestrictedTransferFrom_FromNotWhitelisted() public { // Give tokens to user1 and approve user2 vm.prank(admin); @@ -523,11 +413,9 @@ contract PreTMXTest is Test { vm.startPrank(admin); preTMX.whitelistTransferFrom(user, fromWhitelisted); - preTMX.whitelistTransferTo(user, toWhitelisted); vm.stopPrank(); assertEq(preTMX.isTransferredFromWhitelisted(user), fromWhitelisted); - assertEq(preTMX.isTransferredToWhitelisted(user), toWhitelisted); } function test_WhitelistSelf() public { @@ -539,13 +427,7 @@ contract PreTMXTest is Test { preTMX.whitelistTransferFrom(admin, false); - vm.expectEmit(true, true, true, true); - emit PreTMX.TransferToWhitelisted(admin, false); - - preTMX.whitelistTransferTo(admin, false); - assertFalse(preTMX.isTransferredFromWhitelisted(admin)); - assertFalse(preTMX.isTransferredToWhitelisted(admin)); // Re-whitelist admin vm.expectEmit(true, true, true, true); @@ -553,47 +435,8 @@ contract PreTMXTest is Test { preTMX.whitelistTransferFrom(admin, true); - vm.expectEmit(true, true, true, true); - emit PreTMX.TransferToWhitelisted(admin, true); - - preTMX.whitelistTransferTo(admin, true); - assertTrue(preTMX.isTransferredFromWhitelisted(admin)); - assertTrue(preTMX.isTransferredToWhitelisted(admin)); - vm.stopPrank(); - } - - function test_RestrictedTransferFrom_ToNotWhitelisted() public { - // Test transferFrom with non-whitelisted recipient - vm.startPrank(admin); - preTMX.mint(user1, 1000); - preTMX.whitelistTransferFrom(user1, true); // whitelist sender but not recipient vm.stopPrank(); - - vm.prank(user1); - preTMX.approve(admin, 500); - - vm.prank(admin); - vm.expectRevert(abi.encodeWithSelector(PreTMX.TransferToNotWhitelisted.selector, user2)); - preTMX.transferFrom(user1, user2, 500); - } - - function test_BothErrorTypes() public { - // Test that we get from error when sender not whitelisted - vm.prank(admin); - preTMX.mint(user1, 1000); - - vm.prank(user1); - vm.expectRevert(abi.encodeWithSelector(PreTMX.TransferFromNotWhitelisted.selector, user1)); - preTMX.transfer(user2, 500); - - // Test that we get to error when recipient not whitelisted (sender is whitelisted) - vm.prank(admin); - preTMX.whitelistTransferFrom(user1, true); - - vm.prank(user1); - vm.expectRevert(abi.encodeWithSelector(PreTMX.TransferToNotWhitelisted.selector, user2)); - preTMX.transfer(user2, 500); } // ============ Ownership Transfer Tests ============ From 376982727dc3c51f2b4cca17794b6a11b432f427 Mon Sep 17 00:00:00 2001 From: Evan Date: Fri, 18 Jul 2025 13:10:42 +0800 Subject: [PATCH 160/194] fix interfaces --- contracts/interfaces/ITermMaxRouter.sol | 11 + contracts/v2/router/ITermMaxRouterV2.sol | 255 +---------------------- contracts/v2/router/TermMaxRouterV2.sol | 28 +-- test/v2/mainnet-fork/GtBaseTestV2.t.sol | 2 +- 4 files changed, 17 insertions(+), 279 deletions(-) create mode 100644 contracts/interfaces/ITermMaxRouter.sol diff --git a/contracts/interfaces/ITermMaxRouter.sol b/contracts/interfaces/ITermMaxRouter.sol new file mode 100644 index 0000000..4e8dde0 --- /dev/null +++ b/contracts/interfaces/ITermMaxRouter.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {ITermMaxRouter as ITermMaxRouterV1} from "../v1/router/ITermMaxRouter.sol"; +import {ITermMaxRouterV2} from "../v2/router/ITermMaxRouterV2.sol"; + +/** + * @title TermMax Router interface + * @author Term Structure Labs + */ +interface ITermMaxRouter is ITermMaxRouterV1, ITermMaxRouterV2 {} diff --git a/contracts/v2/router/ITermMaxRouterV2.sol b/contracts/v2/router/ITermMaxRouterV2.sol index da89e61..c17f4bc 100644 --- a/contracts/v2/router/ITermMaxRouterV2.sol +++ b/contracts/v2/router/ITermMaxRouterV2.sol @@ -24,218 +24,6 @@ interface ITermMaxRouterV2 { uint256 deadline; } - /** - * @notice Pauses all protocol operations - * @dev Can only be called by authorized addresses - */ - function pause() external; - - /** - * @notice Unpauses protocol operations - * @dev Can only be called by authorized addresses - */ - function unpause() external; - - /** - * @notice View the adapter whitelist status - * @dev Used for controlling which swap adapters can be used - * @param adapter The adapter's address to check whitelist status for - * @return True if whitelisted, false otherwise - */ - function adapterWhitelist(address adapter) external view returns (bool); - - /** - * @notice Set the adapter whitelist status - * @dev Used for controlling which swap adapters can be used - * @param adapter The adapter's address to set whitelist status for - * @param isWhitelist True to whitelist, false to remove from whitelist - */ - function setAdapterWhitelist(address adapter, bool isWhitelist) external; - - /** - * @notice Retrieves all assets owned by an address in a specific market - * @dev Returns both ERC20 tokens and GT (Governance Token) positions - * @param market The market to query assets from - * @param owner The address to check assets for - * @return tokens Array of ERC20 token addresses - * @return balances Corresponding balances for each token - * @return gt The GT token contract address - * @return gtIds Array of GT token IDs owned by the address - */ - function assetsWithERC20Collateral(ITermMaxMarket market, address owner) - external - view - returns (IERC20[4] memory tokens, uint256[4] memory balances, address gt, uint256[] memory gtIds); - - /** - * @notice Swaps an exact amount of input token for output token - * @dev Uses specified orders for the swap path - * @param tokenIn Input token to swap from - * @param tokenOut Output token to swap to - * @param recipient Address to receive the output tokens - * @param orders Array of orders to use for the swap path - * @param tradingAmts Array of amounts to trade for each order - * @param minTokenOut Minimum amount of output tokens to receive - * @param deadline The deadline timestamp for the transaction - * @return netTokenOut Actual amount of output tokens received - */ - function swapExactTokenToToken( - IERC20 tokenIn, - IERC20 tokenOut, - address recipient, - ITermMaxOrder[] memory orders, - uint128[] memory tradingAmts, - uint128 minTokenOut, - uint256 deadline - ) external returns (uint256 netTokenOut); - - /** - * @notice Swaps tokens to receive an exact amount of output token - * @dev Uses specified orders for the swap path - * @param tokenIn Input token to swap from - * @param tokenOut Output token to swap to - * @param recipient Address to receive the output tokens - * @param orders Array of orders to use for the swap path - * @param tradingAmts Array of amounts to trade for each order - * @param maxTokenIn Maximum amount of input tokens to spend - * @param deadline The deadline timestamp for the transaction - * @return netTokenIn Actual amount of input tokens spent - */ - function swapTokenToExactToken( - IERC20 tokenIn, - IERC20 tokenOut, - address recipient, - ITermMaxOrder[] memory orders, - uint128[] memory tradingAmts, - uint128 maxTokenIn, - uint256 deadline - ) external returns (uint256 netTokenIn); - - /** - * @notice Sells FT and XT tokens for underlying tokens - * @dev Executes multiple orders to sell tokens - * @param recipient Address to receive the output tokens - * @param market The market to sell tokens in - * @param ftInAmt Amount of FT tokens to sell - * @param xtInAmt Amount of XT tokens to sell - * @param orders Array of orders to execute - * @param amtsToSellTokens Array of amounts to sell for each order - * @param minTokenOut Minimum amount of output tokens to receive - * @param deadline The deadline timestamp for the transaction - * @return netTokenOut Actual amount of output tokens received - */ - function sellTokens( - address recipient, - ITermMaxMarket market, - uint128 ftInAmt, - uint128 xtInAmt, - ITermMaxOrder[] memory orders, - uint128[] memory amtsToSellTokens, - uint128 minTokenOut, - uint256 deadline - ) external returns (uint256 netTokenOut); - - /** - * @notice Creates a leveraged position from input tokens - * @dev Swaps tokens for XT and creates a leveraged position - * @param recipient Address to receive the position - * @param market The market to create position in - * @param orders Array of orders to execute - * @param amtsToBuyXt Array of amounts of XT to buy for each order - * @param minXtOut Minimum amount of XT to establish the position - * @param tokenToSwap Amount of tokens to swap - * @param maxLtv Maximum loan-to-value ratio - * @param units Array of swap units defining the swap path - * @param deadline The deadline timestamp for the transaction - * @return gtId ID of the generated GT token - * @return netXtOut Amount of XT tokens received - */ - function leverageFromToken( - address recipient, - ITermMaxMarket market, - ITermMaxOrder[] memory orders, - uint128[] memory amtsToBuyXt, - uint128 minXtOut, - uint128 tokenToSwap, - uint128 maxLtv, - SwapUnit[] memory units, - uint256 deadline - ) external returns (uint256 gtId, uint256 netXtOut); - - /** - * @notice Creates a leveraged position from XT tokens - * @dev Uses existing XT tokens to create a leveraged position - * @param recipient Address to receive the position - * @param market The market to create position in - * @param xtInAmt Amount of XT tokens to use - * @param tokenInAmt Amount of additional tokens to use - * @param maxLtv Maximum loan-to-value ratio - * @param units Array of swap units defining the swap path - * @return gtId ID of the generated GT token - */ - function leverageFromXt( - address recipient, - ITermMaxMarket market, - uint128 xtInAmt, - uint128 tokenInAmt, - uint128 maxLtv, - SwapUnit[] memory units - ) external returns (uint256 gtId); - - function leverageFromXtAndCollateral( - address recipient, - ITermMaxMarket market, - uint128 xtInAmt, - uint128 collateralInAmt, - uint128 maxLtv, - SwapUnit[] memory units - ) external returns (uint256 gtId); - - /** - * @notice Borrows tokens using collateral - * @dev Creates a collateralized debt position - * @param recipient Address to receive the borrowed tokens - * @param market The market to borrow from - * @param collInAmt Amount of collateral to deposit - * @param orders Array of orders to execute - * @param tokenAmtsWantBuy Array of token amounts to buy - * @param maxDebtAmt Maximum amount of debt to take on - * @param deadline The deadline timestamp for the transaction - * @return gtId ID of the generated GT token - */ - function borrowTokenFromCollateral( - address recipient, - ITermMaxMarket market, - uint256 collInAmt, - ITermMaxOrder[] memory orders, - uint128[] memory tokenAmtsWantBuy, - uint128 maxDebtAmt, - uint256 deadline - ) external returns (uint256 gtId); - - /** - * @notice Borrows tokens using collateral and XT - * @dev Creates a collateralized debt position - * @param recipient Address to receive the borrowed tokens - * @param market The market to borrow from - * @param collInAmt Amount of collateral to deposit - * @param borrowAmt Amount of tokens to borrow - * @return gtId ID of the generated GT token - */ - function borrowTokenFromCollateral(address recipient, ITermMaxMarket market, uint256 collInAmt, uint256 borrowAmt) - external - returns (uint256 gtId); - - /** - * @notice Borrows tokens from an existing GT position - * @dev Increases the debt of an existing position - * @param recipient Address to receive the borrowed tokens - * @param market The market to borrow from - * @param gtId ID of the GT token to borrow from - * @param borrowAmt Amount of tokens to borrow - */ - function borrowTokenFromGt(address recipient, ITermMaxMarket market, uint256 gtId, uint256 borrowAmt) external; - /** * @notice Repays debt from collateral * @dev Repays debt and closes a position @@ -243,6 +31,7 @@ interface ITermMaxRouterV2 { * @param market The market to repay debt in * @param gtId ID of the GT token to repay debt from * @param byDebtToken True if repaying with debt token, false if using FT token + * @param expectedOutput Expected amount of tokens to receive after swap * @param units Array of swap units defining the external swap path * @param swapData Data for the termmax swap operation * @return netTokenOut Actual amount of tokens received @@ -270,29 +59,7 @@ interface ITermMaxRouterV2 { ) external returns (uint256 netTokenOut); /** - * @notice Repays debt using FT tokens - * @dev Repays debt and closes a position - * @param recipient Address to receive any remaining tokens - * @param market The market to repay debt in - * @param gtId ID of the GT token to repay debt from - * @param orders Array of orders to execute - * @param ftAmtsWantBuy Array of FT amounts to buy for each order - * @param maxTokenIn Maximum amount of tokens to spend - * @param deadline The deadline timestamp for the transaction - * @return returnAmt Actual amount of tokens returned - */ - function repayByTokenThroughFt( - address recipient, - ITermMaxMarket market, - uint256 gtId, - ITermMaxOrder[] memory orders, - uint128[] memory ftAmtsWantBuy, - uint128 maxTokenIn, - uint256 deadline - ) external returns (uint256 returnAmt); - - /** - * @notice Repays a GT in a TermMax market + * @notice Repays debt * @param market The TermMax market to repay in * @param gtId The ID of the GT to repay * @param maxRepayAmt Maximum amount of tokens to repay @@ -303,24 +70,6 @@ interface ITermMaxRouterV2 { external returns (uint128 repayAmt); - /** - * @notice Redeems FT tokens and swaps for underlying tokens - * @dev Executes a swap to redeem FT tokens - * @param recipient Address to receive the output tokens - * @param market The market to redeem FT tokens in - * @param ftAmount Amount of FT tokens to redeem - * @param units Array of swap units defining the swap path - * @param minTokenOut Minimum amount of output tokens to receive - * @return redeemedAmt Actual amount of output tokens received - */ - function redeemAndSwap( - address recipient, - ITermMaxMarket market, - uint256 ftAmount, - SwapUnit[] memory units, - uint256 minTokenOut - ) external returns (uint256 redeemedAmt); - /** * @notice Rollover GT position to a new market with additional assets(dont support partial rollover) * @dev This function allows users to rollover their GT position to a new market diff --git a/contracts/v2/router/TermMaxRouterV2.sol b/contracts/v2/router/TermMaxRouterV2.sol index 848670b..ddffdd5 100644 --- a/contracts/v2/router/TermMaxRouterV2.sol +++ b/contracts/v2/router/TermMaxRouterV2.sol @@ -94,26 +94,19 @@ contract TermMaxRouterV2 is function _authorizeUpgrade(address newImplementation) internal virtual override onlyOwner {} function initialize(address admin) public initializer { - __UUPSUpgradeable_init(); - __Pausable_init(); - __Ownable_init(admin); + __UUPSUpgradeable_init_unchained(); + __Pausable_init_unchained(); + __Ownable_init_unchained(admin); } - /** - * @inheritdoc ITermMaxRouterV2 - */ function setAdapterWhitelist(address adapter, bool isWhitelist) external onlyOwner { adapterWhitelist[adapter] = isWhitelist; emit UpdateSwapAdapterWhiteList(adapter, isWhitelist); } - /** - * @inheritdoc ITermMaxRouterV2 - */ function assetsWithERC20Collateral(ITermMaxMarket market, address owner) external view - override returns (IERC20[4] memory tokens, uint256[4] memory balances, address gtAddr, uint256[] memory gtIds) { (IERC20 ft, IERC20 xt, IGearingToken gt, address collateral, IERC20 underlying) = market.tokens(); @@ -258,9 +251,6 @@ contract TermMaxRouterV2 is emit IssueGt(market, gtId, msg.sender, recipient, tokenToSwap, netXtOut.toUint128(), ltv, collateralData); } - /** - * @inheritdoc ITermMaxRouterV2 - */ function leverageFromXt( address recipient, ITermMaxMarket market, @@ -288,9 +278,6 @@ contract TermMaxRouterV2 is emit IssueGt(market, gtId, msg.sender, recipient, tokenInAmt, xtInAmt, ltv, collateralData); } - /** - * @inheritdoc ITermMaxRouterV2 - */ function leverageFromXtAndCollateral( address recipient, ITermMaxMarket market, @@ -322,9 +309,6 @@ contract TermMaxRouterV2 is emit IssueGt(market, gtId, msg.sender, recipient, 0, xtInAmt, ltv, collateralData); } - /** - * @inheritdoc ITermMaxRouterV2 - */ function borrowTokenFromCollateral( address recipient, ITermMaxMarket market, @@ -458,9 +442,6 @@ contract TermMaxRouterV2 is debtToken.safeTransfer(recipient, netTokenOut); } - /** - * @inheritdoc ITermMaxRouterV2 - */ function repayByTokenThroughFt( address recipient, ITermMaxMarket market, @@ -515,9 +496,6 @@ contract TermMaxRouterV2 is gt.repay(gtId, repayAmt, byDebtToken); } - /** - * @inheritdoc ITermMaxRouterV2 - */ function redeemAndSwap( address recipient, ITermMaxMarket market, diff --git a/test/v2/mainnet-fork/GtBaseTestV2.t.sol b/test/v2/mainnet-fork/GtBaseTestV2.t.sol index 11a97f4..a30d93e 100644 --- a/test/v2/mainnet-fork/GtBaseTestV2.t.sol +++ b/test/v2/mainnet-fork/GtBaseTestV2.t.sol @@ -84,7 +84,7 @@ abstract contract GtBaseTestV2 is ForkBaseTestV2 { MockPriceFeed collateralPriceFeed; MockPriceFeed debtPriceFeed; ITermMaxOrder order; - ITermMaxRouterV2 router; + TermMaxRouterV2 router; uint256 maxXtReserve; address maker; SwapData swapData; From 29ba9fb2614a5caf62bedd58a623b05baa267f18 Mon Sep 17 00:00:00 2001 From: Evan Date: Fri, 18 Jul 2025 13:14:11 +0800 Subject: [PATCH 161/194] fix issue 39 --- contracts/v2/router/TermMaxRouterV2.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/v2/router/TermMaxRouterV2.sol b/contracts/v2/router/TermMaxRouterV2.sol index ddffdd5..b4793f1 100644 --- a/contracts/v2/router/TermMaxRouterV2.sol +++ b/contracts/v2/router/TermMaxRouterV2.sol @@ -17,7 +17,6 @@ import {ITermMaxOrder} from "../../v1/ITermMaxOrder.sol"; import {SwapUnit} from "../../v1/router/ISwapAdapter.sol"; import {RouterErrors} from "../../v1/errors/RouterErrors.sol"; import {RouterEvents} from "../../v1/events/RouterEvents.sol"; -import {TransferUtils} from "../../v1/lib/TransferUtils.sol"; import {IFlashLoanReceiver} from "../../v1/IFlashLoanReceiver.sol"; import {IFlashRepayer} from "../../v1/tokens/IFlashRepayer.sol"; import {ITermMaxRouterV2} from "./ITermMaxRouterV2.sol"; @@ -29,6 +28,7 @@ import {MathLib} from "../../v1/lib/MathLib.sol"; import {IERC20SwapAdapter} from "./IERC20SwapAdapter.sol"; import {RouterEventsV2} from "../events/RouterEventsV2.sol"; import {RouterErrorsV2} from "../errors/RouterErrorsV2.sol"; +import {TransferUtilsV2} from "../lib/TransferUtilsV2.sol"; /** * @title TermMax Router V2 @@ -46,7 +46,7 @@ contract TermMaxRouterV2 is RouterEvents { using SafeCast for *; - using TransferUtils for IERC20; + using TransferUtilsV2 for IERC20; using MathLib for uint256; enum FlashLoanType { @@ -185,7 +185,7 @@ contract TermMaxRouterV2 is if (orders.length != tradingAmts.length) revert OrdersAndAmtsLengthNotMatch(); for (uint256 i = 0; i < orders.length; ++i) { ITermMaxOrder order = orders[i]; - tokenIn.safeIncreaseAllowance(address(order), maxTokenIn); + tokenIn.forceApprove(address(order), maxTokenIn); netTokenIn += order.swapTokenToExactToken(tokenIn, tokenOut, recipient, tradingAmts[i], maxTokenIn, deadline); } From 28c2926ef0432a93d3d4a482c5425fbf9fd6c009 Mon Sep 17 00:00:00 2001 From: Evan Date: Fri, 18 Jul 2025 13:27:19 +0800 Subject: [PATCH 162/194] fix issues 40 --- contracts/v2/lib/ArrayUtilsV2.sol | 34 +++++++++++++++++++++++++ contracts/v2/router/TermMaxRouterV2.sol | 20 ++++++--------- 2 files changed, 42 insertions(+), 12 deletions(-) create mode 100644 contracts/v2/lib/ArrayUtilsV2.sol diff --git a/contracts/v2/lib/ArrayUtilsV2.sol b/contracts/v2/lib/ArrayUtilsV2.sol new file mode 100644 index 0000000..83a8717 --- /dev/null +++ b/contracts/v2/lib/ArrayUtilsV2.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library ArrayUtilsV2 { + error IndexOutOfBounds(); + + function indexOf(address[] storage arr, address value) internal view returns (uint256) { + for (uint256 i = 0; i < arr.length; i++) { + if (arr[i] == value) { + return i; + } + } + revert IndexOutOfBounds(); + } + + function remove(address[] storage arr, uint256 index) internal { + for (uint256 i = index; i < arr.length - 1; ++i) { + arr[i] = arr[i + 1]; + } + arr.pop(); + } + + function sum(uint128[] memory values) internal pure returns (uint128 total) { + for (uint256 i = 0; i < values.length; ++i) { + total += values[i]; + } + } + + function sum(uint256[] memory values) internal pure returns (uint256 total) { + for (uint256 i = 0; i < values.length; ++i) { + total += values[i]; + } + } +} diff --git a/contracts/v2/router/TermMaxRouterV2.sol b/contracts/v2/router/TermMaxRouterV2.sol index b4793f1..1256ba3 100644 --- a/contracts/v2/router/TermMaxRouterV2.sol +++ b/contracts/v2/router/TermMaxRouterV2.sol @@ -11,6 +11,7 @@ import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; +import {Math} from "@openzeppelin/contracts/utils/math/Math.sol"; import {ITermMaxMarket} from "../../v1/ITermMaxMarket.sol"; import {ITermMaxMarketV2} from "../../v2/ITermMaxMarketV2.sol"; import {ITermMaxOrder} from "../../v1/ITermMaxOrder.sol"; @@ -24,11 +25,11 @@ import {IGearingToken} from "../../v1/tokens/IGearingToken.sol"; import {IGearingTokenV2} from "../tokens/IGearingTokenV2.sol"; import {CurveCuts, OrderConfig} from "../../v1/storage/TermMaxStorage.sol"; import {Constants} from "../../v1/lib/Constants.sol"; -import {MathLib} from "../../v1/lib/MathLib.sol"; import {IERC20SwapAdapter} from "./IERC20SwapAdapter.sol"; import {RouterEventsV2} from "../events/RouterEventsV2.sol"; import {RouterErrorsV2} from "../errors/RouterErrorsV2.sol"; import {TransferUtilsV2} from "../lib/TransferUtilsV2.sol"; +import {ArrayUtilsV2} from "../lib/ArrayUtilsV2.sol"; /** * @title TermMax Router V2 @@ -47,7 +48,8 @@ contract TermMaxRouterV2 is { using SafeCast for *; using TransferUtilsV2 for IERC20; - using MathLib for uint256; + using Math for *; + using ArrayUtilsV2 for *; enum FlashLoanType { COLLATERAL, @@ -134,7 +136,7 @@ contract TermMaxRouterV2 is uint128 minTokenOut, uint256 deadline ) external whenNotPaused returns (uint256 netTokenOut) { - uint256 totalAmtIn = sum(tradingAmts); + uint256 totalAmtIn = tradingAmts.sum(); tokenIn.safeTransferFrom(msg.sender, address(this), totalAmtIn); netTokenOut = _swapExactTokenToToken(tokenIn, tokenOut, recipient, orders, tradingAmts, minTokenOut, deadline); emit SwapExactTokenToToken(tokenIn, tokenOut, msg.sender, recipient, orders, tradingAmts, netTokenOut); @@ -192,12 +194,6 @@ contract TermMaxRouterV2 is if (netTokenIn > maxTokenIn) revert InsufficientTokenIn(address(tokenIn), netTokenIn, maxTokenIn); } - function sum(uint128[] memory values) internal pure returns (uint256 total) { - for (uint256 i = 0; i < values.length; ++i) { - total += values[i]; - } - } - function sellTokens( address recipient, ITermMaxMarket market, @@ -237,7 +233,7 @@ contract TermMaxRouterV2 is tstore(T_CALLBACK_ADDRESS_STORE, market) // set callback address } (, IERC20 xt, IGearingToken gt,, IERC20 debtToken) = market.tokens(); - uint256 totalAmtToBuyXt = sum(amtsToBuyXt); + uint256 totalAmtToBuyXt = amtsToBuyXt.sum(); debtToken.safeTransferFrom(msg.sender, address(this), tokenToSwap + totalAmtToBuyXt); netXtOut = _swapExactTokenToToken(debtToken, xt, address(this), orders, amtsToBuyXt, minXtOut, deadline); xt.safeIncreaseAllowance(address(market), netXtOut); @@ -456,7 +452,7 @@ contract TermMaxRouterV2 is debtToken.safeTransferFrom(msg.sender, address(this), maxTokenIn); uint256 netCost = _swapTokenToExactToken(debtToken, ft, address(this), orders, ftAmtsWantBuy, maxTokenIn, deadline); - uint256 totalFtAmt = sum(ftAmtsWantBuy); + uint256 totalFtAmt = ftAmtsWantBuy.sum(); (, uint128 repayAmt,) = gt.loanInfo(gtId); if (totalFtAmt < repayAmt) { @@ -781,7 +777,7 @@ contract TermMaxRouterV2 is gt.repay(gtId, repaidFtAmt.toUint128(), false); } // check remaining debt token amount - uint256 totalDebtTokenAmt = sum(swapData.tradingAmts) + additionalAssets; + uint256 totalDebtTokenAmt = swapData.tradingAmts.sum() + additionalAssets; if (totalDebtTokenAmt > debtAmt) { uint256 repaidDebtAmt = totalDebtTokenAmt - debtAmt; debtToken.safeIncreaseAllowance(address(gt), repaidDebtAmt); From cc5d242e87acaf527ed033421189a375294c521a Mon Sep 17 00:00:00 2001 From: Evan Date: Fri, 18 Jul 2025 15:08:01 +0800 Subject: [PATCH 163/194] fix issues 45 --- .../priceFeeds/TermMaxPriceFeedConverter.sol | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/contracts/v2/oracle/priceFeeds/TermMaxPriceFeedConverter.sol b/contracts/v2/oracle/priceFeeds/TermMaxPriceFeedConverter.sol index 78f3924..56e6e5c 100644 --- a/contracts/v2/oracle/priceFeeds/TermMaxPriceFeedConverter.sol +++ b/contracts/v2/oracle/priceFeeds/TermMaxPriceFeedConverter.sol @@ -2,26 +2,28 @@ pragma solidity ^0.8.27; import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import {Math} from "@openzeppelin/contracts/utils/math/Math.sol"; +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; import {ITermMaxPriceFeed, AggregatorV3Interface} from "./ITermMaxPriceFeed.sol"; -import {MathLib} from "contracts/v1/lib/MathLib.sol"; contract TermMaxPriceFeedConverter is ITermMaxPriceFeed { - using MathLib for *; + using Math for *; + using SafeCast for *; error GetRoundDataNotSupported(); AggregatorV3Interface public immutable aTokenToBTokenPriceFeed; AggregatorV3Interface public immutable bTokenToCTokenPriceFeed; - int256 immutable priceDemonitor; + uint256 immutable priceDemonitor; address public immutable asset; + uint256 constant PRICE_DENOMINATOR = 10 ** 8; constructor(address _aTokenToBTokenPriceFeed, address _bTokenToCTokenPriceFeed, address _asset) { asset = _asset; aTokenToBTokenPriceFeed = AggregatorV3Interface(_aTokenToBTokenPriceFeed); bTokenToCTokenPriceFeed = AggregatorV3Interface(_bTokenToCTokenPriceFeed); - priceDemonitor = - int256(10 ** aTokenToBTokenPriceFeed.decimals()) * int256(10 ** bTokenToCTokenPriceFeed.decimals()); + priceDemonitor = 10 ** (aTokenToBTokenPriceFeed.decimals() + bTokenToCTokenPriceFeed.decimals()); } function decimals() public view returns (uint8) { @@ -57,7 +59,7 @@ contract TermMaxPriceFeedConverter is ITermMaxPriceFeed { aTokenToBTokenPriceFeed.latestRoundData(); (, int256 answer2, uint256 startedAt2, uint256 updatedAt2,) = bTokenToCTokenPriceFeed.latestRoundData(); // tokenPrice = answer * answer2 - answer = answer * answer2 * int256((10 ** decimals())) / priceDemonitor; + answer = answer.toUint256().mulDiv(answer2.toUint256() * PRICE_DENOMINATOR, priceDemonitor).toInt256(); return (roundId, answer, startedAt.min(startedAt2), updatedAt.min(updatedAt2), answeredInRound); } } From 4a39d02da7272b4f3f84ce80eea6960238dc20bb Mon Sep 17 00:00:00 2001 From: Evan Date: Fri, 18 Jul 2025 17:11:36 +0800 Subject: [PATCH 164/194] fix issue 44,45 --- contracts/v2/access/AccessManagerV2.sol | 8 +++++--- contracts/v2/oracle/OracleAggregatorV2.sol | 14 ++++---------- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/contracts/v2/access/AccessManagerV2.sol b/contracts/v2/access/AccessManagerV2.sol index 3b11216..94b8cd4 100644 --- a/contracts/v2/access/AccessManagerV2.sol +++ b/contracts/v2/access/AccessManagerV2.sol @@ -20,10 +20,12 @@ contract AccessManagerV2 is AccessManager { * @custom:gas-optimization Uses a simple loop for batch operations */ function batchSetSwitch(IPausable[] calldata entities, bool state) external onlyRole(PAUSER_ROLE) { - for (uint256 i = 0; i < entities.length; i++) { - if (state) { + if (state) { + for (uint256 i = 0; i < entities.length; ++i) { entities[i].unpause(); - } else { + } + } else { + for (uint256 i = 0; i < entities.length; ++i) { entities[i].pause(); } } diff --git a/contracts/v2/oracle/OracleAggregatorV2.sol b/contracts/v2/oracle/OracleAggregatorV2.sol index f024e98..4b568c0 100644 --- a/contracts/v2/oracle/OracleAggregatorV2.sol +++ b/contracts/v2/oracle/OracleAggregatorV2.sol @@ -37,16 +37,6 @@ contract OracleAggregatorV2 is IOracleV2, Ownable2Step { /// @notice Error thrown when the asset or oracle address is invalid error InvalidAssetOrOracle(); - /** - * @notice Error thrown when attempting to set a value that's already set - */ - error AlreadySet(); - - /** - * @notice Error thrown when attempting to submit a change that's already pending - */ - error AlreadyPending(); - /** * @notice Error thrown when trying to accept a change that has no pending value */ @@ -201,6 +191,10 @@ contract OracleAggregatorV2 is IOracleV2, Ownable2Step { function getPrice(address asset) external view override returns (uint256, uint8) { Oracle memory oracle = oracles[asset]; + if (oracle.aggregator == AggregatorV3Interface(address(0))) { + revert InvalidAssetOrOracle(); + } + // Try primary oracle first { (, int256 answer,, uint256 updatedAt,) = oracle.aggregator.latestRoundData(); From 193ad9f90566bde768f1b6308c6ffb8baff0c898 Mon Sep 17 00:00:00 2001 From: Evan Date: Fri, 18 Jul 2025 17:13:22 +0800 Subject: [PATCH 165/194] fix issue 48 --- contracts/v2/TermMaxOrderV2.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/v2/TermMaxOrderV2.sol b/contracts/v2/TermMaxOrderV2.sol index 7637b78..a7c69ca 100644 --- a/contracts/v2/TermMaxOrderV2.sol +++ b/contracts/v2/TermMaxOrderV2.sol @@ -144,9 +144,9 @@ contract TermMaxOrderV2 is OrderConfig memory orderConfig_, MarketConfig memory marketConfig ) external virtual override initializer { - __Ownable_init(maker_); - __ReentrancyGuard_init(); - __Pausable_init(); + __Ownable_init_unchained(maker_); + __ReentrancyGuard_init_unchained(); + __Pausable_init_unchained(); market = ITermMaxMarket(_msgSender()); _updateCurve(orderConfig_.curveCuts); From 43bf5cf4abb7c4edcc45f7a6f4866a790f4d0bbc Mon Sep 17 00:00:00 2001 From: Evan Date: Fri, 18 Jul 2025 17:37:30 +0800 Subject: [PATCH 166/194] fix issue 51,52 --- contracts/v2/TermMaxMarketV2.sol | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/contracts/v2/TermMaxMarketV2.sol b/contracts/v2/TermMaxMarketV2.sol index 12be235..da4d05e 100644 --- a/contracts/v2/TermMaxMarketV2.sol +++ b/contracts/v2/TermMaxMarketV2.sol @@ -8,6 +8,7 @@ import { import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol"; +import {Math} from "@openzeppelin/contracts/utils/math/Math.sol"; import {ITermMaxMarketV2} from "./ITermMaxMarketV2.sol"; import {IGearingToken} from "../v1/tokens/IGearingToken.sol"; import {IFlashLoanReceiver} from "../v1/IFlashLoanReceiver.sol"; @@ -26,7 +27,7 @@ import { OrderConfig } from "../v1/storage/TermMaxStorage.sol"; import {ISwapCallback} from "../v1/ISwapCallback.sol"; -import {TransferUtils} from "../v1/lib/TransferUtils.sol"; +import {TransferUtilsV2} from "./lib/TransferUtilsV2.sol"; import {ITermMaxMarket, IMintableERC20, IERC20} from "../v1/ITermMaxMarket.sol"; import {IMintableERC20V2} from "./tokens/IMintableERC20V2.sol"; import {ITermMaxOrderV2} from "./ITermMaxOrderV2.sol"; @@ -45,9 +46,10 @@ contract TermMaxMarketV2 is { using SafeCast for uint256; using SafeCast for int256; - using TransferUtils for IERC20; - using TransferUtils for IMintableERC20; + using TransferUtilsV2 for IERC20; + using TransferUtilsV2 for IMintableERC20; using StringUtil for string; + using Math for *; address immutable MINTABLE_ERC20_IMPLEMENT; address immutable TERMMAX_ORDER_IMPLEMENT; @@ -85,8 +87,8 @@ contract TermMaxMarketV2 is * @inheritdoc ITermMaxMarket */ function initialize(MarketInitialParams memory params) external virtual override initializer { - __Ownable_init(params.admin); - __ReentrancyGuard_init(); + __Ownable_init_unchained(params.admin); + __ReentrancyGuard_init_unchained(); if (params.collateral == address(params.debtToken)) revert CollateralCanNotEqualUnderlyinng(); MarketConfig memory config_ = params.marketConfig; if (config_.maturity <= block.timestamp) revert InvalidMaturity(); @@ -305,7 +307,7 @@ contract TermMaxMarketV2 is gtId = gt.mint(caller, recipient, debt, collateralData); MarketConfig memory mConfig = _config; - uint128 issueFee = ((debt * mintGtFeeRatio()) / Constants.DECIMAL_BASE).toUint128(); + uint128 issueFee = debt.mulDiv(mintGtFeeRatio(), Constants.DECIMAL_BASE).toUint128(); // Mint ft amount = debt amount, send issueFee to treasurer and other to caller ft.mint(mConfig.treasurer, issueFee); ftOutAmt = debt - issueFee; @@ -335,7 +337,7 @@ contract TermMaxMarketV2 is gt.augmentDebt(caller, gtId, debt); MarketConfig memory mConfig = _config; - uint128 issueFee = ((debt * mintGtFeeRatio()) / Constants.DECIMAL_BASE).toUint128(); + uint128 issueFee = debt.mulDiv(mintGtFeeRatio(), Constants.DECIMAL_BASE).toUint128(); // Mint ft amount = debt amount, send issueFee to treasurer and other to caller ft.mint(mConfig.treasurer, issueFee); ftOutAmt = debt - issueFee; @@ -364,11 +366,12 @@ contract TermMaxMarketV2 is } // The proportion that user will get how many debtToken and collateral should be deliveried - uint256 proportion = (ftAmount * Constants.DECIMAL_BASE_SQ) / (ft.totalSupply() - ft.balanceOf(address(this))); + uint256 proportion = + ftAmount.mulDiv(Constants.DECIMAL_BASE_SQ, (ft.totalSupply() - ft.balanceOf(address(this)))); deliveryData = gt.previewDelivery(proportion); - debtTokenAmt = ((debtToken.balanceOf(address(this))) * proportion) / Constants.DECIMAL_BASE_SQ; + debtTokenAmt = debtToken.balanceOf(address(this)).mulDiv(proportion, Constants.DECIMAL_BASE_SQ); } /** @@ -416,14 +419,14 @@ contract TermMaxMarketV2 is } // The proportion that user will get how many debtToken and collateral should be deliveried - uint256 proportion = (ftAmount * Constants.DECIMAL_BASE_SQ) / ft.totalSupply(); + uint256 proportion = ftAmount.mulDiv(Constants.DECIMAL_BASE_SQ, ft.totalSupply()); // Burn ft IMintableERC20V2(address(ft)).burn(ftOwner, caller, ftAmount); deliveryData = gt.delivery(proportion, recipient); // Transfer debtToken output - debtTokenAmt += ((debtToken.balanceOf(address(this))) * proportion) / Constants.DECIMAL_BASE_SQ; + debtTokenAmt += debtToken.balanceOf(address(this)).mulDiv(proportion, Constants.DECIMAL_BASE_SQ); debtToken.safeTransfer(recipient, debtTokenAmt); emit Redeem(caller, recipient, proportion.toUint128(), debtTokenAmt.toUint128(), deliveryData); } From a0f453ee991787d86ee5b9c9d023d48260b9f5c1 Mon Sep 17 00:00:00 2001 From: Evan Date: Fri, 18 Jul 2025 17:39:32 +0800 Subject: [PATCH 167/194] fix issue 53 --- contracts/v2/TermMaxMarketV2.sol | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/contracts/v2/TermMaxMarketV2.sol b/contracts/v2/TermMaxMarketV2.sol index da4d05e..b355749 100644 --- a/contracts/v2/TermMaxMarketV2.sol +++ b/contracts/v2/TermMaxMarketV2.sol @@ -15,6 +15,7 @@ import {IFlashLoanReceiver} from "../v1/IFlashLoanReceiver.sol"; import {ITermMaxOrder} from "../v1/ITermMaxOrder.sol"; import {Constants} from "../v1/lib/Constants.sol"; import {MarketConstantsV2} from "./lib/MarketConstantsV2.sol"; +import {StringUtil} from "../v1/lib/StringUtil.sol"; import {MarketErrors} from "../v1/errors/MarketErrors.sol"; import {MarketEvents} from "../v1/events/MarketEvents.sol"; import {StringUtil} from "../v1/lib/StringUtil.sol"; @@ -99,7 +100,7 @@ contract TermMaxMarketV2 is _config = config_; (ft, xt, gt) = _deployTokens(params); - name = _contactString(MarketConstantsV2.PREFIX_MARKET, params.tokenName); + name = StringUtil.contact(MarketConstantsV2.PREFIX_MARKET, params.tokenName); emit MarketInitialized(params.collateral, params.debtToken, _config.maturity, ft, xt, gt); } @@ -136,10 +137,6 @@ contract TermMaxMarketV2 is ); } - function _contactString(string memory a, string memory b) internal pure returns (string memory) { - return string(abi.encodePacked(a, b)); - } - /** * @inheritdoc ITermMaxMarket */ From c55a04368b4da4acca7d285da304d19fdb39ee59 Mon Sep 17 00:00:00 2001 From: Evan Date: Fri, 18 Jul 2025 17:55:11 +0800 Subject: [PATCH 168/194] fix doc --- contracts/v2/tokens/AbstractGearingTokenV2.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/v2/tokens/AbstractGearingTokenV2.sol b/contracts/v2/tokens/AbstractGearingTokenV2.sol index c375e83..11d65ae 100644 --- a/contracts/v2/tokens/AbstractGearingTokenV2.sol +++ b/contracts/v2/tokens/AbstractGearingTokenV2.sol @@ -49,7 +49,7 @@ abstract contract AbstractGearingTokenV2 is struct ValueAndPrice { /// @notice USD value of collateral uint256 collateralValue; - /// @notice USD value of debt with price and token decimals + /// @notice USD value of debt contains price and token decimals uint256 debtValueWithDecimals; /// @notice USD price of debt token uint256 debtPrice; From 5bb2c758c7109e026a21d5a59cd48d6d26290b0e Mon Sep 17 00:00:00 2001 From: Evan Date: Fri, 18 Jul 2025 17:59:23 +0800 Subject: [PATCH 169/194] fix docs --- contracts/v2/tokens/AbstractGearingTokenV2.sol | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/contracts/v2/tokens/AbstractGearingTokenV2.sol b/contracts/v2/tokens/AbstractGearingTokenV2.sol index 11d65ae..750b40a 100644 --- a/contracts/v2/tokens/AbstractGearingTokenV2.sol +++ b/contracts/v2/tokens/AbstractGearingTokenV2.sol @@ -53,15 +53,17 @@ abstract contract AbstractGearingTokenV2 is uint256 debtValueWithDecimals; /// @notice USD price of debt token uint256 debtPrice; - /// @notice Denominator of USD price + /// @notice Denominator of USD price, e.g. 10**priceDecimals uint256 priceDenominator; - /// @notice Denominator of debt token + /// @notice Denominator of debt token, e.g. 10**debtToken.decimals() uint256 debtDenominator; - /// @notice Encoded USD price of collateral token + /// @notice Encoded USD price of collateral token, e.g. priceData is + /// abi.encode(price, priceDenominator, collateralDenominator) + /// where gt is GearingTokenWithERC20 bytes collateralPriceData; } - /// @notice Configuturation of Gearing Token + /// @notice Configuration of Gearing Token GtConfig _config; /// @notice Total supply of Gearing Token uint256 total; From f402bdbcb8cb69d0f3d47ae418dbc2572f811c3b Mon Sep 17 00:00:00 2001 From: Evan Date: Fri, 18 Jul 2025 18:00:59 +0800 Subject: [PATCH 170/194] fix issue 60 --- contracts/v2/tokens/AbstractGearingTokenV2.sol | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/v2/tokens/AbstractGearingTokenV2.sol b/contracts/v2/tokens/AbstractGearingTokenV2.sol index 750b40a..6e7c99b 100644 --- a/contracts/v2/tokens/AbstractGearingTokenV2.sol +++ b/contracts/v2/tokens/AbstractGearingTokenV2.sol @@ -64,13 +64,13 @@ abstract contract AbstractGearingTokenV2 is } /// @notice Configuration of Gearing Token - GtConfig _config; + GtConfig internal _config; /// @notice Total supply of Gearing Token - uint256 total; + uint256 internal total; /// @notice Denominator of debt token - uint256 debtDenominator; + uint256 internal debtDenominator; /// @notice Mapping relationship between Gearing Token id and loan - mapping(uint256 => LoanInfo) loanMapping; + mapping(uint256 => LoanInfo) internal loanMapping; /** * @inheritdoc IGearingToken From ac534437b3ace7981527f46d6e2e5fc2c5433e18 Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 21 Jul 2025 09:03:29 +0800 Subject: [PATCH 171/194] fix issue 61 --- contracts/v2/tokens/AbstractGearingTokenV2.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/v2/tokens/AbstractGearingTokenV2.sol b/contracts/v2/tokens/AbstractGearingTokenV2.sol index 6e7c99b..fc3f19b 100644 --- a/contracts/v2/tokens/AbstractGearingTokenV2.sol +++ b/contracts/v2/tokens/AbstractGearingTokenV2.sol @@ -66,7 +66,7 @@ abstract contract AbstractGearingTokenV2 is /// @notice Configuration of Gearing Token GtConfig internal _config; /// @notice Total supply of Gearing Token - uint256 internal total; + uint256 internal totalIds; /// @notice Denominator of debt token uint256 internal debtDenominator; /// @notice Mapping relationship between Gearing Token id and loan @@ -171,7 +171,7 @@ abstract contract AbstractGearingTokenV2 is if (ltv > config.loanConfig.maxLtv) { revert GtIsNotHealthy(0, to, ltv); } - id = ++total; + id = ++totalIds; loanMapping[id] = loan; _safeMint(to, id); } From 3bc1aaca4a4996a3a6a3fe0e80177e9608fb1bb6 Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 21 Jul 2025 09:28:18 +0800 Subject: [PATCH 172/194] fix issue 62 --- contracts/v2/tokens/AbstractGearingTokenV2.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/v2/tokens/AbstractGearingTokenV2.sol b/contracts/v2/tokens/AbstractGearingTokenV2.sol index fc3f19b..135d7ac 100644 --- a/contracts/v2/tokens/AbstractGearingTokenV2.sol +++ b/contracts/v2/tokens/AbstractGearingTokenV2.sol @@ -96,8 +96,8 @@ abstract contract AbstractGearingTokenV2 is if (config_.loanConfig.liquidationLtv > Constants.DECIMAL_BASE) { revert GearingTokenErrorsV2.InvalidLiquidationLtv(); } - __ERC721_init(name, symbol); - __Ownable_init(msg.sender); + __ERC721_init_unchained(name, symbol); + __Ownable_init_unchained(msg.sender); _config = config_; debtDenominator = 10 ** _config.debtToken.decimals(); } From be098f9c8768e7563d382042c741ea813be52a1f Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 21 Jul 2025 09:39:36 +0800 Subject: [PATCH 173/194] fix issue 65 --- contracts/v2/errors/GearingTokenErrorsV2.sol | 2 ++ .../v2/tokens/AbstractGearingTokenV2.sol | 21 +++++++++---------- test/v2/GtV2.t.sol | 8 +++---- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/contracts/v2/errors/GearingTokenErrorsV2.sol b/contracts/v2/errors/GearingTokenErrorsV2.sol index 789ff6f..28af762 100644 --- a/contracts/v2/errors/GearingTokenErrorsV2.sol +++ b/contracts/v2/errors/GearingTokenErrorsV2.sol @@ -6,4 +6,6 @@ interface GearingTokenErrorsV2 { error InvalidLiquidationLtv(); /// @notice Error for merge empty Gearing Token id array error GtIdArrayIsEmpty(); + /// @notice Error for Gearing Token is expired + error GtIsExpired(); } diff --git a/contracts/v2/tokens/AbstractGearingTokenV2.sol b/contracts/v2/tokens/AbstractGearingTokenV2.sol index 135d7ac..57336bb 100644 --- a/contracts/v2/tokens/AbstractGearingTokenV2.sol +++ b/contracts/v2/tokens/AbstractGearingTokenV2.sol @@ -30,8 +30,7 @@ abstract contract AbstractGearingTokenV2 is IGearingToken, IGearingTokenV2, GearingTokenErrors, - GearingTokenEvents, - GearingTokenEventsV2 + GearingTokenEvents { using SafeCast for uint256; using SafeCast for int256; @@ -83,7 +82,7 @@ abstract contract AbstractGearingTokenV2 is { __AbstractGearingToken_init(name, symbol, config_); __GearingToken_Implement_init(initalParams); - emit GearingTokenInitialized(msg.sender, name, symbol, initalParams); + emit GearingTokenEventsV2.GearingTokenInitialized(msg.sender, name, symbol, initalParams); } function __AbstractGearingToken_init(string memory name, string memory symbol, GtConfig memory config_) @@ -185,7 +184,7 @@ abstract contract AbstractGearingTokenV2 is } GtConfig memory config = _config; if (config.maturity <= block.timestamp) { - revert GtIsExpired(id); + revert GearingTokenErrorsV2.GtIsExpired(); } LoanInfo memory loan = loanMapping[id]; @@ -231,7 +230,7 @@ abstract contract AbstractGearingTokenV2 is } GtConfig memory config = _config; if (config.maturity <= block.timestamp) { - revert GtIsExpired(0); + revert GearingTokenErrorsV2.GtIsExpired(); } newId = ids[0]; LoanInfo memory firstLoan = loanMapping[newId]; @@ -259,7 +258,7 @@ abstract contract AbstractGearingTokenV2 is function repay(uint256 id, uint128 repayAmt, bool byDebtToken) external virtual override nonReentrant { GtConfig memory config = _config; if (config.maturity <= block.timestamp) { - revert GtIsExpired(id); + revert GearingTokenErrorsV2.GtIsExpired(); } if (byDebtToken) { @@ -269,7 +268,7 @@ abstract contract AbstractGearingTokenV2 is config.ft.safeTransferFrom(msg.sender, marketAddr(), repayAmt); } (, bool repayAll) = _repay(id, repayAmt); - emit Repay(id, repayAmt, byDebtToken, repayAll); + emit GearingTokenEventsV2.Repay(id, repayAmt, byDebtToken, repayAll); } /// @inheritdoc IGearingToken @@ -309,7 +308,7 @@ abstract contract AbstractGearingTokenV2 is ) internal returns (bool) { GtConfig memory config = _config; if (config.maturity <= block.timestamp) { - revert GtIsExpired(id); + revert GearingTokenErrorsV2.GtIsExpired(); } if (ownerOf(id) != msg.sender) { revert CallerIsNotTheOwner(id); @@ -333,7 +332,7 @@ abstract contract AbstractGearingTokenV2 is repayToken, repayAmt, config.collateral, removedCollateral, callbackData ); repayToken.safeTransferFrom(msg.sender, owner(), repayAmt); - emit FlashRepay(id, msg.sender, repayAmt, byDebtToken, repayAll, removedCollateral); + emit GearingTokenEventsV2.FlashRepay(id, msg.sender, repayAmt, byDebtToken, repayAll, removedCollateral); return repayAll; } @@ -364,7 +363,7 @@ abstract contract AbstractGearingTokenV2 is GtConfig memory config = _config; if (config.maturity <= block.timestamp) { - revert GtIsExpired(id); + revert GearingTokenErrorsV2.GtIsExpired(); } LoanInfo memory loan = loanMapping[id]; @@ -393,7 +392,7 @@ abstract contract AbstractGearingTokenV2 is */ function addCollateral(uint256 id, bytes memory collateralData) external virtual override nonReentrant { if (_config.maturity <= block.timestamp) { - revert GtIsExpired(id); + revert GearingTokenErrorsV2.GtIsExpired(); } LoanInfo memory loan = loanMapping[id]; diff --git a/test/v2/GtV2.t.sol b/test/v2/GtV2.t.sol index fa78e5e..fe37dda 100644 --- a/test/v2/GtV2.t.sol +++ b/test/v2/GtV2.t.sol @@ -509,7 +509,7 @@ contract GtTestV2 is Test { res.debt.approve(address(res.gt), debtAmt); - vm.expectRevert(abi.encodeWithSelector(GearingTokenErrors.GtIsExpired.selector, gtId)); + vm.expectRevert(abi.encodeWithSelector(GearingTokenErrorsV2.GtIsExpired.selector)); res.gt.repay(gtId, debtAmt, true); vm.stopPrank(); @@ -526,7 +526,7 @@ contract GtTestV2 is Test { res.debt.mint(address(flashRepayer), debtAmt); res.gt.approve(address(flashRepayer), gtId); - vm.expectRevert(abi.encodeWithSelector(GearingTokenErrors.GtIsExpired.selector, gtId)); + vm.expectRevert(abi.encodeWithSelector(GearingTokenErrorsV2.GtIsExpired.selector)); flashRepayer.flashRepay(gtId, debtAmt, true, abi.encode(collateralAmt)); } @@ -645,7 +645,7 @@ contract GtTestV2 is Test { vm.startPrank(thirdPeople); res.collateral.approve(address(res.gt), addedCollateral); - vm.expectRevert(abi.encodeWithSelector(GearingTokenErrors.GtIsExpired.selector, gtId)); + vm.expectRevert(abi.encodeWithSelector(GearingTokenErrorsV2.GtIsExpired.selector)); res.gt.addCollateral(gtId, abi.encode(addedCollateral)); vm.stopPrank(); @@ -766,7 +766,7 @@ contract GtTestV2 is Test { vm.warp(marketConfig.maturity); - vm.expectRevert(abi.encodeWithSelector(GearingTokenErrors.GtIsExpired.selector, gtId)); + vm.expectRevert(abi.encodeWithSelector(GearingTokenErrorsV2.GtIsExpired.selector)); vm.prank(sender); res.gt.removeCollateral(gtId, abi.encode(removedCollateral)); } From 538d1c14d22f6eeb756ab3e6d2b556edf8cfd0ac Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 21 Jul 2025 09:49:40 +0800 Subject: [PATCH 174/194] fix issue 69 --- contracts/v2/tokens/GearingTokenWithERC20V2.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/v2/tokens/GearingTokenWithERC20V2.sol b/contracts/v2/tokens/GearingTokenWithERC20V2.sol index 1b88d3f..24f8587 100644 --- a/contracts/v2/tokens/GearingTokenWithERC20V2.sol +++ b/contracts/v2/tokens/GearingTokenWithERC20V2.sol @@ -26,7 +26,7 @@ contract GearingTokenWithERC20V2 is AbstractGearingTokenV2 { /// @notice The max capacity of collateral token uint256 public collateralCapacity; - uint256 collateralDenominator; + uint256 private collateralDenominator; constructor() { _disableInitializers(); From cdfbfdd0a2684c07ee631239006e7f444ae52d71 Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 21 Jul 2025 10:32:44 +0800 Subject: [PATCH 175/194] fix issue 75 --- contracts/v2/tokens/IGearingTokenV2.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/v2/tokens/IGearingTokenV2.sol b/contracts/v2/tokens/IGearingTokenV2.sol index de7c926..881e59b 100644 --- a/contracts/v2/tokens/IGearingTokenV2.sol +++ b/contracts/v2/tokens/IGearingTokenV2.sol @@ -7,7 +7,7 @@ pragma solidity ^0.8.27; */ interface IGearingTokenV2 { /// @notice Repay the debt of Gearing Token, - /// the collateral will send by flashloan first. + /// The borrower can repay the debt after receiving the collateral /// @param id The id of Gearing Token /// @param byDebtToken Repay using debtToken token or bonds token /// @param repayAmt The amount of debt you want to repay From 34c3770d403e3e7cc84f8136ab6ed05e87604bde Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 21 Jul 2025 10:39:34 +0800 Subject: [PATCH 176/194] remove unused interface --- contracts/v2/tokens/IMintableERC20V2.sol | 2 -- 1 file changed, 2 deletions(-) diff --git a/contracts/v2/tokens/IMintableERC20V2.sol b/contracts/v2/tokens/IMintableERC20V2.sol index 005ee33..4ef6f23 100644 --- a/contracts/v2/tokens/IMintableERC20V2.sol +++ b/contracts/v2/tokens/IMintableERC20V2.sol @@ -1,8 +1,6 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.27; -import "../../v1/tokens/IMintableERC20.sol"; - /** * @title TermMax ERC20 token interface * @author Term Structure Labs From 51e83b1449d957e7714998c4759c4582ae87d8f0 Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 21 Jul 2025 14:21:43 +0800 Subject: [PATCH 177/194] solidity version --- contracts/v2/tokens/IGearingTokenV2.sol | 2 +- contracts/v2/tokens/IMintableERC20V2.sol | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/v2/tokens/IGearingTokenV2.sol b/contracts/v2/tokens/IGearingTokenV2.sol index 881e59b..ee7bd03 100644 --- a/contracts/v2/tokens/IGearingTokenV2.sol +++ b/contracts/v2/tokens/IGearingTokenV2.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; +pragma solidity ^0.8.0; /** * @title TermMax Gearing token interface V2 diff --git a/contracts/v2/tokens/IMintableERC20V2.sol b/contracts/v2/tokens/IMintableERC20V2.sol index 4ef6f23..c8ceab0 100644 --- a/contracts/v2/tokens/IMintableERC20V2.sol +++ b/contracts/v2/tokens/IMintableERC20V2.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; +pragma solidity ^0.8.0; /** * @title TermMax ERC20 token interface From eb2c06ffde41099e62af8689fd8013ca6b24809d Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 21 Jul 2025 15:23:02 +0800 Subject: [PATCH 178/194] fix issue 115 --- contracts/v2/router/TermMaxRouterV2.sol | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/contracts/v2/router/TermMaxRouterV2.sol b/contracts/v2/router/TermMaxRouterV2.sol index 1256ba3..c7948c9 100644 --- a/contracts/v2/router/TermMaxRouterV2.sol +++ b/contracts/v2/router/TermMaxRouterV2.sol @@ -13,7 +13,7 @@ import { import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; import {Math} from "@openzeppelin/contracts/utils/math/Math.sol"; import {ITermMaxMarket} from "../../v1/ITermMaxMarket.sol"; -import {ITermMaxMarketV2} from "../../v2/ITermMaxMarketV2.sol"; +import {ITermMaxMarketV2} from "../ITermMaxMarketV2.sol"; import {ITermMaxOrder} from "../../v1/ITermMaxOrder.sol"; import {SwapUnit} from "../../v1/router/ISwapAdapter.sol"; import {RouterErrors} from "../../v1/errors/RouterErrors.sol"; @@ -324,6 +324,7 @@ contract TermMaxRouterV2 is uint256 repayAmt = ftOutAmt - netTokenIn; if (repayAmt > 0) { ft.safeIncreaseAllowance(address(gt), repayAmt); + // repay in ft, bool false means not using debt token gt.repay(gtId, repayAmt.toUint128(), false); } @@ -459,6 +460,7 @@ contract TermMaxRouterV2 is repayAmt = totalFtAmt.toUint128(); } ft.safeIncreaseAllowance(address(gt), repayAmt); + // repay in ft, bool false means not using debt token gt.repay(gtId, repayAmt, false); returnAmt = maxTokenIn - netCost; @@ -774,6 +776,7 @@ contract TermMaxRouterV2 is if (swapData.netTokenAmt > netFtIn) { uint256 repaidFtAmt = swapData.netTokenAmt - netFtIn; ft.safeIncreaseAllowance(address(gt), repaidFtAmt); + // repay in ft, bool false means not using debt token gt.repay(gtId, repaidFtAmt.toUint128(), false); } // check remaining debt token amount @@ -781,6 +784,7 @@ contract TermMaxRouterV2 is if (totalDebtTokenAmt > debtAmt) { uint256 repaidDebtAmt = totalDebtTokenAmt - debtAmt; debtToken.safeIncreaseAllowance(address(gt), repaidDebtAmt); + // repay in debt token, bool true means using debt token gt.repay(gtId, repaidDebtAmt.toUint128(), true); } (, uint128 ltv,) = gt.getLiquidationInfo(gtId); From be99fad6f7784abbdb4dc830585dfa02c584bc20 Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 21 Jul 2025 15:29:38 +0800 Subject: [PATCH 179/194] fix issue 118 --- contracts/v2/oracle/IOracleV2.sol | 2 +- contracts/v2/oracle/priceFeeds/ITermMaxPriceFeed.sol | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/v2/oracle/IOracleV2.sol b/contracts/v2/oracle/IOracleV2.sol index 7265d62..94e83fd 100644 --- a/contracts/v2/oracle/IOracleV2.sol +++ b/contracts/v2/oracle/IOracleV2.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.27; +pragma solidity ^0.8.0; import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; diff --git a/contracts/v2/oracle/priceFeeds/ITermMaxPriceFeed.sol b/contracts/v2/oracle/priceFeeds/ITermMaxPriceFeed.sol index fa24904..a3bff1a 100644 --- a/contracts/v2/oracle/priceFeeds/ITermMaxPriceFeed.sol +++ b/contracts/v2/oracle/priceFeeds/ITermMaxPriceFeed.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.20; +pragma solidity ^0.8.0; import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; From cd0b252cb12f5d99927c86431d2913345610907c Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 21 Jul 2025 16:09:10 +0800 Subject: [PATCH 180/194] fix issue 125 --- .../oracle/priceFeeds/TermMaxERC4626PriceFeed.sol | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/contracts/v2/oracle/priceFeeds/TermMaxERC4626PriceFeed.sol b/contracts/v2/oracle/priceFeeds/TermMaxERC4626PriceFeed.sol index d1836aa..ec5558a 100644 --- a/contracts/v2/oracle/priceFeeds/TermMaxERC4626PriceFeed.sol +++ b/contracts/v2/oracle/priceFeeds/TermMaxERC4626PriceFeed.sol @@ -3,25 +3,28 @@ pragma solidity ^0.8.27; import {IERC4626} from "@openzeppelin/contracts/interfaces/IERC4626.sol"; import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import {Math} from "@openzeppelin/contracts/utils/math/Math.sol"; +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; import {ITermMaxPriceFeed, AggregatorV3Interface} from "./ITermMaxPriceFeed.sol"; -import {MathLib} from "contracts/v1/lib/MathLib.sol"; contract TermMaxERC4626PriceFeed is ITermMaxPriceFeed { - using MathLib for *; + using Math for *; + using SafeCast for *; error GetRoundDataNotSupported(); AggregatorV3Interface public immutable assetPriceFeed; address public immutable asset; - int256 immutable priceDemonitor; - uint256 immutable vaultDemonitor; + uint256 private immutable priceDemonitor; + uint256 private immutable vaultDemonitor; + uint256 private constant PRICE_DECIMALS = 10 ** 8; constructor(address _assetPriceFeed, address _asset) { (, int256 answer,,,) = AggregatorV3Interface(_assetPriceFeed).latestRoundData(); assetPriceFeed = AggregatorV3Interface(_assetPriceFeed); asset = _asset; vaultDemonitor = 10 ** IERC4626(asset).decimals(); - priceDemonitor = int256(10 ** assetPriceFeed.decimals()) * int256(vaultDemonitor); + priceDemonitor = 10 ** assetPriceFeed.decimals() * vaultDemonitor; } function decimals() public view returns (uint8) { @@ -57,7 +60,7 @@ contract TermMaxERC4626PriceFeed is ITermMaxPriceFeed { assetPriceFeed.latestRoundData(); uint256 vaultAnswer = IERC4626(asset).previewRedeem(vaultDemonitor).min(IERC4626(asset).convertToAssets(vaultDemonitor)); - answer = answer * int256(vaultAnswer) * int256((10 ** decimals())) / priceDemonitor; + answer = answer.toUint256().mulDiv(vaultAnswer * PRICE_DECIMALS, priceDemonitor).toInt256(); return (roundId, answer, startedAt, updatedAt, answeredInRound); } } From 3e69cd23b580253f63bba415e12e3a2f8a44cc05 Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 21 Jul 2025 16:13:09 +0800 Subject: [PATCH 181/194] fix issue 132 --- contracts/v2/oracle/priceFeeds/TermMaxERC4626PriceFeed.sol | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/contracts/v2/oracle/priceFeeds/TermMaxERC4626PriceFeed.sol b/contracts/v2/oracle/priceFeeds/TermMaxERC4626PriceFeed.sol index ec5558a..a1f3052 100644 --- a/contracts/v2/oracle/priceFeeds/TermMaxERC4626PriceFeed.sol +++ b/contracts/v2/oracle/priceFeeds/TermMaxERC4626PriceFeed.sol @@ -23,8 +23,9 @@ contract TermMaxERC4626PriceFeed is ITermMaxPriceFeed { (, int256 answer,,,) = AggregatorV3Interface(_assetPriceFeed).latestRoundData(); assetPriceFeed = AggregatorV3Interface(_assetPriceFeed); asset = _asset; - vaultDemonitor = 10 ** IERC4626(asset).decimals(); - priceDemonitor = 10 ** assetPriceFeed.decimals() * vaultDemonitor; + uint8 assetDecimals = IERC20Metadata(_asset).decimals(); + vaultDemonitor = 10 ** assetDecimals; + priceDemonitor = 10 ** (assetPriceFeed.decimals() + assetDecimals); } function decimals() public view returns (uint8) { From 545957f853ba3321ecb049482fd4ecdab9426df3 Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 21 Jul 2025 16:40:56 +0800 Subject: [PATCH 182/194] fix issue 144 --- contracts/v2/oracle/IOracleV2.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/v2/oracle/IOracleV2.sol b/contracts/v2/oracle/IOracleV2.sol index 94e83fd..813d55f 100644 --- a/contracts/v2/oracle/IOracleV2.sol +++ b/contracts/v2/oracle/IOracleV2.sol @@ -17,6 +17,7 @@ interface IOracleV2 { * @param aggregator Primary price feed aggregator (required) * @param backupAggregator Secondary price feed aggregator for fallback (optional) * @param maxPrice Maximum allowed price value for this asset (0 = no limit) + * @param minPrice Minimum allowed price value for this asset (0 = no limit) * @param heartbeat Maximum allowed staleness for primary aggregator in seconds (0 = no staleness check) * @param backupHeartbeat Maximum allowed staleness for backup aggregator in seconds (0 = no staleness check) */ From eb45ee5dad732da5f20754added9b9e18fd498f5 Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 21 Jul 2025 16:45:02 +0800 Subject: [PATCH 183/194] fix issue 146 --- contracts/v2/oracle/IOracleV2.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/v2/oracle/IOracleV2.sol b/contracts/v2/oracle/IOracleV2.sol index 813d55f..eff1481 100644 --- a/contracts/v2/oracle/IOracleV2.sol +++ b/contracts/v2/oracle/IOracleV2.sol @@ -38,7 +38,7 @@ interface IOracleV2 { error OracleIsNotWorking(address asset); /** - * @notice Retrieves the current price of an asset from the oracle system + * @notice Retrieves the current price of an asset in USD from the oracle system * @dev Uses primary oracle first, falls back to backup if primary is stale or invalid * Applies maxPrice cap if configured. Returns price with the aggregator's native decimals * @param asset The address of the asset to get the price for From 0a686c1dc8094c47cf6763e78ca13d6039680900 Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 21 Jul 2025 16:55:15 +0800 Subject: [PATCH 184/194] fix issue 148 --- contracts/v2/oracle/OracleAggregatorV2.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/contracts/v2/oracle/OracleAggregatorV2.sol b/contracts/v2/oracle/OracleAggregatorV2.sol index 4b568c0..cf9190a 100644 --- a/contracts/v2/oracle/OracleAggregatorV2.sol +++ b/contracts/v2/oracle/OracleAggregatorV2.sol @@ -14,7 +14,6 @@ pragma solidity ^0.8.27; * - Independent heartbeat configuration for backup oracles * - Price capping mechanism with maxPrice parameter * - Oracle revocation capability for enhanced security - * - Separate backup heartbeat for more flexible oracle management */ import {Ownable2Step, Ownable} from "@openzeppelin/contracts/access/Ownable2Step.sol"; import {AggregatorV3Interface, IOracleV2} from "./IOracleV2.sol"; From fc1bb0c087eb09b19d7ff010912de4e7fc6484bd Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 22 Jul 2025 09:51:16 +0800 Subject: [PATCH 185/194] fix issue 148 --- contracts/v2/oracle/OracleAggregatorV2.sol | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/contracts/v2/oracle/OracleAggregatorV2.sol b/contracts/v2/oracle/OracleAggregatorV2.sol index cf9190a..f806ff9 100644 --- a/contracts/v2/oracle/OracleAggregatorV2.sol +++ b/contracts/v2/oracle/OracleAggregatorV2.sol @@ -130,9 +130,8 @@ contract OracleAggregatorV2 is IOracleV2, Ownable2Step { } // Store pending oracle with timelock - pendingOracles[asset].oracle = oracle; uint64 validAt = uint64(block.timestamp + _timeLock); - pendingOracles[asset].validAt = validAt; + pendingOracles[asset] = PendingOracle({oracle: oracle, validAt: validAt}); emit SubmitPendingOracle( asset, From 80aa2c106090fb37dd0a4c40b39448a3fb446a26 Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 22 Jul 2025 09:52:59 +0800 Subject: [PATCH 186/194] fix issue 185 --- contracts/v2/ITermMaxOrderV2.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/v2/ITermMaxOrderV2.sol b/contracts/v2/ITermMaxOrderV2.sol index 1ba67f7..af28d1c 100644 --- a/contracts/v2/ITermMaxOrderV2.sol +++ b/contracts/v2/ITermMaxOrderV2.sol @@ -12,7 +12,7 @@ import {OrderConfig, MarketConfig} from "../v1/storage/TermMaxStorage.sol"; interface ITermMaxOrderV2 { /// @notice Initialize the token and configuration of the order /// @param maker The maker - /// @param tokens The tokens + /// @param tokens The tokens, [0] = FT, [1] = XT, [2] = debtToken /// @param gt The Gearing Token /// @param orderConfig The order configuration function initialize( From a90d6aa2b2c5ac46f46d46e7fb5bfe97785c9be3 Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 22 Jul 2025 12:14:47 +0800 Subject: [PATCH 187/194] fix issue 184 --- contracts/v2/TermMaxOrderV2.sol | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/contracts/v2/TermMaxOrderV2.sol b/contracts/v2/TermMaxOrderV2.sol index a7c69ca..a168282 100644 --- a/contracts/v2/TermMaxOrderV2.sol +++ b/contracts/v2/TermMaxOrderV2.sol @@ -82,7 +82,7 @@ contract TermMaxOrderV2 is } /// @notice Check if the market is borrowing allowed - modifier isBorrowingAllowed(OrderConfig memory config) { + modifier onlyBorrowingIsAllowed(OrderConfig memory config) { if (config.curveCuts.lendCurveCuts.length == 0) { revert BorrowIsNotAllowed(); } @@ -90,7 +90,7 @@ contract TermMaxOrderV2 is } /// @notice Check if the market is lending allowed - modifier isLendingAllowed(OrderConfig memory config) { + modifier onlyLendingIsAllowed(OrderConfig memory config) { if (config.curveCuts.borrowCurveCuts.length == 0) { revert LendIsNotAllowed(); } @@ -390,7 +390,7 @@ contract TermMaxOrderV2 is address caller, address recipient, OrderConfig memory config - ) internal isLendingAllowed(config) returns (uint256 netOut, uint256 feeAmt) { + ) internal onlyLendingIsAllowed(config) returns (uint256 netOut, uint256 feeAmt) { (netOut, feeAmt) = _buyToken(caller, recipient, debtTokenAmtIn, minTokenOut, config, _buyFtStep); if (xt.balanceOf(address(this)) > config.maxXtReserve) { revert XtReserveTooHigh(); @@ -403,7 +403,7 @@ contract TermMaxOrderV2 is address caller, address recipient, OrderConfig memory config - ) internal isBorrowingAllowed(config) returns (uint256 netOut, uint256 feeAmt) { + ) internal onlyBorrowingIsAllowed(config) returns (uint256 netOut, uint256 feeAmt) { (netOut, feeAmt) = _buyToken(caller, recipient, debtTokenAmtIn, minTokenOut, config, _buyXtStep); } @@ -413,7 +413,7 @@ contract TermMaxOrderV2 is address caller, address recipient, OrderConfig memory config - ) internal isBorrowingAllowed(config) returns (uint256 netOut, uint256 feeAmt) { + ) internal onlyBorrowingIsAllowed(config) returns (uint256 netOut, uint256 feeAmt) { (netOut, feeAmt) = _sellToken(caller, recipient, ftAmtIn, minDebtTokenOut, config, _sellFtStep); } @@ -423,7 +423,7 @@ contract TermMaxOrderV2 is address caller, address recipient, OrderConfig memory config - ) internal isLendingAllowed(config) returns (uint256 netOut, uint256 feeAmt) { + ) internal onlyLendingIsAllowed(config) returns (uint256 netOut, uint256 feeAmt) { (netOut, feeAmt) = _sellToken(caller, recipient, xtAmtIn, minDebtTokenOut, config, _sellXtStep); if (xt.balanceOf(address(this)) > config.maxXtReserve) { revert XtReserveTooHigh(); @@ -600,7 +600,7 @@ contract TermMaxOrderV2 is address caller, address recipient, OrderConfig memory config - ) internal isLendingAllowed(config) returns (uint256 netTokenIn, uint256 feeAmt) { + ) internal onlyLendingIsAllowed(config) returns (uint256 netTokenIn, uint256 feeAmt) { (netTokenIn, feeAmt) = _buyExactToken(caller, recipient, tokenAmtOut, maxTokenIn, config, _buyExactFtStep); if (xt.balanceOf(address(this)) > config.maxXtReserve) { revert XtReserveTooHigh(); @@ -613,7 +613,7 @@ contract TermMaxOrderV2 is address caller, address recipient, OrderConfig memory config - ) internal isBorrowingAllowed(config) returns (uint256 netTokenIn, uint256 feeAmt) { + ) internal onlyBorrowingIsAllowed(config) returns (uint256 netTokenIn, uint256 feeAmt) { (netTokenIn, feeAmt) = _buyExactToken(caller, recipient, tokenAmtOut, maxTokenIn, config, _buyExactXtStep); } @@ -681,7 +681,7 @@ contract TermMaxOrderV2 is address caller, address recipient, OrderConfig memory config - ) internal isBorrowingAllowed(config) returns (uint256 netIn, uint256 feeAmt) { + ) internal onlyBorrowingIsAllowed(config) returns (uint256 netIn, uint256 feeAmt) { (netIn, feeAmt) = _sellTokenForExactToken(caller, recipient, debtTokenAmtOut, maxFtIn, config, _sellFtForExactTokenStep); } @@ -692,7 +692,7 @@ contract TermMaxOrderV2 is address caller, address recipient, OrderConfig memory config - ) internal isLendingAllowed(config) returns (uint256 netIn, uint256 feeAmt) { + ) internal onlyLendingIsAllowed(config) returns (uint256 netIn, uint256 feeAmt) { (netIn, feeAmt) = _sellTokenForExactToken(caller, recipient, debtTokenAmtOut, maxXtIn, config, _sellXtForExactTokenStep); if (xt.balanceOf(address(this)) > config.maxXtReserve) { From cd2eb109eb22f84d2a961bd83c2e54875e17eefa Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 22 Jul 2025 12:18:47 +0800 Subject: [PATCH 188/194] fix issue 189 --- contracts/v2/TermMaxOrderV2.sol | 34 ++++++++++----------------------- 1 file changed, 10 insertions(+), 24 deletions(-) diff --git a/contracts/v2/TermMaxOrderV2.sol b/contracts/v2/TermMaxOrderV2.sol index a168282..5bb1cec 100644 --- a/contracts/v2/TermMaxOrderV2.sol +++ b/contracts/v2/TermMaxOrderV2.sol @@ -268,18 +268,11 @@ contract TermMaxOrderV2 is != ( newCurveCuts.lendCurveCuts[i - 1].liqSquare * ( - ( - ( - newCurveCuts.lendCurveCuts[i].xtReserve.plusInt256( - newCurveCuts.lendCurveCuts[i].offset - ) - ) ** 2 * Constants.DECIMAL_BASE - ) - / ( - newCurveCuts.lendCurveCuts[i].xtReserve.plusInt256( - newCurveCuts.lendCurveCuts[i - 1].offset - ) ** 2 - ) + newCurveCuts.lendCurveCuts[i].xtReserve.plusInt256(newCurveCuts.lendCurveCuts[i].offset) + ** 2 * Constants.DECIMAL_BASE + / newCurveCuts.lendCurveCuts[i].xtReserve.plusInt256( + newCurveCuts.lendCurveCuts[i - 1].offset + ) ** 2 ) ) / Constants.DECIMAL_BASE ) revert InvalidCurveCuts(); @@ -301,18 +294,11 @@ contract TermMaxOrderV2 is != ( newCurveCuts.borrowCurveCuts[i - 1].liqSquare * ( - ( - ( - newCurveCuts.borrowCurveCuts[i].xtReserve.plusInt256( - newCurveCuts.borrowCurveCuts[i].offset - ) - ) ** 2 * Constants.DECIMAL_BASE - ) - / ( - newCurveCuts.borrowCurveCuts[i].xtReserve.plusInt256( - newCurveCuts.borrowCurveCuts[i - 1].offset - ) ** 2 - ) + newCurveCuts.borrowCurveCuts[i].xtReserve.plusInt256(newCurveCuts.borrowCurveCuts[i].offset) + ** 2 * Constants.DECIMAL_BASE + / newCurveCuts.borrowCurveCuts[i].xtReserve.plusInt256( + newCurveCuts.borrowCurveCuts[i - 1].offset + ) ** 2 ) ) / Constants.DECIMAL_BASE ) revert InvalidCurveCuts(); From 3edffddf8856908ef194d9d0734a115554c8aa27 Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 22 Jul 2025 12:31:22 +0800 Subject: [PATCH 189/194] fix issue 2002 --- contracts/v2/TermMaxMarketV2.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/v2/TermMaxMarketV2.sol b/contracts/v2/TermMaxMarketV2.sol index b355749..ed69b5f 100644 --- a/contracts/v2/TermMaxMarketV2.sol +++ b/contracts/v2/TermMaxMarketV2.sol @@ -161,12 +161,12 @@ contract TermMaxMarketV2 is * @inheritdoc ITermMaxMarket */ function updateMarketConfig(MarketConfig calldata newConfig) external virtual override onlyOwner { + _checkFee(newConfig.feeConfig); MarketConfig memory mConfig = _config; if (newConfig.treasurer != mConfig.treasurer) { mConfig.treasurer = newConfig.treasurer; gt.setTreasurer(newConfig.treasurer); } - _checkFee(newConfig.feeConfig); mConfig.feeConfig = newConfig.feeConfig; _config = mConfig; From 08b74efb357d4186f28f5f63a978138118531712 Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 22 Jul 2025 13:01:05 +0800 Subject: [PATCH 190/194] fix issue 203 --- contracts/v2/TermMaxMarketV2.sol | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/contracts/v2/TermMaxMarketV2.sol b/contracts/v2/TermMaxMarketV2.sol index ed69b5f..7131aed 100644 --- a/contracts/v2/TermMaxMarketV2.sol +++ b/contracts/v2/TermMaxMarketV2.sol @@ -269,7 +269,7 @@ contract TermMaxMarketV2 is bytes memory collateralData = IFlashLoanReceiver(loanReceiver).executeOperation(gtReceiver, debtToken, xtAmt, callbackData); - uint128 debt = ((xtAmt * Constants.DECIMAL_BASE) / (Constants.DECIMAL_BASE - mintGtFeeRatio())).toUint128(); + uint128 debt = xtAmt.mulDiv(Constants.DECIMAL_BASE, (Constants.DECIMAL_BASE - mintGtFeeRatio())).toUint128(); MarketConfig memory mConfig = _config; uint128 leverageFee = debt - xtAmt; @@ -353,14 +353,7 @@ contract TermMaxMarketV2 is override returns (uint256 debtTokenAmt, bytes memory deliveryData) { - MarketConfig memory mConfig = _config; - { - uint256 liquidationDeadline = - gt.liquidatable() ? mConfig.maturity + Constants.LIQUIDATION_WINDOW : mConfig.maturity; - if (block.timestamp < liquidationDeadline) { - revert CanNotRedeemBeforeFinalLiquidationDeadline(liquidationDeadline); - } - } + _checkDeadline(); // The proportion that user will get how many debtToken and collateral should be deliveried uint256 proportion = @@ -401,14 +394,7 @@ contract TermMaxMarketV2 is internal returns (uint256 debtTokenAmt, bytes memory deliveryData) { - MarketConfig memory mConfig = _config; - { - uint256 liquidationDeadline = - gt.liquidatable() ? mConfig.maturity + Constants.LIQUIDATION_WINDOW : mConfig.maturity; - if (block.timestamp < liquidationDeadline) { - revert CanNotRedeemBeforeFinalLiquidationDeadline(liquidationDeadline); - } - } + _checkDeadline(); // burn ft reserves(from repayment or liquidation) uint256 ftReserve = ft.balanceOf(address(this)); if (ftReserve > 0) { @@ -428,6 +414,16 @@ contract TermMaxMarketV2 is emit Redeem(caller, recipient, proportion.toUint128(), debtTokenAmt.toUint128(), deliveryData); } + function _checkDeadline() internal view { + MarketConfig memory mConfig = _config; + + uint256 liquidationDeadline = + gt.liquidatable() ? mConfig.maturity + Constants.LIQUIDATION_WINDOW : mConfig.maturity; + if (block.timestamp < liquidationDeadline) { + revert CanNotRedeemBeforeFinalLiquidationDeadline(liquidationDeadline); + } + } + /** * @inheritdoc ITermMaxMarket */ From 31231e17eb39464cd1c48f108f4dfc7fbf39501c Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 22 Jul 2025 13:07:09 +0800 Subject: [PATCH 191/194] merge from deploy/preTMX --- contracts/v2/tokenomics/PreTMX.sol | 54 +++-- test/v2/tokenomics/PreTMX.t.sol | 332 +++++++++++------------------ 2 files changed, 145 insertions(+), 241 deletions(-) diff --git a/contracts/v2/tokenomics/PreTMX.sol b/contracts/v2/tokenomics/PreTMX.sol index 4ef590f..4566b35 100644 --- a/contracts/v2/tokenomics/PreTMX.sol +++ b/contracts/v2/tokenomics/PreTMX.sol @@ -5,23 +5,24 @@ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import {Ownable2Step, Ownable} from "@openzeppelin/contracts/access/Ownable2Step.sol"; contract PreTMX is ERC20, Ownable2Step { + struct WhitelistInfo { + bool isTransferFromWhitelisted; + bool isTransferToWhitelisted; + } + bool public transferRestricted; - mapping(address => bool) public isTransferredFromWhitelisted; - mapping(address => bool) public isTransferredToWhitelisted; + mapping(address => WhitelistInfo) public whitelistMapping; - error TransferFromNotWhitelisted(address from); - error TransferToNotWhitelisted(address to); + error TransferNotWhitelisted(address from, address to); event TransferRestricted(bool restricted); - event TransferFromWhitelisted(address from, bool isWhitelisted); - event TransferToWhitelisted(address to, bool isWhitelisted); + event TransferWhitelisted(address indexed user, bool isTransferFromWhitelisted, bool isTransferToWhitelisted); constructor(address admin) ERC20("Pre TermMax Token", "pTMX") Ownable(admin) { _mint(admin, 1e9 ether); _setTransferRestricted(true); - _setTransferFromWhitelisted(admin, true); - _setTransferToWhitelisted(admin, true); + _setTransferWhitelisted(admin, true, true); } function enableTransfer() external onlyOwner { @@ -32,12 +33,11 @@ contract PreTMX is ERC20, Ownable2Step { _setTransferRestricted(true); } - function whitelistTransferFrom(address from, bool isWhitelisted) external onlyOwner { - _setTransferFromWhitelisted(from, isWhitelisted); - } - - function whitelistTransferTo(address to, bool isWhitelisted) external onlyOwner { - _setTransferToWhitelisted(to, isWhitelisted); + function whitelistTransfer(address user, bool isTransferFromWhitelisted, bool isTransferToWhitelisted) + external + onlyOwner + { + _setTransferWhitelisted(user, isTransferFromWhitelisted, isTransferToWhitelisted); } function transfer(address to, uint256 amount) public override returns (bool) { @@ -54,16 +54,16 @@ contract PreTMX is ERC20, Ownable2Step { _mint(to, amount); } - function burn(uint256 amount) external { + function burn(uint256 amount) external onlyOwner { _burn(msg.sender, amount); } function _beforeTokenTransfer(address from, address to) internal view { - if (transferRestricted && !isTransferredFromWhitelisted[from]) { - revert TransferFromNotWhitelisted(from); - } - if (transferRestricted && !isTransferredToWhitelisted[to]) { - revert TransferToNotWhitelisted(to); + if ( + transferRestricted && !whitelistMapping[from].isTransferFromWhitelisted + && !whitelistMapping[to].isTransferToWhitelisted + ) { + revert TransferNotWhitelisted(from, to); } } @@ -72,13 +72,11 @@ contract PreTMX is ERC20, Ownable2Step { emit TransferRestricted(restricted); } - function _setTransferFromWhitelisted(address from, bool isWhitelisted) internal { - isTransferredFromWhitelisted[from] = isWhitelisted; - emit TransferFromWhitelisted(from, isWhitelisted); - } - - function _setTransferToWhitelisted(address to, bool isWhitelisted) internal { - isTransferredToWhitelisted[to] = isWhitelisted; - emit TransferToWhitelisted(to, isWhitelisted); + function _setTransferWhitelisted(address user, bool isTransferFromWhitelisted, bool isTransferToWhitelisted) + internal + { + whitelistMapping[user].isTransferFromWhitelisted = isTransferFromWhitelisted; + whitelistMapping[user].isTransferToWhitelisted = isTransferToWhitelisted; + emit TransferWhitelisted(user, isTransferFromWhitelisted, isTransferToWhitelisted); } } diff --git a/test/v2/tokenomics/PreTMX.t.sol b/test/v2/tokenomics/PreTMX.t.sol index 8fed31d..a8b8c18 100644 --- a/test/v2/tokenomics/PreTMX.t.sol +++ b/test/v2/tokenomics/PreTMX.t.sol @@ -32,8 +32,9 @@ contract PreTMXTest is Test { assertEq(preTMX.balanceOf(admin), initialSupply); assertTrue(preTMX.transferRestricted()); assertEq(preTMX.owner(), admin); - assertTrue(preTMX.isTransferredFromWhitelisted(admin)); - assertTrue(preTMX.isTransferredToWhitelisted(admin)); + (bool isTransferFromWhitelisted, bool isTransferToWhitelisted) = preTMX.whitelistMapping(admin); + assertTrue(isTransferFromWhitelisted); + assertTrue(isTransferToWhitelisted); } function test_EnableTransfer() public { @@ -71,12 +72,6 @@ contract PreTMXTest is Test { preTMX.disableTransfer(); } - function test_Transfer_WhenRestricted_NotWhitelisted() public { - vm.prank(admin); - vm.expectRevert(abi.encodeWithSelector(PreTMX.TransferToNotWhitelisted.selector, user1)); - preTMX.transfer(user1, 1000); - } - function test_Transfer_WhenRestricted_AdminWhitelisted() public { // Admin can transfer to another admin (both whitelisted) vm.prank(admin); @@ -103,15 +98,6 @@ contract PreTMXTest is Test { vm.stopPrank(); } - function test_TransferFrom_WhenRestricted_NotWhitelisted() public { - vm.prank(admin); - preTMX.approve(user1, 1000); - - vm.prank(user1); - vm.expectRevert(abi.encodeWithSelector(PreTMX.TransferToNotWhitelisted.selector, user2)); - preTMX.transferFrom(admin, user2, 1000); - } - function test_TransferFrom_WhenNotRestricted() public { vm.startPrank(admin); preTMX.enableTransfer(); @@ -174,39 +160,55 @@ contract PreTMXTest is Test { vm.prank(admin); preTMX.mint(user1, 5000); - vm.prank(user1); + // Only admin (owner) can burn tokens, not user1 + vm.prank(admin); vm.expectEmit(true, true, false, true); - emit IERC20.Transfer(user1, address(0), 2000); + emit IERC20.Transfer(admin, address(0), 2000); preTMX.burn(2000); - assertEq(preTMX.balanceOf(user1), 3000); + assertEq(preTMX.balanceOf(admin), initialSupply - 2000); assertEq(preTMX.totalSupply(), initialSupply + 5000 - 2000); } function test_Burn_WhenNotRestricted() public { - // First give some tokens to user1 + // First transfer some tokens to user1 vm.startPrank(admin); preTMX.enableTransfer(); preTMX.transfer(user1, 5000); - vm.stopPrank(); - - vm.prank(user1); + // Only admin (owner) can burn tokens vm.expectEmit(true, true, false, true); - emit IERC20.Transfer(user1, address(0), 2000); + emit IERC20.Transfer(admin, address(0), 2000); preTMX.burn(2000); - assertEq(preTMX.balanceOf(user1), 3000); + assertEq(preTMX.balanceOf(admin), initialSupply - 5000 - 2000); assertEq(preTMX.totalSupply(), initialSupply - 2000); + vm.stopPrank(); } function test_Burn_InsufficientBalance() public { + // Admin tries to burn more than they have + vm.prank(admin); + vm.expectRevert( + abi.encodeWithSelector( + IERC20Errors.ERC20InsufficientBalance.selector, admin, initialSupply, initialSupply + 1 + ) + ); + preTMX.burn(initialSupply + 1); + } + + function test_Burn_NotOwner() public { + // Give tokens to user1 via minting + vm.prank(admin); + preTMX.mint(user1, 1000); + + // user1 tries to burn but should fail because only owner can burn vm.prank(user1); - vm.expectRevert(abi.encodeWithSelector(IERC20Errors.ERC20InsufficientBalance.selector, user1, 0, 1)); - preTMX.burn(1); + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, user1)); + preTMX.burn(500); } function test_FuzzTransfer_WhenNotRestricted(uint256 amount) public { @@ -238,118 +240,93 @@ contract PreTMXTest is Test { // Additional tests for whitelisting functionality function test_WhitelistingState() public { // Admin should be whitelisted by default - assertTrue(preTMX.isTransferredFromWhitelisted(admin)); - assertTrue(preTMX.isTransferredToWhitelisted(admin)); + (bool isTransferFromWhitelisted, bool isTransferToWhitelisted) = preTMX.whitelistMapping(admin); + assertTrue(isTransferFromWhitelisted); + assertTrue(isTransferToWhitelisted); // Other users should not be whitelisted - assertFalse(preTMX.isTransferredFromWhitelisted(user1)); - assertFalse(preTMX.isTransferredToWhitelisted(user1)); + (isTransferFromWhitelisted, isTransferToWhitelisted) = preTMX.whitelistMapping(user1); + assertFalse(isTransferFromWhitelisted); + assertFalse(isTransferToWhitelisted); } - function test_WhitelistTransferFrom() public { + function test_WhitelistTransfer() public { // Initially user1 is not whitelisted - assertFalse(preTMX.isTransferredFromWhitelisted(user1)); + (bool isTransferFromWhitelisted, bool isTransferToWhitelisted) = preTMX.whitelistMapping(user1); + assertFalse(isTransferFromWhitelisted); + assertFalse(isTransferToWhitelisted); - // Admin whitelists user1 for sending + // Admin whitelists user1 for sending only vm.prank(admin); vm.expectEmit(true, true, true, true); - emit PreTMX.TransferFromWhitelisted(user1, true); - - preTMX.whitelistTransferFrom(user1, true); - - assertTrue(preTMX.isTransferredFromWhitelisted(user1)); - } - - function test_WhitelistTransferFrom_Unwhitelist() public { - // First whitelist user1 - vm.startPrank(admin); - preTMX.whitelistTransferFrom(user1, true); - assertTrue(preTMX.isTransferredFromWhitelisted(user1)); - - // Then unwhitelist user1 - vm.expectEmit(true, true, true, true); - emit PreTMX.TransferFromWhitelisted(user1, false); + emit PreTMX.TransferWhitelisted(user1, true, false); - preTMX.whitelistTransferFrom(user1, false); - assertFalse(preTMX.isTransferredFromWhitelisted(user1)); - vm.stopPrank(); - } + preTMX.whitelistTransfer(user1, true, false); - function test_WhitelistTransferFrom_NotAdmin() public { - vm.prank(user1); - vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, user1)); - preTMX.whitelistTransferFrom(user2, true); + // Verify user1 is whitelisted for sending but not receiving + (isTransferFromWhitelisted, isTransferToWhitelisted) = preTMX.whitelistMapping(user1); + assertTrue(isTransferFromWhitelisted); + assertFalse(isTransferToWhitelisted); } - function test_WhitelistTransferTo() public { + function test_WhitelistTransfer_BothFlags() public { // Initially user1 is not whitelisted - assertFalse(preTMX.isTransferredToWhitelisted(user1)); + (bool isTransferFromWhitelisted, bool isTransferToWhitelisted) = preTMX.whitelistMapping(user1); + assertFalse(isTransferFromWhitelisted); + assertFalse(isTransferToWhitelisted); - // Admin whitelists user1 for receiving + // Admin whitelists user1 for both sending and receiving vm.prank(admin); vm.expectEmit(true, true, true, true); - emit PreTMX.TransferToWhitelisted(user1, true); + emit PreTMX.TransferWhitelisted(user1, true, true); - preTMX.whitelistTransferTo(user1, true); + preTMX.whitelistTransfer(user1, true, true); - assertTrue(preTMX.isTransferredToWhitelisted(user1)); + (isTransferFromWhitelisted, isTransferToWhitelisted) = preTMX.whitelistMapping(user1); + assertTrue(isTransferFromWhitelisted); + assertTrue(isTransferToWhitelisted); } - function test_WhitelistTransferTo_Unwhitelist() public { - // First whitelist user1 + function test_WhitelistTransfer_Unwhitelist() public { + // First whitelist user1 for both vm.startPrank(admin); - preTMX.whitelistTransferTo(user1, true); - assertTrue(preTMX.isTransferredToWhitelisted(user1)); + preTMX.whitelistTransfer(user1, true, true); + (bool isTransferFromWhitelisted, bool isTransferToWhitelisted) = preTMX.whitelistMapping(user1); + assertTrue(isTransferFromWhitelisted); + assertTrue(isTransferToWhitelisted); - // Then unwhitelist user1 + // Then unwhitelist user1 completely vm.expectEmit(true, true, true, true); - emit PreTMX.TransferToWhitelisted(user1, false); + emit PreTMX.TransferWhitelisted(user1, false, false); - preTMX.whitelistTransferTo(user1, false); - assertFalse(preTMX.isTransferredToWhitelisted(user1)); + preTMX.whitelistTransfer(user1, false, false); + // Verify user1 is no longer whitelisted + (isTransferFromWhitelisted, isTransferToWhitelisted) = preTMX.whitelistMapping(user1); + assertFalse(isTransferFromWhitelisted); + assertFalse(isTransferToWhitelisted); vm.stopPrank(); } - function test_WhitelistTransferTo_NotAdmin() public { + function test_WhitelistTransfer_NotAdmin() public { vm.prank(user1); vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, user1)); - preTMX.whitelistTransferTo(user2, true); + preTMX.whitelistTransfer(user2, true, true); } - function test_WhitelistTransferTo_EnablesTransfer() public { - // Whitelist user1 to receive tokens - vm.startPrank(admin); - - vm.expectEmit(true, true, true, true); - emit PreTMX.TransferToWhitelisted(user1, true); - - preTMX.whitelistTransferTo(user1, true); - - // Now admin can transfer to user1 even when restricted - vm.expectEmit(true, true, false, true); - emit IERC20.Transfer(admin, user1, 1000); - - bool success = preTMX.transfer(user1, 1000); - assertTrue(success); - assertEq(preTMX.balanceOf(user1), 1000); - vm.stopPrank(); - } - - function test_WhitelistTransferFrom_EnablesTransfer() public { + function test_WhitelistTransfer_EnablesTransfer() public { // Give tokens to user1 via minting and whitelist user1 to send vm.startPrank(admin); preTMX.mint(user1, 1000); vm.expectEmit(true, true, true, true); - emit PreTMX.TransferFromWhitelisted(user1, true); + emit PreTMX.TransferWhitelisted(user1, true, false); - preTMX.whitelistTransferFrom(user1, true); - preTMX.whitelistTransferTo(admin, true); // admin already whitelisted but being explicit + preTMX.whitelistTransfer(user1, true, false); vm.stopPrank(); - // Now user1 can transfer to admin + // Now user1 can transfer to admin (admin is whitelisted to receive) vm.prank(user1); bool success = preTMX.transfer(admin, 500); assertTrue(success); @@ -358,19 +335,19 @@ contract PreTMXTest is Test { } function test_BothWhitelisted_EnablesTransfer() public { - // Whitelist both user1 and user2 + // Whitelist user1 to send and user2 to receive vm.startPrank(admin); preTMX.mint(user1, 1000); vm.expectEmit(true, true, true, true); - emit PreTMX.TransferFromWhitelisted(user1, true); + emit PreTMX.TransferWhitelisted(user1, true, false); - preTMX.whitelistTransferFrom(user1, true); + preTMX.whitelistTransfer(user1, true, false); vm.expectEmit(true, true, true, true); - emit PreTMX.TransferToWhitelisted(user2, true); + emit PreTMX.TransferWhitelisted(user2, false, true); - preTMX.whitelistTransferTo(user2, true); + preTMX.whitelistTransfer(user2, false, true); vm.stopPrank(); // Now user1 can transfer to user2 @@ -381,76 +358,52 @@ contract PreTMXTest is Test { assertEq(preTMX.balanceOf(user2), 300); } - function test_PartialWhitelisting_StillRestricted() public { - // Only whitelist user1 to send, but not user2 to receive - vm.startPrank(admin); - preTMX.mint(user1, 1000); - - vm.expectEmit(true, true, true, true); - emit PreTMX.TransferFromWhitelisted(user1, true); - - preTMX.whitelistTransferFrom(user1, true); - // user2 is not whitelisted to receive - vm.stopPrank(); - - // Transfer should still fail because user2 is not whitelisted to receive - vm.prank(user1); - vm.expectRevert(abi.encodeWithSelector(PreTMX.TransferToNotWhitelisted.selector, user2)); - preTMX.transfer(user2, 500); - } - - function test_WhitelistTransferFrom_WithTransferFrom() public { + function test_WhitelistTransfer_WithTransferFrom() public { // Test whitelisting with transferFrom function vm.startPrank(admin); preTMX.mint(user1, 1000); vm.expectEmit(true, true, true, true); - emit PreTMX.TransferFromWhitelisted(user1, true); - - preTMX.whitelistTransferFrom(user1, true); - - vm.expectEmit(true, true, true, true); - emit PreTMX.TransferToWhitelisted(user2, true); + emit PreTMX.TransferWhitelisted(user1, true, false); - preTMX.whitelistTransferTo(user2, true); + preTMX.whitelistTransfer(user1, true, false); vm.stopPrank(); // user1 approves admin to spend tokens vm.prank(user1); preTMX.approve(admin, 500); - // admin can transfer from user1 to user2 + // admin can transfer from user1 to admin (admin is whitelisted to receive) vm.prank(admin); - bool success = preTMX.transferFrom(user1, user2, 500); + bool success = preTMX.transferFrom(user1, admin, 500); assertTrue(success); assertEq(preTMX.balanceOf(user1), 500); - assertEq(preTMX.balanceOf(user2), 500); + assertEq(preTMX.balanceOf(admin), initialSupply + 500); } function test_UnwhitelistingBreaksTransfer() public { // First set up a working scenario vm.startPrank(admin); preTMX.mint(user1, 1000); - preTMX.whitelistTransferFrom(user1, true); - preTMX.whitelistTransferTo(user2, true); + preTMX.whitelistTransfer(user1, true, false); vm.stopPrank(); - // Verify transfer works + // Verify transfer works (user1 can send to admin who is whitelisted to receive) vm.prank(user1); - preTMX.transfer(user2, 100); - assertEq(preTMX.balanceOf(user2), 100); + preTMX.transfer(admin, 100); + assertEq(preTMX.balanceOf(admin), initialSupply + 100); // Now unwhitelist user1 from sending vm.prank(admin); vm.expectEmit(true, true, true, true); - emit PreTMX.TransferFromWhitelisted(user1, false); + emit PreTMX.TransferWhitelisted(user1, false, false); - preTMX.whitelistTransferFrom(user1, false); + preTMX.whitelistTransfer(user1, false, false); // Transfer should now fail vm.prank(user1); - vm.expectRevert(abi.encodeWithSelector(PreTMX.TransferFromNotWhitelisted.selector, user1)); + vm.expectRevert(abi.encodeWithSelector(PreTMX.TransferNotWhitelisted.selector, user1, user2)); preTMX.transfer(user2, 100); } @@ -461,17 +414,9 @@ contract PreTMXTest is Test { // user1 (not whitelisted) tries to transfer - should fail vm.prank(user1); - vm.expectRevert(abi.encodeWithSelector(PreTMX.TransferFromNotWhitelisted.selector, user1)); preTMX.transfer(admin, 500); } - function test_RestrictedTransfer_ToNotWhitelisted() public { - // Admin tries to transfer to non-whitelisted user1 - should fail - vm.prank(admin); - vm.expectRevert(abi.encodeWithSelector(PreTMX.TransferToNotWhitelisted.selector, user1)); - preTMX.transfer(user1, 1000); - } - function test_RestrictedTransferFrom_FromNotWhitelisted() public { // Give tokens to user1 and approve user2 vm.prank(admin); @@ -482,8 +427,8 @@ contract PreTMXTest is Test { // user2 tries to transfer from user1 (not whitelisted) - should fail vm.prank(user2); - vm.expectRevert(abi.encodeWithSelector(PreTMX.TransferFromNotWhitelisted.selector, user1)); - preTMX.transferFrom(user1, admin, 500); + vm.expectRevert(abi.encodeWithSelector(PreTMX.TransferNotWhitelisted.selector, user1, user2)); + preTMX.transferFrom(user1, user2, 500); } function test_MintAndBurnBypassRestrictions() public { @@ -495,22 +440,24 @@ contract PreTMXTest is Test { preTMX.mint(user1, 1000); assertEq(preTMX.balanceOf(user1), 1000); - // Burn from non-whitelisted user should work - vm.prank(user1); + // Only owner can burn tokens (admin in this case) + vm.prank(admin); preTMX.burn(500); - assertEq(preTMX.balanceOf(user1), 500); + assertEq(preTMX.balanceOf(admin), initialSupply - 500); + assertEq(preTMX.totalSupply(), initialSupply + 1000 - 500); } function test_FuzzWhitelisting(address user, bool fromWhitelisted, bool toWhitelisted) public { vm.assume(user != address(0) && user != admin); vm.startPrank(admin); - preTMX.whitelistTransferFrom(user, fromWhitelisted); - preTMX.whitelistTransferTo(user, toWhitelisted); + preTMX.whitelistTransfer(user, fromWhitelisted, toWhitelisted); vm.stopPrank(); - assertEq(preTMX.isTransferredFromWhitelisted(user), fromWhitelisted); - assertEq(preTMX.isTransferredToWhitelisted(user), toWhitelisted); + // Verify the whitelisting state + (bool isTransferFromWhitelisted, bool isTransferToWhitelisted) = preTMX.whitelistMapping(user); + assertEq(isTransferFromWhitelisted, fromWhitelisted); + assertEq(isTransferToWhitelisted, toWhitelisted); } function test_WhitelistSelf() public { @@ -518,65 +465,22 @@ contract PreTMXTest is Test { vm.startPrank(admin); vm.expectEmit(true, true, true, true); - emit PreTMX.TransferFromWhitelisted(admin, false); - - preTMX.whitelistTransferFrom(admin, false); - - vm.expectEmit(true, true, true, true); - emit PreTMX.TransferToWhitelisted(admin, false); - - preTMX.whitelistTransferTo(admin, false); + emit PreTMX.TransferWhitelisted(admin, false, false); - assertFalse(preTMX.isTransferredFromWhitelisted(admin)); - assertFalse(preTMX.isTransferredToWhitelisted(admin)); + preTMX.whitelistTransfer(admin, false, false); + (bool isTransferFromWhitelisted, bool isTransferToWhitelisted) = preTMX.whitelistMapping(admin); + assertFalse(isTransferFromWhitelisted); + assertFalse(isTransferToWhitelisted); // Re-whitelist admin vm.expectEmit(true, true, true, true); - emit PreTMX.TransferFromWhitelisted(admin, true); - - preTMX.whitelistTransferFrom(admin, true); + emit PreTMX.TransferWhitelisted(admin, true, true); - vm.expectEmit(true, true, true, true); - emit PreTMX.TransferToWhitelisted(admin, true); - - preTMX.whitelistTransferTo(admin, true); - - assertTrue(preTMX.isTransferredFromWhitelisted(admin)); - assertTrue(preTMX.isTransferredToWhitelisted(admin)); - vm.stopPrank(); - } - - function test_RestrictedTransferFrom_ToNotWhitelisted() public { - // Test transferFrom with non-whitelisted recipient - vm.startPrank(admin); - preTMX.mint(user1, 1000); - preTMX.whitelistTransferFrom(user1, true); // whitelist sender but not recipient + preTMX.whitelistTransfer(admin, true, true); + (isTransferFromWhitelisted, isTransferToWhitelisted) = preTMX.whitelistMapping(admin); + assertTrue(isTransferFromWhitelisted); + assertTrue(isTransferToWhitelisted); vm.stopPrank(); - - vm.prank(user1); - preTMX.approve(admin, 500); - - vm.prank(admin); - vm.expectRevert(abi.encodeWithSelector(PreTMX.TransferToNotWhitelisted.selector, user2)); - preTMX.transferFrom(user1, user2, 500); - } - - function test_BothErrorTypes() public { - // Test that we get from error when sender not whitelisted - vm.prank(admin); - preTMX.mint(user1, 1000); - - vm.prank(user1); - vm.expectRevert(abi.encodeWithSelector(PreTMX.TransferFromNotWhitelisted.selector, user1)); - preTMX.transfer(user2, 500); - - // Test that we get to error when recipient not whitelisted (sender is whitelisted) - vm.prank(admin); - preTMX.whitelistTransferFrom(user1, true); - - vm.prank(user1); - vm.expectRevert(abi.encodeWithSelector(PreTMX.TransferToNotWhitelisted.selector, user2)); - preTMX.transfer(user2, 500); } // ============ Ownership Transfer Tests ============ @@ -728,8 +632,10 @@ contract PreTMXTest is Test { assertEq(preTMX.balanceOf(user2), 1000); vm.prank(user1); - preTMX.whitelistTransferFrom(user2, true); - assertTrue(preTMX.isTransferredFromWhitelisted(user2)); + preTMX.whitelistTransfer(user2, true, true); + (bool isTransferFromWhitelisted, bool isTransferToWhitelisted) = preTMX.whitelistMapping(user2); + assertTrue(isTransferFromWhitelisted); + assertTrue(isTransferToWhitelisted); // Verify old owner can no longer use onlyOwner functions vm.prank(admin); From 0636bd4aa718fee3c0160d916605db07c9675664 Mon Sep 17 00:00:00 2001 From: "Aaron C.-W. Liang" Date: Tue, 22 Jul 2025 15:50:01 +0800 Subject: [PATCH 192/194] fix test error --- contracts/v2/tokenomics/PreTMX.sol | 1 - test/v2/tokenomics/PreTMX.t.sol | 16 ---------------- 2 files changed, 17 deletions(-) diff --git a/contracts/v2/tokenomics/PreTMX.sol b/contracts/v2/tokenomics/PreTMX.sol index adf56e1..4566b35 100644 --- a/contracts/v2/tokenomics/PreTMX.sol +++ b/contracts/v2/tokenomics/PreTMX.sol @@ -54,7 +54,6 @@ contract PreTMX is ERC20, Ownable2Step { _mint(to, amount); } - function burn(uint256 amount) external onlyOwner { function burn(uint256 amount) external onlyOwner { _burn(msg.sender, amount); } diff --git a/test/v2/tokenomics/PreTMX.t.sol b/test/v2/tokenomics/PreTMX.t.sol index 0ce3ee5..0c0b133 100644 --- a/test/v2/tokenomics/PreTMX.t.sol +++ b/test/v2/tokenomics/PreTMX.t.sol @@ -209,22 +209,6 @@ contract PreTMXTest is Test { preTMX.burn(initialSupply + 1); } - function test_Burn_NotOwner() public { - // Give tokens to user1 via minting - vm.prank(admin); - preTMX.mint(user1, 1000); - - // user1 tries to burn but should fail because only owner can burn - // Admin tries to burn more than they have - vm.prank(admin); - vm.expectRevert( - abi.encodeWithSelector( - IERC20Errors.ERC20InsufficientBalance.selector, admin, initialSupply, initialSupply + 1 - ) - ); - preTMX.burn(initialSupply + 1); - } - function test_Burn_NotOwner() public { // Give tokens to user1 via minting vm.prank(admin); From 95e52e0fbc7fca73bbf62b3f1e95c7700844a6f9 Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 22 Jul 2025 17:01:03 +0800 Subject: [PATCH 193/194] fix ut --- test/v2/tokenomics/PreTMX.t.sol | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/test/v2/tokenomics/PreTMX.t.sol b/test/v2/tokenomics/PreTMX.t.sol index 0c0b133..82d856c 100644 --- a/test/v2/tokenomics/PreTMX.t.sol +++ b/test/v2/tokenomics/PreTMX.t.sol @@ -160,8 +160,6 @@ contract PreTMXTest is Test { vm.prank(admin); preTMX.mint(user1, 5000); - // Only admin (owner) can burn tokens, not user1 - vm.prank(admin); // Only admin (owner) can burn tokens, not user1 vm.prank(admin); @@ -218,6 +216,8 @@ contract PreTMXTest is Test { vm.prank(user1); vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, user1)); preTMX.burn(500); + + vm.prank(user1); vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, user1)); preTMX.burn(500); } @@ -451,8 +451,6 @@ contract PreTMXTest is Test { preTMX.mint(user1, 1000); assertEq(preTMX.balanceOf(user1), 1000); - // Only owner can burn tokens (admin in this case) - vm.prank(admin); // Only owner can burn tokens (admin in this case) vm.prank(admin); preTMX.burn(500); From 26ae575acea5e321ddd37b50409df73c43a38563 Mon Sep 17 00:00:00 2001 From: Evan Date: Wed, 23 Jul 2025 15:31:08 +0800 Subject: [PATCH 194/194] create specific vault v1.1.0 --- .../v2/factory/TermMaxVaultFactoryV2.sol | 1 - contracts/v2/vault/TermMaxVaultV1Plus.sol | 853 ++++++++++++++++++ 2 files changed, 853 insertions(+), 1 deletion(-) create mode 100644 contracts/v2/vault/TermMaxVaultV1Plus.sol diff --git a/contracts/v2/factory/TermMaxVaultFactoryV2.sol b/contracts/v2/factory/TermMaxVaultFactoryV2.sol index 1382468..59be066 100644 --- a/contracts/v2/factory/TermMaxVaultFactoryV2.sol +++ b/contracts/v2/factory/TermMaxVaultFactoryV2.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.27; import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol"; -import {FactoryErrors} from "../../v1/errors/FactoryErrors.sol"; import {ITermMaxVaultV2} from "../vault/ITermMaxVaultV2.sol"; import {FactoryEventsV2} from "../events/FactoryEventsV2.sol"; import {ITermMaxVaultFactoryV2} from "./ITermMaxVaultFactoryV2.sol"; diff --git a/contracts/v2/vault/TermMaxVaultV1Plus.sol b/contracts/v2/vault/TermMaxVaultV1Plus.sol new file mode 100644 index 0000000..5a77638 --- /dev/null +++ b/contracts/v2/vault/TermMaxVaultV1Plus.sol @@ -0,0 +1,853 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +pragma solidity ^0.8.27; + +/** + * @title TermMaxVaultV1Plus + * @notice This contract is inspired by MetaMorphoV1_1 (https://github.com/morpho-org/metamorpho-v1.1/blob/main/src/MetaMorphoV1_1.sol) + * @dev The role management structure is based on Morpho's role system (https://docs.morpho.org/curation/concepts/roles/) + * with similar separation of curator, guardian, and allocator roles for enhanced governance and risk management. + */ +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; +import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; +import { + IERC4626, + ERC4626Upgradeable, + ERC20Upgradeable +} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC4626Upgradeable.sol"; +import {Ownable2StepUpgradeable} from "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; +import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; +import {PendingLib, PendingAddress, PendingUint192} from "../../v1/lib/PendingLib.sol"; +import {ITermMaxMarket} from "../../v1/ITermMaxMarket.sol"; +import {VaultInitialParams, CurveCuts} from "../../v1/storage/TermMaxStorage.sol"; +import {VaultInitialParamsV2} from "../storage/TermMaxStorageV2.sol"; +import {ITermMaxOrder} from "../../v1/ITermMaxOrder.sol"; +import {VaultConstants} from "../../v1/lib/VaultConstants.sol"; +import {TransferUtils} from "../../v1/lib/TransferUtils.sol"; +import {ISwapCallback} from "../../v1/ISwapCallback.sol"; +import {VaultErrors} from "../../v1/errors/VaultErrors.sol"; +import {VaultEvents} from "../../v1/events/VaultEvents.sol"; +import {VaultEventsV2} from "../events/VaultEventsV2.sol"; +import {IOrderManager} from "../../v1/vault/IOrderManager.sol"; +import {VaultStorageV2, OrderInfo} from "./VaultStorageV2.sol"; +import {Constants} from "../../v1/lib/Constants.sol"; +import {ITermMaxVault} from "../../v1/vault/ITermMaxVault.sol"; +import {ITermMaxVaultV2} from "./ITermMaxVaultV2.sol"; +import {VaultErrorsV2} from "../errors/VaultErrorsV2.sol"; +import {TransactionReentrancyGuard} from "../lib/TransactionReentrancyGuard.sol"; + +contract TermMaxVaultV1Plus is + VaultStorageV2, + ITermMaxVault, + Ownable2StepUpgradeable, + ReentrancyGuardUpgradeable, + ERC4626Upgradeable, + PausableUpgradeable, + VaultErrors, + VaultEvents, + ISwapCallback, + ITermMaxVaultV2, + TransactionReentrancyGuard +{ + using SafeCast for uint256; + using TransferUtils for IERC20; + using PendingLib for *; + + address public immutable ORDER_MANAGER_SINGLETON; + + // keccak256(abi.encode(uint256(keccak256("termmax.tsstorage.vault.actionDeposit")) - 1)) & ~bytes32(uint256(0xff)) + uint256 private constant ACTION_DEPOSIT = 0x1d9ff85e70b948f53a2cc45fa6f42c020b2a8eec3349351855dea946b0635700; + // keccak256(abi.encode(uint256(keccak256("termmax.tsstorage.vault.actionWithdraw")) - 1)) & ~bytes32(uint256(0xff)) + uint256 private constant ACTION_WITHDRAW = 0xfcb0c32c4f653382a412cb0caa6a29f9e46d74bae452ca200c67f1e5e6389300; + + modifier onlyCuratorRole() { + address sender = _msgSender(); + if (sender != _curator && sender != owner()) revert NotCuratorRole(); + _; + } + + /// @dev Reverts if the caller doesn't have the guardian role. + modifier onlyGuardianRole() { + address sender = _msgSender(); + if (sender != _guardian && sender != owner()) revert NotGuardianRole(); + + _; + } + + /// @dev Reverts if the caller doesn't have the allocator role. + modifier onlyAllocatorRole() { + address sender = _msgSender(); + if (!_isAllocator[sender] && sender != _curator && sender != owner()) { + revert NotAllocatorRole(); + } + _; + } + + modifier marketIsWhitelisted(address market) { + if (!_marketWhitelist[market]) revert MarketNotWhitelisted(); + _; + } + + /// @dev Makes sure conditions are met to accept a pending value. + /// @dev Reverts if: + /// - there's no pending value; + /// - the timelock has not elapsed since the pending value has been submitted. + modifier afterTimelock(uint256 validAt) { + if (validAt == 0) revert NoPendingValue(); + if (block.timestamp < validAt) revert TimelockNotElapsed(); + _; + } + + constructor(address ORDER_MANAGER_SINGLETON_) { + ORDER_MANAGER_SINGLETON = ORDER_MANAGER_SINGLETON_; + _disableInitializers(); + } + + function initialize(VaultInitialParamsV2 memory params) external virtual initializer { + __ERC20_init_unchained(params.name, params.symbol); + __Ownable_init_unchained(params.admin); + __ERC4626_init_unchained(params.asset); + __ReentrancyGuard_init_unchained(); + __Pausable_init_unchained(); + + _checkPerformanceFeeRateBounds(params.performanceFeeRate); + _setPerformanceFeeRate(params.performanceFeeRate); + _checkTimelockBounds(params.timelock); + _setTimelock(params.timelock); + _setMinApy(params.minApy); + _setMinIdleFundRate(params.minIdleFundRate); + _setGuardian(params.guardian); + _setCapacity(params.maxCapacity); + _setCurator(params.curator); + } + + function initialize(VaultInitialParams memory) external virtual initializer { + revert VaultErrorsV2.UseVaultInitialParamsV2(); + } + + function _setPerformanceFeeRate(uint64 newPerformanceFeeRate) internal { + _delegateCall(abi.encodeCall(IOrderManager.accruedInterest, ())); + _performanceFeeRate = newPerformanceFeeRate; + emit SetPerformanceFeeRate(_msgSender(), newPerformanceFeeRate); + } + + /// @notice View functions + + /** + * @inheritdoc ITermMaxVault + */ + function guardian() external view virtual returns (address) { + return _guardian; + } + + /** + * @inheritdoc ITermMaxVault + */ + function curator() external view virtual returns (address) { + return _curator; + } + + /** + * @inheritdoc ITermMaxVault + */ + function isAllocator(address allocator) external view virtual returns (bool) { + return _isAllocator[allocator]; + } + + /** + * @inheritdoc ITermMaxVault + */ + function marketWhitelist(address market) external view virtual returns (bool) { + return _marketWhitelist[market]; + } + + /** + * @inheritdoc ITermMaxVault + */ + function timelock() external view virtual returns (uint256) { + return _timelock; + } + + /** + * @inheritdoc ITermMaxVault + */ + function pendingMarkets(address market) external view virtual returns (PendingUint192 memory) { + return _pendingMarkets[market]; + } + + /** + * @inheritdoc ITermMaxVault + */ + function pendingTimelock() external view virtual returns (PendingUint192 memory) { + return _pendingTimelock; + } + + /** + * @inheritdoc ITermMaxVault + */ + function pendingPerformanceFeeRate() external view virtual returns (PendingUint192 memory) { + return _pendingPerformanceFeeRate; + } + + /** + * @inheritdoc ITermMaxVault + */ + function pendingGuardian() external view virtual returns (PendingAddress memory) { + return _pendingGuardian; + } + + /** + * @inheritdoc ITermMaxVault + */ + function performanceFeeRate() external view virtual returns (uint64) { + return _performanceFeeRate; + } + + /** + * @inheritdoc ITermMaxVault + */ + function totalFt() external view virtual returns (uint256) { + return _totalFt / Constants.DECIMAL_BASE_SQ; + } + + /** + * @inheritdoc ITermMaxVault + */ + function accretingPrincipal() external view virtual returns (uint256) { + (uint256 ap,) = _previewAccruedInterest(); + return ap / Constants.DECIMAL_BASE_SQ; + } + + /** + * @inheritdoc ITermMaxVault + */ + function annualizedInterest() external view virtual returns (uint256) { + return _annualizedInterest / Constants.DECIMAL_BASE_SQ; + } + + /** + * @inheritdoc ITermMaxVault + */ + function performanceFee() external view virtual returns (uint256) { + (, uint256 pf) = _previewAccruedInterest(); + return pf / Constants.DECIMAL_BASE_SQ; + } + + /** + * @inheritdoc ITermMaxVault + */ + function supplyQueue(uint256) external view virtual returns (address) { + revert VaultErrorsV2.SupplyQueueNoLongerSupported(); + } + + /** + * @inheritdoc ITermMaxVault + */ + function withdrawQueue(uint256) external view virtual returns (address) { + revert VaultErrorsV2.WithdrawalQueueNoLongerSupported(); + } + + /** + * @inheritdoc ITermMaxVault + */ + function orderMapping(address order) external view virtual returns (OrderInfo memory) { + return _orderMapping[order]; + } + + /** + * @inheritdoc ITermMaxVault + */ + function badDebtMapping(address collateral) external view virtual returns (uint256) { + return _badDebtMapping[collateral]; + } + + /** + * @inheritdoc ITermMaxVault + */ + function apr() external view virtual returns (uint256) { + revert VaultErrorsV2.UseApyInsteadOfApr(); + } + + /** + * @inheritdoc ITermMaxVaultV2 + */ + function apy() external view virtual override returns (uint256) { + uint256 accretingPrincipal_ = _accretingPrincipal; + if (accretingPrincipal_ == 0) return 0; + return (_annualizedInterest * (Constants.DECIMAL_BASE - _performanceFeeRate)) / (accretingPrincipal_); + } + + /** + * @inheritdoc ITermMaxVaultV2 + */ + function minApy() external view virtual override returns (uint64) { + return _minApy; + } + + /** + * @inheritdoc ITermMaxVaultV2 + */ + function minIdleFundRate() external view virtual override returns (uint64) { + return _minIdleFundRate; + } + + /** + * @inheritdoc ITermMaxVaultV2 + */ + function pendingMinApy() external view virtual override returns (PendingUint192 memory) { + return _pendingMinApy; + } + + /** + * @inheritdoc ITermMaxVaultV2 + */ + function pendingMinIdleFundRate() external view virtual override returns (PendingUint192 memory) { + return _pendingMinIdleFundRate; + } + + /** + * @inheritdoc ITermMaxVaultV2 + */ + function submitPendingMinApy(uint64 newMinApy) external virtual override onlyCuratorRole { + if (newMinApy == _minApy) revert AlreadySet(); + if (_pendingMinApy.validAt != 0) revert AlreadyPending(); + + if (newMinApy > _minApy) { + _setMinApy(newMinApy); + } else { + _pendingMinApy.update(uint184(newMinApy), _timelock); + emit VaultEventsV2.SubmitMinApy(newMinApy, _pendingMinApy.validAt); + } + } + + /** + * @inheritdoc ITermMaxVaultV2 + */ + function submitPendingMinIdleFundRate(uint64 newMinIdleFundRate) external virtual override onlyCuratorRole { + if (newMinIdleFundRate == _minIdleFundRate) revert AlreadySet(); + if (_pendingMinIdleFundRate.validAt != 0) revert AlreadyPending(); + + if (newMinIdleFundRate > _minIdleFundRate) { + _setMinIdleFundRate(newMinIdleFundRate); + } else { + _pendingMinIdleFundRate.update(uint184(newMinIdleFundRate), _timelock); + emit VaultEventsV2.SubmitMinIdleFundRate(newMinIdleFundRate, _pendingMinIdleFundRate.validAt); + } + } + + /** + * @inheritdoc ITermMaxVaultV2 + */ + function acceptPendingMinApy() external virtual override afterTimelock(_pendingMinApy.validAt) { + _setMinApy(uint64(_pendingMinApy.value)); + delete _pendingMinApy; + } + + /** + * @inheritdoc ITermMaxVaultV2 + */ + function acceptPendingMinIdleFundRate() external virtual override afterTimelock(_pendingMinIdleFundRate.validAt) { + _setMinIdleFundRate(uint64(_pendingMinIdleFundRate.value)); + delete _pendingMinIdleFundRate; + } + + /// @dev Sets `_minApy` to `newMinApy`. + function _setMinApy(uint64 newMinApy) internal { + _minApy = newMinApy; + emit VaultEventsV2.SetMinApy(_msgSender(), newMinApy); + } + + /// @dev Sets `_minIdleFundRate` to `newMinIdleFundRate`. + function _setMinIdleFundRate(uint64 newMinIdleFundRate) internal { + _minIdleFundRate = newMinIdleFundRate; + emit VaultEventsV2.SetMinIdleFundRate(_msgSender(), newMinIdleFundRate); + } + + // Ordermanager functions + /** + * @inheritdoc ITermMaxVault + */ + function createOrder(ITermMaxMarket market, uint256 maxSupply, uint256 initialReserve, CurveCuts memory curveCuts) + external + virtual + onlyCuratorRole + marketIsWhitelisted(address(market)) + whenNotPaused + returns (ITermMaxOrder order) + { + order = abi.decode( + _delegateCall( + abi.encodeCall( + IOrderManager.createOrder, (IERC20(asset()), market, maxSupply, initialReserve, curveCuts) + ) + ), + (ITermMaxOrder) + ); + } + + /** + * @inheritdoc ITermMaxVault + */ + function updateOrders( + ITermMaxOrder[] memory orders, + int256[] memory changes, + uint256[] memory maxSupplies, + CurveCuts[] memory curveCuts + ) external virtual onlyCuratorRole whenNotPaused { + _delegateCall( + abi.encodeCall(IOrderManager.updateOrders, (IERC20(asset()), orders, changes, maxSupplies, curveCuts)) + ); + } + + /** + * @inheritdoc ITermMaxVault + */ + function redeemOrder(ITermMaxOrder order) external virtual { + _delegateCall(abi.encodeCall(IOrderManager.redeemOrder, (order))); + } + + /** + * @inheritdoc ITermMaxVault + */ + function withdrawPerformanceFee(address recipient, uint256 amount) + external + virtual + nonReentrant + whenNotPaused + onlyCuratorRole + { + _delegateCall(abi.encodeCall(IOrderManager.withdrawPerformanceFee, (IERC20(asset()), recipient, amount))); + } + + // ERC4626 functions + + /** + * @dev See {IERC4626-maxDeposit}. + */ + function maxDeposit(address) public view override(IERC4626, ERC4626Upgradeable) returns (uint256) { + if (paused()) return 0; + if (totalAssets() >= _maxCapacity) return 0; + return _maxCapacity - totalAssets(); + } + + /** + * @dev See {IERC4626-maxMint}. + */ + function maxMint(address) public view override(IERC4626, ERC4626Upgradeable) returns (uint256) { + if (paused()) return 0; + return convertToShares(maxDeposit(address(0))); + } + + /** + * @dev Get total assets, falling back to real assets if virtual assets exceed limit + */ + function totalAssets() public view override(IERC4626, ERC4626Upgradeable) returns (uint256) { + (uint256 previewPrincipal,) = _previewAccruedInterest(); + return previewPrincipal / Constants.DECIMAL_BASE_SQ; + } + + /** + * @dev Deposit/mint common workflow. + */ + function _deposit(address caller, address recipient, uint256 assets, uint256 shares) + internal + override + nonReentrant + nonTxReentrantBetweenActions(ACTION_DEPOSIT) + whenNotPaused + { + IERC20(asset()).safeTransferFrom(caller, address(this), assets); + + _delegateCall(abi.encodeCall(IOrderManager.depositAssets, (IERC20(asset()), assets))); + _mint(recipient, shares); + + emit Deposit(caller, recipient, assets, shares); + } + + /** + * @dev Withdraw/redeem common workflow. + */ + function _withdraw(address caller, address receiver, address owner, uint256 assets, uint256 shares) + internal + override + nonReentrant + nonTxReentrantBetweenActions(ACTION_WITHDRAW) + { + if (caller != owner) { + _spendAllowance(owner, caller, shares); + } + + _delegateCall(abi.encodeCall(IOrderManager.withdrawAssets, (IERC20(asset()), receiver, assets))); + _burn(owner, shares); + + emit Withdraw(caller, receiver, owner, assets, shares); + } + + function _delegateCall(bytes memory data) internal returns (bytes memory) { + (bool success, bytes memory returnData) = ORDER_MANAGER_SINGLETON.delegatecall(data); + if (!success) { + assembly { + let ptr := add(returnData, 0x20) + let len := mload(returnData) + revert(ptr, len) + } + } + return returnData; + } + + /** + * @inheritdoc ITermMaxVault + */ + function dealBadDebt(address collateral, uint256 badDebtAmt, address recipient, address owner) + external + virtual + nonReentrant + returns (uint256 shares, uint256 collateralOut) + { + if (collateral == asset()) revert VaultErrorsV2.CollateralIsAsset(); + address caller = msg.sender; + shares = previewWithdraw(badDebtAmt); + uint256 maxShares = maxRedeem(owner); + if (shares > maxShares) { + revert ERC4626ExceededMaxRedeem(recipient, shares, maxShares); + } + + if (caller != owner) { + _spendAllowance(owner, caller, shares); + } + + _burn(owner, shares); + + collateralOut = abi.decode( + _delegateCall(abi.encodeCall(IOrderManager.dealBadDebt, (recipient, collateral, badDebtAmt))), (uint256) + ); + + emit DealBadDebt(caller, recipient, collateral, badDebtAmt, shares, collateralOut); + } + + // Guardian functions + function _setTimelock(uint256 newTimelock) internal { + _timelock = newTimelock; + + emit SetTimelock(msg.sender, newTimelock); + + delete _pendingTimelock; + } + + /** + * @inheritdoc ITermMaxVault + */ + function submitTimelock(uint256 newTimelock) external virtual onlyCuratorRole { + if (newTimelock == _timelock) revert AlreadySet(); + if (_pendingTimelock.validAt != 0) revert AlreadyPending(); + _checkTimelockBounds(newTimelock); + + if (newTimelock > _timelock) { + _setTimelock(newTimelock); + } else { + // Safe "unchecked" cast because newTimelock <= MAX_TIMELOCK. + _pendingTimelock.update(uint184(newTimelock), _timelock); + + emit SubmitTimelock(newTimelock, _pendingTimelock.validAt); + } + } + + /** + * @inheritdoc ITermMaxVault + */ + function setCapacity(uint256 newCapacity) external virtual onlyCuratorRole { + if (newCapacity == _maxCapacity) revert AlreadySet(); + _setCapacity(newCapacity); + } + + function _setCapacity(uint256 newCapacity) internal { + _maxCapacity = newCapacity; + emit SetCapacity(_msgSender(), newCapacity); + } + + function _checkTimelockBounds(uint256 newTimelock) internal pure { + if (newTimelock > VaultConstants.MAX_TIMELOCK) revert AboveMaxTimelock(); + if (newTimelock < VaultConstants.POST_INITIALIZATION_MIN_TIMELOCK) revert BelowMinTimelock(); + } + + function _checkPerformanceFeeRateBounds(uint256 newPerformanceFeeRate) internal pure { + if (newPerformanceFeeRate > VaultConstants.MAX_PERFORMANCE_FEE_RATE) revert PerformanceFeeRateExceeded(); + } + + /** + * @inheritdoc ITermMaxVault + */ + function submitPerformanceFeeRate(uint184 newPerformanceFeeRate) external virtual onlyCuratorRole { + if (newPerformanceFeeRate == _performanceFeeRate) revert AlreadySet(); + if (_pendingPerformanceFeeRate.validAt != 0) revert AlreadyPending(); + _checkPerformanceFeeRateBounds(newPerformanceFeeRate); + if (newPerformanceFeeRate < _performanceFeeRate) { + _setPerformanceFeeRate(uint256(newPerformanceFeeRate).toUint64()); + emit SetPerformanceFeeRate(_msgSender(), newPerformanceFeeRate); + return; + } else { + _pendingPerformanceFeeRate.update(newPerformanceFeeRate, _timelock); + emit SubmitPerformanceFeeRate(newPerformanceFeeRate, _pendingPerformanceFeeRate.validAt); + } + } + + /** + * @inheritdoc ITermMaxVault + */ + function submitGuardian(address newGuardian) external virtual onlyOwner { + if (newGuardian == _guardian) revert AlreadySet(); + if (_pendingGuardian.validAt != 0) revert AlreadyPending(); + + if (_guardian == address(0)) { + _setGuardian(newGuardian); + } else { + _pendingGuardian.update(newGuardian, _timelock); + emit SubmitGuardian(newGuardian, _pendingGuardian.validAt); + } + } + + /// @dev Sets `guardian` to `newGuardian`. + function _setGuardian(address newGuardian) internal { + _guardian = newGuardian; + emit SetGuardian(_msgSender(), newGuardian); + + delete _pendingGuardian; + } + + /** + * @inheritdoc ITermMaxVault + */ + function submitMarket(address market, bool isWhitelisted) external virtual onlyCuratorRole { + if (_marketWhitelist[market] && isWhitelisted) revert AlreadySet(); + if (_pendingMarkets[market].validAt != 0) revert AlreadyPending(); + if (!isWhitelisted) { + _setMarketWhitelist(market, isWhitelisted); + } else { + _pendingMarkets[market].update(0, _timelock); + emit SubmitMarketToWhitelist(market, _pendingMarkets[market].validAt); + } + } + + function _setMarketWhitelist(address market, bool isWhitelisted) internal { + _marketWhitelist[market] = isWhitelisted; + emit SetMarketWhitelist(_msgSender(), market, isWhitelisted); + delete _pendingMarkets[market]; + } + + /** + * @inheritdoc ITermMaxVault + */ + function setIsAllocator(address newAllocator, bool newIsAllocator) external virtual onlyOwner { + if (_isAllocator[newAllocator] == newIsAllocator) revert AlreadySet(); + + _isAllocator[newAllocator] = newIsAllocator; + + emit SetIsAllocator(newAllocator, newIsAllocator); + } + + /** + * @inheritdoc ITermMaxVault + */ + function setCurator(address newCurator) external virtual onlyOwner { + if (newCurator == _curator) revert AlreadySet(); + _setCurator(newCurator); + } + + function _setCurator(address newCurator) internal { + _curator = newCurator; + emit SetCurator(newCurator); + } + + /** + * @inheritdoc ITermMaxVault + */ + function updateSupplyQueue(uint256[] memory) external virtual onlyAllocatorRole { + revert VaultErrorsV2.SupplyQueueNoLongerSupported(); + } + + /** + * @inheritdoc ITermMaxVault + */ + function updateWithdrawQueue(uint256[] memory) external virtual onlyAllocatorRole { + revert VaultErrorsV2.WithdrawalQueueNoLongerSupported(); + } + + /** + * Revoke functions + */ + + /** + * @inheritdoc ITermMaxVault + */ + function revokePendingTimelock() external virtual onlyGuardianRole { + delete _pendingTimelock; + + emit RevokePendingTimelock(_msgSender()); + } + + /** + * @inheritdoc ITermMaxVault + */ + function revokePendingGuardian() external virtual onlyGuardianRole { + delete _pendingGuardian; + + emit RevokePendingGuardian(_msgSender()); + } + + /** + * @inheritdoc ITermMaxVault + */ + function revokePendingMarket(address market) external virtual onlyGuardianRole { + delete _pendingMarkets[market]; + + emit RevokePendingMarket(_msgSender(), market); + } + + /** + * @inheritdoc ITermMaxVault + */ + function revokePendingPerformanceFeeRate() external virtual onlyGuardianRole { + delete _pendingPerformanceFeeRate; + + emit RevokePendingPerformanceFeeRate(_msgSender()); + } + + /** + * @notice Revoke pending minimum APY change + */ + function revokePendingMinApy() external virtual onlyGuardianRole { + delete _pendingMinApy; + + emit VaultEventsV2.RevokePendingMinApy(_msgSender()); + } + + /** + * @notice Revoke pending minimum idle fund rate change + */ + function revokePendingMinIdleFundRate() external virtual onlyGuardianRole { + delete _pendingMinIdleFundRate; + + emit VaultEventsV2.RevokePendingMinIdleFundRate(_msgSender()); + } + + /** + * @inheritdoc ITermMaxVault + */ + function acceptTimelock() external virtual afterTimelock(_pendingTimelock.validAt) { + _setTimelock(_pendingTimelock.value); + } + + /** + * @inheritdoc ITermMaxVault + */ + function acceptGuardian() external virtual afterTimelock(_pendingGuardian.validAt) { + _setGuardian(_pendingGuardian.value); + } + + /** + * @inheritdoc ITermMaxVault + */ + function acceptMarket(address market) external virtual afterTimelock(_pendingMarkets[market].validAt) { + _setMarketWhitelist(market, true); + } + + /** + * @inheritdoc ITermMaxVault + */ + function acceptPerformanceFeeRate() external virtual afterTimelock(_pendingPerformanceFeeRate.validAt) { + _setPerformanceFeeRate(uint256(_pendingPerformanceFeeRate.value).toUint64()); + delete _pendingPerformanceFeeRate; + emit SetPerformanceFeeRate(_msgSender(), _performanceFeeRate); + } + + /** + * @notice Pauses the contract + */ + function pause() external virtual onlyOwner { + _pause(); + } + + /** + * @notice Unpauses the contract + */ + function unpause() external virtual onlyOwner { + _unpause(); + } + + function _previewAccruedInterest() + internal + view + returns (uint256 previewPrincipal, uint256 previewPerformanceFee) + { + uint64 currentTime = block.timestamp.toUint64(); + + uint256 lastTime = _lastUpdateTime; + if (lastTime == 0) { + return (_accretingPrincipal, _performanceFee); + } + uint64 recentMaturity = _maturityMapping[0]; + uint256 previewAnnualizedInterest = _annualizedInterest; + previewPrincipal = _accretingPrincipal; + previewPerformanceFee = _performanceFee; + + while (currentTime >= recentMaturity && recentMaturity != 0) { + (uint256 previewInterest, uint256 previewPerformanceFeeToCurator) = + _previewAccruedPeriodInterest(lastTime, recentMaturity, previewAnnualizedInterest); + lastTime = recentMaturity; + uint64 nextMaturity = _maturityMapping[recentMaturity]; + // update annualized interest + previewAnnualizedInterest -= _maturityToInterest[recentMaturity]; + + previewPerformanceFee += previewPerformanceFeeToCurator; + previewPrincipal += previewInterest; + + recentMaturity = nextMaturity; + } + if (recentMaturity > 0) { + (uint256 previewInterest, uint256 previewPerformanceFeeToCurator) = + _previewAccruedPeriodInterest(lastTime, currentTime, previewAnnualizedInterest); + previewPerformanceFee += previewPerformanceFeeToCurator; + previewPrincipal += previewInterest; + } + } + + function _previewAccruedPeriodInterest(uint256 startTime, uint256 endTime, uint256 previewAnnualizedInterest) + internal + view + returns (uint256, uint256) + { + uint256 interest = (previewAnnualizedInterest * (endTime - startTime)) / 365 days; + uint256 performanceFeeToCurator = (interest * _performanceFeeRate) / Constants.DECIMAL_BASE; + return (interest - performanceFeeToCurator, performanceFeeToCurator); + } + + /// @notice Callback function for the swap + /// @param deltaFt The change in the ft balance of the order + function afterSwap(uint256 ftReserve, uint256 xtReserve, int256 deltaFt, int256) + external + virtual + override + whenNotPaused + { + _delegateCall(abi.encodeCall(IOrderManager.afterSwap, (ftReserve, xtReserve, deltaFt))); + } + + /** + * @inheritdoc ITermMaxVault + */ + function supplyQueueLength() external view virtual returns (uint256) { + revert VaultErrorsV2.SupplyQueueNoLongerSupported(); + } + + /** + * @inheritdoc ITermMaxVault + */ + function withdrawQueueLength() external view virtual returns (uint256) { + revert VaultErrorsV2.WithdrawalQueueNoLongerSupported(); + } + + // Function to get the version number + function getVersion() external pure returns (string memory) { + return "1.1.0"; + } +}