More Info
Private Name Tags
ContractCreator
Latest 7 from a total of 7 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Send Tx Fee | 20796566 | 112 days ago | IN | 0.00335217 ETH | 0.00061997 | ||||
Send Tx Fee | 20637096 | 134 days ago | IN | 0.00135872 ETH | 0.0002453 | ||||
Send Tx Fee | 20500129 | 153 days ago | IN | 0.0012093 ETH | 0.00005565 | ||||
Send Tx Fee | 20486695 | 155 days ago | IN | 0.00225204 ETH | 0.00030522 | ||||
Send Tx Fee | 20469584 | 158 days ago | IN | 0.00164243 ETH | 0.00020032 | ||||
Send Tx Fee | 20444029 | 161 days ago | IN | 0.00157533 ETH | 0.00016397 | ||||
Send Tx Fee | 20443154 | 161 days ago | IN | 0.00226109 ETH | 0.00029551 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
21177971 | 59 days ago | 0.00590911 ETH | ||||
21177971 | 59 days ago | 0.00544451 ETH | ||||
21177971 | 59 days ago | 0.01135363 ETH | ||||
20796566 | 112 days ago | 0.00335217 ETH | ||||
20790491 | 113 days ago | 0.00417948 ETH | ||||
20790491 | 113 days ago | 0.0001 ETH | ||||
20790491 | 113 days ago | 0.00427948 ETH | ||||
20741652 | 120 days ago | 0.00156955 ETH | ||||
20741652 | 120 days ago | 0.04793044 ETH | ||||
20741652 | 120 days ago | 0.0495 ETH | ||||
20700068 | 125 days ago | 0.00141998 ETH | ||||
20700068 | 125 days ago | 0.04808001 ETH | ||||
20700068 | 125 days ago | 0.0495 ETH | ||||
20685048 | 128 days ago | 0.00241864 ETH | ||||
20685048 | 128 days ago | 0.14 ETH | ||||
20685048 | 128 days ago | 0.14241864 ETH | ||||
20637096 | 134 days ago | 0.00135872 ETH | ||||
20635165 | 135 days ago | 0.00216835 ETH | ||||
20635165 | 135 days ago | 0.005 ETH | ||||
20635165 | 135 days ago | 0.00716835 ETH | ||||
20500129 | 153 days ago | 0.0012093 ETH | ||||
20486695 | 155 days ago | 0.00225204 ETH | ||||
20469584 | 158 days ago | 0.00164243 ETH | ||||
20468696 | 158 days ago | 0.00194852 ETH | ||||
20468696 | 158 days ago | 0.01 ETH |
Loading...
Loading
Contract Name:
L1Unwrapper
Compiler Version
v0.7.5+commit.eb77ed08
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; pragma abicoder v2; import "../helpers/OmnibridgeRouter.sol"; /// @dev Extension for original WETHOmnibridgeRouter that stores HorizonPool account registrations. contract L1Unwrapper is OmnibridgeRouter { using SafeMath for uint256; using SafeERC20 for IERC20; // If this address sets to not zero it receives L1_fee. // It can be changed by the multisig. // And should implement fee sharing logic: // - some part to tx.origin - based on block base fee and can be subsidized // - store surplus of ETH for future subsidizions address payable public l1FeeReceiver; // Mapping to track if an address has sent a transaction fee mapping(address => bool) public hasPaidTxFee; event PublicKey(address indexed owner, bytes key); struct Account { address owner; bytes publicKey; } constructor( IOmnibridge _bridge, IWETH _weth, IERC20 _zklk, uint256 _minimumHoldAmount, address _feeTo, uint256 _basicFeeRatio, uint256 _higherFeeRatio, address payable _receiver ) OmnibridgeRouter(_bridge, _weth, _zklk, _minimumHoldAmount, _feeTo, _basicFeeRatio, _higherFeeRatio) { l1FeeReceiver = _receiver; } /** @dev Registers provided public key and its owner in pool * @param _account pair of address and key */ function register(Account memory _account) public { require(_account.owner == msg.sender, "only owner can be registered"); _register(_account); } /** * @dev Wraps native assets and relays wrapped ERC20 tokens to the other chain. * It also calls receiver on other side with the _data provided. * @param _receiver bridged assets receiver on the other side of the bridge. * @param _data data for the call of receiver on other side. * @param _account HorizonPool account data */ function wrapAndRelayTokens( address _receiver, address token, uint256 amount, bytes memory _data, Account memory _account ) public payable { if(token == address(0)) { uint256 remainingAmount = chargeFee(amount, token); WETH.deposit{ value: remainingAmount }(); bridge.relayTokensAndCall(address(WETH), _receiver, remainingAmount, _data); } else { IERC20(token).transferFrom(msg.sender, address(this), amount); uint256 feeAmount = (amount * feeMap[token]) / BIPS_BASE; bridge.relayTokensAndCall(token, _receiver, amount - feeAmount, _data); } if (_account.owner == msg.sender) { _register(_account); } } function _register(Account memory _account) internal { emit PublicKey(_account.owner, _account.publicKey); } /** * @dev Bridged callback function used for unwrapping received tokens. * Can only be called by the associated Omnibridge contract. * @param _token bridged token contract address, should be WETH. * @param _value amount of bridged/received tokens. * @param _data extra data passed alongside with relayTokensAndCall on the other side of the bridge. * Should contain coins receiver address and L1 executer fee amount. */ function onTokenBridged( address _token, uint256 _value, bytes memory _data ) external override { require(msg.sender == address(bridge), "only from bridge address"); require(_data.length == 64, "incorrect data length"); (address payable recipient, uint256 l1Fee) = abi.decode(_data, (address, uint256)); if(_token == address(WETH)) { WETH.withdraw(_value); AddressHelper.safeSendValue(recipient, _value.sub(l1Fee)); } else { // Check if the recipient has paid the transaction fee require(hasPaidTxFee[recipient], "Transaction fee not paid"); uint256 feeAmount = (_value * feeMap[_token]) / BIPS_BASE; IERC20(_token).transfer(recipient, _value.sub(feeAmount).sub(l1Fee)); hasPaidTxFee[recipient] = false; } if (l1Fee > 0) { address payable l1FeeTo = l1FeeReceiver != payable(address(0)) ? l1FeeReceiver : payable(tx.origin); if(_token == address(WETH)) { AddressHelper.safeSendValue(l1FeeTo, l1Fee); } else { IERC20(_token).transfer(l1FeeTo, l1Fee); } } } /** * @dev Sets l1FeeReceiver address. * Only contract owner can call this method. * @param _receiver address of new L1FeeReceiver, address(0) for native tx.origin receiver. */ function setL1FeeReceiver(address payable _receiver) external onlyOwner { l1FeeReceiver = _receiver; } /** * @dev Allows users to send ETH to the l1FeeReceiver. */ function sendTxFee(address recipient) external payable { require(msg.value > 0, "Must send a non-zero amount"); hasPaidTxFee[recipient] = true; l1FeeReceiver.transfer(msg.value); } }
pragma solidity 0.7.5; import "omnibridge/contracts/interfaces/IOmnibridge.sol"; import "omnibridge/contracts/interfaces/IWETH.sol"; import "omnibridge/contracts/libraries/AddressHelper.sol"; import "omnibridge/contracts/libraries/Bytes.sol"; import "omnibridge/contracts/upgradeable_contracts/modules/OwnableModule.sol"; import "omnibridge/contracts/upgradeable_contracts/Claimable.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; /** * @title OmnibridgeRouter * @dev Omnibridge extension for processing native and wrapped native assets. * Intended to work with WETH/WBNB/WXDAI tokens, see: * https://etherscan.io/address/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2 * https://bscscan.com/address/0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c * https://blockscout.com/poa/xdai/address/0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d */ contract OmnibridgeRouter is OwnableModule, Claimable { using SafeERC20 for IERC20; IOmnibridge public immutable bridge; IWETH public immutable WETH; IERC20 public ZKLK; uint256 public minimumHoldAmount; address public feeTo; uint256 public basicFeeRatio; uint256 public higherFeeRatio; uint256 public immutable BIPS_BASE = 1000; mapping(address => uint256) public feeMap; constructor( IOmnibridge _bridge, IWETH _weth, IERC20 _zklk, uint256 _minimumHoldAmount, address _feeTo, uint256 _basicFeeRatio, uint256 _higherFeeRatio ) OwnableModule(msg.sender) { bridge = _bridge; WETH = _weth; ZKLK = _zklk; minimumHoldAmount = _minimumHoldAmount; feeTo = _feeTo; basicFeeRatio = _basicFeeRatio; higherFeeRatio = _higherFeeRatio; _weth.approve(address(_bridge), uint256(-1)); _zklk.approve(address(_bridge), uint256(-1)); feeMap[address(_zklk)] = 50; } /** * @dev Wraps native assets and relays wrapped ERC20 tokens to the other chain. * Call msg.sender will receive assets on the other side of the bridge. */ function wrapAndRelayTokens(address token, uint256 amount) external payable { wrapAndRelayTokens(msg.sender, token, amount); } /** * @dev Wraps native assets and relays wrapped ERC20 tokens to the other chain. * @param _receiver bridged assets receiver on the other side of the bridge. */ function wrapAndRelayTokens(address _receiver, address token, uint256 amount) public payable { if(token == address(0)) { uint256 remainingAmount = chargeFee(amount, token); WETH.deposit{ value: remainingAmount }(); bridge.relayTokens(address(WETH), _receiver, remainingAmount); } else { IERC20(token).transferFrom(msg.sender, address(this), amount); uint256 feeAmount = (amount * feeMap[token]) / BIPS_BASE; bridge.relayTokens(token, _receiver, amount - feeAmount); } } /** * @dev Wraps native assets and relays wrapped ERC20 tokens to the other chain. * It also calls receiver on other side with the _data provided. * @param _receiver bridged assets receiver on the other side of the bridge. * @param _data data for the call of receiver on other side. */ function wrapAndRelayTokens(address _receiver, address token, uint256 amount, bytes memory _data) public payable { if(token == address(0)) { uint256 remainingAmount = chargeFee(amount, token); WETH.deposit{ value: remainingAmount }(); bridge.relayTokensAndCall(address(WETH), _receiver, remainingAmount, _data); } else { IERC20(token).transferFrom(msg.sender, address(this), amount); uint256 feeAmount = (amount * feeMap[token]) / BIPS_BASE; bridge.relayTokensAndCall(token, _receiver, amount - feeAmount, _data); } } function chargeFee(uint256 amount, address token) internal returns (uint256) { uint256 feeAmount; if (token == address(0)) { // Calculate the fee for Ether if (isQualifiedForFee(msg.sender)) { feeAmount = (msg.value * basicFeeRatio) / BIPS_BASE; } else { feeAmount = (msg.value * higherFeeRatio) / BIPS_BASE; } // Transfer the Ether fee directly to feeTo address if (feeAmount > 0) { payable(feeTo).transfer(feeAmount); } return msg.value - feeAmount; } else { // Calculate the fee for tokens if (isQualifiedForFee(msg.sender)) { feeAmount = (amount * basicFeeRatio) / BIPS_BASE; } else { feeAmount = (amount * higherFeeRatio) / BIPS_BASE; } // Transfer the token fee to feeTo address if (feeAmount > 0) { IERC20(token).transferFrom(msg.sender, feeTo, feeAmount); } return amount - feeAmount; } } function updateTokenFee(address _token, uint256 _newFee) external onlyOwner { feeMap[_token] = _newFee; } /** * @dev Bridged callback function used for unwrapping received tokens. * Can only be called by the associated Omnibridge contract. * @param _token bridged token contract address, should be WETH. * @param _value amount of bridged/received tokens. * @param _data extra data passed alongside with relayTokensAndCall on the other side of the bridge. * Should contain coins receiver address. */ function onTokenBridged( address _token, uint256 _value, bytes memory _data ) external virtual { require(msg.sender == address(bridge)); require(_data.length == 20); if(_token == address(WETH)) { WETH.withdraw(_value); AddressHelper.safeSendValue(payable(Bytes.bytesToAddress(_data)), _value); } else { IERC20(_token).transfer(Bytes.bytesToAddress(_data), _value); } } function allowTokens(address _token) external onlyOwner { IERC20(_token).approve(address(bridge), uint256(-1)); } /** * @dev Claims stuck coins/tokens. * Only contract owner can call this method. * @param _token address of claimed token contract, address(0) for native coins. * @param _to address of tokens receiver */ function claimTokens(address _token, address _to) external onlyOwner { claimValues(_token, _to); } function updateZklkAndAmount(IERC20 _zklk, uint256 _minimumHoldAmount) external onlyOwner { ZKLK = _zklk; minimumHoldAmount = _minimumHoldAmount; } // Function to set the feeTo address function setFeeTo(address _feeTo) external onlyOwner { feeTo = _feeTo; } // Function to check if a user qualifies for the 0.5% fee function isQualifiedForFee(address holder) public view returns (bool) { uint256 balance = IERC20(ZKLK).balanceOf(holder); return balance >= minimumHoldAmount; } /** * @dev Ether receive function. * Should be only called from the WETH contract when withdrawing native coins. Will revert otherwise. */ receive() external payable { require(msg.sender == address(WETH)); } }
pragma solidity 0.7.5; interface IOmnibridge { function relayTokens( address _token, address _receiver, uint256 _value ) external; function relayTokensAndCall( address token, address _receiver, uint256 _value, bytes memory _data ) external; }
pragma solidity 0.7.5; interface IWETH { function deposit() external payable; function withdraw(uint256 _value) external; function approve(address _to, uint256 _value) external; }
pragma solidity 0.7.5; import "../upgradeable_contracts/Sacrifice.sol"; /** * @title AddressHelper * @dev Helper methods for Address type. */ library AddressHelper { /** * @dev Try to send native tokens to the address. If it fails, it will force the transfer by creating a selfdestruct contract * @param _receiver address that will receive the native tokens * @param _value the amount of native tokens to send */ function safeSendValue(address payable _receiver, uint256 _value) internal { if (!(_receiver).send(_value)) { new Sacrifice{ value: _value }(_receiver); } } }
pragma solidity 0.7.5; /** * @title Bytes * @dev Helper methods to transform bytes to other solidity types. */ library Bytes { /** * @dev Truncate bytes array if its size is more than 20 bytes. * NOTE: This function does not perform any checks on the received parameter. * Make sure that the _bytes argument has a correct length, not less than 20 bytes. * A case when _bytes has length less than 20 will lead to the undefined behaviour, * since assembly will read data from memory that is not related to the _bytes argument. * @param _bytes to be converted to address type * @return addr address included in the firsts 20 bytes of the bytes array in parameter. */ function bytesToAddress(bytes memory _bytes) internal pure returns (address addr) { assembly { addr := mload(add(_bytes, 20)) } } }
pragma solidity 0.7.5; import "@openzeppelin/contracts/utils/Address.sol"; /** * @title OwnableModule * @dev Common functionality for multi-token extension non-upgradeable module. */ contract OwnableModule { address public owner; /** * @dev Initializes this contract. * @param _owner address of the owner that is allowed to perform additional actions on the particular module. */ constructor(address _owner) { owner = _owner; } /** * @dev Throws if sender is not the owner of this contract. */ modifier onlyOwner { require(msg.sender == owner); _; } /** * @dev Changes the owner of this contract. * @param _newOwner address of the new owner. */ function transferOwnership(address _newOwner) external onlyOwner { owner = _newOwner; } }
pragma solidity 0.7.5; import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol"; import "../libraries/AddressHelper.sol"; /** * @title Claimable * @dev Implementation of the claiming utils that can be useful for withdrawing accidentally sent tokens that are not used in bridge operations. */ contract Claimable { using SafeERC20 for IERC20; /** * Throws if a given address is equal to address(0) */ modifier validAddress(address _to) { require(_to != address(0)); _; } /** * @dev Withdraws the erc20 tokens or native coins from this contract. * Caller should additionally check that the claimed token is not a part of bridge operations (i.e. that token != erc20token()). * @param _token address of the claimed token or address(0) for native coins. * @param _to address of the tokens/coins receiver. */ function claimValues(address _token, address _to) internal validAddress(_to) { if (_token == address(0)) { claimNativeCoins(_to); } else { claimErc20Tokens(_token, _to); } } /** * @dev Internal function for withdrawing all native coins from the contract. * @param _to address of the coins receiver. */ function claimNativeCoins(address _to) internal { uint256 value = address(this).balance; AddressHelper.safeSendValue(payable(_to), value); } /** * @dev Internal function for withdrawing all tokens of some particular ERC20 contract from this contract. * @param _token address of the claimed ERC20 token. * @param _to address of the tokens receiver. */ function claimErc20Tokens(address _token, address _to) internal { IERC20 token = IERC20(_token); uint256 balance = token.balanceOf(address(this)); token.safeTransfer(_to, balance); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ 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); }
pragma solidity 0.7.5; contract Sacrifice { constructor(address payable _recipient) payable { selfdestruct(_recipient); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.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.7.0; import "./IERC20.sol"; import "../../math/SafeMath.sol"; import "../../utils/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.7.0; /** * @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, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, 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 (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @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) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @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) { 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, reverting 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) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting 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) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * 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, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * 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, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IOmnibridge","name":"_bridge","type":"address"},{"internalType":"contract IWETH","name":"_weth","type":"address"},{"internalType":"contract IERC20","name":"_zklk","type":"address"},{"internalType":"uint256","name":"_minimumHoldAmount","type":"uint256"},{"internalType":"address","name":"_feeTo","type":"address"},{"internalType":"uint256","name":"_basicFeeRatio","type":"uint256"},{"internalType":"uint256","name":"_higherFeeRatio","type":"uint256"},{"internalType":"address payable","name":"_receiver","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"bytes","name":"key","type":"bytes"}],"name":"PublicKey","type":"event"},{"inputs":[],"name":"BIPS_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ZKLK","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"allowTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"basicFeeRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridge","outputs":[{"internalType":"contract IOmnibridge","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"claimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"feeMap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeTo","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasPaidTxFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"higherFeeRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"isQualifiedForFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"l1FeeReceiver","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumHoldAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"onTokenBridged","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"bytes","name":"publicKey","type":"bytes"}],"internalType":"struct L1Unwrapper.Account","name":"_account","type":"tuple"}],"name":"register","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"sendTxFee","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeTo","type":"address"}],"name":"setFeeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_receiver","type":"address"}],"name":"setL1FeeReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_newFee","type":"uint256"}],"name":"updateTokenFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_zklk","type":"address"},{"internalType":"uint256","name":"_minimumHoldAmount","type":"uint256"}],"name":"updateZklkAndAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"wrapAndRelayTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"wrapAndRelayTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"wrapAndRelayTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"},{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"bytes","name":"publicKey","type":"bytes"}],"internalType":"struct L1Unwrapper.Account","name":"_account","type":"tuple"}],"name":"wrapAndRelayTokens","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60e06040526103e860c0523480156200001757600080fd5b5060405162002610380380620026108339810160408190526200003a91620001e2565b60008054336001600160a01b031991821617825560608a811b6001600160601b0319908116608052908a901b1660a0526001805482166001600160a01b038a81169190911790915560028890556003805490921687821617909155600485815560058590556040805163095ea7b360e01b8152838d16928101929092526000196024830152518b938b938b938b938b938b938b939089169263095ea7b39260448084019391929182900301818387803b158015620000f757600080fd5b505af11580156200010c573d6000803e3d6000fd5b50505050846001600160a01b031663095ea7b3886000196040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156200016a57600080fd5b505af11580156200017f573d6000803e3d6000fd5b505050506040513d60208110156200019657600080fd5b505050506001600160a01b039283166000908152600660205260409020603290555050600780546001600160a01b03191694909116939093179092555062000298975050505050505050565b600080600080600080600080610100898b031215620001ff578384fd5b88516200020c816200027f565b60208a01519098506200021f816200027f565b60408a015190975062000232816200027f565b60608a015160808b015191975095506200024c816200027f565b8094505060a0890151925060c0890151915060e08901516200026e816200027f565b809150509295985092959890939650565b6001600160a01b03811681146200029557600080fd5b50565b60805160601c60a05160601c60c0516122c36200034d600039806108405280610d475280610e41528061104e52806114b552806115a552806115da528061166452806116995250806101b0528061060252806106a55280610b735280610c165280610e1d5280610f245280610f73528061116052806112fb52806113b1525080610676528061086e5280610a4f5280610be75280610d755280610ea95280611234528061138152806114e352506122c36000f3fe6080604052600436106101a05760003560e01c806369ffa08a116100ec578063d584c71b1161008a578063f1f8334111610064578063f1f833411461044f578063f2fde38b1461046f578063f46901ed1461048f578063f4fd5935146104af576101dc565b8063d584c71b14610405578063db7af8541461041a578063e78cea921461043a576101dc565b80638de504e5116100c65780638de504e5146103a8578063ad5c4648146103bb578063afcc4845146103d0578063b2bc6e0f146103e5576101dc565b806369ffa08a146103535780637879ad73146103735780638da5cb5b14610393576101dc565b806329e6a8c01161015957806334eb34af1161013357806334eb34af146102de5780634b648ef61461030b5780634e5ee1c01461031e5780635fd0c80d1461033e576101dc565b806329e6a8c0146102a157806332a8fe62146102b457806334569517146102c9576101dc565b8063017e7e58146101e157806303e16d421461020c57806305febfca146102395780630a823b181461024c57806312c4208a1461026c57806327de02131461028c576101dc565b366101dc57336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101da57600080fd5b005b600080fd5b3480156101ed57600080fd5b506101f66104c2565b6040516102039190612036565b60405180910390f35b34801561021857600080fd5b5061022c610227366004611d53565b6104d1565b60405161020391906121ed565b6101da610247366004611d53565b6104e3565b34801561025857600080fd5b506101da610267366004611f0e565b610565565b34801561027857600080fd5b506101da610287366004611f0e565b6105a2565b34801561029857600080fd5b506101f66105d5565b6101da6102af366004611e14565b6105e4565b3480156102c057600080fd5b506101f6610980565b3480156102d557600080fd5b5061022c61098f565b3480156102ea57600080fd5b506102fe6102f9366004611d53565b610995565b60405161020391906120c4565b6101da610319366004611f0e565b610a1c565b34801561032a57600080fd5b506101da610339366004611d53565b610a27565b34801561034a57600080fd5b5061022c610ae6565b34801561035f57600080fd5b506101da61036e366004611d9c565b610aec565b34801561037f57600080fd5b506101da61038e366004611d53565b610b0d565b34801561039f57600080fd5b506101f6610b46565b6101da6103b6366004611dd4565b610b55565b3480156103c757600080fd5b506101f6610e1b565b3480156103dc57600080fd5b5061022c610e3f565b3480156103f157600080fd5b506101da610400366004611fb0565b610e63565b34801561041157600080fd5b5061022c610e98565b34801561042657600080fd5b506101da610435366004611f39565b610e9e565b34801561044657600080fd5b506101f6611232565b34801561045b57600080fd5b506102fe61046a366004611d53565b611256565b34801561047b57600080fd5b506101da61048a366004611d53565b61126b565b34801561049b57600080fd5b506101da6104aa366004611d53565b6112a4565b6101da6104bd366004611e7e565b6112dd565b6003546001600160a01b031681565b60066020526000908152604090205481565b6000341161050c5760405162461bcd60e51b815260040161050390612119565b60405180910390fd5b6001600160a01b03808216600090815260086020526040808220805460ff1916600117905560075490519216913480156108fc0292909190818181858888f19350505050158015610561573d6000803e3d6000fd5b5050565b6000546001600160a01b0316331461057c57600080fd5b600180546001600160a01b0319166001600160a01b039390931692909217909155600255565b6000546001600160a01b031633146105b957600080fd5b6001600160a01b03909116600090815260066020526040902055565b6001546001600160a01b031681565b6001600160a01b0383166107a45760006105fe8385611584565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561065b57600080fd5b505af115801561066f573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d74054817f00000000000000000000000000000000000000000000000000000000000000008784866040518563ffffffff1660e01b815260040180856001600160a01b03168152602001846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561073757818101518382015260200161071f565b50505050905090810190601f1680156107645780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561078657600080fd5b505af115801561079a573d6000803e3d6000fd5b505050505061097a565b604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b038516916323b872dd9160648083019260209291908290030181600087803b1580156107f957600080fd5b505af115801561080d573d6000803e3d6000fd5b505050506040513d602081101561082357600080fd5b50506001600160a01b0383166000908152600660205260408120547f00000000000000000000000000000000000000000000000000000000000000009084028161086957fe5b0490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d74054818587848703866040518563ffffffff1660e01b815260040180856001600160a01b03168152602001846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156109115781810151838201526020016108f9565b50505050905090810190601f16801561093e5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561096057600080fd5b505af1158015610974573d6000803e3d6000fd5b50505050505b50505050565b6007546001600160a01b031681565b60025481565b600154604080516370a0823160e01b81526001600160a01b0384811660048301529151600093849316916370a08231916024808301926020929190829003018186803b1580156109e457600080fd5b505afa1580156109f8573d6000803e3d6000fd5b505050506040513d6020811015610a0e57600080fd5b505160025411159392505050565b610561338383610b55565b6000546001600160a01b03163314610a3e57600080fd5b806001600160a01b031663095ea7b37f00000000000000000000000000000000000000000000000000000000000000006000196040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610ab757600080fd5b505af1158015610acb573d6000803e3d6000fd5b505050506040513d6020811015610ae157600080fd5b505050565b60055481565b6000546001600160a01b03163314610b0357600080fd5b6105618282611762565b6000546001600160a01b03163314610b2457600080fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031681565b6001600160a01b038216610cab576000610b6f8284611584565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015610bcc57600080fd5b505af1158015610be0573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad58bdd17f000000000000000000000000000000000000000000000000000000000000000086846040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015610c8d57600080fd5b505af1158015610ca1573d6000803e3d6000fd5b5050505050610ae1565b604080516323b872dd60e01b81523360048201523060248201526044810183905290516001600160a01b038416916323b872dd9160648083019260209291908290030181600087803b158015610d0057600080fd5b505af1158015610d14573d6000803e3d6000fd5b505050506040513d6020811015610d2a57600080fd5b50506001600160a01b0382166000908152600660205260408120547f000000000000000000000000000000000000000000000000000000000000000090830281610d7057fe5b0490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad58bdd184868486036040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015610dfd57600080fd5b505af1158015610e11573d6000803e3d6000fd5b5050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b80516001600160a01b03163314610e8c5760405162461bcd60e51b8152600401610503906120e2565b610e958161179c565b50565b60045481565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ee65760405162461bcd60e51b815260040161050390612150565b8051604014610f075760405162461bcd60e51b815260040161050390612187565b60008082806020019051810190610f1e9190611d6f565b915091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b03161415610ffb57604051632e1a7d4d60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d90610fa89087906004016121ed565b600060405180830381600087803b158015610fc257600080fd5b505af1158015610fd6573d6000803e3d6000fd5b50505050610ff682610ff183876117e890919063ffffffff16565b611845565b611130565b6001600160a01b03821660009081526008602052604090205460ff166110335760405162461bcd60e51b8152600401610503906121b6565b6001600160a01b0385166000908152600660205260408120547f00000000000000000000000000000000000000000000000000000000000000009086028161107757fe5b0490506001600160a01b03861663a9059cbb8461109e856110988a876117e8565b906117e8565b6040518363ffffffff1660e01b81526004016110bb92919061206e565b602060405180830381600087803b1580156110d557600080fd5b505af11580156110e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110d9190611f90565b50506001600160a01b0382166000908152600860205260409020805460ff191690555b801561122b576007546000906001600160a01b031661114f573261115c565b6007546001600160a01b03165b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031614156111a7576111a28183611845565b611229565b60405163a9059cbb60e01b81526001600160a01b0387169063a9059cbb906111d5908490869060040161206e565b602060405180830381600087803b1580156111ef57600080fd5b505af1158015611203573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112279190611f90565b505b505b5050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60086020526000908152604090205460ff1681565b6000546001600160a01b0316331461128257600080fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146112bb57600080fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0384166114175760006112f78486611584565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561135457600080fd5b505af1158015611368573d6000803e3d6000fd5b505060405163d740548160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016935063d740548192506113df91507f0000000000000000000000000000000000000000000000000000000000000000908a9086908990600401612087565b600060405180830381600087803b1580156113f957600080fd5b505af115801561140d573d6000803e3d6000fd5b5050505050611569565b6040516323b872dd60e01b81526001600160a01b038516906323b872dd906114479033903090889060040161204a565b602060405180830381600087803b15801561146157600080fd5b505af1158015611475573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114999190611f90565b506001600160a01b0384166000908152600660205260408120547f0000000000000000000000000000000000000000000000000000000000000000908502816114de57fe5b0490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d74054818688848803876040518563ffffffff1660e01b81526004016115359493929190612087565b600060405180830381600087803b15801561154f57600080fd5b505af1158015611563573d6000803e3d6000fd5b50505050505b80516001600160a01b031633141561122b5761122b8161179c565b6000806001600160a01b0383166116545761159e33610995565b156115d8577f00000000000000000000000000000000000000000000000000000000000000006004543402816115d057fe5b049050611609565b7f000000000000000000000000000000000000000000000000000000000000000060055434028161160557fe5b0490505b801561164b576003546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611649573d6000803e3d6000fd5b505b3403905061175c565b61165d33610995565b15611697577f000000000000000000000000000000000000000000000000000000000000000060045485028161168f57fe5b0490506116c8565b7f00000000000000000000000000000000000000000000000000000000000000006005548502816116c457fe5b0490505b801561175757600354604080516323b872dd60e01b81523360048201526001600160a01b039283166024820152604481018490529051918516916323b872dd916064808201926020929091908290030181600087803b15801561172a57600080fd5b505af115801561173e573d6000803e3d6000fd5b505050506040513d602081101561175457600080fd5b50505b830390505b92915050565b806001600160a01b03811661177657600080fd5b6001600160a01b0383166117925761178d826118aa565b610ae1565b610ae183836118b5565b80600001516001600160a01b03167f2c1ca5c14df2aba59d26842c5ff53f6817052ef34f6f7537f8b4c9e3805a5e5082602001516040516117dd91906120cf565b60405180910390a250565b60008282111561183f576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6040516001600160a01b0383169082156108fc029083906000818181858888f1935050505061056157808260405161187c90611c5a565b6001600160a01b039091168152604051908190036020019082f090508015801561097a573d6000803e3d6000fd5b476105618282611845565b604080516370a0823160e01b8152306004820152905183916000916001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561190057600080fd5b505afa158015611914573d6000803e3d6000fd5b505050506040513d602081101561192a57600080fd5b5051905061097a6001600160a01b0383168483604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610ae190849060606119df826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611a3b9092919063ffffffff16565b805190915015610ae1578080602001905160208110156119fe57600080fd5b5051610ae15760405162461bcd60e51b815260040180806020018281038252602a815260200180612264602a913960400191505060405180910390fd5b6060611a4a8484600085611a54565b90505b9392505050565b606082471015611a955760405162461bcd60e51b815260040180806020018281038252602681526020018061223e6026913960400191505060405180910390fd5b611a9e85611bb0565b611aef576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310611b2e5780518252601f199092019160209182019101611b0f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611b90576040519150601f19603f3d011682016040523d82523d6000602084013e611b95565b606091505b5091509150611ba5828286611bb6565b979650505050505050565b3b151590565b60608315611bc5575081611a4d565b825115611bd55782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611c1f578181015183820152602001611c07565b50505050905090810190601f168015611c4c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b60328061220c83390190565b600082601f830112611c76578081fd5b813567ffffffffffffffff80821115611c8b57fe5b604051601f8301601f191681016020018281118282101715611ca957fe5b604052828152925082848301602001861015611cc457600080fd5b8260208601602083013760006020848301015250505092915050565b600060408284031215611cf1578081fd5b6040516040810167ffffffffffffffff8282108183111715611d0f57fe5b8160405282935084359150611d23826121f6565b90825260208401359080821115611d3957600080fd5b50611d4685828601611c66565b6020830152505092915050565b600060208284031215611d64578081fd5b8135611a4d816121f6565b60008060408385031215611d81578081fd5b8251611d8c816121f6565b6020939093015192949293505050565b60008060408385031215611dae578182fd5b8235611db9816121f6565b91506020830135611dc9816121f6565b809150509250929050565b600080600060608486031215611de8578081fd5b8335611df3816121f6565b92506020840135611e03816121f6565b929592945050506040919091013590565b60008060008060808587031215611e29578081fd5b8435611e34816121f6565b93506020850135611e44816121f6565b925060408501359150606085013567ffffffffffffffff811115611e66578182fd5b611e7287828801611c66565b91505092959194509250565b600080600080600060a08688031215611e95578081fd5b8535611ea0816121f6565b94506020860135611eb0816121f6565b935060408601359250606086013567ffffffffffffffff80821115611ed3578283fd5b611edf89838a01611c66565b93506080880135915080821115611ef4578283fd5b50611f0188828901611ce0565b9150509295509295909350565b60008060408385031215611f20578182fd5b8235611f2b816121f6565b946020939093013593505050565b600080600060608486031215611f4d578283fd5b8335611f58816121f6565b925060208401359150604084013567ffffffffffffffff811115611f7a578182fd5b611f8686828701611c66565b9150509250925092565b600060208284031215611fa1578081fd5b81518015158114611a4d578182fd5b600060208284031215611fc1578081fd5b813567ffffffffffffffff811115611fd7578182fd5b611fe384828501611ce0565b949350505050565b60008151808452815b8181101561201057602081850181015186830182015201611ff4565b818111156120215782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906120ba90830184611feb565b9695505050505050565b901515815260200190565b600060208252611a4d6020830184611feb565b6020808252601c908201527f6f6e6c79206f776e65722063616e206265207265676973746572656400000000604082015260600190565b6020808252601b908201527f4d7573742073656e642061206e6f6e2d7a65726f20616d6f756e740000000000604082015260600190565b60208082526018908201527f6f6e6c792066726f6d2062726964676520616464726573730000000000000000604082015260600190565b6020808252601590820152740d2dcc6dee4e4cac6e840c8c2e8c240d8cadccee8d605b1b604082015260600190565b60208082526018908201527f5472616e73616374696f6e20666565206e6f7420706169640000000000000000604082015260600190565b90815260200190565b6001600160a01b0381168114610e9557600080fdfe60806040526040516032380380603283398181016040526020811015602357600080fd5b50516001600160a01b038116fffe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c5361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220b123482c1c177f8cb204da403a17bf318a69117dcbe3f386a6534331f205816a64736f6c6343000705003300000000000000000000000088ad09518695c6c3712ac10a214be5109a655671000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000096884fcaac082db4b32601ada5b177fd6cbffa88000000000000000000000000000000000000000000002a5a058fc295ed0000000000000000000000000000008a103bd158e641f82c2fd594c70db414b23d22770000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000dfe219459932c0cd41413fec92cd8e1a49a386e0
Deployed Bytecode
0x6080604052600436106101a05760003560e01c806369ffa08a116100ec578063d584c71b1161008a578063f1f8334111610064578063f1f833411461044f578063f2fde38b1461046f578063f46901ed1461048f578063f4fd5935146104af576101dc565b8063d584c71b14610405578063db7af8541461041a578063e78cea921461043a576101dc565b80638de504e5116100c65780638de504e5146103a8578063ad5c4648146103bb578063afcc4845146103d0578063b2bc6e0f146103e5576101dc565b806369ffa08a146103535780637879ad73146103735780638da5cb5b14610393576101dc565b806329e6a8c01161015957806334eb34af1161013357806334eb34af146102de5780634b648ef61461030b5780634e5ee1c01461031e5780635fd0c80d1461033e576101dc565b806329e6a8c0146102a157806332a8fe62146102b457806334569517146102c9576101dc565b8063017e7e58146101e157806303e16d421461020c57806305febfca146102395780630a823b181461024c57806312c4208a1461026c57806327de02131461028c576101dc565b366101dc57336001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216146101da57600080fd5b005b600080fd5b3480156101ed57600080fd5b506101f66104c2565b6040516102039190612036565b60405180910390f35b34801561021857600080fd5b5061022c610227366004611d53565b6104d1565b60405161020391906121ed565b6101da610247366004611d53565b6104e3565b34801561025857600080fd5b506101da610267366004611f0e565b610565565b34801561027857600080fd5b506101da610287366004611f0e565b6105a2565b34801561029857600080fd5b506101f66105d5565b6101da6102af366004611e14565b6105e4565b3480156102c057600080fd5b506101f6610980565b3480156102d557600080fd5b5061022c61098f565b3480156102ea57600080fd5b506102fe6102f9366004611d53565b610995565b60405161020391906120c4565b6101da610319366004611f0e565b610a1c565b34801561032a57600080fd5b506101da610339366004611d53565b610a27565b34801561034a57600080fd5b5061022c610ae6565b34801561035f57600080fd5b506101da61036e366004611d9c565b610aec565b34801561037f57600080fd5b506101da61038e366004611d53565b610b0d565b34801561039f57600080fd5b506101f6610b46565b6101da6103b6366004611dd4565b610b55565b3480156103c757600080fd5b506101f6610e1b565b3480156103dc57600080fd5b5061022c610e3f565b3480156103f157600080fd5b506101da610400366004611fb0565b610e63565b34801561041157600080fd5b5061022c610e98565b34801561042657600080fd5b506101da610435366004611f39565b610e9e565b34801561044657600080fd5b506101f6611232565b34801561045b57600080fd5b506102fe61046a366004611d53565b611256565b34801561047b57600080fd5b506101da61048a366004611d53565b61126b565b34801561049b57600080fd5b506101da6104aa366004611d53565b6112a4565b6101da6104bd366004611e7e565b6112dd565b6003546001600160a01b031681565b60066020526000908152604090205481565b6000341161050c5760405162461bcd60e51b815260040161050390612119565b60405180910390fd5b6001600160a01b03808216600090815260086020526040808220805460ff1916600117905560075490519216913480156108fc0292909190818181858888f19350505050158015610561573d6000803e3d6000fd5b5050565b6000546001600160a01b0316331461057c57600080fd5b600180546001600160a01b0319166001600160a01b039390931692909217909155600255565b6000546001600160a01b031633146105b957600080fd5b6001600160a01b03909116600090815260066020526040902055565b6001546001600160a01b031681565b6001600160a01b0383166107a45760006105fe8385611584565b90507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561065b57600080fd5b505af115801561066f573d6000803e3d6000fd5b50505050507f00000000000000000000000088ad09518695c6c3712ac10a214be5109a6556716001600160a01b031663d74054817f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28784866040518563ffffffff1660e01b815260040180856001600160a01b03168152602001846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561073757818101518382015260200161071f565b50505050905090810190601f1680156107645780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561078657600080fd5b505af115801561079a573d6000803e3d6000fd5b505050505061097a565b604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b038516916323b872dd9160648083019260209291908290030181600087803b1580156107f957600080fd5b505af115801561080d573d6000803e3d6000fd5b505050506040513d602081101561082357600080fd5b50506001600160a01b0383166000908152600660205260408120547f00000000000000000000000000000000000000000000000000000000000003e89084028161086957fe5b0490507f00000000000000000000000088ad09518695c6c3712ac10a214be5109a6556716001600160a01b031663d74054818587848703866040518563ffffffff1660e01b815260040180856001600160a01b03168152602001846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156109115781810151838201526020016108f9565b50505050905090810190601f16801561093e5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561096057600080fd5b505af1158015610974573d6000803e3d6000fd5b50505050505b50505050565b6007546001600160a01b031681565b60025481565b600154604080516370a0823160e01b81526001600160a01b0384811660048301529151600093849316916370a08231916024808301926020929190829003018186803b1580156109e457600080fd5b505afa1580156109f8573d6000803e3d6000fd5b505050506040513d6020811015610a0e57600080fd5b505160025411159392505050565b610561338383610b55565b6000546001600160a01b03163314610a3e57600080fd5b806001600160a01b031663095ea7b37f00000000000000000000000088ad09518695c6c3712ac10a214be5109a6556716000196040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610ab757600080fd5b505af1158015610acb573d6000803e3d6000fd5b505050506040513d6020811015610ae157600080fd5b505050565b60055481565b6000546001600160a01b03163314610b0357600080fd5b6105618282611762565b6000546001600160a01b03163314610b2457600080fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031681565b6001600160a01b038216610cab576000610b6f8284611584565b90507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015610bcc57600080fd5b505af1158015610be0573d6000803e3d6000fd5b50505050507f00000000000000000000000088ad09518695c6c3712ac10a214be5109a6556716001600160a01b031663ad58bdd17f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc286846040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015610c8d57600080fd5b505af1158015610ca1573d6000803e3d6000fd5b5050505050610ae1565b604080516323b872dd60e01b81523360048201523060248201526044810183905290516001600160a01b038416916323b872dd9160648083019260209291908290030181600087803b158015610d0057600080fd5b505af1158015610d14573d6000803e3d6000fd5b505050506040513d6020811015610d2a57600080fd5b50506001600160a01b0382166000908152600660205260408120547f00000000000000000000000000000000000000000000000000000000000003e890830281610d7057fe5b0490507f00000000000000000000000088ad09518695c6c3712ac10a214be5109a6556716001600160a01b031663ad58bdd184868486036040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015610dfd57600080fd5b505af1158015610e11573d6000803e3d6000fd5b5050505050505050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b7f00000000000000000000000000000000000000000000000000000000000003e881565b80516001600160a01b03163314610e8c5760405162461bcd60e51b8152600401610503906120e2565b610e958161179c565b50565b60045481565b336001600160a01b037f00000000000000000000000088ad09518695c6c3712ac10a214be5109a6556711614610ee65760405162461bcd60e51b815260040161050390612150565b8051604014610f075760405162461bcd60e51b815260040161050390612187565b60008082806020019051810190610f1e9190611d6f565b915091507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316856001600160a01b03161415610ffb57604051632e1a7d4d60e01b81526001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21690632e1a7d4d90610fa89087906004016121ed565b600060405180830381600087803b158015610fc257600080fd5b505af1158015610fd6573d6000803e3d6000fd5b50505050610ff682610ff183876117e890919063ffffffff16565b611845565b611130565b6001600160a01b03821660009081526008602052604090205460ff166110335760405162461bcd60e51b8152600401610503906121b6565b6001600160a01b0385166000908152600660205260408120547f00000000000000000000000000000000000000000000000000000000000003e89086028161107757fe5b0490506001600160a01b03861663a9059cbb8461109e856110988a876117e8565b906117e8565b6040518363ffffffff1660e01b81526004016110bb92919061206e565b602060405180830381600087803b1580156110d557600080fd5b505af11580156110e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110d9190611f90565b50506001600160a01b0382166000908152600860205260409020805460ff191690555b801561122b576007546000906001600160a01b031661114f573261115c565b6007546001600160a01b03165b90507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316866001600160a01b031614156111a7576111a28183611845565b611229565b60405163a9059cbb60e01b81526001600160a01b0387169063a9059cbb906111d5908490869060040161206e565b602060405180830381600087803b1580156111ef57600080fd5b505af1158015611203573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112279190611f90565b505b505b5050505050565b7f00000000000000000000000088ad09518695c6c3712ac10a214be5109a65567181565b60086020526000908152604090205460ff1681565b6000546001600160a01b0316331461128257600080fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146112bb57600080fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0384166114175760006112f78486611584565b90507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561135457600080fd5b505af1158015611368573d6000803e3d6000fd5b505060405163d740548160e01b81526001600160a01b037f00000000000000000000000088ad09518695c6c3712ac10a214be5109a65567116935063d740548192506113df91507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2908a9086908990600401612087565b600060405180830381600087803b1580156113f957600080fd5b505af115801561140d573d6000803e3d6000fd5b5050505050611569565b6040516323b872dd60e01b81526001600160a01b038516906323b872dd906114479033903090889060040161204a565b602060405180830381600087803b15801561146157600080fd5b505af1158015611475573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114999190611f90565b506001600160a01b0384166000908152600660205260408120547f00000000000000000000000000000000000000000000000000000000000003e8908502816114de57fe5b0490507f00000000000000000000000088ad09518695c6c3712ac10a214be5109a6556716001600160a01b031663d74054818688848803876040518563ffffffff1660e01b81526004016115359493929190612087565b600060405180830381600087803b15801561154f57600080fd5b505af1158015611563573d6000803e3d6000fd5b50505050505b80516001600160a01b031633141561122b5761122b8161179c565b6000806001600160a01b0383166116545761159e33610995565b156115d8577f00000000000000000000000000000000000000000000000000000000000003e86004543402816115d057fe5b049050611609565b7f00000000000000000000000000000000000000000000000000000000000003e860055434028161160557fe5b0490505b801561164b576003546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611649573d6000803e3d6000fd5b505b3403905061175c565b61165d33610995565b15611697577f00000000000000000000000000000000000000000000000000000000000003e860045485028161168f57fe5b0490506116c8565b7f00000000000000000000000000000000000000000000000000000000000003e86005548502816116c457fe5b0490505b801561175757600354604080516323b872dd60e01b81523360048201526001600160a01b039283166024820152604481018490529051918516916323b872dd916064808201926020929091908290030181600087803b15801561172a57600080fd5b505af115801561173e573d6000803e3d6000fd5b505050506040513d602081101561175457600080fd5b50505b830390505b92915050565b806001600160a01b03811661177657600080fd5b6001600160a01b0383166117925761178d826118aa565b610ae1565b610ae183836118b5565b80600001516001600160a01b03167f2c1ca5c14df2aba59d26842c5ff53f6817052ef34f6f7537f8b4c9e3805a5e5082602001516040516117dd91906120cf565b60405180910390a250565b60008282111561183f576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6040516001600160a01b0383169082156108fc029083906000818181858888f1935050505061056157808260405161187c90611c5a565b6001600160a01b039091168152604051908190036020019082f090508015801561097a573d6000803e3d6000fd5b476105618282611845565b604080516370a0823160e01b8152306004820152905183916000916001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561190057600080fd5b505afa158015611914573d6000803e3d6000fd5b505050506040513d602081101561192a57600080fd5b5051905061097a6001600160a01b0383168483604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610ae190849060606119df826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611a3b9092919063ffffffff16565b805190915015610ae1578080602001905160208110156119fe57600080fd5b5051610ae15760405162461bcd60e51b815260040180806020018281038252602a815260200180612264602a913960400191505060405180910390fd5b6060611a4a8484600085611a54565b90505b9392505050565b606082471015611a955760405162461bcd60e51b815260040180806020018281038252602681526020018061223e6026913960400191505060405180910390fd5b611a9e85611bb0565b611aef576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310611b2e5780518252601f199092019160209182019101611b0f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611b90576040519150601f19603f3d011682016040523d82523d6000602084013e611b95565b606091505b5091509150611ba5828286611bb6565b979650505050505050565b3b151590565b60608315611bc5575081611a4d565b825115611bd55782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611c1f578181015183820152602001611c07565b50505050905090810190601f168015611c4c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b60328061220c83390190565b600082601f830112611c76578081fd5b813567ffffffffffffffff80821115611c8b57fe5b604051601f8301601f191681016020018281118282101715611ca957fe5b604052828152925082848301602001861015611cc457600080fd5b8260208601602083013760006020848301015250505092915050565b600060408284031215611cf1578081fd5b6040516040810167ffffffffffffffff8282108183111715611d0f57fe5b8160405282935084359150611d23826121f6565b90825260208401359080821115611d3957600080fd5b50611d4685828601611c66565b6020830152505092915050565b600060208284031215611d64578081fd5b8135611a4d816121f6565b60008060408385031215611d81578081fd5b8251611d8c816121f6565b6020939093015192949293505050565b60008060408385031215611dae578182fd5b8235611db9816121f6565b91506020830135611dc9816121f6565b809150509250929050565b600080600060608486031215611de8578081fd5b8335611df3816121f6565b92506020840135611e03816121f6565b929592945050506040919091013590565b60008060008060808587031215611e29578081fd5b8435611e34816121f6565b93506020850135611e44816121f6565b925060408501359150606085013567ffffffffffffffff811115611e66578182fd5b611e7287828801611c66565b91505092959194509250565b600080600080600060a08688031215611e95578081fd5b8535611ea0816121f6565b94506020860135611eb0816121f6565b935060408601359250606086013567ffffffffffffffff80821115611ed3578283fd5b611edf89838a01611c66565b93506080880135915080821115611ef4578283fd5b50611f0188828901611ce0565b9150509295509295909350565b60008060408385031215611f20578182fd5b8235611f2b816121f6565b946020939093013593505050565b600080600060608486031215611f4d578283fd5b8335611f58816121f6565b925060208401359150604084013567ffffffffffffffff811115611f7a578182fd5b611f8686828701611c66565b9150509250925092565b600060208284031215611fa1578081fd5b81518015158114611a4d578182fd5b600060208284031215611fc1578081fd5b813567ffffffffffffffff811115611fd7578182fd5b611fe384828501611ce0565b949350505050565b60008151808452815b8181101561201057602081850181015186830182015201611ff4565b818111156120215782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906120ba90830184611feb565b9695505050505050565b901515815260200190565b600060208252611a4d6020830184611feb565b6020808252601c908201527f6f6e6c79206f776e65722063616e206265207265676973746572656400000000604082015260600190565b6020808252601b908201527f4d7573742073656e642061206e6f6e2d7a65726f20616d6f756e740000000000604082015260600190565b60208082526018908201527f6f6e6c792066726f6d2062726964676520616464726573730000000000000000604082015260600190565b6020808252601590820152740d2dcc6dee4e4cac6e840c8c2e8c240d8cadccee8d605b1b604082015260600190565b60208082526018908201527f5472616e73616374696f6e20666565206e6f7420706169640000000000000000604082015260600190565b90815260200190565b6001600160a01b0381168114610e9557600080fdfe60806040526040516032380380603283398181016040526020811015602357600080fd5b50516001600160a01b038116fffe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c5361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220b123482c1c177f8cb204da403a17bf318a69117dcbe3f386a6534331f205816a64736f6c63430007050033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000088ad09518695c6c3712ac10a214be5109a655671000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000096884fcaac082db4b32601ada5b177fd6cbffa88000000000000000000000000000000000000000000002a5a058fc295ed0000000000000000000000000000008a103bd158e641f82c2fd594c70db414b23d22770000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000dfe219459932c0cd41413fec92cd8e1a49a386e0
-----Decoded View---------------
Arg [0] : _bridge (address): 0x88ad09518695c6c3712AC10a214bE5109a655671
Arg [1] : _weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [2] : _zklk (address): 0x96884fcAAc082Db4B32601aDA5b177FD6cBFFA88
Arg [3] : _minimumHoldAmount (uint256): 200000000000000000000000
Arg [4] : _feeTo (address): 0x8A103bD158e641F82c2Fd594C70db414b23D2277
Arg [5] : _basicFeeRatio (uint256): 5
Arg [6] : _higherFeeRatio (uint256): 10
Arg [7] : _receiver (address): 0xdfE219459932c0CD41413fec92CD8E1A49a386e0
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 00000000000000000000000088ad09518695c6c3712ac10a214be5109a655671
Arg [1] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [2] : 00000000000000000000000096884fcaac082db4b32601ada5b177fd6cbffa88
Arg [3] : 000000000000000000000000000000000000000000002a5a058fc295ed000000
Arg [4] : 0000000000000000000000008a103bd158e641f82c2fd594c70db414b23d2277
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [6] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [7] : 000000000000000000000000dfe219459932c0cd41413fec92cd8e1a49a386e0
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.