Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 330 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Swap Lsd To Eth | 20644060 | 105 days ago | IN | 0 ETH | 0.00140831 | ||||
Swap Lsd To Eth | 20644053 | 105 days ago | IN | 0 ETH | 0.00128841 | ||||
Swap Lsd To Eth | 20644046 | 105 days ago | IN | 0 ETH | 0.00136128 | ||||
Swap Lsd To Eth | 20644036 | 105 days ago | IN | 0 ETH | 0.00134685 | ||||
Swap Lsd To Eth | 20644028 | 105 days ago | IN | 0 ETH | 0.00127913 | ||||
Swap Lsd To Eth | 20644021 | 105 days ago | IN | 0 ETH | 0.00126601 | ||||
Swap Lsd To Eth | 20542571 | 119 days ago | IN | 0 ETH | 0.00087266 | ||||
Swap Lsd To Eth | 20542559 | 119 days ago | IN | 0 ETH | 0.00100586 | ||||
Swap Lsd To Eth | 18919607 | 347 days ago | IN | 0 ETH | 0.00689644 | ||||
Swap Lsd To Eth | 18919604 | 347 days ago | IN | 0 ETH | 0.00737028 | ||||
Swap Lsd To Eth | 18842895 | 357 days ago | IN | 0 ETH | 0.00233895 | ||||
Swap Lsd To Eth | 18842877 | 357 days ago | IN | 0 ETH | 0.00200906 | ||||
Swap Lsd To Eth | 18842875 | 357 days ago | IN | 0 ETH | 0.01828248 | ||||
Swap Lsd To Eth | 18842873 | 357 days ago | IN | 0 ETH | 0.01909961 | ||||
Swap Lsd To Eth | 18842867 | 357 days ago | IN | 0 ETH | 0.01705681 | ||||
Swap Lsd To Eth | 18842857 | 357 days ago | IN | 0 ETH | 0.0150135 | ||||
Swap Lsd To Eth | 18842851 | 357 days ago | IN | 0 ETH | 0.01654174 | ||||
Swap Lsd To Eth | 18842775 | 357 days ago | IN | 0 ETH | 0.02057561 | ||||
Swap Lsd To Eth | 18842749 | 357 days ago | IN | 0 ETH | 0.02101042 | ||||
Swap Lsd To Eth | 18842741 | 357 days ago | IN | 0 ETH | 0.02081727 | ||||
Swap Lsd To Eth | 18752954 | 370 days ago | IN | 0 ETH | 0.01096956 | ||||
Swap Lsd To Eth | 18752949 | 370 days ago | IN | 0 ETH | 0.00984864 | ||||
Swap Lsd To Eth | 18752942 | 370 days ago | IN | 0 ETH | 0.01146474 | ||||
Swap Lsd To Eth | 18585591 | 393 days ago | IN | 0 ETH | 0.01893847 | ||||
Swap Lsd To Eth | 18585586 | 393 days ago | IN | 0 ETH | 0.01883445 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
20644060 | 105 days ago | 0.48610847 ETH | ||||
20644060 | 105 days ago | 0.48610847 ETH | ||||
20644053 | 105 days ago | 0.89211946 ETH | ||||
20644053 | 105 days ago | 0.89211946 ETH | ||||
20644046 | 105 days ago | 0.47904633 ETH | ||||
20644046 | 105 days ago | 0.47904633 ETH | ||||
20644036 | 105 days ago | 0.44031686 ETH | ||||
20644036 | 105 days ago | 0.44031686 ETH | ||||
20644028 | 105 days ago | 1.01884682 ETH | ||||
20644028 | 105 days ago | 1.01884682 ETH | ||||
20644021 | 105 days ago | 0.43405056 ETH | ||||
20644021 | 105 days ago | 0.43405056 ETH | ||||
20542571 | 119 days ago | 0.02302286 ETH | ||||
20542571 | 119 days ago | 0.02302286 ETH | ||||
20542559 | 119 days ago | 0.0523247 ETH | ||||
20542559 | 119 days ago | 0.0523247 ETH | ||||
19245942 | 301 days ago | 35.98882475 ETH | ||||
19245942 | 301 days ago | 35.98882475 ETH | ||||
18919607 | 347 days ago | 4.15724372 ETH | ||||
18919607 | 347 days ago | 4.15724372 ETH | ||||
18919604 | 347 days ago | 3.94532697 ETH | ||||
18919604 | 347 days ago | 3.94532697 ETH | ||||
18842875 | 357 days ago | 3.57741324 ETH | ||||
18842875 | 357 days ago | 3.57741324 ETH | ||||
18842873 | 357 days ago | 7.6908308 ETH |
Loading...
Loading
Contract Name:
VDAMM
Compiler Version
v0.8.18+commit.87f61d96
Optimization Enabled:
Yes with 9999 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.18; import "communal/ReentrancyGuard.sol"; import "communal/Owned.sol"; import "communal/SafeERC20.sol"; import "communal/TransferHelper.sol"; //import "forge-std/console.sol"; /* * VDAMM Contract: * */ interface IWETH is IERC20 { function deposit() external payable; function withdraw(uint wad) external; } interface ILSDVault { function darknetAddress() external view returns (address); function redeemFee() external view returns (uint256); function exit(uint256 amount) external; function isEnabled(address lsd) external view returns (bool); function remainingRoomToCap(address lsd, uint256 marginalDeposit) external view returns (uint256); function getTargetAmount(address lsd, uint256 marginalDeposit) external view returns (uint256); } interface IDarknet { function checkPrice(address lsd) external view returns (uint256); } interface IunshETH { function timelock_address() external view returns (address); } /* * Fee Collector Contract: * This contract is responsible for managing fee curves and calculations * vdAMM swap and unshETH redemption fees are collected here after fee switch is turned on */ contract VDAMM is Owned, ReentrancyGuard { using SafeERC20 for IERC20; /* ============================================================================ State Variables ============================================================================ */ address public constant wethAddress = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; address public constant unshethAddress = 0x0Ae38f7E10A43B5b2fB064B42a2f4514cbA909ef; address public immutable vaultAddress; address public darknetAddress; address[] public lsds; ILSDVault public vault; bool public ammPaused; struct AmmFee { uint256 baseFee; uint256 dynamicFee; uint256 instantRedemptionFee; } struct AMMFeeConfig { uint256 baseFeeBps; uint256 instantRedemptionFeeBps; uint256 unshethFeeShareBps; uint256 dynamicFeeSlope_x; uint256 dynamicFeeSlope_x2; } //Mutable parameters, can be changed by governance AMMFeeConfig ammFeeConfig = AMMFeeConfig(1, 20, 10000, 50, 1000); bool public depositFeeEnabled = true; //Immutable parameters, cannot be changed after deployment uint256 public constant maxBaseFeeBps = 10; uint256 public constant maxDynamicFeeBps = 200; uint256 public constant minUnshethFeeShareBps = 5000; //At least half swap fees go to unshETH /* ============================================================================ Events ============================================================================ */ //Fee curve parameters event BaseFeeUpdated(uint256 _baseFeeBps); event UnshethFeeShareUpdated(uint256 _unshethFeeShareBps); event InstantRedemptionFeeUpdated(uint256 _instantRedemptionFeeBps); event FeeSlopesUpdated(uint256 _dynamicFeeSlope_x, uint256 _dynamicFeeSlope_x2); event DepositFeeToggled(bool depositFeeEnabled); //Admin functions event PauseToggled(bool ammPaused); event TokensWithdrawn(address tokenAddress, uint256 amount); event EthWithdrawn(uint256 amount); event DarknetAddressUpdated(address darknetAddress); event NewLsdApproved(address lsd); //Swap event SwapLsdToLsd(uint256 amountIn, address lsdIn, address lsdOut, uint256 lsdAmountOut, uint256 baseFee, uint256 dynamicFee, uint256 protocolFee); /* ============================================================================ Constructor ============================================================================ */ constructor(address _owner, address[] memory _lsds) Owned(_owner) { vaultAddress = IunshETH(unshethAddress).timelock_address(); vault = ILSDVault(vaultAddress); darknetAddress = vault.darknetAddress(); lsds = _lsds; ammPaused = true; //set approvals for (uint256 i = 0; i < _lsds.length; i = unchkIncr(i)) { TransferHelper.safeApprove(_lsds[i], vaultAddress, type(uint256).max); } TransferHelper.safeApprove(unshethAddress, vaultAddress, type(uint256).max); } /* ============================================================================ Function Modifiers ============================================================================ */ modifier onlyWhenUnpaused() { require(ammPaused == false, "AMM is paused"); _; } modifier onlyWhenPaused() { require(ammPaused == true, "AMM must be paused"); _; } /* ============================================================================ vdAMM configuration functions (multisig only) ============================================================================ */ function setBaseFee(uint256 _baseFeeBps) external onlyOwner { require(_baseFeeBps <= maxBaseFeeBps, "Base fee cannot be greater than max fee"); ammFeeConfig.baseFeeBps = _baseFeeBps; emit BaseFeeUpdated(_baseFeeBps); } function setDynamicFeeSlopes(uint256 _dynamicFeeSlope_x, uint256 _dynamicFeeSlope_x2) external onlyOwner { ammFeeConfig.dynamicFeeSlope_x = _dynamicFeeSlope_x; ammFeeConfig.dynamicFeeSlope_x2 = _dynamicFeeSlope_x2; emit FeeSlopesUpdated(_dynamicFeeSlope_x, _dynamicFeeSlope_x2); } function setUnshethFeeShare(uint256 _unshethFeeShareBps) external onlyOwner { require(_unshethFeeShareBps <= 10000, "unshETH fee share cannot be greater than 100%"); require(_unshethFeeShareBps >= minUnshethFeeShareBps, "unshETH fee share must be greater than min"); ammFeeConfig.unshethFeeShareBps = _unshethFeeShareBps; emit UnshethFeeShareUpdated(_unshethFeeShareBps); } function setInstantRedemptionFee(uint256 _instantRedemptionFeeBps) external onlyOwner { require( _instantRedemptionFeeBps <= maxDynamicFeeBps, "Instant redemption fee cannot be greater than max fee" ); ammFeeConfig.instantRedemptionFeeBps = _instantRedemptionFeeBps; emit InstantRedemptionFeeUpdated(_instantRedemptionFeeBps); } function toggleDepositFee() external onlyOwner { depositFeeEnabled = !depositFeeEnabled; emit DepositFeeToggled(depositFeeEnabled); } /* ============================================================================ Admin functions (multisig only) ============================================================================ */ function togglePaused() external onlyOwner { ammPaused = !ammPaused; emit PauseToggled(ammPaused); } function withdrawTokens(address tokenAddress) external onlyOwner { uint256 balance = IERC20(tokenAddress).balanceOf(address(this)); require(balance > 0, "No tokens to withdraw"); TransferHelper.safeTransfer(tokenAddress, msg.sender, balance); emit TokensWithdrawn(tokenAddress, balance); } function withdrawStuckEth() external onlyOwner { uint256 ethBal = address(this).balance; Address.sendValue(payable(owner), ethBal); emit EthWithdrawn(ethBal); } function updateDarknetAddress() external onlyOwner { darknetAddress = ILSDVault(vaultAddress).darknetAddress(); emit DarknetAddressUpdated(darknetAddress); } //Technically, full timelock proposal is needed to add a new LSD. This function just ensures new vdAMM doesn't need to be re-deployed function approveNewLsd(address lsdAddress) external onlyOwner { lsds.push(lsdAddress); TransferHelper.safeApprove(lsdAddress, vaultAddress, type(uint256).max); emit NewLsdApproved(lsdAddress); } /* ============================================================================ Fee curve logic ============================================================================ */ function unshethFeeShareBps() public view returns (uint256) { return ammFeeConfig.unshethFeeShareBps; } function getEthConversionRate(address lsd) public view returns (uint256) { return IDarknet(darknetAddress).checkPrice(lsd); } //View function to get lsdAmountOut and fees for a swap. Does not deal with require checks if the swap is valid function swapLsdToLsdCalcs( uint256 amountIn, address lsdIn, address lsdOut ) public view returns (uint256, uint256, uint256, uint256) { //Sanity checks require(lsdIn != lsdOut, "Cannot swap same lsd"); require(vault.isEnabled(lsdIn), "lsdIn not enabled"); require(vault.isEnabled(lsdOut), "lsdOut is not enabled"); require(amountIn > 0, "Cannot swap 0 lsd"); //In a swap, total amount of ETH in the vault is constant we're swapping on a 1:1 ETH basis //To simplify and do a conservative first order approximation, we assume marginal deposit amount is 0 uint256 distanceToCap = vault.remainingRoomToCap(lsdIn, 0); require(amountIn <= distanceToCap, "Trade would exceed cap"); uint256 ethAmountIn = (amountIn * getEthConversionRate(lsdIn)) / 1e18; uint256 ethAmountOutBeforeFees = ethAmountIn; //Calculate fees (uint256 baseFee, uint256 dynamicFee, ) = getAmmFee(ethAmountIn, lsdIn, lsdOut); //in lsdOut terms //Fees are paid in lsdOut terms uint256 totalFee = baseFee + dynamicFee; uint256 protocolFee = (totalFee * (10000 - ammFeeConfig.unshethFeeShareBps)) / 10000; uint256 lsdAmountOutBeforeFees = (ethAmountOutBeforeFees * 1e18) / getEthConversionRate(lsdOut); uint256 lsdAmountOut = lsdAmountOutBeforeFees - totalFee; return (lsdAmountOut, baseFee, dynamicFee, protocolFee); } //returns amm fees in lsdOut terms function getAmmFee( uint256 ethAmountIn, address lsdIn, address lsdOut ) public view returns (uint256, uint256, uint256) { uint256 baseFeeInEthTerms = (ethAmountIn * ammFeeConfig.baseFeeBps) / 10000; uint256 lsdInDynamicFeeBps = getLsdDynamicFeeBps(ethAmountIn, lsdIn, true); uint256 lsdOutDynamicFeeBps = getLsdDynamicFeeBps(ethAmountIn, lsdOut, false); if (lsdOut == wethAddress) { lsdOutDynamicFeeBps = _min(maxDynamicFeeBps, lsdOutDynamicFeeBps + ammFeeConfig.instantRedemptionFeeBps); } //Take the higher of two and cap at maxDynamicFeeBps uint256 dynamicFeeBps = _max(lsdInDynamicFeeBps, lsdOutDynamicFeeBps); uint256 dynamicFeeInEthTerms = (ethAmountIn * dynamicFeeBps) / 10000; uint256 baseFee = (baseFeeInEthTerms * 1e18) / getEthConversionRate(lsdOut); uint256 dynamicFee = (dynamicFeeInEthTerms * 1e18) / getEthConversionRate(lsdOut); return (baseFee, dynamicFee, dynamicFeeBps); } // Dynamic fee (inspired by GLP, with unshETH twist) // Fees are 0 when swaps help rebalance the vault (i.e. when difference to target is reduced post-swap) // When swaps worsen the distance to target, fees are applied // Fees are proportional to the square of the % distance to target (taking the average before and after the swap) // Small deviations are generally low fee // Large deviations are quadratically higher penalty (since co-variance of unshETH is quadratically increasing) // All deviations to target and normalized by the target weight (otherwise small LSDs won't be penalized at all) // Fees are capped at maxDynamicFeeBps function getLsdDynamicFeeBps( uint256 ethDelta, address lsd, bool increment ) public view returns (uint256) { uint256 lsdBalance = IERC20(lsd).balanceOf(vaultAddress); uint256 initialAmount = (lsdBalance * getEthConversionRate(lsd)) / 1e18; //lsd balance in ETH terms uint256 nextAmount; if (increment) { nextAmount = initialAmount + ethDelta; } else { nextAmount = initialAmount - _min(initialAmount, ethDelta); } uint256 targetAmount = (vault.getTargetAmount(lsd, 0) * getEthConversionRate(lsd)) / 1e18; uint256 initialDiff = _absDiff(initialAmount, targetAmount); uint256 nextDiff = _absDiff(nextAmount, targetAmount); //If action improves the distance to target, zero fee if (nextDiff < initialDiff) { return 0; //no fee } //If target is zero and we are moving away from it, charge max fee if (targetAmount == 0) { return maxDynamicFeeBps; } //Otherwise Fee = a*x + b*x^2, where x = averageDiff / targetAmount uint256 averageDiff = (initialDiff + nextDiff) / 2; uint256 x = (averageDiff * 1e18) / targetAmount; uint256 x2 = (x * x) / 1e18; uint256 dynamicFeeBps_x = (ammFeeConfig.dynamicFeeSlope_x * x) / 1e18; uint256 dynamicFeeBps_x2 = (ammFeeConfig.dynamicFeeSlope_x2 * x2) / 1e18; return _min(maxDynamicFeeBps, dynamicFeeBps_x + dynamicFeeBps_x2); } function getDepositFee(uint256 lsdAmountIn, address lsd) public view returns (uint256, uint256) { if (!depositFeeEnabled) { return (0, 0); } uint256 ethAmountIn = (lsdAmountIn * getEthConversionRate(lsd)) / 1e18; uint256 dynamicFeeBps = getLsdDynamicFeeBps(ethAmountIn, lsd, true); uint256 redeemFeeBps = vault.redeemFee(); //If dynamic fee < redeem fee, then deposit fee = 0, otherwise deposit fee = dynamic fee - redeem fee uint256 depositFeeBps = dynamicFeeBps - _min(dynamicFeeBps, redeemFeeBps); uint256 depositFee = (lsdAmountIn * depositFeeBps) / 10000; uint256 protocolFee = (depositFee * (10000 - ammFeeConfig.unshethFeeShareBps)) / 10000; return (depositFee, protocolFee); } /* ============================================================================ Swapping ============================================================================ */ function swapLsdToEth( uint256 amountIn, address lsdIn, uint256 minAmountOut ) external nonReentrant onlyWhenUnpaused returns (uint256, uint256, uint256) { //Transfer lsdIn from user to vault TransferHelper.safeTransferFrom(lsdIn, msg.sender, address(this), amountIn); (uint256 wethAmountOut, uint256 baseFee, uint256 dynamicFee) = _swapLsdToLsd( amountIn, lsdIn, wethAddress, minAmountOut ); //Convert weth to ETH and send to user IWETH(wethAddress).withdraw(wethAmountOut); Address.sendValue(payable(msg.sender), wethAmountOut); return (wethAmountOut, baseFee, dynamicFee); } function swapEthToLsd( address lsdOut, uint256 minAmountOut ) external payable nonReentrant onlyWhenUnpaused returns (uint256, uint256, uint256) { //Convert ETH to weth and swap IWETH(wethAddress).deposit{ value: msg.value }(); (uint256 lsdAmountOut, uint256 baseFee, uint256 dynamicFee) = _swapLsdToLsd( msg.value, wethAddress, lsdOut, minAmountOut ); //Send lsdOut to user TransferHelper.safeTransfer(lsdOut, msg.sender, lsdAmountOut); return (lsdAmountOut, baseFee, dynamicFee); } function swapLsdToLsd( uint256 amountIn, address lsdIn, address lsdOut, uint256 minAmountOut ) external nonReentrant onlyWhenUnpaused returns (uint256, uint256, uint256) { //Transfer lsdIn from user to vdamm and swap TransferHelper.safeTransferFrom(lsdIn, msg.sender, address(this), amountIn); (uint256 lsdAmountOut, uint256 baseFee, uint256 dynamicFee) = _swapLsdToLsd( amountIn, lsdIn, lsdOut, minAmountOut ); //Send lsdOut to user TransferHelper.safeTransfer(lsdOut, msg.sender, lsdAmountOut); return (lsdAmountOut, baseFee, dynamicFee); } // Converts lsd to another lsd. // Collects protocol fees in vdAMM contract, and keeps unshETH share of fees for unshETH holders. // Assumes lsdIn is already in vdamm contract, lsdAmountOut + protocol fees is kept in vdAMM contract // Returns lsdAmountOut. function _swapLsdToLsd( uint256 amountIn, address lsdIn, address lsdOut, uint256 minAmountOut ) internal returns (uint256, uint256, uint256) { (uint256 lsdAmountOut, uint256 baseFee, uint256 dynamicFee, uint256 protocolFee) = swapLsdToLsdCalcs( amountIn, lsdIn, lsdOut ); require(lsdAmountOut >= minAmountOut, "Slippage limit reached"); //Amount to take out from vault = amountOut + protocolFee from vault. unshETH share of fees are kept in the vault uint256 lsdAmountOutFromVault = lsdAmountOut + protocolFee; require( lsdAmountOutFromVault <= IERC20(lsdOut).balanceOf(vaultAddress), "Not enough lsdOut in vault" ); //Transfer amountIn from vdAMM to the vault TransferHelper.safeTransfer(lsdIn, vaultAddress, amountIn); //Transfer lsdOut from vault to vdAMM TransferHelper.safeTransferFrom(lsdOut, vaultAddress, address(this), lsdAmountOutFromVault); emit SwapLsdToLsd(amountIn, lsdIn, lsdOut, lsdAmountOut, baseFee, dynamicFee, protocolFee); //Return the lsdAmountOut (which subtracts protocolFee). ProtocolFee is kept in vdAMM contract return (lsdAmountOut, baseFee, dynamicFee); } /* ============================================================================ Other functions ============================================================================ */ function unchkIncr(uint256 i) private pure returns (uint256) { unchecked { return i + 1; } } function _min(uint256 _a, uint256 _b) private pure returns (uint256) { if (_a < _b) { return _a; } else { return _b; } } function _max(uint256 _a, uint256 _b) private pure returns (uint256) { if (_a > _b) { return _a; } else { return _b; } } function _absDiff(uint256 _a, uint256 _b) private pure returns (uint256) { if (_a > _b) { return _a - _b; } else { return _b - _a; } } //Allow receiving eth to the contract receive() external payable {} }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.11 <0.9.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.11; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return payable(msg.sender); } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.11; import "./Context.sol"; import "./SafeMath.sol"; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity >=0.6.11; // https://docs.synthetix.io/contracts/Owned contract Owned { address public owner; address public nominatedOwner; constructor (address _owner) public { require(_owner != address(0), "Owner address cannot be 0"); owner = _owner; emit OwnerChanged(address(0), _owner); } function nominateNewOwner(address _owner) external onlyOwner { nominatedOwner = _owner; emit OwnerNominated(_owner); } function acceptOwnership() external { require(msg.sender == nominatedOwner, "You must be nominated before you can accept ownership"); emit OwnerChanged(owner, nominatedOwner); owner = nominatedOwner; nominatedOwner = address(0); } modifier onlyOwner { require(msg.sender == owner, "Only the contract owner may perform this action"); _; } event OwnerNominated(address newOwner); event OwnerChanged(address oldOwner, address newOwner); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.11; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () internal { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.11; import "./IERC20.sol"; import "./SafeMath.sol"; import "./Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.11; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.11; // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { function safeApprove(address token, address to, uint value) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED'); } function safeTransfer(address token, address to, uint value) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED'); } function safeTransferFrom(address token, address from, address to, uint value) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED'); } function safeTransferETH(address to, uint value) internal { (bool success,) = to.call{value:value}(new bytes(0)); require(success, 'TransferHelper: ETH_TRANSFER_FAILED'); } }
{ "remappings": [ "@ensdomains/=node_modules/@ensdomains/", "@ethereum-waffle/=node_modules/@ethereum-waffle/", "@openzeppelin/=node_modules/@openzeppelin/", "@pancakeswap/=node_modules/@pancakeswap/", "@prb/math/=lib/prb-math/src/", "@prb/test/=lib/prb-test/src/", "@uniswap/=node_modules/@uniswap/", "Common/=lib/Common/", "ERC20/=lib/ERC20/", "Governance/=lib/Governance/", "Math/=lib/Math/", "Staking/=lib/Staking/", "Utils/=lib/Utils/", "base64-sol/=node_modules/base64-sol/", "communal/=lib/communal/", "ds-test/=lib/forge-std/lib/ds-test/src/", "forge-std/=lib/forge-std/src/", "hardhat/=node_modules/hardhat/", "layerzerolabs/=lib/solidity-examples/", "local/=src/", "openzeppelin-contracts/=lib/openzeppelin-contracts/", "openzeppelin/=lib/openzeppelin/", "prb-math/=lib/prb-math/src/", "prb-test/=lib/prb-math/lib/prb-test/src/", "solidity-examples/=lib/solidity-examples/contracts/", "solmate/=lib/solmate/src/", "src/=lib/prb-math/src/" ], "optimizer": { "enabled": true, "runs": 9999 }, "metadata": { "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "london", "viaIR": true, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address[]","name":"_lsds","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_baseFeeBps","type":"uint256"}],"name":"BaseFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"darknetAddress","type":"address"}],"name":"DarknetAddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"depositFeeEnabled","type":"bool"}],"name":"DepositFeeToggled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EthWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_dynamicFeeSlope_x","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_dynamicFeeSlope_x2","type":"uint256"}],"name":"FeeSlopesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_instantRedemptionFeeBps","type":"uint256"}],"name":"InstantRedemptionFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"lsd","type":"address"}],"name":"NewLsdApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerNominated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"ammPaused","type":"bool"}],"name":"PauseToggled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address","name":"lsdIn","type":"address"},{"indexed":false,"internalType":"address","name":"lsdOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"lsdAmountOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"baseFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dynamicFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"protocolFee","type":"uint256"}],"name":"SwapLsdToLsd","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokensWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_unshethFeeShareBps","type":"uint256"}],"name":"UnshethFeeShareUpdated","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ammPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lsdAddress","type":"address"}],"name":"approveNewLsd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"darknetAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositFeeEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"ethAmountIn","type":"uint256"},{"internalType":"address","name":"lsdIn","type":"address"},{"internalType":"address","name":"lsdOut","type":"address"}],"name":"getAmmFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"lsdAmountIn","type":"uint256"},{"internalType":"address","name":"lsd","type":"address"}],"name":"getDepositFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lsd","type":"address"}],"name":"getEthConversionRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"ethDelta","type":"uint256"},{"internalType":"address","name":"lsd","type":"address"},{"internalType":"bool","name":"increment","type":"bool"}],"name":"getLsdDynamicFeeBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lsds","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBaseFeeBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxDynamicFeeBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minUnshethFeeShareBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"nominateNewOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nominatedOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_baseFeeBps","type":"uint256"}],"name":"setBaseFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_dynamicFeeSlope_x","type":"uint256"},{"internalType":"uint256","name":"_dynamicFeeSlope_x2","type":"uint256"}],"name":"setDynamicFeeSlopes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_instantRedemptionFeeBps","type":"uint256"}],"name":"setInstantRedemptionFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_unshethFeeShareBps","type":"uint256"}],"name":"setUnshethFeeShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lsdOut","type":"address"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"swapEthToLsd","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"lsdIn","type":"address"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"swapLsdToEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"lsdIn","type":"address"},{"internalType":"address","name":"lsdOut","type":"address"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"swapLsdToLsd","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"lsdIn","type":"address"},{"internalType":"address","name":"lsdOut","type":"address"}],"name":"swapLsdToLsdCalcs","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleDepositFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unshethAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unshethFeeShareBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updateDarknetAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"contract ILSDVault","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wethAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawStuckEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a08060405234620003ad5762003c8a803803809162000020828562000699565b8339810190604081830312620003ad576200003b81620006bd565b602082015190916001600160401b038211620003ad57019082601f83011215620003ad578151926001600160401b038411620003b2578360051b926040519462000089602086018762000699565b8552602085019060208295820101928311620003ad57602001905b82821062000662575050506001600160a01b031680156200061d57600080546001600160a01b031916821781556040805191825260208201929092527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9190a1600160025560405160a081016001600160401b03811182821017620003b2576103e891608091604052600181526014602082015261271060408201526032606082015201526001600655601460075561271060085560326009556103e8600a55600160ff19600b541617600b5560405163dc6663c760e01b8152602081600481730ae38f7e10a43b5b2fb064b42a2f4514cba909ef5afa908115620005ca57600091620005d6575b506080819052600580546001600160a01b0319166001600160a01b03909216918217905560405163b669de8b60e01b815290602090829060049082905afa908115620005ca5760009162000588575b50600380546001600160a01b0319166001600160a01b03929092169190911790558151906001600160401b038211620003b257680100000000000000008211620003b257600454826004558083106200053f575b506004600052602060002060005b83811062000521576005805460ff60a01b1916600160a01b1790558460005b8151811015620003d05760008060018060a01b0360208460051b860101511660018060a01b036080511682604051602081019263095ea7b360e01b845260248201528119604482015260448152620002d4816200067d565b51925af13d15620003c8573d6001600160401b038111620003b2576040519062000309601f8201601f19166020018362000699565b81523d6000602083013e5b8162000370575b50156200032b576001016200027c565b60405162461bcd60e51b815260206004820152601e60248201527f5472616e7366657248656c7065723a20415050524f56455f4641494c454400006044820152606490fd5b805180159250821562000387575b5050836200031b565b8192509060209181010312620003ad57602001518015158103620003ad5783806200037e565b600080fd5b634e487b7160e01b600052604160045260246000fd5b606062000314565b60008060018060a01b0360805116604051602081019163095ea7b360e01b8352602482015282196044820152604481526200040b816200067d565b519082730ae38f7e10a43b5b2fb064b42a2f4514cba909ef5af13d1562000519573d6001600160401b038111620003b2576040519062000456601f8201601f19166020018362000699565b81523d6000602083013e5b81620004dc575b50156200032b576040516135b79081620006d382396080518181816102b301528181610747015281816107ab01528181610812015281816112a801528181611d9c01528181611ef50152818161209501528181612c7201528181612e8a01528181613000015281816130f801526131db0152f35b8051801592508215620004f3575b50508162000468565b8192509060209181010312620003ad57602001518015158103620003ad578180620004ea565b606062000461565b82516001600160a01b0316818301556020909201916001016200025d565b60046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b9081019083015b8181106200057b57506200024f565b600081556001016200056c565b90506020813d602011620005c1575b81620005a66020938362000699565b81010312620003ad57620005ba90620006bd565b38620001fb565b3d915062000597565b6040513d6000823e3d90fd5b90506020813d60201162000614575b81620005f46020938362000699565b81010312620003ad5760206200060c600492620006bd565b9150620001ac565b3d9150620005e5565b60405162461bcd60e51b815260206004820152601960248201527f4f776e657220616464726573732063616e6e6f742062652030000000000000006044820152606490fd5b602080916200067184620006bd565b815201910190620000a4565b608081019081106001600160401b03821117620003b257604052565b601f909101601f19168101906001600160401b03821190821017620003b257604052565b51906001600160a01b0382168203620003ad5756fe608080604052600436101561001d575b50361561001b57600080fd5b005b60003560e01c9081630260aa9314612260575080631627540c146121cb5780631cedfce414611fd9578063242b705514611e9157806336566f0614611ddc5780633db608d614611dc0578063430bf08a14611d6f5780634591f63d14611c955780634686069814611bbb57806349df728c14611a655780634d782bfa14611a175780634f0e0ef3146119e857806353a47bb7146119b45780636a15920d1461198357806379b5af0f1461194e57806379ba50971461184d5780637fa787ba146117e15780638da5cb5b146117ad5780639e9062c91461173b578063a05e273114611028578063a5f0657914610ff1578063af1b08cd14610fd3578063b1db8d5614610fa8578063b54e313514610e5a578063b669de8b14610e26578063d59bf9f314610e0a578063dc7e010e14610de4578063dd3c65d814610dc7578063e6867c9b14610d32578063e6b40bf214610d0f578063eb976fb81461040a578063ec6634c11461020b578063fa37a9ba146101d95763fbfa77cf146101a0573861000f565b346101d45760006003193601126101d457602073ffffffffffffffffffffffffffffffffffffffff60055416604051908152f35b600080fd5b346101d45760406003193601126101d45760406101ff6101f76122b0565b6004356132f1565b82519182526020820152f35b346101d4576020806003193601126101d45761022561228d565b9073ffffffffffffffffffffffffffffffffffffffff61024a8160005416331461237b565b600454680100000000000000008110156103db5780600161026e92016004556122d3565b93908282169481549060031b908487831b921b191617905560405190838201927f095ea7b30000000000000000000000000000000000000000000000000000000084527f00000000000000000000000000000000000000000000000000000000000000001660248301527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604483015260448252608082019282841067ffffffffffffffff8511176103db576000809493819460405251925af161033061245d565b816103ab575b5015610367577f8d634d738f054ceaea27bc3710750694195ecf9448d541449c72921b3069a2fe91604051908152a1005b6064906040519062461bcd60e51b82526004820152601e60248201527f5472616e7366657248656c7065723a20415050524f56455f4641494c454400006044820152fd5b805180159250839083156103c3575b50505083610336565b6103d393508201810191016124bb565b8382816103ba565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b346101d45760606003193601126101d4576104236122b0565b6104316002805414156133ed565b6002805561044760ff60055460a01c1615613438565b610455600435303384613483565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff821614610ccb5773ffffffffffffffffffffffffffffffffffffffff600554166040517f9015d371000000000000000000000000000000000000000000000000000000009081815273ffffffffffffffffffffffffffffffffffffffff84166004820152602081602481865afa9081156109ae57600091610cac575b5015610c685760405190815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26004820152602081602481855afa9081156109ae57600091610c39575b5015610bf55760043515610bb1576020604491604051928380927f8cc4c72800000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff87166004830152600060248301525afa9081156109ae57600091610b7f575b5060043511610b3b57670de0b6b3a76400006105d06105c88361274f565b6004356127b3565b046127106105e0600654836127b3565b049161271061061e6106186105f58486612e43565b61061261060d61060488612fbf565b600754906127ff565b613536565b90613559565b846127b3565b049280670de0b6b3a7640000810204670de0b6b3a76400001481151715610b0c5761065b90670de0b6b3a76400006106546126a9565b91026127c6565b9280670de0b6b3a7640000810204670de0b6b3a76400001481151715610b0c5761069090670de0b6b3a76400006106546126a9565b9061069b82856127ff565b92600854612710036127108111610b0c576106b961271091866127b3565b0493670de0b6b3a7640000820291808304670de0b6b3a76400001490151715610b0c576106f16106f6926106eb6126a9565b906127c6565b61280c565b926044358410610ac85761070a81856127ff565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016600482015260208160248173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25afa9081156109ae57600091610a96575b508111610a5257600080916107d06004357f0000000000000000000000000000000000000000000000000000000000000000876124d3565b60405160208101917f23b872dd00000000000000000000000000000000000000000000000000000000835273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016602483015230604483015260648201526064815261084f81612400565b51908273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af161087161245d565b81610a23575b50156109ba577fd0f18f85a54622f444adbe17fb3f2ec6422fb287235e8846b8647d808b11b0229160e09173ffffffffffffffffffffffffffffffffffffffff60405192600435845216602083015273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260408301528560608301528660808301528460a083015260c0820152a173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23b156101d457604051907f2e1a7d4d0000000000000000000000000000000000000000000000000000000082528260048301526000826024818373c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af19182156109ae5761099b9261099f575b5061097983336125c5565b6001600255604051938493846040919493926060820195825260208201520152565b0390f35b6109a8906123ec565b8461096e565b6040513d6000823e3d90fd5b608460405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f464160448201527f494c4544000000000000000000000000000000000000000000000000000000006064820152fd5b8051801592508215610a38575b505086610877565b610a4b92506020809183010191016124bb565b8680610a30565b606460405162461bcd60e51b815260206004820152601a60248201527f4e6f7420656e6f756768206c73644f757420696e207661756c740000000000006044820152fd5b90506020813d602011610ac0575b81610ab16020938361241c565b810103126101d4575187610798565b3d9150610aa4565b606460405162461bcd60e51b815260206004820152601660248201527f536c697070616765206c696d69742072656163686564000000000000000000006044820152fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b606460405162461bcd60e51b815260206004820152601660248201527f547261646520776f756c642065786365656420636170000000000000000000006044820152fd5b90506020813d602011610ba9575b81610b9a6020938361241c565b810103126101d45751826105aa565b3d9150610b8d565b606460405162461bcd60e51b815260206004820152601160248201527f43616e6e6f7420737761702030206c73640000000000000000000000000000006044820152fd5b606460405162461bcd60e51b815260206004820152601560248201527f6c73644f7574206973206e6f7420656e61626c656400000000000000000000006044820152fd5b610c5b915060203d602011610c61575b610c53818361241c565b8101906124bb565b83610539565b503d610c49565b606460405162461bcd60e51b815260206004820152601160248201527f6c7364496e206e6f7420656e61626c65640000000000000000000000000000006044820152fd5b610cc5915060203d602011610c6157610c53818361241c565b846104fb565b606460405162461bcd60e51b815260206004820152601460248201527f43616e6e6f7420737761702073616d65206c73640000000000000000000000006044820152fd5b346101d45760006003193601126101d457602060ff600b54166040519015158152f35b346101d45760006003193601126101d457610d6673ffffffffffffffffffffffffffffffffffffffff60005416331461237b565b7fc59c79e222b3bd8cc8427068b4efbe590455d77916ccdedb358d90992420fe2b60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00600b5460ff80821615169182911617600b556040519015158152a1005b346101d45760006003193601126101d45760206040516113888152f35b346101d45760006003193601126101d457602060ff60055460a01c166040519015158152f35b346101d45760006003193601126101d4576020604051600a8152f35b346101d45760006003193601126101d457602073ffffffffffffffffffffffffffffffffffffffff60035416604051908152f35b346101d45760206003193601126101d457600435610e9173ffffffffffffffffffffffffffffffffffffffff60005416331461237b565b6127108111610f3e576113888110610ed4576020817ff815031875f6e5c3961a6bd2d02c82fa186df23449f3f30e95a4e50b423cd02392600855604051908152a1005b608460405162461bcd60e51b815260206004820152602a60248201527f756e736845544820666565207368617265206d7573742062652067726561746560448201527f72207468616e206d696e000000000000000000000000000000000000000000006064820152fd5b608460405162461bcd60e51b815260206004820152602d60248201527f756e7368455448206665652073686172652063616e6e6f74206265206772656160448201527f746572207468616e2031303025000000000000000000000000000000000000006064820152fd5b346101d45760206003193601126101d4576020610fcb610fc661228d565b61274f565b604051908152f35b346101d45760006003193601126101d4576020600854604051908152f35b346101d45761099b61100b61100536612339565b91612b79565b604080519384526020840192909252908201529081906060820190565b60406003193601126101d45761103c61228d565b61104a6002805414156133ed565b6002805561106060ff60055460a01c1615613438565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290813b156101d4576040517fd0e30db000000000000000000000000000000000000000000000000000000000815260008160048134875af180156109ae5761172c575b5073ffffffffffffffffffffffffffffffffffffffff9081811690818414610ccb578260055416604051947f9015d371000000000000000000000000000000000000000000000000000000009182875281600488015260209260249784818a81865afa9081156109ae5760009161170f575b50156116cc5760405190815285600482015283818981855afa9081156109ae576000916116af575b501561166c5734156116295782604491604051928380927f8cc4c72800000000000000000000000000000000000000000000000000000000825286600483015260008c8301525afa9081156109ae576000916115fc575b5034116115b957670de0b6b3a764000093846111cc6111c66126a9565b346127b3565b049161271097886111df600654866127b3565b04988061120e6112086111f188612c31565b6111fb8b8a6130b1565b908789146115a857613559565b876127b3565b0499888102908082048a149015171561154c5761122e906106eb8961274f565b99888102908082048a149015171561154c5761124d906106eb8961274f565b97611258898c6127ff565b91600854810381811161157a5761126f90846127b3565b049581810291818304149015171561154c57906106f1611292926106eb8a61274f565b9781358910611509576112a5858a6127ff565b917f000000000000000000000000000000000000000000000000000000000000000091604051907f70a082310000000000000000000000000000000000000000000000000000000082528316600482015287818381895afa9081156109ae576000916114dc575b50831161149957600080604051898101907fa9059cbb0000000000000000000000000000000000000000000000000000000082526113a08161137434898984016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261241c565b519082885af16113ae61245d565b81611469575b5015611426575094889461099b9897947fd0f18f85a54622f444adbe17fb3f2ec6422fb287235e8846b8647d808b11b022946113f860e0956109799a30908a613483565b6040519334855284015260408301528560608301528a60808301528760a083015260c0820152a133906124d3565b86601f6064926040519262461bcd60e51b845260048401528201527f5472616e7366657248656c7065723a205452414e534645525f4641494c4544006044820152fd5b80518015925089908315611481575b5050508c6113b4565b61149193508201810191016124bb565b8c8881611478565b86601a6064926040519262461bcd60e51b845260048401528201527f4e6f7420656e6f756768206c73644f757420696e207661756c740000000000006044820152fd5b90508781813d8311611502575b6114f3818361241c565b810103126101d457518c61130c565b503d6114e9565b6064866016846040519262461bcd60e51b845260048401528201527f536c697070616765206c696d69742072656163686564000000000000000000006044820152fd5b827f4e487b710000000000000000000000000000000000000000000000000000000060005260116004526000fd5b847f4e487b710000000000000000000000000000000000000000000000000000000060005260116004526000fd5b9061060d61061291600754906127ff565b6064826016886040519262461bcd60e51b845260048401528201527f547261646520776f756c642065786365656420636170000000000000000000006044820152fd5b90508281813d8311611622575b611613818361241c565b810103126101d45751876111a9565b503d611609565b6064836011896040519262461bcd60e51b845260048401528201527f43616e6e6f7420737761702030206c73640000000000000000000000000000006044820152fd5b6064836015896040519262461bcd60e51b845260048401528201527f6c73644f7574206973206e6f7420656e61626c656400000000000000000000006044820152fd5b6116c69150843d8611610c6157610c53818361241c565b88611152565b60648460118a6040519262461bcd60e51b845260048401528201527f6c7364496e206e6f7420656e61626c65640000000000000000000000000000006044820152fd5b6117269150853d8711610c6157610c53818361241c565b8961112a565b611735906123ec565b826110b8565b346101d45760406003193601126101d4577fa29972a74506506ec186a75daf22560bd536f3f289cda31001d57d713611bcb7604060043560243561179873ffffffffffffffffffffffffffffffffffffffff60005416331461237b565b8160095580600a5582519182526020820152a1005b346101d45760006003193601126101d457602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b346101d45760006003193601126101d4577f7909752b76037727fecfc6c1abb7264306fd284ff7be21e2aa09bf2fdc00579d602073ffffffffffffffffffffffffffffffffffffffff6000541661183981331461237b565b6118444780926125c5565b604051908152a1005b346101d45760006003193601126101d45760015473ffffffffffffffffffffffffffffffffffffffff908181168033036118e4577fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c60406000549481519086168152836020820152a17fffffffffffffffffffffffff00000000000000000000000000000000000000009283161760005516600155005b608460405162461bcd60e51b815260206004820152603560248201527f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560448201527f2063616e20616363657074206f776e65727368697000000000000000000000006064820152fd5b346101d45760606003193601126101d4576119676122b0565b6044359081151582036101d457602091610fcb91600435613196565b346101d457608061199c61199636612339565b91612819565b91604051938452602084015260408301526060820152f35b346101d45760006003193601126101d457602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b346101d45760006003193601126101d457602060405173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28152f35b346101d45760206003193601126101d4576004356004548110156101d45773ffffffffffffffffffffffffffffffffffffffff611a556020926122d3565b9190546040519260031b1c168152f35b346101d4576020806003193601126101d4576024611a8161228d565b8273ffffffffffffffffffffffffffffffffffffffff611aa68160005416331461237b565b604051938480927f70a0823100000000000000000000000000000000000000000000000000000000825230600483015285165afa9182156109ae57600092611b8c575b508115611b48577f6352c5382c4a4578e712449ca65e83cdb392d045dfcf1cad9615189db2da244b9250611b1e8233836124d3565b6040805173ffffffffffffffffffffffffffffffffffffffff9290921682526020820192909252a1005b6064836040519062461bcd60e51b82526004820152601560248201527f4e6f20746f6b656e7320746f20776974686472617700000000000000000000006044820152fd5b9091508281813d8311611bb4575b611ba4818361241c565b810103126101d457519083611ae9565b503d611b9a565b346101d45760206003193601126101d457600435611bf273ffffffffffffffffffffffffffffffffffffffff60005416331461237b565b600a8111611c2b576020817f803bee7e92bbc6ae7a1551f9f4ed3e31a8ea8df32e93332f41b0028f1091f9c392600655604051908152a1005b608460405162461bcd60e51b815260206004820152602760248201527f42617365206665652063616e6e6f742062652067726561746572207468616e2060448201527f6d617820666565000000000000000000000000000000000000000000000000006064820152fd5b346101d45760206003193601126101d457600435611ccc73ffffffffffffffffffffffffffffffffffffffff60005416331461237b565b60c88111611d05576020817f61fa7a6352beacfd124369737ef9ab03ebafcd9734de9b23a085e21c6dffc64092600755604051908152a1005b608460405162461bcd60e51b815260206004820152603560248201527f496e7374616e7420726564656d7074696f6e206665652063616e6e6f7420626560448201527f2067726561746572207468616e206d61782066656500000000000000000000006064820152fd5b346101d45760006003193601126101d457602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101d45760006003193601126101d457602060405160c88152f35b346101d45760006003193601126101d457611e1073ffffffffffffffffffffffffffffffffffffffff60005416331461237b565b7f9077d36bc00859b5c3f320310707208543dd35092cb0a0fe117d0c6a558b148b60206005547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff000000000000000000000000000000000000000060ff8360a01c161560a01b169116178060055560ff6040519160a01c1615158152a1005b346101d45760006003193601126101d45773ffffffffffffffffffffffffffffffffffffffff611ec68160005416331461237b565b6040517fb669de8b000000000000000000000000000000000000000000000000000000008152602081600481857f0000000000000000000000000000000000000000000000000000000000000000165afa9081156109ae57600091611f7f575b7fd1275df776eae12470ae258c3be55bbaf0200342c7849d0365b41a5dd50131c46020848416807fffffffffffffffffffffffff00000000000000000000000000000000000000006003541617600355604051908152a1005b90506020813d8211611fd1575b81611f996020938361241c565b810103126101d4575181811681036101d4577fd1275df776eae12470ae258c3be55bbaf0200342c7849d0365b41a5dd50131c4611f26565b3d9150611f8c565b346101d45760806003193601126101d457600435611ff56122b0565b9073ffffffffffffffffffffffffffffffffffffffff604435818116928382036101d4576120276002805414156133ed565b6002805561203d60ff60055460a01c1615613438565b61204981303388613483565b612054828683612819565b9296919790956064358810610ac85761206d84896127ff565b6040517f70a082310000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000008381166004830152602094929185816024818a5afa9081156109ae5760009161219e575b50821161215a57947fd0f18f85a54622f444adbe17fb3f2ec6422fb287235e8846b8647d808b11b0229460e0948461212b8e9a958a61099b9f9e9b8e6109799f9a91612123926124d3565b30908c613483565b604051958652169084015260408301528560608301528a60808301528760a083015260c0820152a133906124d3565b6064856040519062461bcd60e51b82526004820152601a60248201527f4e6f7420656e6f756768206c73644f757420696e207661756c740000000000006044820152fd5b90508581813d83116121c4575b6121b5818361241c565b810103126101d457518d6120d8565b503d6121ab565b346101d45760206003193601126101d4577f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce22602061220761228d565b73ffffffffffffffffffffffffffffffffffffffff9061222c8260005416331461237b565b16807fffffffffffffffffffffffff00000000000000000000000000000000000000006001541617600155604051908152a1005b346101d45760006003193601126101d45780730ae38f7e10a43b5b2fb064b42a2f4514cba909ef60209252f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036101d457565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036101d457565b60045481101561230a5760046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0190600090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60031960609101126101d4576004359073ffffffffffffffffffffffffffffffffffffffff9060243582811681036101d4579160443590811681036101d45790565b1561238257565b608460405162461bcd60e51b815260206004820152602f60248201527f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726660448201527f6f726d207468697320616374696f6e00000000000000000000000000000000006064820152fd5b67ffffffffffffffff81116103db57604052565b60a0810190811067ffffffffffffffff8211176103db57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176103db57604052565b3d156124b6573d9067ffffffffffffffff82116103db57604051916124aa60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116018461241c565b82523d6000602084013e565b606090565b908160209103126101d4575180151581036101d45790565b6040517fa9059cbb000000000000000000000000000000000000000000000000000000006020820190815273ffffffffffffffffffffffffffffffffffffffff9093166024820152604481019390935260009283929083906125388160648101611374565b51925af161254461245d565b81612596575b501561255257565b606460405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c4544006044820152fd5b80518015925082156125ab575b50503861254a565b6125be92506020809183010191016124bb565b38806125a3565b81471061266557600080809373ffffffffffffffffffffffffffffffffffffffff8294165af16125f361245d565b50156125fb57565b608460405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152fd5b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152fd5b6024602073ffffffffffffffffffffffffffffffffffffffff60035416604051928380927fd45d15be00000000000000000000000000000000000000000000000000000000825273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260048301525afa9081156109ae5760009161271e575090565b906020823d8211612747575b816127376020938361241c565b8101031261274457505190565b80fd5b3d915061272a565b602073ffffffffffffffffffffffffffffffffffffffff602481600354169360405194859384927fd45d15be0000000000000000000000000000000000000000000000000000000084521660048301525afa9081156109ae5760009161271e575090565b81810292918115918404141715610b0c57565b81156127d0570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b91908201809211610b0c57565b91908203918211610b0c57565b73ffffffffffffffffffffffffffffffffffffffff828116949184821691868314610ccb57600554169160408051977f9015d3710000000000000000000000000000000000000000000000000000000094858a5260049582878c01526020948b8660249d8e81875afa908115612b6e57600091612b51575b5015612b105784519182528782015284818c81855afa908115612b0557600091612ae8575b5015612aa7578415612a66578960446000938693865195869485937f8cc4c7280000000000000000000000000000000000000000000000000000000085528c8501528301525afa908115612a5b57600091612a2e575b5083116129ed5750506129408561293892670de0b6b3a76400009384916129328961274f565b906127b3565b049586612b79565b5095909661294e87896127ff565b936008546127109081038181116129c05761296990876127b3565b049684810294818604149015171561299457505061298e92916106eb6106f19261274f565b93929190565b6011907f4e487b7100000000000000000000000000000000000000000000000000000000600052526000fd5b836011847f4e487b7100000000000000000000000000000000000000000000000000000000600052526000fd5b6016886064938693519362461bcd60e51b85528401528201527f547261646520776f756c642065786365656420636170000000000000000000006044820152fd5b908382813d8311612a54575b612a44818361241c565b810103126127445750513861290c565b503d612a3a565b82513d6000823e3d90fd5b60648660118c8787519362461bcd60e51b85528401528201527f43616e6e6f7420737761702030206c73640000000000000000000000000000006044820152fd5b60648660158c8787519362461bcd60e51b85528401528201527f6c73644f7574206973206e6f7420656e61626c656400000000000000000000006044820152fd5b612aff9150853d8711610c6157610c53818361241c565b386128b6565b84513d6000823e3d90fd5b60648860118e8989519362461bcd60e51b85528401528201527f6c7364496e206e6f7420656e61626c65640000000000000000000000000000006044820152fd5b612b689150873d8911610c6157610c53818361241c565b38612891565b86513d6000823e3d90fd5b91929092612710612be6612bdf612b9e83612b96600654896127b3565b049787612e43565b612ba885886130b1565b9073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff8716146115a857613559565b80956127b3565b0493670de0b6b3a76400009081810290808204831490151715610b0c57612c10906106eb8461274f565b94818102918183041490151715610b0c576106eb612c2d9261274f565b9190565b90604051917f70a0823100000000000000000000000000000000000000000000000000000000835273ffffffffffffffffffffffffffffffffffffffff90817f0000000000000000000000000000000000000000000000000000000000000000166004850152602073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28186602481845afa9586156109ae57600096612e14575b5081612ceb612ce39697670de0b6b3a76400009788916129326126a9565b0494856127ff565b9460055416916044604051809481937f9c4d36af0000000000000000000000000000000000000000000000000000000083526004830152600060248301525afa9081156109ae578592600092612de1575b505091612d6391612d53612d5d95946129326126a9565b0493848092613566565b92613566565b818110612dd8578215612dcf57612d79916127ff565b60011c9180830292808404821490151715610b0c57612d9e61060d92612dcc946127c6565b90612dc581612dbb81612db186806127b3565b04946009546127b3565b0492600a546127b3565b04906127ff565b90565b5050505060c890565b50505050600090565b90809350813d8311612e0d575b612df8818361241c565b81010312612744575051839081612d53612d3c565b503d612dee565b958287813d8311612e3c575b612e2a818361241c565b81010312612744575094519481612cc5565b503d612e20565b91909173ffffffffffffffffffffffffffffffffffffffff9081841693604051947f70a08231000000000000000000000000000000000000000000000000000000008652837f00000000000000000000000000000000000000000000000000000000000000001660048701526020918287602481855afa9687156109ae57600097612f90575b5082612ef0612ee89798670de0b6b3a76400009889916129328661274f565b0495866127ff565b9560055416926044604051809581937f9c4d36af0000000000000000000000000000000000000000000000000000000083526004830152600060248301525afa9182156109ae578693600093612f59575b505091612d53612d5d959492612932612d639561274f565b908093929450813d8311612f89575b612f72818361241c565b810103126127445750518491612d53612d63612f41565b503d612f68565b968388813d8311612fb8575b612fa6818361241c565b81010312612744575095519582612ec9565b503d612f9c565b90604051917f70a0823100000000000000000000000000000000000000000000000000000000835273ffffffffffffffffffffffffffffffffffffffff90817f0000000000000000000000000000000000000000000000000000000000000000166004850152602073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28186602481845afa9586156109ae57600096613082575b5081612ceb61307c6130749798670de0b6b3a76400009889916129326126a9565b049586613547565b8561280c565b958287813d83116130aa575b613098818361241c565b81010312612744575094519481613053565b503d61308e565b91909173ffffffffffffffffffffffffffffffffffffffff9081841693604051947f70a08231000000000000000000000000000000000000000000000000000000008652837f00000000000000000000000000000000000000000000000000000000000000001660048701526020918287602481855afa9687156109ae57600097613167575b5082612ef06131616131599899670de0b6b3a7640000998a916129328761274f565b049687613547565b8661280c565b968388813d831161318f575b61317d818361241c565b81010312612744575095519582613137565b503d613173565b929173ffffffffffffffffffffffffffffffffffffffff91828116604051917f70a08231000000000000000000000000000000000000000000000000000000008352847f00000000000000000000000000000000000000000000000000000000000000001660048401526020928381602481865afa9081156109ae576000916132c2575b5061323796978491670de0b6b3a76400009889916129328661274f565b0495156132af57612ef090866127ff565b60055416926044604051809581937f9c4d36af0000000000000000000000000000000000000000000000000000000083526004830152600060248301525afa9182156109ae578693600093612f5957505091612d53612d5d959492612932612d639561274f565b6131616132bc9187613547565b95613248565b908482813d83116132ea575b6132d8818361241c565b8101031261274457505161323761321a565b503d6132ce565b919060ff600b5416156133e45761331f81670de0b6b3a764000061331961120860049561274f565b04612e43565b602073ffffffffffffffffffffffffffffffffffffffff60055416604051938480927f965fa21e0000000000000000000000000000000000000000000000000000000082525afa9182156109ae576000926133af575b5061338d936129326133939261271096879582613547565b9061280c565b04916008548103818111610b0c576133ab90846127b3565b0490565b90916020823d82116133dc575b816133c96020938361241c565b810103126127445750519061338d613375565b3d91506133bc565b50600091508190565b156133f457565b606460405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b1561343f57565b606460405162461bcd60e51b815260206004820152600d60248201527f414d4d20697320706175736564000000000000000000000000000000000000006044820152fd5b9091600080949381946040519160208301947f23b872dd00000000000000000000000000000000000000000000000000000000865273ffffffffffffffffffffffffffffffffffffffff80921660248501521660448301526064820152606481526134ed81612400565b51925af16134f961245d565b81613507575b50156109ba57565b805180159250821561351c575b5050386134ff565b61352f92506020809183010191016124bb565b3880613514565b8060c810600014612dcc575060c890565b9080821015613554575090565b905090565b9080821115613554575090565b818111156135785790612dcc9161280c565b612dcc9161280c56fea26469706673582212202cbbb024d56f77b1217ee55af805b0c1f607d75af541b7c86f9cd5bb3c2ed3b664736f6c6343000812003300000000000000000000000055638a11757cea2dd6130aa42ddc09149bdcaf84000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000050000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca0000000000000000000000000ac3e018457b222d93114458476f3e3416abbe38f000000000000000000000000ae78736cd615f374d3085123a210448e74fc6393000000000000000000000000be9895146f7af43049ca1c1ae358b0541ea49704000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Deployed Bytecode
0x608080604052600436101561001d575b50361561001b57600080fd5b005b60003560e01c9081630260aa9314612260575080631627540c146121cb5780631cedfce414611fd9578063242b705514611e9157806336566f0614611ddc5780633db608d614611dc0578063430bf08a14611d6f5780634591f63d14611c955780634686069814611bbb57806349df728c14611a655780634d782bfa14611a175780634f0e0ef3146119e857806353a47bb7146119b45780636a15920d1461198357806379b5af0f1461194e57806379ba50971461184d5780637fa787ba146117e15780638da5cb5b146117ad5780639e9062c91461173b578063a05e273114611028578063a5f0657914610ff1578063af1b08cd14610fd3578063b1db8d5614610fa8578063b54e313514610e5a578063b669de8b14610e26578063d59bf9f314610e0a578063dc7e010e14610de4578063dd3c65d814610dc7578063e6867c9b14610d32578063e6b40bf214610d0f578063eb976fb81461040a578063ec6634c11461020b578063fa37a9ba146101d95763fbfa77cf146101a0573861000f565b346101d45760006003193601126101d457602073ffffffffffffffffffffffffffffffffffffffff60055416604051908152f35b600080fd5b346101d45760406003193601126101d45760406101ff6101f76122b0565b6004356132f1565b82519182526020820152f35b346101d4576020806003193601126101d45761022561228d565b9073ffffffffffffffffffffffffffffffffffffffff61024a8160005416331461237b565b600454680100000000000000008110156103db5780600161026e92016004556122d3565b93908282169481549060031b908487831b921b191617905560405190838201927f095ea7b30000000000000000000000000000000000000000000000000000000084527f00000000000000000000000051a80238b5738725128d3a3e06ab41c1d4c05c741660248301527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604483015260448252608082019282841067ffffffffffffffff8511176103db576000809493819460405251925af161033061245d565b816103ab575b5015610367577f8d634d738f054ceaea27bc3710750694195ecf9448d541449c72921b3069a2fe91604051908152a1005b6064906040519062461bcd60e51b82526004820152601e60248201527f5472616e7366657248656c7065723a20415050524f56455f4641494c454400006044820152fd5b805180159250839083156103c3575b50505083610336565b6103d393508201810191016124bb565b8382816103ba565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b346101d45760606003193601126101d4576104236122b0565b6104316002805414156133ed565b6002805561044760ff60055460a01c1615613438565b610455600435303384613483565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff821614610ccb5773ffffffffffffffffffffffffffffffffffffffff600554166040517f9015d371000000000000000000000000000000000000000000000000000000009081815273ffffffffffffffffffffffffffffffffffffffff84166004820152602081602481865afa9081156109ae57600091610cac575b5015610c685760405190815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26004820152602081602481855afa9081156109ae57600091610c39575b5015610bf55760043515610bb1576020604491604051928380927f8cc4c72800000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff87166004830152600060248301525afa9081156109ae57600091610b7f575b5060043511610b3b57670de0b6b3a76400006105d06105c88361274f565b6004356127b3565b046127106105e0600654836127b3565b049161271061061e6106186105f58486612e43565b61061261060d61060488612fbf565b600754906127ff565b613536565b90613559565b846127b3565b049280670de0b6b3a7640000810204670de0b6b3a76400001481151715610b0c5761065b90670de0b6b3a76400006106546126a9565b91026127c6565b9280670de0b6b3a7640000810204670de0b6b3a76400001481151715610b0c5761069090670de0b6b3a76400006106546126a9565b9061069b82856127ff565b92600854612710036127108111610b0c576106b961271091866127b3565b0493670de0b6b3a7640000820291808304670de0b6b3a76400001490151715610b0c576106f16106f6926106eb6126a9565b906127c6565b61280c565b926044358410610ac85761070a81856127ff565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000051a80238b5738725128d3a3e06ab41c1d4c05c7416600482015260208160248173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25afa9081156109ae57600091610a96575b508111610a5257600080916107d06004357f00000000000000000000000051a80238b5738725128d3a3e06ab41c1d4c05c74876124d3565b60405160208101917f23b872dd00000000000000000000000000000000000000000000000000000000835273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000051a80238b5738725128d3a3e06ab41c1d4c05c7416602483015230604483015260648201526064815261084f81612400565b51908273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af161087161245d565b81610a23575b50156109ba577fd0f18f85a54622f444adbe17fb3f2ec6422fb287235e8846b8647d808b11b0229160e09173ffffffffffffffffffffffffffffffffffffffff60405192600435845216602083015273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260408301528560608301528660808301528460a083015260c0820152a173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23b156101d457604051907f2e1a7d4d0000000000000000000000000000000000000000000000000000000082528260048301526000826024818373c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af19182156109ae5761099b9261099f575b5061097983336125c5565b6001600255604051938493846040919493926060820195825260208201520152565b0390f35b6109a8906123ec565b8461096e565b6040513d6000823e3d90fd5b608460405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f464160448201527f494c4544000000000000000000000000000000000000000000000000000000006064820152fd5b8051801592508215610a38575b505086610877565b610a4b92506020809183010191016124bb565b8680610a30565b606460405162461bcd60e51b815260206004820152601a60248201527f4e6f7420656e6f756768206c73644f757420696e207661756c740000000000006044820152fd5b90506020813d602011610ac0575b81610ab16020938361241c565b810103126101d4575187610798565b3d9150610aa4565b606460405162461bcd60e51b815260206004820152601660248201527f536c697070616765206c696d69742072656163686564000000000000000000006044820152fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b606460405162461bcd60e51b815260206004820152601660248201527f547261646520776f756c642065786365656420636170000000000000000000006044820152fd5b90506020813d602011610ba9575b81610b9a6020938361241c565b810103126101d45751826105aa565b3d9150610b8d565b606460405162461bcd60e51b815260206004820152601160248201527f43616e6e6f7420737761702030206c73640000000000000000000000000000006044820152fd5b606460405162461bcd60e51b815260206004820152601560248201527f6c73644f7574206973206e6f7420656e61626c656400000000000000000000006044820152fd5b610c5b915060203d602011610c61575b610c53818361241c565b8101906124bb565b83610539565b503d610c49565b606460405162461bcd60e51b815260206004820152601160248201527f6c7364496e206e6f7420656e61626c65640000000000000000000000000000006044820152fd5b610cc5915060203d602011610c6157610c53818361241c565b846104fb565b606460405162461bcd60e51b815260206004820152601460248201527f43616e6e6f7420737761702073616d65206c73640000000000000000000000006044820152fd5b346101d45760006003193601126101d457602060ff600b54166040519015158152f35b346101d45760006003193601126101d457610d6673ffffffffffffffffffffffffffffffffffffffff60005416331461237b565b7fc59c79e222b3bd8cc8427068b4efbe590455d77916ccdedb358d90992420fe2b60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00600b5460ff80821615169182911617600b556040519015158152a1005b346101d45760006003193601126101d45760206040516113888152f35b346101d45760006003193601126101d457602060ff60055460a01c166040519015158152f35b346101d45760006003193601126101d4576020604051600a8152f35b346101d45760006003193601126101d457602073ffffffffffffffffffffffffffffffffffffffff60035416604051908152f35b346101d45760206003193601126101d457600435610e9173ffffffffffffffffffffffffffffffffffffffff60005416331461237b565b6127108111610f3e576113888110610ed4576020817ff815031875f6e5c3961a6bd2d02c82fa186df23449f3f30e95a4e50b423cd02392600855604051908152a1005b608460405162461bcd60e51b815260206004820152602a60248201527f756e736845544820666565207368617265206d7573742062652067726561746560448201527f72207468616e206d696e000000000000000000000000000000000000000000006064820152fd5b608460405162461bcd60e51b815260206004820152602d60248201527f756e7368455448206665652073686172652063616e6e6f74206265206772656160448201527f746572207468616e2031303025000000000000000000000000000000000000006064820152fd5b346101d45760206003193601126101d4576020610fcb610fc661228d565b61274f565b604051908152f35b346101d45760006003193601126101d4576020600854604051908152f35b346101d45761099b61100b61100536612339565b91612b79565b604080519384526020840192909252908201529081906060820190565b60406003193601126101d45761103c61228d565b61104a6002805414156133ed565b6002805561106060ff60055460a01c1615613438565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290813b156101d4576040517fd0e30db000000000000000000000000000000000000000000000000000000000815260008160048134875af180156109ae5761172c575b5073ffffffffffffffffffffffffffffffffffffffff9081811690818414610ccb578260055416604051947f9015d371000000000000000000000000000000000000000000000000000000009182875281600488015260209260249784818a81865afa9081156109ae5760009161170f575b50156116cc5760405190815285600482015283818981855afa9081156109ae576000916116af575b501561166c5734156116295782604491604051928380927f8cc4c72800000000000000000000000000000000000000000000000000000000825286600483015260008c8301525afa9081156109ae576000916115fc575b5034116115b957670de0b6b3a764000093846111cc6111c66126a9565b346127b3565b049161271097886111df600654866127b3565b04988061120e6112086111f188612c31565b6111fb8b8a6130b1565b908789146115a857613559565b876127b3565b0499888102908082048a149015171561154c5761122e906106eb8961274f565b99888102908082048a149015171561154c5761124d906106eb8961274f565b97611258898c6127ff565b91600854810381811161157a5761126f90846127b3565b049581810291818304149015171561154c57906106f1611292926106eb8a61274f565b9781358910611509576112a5858a6127ff565b917f00000000000000000000000051a80238b5738725128d3a3e06ab41c1d4c05c7491604051907f70a082310000000000000000000000000000000000000000000000000000000082528316600482015287818381895afa9081156109ae576000916114dc575b50831161149957600080604051898101907fa9059cbb0000000000000000000000000000000000000000000000000000000082526113a08161137434898984016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261241c565b519082885af16113ae61245d565b81611469575b5015611426575094889461099b9897947fd0f18f85a54622f444adbe17fb3f2ec6422fb287235e8846b8647d808b11b022946113f860e0956109799a30908a613483565b6040519334855284015260408301528560608301528a60808301528760a083015260c0820152a133906124d3565b86601f6064926040519262461bcd60e51b845260048401528201527f5472616e7366657248656c7065723a205452414e534645525f4641494c4544006044820152fd5b80518015925089908315611481575b5050508c6113b4565b61149193508201810191016124bb565b8c8881611478565b86601a6064926040519262461bcd60e51b845260048401528201527f4e6f7420656e6f756768206c73644f757420696e207661756c740000000000006044820152fd5b90508781813d8311611502575b6114f3818361241c565b810103126101d457518c61130c565b503d6114e9565b6064866016846040519262461bcd60e51b845260048401528201527f536c697070616765206c696d69742072656163686564000000000000000000006044820152fd5b827f4e487b710000000000000000000000000000000000000000000000000000000060005260116004526000fd5b847f4e487b710000000000000000000000000000000000000000000000000000000060005260116004526000fd5b9061060d61061291600754906127ff565b6064826016886040519262461bcd60e51b845260048401528201527f547261646520776f756c642065786365656420636170000000000000000000006044820152fd5b90508281813d8311611622575b611613818361241c565b810103126101d45751876111a9565b503d611609565b6064836011896040519262461bcd60e51b845260048401528201527f43616e6e6f7420737761702030206c73640000000000000000000000000000006044820152fd5b6064836015896040519262461bcd60e51b845260048401528201527f6c73644f7574206973206e6f7420656e61626c656400000000000000000000006044820152fd5b6116c69150843d8611610c6157610c53818361241c565b88611152565b60648460118a6040519262461bcd60e51b845260048401528201527f6c7364496e206e6f7420656e61626c65640000000000000000000000000000006044820152fd5b6117269150853d8711610c6157610c53818361241c565b8961112a565b611735906123ec565b826110b8565b346101d45760406003193601126101d4577fa29972a74506506ec186a75daf22560bd536f3f289cda31001d57d713611bcb7604060043560243561179873ffffffffffffffffffffffffffffffffffffffff60005416331461237b565b8160095580600a5582519182526020820152a1005b346101d45760006003193601126101d457602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b346101d45760006003193601126101d4577f7909752b76037727fecfc6c1abb7264306fd284ff7be21e2aa09bf2fdc00579d602073ffffffffffffffffffffffffffffffffffffffff6000541661183981331461237b565b6118444780926125c5565b604051908152a1005b346101d45760006003193601126101d45760015473ffffffffffffffffffffffffffffffffffffffff908181168033036118e4577fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c60406000549481519086168152836020820152a17fffffffffffffffffffffffff00000000000000000000000000000000000000009283161760005516600155005b608460405162461bcd60e51b815260206004820152603560248201527f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560448201527f2063616e20616363657074206f776e65727368697000000000000000000000006064820152fd5b346101d45760606003193601126101d4576119676122b0565b6044359081151582036101d457602091610fcb91600435613196565b346101d457608061199c61199636612339565b91612819565b91604051938452602084015260408301526060820152f35b346101d45760006003193601126101d457602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b346101d45760006003193601126101d457602060405173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28152f35b346101d45760206003193601126101d4576004356004548110156101d45773ffffffffffffffffffffffffffffffffffffffff611a556020926122d3565b9190546040519260031b1c168152f35b346101d4576020806003193601126101d4576024611a8161228d565b8273ffffffffffffffffffffffffffffffffffffffff611aa68160005416331461237b565b604051938480927f70a0823100000000000000000000000000000000000000000000000000000000825230600483015285165afa9182156109ae57600092611b8c575b508115611b48577f6352c5382c4a4578e712449ca65e83cdb392d045dfcf1cad9615189db2da244b9250611b1e8233836124d3565b6040805173ffffffffffffffffffffffffffffffffffffffff9290921682526020820192909252a1005b6064836040519062461bcd60e51b82526004820152601560248201527f4e6f20746f6b656e7320746f20776974686472617700000000000000000000006044820152fd5b9091508281813d8311611bb4575b611ba4818361241c565b810103126101d457519083611ae9565b503d611b9a565b346101d45760206003193601126101d457600435611bf273ffffffffffffffffffffffffffffffffffffffff60005416331461237b565b600a8111611c2b576020817f803bee7e92bbc6ae7a1551f9f4ed3e31a8ea8df32e93332f41b0028f1091f9c392600655604051908152a1005b608460405162461bcd60e51b815260206004820152602760248201527f42617365206665652063616e6e6f742062652067726561746572207468616e2060448201527f6d617820666565000000000000000000000000000000000000000000000000006064820152fd5b346101d45760206003193601126101d457600435611ccc73ffffffffffffffffffffffffffffffffffffffff60005416331461237b565b60c88111611d05576020817f61fa7a6352beacfd124369737ef9ab03ebafcd9734de9b23a085e21c6dffc64092600755604051908152a1005b608460405162461bcd60e51b815260206004820152603560248201527f496e7374616e7420726564656d7074696f6e206665652063616e6e6f7420626560448201527f2067726561746572207468616e206d61782066656500000000000000000000006064820152fd5b346101d45760006003193601126101d457602060405173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000051a80238b5738725128d3a3e06ab41c1d4c05c74168152f35b346101d45760006003193601126101d457602060405160c88152f35b346101d45760006003193601126101d457611e1073ffffffffffffffffffffffffffffffffffffffff60005416331461237b565b7f9077d36bc00859b5c3f320310707208543dd35092cb0a0fe117d0c6a558b148b60206005547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff000000000000000000000000000000000000000060ff8360a01c161560a01b169116178060055560ff6040519160a01c1615158152a1005b346101d45760006003193601126101d45773ffffffffffffffffffffffffffffffffffffffff611ec68160005416331461237b565b6040517fb669de8b000000000000000000000000000000000000000000000000000000008152602081600481857f00000000000000000000000051a80238b5738725128d3a3e06ab41c1d4c05c74165afa9081156109ae57600091611f7f575b7fd1275df776eae12470ae258c3be55bbaf0200342c7849d0365b41a5dd50131c46020848416807fffffffffffffffffffffffff00000000000000000000000000000000000000006003541617600355604051908152a1005b90506020813d8211611fd1575b81611f996020938361241c565b810103126101d4575181811681036101d4577fd1275df776eae12470ae258c3be55bbaf0200342c7849d0365b41a5dd50131c4611f26565b3d9150611f8c565b346101d45760806003193601126101d457600435611ff56122b0565b9073ffffffffffffffffffffffffffffffffffffffff604435818116928382036101d4576120276002805414156133ed565b6002805561203d60ff60055460a01c1615613438565b61204981303388613483565b612054828683612819565b9296919790956064358810610ac85761206d84896127ff565b6040517f70a082310000000000000000000000000000000000000000000000000000000081527f00000000000000000000000051a80238b5738725128d3a3e06ab41c1d4c05c748381166004830152602094929185816024818a5afa9081156109ae5760009161219e575b50821161215a57947fd0f18f85a54622f444adbe17fb3f2ec6422fb287235e8846b8647d808b11b0229460e0948461212b8e9a958a61099b9f9e9b8e6109799f9a91612123926124d3565b30908c613483565b604051958652169084015260408301528560608301528a60808301528760a083015260c0820152a133906124d3565b6064856040519062461bcd60e51b82526004820152601a60248201527f4e6f7420656e6f756768206c73644f757420696e207661756c740000000000006044820152fd5b90508581813d83116121c4575b6121b5818361241c565b810103126101d457518d6120d8565b503d6121ab565b346101d45760206003193601126101d4577f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce22602061220761228d565b73ffffffffffffffffffffffffffffffffffffffff9061222c8260005416331461237b565b16807fffffffffffffffffffffffff00000000000000000000000000000000000000006001541617600155604051908152a1005b346101d45760006003193601126101d45780730ae38f7e10a43b5b2fb064b42a2f4514cba909ef60209252f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036101d457565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036101d457565b60045481101561230a5760046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0190600090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60031960609101126101d4576004359073ffffffffffffffffffffffffffffffffffffffff9060243582811681036101d4579160443590811681036101d45790565b1561238257565b608460405162461bcd60e51b815260206004820152602f60248201527f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726660448201527f6f726d207468697320616374696f6e00000000000000000000000000000000006064820152fd5b67ffffffffffffffff81116103db57604052565b60a0810190811067ffffffffffffffff8211176103db57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176103db57604052565b3d156124b6573d9067ffffffffffffffff82116103db57604051916124aa60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116018461241c565b82523d6000602084013e565b606090565b908160209103126101d4575180151581036101d45790565b6040517fa9059cbb000000000000000000000000000000000000000000000000000000006020820190815273ffffffffffffffffffffffffffffffffffffffff9093166024820152604481019390935260009283929083906125388160648101611374565b51925af161254461245d565b81612596575b501561255257565b606460405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c4544006044820152fd5b80518015925082156125ab575b50503861254a565b6125be92506020809183010191016124bb565b38806125a3565b81471061266557600080809373ffffffffffffffffffffffffffffffffffffffff8294165af16125f361245d565b50156125fb57565b608460405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152fd5b606460405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152fd5b6024602073ffffffffffffffffffffffffffffffffffffffff60035416604051928380927fd45d15be00000000000000000000000000000000000000000000000000000000825273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260048301525afa9081156109ae5760009161271e575090565b906020823d8211612747575b816127376020938361241c565b8101031261274457505190565b80fd5b3d915061272a565b602073ffffffffffffffffffffffffffffffffffffffff602481600354169360405194859384927fd45d15be0000000000000000000000000000000000000000000000000000000084521660048301525afa9081156109ae5760009161271e575090565b81810292918115918404141715610b0c57565b81156127d0570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b91908201809211610b0c57565b91908203918211610b0c57565b73ffffffffffffffffffffffffffffffffffffffff828116949184821691868314610ccb57600554169160408051977f9015d3710000000000000000000000000000000000000000000000000000000094858a5260049582878c01526020948b8660249d8e81875afa908115612b6e57600091612b51575b5015612b105784519182528782015284818c81855afa908115612b0557600091612ae8575b5015612aa7578415612a66578960446000938693865195869485937f8cc4c7280000000000000000000000000000000000000000000000000000000085528c8501528301525afa908115612a5b57600091612a2e575b5083116129ed5750506129408561293892670de0b6b3a76400009384916129328961274f565b906127b3565b049586612b79565b5095909661294e87896127ff565b936008546127109081038181116129c05761296990876127b3565b049684810294818604149015171561299457505061298e92916106eb6106f19261274f565b93929190565b6011907f4e487b7100000000000000000000000000000000000000000000000000000000600052526000fd5b836011847f4e487b7100000000000000000000000000000000000000000000000000000000600052526000fd5b6016886064938693519362461bcd60e51b85528401528201527f547261646520776f756c642065786365656420636170000000000000000000006044820152fd5b908382813d8311612a54575b612a44818361241c565b810103126127445750513861290c565b503d612a3a565b82513d6000823e3d90fd5b60648660118c8787519362461bcd60e51b85528401528201527f43616e6e6f7420737761702030206c73640000000000000000000000000000006044820152fd5b60648660158c8787519362461bcd60e51b85528401528201527f6c73644f7574206973206e6f7420656e61626c656400000000000000000000006044820152fd5b612aff9150853d8711610c6157610c53818361241c565b386128b6565b84513d6000823e3d90fd5b60648860118e8989519362461bcd60e51b85528401528201527f6c7364496e206e6f7420656e61626c65640000000000000000000000000000006044820152fd5b612b689150873d8911610c6157610c53818361241c565b38612891565b86513d6000823e3d90fd5b91929092612710612be6612bdf612b9e83612b96600654896127b3565b049787612e43565b612ba885886130b1565b9073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff8716146115a857613559565b80956127b3565b0493670de0b6b3a76400009081810290808204831490151715610b0c57612c10906106eb8461274f565b94818102918183041490151715610b0c576106eb612c2d9261274f565b9190565b90604051917f70a0823100000000000000000000000000000000000000000000000000000000835273ffffffffffffffffffffffffffffffffffffffff90817f00000000000000000000000051a80238b5738725128d3a3e06ab41c1d4c05c74166004850152602073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28186602481845afa9586156109ae57600096612e14575b5081612ceb612ce39697670de0b6b3a76400009788916129326126a9565b0494856127ff565b9460055416916044604051809481937f9c4d36af0000000000000000000000000000000000000000000000000000000083526004830152600060248301525afa9081156109ae578592600092612de1575b505091612d6391612d53612d5d95946129326126a9565b0493848092613566565b92613566565b818110612dd8578215612dcf57612d79916127ff565b60011c9180830292808404821490151715610b0c57612d9e61060d92612dcc946127c6565b90612dc581612dbb81612db186806127b3565b04946009546127b3565b0492600a546127b3565b04906127ff565b90565b5050505060c890565b50505050600090565b90809350813d8311612e0d575b612df8818361241c565b81010312612744575051839081612d53612d3c565b503d612dee565b958287813d8311612e3c575b612e2a818361241c565b81010312612744575094519481612cc5565b503d612e20565b91909173ffffffffffffffffffffffffffffffffffffffff9081841693604051947f70a08231000000000000000000000000000000000000000000000000000000008652837f00000000000000000000000051a80238b5738725128d3a3e06ab41c1d4c05c741660048701526020918287602481855afa9687156109ae57600097612f90575b5082612ef0612ee89798670de0b6b3a76400009889916129328661274f565b0495866127ff565b9560055416926044604051809581937f9c4d36af0000000000000000000000000000000000000000000000000000000083526004830152600060248301525afa9182156109ae578693600093612f59575b505091612d53612d5d959492612932612d639561274f565b908093929450813d8311612f89575b612f72818361241c565b810103126127445750518491612d53612d63612f41565b503d612f68565b968388813d8311612fb8575b612fa6818361241c565b81010312612744575095519582612ec9565b503d612f9c565b90604051917f70a0823100000000000000000000000000000000000000000000000000000000835273ffffffffffffffffffffffffffffffffffffffff90817f00000000000000000000000051a80238b5738725128d3a3e06ab41c1d4c05c74166004850152602073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28186602481845afa9586156109ae57600096613082575b5081612ceb61307c6130749798670de0b6b3a76400009889916129326126a9565b049586613547565b8561280c565b958287813d83116130aa575b613098818361241c565b81010312612744575094519481613053565b503d61308e565b91909173ffffffffffffffffffffffffffffffffffffffff9081841693604051947f70a08231000000000000000000000000000000000000000000000000000000008652837f00000000000000000000000051a80238b5738725128d3a3e06ab41c1d4c05c741660048701526020918287602481855afa9687156109ae57600097613167575b5082612ef06131616131599899670de0b6b3a7640000998a916129328761274f565b049687613547565b8661280c565b968388813d831161318f575b61317d818361241c565b81010312612744575095519582613137565b503d613173565b929173ffffffffffffffffffffffffffffffffffffffff91828116604051917f70a08231000000000000000000000000000000000000000000000000000000008352847f00000000000000000000000051a80238b5738725128d3a3e06ab41c1d4c05c741660048401526020928381602481865afa9081156109ae576000916132c2575b5061323796978491670de0b6b3a76400009889916129328661274f565b0495156132af57612ef090866127ff565b60055416926044604051809581937f9c4d36af0000000000000000000000000000000000000000000000000000000083526004830152600060248301525afa9182156109ae578693600093612f5957505091612d53612d5d959492612932612d639561274f565b6131616132bc9187613547565b95613248565b908482813d83116132ea575b6132d8818361241c565b8101031261274457505161323761321a565b503d6132ce565b919060ff600b5416156133e45761331f81670de0b6b3a764000061331961120860049561274f565b04612e43565b602073ffffffffffffffffffffffffffffffffffffffff60055416604051938480927f965fa21e0000000000000000000000000000000000000000000000000000000082525afa9182156109ae576000926133af575b5061338d936129326133939261271096879582613547565b9061280c565b04916008548103818111610b0c576133ab90846127b3565b0490565b90916020823d82116133dc575b816133c96020938361241c565b810103126127445750519061338d613375565b3d91506133bc565b50600091508190565b156133f457565b606460405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b1561343f57565b606460405162461bcd60e51b815260206004820152600d60248201527f414d4d20697320706175736564000000000000000000000000000000000000006044820152fd5b9091600080949381946040519160208301947f23b872dd00000000000000000000000000000000000000000000000000000000865273ffffffffffffffffffffffffffffffffffffffff80921660248501521660448301526064820152606481526134ed81612400565b51925af16134f961245d565b81613507575b50156109ba57565b805180159250821561351c575b5050386134ff565b61352f92506020809183010191016124bb565b3880613514565b8060c810600014612dcc575060c890565b9080821015613554575090565b905090565b9080821115613554575090565b818111156135785790612dcc9161280c565b612dcc9161280c56fea26469706673582212202cbbb024d56f77b1217ee55af805b0c1f607d75af541b7c86f9cd5bb3c2ed3b664736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000055638a11757cea2dd6130aa42ddc09149bdcaf84000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000050000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca0000000000000000000000000ac3e018457b222d93114458476f3e3416abbe38f000000000000000000000000ae78736cd615f374d3085123a210448e74fc6393000000000000000000000000be9895146f7af43049ca1c1ae358b0541ea49704000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
-----Decoded View---------------
Arg [0] : _owner (address): 0x55638A11757CEa2DD6130Aa42Ddc09149BDcAf84
Arg [1] : _lsds (address[]): 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0,0xac3E018457B222d93114458476f3E3416Abbe38F,0xae78736Cd615f374D3085123A210448E74Fc6393,0xBe9895146f7AF43049ca1c1AE358B0541Ea49704,0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 00000000000000000000000055638a11757cea2dd6130aa42ddc09149bdcaf84
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [3] : 0000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca0
Arg [4] : 000000000000000000000000ac3e018457b222d93114458476f3e3416abbe38f
Arg [5] : 000000000000000000000000ae78736cd615f374d3085123a210448e74fc6393
Arg [6] : 000000000000000000000000be9895146f7af43049ca1c1ae358b0541ea49704
Arg [7] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.