Everyday giveaways up to 100 ETH, Lucky Spins. Deposit BONUS 300% and Cashbacks!
5000+ Slots & Live Casino Games, 50+cryptos. Register with Etherscan and get 760% deposit bonus. Win Big$, withdraw it fast.
5000+ Slots & Live Casino Games, 50+cryptos. Register with Etherscan and get 760% deposit bonus. Win Big$, withdraw it fast.
Dive into 100s of games and play anonymously with major cryptos. Join CryptoWins today!
Anonymous play on awesome games - sign up now for 25 free jackpot spins - worth $100s!
Overview
ETH Balance
Eth Value
$0.00Token Holdings
Could not find any matches!
- ERC-20 Tokens (12)0.06158113 mpETHMetaPoolETH (mpETH)0.00003078 ankrETHAnkr Staked ... (ankrET...)$0.09@2,830.810.19085753 cbETHCoinbase Wra... (cbETH)$500.21@2,620.870.00006155 rETHRocket Pool ... (rETH)$0.17@2,701.330.88285985 sfrxETHStaked Frax ... (sfrxET...)$2,340.00@2,650.47844.1307549 unshETHunshETH Ethe... (unshET...)$10,683.83@2,586.411.69633216 WETHWrapped Ethe... (WETH)$4,105.99@2,420.50950.48943336 wstETHWrapped liqu... (wstETH)$1,396.69@2,853.680.00002926 WOETHWrapped OETH$0.08@2,675.181.4 TokenERC-20 TOKEN*[Suspicious]2,382.23 TokenERC-20 TOKEN*[Suspicious]1.7 TokenERC-20 TOKEN*[Suspicious]NFT Tokens (12)zsteth.com : airdrop recipient# zsteth.com : airdrop recipientERC-1155Official Authorize credentialFRAX: Airdrop NFT VoucherERC-1155claim rewards on fraxprotocol.comfraxprotocol.comERC-1155LidowstETH.comLidowstETH.comERC-1155Puffer Mystery Box puffereth.comPuffer Mystery Box puffereth.comERC-1155
More Info
Private Name Tags
ContractCreator
- Transactions
- Internal Transactions
- Token Transfers (ERC-20)
- NFT Transfers
- Contract
- Events
- Analytics
- Multichain Portfolio
- Filter by Tx Type:
- Tx
- Internal Tx
- ERC-20
- NFTs
Latest 25 from a total of 39 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Exit | 20432260 | 2024-08-01 7:39:11 | 95 days ago | 1722497951 | IN | 0 ETH$0.00 | 0.00303609 | 4.81829765 | ||||
Exit | 19057083 | 2024-01-21 18:42:35 | 288 days ago | 1705862555 | IN | 0 ETH$0.00 | 0.00745287 | 15.49466175 | ||||
Exit | 18989017 | 2024-01-12 6:25:47 | 297 days ago | 1705040747 | IN | 0 ETH$0.00 | 0.00757067 | 15.58598404 | ||||
Exit | 18988948 | 2024-01-12 6:11:59 | 297 days ago | 1705039919 | IN | 0 ETH$0.00 | 0.0094257 | 15.13994344 | ||||
Exit | 18867221 | 2023-12-26 3:35:11 | 315 days ago | 1703561711 | IN | 0 ETH$0.00 | 0.00825364 | 13 | ||||
Exit | 18859845 | 2023-12-25 2:40:59 | 316 days ago | 1703472059 | IN | 0 ETH$0.00 | 0.00070856 | 14.80148744 | ||||
Exit | 18842706 | 2023-12-22 16:55:23 | 318 days ago | 1703264123 | IN | 0 ETH$0.00 | 0.02775229 | 43.70769895 | ||||
Exit | 18842381 | 2023-12-22 15:49:35 | 318 days ago | 1703260175 | IN | 0 ETH$0.00 | 0.02298053 | 52.78561923 | ||||
Exit | 18794498 | 2023-12-15 22:30:47 | 325 days ago | 1702679447 | IN | 0 ETH$0.00 | 0.03906359 | 61.0628149 | ||||
Exit | 18711573 | 2023-12-04 7:40:23 | 336 days ago | 1701675623 | IN | 0 ETH$0.00 | 0.02386091 | 37.86604566 | ||||
Exit | 18705679 | 2023-12-03 11:51:11 | 337 days ago | 1701604271 | IN | 0 ETH$0.00 | 0.01616029 | 25.64556905 | ||||
Exit | 18699272 | 2023-12-02 14:19:35 | 338 days ago | 1701526775 | IN | 0 ETH$0.00 | 0.01989072 | 31.32694298 | ||||
Exit | 18682840 | 2023-11-30 7:08:59 | 340 days ago | 1701328139 | IN | 0 ETH$0.00 | 0.02014552 | 31.49076671 | ||||
Exit | 18678774 | 2023-11-29 17:31:35 | 341 days ago | 1701279095 | IN | 0 ETH$0.00 | 0.0213841 | 44.01470001 | ||||
Exit | 18678755 | 2023-11-29 17:27:47 | 341 days ago | 1701278867 | IN | 0 ETH$0.00 | 0.02827645 | 44.20323993 | ||||
Exit | 18678549 | 2023-11-29 16:46:23 | 341 days ago | 1701276383 | IN | 0 ETH$0.00 | 0.02175468 | 49.96986954 | ||||
Exit | 18668599 | 2023-11-28 7:21:23 | 342 days ago | 1701156083 | IN | 0 ETH$0.00 | 0.01816715 | 28.61239676 | ||||
Exit | 18664804 | 2023-11-27 18:35:59 | 343 days ago | 1701110159 | IN | 0 ETH$0.00 | 0.02453111 | 38.34616247 | ||||
Exit | 18654449 | 2023-11-26 7:45:59 | 344 days ago | 1700984759 | IN | 0 ETH$0.00 | 0.01003469 | 16.24156853 | ||||
Exit | 18639629 | 2023-11-24 5:57:47 | 346 days ago | 1700805467 | IN | 0 ETH$0.00 | 0.01278675 | 20.13814143 | ||||
Exit | 18608728 | 2023-11-19 22:07:47 | 351 days ago | 1700431667 | IN | 0 ETH$0.00 | 0.02155191 | 33.94323147 | ||||
Exit | 18607609 | 2023-11-19 18:21:11 | 351 days ago | 1700418071 | IN | 0 ETH$0.00 | 0.0141846 | 23.13813454 | ||||
Exit | 18606638 | 2023-11-19 15:06:23 | 351 days ago | 1700406383 | IN | 0 ETH$0.00 | 0.01341229 | 21.54184439 | ||||
Exit | 18588922 | 2023-11-17 3:28:47 | 354 days ago | 1700191727 | IN | 0 ETH$0.00 | 0.01434943 | 22.77677471 | ||||
Exit | 18585570 | 2023-11-16 16:13:47 | 354 days ago | 1700151227 | IN | 0 ETH$0.00 | 0.02897647 | 45.9833131 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | ||||||
---|---|---|---|---|---|---|---|---|---|
20432260 | 2024-08-01 7:39:11 | 95 days ago | 1722497951 | 0 ETH$0.00 | |||||
20432260 | 2024-08-01 7:39:11 | 95 days ago | 1722497951 | 0 ETH$0.00 | |||||
20432260 | 2024-08-01 7:39:11 | 95 days ago | 1722497951 | 0 ETH$0.00 | |||||
20432260 | 2024-08-01 7:39:11 | 95 days ago | 1722497951 | 0 ETH$0.00 | |||||
20432260 | 2024-08-01 7:39:11 | 95 days ago | 1722497951 | 0 ETH$0.00 | |||||
20432260 | 2024-08-01 7:39:11 | 95 days ago | 1722497951 | 0 ETH$0.00 | |||||
20432260 | 2024-08-01 7:39:11 | 95 days ago | 1722497951 | 0 ETH$0.00 | |||||
20432260 | 2024-08-01 7:39:11 | 95 days ago | 1722497951 | 0 ETH$0.00 | |||||
20432260 | 2024-08-01 7:39:11 | 95 days ago | 1722497951 | 0 ETH$0.00 | |||||
20432260 | 2024-08-01 7:39:11 | 95 days ago | 1722497951 | 0 ETH$0.00 | |||||
20432260 | 2024-08-01 7:39:11 | 95 days ago | 1722497951 | 0 ETH$0.00 | |||||
20432260 | 2024-08-01 7:39:11 | 95 days ago | 1722497951 | 0 ETH$0.00 | |||||
20432260 | 2024-08-01 7:39:11 | 95 days ago | 1722497951 | 0 ETH$0.00 | |||||
20432260 | 2024-08-01 7:39:11 | 95 days ago | 1722497951 | 0 ETH$0.00 | |||||
20432260 | 2024-08-01 7:39:11 | 95 days ago | 1722497951 | 0 ETH$0.00 | |||||
20432260 | 2024-08-01 7:39:11 | 95 days ago | 1722497951 | 0 ETH$0.00 | |||||
20432260 | 2024-08-01 7:39:11 | 95 days ago | 1722497951 | 0 ETH$0.00 | |||||
20432260 | 2024-08-01 7:39:11 | 95 days ago | 1722497951 | 0 ETH$0.00 | |||||
20432260 | 2024-08-01 7:39:11 | 95 days ago | 1722497951 | 0 ETH$0.00 | |||||
20432260 | 2024-08-01 7:39:11 | 95 days ago | 1722497951 | 0 ETH$0.00 | |||||
20432260 | 2024-08-01 7:39:11 | 95 days ago | 1722497951 | 0 ETH$0.00 | |||||
20432260 | 2024-08-01 7:39:11 | 95 days ago | 1722497951 | 0 ETH$0.00 | |||||
20432260 | 2024-08-01 7:39:11 | 95 days ago | 1722497951 | 0 ETH$0.00 | |||||
20432260 | 2024-08-01 7:39:11 | 95 days ago | 1722497951 | 0 ETH$0.00 | |||||
20432260 | 2024-08-01 7:39:11 | 95 days ago | 1722497951 | 0 ETH$0.00 |
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.11; import "communal/ReentrancyGuard.sol"; import "communal/Owned.sol"; import "communal/SafeERC20.sol"; import "communal/TransferHelper.sol"; import "openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import "hardhat/console.sol"; /* * LSD Vault Contract: * This contract is responsible for holding and managing the deposited LSDs. It mints reshETH to depositors. */ //Access control hierarchy //owner = multisig: used for initial setup + admin functions + unlocking timelocked functions //admin = team eoa: used for emergency functions and low level configs //timelock = multisig can propose unlock + 72 hr delay: used for functions that affect user funds interface IunshETH { function minter_mint(address m_address, uint256 m_amount) external; function minter_burn_from(address b_address, uint256 b_amount) external; function timelock_address() external returns (address); function addMinter(address minter_address) external; function setTimelock(address _timelock_address) external; function removeMinter(address minter_address) external; } interface ILSDVault { function balanceInUnderlying() external view returns (uint256); function exit(uint256 amount) external; function shanghaiTime() external returns(uint256); } interface IDarknet { function checkPrice(address lsd) external view returns (uint256); } contract LSDVault is Owned, ReentrancyGuard { using SafeERC20 for IERC20; /* ============================================================================ State Variables ============================================================================ */ // address public admin; uint256 public sentienceTime = 1700110800; //timestamp for Nov 16, 2023 00:00:00PM UTC (~3 mo after resheth launch) address public immutable reshETHAddress; address public reshethZapAddress; address public swapperAddress; address public admin; address public darknetAddress; address[] public supportedLSDs; mapping(address => uint256) public lsdIndex; //keep track of reverse mapping of supportedLSDs indices for fast lookup uint256 public lsdLength; struct LSDConfig { uint16 targetWeightBps; uint16 weightCapBps; uint216 absoluteCap; } mapping(address => LSDConfig) public lsdConfigs; bool public useWeightCaps; bool public useAbsoluteCaps; mapping(address => bool) public isEnabled; uint96 public constant _TIMELOCK = 3 days; enum TimelockFunctions { MIGRATE, AMM, DARKNET, ZAP } struct TimelockProposal { address proposedAddress; uint96 unlockTime; } mapping(TimelockFunctions => TimelockProposal) public timelock; //Redeem fees in basis points, configurable by multisig uint256 public redeemFee = 0; uint256 public constant maxRedeemFee = 500; //max 500 basis points = 5% fee bool public depositsPaused; bool public migrated = false; bool public ammEnabled = false; bool public withdrawalsPaused = false; uint256 public withdrawalUnpauseTime; /* ============================================================================ Events ============================================================================ */ event DepositPauseToggled(bool paused); event SentienceTimeUpdated(uint256 newTime); event ReshethAddressSet(address reshethAddress); event ReshethZapAddressSet(address reshethZapAddress); event AdminSet(address admin); event LSDAdded(address lsd); event LSDConfigSet(address lsd, LSDConfig config); event LSDDisabled(address lsd); event LSDEnabled(address lsd); event AbsoluteCapsToggled(bool useAbsoluteCaps); event WeightCapsToggled(bool useWeightCaps); event RedeemFeeUpdated(uint256 redeemFee); event TimelockUpdateProposed(TimelockFunctions _fn, address _newAddress, uint256 _unlockTime); event TimelockUpdateCanceled(TimelockFunctions _fn); event TimelockUpdateCompleted(TimelockFunctions _fn); event VdAmmDisabled(address swapper); event WithdrawalsPaused(uint256 withdrawalUnpauseTime); event WithdrawalsUnpaused(); /* ============================================================================ Constructor ============================================================================ */ constructor(address _owner, address _darknetAddress, address _reshethAddress, address[] memory _lsds) Owned(_owner){ darknetAddress = _darknetAddress; reshETHAddress = _reshethAddress; depositsPaused = true; for(uint256 i=0; i < _lsds.length; i = unchkIncr(i)) { addLSD(_lsds[i]); if(i == 0) { setLSDConfigs(_lsds[i], 714+4, 5000, 1000e18); //initialize with 7.69% target, 50% max, 1000ETH absolute max } else { setLSDConfigs(_lsds[i], 714, 5000, 1000e18); } } useWeightCaps = false; useAbsoluteCaps = false; } /* ============================================================================ Function Modifiers ============================================================================ */ modifier onlyZap { require(msg.sender == reshethZapAddress, "Only the unsheth Zap contract may perform this action"); _; } modifier onlyOwnerOrAdmin { require(msg.sender == owner || msg.sender == admin, "Only the owner or admin may perform this action"); _; } modifier postShanghai { require(block.timestamp >= sentienceTime + _TIMELOCK, "ShanghaiTime + Timelock has not passed" ); _; } modifier onlyWhenPaused { require(depositsPaused, "Deposits must be paused before performing this action" ); _; } modifier timelockUnlocked(TimelockFunctions _fn) { require(timelock[_fn].unlockTime != 0 && timelock[_fn].unlockTime <= block.timestamp, "Function is timelocked"); require(timelock[_fn].proposedAddress != address(0), "Cannot set zero address"); _; } //helper to perform lower gas unchecked increment in for loops function unchkIncr(uint256 i) private pure returns(uint256) { unchecked { return i+1; } } /* ============================================================================ Setup functions ============================================================================ */ function setReshethZap(address _reshethZapAddress) external onlyOwner { require(reshethZapAddress == address(0), "reshETH zap address already set" ); reshethZapAddress = _reshethZapAddress; emit ReshethZapAddressSet(reshethZapAddress); } function setAdmin(address _admin) external onlyOwner { admin = _admin; emit AdminSet(admin); } /* ============================================================================ LSD configuration functions ============================================================================ */ //Workflow to add new LSD: First addLSD, then setLSDConfigs, then configure it in darknet, then enableLSD //New LSD is always added with zero weight and disabled //Deposits must be paused before configuring, and should be enabled when done function addLSD(address _lsd) public onlyOwner onlyWhenPaused { require(lsdIndex[_lsd] == 0, "Lsd has already been added"); supportedLSDs.push(_lsd); lsdLength += 1; lsdIndex[_lsd] = lsdLength; //reverse mapping of supportedLSDs indices, starts at index 1 isEnabled[_lsd] = false; lsdConfigs[_lsd] = LSDConfig(0, 0, 0); emit LSDAdded(_lsd); } function setLSDConfigs(address _lsd, uint16 _targetWeightBps, uint16 _maxWeightBps, uint216 _maxCap) public onlyOwner onlyWhenPaused { require(_targetWeightBps <= _maxWeightBps, "Cannot set target above max weight"); require(_targetWeightBps <= 10000 && _maxWeightBps <= 10000, "Cannot set weight above 1"); lsdConfigs[_lsd] = LSDConfig(_targetWeightBps, _maxWeightBps, _maxCap); emit LSDConfigSet(_lsd, lsdConfigs[_lsd]); } function enableLSD(address _lsd) public onlyOwner onlyWhenPaused { console.log("enabling lsd:", _lsd); console.log("darknet address:", darknetAddress); console.log(IDarknet(darknetAddress).checkPrice(0x31AA035313b1D2109e61Ee0E3662A86A8615fF1d)); require(IDarknet(darknetAddress).checkPrice(_lsd) > 0, "Configure lsd in darknet before enabling"); require(lsdConfigs[_lsd].targetWeightBps > 0 && lsdConfigs[_lsd].weightCapBps > 0 && lsdConfigs[_lsd].absoluteCap > 0, "Set weights before enabling"); isEnabled[_lsd] = true; emit LSDEnabled(_lsd); } function enableAllLSDs() external onlyOwner onlyWhenPaused { uint256 length = lsdLength; for(uint256 i=0; i<length; i=unchkIncr(i)) { enableLSD(supportedLSDs[i]); } } //Disabling resets configs to zero, need to set before re-enabling function disableLSD(address _lsd) external onlyOwner onlyWhenPaused { lsdConfigs[_lsd] = LSDConfig(0, 0, 0); isEnabled[_lsd] = false; emit LSDDisabled(_lsd); } function toggleWeightCaps() external onlyOwner { useWeightCaps = !useWeightCaps; emit WeightCapsToggled(useWeightCaps); } function toggleAbsoluteCaps() external onlyOwner { useAbsoluteCaps = !useAbsoluteCaps; emit AbsoluteCapsToggled(useAbsoluteCaps); } function unpauseDeposits() external onlyOwner onlyWhenPaused { uint256 totalTargetWeightBps = 0; for(uint256 i=0; i < lsdLength; i = unchkIncr(i)) { address lsd = supportedLSDs[i]; uint256 targetWeightBps = lsdConfigs[lsd].targetWeightBps; if(targetWeightBps > 0) { require(isEnabled[lsd], "Need to enable LSD with non-zero target weight"); } totalTargetWeightBps += targetWeightBps; } require(totalTargetWeightBps == 10000, "Total target weight should equal 1"); depositsPaused = false; emit DepositPauseToggled(depositsPaused); } function isLsdEnabled(address lsd) public view returns(bool) { return isEnabled[lsd]; } function getLsdIndex(address lsd) public view returns(uint256) { return lsdIndex[lsd]; } //============================================================================ //Minting reshETH //============================================================================ function deposit(address lsd, uint256 amount) external onlyZap nonReentrant { _deposit(lsd, amount, true); } //Gas efficient function to mint reshETH while skipping cap checks function depositNoCapCheck(address lsd, uint256 amount) external onlyZap nonReentrant { _deposit(lsd, amount, false); } //takes a supported LSD and mints reshETH to the user in proportion //this is an internal function, only callable by the approved ETH zap contract function _deposit(address lsd, uint256 amount, bool checkAgainstCaps) private { require(depositsPaused == false, "Deposits are paused"); require(migrated == false, "Already migrated, deposit to new vault"); require(isEnabled[lsd], "LSD is disabled"); if(checkAgainstCaps) { uint256 balance = getCombinedVaultBalance(lsd); if(useAbsoluteCaps) { require(balance + amount <= getAbsoluteCap(lsd), "Deposit exceeds absolute cap"); } if(useWeightCaps) { require(balance + amount <= getWeightCap(lsd, amount), "Deposit exceeds weight based cap"); } } uint256 price = getPrice(lsd); TransferHelper.safeTransferFrom(lsd, msg.sender, address(this), amount); IunshETH(reshETHAddress).minter_mint(msg.sender, price*amount/1e18); } function getEthConversionRate(address lsd) public view returns(uint256) { return IDarknet(darknetAddress).checkPrice(lsd); } function getPrice(address lsd) public view returns(uint256) { uint256 rate = getEthConversionRate(lsd); if(IERC20(reshETHAddress).totalSupply() == 0){ return rate; } else { return 1e18* rate /stakedETHperunshETH(); } } function stakedETHperunshETH() public view returns (uint256) { return 1e18*balanceInUnderlying()/IERC20(reshETHAddress).totalSupply(); } function balanceInUnderlying() public view returns (uint256) { uint256 underlyingBalance = 0; for (uint256 i = 0; i < lsdLength; i = unchkIncr(i)) { IDarknet darknet = IDarknet(darknetAddress); address lsd = supportedLSDs[i]; uint256 rate = darknet.checkPrice(lsd); underlyingBalance += rate *IERC20(lsd).balanceOf(address(this))/1e18; } return underlyingBalance; } function getAbsoluteCap(address lsd) public view returns(uint256) { if(!useAbsoluteCaps) { return type(uint256).max; } uint256 absoluteCap = lsdConfigs[lsd].absoluteCap; return absoluteCap; } function getWeightCap(address lsd, uint256 marginalDeposit) public view returns(uint256) { if(!useWeightCaps) { return type(uint256).max; } uint256 weightCapBps = lsdConfigs[lsd].weightCapBps; uint256 rate = getEthConversionRate(lsd); uint256 marginalDepositInEth = marginalDeposit*rate/1e18; uint256 totalEthBalance = balanceInUnderlying() + marginalDepositInEth; uint256 weightCapInEth = totalEthBalance*weightCapBps/10000; return 1e18*weightCapInEth/rate; } function getCombinedVaultBalance(address lsd) public view returns(uint256) { uint256 balance = IERC20(lsd).balanceOf(address(this)); return balance; } //============================================================================ //Redeeming reshETH //============================================================================ function setRedeemFee(uint256 _redeemFee) external onlyOwner { require(_redeemFee <= maxRedeemFee, "Redeem fee too high"); redeemFee = _redeemFee; emit RedeemFeeUpdated(redeemFee); } function exit(uint256 amount) external nonReentrant { require(migrated == false, "Already migrated, use new vault to exit"); require(block.timestamp > sentienceTime, "Cannot exit until shanghaiTime"); require(!withdrawalsPaused || block.timestamp > withdrawalUnpauseTime, "Withdrawals are paused"); require(IERC20(reshETHAddress).balanceOf(msg.sender) >= amount, "Insufficient reshETH"); uint256 sharesOfResheth = 1e18*amount/IERC20(reshETHAddress).totalSupply(); uint256 fee = sharesOfResheth *redeemFee/10000; //redeem fees are 100% transferred to multisig owner in reshETH terms IunshETH(reshETHAddress).minter_burn_from(msg.sender, amount); for (uint256 i = 0; i < lsdLength; i = unchkIncr(i)) { address lsd = supportedLSDs[i]; uint256 lsdBalance = IERC20(lsd).balanceOf(address(this)); uint256 amountPerLsd = (sharesOfResheth -fee)*lsdBalance/1e18; IERC20(lsd).safeTransfer(msg.sender, amountPerLsd); uint256 feePerLsd = fee*lsdBalance/1e18; IERC20(lsd).safeTransfer(owner, feePerLsd); } } //============================================================================ //Timelock functions //============================================================================ function createTimelockProposal(TimelockFunctions _fn, address _proposedAddress) public onlyOwner { require(_proposedAddress != address(0), "Cannot propose zero address"); uint96 unlockTime = uint96(block.timestamp) + _TIMELOCK; timelock[_fn] = TimelockProposal(_proposedAddress, unlockTime); emit TimelockUpdateProposed(_fn, _proposedAddress, unlockTime); } function cancelTimelockProposal(TimelockFunctions _fn) public onlyOwner { timelock[_fn] = TimelockProposal(address(0), 0); emit TimelockUpdateCanceled(_fn); } function _completeTimelockProposal(TimelockFunctions _fn) internal onlyOwner { timelock[_fn] = TimelockProposal(address(0), 0); emit TimelockUpdateCompleted(_fn); } function updateUnshethZapAddress() external onlyOwner timelockUnlocked(TimelockFunctions.ZAP) { reshethZapAddress = timelock[TimelockFunctions.ZAP].proposedAddress; _completeTimelockProposal(TimelockFunctions.ZAP); } function updateDarknetAddress() external onlyOwner timelockUnlocked(TimelockFunctions.DARKNET) { darknetAddress = timelock[TimelockFunctions.DARKNET].proposedAddress; _completeTimelockProposal(TimelockFunctions.DARKNET); } function migrateVault() external onlyOwner postShanghai timelockUnlocked(TimelockFunctions.MIGRATE) { require(IunshETH(reshETHAddress).timelock_address() == address(this), "LSDVault cannot change reshETH minter"); address proposedVaultAddress = timelock[TimelockFunctions.MIGRATE].proposedAddress; for (uint256 i = 0; i < lsdLength; i = unchkIncr(i)) { address lsd = supportedLSDs[i]; uint256 balance = IERC20(lsd).balanceOf(address(this)); IERC20(lsd).safeTransfer(proposedVaultAddress, balance); } IunshETH unshETH = IunshETH(reshETHAddress); unshETH.addMinter(proposedVaultAddress); unshETH.removeMinter(address(this)); unshETH.setTimelock(proposedVaultAddress); migrated = true; _completeTimelockProposal(TimelockFunctions.MIGRATE); } function setVdAmm() external onlyOwner postShanghai timelockUnlocked(TimelockFunctions.AMM) { //revoke approvals to current swapper if(swapperAddress != address(0)) { _setApprovals(swapperAddress, 0); } //give max approvals to proposed swapper address proposedSwapper = timelock[TimelockFunctions.AMM].proposedAddress; _setApprovals(proposedSwapper, type(uint256).max); swapperAddress = proposedSwapper; ammEnabled = true; _completeTimelockProposal(TimelockFunctions.AMM); } function _setApprovals(address spender, uint256 limit) internal { for (uint256 i = 0; i < lsdLength; i = unchkIncr(i)) { TransferHelper.safeApprove(supportedLSDs[i], spender, limit); } } //============================================================================ //Admin and emergency functions //============================================================================ function updateSentienceTime(uint256 _newTime) external onlyOwnerOrAdmin { require(_newTime <= sentienceTime + 4 weeks, "Cannot extend more than 4 weeks" ); require(_newTime > block.timestamp, "Cannot set sentienceTime in the past" ); sentienceTime = _newTime; emit SentienceTimeUpdated(sentienceTime); } function pauseDeposits() external onlyOwnerOrAdmin { require(depositsPaused == false, "Already paused" ); depositsPaused = true; emit DepositPauseToggled(depositsPaused); } function pauseWithdrawals(uint256 _unpauseTime) external onlyOwnerOrAdmin { //Max admin withdrawal pause is 1 day less than timelock (2 days), can't unpause again for 1 day after prev pause ends require(_unpauseTime <= block.timestamp + _TIMELOCK - 1 days, "Cannot pause withdrawals too long"); require(block.timestamp >= withdrawalUnpauseTime + 1 days, "Need 1 day cooldown before pausing again"); withdrawalUnpauseTime = _unpauseTime; withdrawalsPaused = true; emit WithdrawalsPaused(withdrawalUnpauseTime); } function unpauseWithdrawals() external onlyOwnerOrAdmin { withdrawalsPaused = false; emit WithdrawalsUnpaused(); } function disableVdAmm() external onlyOwnerOrAdmin { require(swapperAddress != address(0), "Vdamm is not set"); _setApprovals(swapperAddress, 0); emit VdAmmDisabled(swapperAddress); } }
// SPDX-License-Identifier: MIT pragma solidity >= 0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _sendLogPayload(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function log() internal view { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int256)", p0)); } function logUint(uint256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function logString(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function log(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint256 p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1)); } function log(uint256 p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1)); } function log(uint256 p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1)); } function log(uint256 p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1)); } function log(string memory p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1)); } function log(string memory p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1)); } function log(bool p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1)); } function log(address p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint256 p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2)); } function log(uint256 p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2)); } function log(uint256 p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2)); } function log(uint256 p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2)); } function log(uint256 p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2)); } function log(uint256 p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2)); } function log(uint256 p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2)); } function log(uint256 p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2)); } function log(uint256 p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2)); } function log(uint256 p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2)); } function log(uint256 p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2)); } function log(uint256 p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2)); } function log(uint256 p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2)); } function log(string memory p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2)); } function log(string memory p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2)); } function log(string memory p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2)); } function log(string memory p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2)); } function log(bool p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2)); } function log(bool p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2)); } function log(bool p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2)); } function log(address p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2)); } function log(address p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2)); } function log(address p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } }
// 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'); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/structs/EnumerableSet.sol) pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } }
{ "viaIR": true, "optimizer": { "enabled": true, "runs": 9999 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "remappings": [ "forge-std/=lib/forge-std/src/", "communal/=lib/communal/", "@prb/math/=lib/prb-math/src/", "@prb/test/=lib/prb-test/src/", "local/=src/", "openzeppelin/=lib/openzeppelin/", "openzeppelin-contracts/=lib/openzeppelin-contracts/", "solmate/=lib/solmate/src/", "Common/=lib/Common/", "ERC20/=lib/ERC20/", "Governance/=lib/Governance/", "Math/=lib/Math/", "Staking/=lib/Staking/", "Utils/=lib/Utils/", "ds-test/=lib/forge-std/lib/ds-test/src/", "layerzerolabs/=lib/solidity-examples/", "prb-math/=lib/prb-math/src/", "prb-test/=lib/prb-math/lib/prb-test/src/", "solidity-examples/=lib/solidity-examples/contracts/", "src/=lib/prb-math/src/" ], "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_darknetAddress","type":"address"},{"internalType":"address","name":"_reshethAddress","type":"address"},{"internalType":"address[]","name":"_lsds","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"useAbsoluteCaps","type":"bool"}],"name":"AbsoluteCapsToggled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"admin","type":"address"}],"name":"AdminSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"paused","type":"bool"}],"name":"DepositPauseToggled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"lsd","type":"address"}],"name":"LSDAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"lsd","type":"address"},{"components":[{"internalType":"uint16","name":"targetWeightBps","type":"uint16"},{"internalType":"uint16","name":"weightCapBps","type":"uint16"},{"internalType":"uint216","name":"absoluteCap","type":"uint216"}],"indexed":false,"internalType":"struct LSDVault.LSDConfig","name":"config","type":"tuple"}],"name":"LSDConfigSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"lsd","type":"address"}],"name":"LSDDisabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"lsd","type":"address"}],"name":"LSDEnabled","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":"uint256","name":"redeemFee","type":"uint256"}],"name":"RedeemFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"reshethAddress","type":"address"}],"name":"ReshethAddressSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"reshethZapAddress","type":"address"}],"name":"ReshethZapAddressSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newTime","type":"uint256"}],"name":"SentienceTimeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum LSDVault.TimelockFunctions","name":"_fn","type":"uint8"}],"name":"TimelockUpdateCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum LSDVault.TimelockFunctions","name":"_fn","type":"uint8"}],"name":"TimelockUpdateCompleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum LSDVault.TimelockFunctions","name":"_fn","type":"uint8"},{"indexed":false,"internalType":"address","name":"_newAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_unlockTime","type":"uint256"}],"name":"TimelockUpdateProposed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"swapper","type":"address"}],"name":"VdAmmDisabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"useWeightCaps","type":"bool"}],"name":"WeightCapsToggled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"withdrawalUnpauseTime","type":"uint256"}],"name":"WithdrawalsPaused","type":"event"},{"anonymous":false,"inputs":[],"name":"WithdrawalsUnpaused","type":"event"},{"inputs":[],"name":"_TIMELOCK","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lsd","type":"address"}],"name":"addLSD","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ammEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceInUnderlying","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum LSDVault.TimelockFunctions","name":"_fn","type":"uint8"}],"name":"cancelTimelockProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum LSDVault.TimelockFunctions","name":"_fn","type":"uint8"},{"internalType":"address","name":"_proposedAddress","type":"address"}],"name":"createTimelockProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"darknetAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lsd","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lsd","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositNoCapCheck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositsPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lsd","type":"address"}],"name":"disableLSD","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableVdAmm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableAllLSDs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lsd","type":"address"}],"name":"enableLSD","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"exit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lsd","type":"address"}],"name":"getAbsoluteCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lsd","type":"address"}],"name":"getCombinedVaultBalance","outputs":[{"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":"address","name":"lsd","type":"address"}],"name":"getLsdIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lsd","type":"address"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lsd","type":"address"},{"internalType":"uint256","name":"marginalDeposit","type":"uint256"}],"name":"getWeightCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lsd","type":"address"}],"name":"isLsdEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lsdConfigs","outputs":[{"internalType":"uint16","name":"targetWeightBps","type":"uint16"},{"internalType":"uint16","name":"weightCapBps","type":"uint16"},{"internalType":"uint216","name":"absoluteCap","type":"uint216"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lsdIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lsdLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxRedeemFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"migrateVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"pauseDeposits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_unpauseTime","type":"uint256"}],"name":"pauseWithdrawals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"redeemFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reshETHAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reshethZapAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sentienceTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lsd","type":"address"},{"internalType":"uint16","name":"_targetWeightBps","type":"uint16"},{"internalType":"uint16","name":"_maxWeightBps","type":"uint16"},{"internalType":"uint216","name":"_maxCap","type":"uint216"}],"name":"setLSDConfigs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_redeemFee","type":"uint256"}],"name":"setRedeemFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_reshethZapAddress","type":"address"}],"name":"setReshethZap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setVdAmm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakedETHperunshETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"supportedLSDs","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapperAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum LSDVault.TimelockFunctions","name":"","type":"uint8"}],"name":"timelock","outputs":[{"internalType":"address","name":"proposedAddress","type":"address"},{"internalType":"uint96","name":"unlockTime","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleAbsoluteCaps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWeightCaps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpauseDeposits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpauseWithdrawals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateDarknetAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTime","type":"uint256"}],"name":"updateSentienceTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateUnshethZapAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"useAbsoluteCaps","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"useWeightCaps","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawalUnpauseTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawalsPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
604060a0815234620005215762004f8090813803806200001f816200055c565b938439820191608092838282031262000521576200003d8262000582565b916020916200004e83830162000582565b926200005c86840162000582565b6060848101516001600160401b039591949186821162000521570181601f820112156200052157805195861162000526578560051b908480620000a18185016200055c565b809981520192820101928311620005215784809101915b8383106200050657506001600160a01b0398891692505081159050620004c25760018060a09a99989a1b0319917fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c88600093808686541617855581519085825287820152a16001998a809881600255636555a1d060035584600f5560109383855492168760075416176007558c5263ffffffff1916178255829a5b6200019e575b898961ffff19600c5416600c55516148e591826200069b8339518181816105a401528181610ea101528181611654015281816129d901528181613abc0152613b810152f35b86518b1015620004bc5780620001b58c8962000597565b5116620001c7828554163314620005c2565b60ff90620001d88285541662000627565b80855260098088528b862054620004785760088054906801000000000000000082101562000464578c820180825582101562000450578752888720018288825416179055600a908154918c83018093116200043c57938e9f938e9f929e8e9f8f978f918a8f928e968a8f92947f2c8c325a335a0bf8070b6f926d25c7d9dab2af926266d3867246a24a227abb749c8a9655828652865287852055600d855286842060ff1981541690556200028b6200053c565b95848752858701958587528d898901928784528488527fe5b3d6de4d7a3162af7ca9115e3e57964a3c605b53efa503cfcba6dd9ceb9e3c838c600b9a8b8352209661ffff809d51169780549863ffff0000809e518c1b16640100000000600160f81b03809a51861b169160ff60f81b809c1617171790558d51908152a181620003b4579b86620003246200033d93620003349f62000597565b51169c8d978d54163314620005c2565b85541662000627565b8789620003496200053c565b9b8c986102ce8a5282858b019a6113888c520198683635c9adc5dea000008a5282528452209a51169687948b549751901b169451901b16931617171780945582519485528d850152828a1c169083015260018060d81b03908b1c168b820152a15b019a999862000153565b9b8662000324620003ca93620003349f62000597565b8789620003d66200053c565b9b8c986102ca8a5282858b019a6113888c520198683635c9adc5dea000008a5282528452209a51169687948b549751901b169451901b16931617171780945582519485528d850152828a1c169083015260018060d81b03908b1c168b820152a1620003aa565b634e487b7160e01b88526011600452602488fd5b634e487b7160e01b88526032600452602488fd5b634e487b7160e01b88526041600452602488fd5b8b5162461bcd60e51b815260048101899052601a60248201527f4c73642068617320616c7265616479206265656e2061646465640000000000006044820152606490fd5b62000159565b875162461bcd60e51b815260048101849052601960248201527f4f776e657220616464726573732063616e6e6f742062652030000000000000006044820152606490fd5b8190620005138462000582565b8152019101908490620000b8565b600080fd5b634e487b7160e01b600052604160045260246000fd5b60405190606082016001600160401b038111838210176200052657604052565b6040519190601f01601f191682016001600160401b038111838210176200052657604052565b51906001600160a01b03821682036200052157565b8051821015620005ac5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b15620005ca57565b60405162461bcd60e51b815260206004820152602f60248201527f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726660448201526e37b936903a3434b99030b1ba34b7b760891b6064820152608490fd5b156200062f57565b60405162461bcd60e51b815260206004820152603560248201527f4465706f73697473206d75737420626520706175736564206265666f7265207060448201527f6572666f726d696e67207468697320616374696f6e00000000000000000000006064820152608490fdfe6080604052600436101561001257600080fd5b60003560e01c806302191980146103cd578063083d125c146103c85780630e94895b146103c35780631583913a146103be5780631627540c146103b9578063202a36cd146103b4578063242b7055146103af57806325911ca6146103aa57806326688a1d146103a55780632c678c64146103a05780633088555114610323578063357ce5111461039b57806335c1d70114610396578063392fc2ab1461039157806341976e091461038c57806347e7ef241461038757806348a8ab4a146103825780634b53bbb41461037d57806353a47bb71461037857806356c9c2ea1461037357806357709da01461036e57806359895c8d146103695780635d841af514610364578063602576801461035f57806360da3e831461035a57806363d8882a146103555780636bf4417214610350578063704b6c021461034b57806379ba5097146103465780637f8661a11461034157806381097f261461033c57806383aa478214610337578063872a6a83146103325780638da5cb5b1461032d578063900582e9146103285780639015d37114610323578063965fa21e1461031e5780639b138df7146103195780639bea8fce14610314578063a000f50b146102c9578063a56478ec1461030f578063af4b18741461030a578063b1db8d5614610305578063b61eb0b114610300578063b669de8b146102fb578063bb6398fb146102f6578063c05bfee5146102f1578063c17bae2a146102ec578063c736216a146102e7578063ded517f0146102e2578063e2337b36146102dd578063e23dc21b146102d8578063e4c4be58146102d3578063e81e669d146102ce578063e9046f20146102c9578063e9f2838e146102c4578063ea37c3b5146102bf578063f09565e3146102ba578063f44a5aa9146102b55763f851a440146102b057600080fd5b612f75565b612d55565b612d0c565b61291f565b6128f9565b611d22565b612647565b6125c8565b612532565b61245a565b6123e7565b6123c4565b612387565b612260565b611fdc565b611fb5565b611e7d565b611e47565b611e20565b611dc6565b611b89565b611b6b565b611b4d565b610ca7565b611b2f565b611b08565b61194e565b611928565b61190b565b6115ea565b6114ba565b611439565b611322565b6111b7565b611194565b6110be565b611016565b610fef565b610f25565b610f07565b610ee0565b610ec5565b610e81565b610d86565b610d5f565b610d34565b610d0d565b610cea565b610c81565b610c16565b610a22565b61083b565b6106f1565b610670565b610652565b6104ef565b6104b8565b6103e2565b60009103126103dd57565b600080fd5b346103dd576000806003193601126104b5576104136001600160a01b038083541633149081156104a7575b5061475d565b60105460ff81166104635760ff1960019116176010557f32905e0dae285619d12ba07deb834fd719aee5ea09531b2f99d906aacfd0289e6040518061045d81906001602083019252565b0390a180f35b606460405162461bcd60e51b815260206004820152600e60248201527f416c7265616479207061757365640000000000000000000000000000000000006044820152fd5b90506006541633143861040d565b80fd5b346103dd5760006003193601126103dd57602060ff60105460101c166040519015158152f35b6001600160a01b038116036103dd57565b346103dd5760406003193601126103dd5760043561050c816104de565b6105d86105ca6024356001600160a01b0361052c816004541633146135e7565b61053a600280541415613658565b6002805561055c60ff601054610552828216156136a3565b60081c16156136ee565b61058b61058661057f876001600160a01b0316600052600d602052604060002090565b5460ff1690565b61375f565b6105a28261059887613a7d565b96309033906138fc565b7f00000000000000000000000000000000000000000000000000000000000000001693613858565b670de0b6b3a7640000900490565b90803b156103dd576040517f6a257ebc00000000000000000000000000000000000000000000000000000000815233600482015260248101839052906000908290604490829084905af1801561064d57610634575b6001600255005b8061064161064792613202565b806103d2565b8061062d565b61333d565b346103dd5760006003193601126103dd576020601154604051908152f35b346103dd5760206003193601126103dd577f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2260206004356106b0816104de565b6001600160a01b03906106c882600054163314612f9c565b168073ffffffffffffffffffffffffffffffffffffffff196001541617600155604051908152a1005b346103dd5760206003193601126103dd576004356107246001600160a01b03806000541633149081156104a7575061475d565b6203f4804201804211610836576202a30042019081116108365781116107cc576107639061075e61075660115461319f565b42101561483e565b601155565b61079663010000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff6010541617601055565b6011546040519081527ff4f3231af9b3395333147b242229c61347b92aadd25f9760b503d04e50b5cd909080602081015b0390a1005b608460405162461bcd60e51b815260206004820152602160248201527f43616e6e6f74207061757365207769746864726177616c7320746f6f206c6f6e60448201527f67000000000000000000000000000000000000000000000000000000000000006064820152fd5b613170565b346103dd576000806003193601126104b5576001600160a01b0380825416331461086481612f9c565b6002600052600e6020527f9adb202b1492743bc00c81d33cdc6423fa8c79109027eb6a845391e8fc1f04815460a01c1515806109ea575b6108a490614222565b6002600052600e6020526108dd827f9adb202b1492743bc00c81d33cdc6423fa8c79109027eb6a845391e8fc1f04815b5416151561426d565b6002600052600e602052610934827f9adb202b1492743bc00c81d33cdc6423fa8c79109027eb6a845391e8fc1f048154169173ffffffffffffffffffffffffffffffffffffffff1992836007541617600755612f9c565b60405191610941836131ca565b83835260208084018581526002600052600e9091526109a8827f9adb202b1492743bc00c81d33cdc6423fa8c79109027eb6a845391e8fc1f04815b95511685906001600160a01b031673ffffffffffffffffffffffffffffffffffffffff19825416179055565b519183549260a01b1691161790557f9436ec76028e8e130b8c3cea256427c80d841d322e696219a98f08f4682dde686040518061045d81906002602083019252565b506002600052600e6020527f9adb202b1492743bc00c81d33cdc6423fa8c79109027eb6a845391e8fc1f04815460a01c42101561089b565b346103dd5760206003193601126103dd57600435610a3f816104de565b7fe5b3d6de4d7a3162af7ca9115e3e57964a3c605b53efa503cfcba6dd9ceb9e3c61045d6001600160a01b0392600093610a7d818654163314612f9c565b610a8b60ff6010541661300d565b811684526009602052610aa260408520541561307e565b610aab816130f8565b610abe610ab9600a546131af565b600a55565b600a54610ade826001600160a01b03166000526009602052604060002090565b55610b09610aff826001600160a01b0316600052600d602052604060002090565b60ff198154169055565b610bfc610b14613255565b858152856020820152856040820152610b40836001600160a01b0316600052600b602052604060002090565b9061ffff81511690825491807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000084161784557fff000000000000000000000000000000000000000000000000000000000000007effffffffffffffffffffffffffffffffffffffffffffffffffffff00000000604063ffff0000602086015160101b169485857fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000891617178855015160201b1693161717179055565b6040516001600160a01b0390911681529081906020820190565b346103dd576000806003193601126104b557610c3d6001600160a01b038254163314612f9c565b7fb26c39d6b5cbedf5e765f9a18e1c4b238f0811e3a0d3f19818f5bb2c5cd4fff9602060ff19600c5460ff80821615169182911617600c556040519015158152a180f35b346103dd5760006003193601126103dd57602060ff60105460081c166040519015158152f35b346103dd5760206003193601126103dd576001600160a01b03600435610ccc816104de565b16600052600d602052602060ff604060002054166040519015158152f35b346103dd5760006003193601126103dd576020610d05613bd4565b604051908152f35b346103dd5760006003193601126103dd5760206001600160a01b0360055416604051908152f35b346103dd5760406003193601126103dd576020610d05600435610d56816104de565b60243590613da1565b346103dd5760206003193601126103dd576020610d05600435610d81816104de565b613a7d565b346103dd5760406003193601126103dd57600435610da3816104de565b6105d86105ca6024356001600160a01b03610dc3816004541633146135e7565b610dd1600280541415613658565b60028055610de960ff601054610552828216156136a3565b610e0c61058661057f876001600160a01b0316600052600d602052604060002090565b81610e1686613e3f565b60ff600c54818160081c16610e5f575b16610e3a575b506105a29061059887613a7d565b610e5891610e47916131bd565b610e518488613da1565b10156137f5565b8138610e2c565b610e7c610e6c85856131bd565b610e758b613d34565b10156137aa565b610e26565b346103dd5760006003193601126103dd5760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b346103dd5760006003193601126103dd576020610d05613b2d565b346103dd5760006003193601126103dd5760206001600160a01b0360015416604051908152f35b346103dd5760006003193601126103dd576020600354604051908152f35b346103dd576000806003193601126104b5576001600160a01b038082541633148015610fe2575b610f559061475d565b600554168015610f9e57610f68906144fc565b7f5f641f41e73c4f55fba593ae481b47c890d0adc35281fa76deeb10de56480bb161045d610bfc6005546001600160a01b031690565b606460405162461bcd60e51b815260206004820152601060248201527f5664616d6d206973206e6f7420736574000000000000000000000000000000006044820152fd5b5060065481163314610f4c565b346103dd5760206003193601126103dd576020610d05600435611011816104de565b613e3f565b346103dd5760206003193601126103dd576004356110406001600160a01b03600054163314612f9c565b6101f4811161107a576020817fd6c7508d6658ccee36b7b7d7fd72e5cbaeefb40c64eff24e9ae7470e846304ee92600f55604051908152a1005b606460405162461bcd60e51b815260206004820152601360248201527f52656465656d2066656520746f6f2068696768000000000000000000000000006044820152fd5b346103dd5760206003193601126103dd576004356110f16001600160a01b03806000541633149081156104a7575061475d565b6003546224ea0081018091116108365781116111505761111b906111164282116147ce565b600355565b6003546040519081527fd9703632c23bfa9ca45e36f67185b929717caddcd0ddb04c06130eee290290d69080602081016107c7565b606460405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f7420657874656e64206d6f7265207468616e2034207765656b73006044820152fd5b346103dd5760006003193601126103dd57602060ff601054166040519015158152f35b346103dd576000806003193601126104b5576111de6001600160a01b038254163314612f9c565b6111ec60ff6010541661300d565b8081600a5460089081545b81841061125d578561120c6127108714613576565b61121b60ff1960105416601055565b7f32905e0dae285619d12ba07deb834fd719aee5ea09531b2f99d906aacfd0289e61045d61124b60105460ff1690565b60405190151581529081906020820190565b909192938185101561131d576112e56001918588526112a5877ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee301546001600160a01b031690565b906112d86112d16112c9846001600160a01b0316600052600b602052604060002090565b5461ffff1690565b61ffff1690565b91826112ef575b506131bd565b94019291906111f7565b61131261057f611317926001600160a01b0316600052600d602052604060002090565b613505565b386112df565b611d60565b346103dd5760206003193601126103dd5760043561133f816104de565b7f5f0cf06ea62f0be859e7f3f2b294c348c8e952b5d39b012db62ef6f917d16ae261045d6001600160a01b039260009361137d818654163314612f9c565b61138b60ff6010541661300d565b60405190611398826131e6565b8582526020820190868252604083019087825284168752600b60205261ffff604088209351167fff000000000000000000000000000000000000000000000000000000000000007effffffffffffffffffffffffffffffffffffffffffffffffffffff0000000063ffff00008654955160101b16935160201b1693161717179055610bfc610aff826001600160a01b0316600052600d602052604060002090565b346103dd5760206003193601126103dd577f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c6020600435611479816104de565b6001600160a01b039061149182600054163314612f9c565b168073ffffffffffffffffffffffffffffffffffffffff196006541617600655604051908152a1005b346103dd576000806003193601126104b5576001600160a01b036001541680330361158057807fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c61155b9261151685546001600160a01b031690565b604080516001600160a01b03928316815292909116602083015290a16001600160a01b031673ffffffffffffffffffffffffffffffffffffffff196000541617600055565b61157d73ffffffffffffffffffffffffffffffffffffffff1960015416600155565b80f35b608460405162461bcd60e51b815260206004820152603560248201527f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560448201527f2063616e20616363657074206f776e65727368697000000000000000000000006064820152fd5b346103dd576020806003193601126103dd576004803561160e600280541415613658565b6002805560ff601054611626828260081c1615613e91565b6116336003544211613f02565b60181c16158015611900575b61164890613f4d565b6001600160a01b0392837f0000000000000000000000000000000000000000000000000000000000000000169360409182517f70a0823100000000000000000000000000000000000000000000000000000000908181528281806116be338b83019190916001600160a01b036020820193169052565b03818b5afa90811561064d576116e09187916000916118e3575b501015613f98565b6116e985613840565b8451907f18160ddd000000000000000000000000000000000000000000000000000000008252838289818c5afa90811561064d5761172f926000926118c4575b5061386b565b9461174761173f600f5488613858565b612710900490565b97803b156103dd5785517f7941bc8900000000000000000000000000000000000000000000000000000000815233818a01908152602081019390935291600091839182908490829060400103925af1801561064d576118b1575b5060005b600a548110156118a5576117dd6117d16117be83611d8f565b90546001600160a01b039160031b1c1690565b6001600160a01b031690565b85518381523089820190815291929185908290819060200103818987165afa92831561064d576118436105ca6001958d8c61185c968b600094611862575b50506105ca8361183161183d9461183694613fe3565b613858565b3386613ff0565b8d613858565b906118566000546001600160a01b031690565b90613ff0565b016117a5565b61183d939450916118316118926105ca938561183696903d1061189e575b61188a8183613232565b81019061332e565b9594505091508b61181b565b503d611880565b6118af6001600255565b005b806106416118be92613202565b386117a1565b6118dc919250853d871161189e5761188a8183613232565b9038611729565b6118fa9150853d871161189e5761188a8183613232565b386116d8565b50601154421161163f565b346103dd5760006003193601126103dd5760206040516101f48152f35b346103dd5760006003193601126103dd57602060ff600c5460081c166040519015158152f35b346103dd576000806003193601126104b5576001600160a01b0380825416331461197781612f9c565b6003600052600e6020527fe0283e559c29e31ee7f56467acc9dd307779c843a883aeeb3bf5c6128c9081445460a01c151580611ad0575b6119b790614222565b6003600052600e6020526119eb827fe0283e559c29e31ee7f56467acc9dd307779c843a883aeeb3bf5c6128c9081446108d4565b6003600052600e602052611a42827fe0283e559c29e31ee7f56467acc9dd307779c843a883aeeb3bf5c6128c90814454169173ffffffffffffffffffffffffffffffffffffffff1992836004541617600455612f9c565b60405191611a4f836131ca565b83835260208084018581526003600052600e909152611a8e827fe0283e559c29e31ee7f56467acc9dd307779c843a883aeeb3bf5c6128c90814461097c565b519183549260a01b1691161790557f9436ec76028e8e130b8c3cea256427c80d841d322e696219a98f08f4682dde686040518061045d81906003602083019252565b506003600052600e6020527fe0283e559c29e31ee7f56467acc9dd307779c843a883aeeb3bf5c6128c9081445460a01c4210156119ae565b346103dd5760006003193601126103dd5760206001600160a01b0360005416604051908152f35b346103dd5760006003193601126103dd576020600a54604051908152f35b346103dd5760006003193601126103dd576020600f54604051908152f35b346103dd5760006003193601126103dd5760206040516203f4808152f35b346103dd576000806003193601126104b5576001600160a01b03611bb1818354163314612f9c565b6003546203f480810180911161083657611bcd90421015614405565b6001600052600e6020527fa7c5ba7114a813b50159add3a36832908dc83db71d0b9a24c2ad0f83be9582075460a01c151580611ce5575b611c0d90614222565b6001600052600e602052611c41817fa7c5ba7114a813b50159add3a36832908dc83db71d0b9a24c2ad0f83be9582076108d4565b806005541680611cd6575b506001600052600e6020527fa7c5ba7114a813b50159add3a36832908dc83db71d0b9a24c2ad0f83be9582075416611c8381614647565b73ffffffffffffffffffffffffffffffffffffffff196005541617600555620100007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff601054161760105561157d6142b8565b611cdf906144fc565b38611c4c565b506001600052600e602052611c0d427fa7c5ba7114a813b50159add3a36832908dc83db71d0b9a24c2ad0f83be9582075460a01c11159050611c04565b346103dd5760206003193601126103dd576001600160a01b03600435611d47816104de565b1660005260096020526020604060002054604051908152f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60085481101561131d5760086000527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30190600090565b346103dd5760206003193601126103dd576004356008548110156103dd576001600160a01b0360209160086000527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3015416604051908152f35b346103dd5760206003193601126103dd576020610d05600435611e42816104de565b613d34565b346103dd5760206003193601126103dd576020610d05600435611e69816104de565b613a0b565b6004359060048210156103dd57565b346103dd5760406003193601126103dd57611e96611e6e565b602435611ea2816104de565b6001600160a01b03611eb981600054163314612f9c565b811615611f71577fd708796aca2fe6d225758dc42e7c535719b8750d1a91dfd52eca5b264d2c3d39916107c7611efc6bffffffffffffffffffffffff42166141c0565b611f65611f07613264565b6001600160a01b03861681526bffffffffffffffffffffffff83166020820152611f308561233f565b815160209092015160a01b73ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03909216919091179055565b604051938493846141ec565b606460405162461bcd60e51b815260206004820152601b60248201527f43616e6e6f742070726f706f7365207a65726f206164647265737300000000006044820152fd5b346103dd5760006003193601126103dd5760206001600160a01b0360075416604051908152f35b346103dd576020806003193601126103dd57600435611ffa816104de565b6001600160a01b0361201181600054163314612f9c565b61201f60ff6010541661300d565b6120308261202b6132bc565b6134a0565b6007546001600160a01b03166120488161202b6132f5565b16906040517fd45d15be0000000000000000000000000000000000000000000000000000000080825284828061209960048201907331aa035313b1d2109e61ee0e3662a86a8615ff1d602083019252565b0381875afa91821561064d5785926120b991600091612243575b50613405565b6040519081526001600160a01b038316600482015292839060249082905afa92831561064d577f9504e4dc5e0370990051bb891e8a9cd315d563725236efc1f4df738b663d6992936107c79361211a92600092612226575b50501515613349565b61ffff61213d6112c9836001600160a01b0316600052600b602052604060002090565b161515806121f0575b80612182575b612155906133ba565b610bfc612175826001600160a01b0316600052600d602052604060002090565b600160ff19825416179055565b506121557affffffffffffffffffffffffffffffffffffffffffffffffffffff6121e66121c2846001600160a01b0316600052600b602052604060002090565b5460201c7affffffffffffffffffffffffffffffffffffffffffffffffffffff1690565b161515905061214c565b5061221f6112d1612214836001600160a01b0316600052600b602052604060002090565b5460101c61ffff1690565b1515612146565b61223c9250803d1061189e5761188a8183613232565b3880612111565b61225a9150843d861161189e5761188a8183613232565b386120b3565b346103dd5760206003193601126103dd5760043561227d816104de565b6001600160a01b0361229481600054163314612f9c565b600454918183166122fb571673ffffffffffffffffffffffffffffffffffffffff199190911681176004556040516001600160a01b0390911681527f279ebd85bb1929a1ad9fc59cea33e4e760e7360e31f203d3a120b5b55dd5ea8b9080602081016107c7565b606460405162461bcd60e51b815260206004820152601f60248201527f72657368455448207a6170206164647265737320616c726561647920736574006044820152fd5b600481101561235857600052600e602052604060002090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b346103dd5760206003193601126103dd5760406123aa6123a5611e6e565b61233f565b548151906001600160a01b038116825260a01c6020820152f35b346103dd5760006003193601126103dd57602060ff600c54166040519015158152f35b346103dd5760206003193601126103dd576001600160a01b0360043561240c816104de565b16600052600b60205260606040600020547affffffffffffffffffffffffffffffffffffffffffffffffffffff6040519161ffff80821684528160101c16602084015260201c166040820152f35b346103dd5760206003193601126103dd577fed5dea12a9c03b84574861dc4b72fe16355064ccb384c841b2d69069ba3ee4c56020612496611e6e565b6001600160a01b036124ad81600054163314612f9c565b604051906124ba826131ca565b60008252838201600081526124fe826124d28661233f565b94511684906001600160a01b031673ffffffffffffffffffffffffffffffffffffffff19825416179055565b519073ffffffffffffffffffffffffffffffffffffffff1983549260a01b16911617905561252f60405180926141df565ba1005b346103dd576000806003193601126104b5576125596001600160a01b038254163314612f9c565b7ff8d1ad4d81100d8ebcbef168cd0c1c52fe1cb095be9dcf1587071e77efe1b9ed6020600c547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff61ff0060ff8360081c161560081b1691161780600c5560ff6040519160081c1615158152a180f35b346103dd576000806003193601126104b5576125f86001600160a01b038083541633149081156104a7575061475d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff601054166010557f73f109ff397323e276e38b27fa4bf2a3d7bc07fb71be9fccbcd541e39140ea3f8180a180f35b346103dd576000806003193601126104b5576001600160a01b0361266f818354163314612f9c565b60ff906010906126818383541661300d565b600a5492845b848110612692578580f35b6008805482101561131d57865282817ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3015416906126d4848854163314612f9c565b6126e08386541661300d565b6126ec8261202b6132bc565b836126ff6007546001600160a01b031690565b61270b8161202b6132f5565b16916040908151907fd45d15be0000000000000000000000000000000000000000000000000000000091828152602095600490878380612765858201907331aa035313b1d2109e61ee0e3662a86a8615ff1d602083019252565b0381845afa91821561064d576127ab956127898f948b968896916128e25750613405565b875196879485938493845283019190916001600160a01b036020820193169052565b03915afa92831561064d576127f17f9504e4dc5e0370990051bb891e8a9cd315d563725236efc1f4df738b663d699294612864946001988e926122265750501515613349565b61ffff6128146112c9846001600160a01b0316600052600b602052604060002090565b161515806128b7575b8061286d575b61282c906133ba565b61284c612175836001600160a01b0316600052600d602052604060002090565b516001600160a01b0390911681529081906020820190565b0390a101612687565b5061282c7affffffffffffffffffffffffffffffffffffffffffffffffffffff6128ad6121c2856001600160a01b0316600052600b602052604060002090565b1615159050612823565b506128db6112d1612214846001600160a01b0316600052600b602052604060002090565b151561281d565b61225a9150873d891161189e5761188a8183613232565b346103dd5760006003193601126103dd57602060ff60105460181c166040519015158152f35b346103dd576000806003193601126104b5576001600160a01b0390612948828254163314612f9c565b6003546203f48081018091116108365761296490421015614405565b60008052600e6020527fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c5460a01c151580612cd0575b6129a390614222565b60008052600e6020526129d6827fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c6108d4565b817f000000000000000000000000000000000000000000000000000000000000000016906040928351937fdc6663c700000000000000000000000000000000000000000000000000000000855260209460049086818381888a5af1801561064d57612a4c918691612ca3575b508416301461448b565b60008052600e6020527fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c546001600160a01b031692845b600a54811015612b1c57612a9c6117d16117be83611d8f565b84517f70a0823100000000000000000000000000000000000000000000000000000000815230858201908152909291908a908490819060200103818785165afa801561064d5787612af7926001958b93612afd575b50613ff0565b01612a83565b612b159193508d803d1061189e5761188a8183613232565b9138612af1565b5050909184803b15612c8c5783517f983b2d560000000000000000000000000000000000000000000000000000000081526001600160a01b038316848201908152869082908190602001038183865af1801561064d57612c90575b50803b15612c8c5783517f3092afd500000000000000000000000000000000000000000000000000000000815230848201908152909390869085908190602001038183865af193841561064d578694612c79575b50813b15612c755783612c1995518096819582947fbdacb30300000000000000000000000000000000000000000000000000000000845283019190916001600160a01b036020820193169052565b03925af1801561064d57612c62575b50612c5a6101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff6010541617601055565b61157d614352565b80610641612c6f92613202565b81612c28565b8380fd5b80610641612c8692613202565b86612bcb565b8480fd5b80610641612c9d92613202565b85612b77565b612cc39150883d8a11612cc9575b612cbb8183613232565b810190614476565b38612a42565b503d612cb1565b5060008052600e6020526129a3427fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c5460a01c1115905061299a565b346103dd5760006003193601126103dd5760206001600160a01b0360045416604051908152f35b6024359061ffff821682036103dd57565b6044359061ffff821682036103dd57565b346103dd5760806003193601126103dd57600435612d72816104de565b612d7a612d33565b90612d83612d44565b606435927affffffffffffffffffffffffffffffffffffffffffffffffffffff841684036103dd57612dc16001600160a01b03600054163314612f9c565b612dcf60ff6010541661300d565b61ffff9384831694821690858211612f0b57612e46612e8794612e267f2c8c325a335a0bf8070b6f926d25c7d9dab2af926266d3867246a24a227abb7498612e6a95612710809111159182612f00575b5050613271565b612e3b612e31613255565b61ffff9096168652565b61ffff166020850152565b7affffffffffffffffffffffffffffffffffffffffffffffffffffff166040830152565b610b40836001600160a01b0316600052600b602052604060002090565b612ea4816001600160a01b0316600052600b602052604060002090565b906107c7604051928392839092917affffffffffffffffffffffffffffffffffffffffffffffffffffff6060916001600160a01b0360808501961684525461ffff80821660208601528160101c16604085015260201c16910152565b111590503880612e1f565b608460405162461bcd60e51b815260206004820152602260248201527f43616e6e6f7420736574207461726765742061626f7665206d6178207765696760448201527f68740000000000000000000000000000000000000000000000000000000000006064820152fd5b346103dd5760006003193601126103dd5760206001600160a01b0360065416604051908152f35b15612fa357565b608460405162461bcd60e51b815260206004820152602f60248201527f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726660448201527f6f726d207468697320616374696f6e00000000000000000000000000000000006064820152fd5b1561301457565b608460405162461bcd60e51b815260206004820152603560248201527f4465706f73697473206d75737420626520706175736564206265666f7265207060448201527f6572666f726d696e67207468697320616374696f6e00000000000000000000006064820152fd5b1561308557565b606460405162461bcd60e51b815260206004820152601a60248201527f4c73642068617320616c7265616479206265656e2061646465640000000000006044820152fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6008546801000000000000000081101561316b57600181018060085581101561131d576001600160a01b039060086000527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee301911673ffffffffffffffffffffffffffffffffffffffff19825416179055565b6130c9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9062015180820180921161083657565b906001820180921161083657565b9190820180921161083657565b6040810190811067ffffffffffffffff82111761316b57604052565b6060810190811067ffffffffffffffff82111761316b57604052565b67ffffffffffffffff811161316b57604052565b60a0810190811067ffffffffffffffff82111761316b57604052565b90601f601f19910116810190811067ffffffffffffffff82111761316b57604052565b60405190613262826131e6565b565b60405190613262826131ca565b1561327857565b606460405162461bcd60e51b815260206004820152601960248201527f43616e6e6f7420736574207765696768742061626f76652031000000000000006044820152fd5b604051906132c9826131ca565b600d82527f656e61626c696e67206c73643a000000000000000000000000000000000000006020830152565b60405190613302826131ca565b601082527f6461726b6e657420616464726573733a000000000000000000000000000000006020830152565b908160209103126103dd575190565b6040513d6000823e3d90fd5b1561335057565b608460405162461bcd60e51b815260206004820152602860248201527f436f6e666967757265206c736420696e206461726b6e6574206265666f72652060448201527f656e61626c696e670000000000000000000000000000000000000000000000006064820152fd5b156133c157565b606460405162461bcd60e51b815260206004820152601b60248201527f5365742077656967687473206265666f726520656e61626c696e6700000000006044820152fd5b61326290604051907ff82c50f1000000000000000000000000000000000000000000000000000000006020830152602482015260248152613445816131e6565b600080916020815191016a636f6e736f6c652e6c6f675afa50565b919082519283825260005b84811061348c575050601f19601f8460006020809697860101520116010190565b60208183018101518483018201520161346b565b6134456134f091613262936001600160a01b036040519485937f319af333000000000000000000000000000000000000000000000000000000006020860152604060248601526064850190613460565b9116604483015203601f198101835282613232565b1561350c57565b608460405162461bcd60e51b815260206004820152602e60248201527f4e65656420746f20656e61626c65204c53442077697468206e6f6e2d7a65726f60448201527f20746172676574207765696768740000000000000000000000000000000000006064820152fd5b1561357d57565b608460405162461bcd60e51b815260206004820152602260248201527f546f74616c20746172676574207765696768742073686f756c6420657175616c60448201527f20310000000000000000000000000000000000000000000000000000000000006064820152fd5b156135ee57565b608460405162461bcd60e51b815260206004820152603560248201527f4f6e6c792074686520756e7368657468205a617020636f6e7472616374206d6160448201527f7920706572666f726d207468697320616374696f6e00000000000000000000006064820152fd5b1561365f57565b606460405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b156136aa57565b606460405162461bcd60e51b815260206004820152601360248201527f4465706f736974732061726520706175736564000000000000000000000000006044820152fd5b156136f557565b608460405162461bcd60e51b815260206004820152602660248201527f416c7265616479206d696772617465642c206465706f73697420746f206e657760448201527f207661756c7400000000000000000000000000000000000000000000000000006064820152fd5b1561376657565b606460405162461bcd60e51b815260206004820152600f60248201527f4c53442069732064697361626c656400000000000000000000000000000000006044820152fd5b156137b157565b606460405162461bcd60e51b815260206004820152601c60248201527f4465706f7369742065786365656473206162736f6c75746520636170000000006044820152fd5b156137fc57565b606460405162461bcd60e51b815260206004820152602060248201527f4465706f736974206578636565647320776569676874206261736564206361706044820152fd5b90670de0b6b3a7640000918083029283040361083657565b8181029291811591840414171561083657565b8115613875570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b3d156138df573d9067ffffffffffffffff821161316b57604051916138d36020601f19601f8401160184613232565b82523d6000602084013e565b606090565b908160209103126103dd575180151581036103dd5790565b9091600080949381946040519160208301947f23b872dd0000000000000000000000000000000000000000000000000000000086526001600160a01b03809216602485015216604483015260648201526064815261395981613216565b51925af16139656138a4565b816139dc575b501561397357565b608460405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f464160448201527f494c4544000000000000000000000000000000000000000000000000000000006064820152fd5b80518015925082156139f1575b50503861396b565b613a0492506020809183010191016138e4565b38806139e9565b60206001600160a01b03602481600754169360405194859384927fd45d15be0000000000000000000000000000000000000000000000000000000084521660048301525afa90811561064d57600091613a62575090565b613a7a915060203d811161189e5761188a8183613232565b90565b613a8690613a0b565b6040517f18160ddd0000000000000000000000000000000000000000000000000000000081526020816004816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa90811561064d57600091613b0f575b50613af55790565b613b01613a7a91613840565b613b09613b2d565b9061386b565b613b27915060203d811161189e5761188a8183613232565b38613aed565b613b35613bd4565b670de0b6b3a7640000908082029182040361083657604051907f18160ddd0000000000000000000000000000000000000000000000000000000082526020826004816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa90811561064d57613a7a92600092613bbb575061386b565b6118dc91925060203d811161189e5761188a8183613232565b600080600a54613bf26117d16117d16007546001600160a01b031690565b905b808310613c015750505090565b909192613c106117be85611d8f565b604080517fd45d15be0000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048083019190915260209492939085836024818b5afa94851561064d578693600096613d02575b50517f70a08231000000000000000000000000000000000000000000000000000000008152309181019182529291839182906001600160a01b039082906020015b0392165afa93841561064d57600194613cda94613cd4936105ca93600093613ce3575b5050613858565b906131bd565b93019190613bf4565b613cfa929350803d1061189e5761188a8183613232565b903880613ccd565b849391965091613d29613caa936001600160a01b03963d871161189e5761188a8183613232565b969193945091613c69565b60ff600c5460081c1615613d7c576001600160a01b0316600052600b6020527affffffffffffffffffffffffffffffffffffffffffffffffffffff60406000205460201c1690565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90565b9060ff600c541615613e19576001600160a01b038216600052600b602052670de0b6b3a7640000613de8613de161ffff60406000205460101c1694613a0b565b8093613858565b04613df1613bd4565b90810180911161083657612710613e0e613a7a94613e1493613858565b04613840565b61386b565b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90565b60206001600160a01b03916024604051809481937f70a08231000000000000000000000000000000000000000000000000000000008352306004840152165afa90811561064d57600091613a62575090565b15613e9857565b608460405162461bcd60e51b815260206004820152602760248201527f416c7265616479206d696772617465642c20757365206e6577207661756c742060448201527f746f2065786974000000000000000000000000000000000000000000000000006064820152fd5b15613f0957565b606460405162461bcd60e51b815260206004820152601e60248201527f43616e6e6f74206578697420756e74696c207368616e6768616954696d6500006044820152fd5b15613f5457565b606460405162461bcd60e51b815260206004820152601660248201527f5769746864726177616c732061726520706175736564000000000000000000006044820152fd5b15613f9f57565b606460405162461bcd60e51b815260206004820152601460248201527f496e73756666696369656e7420726573684554480000000000000000000000006044820152fd5b9190820391821161083657565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000060208083019182526001600160a01b03948516602484015260448084019690965294825290929091614047606485613232565b169060405192614056846131ca565b8484527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656485850152823b156140c7576140a2939260009283809351925af161409c6138a4565b9061417c565b805190816140af57505050565b82613262936140c29383010191016138e4565b61410b565b6064856040519062461bcd60e51b82526004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b1561411257565b608460405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b90919015614188575090565b8151156141985750805190602001fd5b6141bc9060405191829162461bcd60e51b8352602060048401526024830190613460565b0390fd5b906203f4806bffffffffffffffffffffffff8093160191821161083657565b9060048210156123585752565b9160409194936001600160a01b036bffffffffffffffffffffffff926142168660608101996141df565b16602085015216910152565b1561422957565b606460405162461bcd60e51b815260206004820152601660248201527f46756e6374696f6e2069732074696d656c6f636b6564000000000000000000006044820152fd5b1561427457565b606460405162461bcd60e51b815260206004820152601760248201527f43616e6e6f7420736574207a65726f20616464726573730000000000000000006044820152fd5b6001600160a01b036142cf81600054163314612f9c565b604051906142dc826131ca565b600082526020820160008152614301826124d26001600052600e602052604060002090565b519073ffffffffffffffffffffffffffffffffffffffff1983549260a01b1691161790557f9436ec76028e8e130b8c3cea256427c80d841d322e696219a98f08f4682dde68602060405160018152a1565b6001600160a01b0361436981600054163314612f9c565b60405190614376826131ca565b60008083526020808401828152918052600e90526143b4827fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c6124d2565b519073ffffffffffffffffffffffffffffffffffffffff1983549260a01b1691161790557f9436ec76028e8e130b8c3cea256427c80d841d322e696219a98f08f4682dde68602060405160008152a1565b1561440c57565b608460405162461bcd60e51b815260206004820152602660248201527f5368616e6768616954696d65202b2054696d656c6f636b20686173206e6f742060448201527f70617373656400000000000000000000000000000000000000000000000000006064820152fd5b908160209103126103dd5751613a7a816104de565b1561449257565b608460405162461bcd60e51b815260206004820152602560248201527f4c53445661756c742063616e6e6f74206368616e67652072657368455448206d60448201527f696e7465720000000000000000000000000000000000000000000000000000006064820152fd5b60005b600a54811015614643576008805482101561131d576000526001600160a01b03817ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee301541660408051906000806020948585017f095ea7b3000000000000000000000000000000000000000000000000000000008152826024966145ae816145a08d8b830160206000919392936001600160a01b0360408201951681520152565b03601f198101835282613232565b51925af16145ba6138a4565b81614613575b50156145d1575050506001016144ff565b60649291601e91519262461bcd60e51b845260048401528201527f5472616e7366657248656c7065723a20415050524f56455f4641494c454400006044820152fd5b8051801592508590831561462b575b505050386145c0565b61463b93508201810191016138e4565b388481614622565b5050565b60005b600a54811015614643576008805482101561131d576000526001600160a01b03817ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee301541660408051906000806020948585017f095ea7b30000000000000000000000000000000000000000000000000000000081528260249661470a816145a08d8b830160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff919392936001600160a01b0360408201951681520152565b51925af16147166138a4565b8161472d575b50156145d15750505060010161464a565b80518015925085908315614745575b5050503861471c565b61475593508201810191016138e4565b38848161473c565b1561476457565b608460405162461bcd60e51b815260206004820152602f60248201527f4f6e6c7920746865206f776e6572206f722061646d696e206d6179207065726660448201527f6f726d207468697320616374696f6e00000000000000000000000000000000006064820152fd5b156147d557565b608460405162461bcd60e51b8152602060048201526024808201527f43616e6e6f74207365742073656e7469656e636554696d6520696e207468652060448201527f70617374000000000000000000000000000000000000000000000000000000006064820152fd5b1561484557565b608460405162461bcd60e51b815260206004820152602860248201527f4e65656420312064617920636f6f6c646f776e206265666f726520706175736960448201527f6e6720616761696e0000000000000000000000000000000000000000000000006064820152fdfea2646970667358221220f87863c7e3bf48e62639d7f107823e8c00deea1893839b5338b1ed09718edb0d64736f6c63430008120033000000000000000000000000e0cb07602f7b3386e91ede8ea8c021024869b7b700000000000000000000000034f969e2c9d7f8bf1e537889949390d4a756270a00000000000000000000000028189ed7ee43aeb65b9adeeb456b2480297221ce0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000ac3e018457b222d93114458476f3e3416abbe38f000000000000000000000000ae78736cd615f374d3085123a210448e74fc63930000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca0000000000000000000000000be9895146f7af43049ca1c1ae358b0541ea49704000000000000000000000000e95a203b1a91a908f9b9ce46459d101078c2c3cb000000000000000000000000f951e335afb289353dc249e82926178eac7ded7800000000000000000000000031aa035313b1d2109e61ee0e3662a86a8615ff1d000000000000000000000000c3d088842dcf02c13699f936bb83dfbbc6f721ab00000000000000000000000048afbbd342f64ef8a9ab1c143719b63c2ad817100000000000000000000000000ae38f7e10a43b5b2fb064b42a2f4514cba909ef000000000000000000000000dcee70654261af21c44c093c300ed3bb97b78192000000000000000000000000b5b29320d2dde5ba5bafa1ebcd270052070483ec000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599
Deployed Bytecode
0x6080604052600436101561001257600080fd5b60003560e01c806302191980146103cd578063083d125c146103c85780630e94895b146103c35780631583913a146103be5780631627540c146103b9578063202a36cd146103b4578063242b7055146103af57806325911ca6146103aa57806326688a1d146103a55780632c678c64146103a05780633088555114610323578063357ce5111461039b57806335c1d70114610396578063392fc2ab1461039157806341976e091461038c57806347e7ef241461038757806348a8ab4a146103825780634b53bbb41461037d57806353a47bb71461037857806356c9c2ea1461037357806357709da01461036e57806359895c8d146103695780635d841af514610364578063602576801461035f57806360da3e831461035a57806363d8882a146103555780636bf4417214610350578063704b6c021461034b57806379ba5097146103465780637f8661a11461034157806381097f261461033c57806383aa478214610337578063872a6a83146103325780638da5cb5b1461032d578063900582e9146103285780639015d37114610323578063965fa21e1461031e5780639b138df7146103195780639bea8fce14610314578063a000f50b146102c9578063a56478ec1461030f578063af4b18741461030a578063b1db8d5614610305578063b61eb0b114610300578063b669de8b146102fb578063bb6398fb146102f6578063c05bfee5146102f1578063c17bae2a146102ec578063c736216a146102e7578063ded517f0146102e2578063e2337b36146102dd578063e23dc21b146102d8578063e4c4be58146102d3578063e81e669d146102ce578063e9046f20146102c9578063e9f2838e146102c4578063ea37c3b5146102bf578063f09565e3146102ba578063f44a5aa9146102b55763f851a440146102b057600080fd5b612f75565b612d55565b612d0c565b61291f565b6128f9565b611d22565b612647565b6125c8565b612532565b61245a565b6123e7565b6123c4565b612387565b612260565b611fdc565b611fb5565b611e7d565b611e47565b611e20565b611dc6565b611b89565b611b6b565b611b4d565b610ca7565b611b2f565b611b08565b61194e565b611928565b61190b565b6115ea565b6114ba565b611439565b611322565b6111b7565b611194565b6110be565b611016565b610fef565b610f25565b610f07565b610ee0565b610ec5565b610e81565b610d86565b610d5f565b610d34565b610d0d565b610cea565b610c81565b610c16565b610a22565b61083b565b6106f1565b610670565b610652565b6104ef565b6104b8565b6103e2565b60009103126103dd57565b600080fd5b346103dd576000806003193601126104b5576104136001600160a01b038083541633149081156104a7575b5061475d565b60105460ff81166104635760ff1960019116176010557f32905e0dae285619d12ba07deb834fd719aee5ea09531b2f99d906aacfd0289e6040518061045d81906001602083019252565b0390a180f35b606460405162461bcd60e51b815260206004820152600e60248201527f416c7265616479207061757365640000000000000000000000000000000000006044820152fd5b90506006541633143861040d565b80fd5b346103dd5760006003193601126103dd57602060ff60105460101c166040519015158152f35b6001600160a01b038116036103dd57565b346103dd5760406003193601126103dd5760043561050c816104de565b6105d86105ca6024356001600160a01b0361052c816004541633146135e7565b61053a600280541415613658565b6002805561055c60ff601054610552828216156136a3565b60081c16156136ee565b61058b61058661057f876001600160a01b0316600052600d602052604060002090565b5460ff1690565b61375f565b6105a28261059887613a7d565b96309033906138fc565b7f00000000000000000000000028189ed7ee43aeb65b9adeeb456b2480297221ce1693613858565b670de0b6b3a7640000900490565b90803b156103dd576040517f6a257ebc00000000000000000000000000000000000000000000000000000000815233600482015260248101839052906000908290604490829084905af1801561064d57610634575b6001600255005b8061064161064792613202565b806103d2565b8061062d565b61333d565b346103dd5760006003193601126103dd576020601154604051908152f35b346103dd5760206003193601126103dd577f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2260206004356106b0816104de565b6001600160a01b03906106c882600054163314612f9c565b168073ffffffffffffffffffffffffffffffffffffffff196001541617600155604051908152a1005b346103dd5760206003193601126103dd576004356107246001600160a01b03806000541633149081156104a7575061475d565b6203f4804201804211610836576202a30042019081116108365781116107cc576107639061075e61075660115461319f565b42101561483e565b601155565b61079663010000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff6010541617601055565b6011546040519081527ff4f3231af9b3395333147b242229c61347b92aadd25f9760b503d04e50b5cd909080602081015b0390a1005b608460405162461bcd60e51b815260206004820152602160248201527f43616e6e6f74207061757365207769746864726177616c7320746f6f206c6f6e60448201527f67000000000000000000000000000000000000000000000000000000000000006064820152fd5b613170565b346103dd576000806003193601126104b5576001600160a01b0380825416331461086481612f9c565b6002600052600e6020527f9adb202b1492743bc00c81d33cdc6423fa8c79109027eb6a845391e8fc1f04815460a01c1515806109ea575b6108a490614222565b6002600052600e6020526108dd827f9adb202b1492743bc00c81d33cdc6423fa8c79109027eb6a845391e8fc1f04815b5416151561426d565b6002600052600e602052610934827f9adb202b1492743bc00c81d33cdc6423fa8c79109027eb6a845391e8fc1f048154169173ffffffffffffffffffffffffffffffffffffffff1992836007541617600755612f9c565b60405191610941836131ca565b83835260208084018581526002600052600e9091526109a8827f9adb202b1492743bc00c81d33cdc6423fa8c79109027eb6a845391e8fc1f04815b95511685906001600160a01b031673ffffffffffffffffffffffffffffffffffffffff19825416179055565b519183549260a01b1691161790557f9436ec76028e8e130b8c3cea256427c80d841d322e696219a98f08f4682dde686040518061045d81906002602083019252565b506002600052600e6020527f9adb202b1492743bc00c81d33cdc6423fa8c79109027eb6a845391e8fc1f04815460a01c42101561089b565b346103dd5760206003193601126103dd57600435610a3f816104de565b7fe5b3d6de4d7a3162af7ca9115e3e57964a3c605b53efa503cfcba6dd9ceb9e3c61045d6001600160a01b0392600093610a7d818654163314612f9c565b610a8b60ff6010541661300d565b811684526009602052610aa260408520541561307e565b610aab816130f8565b610abe610ab9600a546131af565b600a55565b600a54610ade826001600160a01b03166000526009602052604060002090565b55610b09610aff826001600160a01b0316600052600d602052604060002090565b60ff198154169055565b610bfc610b14613255565b858152856020820152856040820152610b40836001600160a01b0316600052600b602052604060002090565b9061ffff81511690825491807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000084161784557fff000000000000000000000000000000000000000000000000000000000000007effffffffffffffffffffffffffffffffffffffffffffffffffffff00000000604063ffff0000602086015160101b169485857fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000891617178855015160201b1693161717179055565b6040516001600160a01b0390911681529081906020820190565b346103dd576000806003193601126104b557610c3d6001600160a01b038254163314612f9c565b7fb26c39d6b5cbedf5e765f9a18e1c4b238f0811e3a0d3f19818f5bb2c5cd4fff9602060ff19600c5460ff80821615169182911617600c556040519015158152a180f35b346103dd5760006003193601126103dd57602060ff60105460081c166040519015158152f35b346103dd5760206003193601126103dd576001600160a01b03600435610ccc816104de565b16600052600d602052602060ff604060002054166040519015158152f35b346103dd5760006003193601126103dd576020610d05613bd4565b604051908152f35b346103dd5760006003193601126103dd5760206001600160a01b0360055416604051908152f35b346103dd5760406003193601126103dd576020610d05600435610d56816104de565b60243590613da1565b346103dd5760206003193601126103dd576020610d05600435610d81816104de565b613a7d565b346103dd5760406003193601126103dd57600435610da3816104de565b6105d86105ca6024356001600160a01b03610dc3816004541633146135e7565b610dd1600280541415613658565b60028055610de960ff601054610552828216156136a3565b610e0c61058661057f876001600160a01b0316600052600d602052604060002090565b81610e1686613e3f565b60ff600c54818160081c16610e5f575b16610e3a575b506105a29061059887613a7d565b610e5891610e47916131bd565b610e518488613da1565b10156137f5565b8138610e2c565b610e7c610e6c85856131bd565b610e758b613d34565b10156137aa565b610e26565b346103dd5760006003193601126103dd5760206040516001600160a01b037f00000000000000000000000028189ed7ee43aeb65b9adeeb456b2480297221ce168152f35b346103dd5760006003193601126103dd576020610d05613b2d565b346103dd5760006003193601126103dd5760206001600160a01b0360015416604051908152f35b346103dd5760006003193601126103dd576020600354604051908152f35b346103dd576000806003193601126104b5576001600160a01b038082541633148015610fe2575b610f559061475d565b600554168015610f9e57610f68906144fc565b7f5f641f41e73c4f55fba593ae481b47c890d0adc35281fa76deeb10de56480bb161045d610bfc6005546001600160a01b031690565b606460405162461bcd60e51b815260206004820152601060248201527f5664616d6d206973206e6f7420736574000000000000000000000000000000006044820152fd5b5060065481163314610f4c565b346103dd5760206003193601126103dd576020610d05600435611011816104de565b613e3f565b346103dd5760206003193601126103dd576004356110406001600160a01b03600054163314612f9c565b6101f4811161107a576020817fd6c7508d6658ccee36b7b7d7fd72e5cbaeefb40c64eff24e9ae7470e846304ee92600f55604051908152a1005b606460405162461bcd60e51b815260206004820152601360248201527f52656465656d2066656520746f6f2068696768000000000000000000000000006044820152fd5b346103dd5760206003193601126103dd576004356110f16001600160a01b03806000541633149081156104a7575061475d565b6003546224ea0081018091116108365781116111505761111b906111164282116147ce565b600355565b6003546040519081527fd9703632c23bfa9ca45e36f67185b929717caddcd0ddb04c06130eee290290d69080602081016107c7565b606460405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f7420657874656e64206d6f7265207468616e2034207765656b73006044820152fd5b346103dd5760006003193601126103dd57602060ff601054166040519015158152f35b346103dd576000806003193601126104b5576111de6001600160a01b038254163314612f9c565b6111ec60ff6010541661300d565b8081600a5460089081545b81841061125d578561120c6127108714613576565b61121b60ff1960105416601055565b7f32905e0dae285619d12ba07deb834fd719aee5ea09531b2f99d906aacfd0289e61045d61124b60105460ff1690565b60405190151581529081906020820190565b909192938185101561131d576112e56001918588526112a5877ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee301546001600160a01b031690565b906112d86112d16112c9846001600160a01b0316600052600b602052604060002090565b5461ffff1690565b61ffff1690565b91826112ef575b506131bd565b94019291906111f7565b61131261057f611317926001600160a01b0316600052600d602052604060002090565b613505565b386112df565b611d60565b346103dd5760206003193601126103dd5760043561133f816104de565b7f5f0cf06ea62f0be859e7f3f2b294c348c8e952b5d39b012db62ef6f917d16ae261045d6001600160a01b039260009361137d818654163314612f9c565b61138b60ff6010541661300d565b60405190611398826131e6565b8582526020820190868252604083019087825284168752600b60205261ffff604088209351167fff000000000000000000000000000000000000000000000000000000000000007effffffffffffffffffffffffffffffffffffffffffffffffffffff0000000063ffff00008654955160101b16935160201b1693161717179055610bfc610aff826001600160a01b0316600052600d602052604060002090565b346103dd5760206003193601126103dd577f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c6020600435611479816104de565b6001600160a01b039061149182600054163314612f9c565b168073ffffffffffffffffffffffffffffffffffffffff196006541617600655604051908152a1005b346103dd576000806003193601126104b5576001600160a01b036001541680330361158057807fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c61155b9261151685546001600160a01b031690565b604080516001600160a01b03928316815292909116602083015290a16001600160a01b031673ffffffffffffffffffffffffffffffffffffffff196000541617600055565b61157d73ffffffffffffffffffffffffffffffffffffffff1960015416600155565b80f35b608460405162461bcd60e51b815260206004820152603560248201527f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560448201527f2063616e20616363657074206f776e65727368697000000000000000000000006064820152fd5b346103dd576020806003193601126103dd576004803561160e600280541415613658565b6002805560ff601054611626828260081c1615613e91565b6116336003544211613f02565b60181c16158015611900575b61164890613f4d565b6001600160a01b0392837f00000000000000000000000028189ed7ee43aeb65b9adeeb456b2480297221ce169360409182517f70a0823100000000000000000000000000000000000000000000000000000000908181528281806116be338b83019190916001600160a01b036020820193169052565b03818b5afa90811561064d576116e09187916000916118e3575b501015613f98565b6116e985613840565b8451907f18160ddd000000000000000000000000000000000000000000000000000000008252838289818c5afa90811561064d5761172f926000926118c4575b5061386b565b9461174761173f600f5488613858565b612710900490565b97803b156103dd5785517f7941bc8900000000000000000000000000000000000000000000000000000000815233818a01908152602081019390935291600091839182908490829060400103925af1801561064d576118b1575b5060005b600a548110156118a5576117dd6117d16117be83611d8f565b90546001600160a01b039160031b1c1690565b6001600160a01b031690565b85518381523089820190815291929185908290819060200103818987165afa92831561064d576118436105ca6001958d8c61185c968b600094611862575b50506105ca8361183161183d9461183694613fe3565b613858565b3386613ff0565b8d613858565b906118566000546001600160a01b031690565b90613ff0565b016117a5565b61183d939450916118316118926105ca938561183696903d1061189e575b61188a8183613232565b81019061332e565b9594505091508b61181b565b503d611880565b6118af6001600255565b005b806106416118be92613202565b386117a1565b6118dc919250853d871161189e5761188a8183613232565b9038611729565b6118fa9150853d871161189e5761188a8183613232565b386116d8565b50601154421161163f565b346103dd5760006003193601126103dd5760206040516101f48152f35b346103dd5760006003193601126103dd57602060ff600c5460081c166040519015158152f35b346103dd576000806003193601126104b5576001600160a01b0380825416331461197781612f9c565b6003600052600e6020527fe0283e559c29e31ee7f56467acc9dd307779c843a883aeeb3bf5c6128c9081445460a01c151580611ad0575b6119b790614222565b6003600052600e6020526119eb827fe0283e559c29e31ee7f56467acc9dd307779c843a883aeeb3bf5c6128c9081446108d4565b6003600052600e602052611a42827fe0283e559c29e31ee7f56467acc9dd307779c843a883aeeb3bf5c6128c90814454169173ffffffffffffffffffffffffffffffffffffffff1992836004541617600455612f9c565b60405191611a4f836131ca565b83835260208084018581526003600052600e909152611a8e827fe0283e559c29e31ee7f56467acc9dd307779c843a883aeeb3bf5c6128c90814461097c565b519183549260a01b1691161790557f9436ec76028e8e130b8c3cea256427c80d841d322e696219a98f08f4682dde686040518061045d81906003602083019252565b506003600052600e6020527fe0283e559c29e31ee7f56467acc9dd307779c843a883aeeb3bf5c6128c9081445460a01c4210156119ae565b346103dd5760006003193601126103dd5760206001600160a01b0360005416604051908152f35b346103dd5760006003193601126103dd576020600a54604051908152f35b346103dd5760006003193601126103dd576020600f54604051908152f35b346103dd5760006003193601126103dd5760206040516203f4808152f35b346103dd576000806003193601126104b5576001600160a01b03611bb1818354163314612f9c565b6003546203f480810180911161083657611bcd90421015614405565b6001600052600e6020527fa7c5ba7114a813b50159add3a36832908dc83db71d0b9a24c2ad0f83be9582075460a01c151580611ce5575b611c0d90614222565b6001600052600e602052611c41817fa7c5ba7114a813b50159add3a36832908dc83db71d0b9a24c2ad0f83be9582076108d4565b806005541680611cd6575b506001600052600e6020527fa7c5ba7114a813b50159add3a36832908dc83db71d0b9a24c2ad0f83be9582075416611c8381614647565b73ffffffffffffffffffffffffffffffffffffffff196005541617600555620100007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff601054161760105561157d6142b8565b611cdf906144fc565b38611c4c565b506001600052600e602052611c0d427fa7c5ba7114a813b50159add3a36832908dc83db71d0b9a24c2ad0f83be9582075460a01c11159050611c04565b346103dd5760206003193601126103dd576001600160a01b03600435611d47816104de565b1660005260096020526020604060002054604051908152f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60085481101561131d5760086000527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30190600090565b346103dd5760206003193601126103dd576004356008548110156103dd576001600160a01b0360209160086000527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3015416604051908152f35b346103dd5760206003193601126103dd576020610d05600435611e42816104de565b613d34565b346103dd5760206003193601126103dd576020610d05600435611e69816104de565b613a0b565b6004359060048210156103dd57565b346103dd5760406003193601126103dd57611e96611e6e565b602435611ea2816104de565b6001600160a01b03611eb981600054163314612f9c565b811615611f71577fd708796aca2fe6d225758dc42e7c535719b8750d1a91dfd52eca5b264d2c3d39916107c7611efc6bffffffffffffffffffffffff42166141c0565b611f65611f07613264565b6001600160a01b03861681526bffffffffffffffffffffffff83166020820152611f308561233f565b815160209092015160a01b73ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03909216919091179055565b604051938493846141ec565b606460405162461bcd60e51b815260206004820152601b60248201527f43616e6e6f742070726f706f7365207a65726f206164647265737300000000006044820152fd5b346103dd5760006003193601126103dd5760206001600160a01b0360075416604051908152f35b346103dd576020806003193601126103dd57600435611ffa816104de565b6001600160a01b0361201181600054163314612f9c565b61201f60ff6010541661300d565b6120308261202b6132bc565b6134a0565b6007546001600160a01b03166120488161202b6132f5565b16906040517fd45d15be0000000000000000000000000000000000000000000000000000000080825284828061209960048201907331aa035313b1d2109e61ee0e3662a86a8615ff1d602083019252565b0381875afa91821561064d5785926120b991600091612243575b50613405565b6040519081526001600160a01b038316600482015292839060249082905afa92831561064d577f9504e4dc5e0370990051bb891e8a9cd315d563725236efc1f4df738b663d6992936107c79361211a92600092612226575b50501515613349565b61ffff61213d6112c9836001600160a01b0316600052600b602052604060002090565b161515806121f0575b80612182575b612155906133ba565b610bfc612175826001600160a01b0316600052600d602052604060002090565b600160ff19825416179055565b506121557affffffffffffffffffffffffffffffffffffffffffffffffffffff6121e66121c2846001600160a01b0316600052600b602052604060002090565b5460201c7affffffffffffffffffffffffffffffffffffffffffffffffffffff1690565b161515905061214c565b5061221f6112d1612214836001600160a01b0316600052600b602052604060002090565b5460101c61ffff1690565b1515612146565b61223c9250803d1061189e5761188a8183613232565b3880612111565b61225a9150843d861161189e5761188a8183613232565b386120b3565b346103dd5760206003193601126103dd5760043561227d816104de565b6001600160a01b0361229481600054163314612f9c565b600454918183166122fb571673ffffffffffffffffffffffffffffffffffffffff199190911681176004556040516001600160a01b0390911681527f279ebd85bb1929a1ad9fc59cea33e4e760e7360e31f203d3a120b5b55dd5ea8b9080602081016107c7565b606460405162461bcd60e51b815260206004820152601f60248201527f72657368455448207a6170206164647265737320616c726561647920736574006044820152fd5b600481101561235857600052600e602052604060002090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b346103dd5760206003193601126103dd5760406123aa6123a5611e6e565b61233f565b548151906001600160a01b038116825260a01c6020820152f35b346103dd5760006003193601126103dd57602060ff600c54166040519015158152f35b346103dd5760206003193601126103dd576001600160a01b0360043561240c816104de565b16600052600b60205260606040600020547affffffffffffffffffffffffffffffffffffffffffffffffffffff6040519161ffff80821684528160101c16602084015260201c166040820152f35b346103dd5760206003193601126103dd577fed5dea12a9c03b84574861dc4b72fe16355064ccb384c841b2d69069ba3ee4c56020612496611e6e565b6001600160a01b036124ad81600054163314612f9c565b604051906124ba826131ca565b60008252838201600081526124fe826124d28661233f565b94511684906001600160a01b031673ffffffffffffffffffffffffffffffffffffffff19825416179055565b519073ffffffffffffffffffffffffffffffffffffffff1983549260a01b16911617905561252f60405180926141df565ba1005b346103dd576000806003193601126104b5576125596001600160a01b038254163314612f9c565b7ff8d1ad4d81100d8ebcbef168cd0c1c52fe1cb095be9dcf1587071e77efe1b9ed6020600c547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff61ff0060ff8360081c161560081b1691161780600c5560ff6040519160081c1615158152a180f35b346103dd576000806003193601126104b5576125f86001600160a01b038083541633149081156104a7575061475d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff601054166010557f73f109ff397323e276e38b27fa4bf2a3d7bc07fb71be9fccbcd541e39140ea3f8180a180f35b346103dd576000806003193601126104b5576001600160a01b0361266f818354163314612f9c565b60ff906010906126818383541661300d565b600a5492845b848110612692578580f35b6008805482101561131d57865282817ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3015416906126d4848854163314612f9c565b6126e08386541661300d565b6126ec8261202b6132bc565b836126ff6007546001600160a01b031690565b61270b8161202b6132f5565b16916040908151907fd45d15be0000000000000000000000000000000000000000000000000000000091828152602095600490878380612765858201907331aa035313b1d2109e61ee0e3662a86a8615ff1d602083019252565b0381845afa91821561064d576127ab956127898f948b968896916128e25750613405565b875196879485938493845283019190916001600160a01b036020820193169052565b03915afa92831561064d576127f17f9504e4dc5e0370990051bb891e8a9cd315d563725236efc1f4df738b663d699294612864946001988e926122265750501515613349565b61ffff6128146112c9846001600160a01b0316600052600b602052604060002090565b161515806128b7575b8061286d575b61282c906133ba565b61284c612175836001600160a01b0316600052600d602052604060002090565b516001600160a01b0390911681529081906020820190565b0390a101612687565b5061282c7affffffffffffffffffffffffffffffffffffffffffffffffffffff6128ad6121c2856001600160a01b0316600052600b602052604060002090565b1615159050612823565b506128db6112d1612214846001600160a01b0316600052600b602052604060002090565b151561281d565b61225a9150873d891161189e5761188a8183613232565b346103dd5760006003193601126103dd57602060ff60105460181c166040519015158152f35b346103dd576000806003193601126104b5576001600160a01b0390612948828254163314612f9c565b6003546203f48081018091116108365761296490421015614405565b60008052600e6020527fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c5460a01c151580612cd0575b6129a390614222565b60008052600e6020526129d6827fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c6108d4565b817f00000000000000000000000028189ed7ee43aeb65b9adeeb456b2480297221ce16906040928351937fdc6663c700000000000000000000000000000000000000000000000000000000855260209460049086818381888a5af1801561064d57612a4c918691612ca3575b508416301461448b565b60008052600e6020527fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c546001600160a01b031692845b600a54811015612b1c57612a9c6117d16117be83611d8f565b84517f70a0823100000000000000000000000000000000000000000000000000000000815230858201908152909291908a908490819060200103818785165afa801561064d5787612af7926001958b93612afd575b50613ff0565b01612a83565b612b159193508d803d1061189e5761188a8183613232565b9138612af1565b5050909184803b15612c8c5783517f983b2d560000000000000000000000000000000000000000000000000000000081526001600160a01b038316848201908152869082908190602001038183865af1801561064d57612c90575b50803b15612c8c5783517f3092afd500000000000000000000000000000000000000000000000000000000815230848201908152909390869085908190602001038183865af193841561064d578694612c79575b50813b15612c755783612c1995518096819582947fbdacb30300000000000000000000000000000000000000000000000000000000845283019190916001600160a01b036020820193169052565b03925af1801561064d57612c62575b50612c5a6101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff6010541617601055565b61157d614352565b80610641612c6f92613202565b81612c28565b8380fd5b80610641612c8692613202565b86612bcb565b8480fd5b80610641612c9d92613202565b85612b77565b612cc39150883d8a11612cc9575b612cbb8183613232565b810190614476565b38612a42565b503d612cb1565b5060008052600e6020526129a3427fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c5460a01c1115905061299a565b346103dd5760006003193601126103dd5760206001600160a01b0360045416604051908152f35b6024359061ffff821682036103dd57565b6044359061ffff821682036103dd57565b346103dd5760806003193601126103dd57600435612d72816104de565b612d7a612d33565b90612d83612d44565b606435927affffffffffffffffffffffffffffffffffffffffffffffffffffff841684036103dd57612dc16001600160a01b03600054163314612f9c565b612dcf60ff6010541661300d565b61ffff9384831694821690858211612f0b57612e46612e8794612e267f2c8c325a335a0bf8070b6f926d25c7d9dab2af926266d3867246a24a227abb7498612e6a95612710809111159182612f00575b5050613271565b612e3b612e31613255565b61ffff9096168652565b61ffff166020850152565b7affffffffffffffffffffffffffffffffffffffffffffffffffffff166040830152565b610b40836001600160a01b0316600052600b602052604060002090565b612ea4816001600160a01b0316600052600b602052604060002090565b906107c7604051928392839092917affffffffffffffffffffffffffffffffffffffffffffffffffffff6060916001600160a01b0360808501961684525461ffff80821660208601528160101c16604085015260201c16910152565b111590503880612e1f565b608460405162461bcd60e51b815260206004820152602260248201527f43616e6e6f7420736574207461726765742061626f7665206d6178207765696760448201527f68740000000000000000000000000000000000000000000000000000000000006064820152fd5b346103dd5760006003193601126103dd5760206001600160a01b0360065416604051908152f35b15612fa357565b608460405162461bcd60e51b815260206004820152602f60248201527f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726660448201527f6f726d207468697320616374696f6e00000000000000000000000000000000006064820152fd5b1561301457565b608460405162461bcd60e51b815260206004820152603560248201527f4465706f73697473206d75737420626520706175736564206265666f7265207060448201527f6572666f726d696e67207468697320616374696f6e00000000000000000000006064820152fd5b1561308557565b606460405162461bcd60e51b815260206004820152601a60248201527f4c73642068617320616c7265616479206265656e2061646465640000000000006044820152fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6008546801000000000000000081101561316b57600181018060085581101561131d576001600160a01b039060086000527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee301911673ffffffffffffffffffffffffffffffffffffffff19825416179055565b6130c9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9062015180820180921161083657565b906001820180921161083657565b9190820180921161083657565b6040810190811067ffffffffffffffff82111761316b57604052565b6060810190811067ffffffffffffffff82111761316b57604052565b67ffffffffffffffff811161316b57604052565b60a0810190811067ffffffffffffffff82111761316b57604052565b90601f601f19910116810190811067ffffffffffffffff82111761316b57604052565b60405190613262826131e6565b565b60405190613262826131ca565b1561327857565b606460405162461bcd60e51b815260206004820152601960248201527f43616e6e6f7420736574207765696768742061626f76652031000000000000006044820152fd5b604051906132c9826131ca565b600d82527f656e61626c696e67206c73643a000000000000000000000000000000000000006020830152565b60405190613302826131ca565b601082527f6461726b6e657420616464726573733a000000000000000000000000000000006020830152565b908160209103126103dd575190565b6040513d6000823e3d90fd5b1561335057565b608460405162461bcd60e51b815260206004820152602860248201527f436f6e666967757265206c736420696e206461726b6e6574206265666f72652060448201527f656e61626c696e670000000000000000000000000000000000000000000000006064820152fd5b156133c157565b606460405162461bcd60e51b815260206004820152601b60248201527f5365742077656967687473206265666f726520656e61626c696e6700000000006044820152fd5b61326290604051907ff82c50f1000000000000000000000000000000000000000000000000000000006020830152602482015260248152613445816131e6565b600080916020815191016a636f6e736f6c652e6c6f675afa50565b919082519283825260005b84811061348c575050601f19601f8460006020809697860101520116010190565b60208183018101518483018201520161346b565b6134456134f091613262936001600160a01b036040519485937f319af333000000000000000000000000000000000000000000000000000000006020860152604060248601526064850190613460565b9116604483015203601f198101835282613232565b1561350c57565b608460405162461bcd60e51b815260206004820152602e60248201527f4e65656420746f20656e61626c65204c53442077697468206e6f6e2d7a65726f60448201527f20746172676574207765696768740000000000000000000000000000000000006064820152fd5b1561357d57565b608460405162461bcd60e51b815260206004820152602260248201527f546f74616c20746172676574207765696768742073686f756c6420657175616c60448201527f20310000000000000000000000000000000000000000000000000000000000006064820152fd5b156135ee57565b608460405162461bcd60e51b815260206004820152603560248201527f4f6e6c792074686520756e7368657468205a617020636f6e7472616374206d6160448201527f7920706572666f726d207468697320616374696f6e00000000000000000000006064820152fd5b1561365f57565b606460405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b156136aa57565b606460405162461bcd60e51b815260206004820152601360248201527f4465706f736974732061726520706175736564000000000000000000000000006044820152fd5b156136f557565b608460405162461bcd60e51b815260206004820152602660248201527f416c7265616479206d696772617465642c206465706f73697420746f206e657760448201527f207661756c7400000000000000000000000000000000000000000000000000006064820152fd5b1561376657565b606460405162461bcd60e51b815260206004820152600f60248201527f4c53442069732064697361626c656400000000000000000000000000000000006044820152fd5b156137b157565b606460405162461bcd60e51b815260206004820152601c60248201527f4465706f7369742065786365656473206162736f6c75746520636170000000006044820152fd5b156137fc57565b606460405162461bcd60e51b815260206004820152602060248201527f4465706f736974206578636565647320776569676874206261736564206361706044820152fd5b90670de0b6b3a7640000918083029283040361083657565b8181029291811591840414171561083657565b8115613875570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b3d156138df573d9067ffffffffffffffff821161316b57604051916138d36020601f19601f8401160184613232565b82523d6000602084013e565b606090565b908160209103126103dd575180151581036103dd5790565b9091600080949381946040519160208301947f23b872dd0000000000000000000000000000000000000000000000000000000086526001600160a01b03809216602485015216604483015260648201526064815261395981613216565b51925af16139656138a4565b816139dc575b501561397357565b608460405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f464160448201527f494c4544000000000000000000000000000000000000000000000000000000006064820152fd5b80518015925082156139f1575b50503861396b565b613a0492506020809183010191016138e4565b38806139e9565b60206001600160a01b03602481600754169360405194859384927fd45d15be0000000000000000000000000000000000000000000000000000000084521660048301525afa90811561064d57600091613a62575090565b613a7a915060203d811161189e5761188a8183613232565b90565b613a8690613a0b565b6040517f18160ddd0000000000000000000000000000000000000000000000000000000081526020816004816001600160a01b037f00000000000000000000000028189ed7ee43aeb65b9adeeb456b2480297221ce165afa90811561064d57600091613b0f575b50613af55790565b613b01613a7a91613840565b613b09613b2d565b9061386b565b613b27915060203d811161189e5761188a8183613232565b38613aed565b613b35613bd4565b670de0b6b3a7640000908082029182040361083657604051907f18160ddd0000000000000000000000000000000000000000000000000000000082526020826004816001600160a01b037f00000000000000000000000028189ed7ee43aeb65b9adeeb456b2480297221ce165afa90811561064d57613a7a92600092613bbb575061386b565b6118dc91925060203d811161189e5761188a8183613232565b600080600a54613bf26117d16117d16007546001600160a01b031690565b905b808310613c015750505090565b909192613c106117be85611d8f565b604080517fd45d15be0000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048083019190915260209492939085836024818b5afa94851561064d578693600096613d02575b50517f70a08231000000000000000000000000000000000000000000000000000000008152309181019182529291839182906001600160a01b039082906020015b0392165afa93841561064d57600194613cda94613cd4936105ca93600093613ce3575b5050613858565b906131bd565b93019190613bf4565b613cfa929350803d1061189e5761188a8183613232565b903880613ccd565b849391965091613d29613caa936001600160a01b03963d871161189e5761188a8183613232565b969193945091613c69565b60ff600c5460081c1615613d7c576001600160a01b0316600052600b6020527affffffffffffffffffffffffffffffffffffffffffffffffffffff60406000205460201c1690565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90565b9060ff600c541615613e19576001600160a01b038216600052600b602052670de0b6b3a7640000613de8613de161ffff60406000205460101c1694613a0b565b8093613858565b04613df1613bd4565b90810180911161083657612710613e0e613a7a94613e1493613858565b04613840565b61386b565b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90565b60206001600160a01b03916024604051809481937f70a08231000000000000000000000000000000000000000000000000000000008352306004840152165afa90811561064d57600091613a62575090565b15613e9857565b608460405162461bcd60e51b815260206004820152602760248201527f416c7265616479206d696772617465642c20757365206e6577207661756c742060448201527f746f2065786974000000000000000000000000000000000000000000000000006064820152fd5b15613f0957565b606460405162461bcd60e51b815260206004820152601e60248201527f43616e6e6f74206578697420756e74696c207368616e6768616954696d6500006044820152fd5b15613f5457565b606460405162461bcd60e51b815260206004820152601660248201527f5769746864726177616c732061726520706175736564000000000000000000006044820152fd5b15613f9f57565b606460405162461bcd60e51b815260206004820152601460248201527f496e73756666696369656e7420726573684554480000000000000000000000006044820152fd5b9190820391821161083657565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000060208083019182526001600160a01b03948516602484015260448084019690965294825290929091614047606485613232565b169060405192614056846131ca565b8484527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656485850152823b156140c7576140a2939260009283809351925af161409c6138a4565b9061417c565b805190816140af57505050565b82613262936140c29383010191016138e4565b61410b565b6064856040519062461bcd60e51b82526004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b1561411257565b608460405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b90919015614188575090565b8151156141985750805190602001fd5b6141bc9060405191829162461bcd60e51b8352602060048401526024830190613460565b0390fd5b906203f4806bffffffffffffffffffffffff8093160191821161083657565b9060048210156123585752565b9160409194936001600160a01b036bffffffffffffffffffffffff926142168660608101996141df565b16602085015216910152565b1561422957565b606460405162461bcd60e51b815260206004820152601660248201527f46756e6374696f6e2069732074696d656c6f636b6564000000000000000000006044820152fd5b1561427457565b606460405162461bcd60e51b815260206004820152601760248201527f43616e6e6f7420736574207a65726f20616464726573730000000000000000006044820152fd5b6001600160a01b036142cf81600054163314612f9c565b604051906142dc826131ca565b600082526020820160008152614301826124d26001600052600e602052604060002090565b519073ffffffffffffffffffffffffffffffffffffffff1983549260a01b1691161790557f9436ec76028e8e130b8c3cea256427c80d841d322e696219a98f08f4682dde68602060405160018152a1565b6001600160a01b0361436981600054163314612f9c565b60405190614376826131ca565b60008083526020808401828152918052600e90526143b4827fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c6124d2565b519073ffffffffffffffffffffffffffffffffffffffff1983549260a01b1691161790557f9436ec76028e8e130b8c3cea256427c80d841d322e696219a98f08f4682dde68602060405160008152a1565b1561440c57565b608460405162461bcd60e51b815260206004820152602660248201527f5368616e6768616954696d65202b2054696d656c6f636b20686173206e6f742060448201527f70617373656400000000000000000000000000000000000000000000000000006064820152fd5b908160209103126103dd5751613a7a816104de565b1561449257565b608460405162461bcd60e51b815260206004820152602560248201527f4c53445661756c742063616e6e6f74206368616e67652072657368455448206d60448201527f696e7465720000000000000000000000000000000000000000000000000000006064820152fd5b60005b600a54811015614643576008805482101561131d576000526001600160a01b03817ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee301541660408051906000806020948585017f095ea7b3000000000000000000000000000000000000000000000000000000008152826024966145ae816145a08d8b830160206000919392936001600160a01b0360408201951681520152565b03601f198101835282613232565b51925af16145ba6138a4565b81614613575b50156145d1575050506001016144ff565b60649291601e91519262461bcd60e51b845260048401528201527f5472616e7366657248656c7065723a20415050524f56455f4641494c454400006044820152fd5b8051801592508590831561462b575b505050386145c0565b61463b93508201810191016138e4565b388481614622565b5050565b60005b600a54811015614643576008805482101561131d576000526001600160a01b03817ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee301541660408051906000806020948585017f095ea7b30000000000000000000000000000000000000000000000000000000081528260249661470a816145a08d8b830160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff919392936001600160a01b0360408201951681520152565b51925af16147166138a4565b8161472d575b50156145d15750505060010161464a565b80518015925085908315614745575b5050503861471c565b61475593508201810191016138e4565b38848161473c565b1561476457565b608460405162461bcd60e51b815260206004820152602f60248201527f4f6e6c7920746865206f776e6572206f722061646d696e206d6179207065726660448201527f6f726d207468697320616374696f6e00000000000000000000000000000000006064820152fd5b156147d557565b608460405162461bcd60e51b8152602060048201526024808201527f43616e6e6f74207365742073656e7469656e636554696d6520696e207468652060448201527f70617374000000000000000000000000000000000000000000000000000000006064820152fd5b1561484557565b608460405162461bcd60e51b815260206004820152602860248201527f4e65656420312064617920636f6f6c646f776e206265666f726520706175736960448201527f6e6720616761696e0000000000000000000000000000000000000000000000006064820152fdfea2646970667358221220f87863c7e3bf48e62639d7f107823e8c00deea1893839b5338b1ed09718edb0d64736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000e0cb07602f7b3386e91ede8ea8c021024869b7b700000000000000000000000034f969e2c9d7f8bf1e537889949390d4a756270a00000000000000000000000028189ed7ee43aeb65b9adeeb456b2480297221ce0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000ac3e018457b222d93114458476f3e3416abbe38f000000000000000000000000ae78736cd615f374d3085123a210448e74fc63930000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca0000000000000000000000000be9895146f7af43049ca1c1ae358b0541ea49704000000000000000000000000e95a203b1a91a908f9b9ce46459d101078c2c3cb000000000000000000000000f951e335afb289353dc249e82926178eac7ded7800000000000000000000000031aa035313b1d2109e61ee0e3662a86a8615ff1d000000000000000000000000c3d088842dcf02c13699f936bb83dfbbc6f721ab00000000000000000000000048afbbd342f64ef8a9ab1c143719b63c2ad817100000000000000000000000000ae38f7e10a43b5b2fb064b42a2f4514cba909ef000000000000000000000000dcee70654261af21c44c093c300ed3bb97b78192000000000000000000000000b5b29320d2dde5ba5bafa1ebcd270052070483ec000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599
-----Decoded View---------------
Arg [0] : _owner (address): 0xE0cb07602f7B3386E91Ede8Ea8C021024869b7B7
Arg [1] : _darknetAddress (address): 0x34f969E2c9D7f8bf1E537889949390d4a756270A
Arg [2] : _reshethAddress (address): 0x28189ED7ee43aEb65B9adEeb456B2480297221CE
Arg [3] : _lsds (address[]): 0xac3E018457B222d93114458476f3E3416Abbe38F,0xae78736Cd615f374D3085123A210448E74Fc6393,0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0,0xBe9895146f7AF43049ca1c1AE358B0541Ea49704,0xE95A203B1a91a908F9B9CE46459d101078c2c3cb,0xf951E335afb289353dc249e82926178EaC7DEd78,0x31AA035313b1D2109e61Ee0E3662A86A8615fF1d,0xc3D088842DcF02C13699F936BB83DFBBc6f721Ab,0x48AFbBd342F64EF8a9Ab1C143719b63C2AD81710,0x0Ae38f7E10A43B5b2fB064B42a2f4514cbA909ef,0xDcEe70654261AF21C44c093C300eD3Bb97b78192,0xb5b29320d2Dde5BA5BAFA1EbcD270052070483ec,0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2,0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599
-----Encoded View---------------
19 Constructor Arguments found :
Arg [0] : 000000000000000000000000e0cb07602f7b3386e91ede8ea8c021024869b7b7
Arg [1] : 00000000000000000000000034f969e2c9d7f8bf1e537889949390d4a756270a
Arg [2] : 00000000000000000000000028189ed7ee43aeb65b9adeeb456b2480297221ce
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [5] : 000000000000000000000000ac3e018457b222d93114458476f3e3416abbe38f
Arg [6] : 000000000000000000000000ae78736cd615f374d3085123a210448e74fc6393
Arg [7] : 0000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca0
Arg [8] : 000000000000000000000000be9895146f7af43049ca1c1ae358b0541ea49704
Arg [9] : 000000000000000000000000e95a203b1a91a908f9b9ce46459d101078c2c3cb
Arg [10] : 000000000000000000000000f951e335afb289353dc249e82926178eac7ded78
Arg [11] : 00000000000000000000000031aa035313b1d2109e61ee0e3662a86a8615ff1d
Arg [12] : 000000000000000000000000c3d088842dcf02c13699f936bb83dfbbc6f721ab
Arg [13] : 00000000000000000000000048afbbd342f64ef8a9ab1c143719b63c2ad81710
Arg [14] : 0000000000000000000000000ae38f7e10a43b5b2fb064b42a2f4514cba909ef
Arg [15] : 000000000000000000000000dcee70654261af21c44c093c300ed3bb97b78192
Arg [16] : 000000000000000000000000b5b29320d2dde5ba5bafa1ebcd270052070483ec
Arg [17] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [18] : 0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599
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.
Address QR Code
My Address - Private Name Tag or Note
My Name Tag:
Private Note:
Please DO NOT store any passwords or private keys here.
The compiled contract might be susceptible to VerbatimInvalidDeduplication (low-severity), FullInlinerNonExpressionSplitArgumentEvaluationOrder (low-severity), MissingSideEffectsOnSelectorAccess (low-severity) Solidity Compiler Bugs.
Connect a Wallet
Connect a Wallet
Connect a Wallet
Address Cards
Before You Copy
This website uses cookies to improve your experience. By continuing to use this website, you agree to its Terms and Privacy Policy.