Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 388 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Safe Execute Sig... | 21848911 | 11 mins ago | IN | 0 ETH | 0.00021111 | ||||
Safe Execute Sig... | 21844980 | 13 hrs ago | IN | 0 ETH | 0.00035557 | ||||
Safe Execute Sig... | 21840912 | 27 hrs ago | IN | 0 ETH | 0.00024626 | ||||
Safe Execute Sig... | 21837526 | 38 hrs ago | IN | 0 ETH | 0.00026888 | ||||
Safe Execute Sig... | 21829634 | 2 days ago | IN | 0 ETH | 0.00028247 | ||||
Safe Execute Sig... | 21826967 | 3 days ago | IN | 0 ETH | 0.00024004 | ||||
Safe Execute Sig... | 21824148 | 3 days ago | IN | 0 ETH | 0.00057578 | ||||
Safe Execute Sig... | 21823434 | 3 days ago | IN | 0 ETH | 0.00025031 | ||||
Safe Execute Sig... | 21823274 | 3 days ago | IN | 0 ETH | 0.00031789 | ||||
Safe Execute Sig... | 21816906 | 4 days ago | IN | 0 ETH | 0.00045793 | ||||
Safe Execute Sig... | 21811334 | 5 days ago | IN | 0 ETH | 0.00023767 | ||||
Safe Execute Sig... | 21809693 | 5 days ago | IN | 0 ETH | 0.00025885 | ||||
Safe Execute Sig... | 21809613 | 5 days ago | IN | 0 ETH | 0.00027191 | ||||
Safe Execute Sig... | 21807251 | 5 days ago | IN | 0 ETH | 0.00024229 | ||||
Safe Execute Sig... | 21807197 | 5 days ago | IN | 0 ETH | 0.0002491 | ||||
Safe Execute Sig... | 21805233 | 6 days ago | IN | 0 ETH | 0.00025636 | ||||
Safe Execute Sig... | 21802426 | 6 days ago | IN | 0 ETH | 0.00036459 | ||||
Safe Execute Sig... | 21794863 | 7 days ago | IN | 0 ETH | 0.00028888 | ||||
Safe Execute Sig... | 21787692 | 8 days ago | IN | 0 ETH | 0.00038641 | ||||
Safe Execute Sig... | 21780471 | 9 days ago | IN | 0 ETH | 0.00044642 | ||||
Safe Execute Sig... | 21779089 | 9 days ago | IN | 0 ETH | 0.00040076 | ||||
Safe Execute Sig... | 21778245 | 9 days ago | IN | 0 ETH | 0.00035667 | ||||
Safe Execute Sig... | 21773967 | 10 days ago | IN | 0 ETH | 0.00134463 | ||||
Safe Execute Sig... | 21773286 | 10 days ago | IN | 0 ETH | 0.00053845 | ||||
Safe Execute Sig... | 21769232 | 11 days ago | IN | 0 ETH | 0.0018837 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
21848911 | 11 mins ago | 0.00028742 ETH | ||||
21848911 | 11 mins ago | 0.21415745 ETH | ||||
21848911 | 11 mins ago | 0.21444488 ETH | ||||
21844980 | 13 hrs ago | 0.00048487 ETH | ||||
21844980 | 13 hrs ago | 0.10760841 ETH | ||||
21844980 | 13 hrs ago | 0.10809328 ETH | ||||
21837526 | 38 hrs ago | 0.00036624 ETH | ||||
21837526 | 38 hrs ago | 0.10284154 ETH | ||||
21837526 | 38 hrs ago | 0.10320779 ETH | ||||
21830904 | 2 days ago | 0.07929728 ETH | ||||
21830904 | 2 days ago | 0.07929728 ETH | ||||
21829634 | 2 days ago | 0.00089276 ETH | ||||
21829634 | 2 days ago | 0.01977309 ETH | ||||
21829634 | 2 days ago | 0.02066586 ETH | ||||
21824148 | 3 days ago | 0.00078392 ETH | ||||
21824148 | 3 days ago | 0.11656066 ETH | ||||
21824148 | 3 days ago | 0.11734459 ETH | ||||
21823434 | 3 days ago | 0.00034028 ETH | ||||
21823434 | 3 days ago | 0.02003562 ETH | ||||
21823434 | 3 days ago | 0.02037591 ETH | ||||
21823274 | 3 days ago | 0.00109779 ETH | ||||
21823274 | 3 days ago | 0.0756712 ETH | ||||
21823274 | 3 days ago | 0.076769 ETH | ||||
21816906 | 4 days ago | 0.00062468 ETH | ||||
21816906 | 4 days ago | 0.11679458 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
TokenOmnibridgeRouter
Compiler Version
v0.8.24+commit.e11b9ed9
Optimization Enabled:
No with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.24; import { ReentrancyV2 } from "./ReentrancyV2.sol"; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import { IBasicAMBMediator } from "../interfaces/IBasicAMBMediator.sol"; import { IBasicForeignAMB } from "../interfaces/IBasicForeignAMB.sol"; import { IBridgeValidators } from "../interfaces/IBridgeValidators.sol"; import { IOmnibridge } from "../interfaces/IOmnibridge.sol"; import { IWETH as IWNative } from "../interfaces/IWETH.sol"; import { AddressHelper } from "../libraries/AddressHelper.sol"; import { Bytes } from "../libraries/Bytes.sol"; import { OwnableModule } from "../upgradeable_contracts/modules/OwnableModule.sol"; import { Claimable } from "../upgradeable_contracts/Claimable.sol"; import { StorageSlot } from "@openzeppelin/contracts/utils/StorageSlot.sol"; /** * @title TokenOmnibridgeRouter * @dev Omnibridge extension for processing tokens that are not otherwise * delivered automatically because of foreign omnibridge settings */ contract TokenOmnibridgeRouter is OwnableModule, Claimable, ReentrancyV2 { using SafeERC20 for IERC20; bool public immutable EIP1559_ENABLED; IOmnibridge public immutable bridge; IWNative public immutable WNative; address public validatorsFilter; mapping(address => bool) public isValidator; error NotPayable(); bytes32 public constant RUNNER_SLOT = keccak256(abi.encode("omnibridgerouter.runner")); /** * @dev Initializes this contract. * @param _bridge address of the HomeOmnibridge/ForeignOmnibridge contract. * @param _wNative address of the WNative token used for wrapping/unwrapping native coins (e.g. WETH/WBNB/WXDAI). * @param _owner address of the contract owner. */ constructor( IOmnibridge _bridge, IWNative _wNative, address _owner, bool _EIP1559_ENABLED ) OwnableModule(_owner) { bridge = _bridge; WNative = _wNative; _wNative.approve(address(_bridge), type(uint256).max); validatorsFilter = address(this); EIP1559_ENABLED = _EIP1559_ENABLED; } /** * @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() external payable { _relayTokensAndCall(msg.sender, ""); } /** * @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) external payable { _relayTokensAndCall(_receiver, ""); } /** * a convenience method for relaying tokens to a corresponding network * @param _receiver the receiving contract on the other network * @param _data the encoded data that should be passed to `onTokenBridged` on the other network */ function relayTokensAndCall(address _receiver, bytes calldata _data) external payable { _relayTokensAndCall(_receiver, _data); } function _relayTokensAndCall(address _receiver, bytes memory _data) internal { WNative.deposit{ value: msg.value }(); bridge.relayTokensAndCall(address(WNative), _receiver, msg.value, _data); } struct FeeDirector { address recipient; // a list of up to 256 flags for modifying how the contract handles tokens // 0th index is to use the limit as the fee amount // 1st index is to unwrap the tokens // 2nd is to ask the system to not include the priority fee // 3rd is to use the multiplier as a factor of total tokens // if a base fee is available it will only use that uint256 settings; uint256 limit; uint256 multiplier; } /** * @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 WNative. * @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 payable virtual nonReentrant { require(msg.sender == address(bridge)); if (_data.length == 20) { // handling legacy WNative -> Native require(_token == address(WNative)); WNative.withdraw(_value); AddressHelper.safeSendValue(payable(Bytes.bytesToAddress(_data)), _value); } else { FeeDirector memory feeDirector = abi.decode(_data, (FeeDirector)); // setting at the 0th slot from the right is a signal to unwrap the tokens bool toNative = feeDirector.settings << 254 >> 255 == 1 && address(WNative) == _token; // handling WNative -> Native if (toNative && _token == address(WNative)) { WNative.withdraw(_value); } uint256 runner = StorageSlot.getUint256Slot(RUNNER_SLOT).value; uint256 fees; uint256 toRecipient = _value; if (runner > 1) { // setting at the 1st slot from the right is a signal to use the limit as the fixed fee (fees, toRecipient) = _feeInfo(toNative, _value, runner, feeDirector); } if (toRecipient > 0) { _distribute(toNative, _token, feeDirector.recipient, toRecipient); } if (fees > 0) { _distribute(toNative, _token, address(uint160(runner >> 96)), fees); } } } function _distribute(bool native, address token, address recipient, uint256 amount) internal { if (native) { (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert NotPayable(); } } else { IERC20(token).safeTransfer(recipient, amount); } } function _feeInfo( bool toNative, uint256 _value, uint256 runner, FeeDirector memory feeDirector ) internal view returns(uint256 fees, uint256 toRecipient) { // use the limit as the fee if (feeDirector.settings << 255 >> 255 == 1) { fees = feeDirector.limit; } else if (feeDirector.settings << 252 >> 255 == 1) { fees = (_value * feeDirector.multiplier) / 1 ether; } else { // a runner has been named (does not have to match sender) uint256 gasUsed = uint256(uint96(runner)) - gasleft(); // extra 50k added for 2x transfer handling + 10% // to cover profit motive + risk compensation uint256 baselineFee = _baseFee((feeDirector.settings << 253 >> 255) == 1); fees = ((gasUsed + ( // this is an unwrap, different costs for tokens vs native toNative ? 50_000 : 100_000 )) * feeDirector.multiplier * baselineFee) / 1 ether; // fees must not be greater than limit fees = fees > feeDirector.limit ? feeDirector.limit : fees; } // fees must not be greater than value fees = fees > _value ? _value : fees; toRecipient = _value - fees; } function feeInfo( bool toNative, uint256 _value, uint256 runner, FeeDirector calldata feeDirector ) external view returns(uint256, uint256) { return _feeInfo(toNative, _value, runner, feeDirector); } function baseFee(bool excludePriority) external view returns(uint256) { return _baseFee(excludePriority); } function _baseFee(bool excludePriority) internal view returns(uint256) { return EIP1559_ENABLED && excludePriority ? block.basefee : tx.gasprice; } /** * @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); } /** * @dev Ether receive function. * Should be only called from the WNative contract when withdrawing native coins. Will revert otherwise. */ receive() external payable { require(msg.sender == address(WNative)); } /** * @dev Validates provided signatures and relays a given message. Passes all available gas for the execution. * The message is not allowed to fail. The whole tx will be revered if message fails. * @param runner the validator you would like to attribute this method call to * @param _data bytes to be relayed * @param _signatures bytes blob with signatures to be validated * @notice that the sender does not matter, so this method could be called via * multicall for more efficient gas savings and still attribute tokens to the validator appropriately */ function safeExecuteSignaturesWithAutoGasLimit( address runner, bytes calldata _data, bytes calldata _signatures ) external payable nonReentrantUint256(RUNNER_SLOT, uint256(uint96(gasleft())) | (uint256(uint160(runner)) << 96)) { if (!IBridgeValidators(validatorsFilter).isValidator(runner)) { revert NotPayable(); } IBasicForeignAMB(address(IBasicAMBMediator(address(bridge)).bridgeContract())) .safeExecuteSignaturesWithAutoGasLimit(_data, _signatures); } /** * updates the filter to any contract. * for future use case, this is the bridge's validator contract */ function setValidatorsFilter(address _validatorsFilter) external payable onlyOwner { // if this doesn't fail we are at least guaranteed that it has the method IBridgeValidators(_validatorsFilter).isValidator(address(0)); validatorsFilter = _validatorsFilter; } /** mev protection management */ function setValidatorStatus(address _validator, bool _isValidator) external payable onlyOwner { isValidator[_validator] = _isValidator; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * ==== Security Considerations * * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be * considered as an intention to spend the allowance in any specific way. The second is that because permits have * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be * generally recommended is: * * ```solidity * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} * doThing(..., value); * } * * function doThing(..., uint256 value) public { * token.safeTransferFrom(msg.sender, address(this), value); * ... * } * ``` * * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also * {SafeERC20-safeTransferFrom}). * * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so * contracts should have entry points that don't rely on permit. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. * * CAUTION: See Security Considerations above. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.20; import {IERC20} from "../IERC20.sol"; import {IERC20Permit} from "../extensions/IERC20Permit.sol"; import {Address} from "../../../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 Address for address; /** * @dev An operation with an ERC20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @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); if (returndata.length != 0 && !abi.decode(returndata, (bool))) { revert SafeERC20FailedOperation(address(token)); } } /** * @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). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // 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 cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol) pragma solidity ^0.8.20; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error AddressInsufficientBalance(address account); /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedInnerCall(); /** * @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://consensys.net/diligence/blog/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.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert AddressInsufficientBalance(address(this)); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert FailedInnerCall(); } } /** * @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 or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {FailedInnerCall} error. * * 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. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @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`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert AddressInsufficientBalance(address(this)); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an * unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {FailedInnerCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. */ function _revert(bytes memory returndata) private pure { // 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert FailedInnerCall(); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/StorageSlot.sol) // This file was procedurally generated from scripts/generate/templates/StorageSlot.js. pragma solidity ^0.8.20; /** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC1967 implementation slot: * ```solidity * contract ERC1967 { * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(newImplementation.code.length > 0); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` */ library StorageSlot { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } struct StringSlot { string value; } struct BytesSlot { bytes value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `StringSlot` with member `value` located at `slot`. */ function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `StringSlot` representation of the string storage pointer `store`. */ function getStringSlot(string storage store) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } } /** * @dev Returns an `BytesSlot` with member `value` located at `slot`. */ function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`. */ function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } } }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.24; import { StorageSlot } from "@openzeppelin/contracts/utils/StorageSlot.sol"; abstract contract ReentrancyV2 { error ReentrancyGuard(); error InvalidValue(); uint256 private constant _ENTERED = 2; uint256 private constant _NOT_ENTERED = 1; // global reentrant uint256 internal reentrant; modifier nonReentrant() { if (uint256(reentrant) > _NOT_ENTERED) { revert ReentrancyGuard(); } reentrant = _ENTERED; _; reentrant = _NOT_ENTERED; } modifier nonReentrantUint256(bytes32 key, uint256 value) { if (value < _ENTERED) { revert InvalidValue(); } StorageSlot.Uint256Slot storage slot = StorageSlot.getUint256Slot(key); if (slot.value > _NOT_ENTERED) { revert ReentrancyGuard(); } slot.value = value; _; slot.value = _NOT_ENTERED; } }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.24; interface IAMB { event UserRequestForAffirmation(bytes32 indexed messageId, bytes encodedData); event UserRequestForSignature(bytes32 indexed messageId, bytes encodedData); event AffirmationCompleted( address indexed sender, address indexed executor, bytes32 indexed messageId, bool status ); event RelayedMessage(address indexed sender, address indexed executor, bytes32 indexed messageId, bool status); function messageSender() external view returns (address); function maxGasPerTx() external view returns (uint256); function transactionHash() external view returns (bytes32); function messageId() external view returns (bytes32); function messageSourceChainId() external view returns (bytes32); function messageCallStatus(bytes32 _messageId) external view returns (bool); function failedMessageDataHash(bytes32 _messageId) external view returns (bytes32); function failedMessageReceiver(bytes32 _messageId) external view returns (address); function failedMessageSender(bytes32 _messageId) external view returns (address); function requireToPassMessage( address _contract, bytes calldata _data, uint256 _gas ) external returns (bytes32); function requireToConfirmMessage( address _contract, bytes calldata _data, uint256 _gas ) external returns (bytes32); function sourceChainId() external view returns (uint256); function destinationChainId() external view returns (uint256); }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.24; import { IAMB } from "./IAMB.sol"; interface IBasicAMBMediator { function bridgeContract() external view returns (IAMB); }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.24; import { IBridgeValidators } from "./IBridgeValidators.sol"; interface IBasicForeignAMB { function safeExecuteSignaturesWithAutoGasLimit(bytes calldata _data, bytes calldata _signatures) external; function validatorContract() external view returns (IBridgeValidators); function relayTokens(address _receiver, uint256 _amount) external; }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.24; interface IBridgeValidators { function isValidator(address _validator) external view returns (bool); function F_ADDR() external view returns (address); function getNextValidator(address _address) external view returns (address); function validatorCount() external view returns (uint256); function validatorList() external view returns(address[] memory); }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.24; interface IOmnibridge { function relayTokens( address _token, address _receiver, uint256 _value ) external; function relayTokensAndCall( address _token, address _receiver, uint256 _value, bytes calldata _data ) external; }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.24; interface IWETH { function deposit() external payable; function withdraw(uint256 _value) external; function approve(address _to, uint256 _value) external; }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.24; 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); } } }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.24; /** * @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)) } } }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.24; import "@openzeppelin/contracts/token/ERC20/utils/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 virtual { 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 virtual { IERC20 token = IERC20(_token); uint256 balance = token.balanceOf(address(this)); token.safeTransfer(_to, balance); } }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.24; 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; } }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.24; contract Sacrifice { constructor(address payable _recipient) payable { selfdestruct(_recipient); } }
{ "evmVersion": "paris", "optimizer": { "enabled": false, "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":"_wNative","type":"address"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"bool","name":"_EIP1559_ENABLED","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InvalidValue","type":"error"},{"inputs":[],"name":"NotPayable","type":"error"},{"inputs":[],"name":"ReentrancyGuard","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"EIP1559_ENABLED","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RUNNER_SLOT","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WNative","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"excludePriority","type":"bool"}],"name":"baseFee","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":"bool","name":"toNative","type":"bool"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"runner","type":"uint256"},{"components":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"settings","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"},{"internalType":"uint256","name":"multiplier","type":"uint256"}],"internalType":"struct TokenOmnibridgeRouter.FeeDirector","name":"feeDirector","type":"tuple"}],"name":"feeInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isValidator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"relayTokensAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"runner","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"bytes","name":"_signatures","type":"bytes"}],"name":"safeExecuteSignaturesWithAutoGasLimit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_validator","type":"address"},{"internalType":"bool","name":"_isValidator","type":"bool"}],"name":"setValidatorStatus","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_validatorsFilter","type":"address"}],"name":"setValidatorsFilter","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"validatorsFilter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wrapAndRelayTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"wrapAndRelayTokens","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60e06040523480156200001157600080fd5b5060405162002c2738038062002c278339818101604052810190620000379190620002fa565b81806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508373ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508273ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508273ffffffffffffffffffffffffffffffffffffffff1663095ea7b3857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016200013e92919062000398565b600060405180830381600087803b1580156200015957600080fd5b505af11580156200016e573d6000803e3d6000fd5b5050505030600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080151560808115158152505050505050620003c5565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620001fb82620001ce565b9050919050565b60006200020f82620001ee565b9050919050565b620002218162000202565b81146200022d57600080fd5b50565b600081519050620002418162000216565b92915050565b60006200025482620001ee565b9050919050565b620002668162000247565b81146200027257600080fd5b50565b60008151905062000286816200025b565b92915050565b6200029781620001ee565b8114620002a357600080fd5b50565b600081519050620002b7816200028c565b92915050565b60008115159050919050565b620002d481620002bd565b8114620002e057600080fd5b50565b600081519050620002f481620002c9565b92915050565b60008060008060808587031215620003175762000316620001c9565b5b6000620003278782880162000230565b94505060206200033a8782880162000275565b93505060406200034d87828801620002a6565b92505060606200036087828801620002e3565b91505092959194509250565b6200037781620001ee565b82525050565b6000819050919050565b62000392816200037d565b82525050565b6000604082019050620003af60008301856200036c565b620003be602083018462000387565b9392505050565b60805160a05160c0516127de620004496000396000818161012f01528181610b5901528181610bb201528181610ca801528181610cec01528181610d4201528181610f6201528181610ff401526110b30152600081816107b101528181610af601528181610e7e0152611077015260008181610ea2015261113201526127de6000f3fe608060405260043610620001275760003560e01c8063aca2490b11620000a3578063f2fde38b116200006d578063f2fde38b146200039b578063f3ec43c714620003c9578063f52cbf0e14620003f9578063facd743b1462000419578063fba9770a146200045d5762000188565b8063aca2490b14620002fb578063db7af854146200031b578063e78cea92146200033b578063ed5a97d3146200036b5762000188565b8063633a8fa911620000f1578063633a8fa9146200021d57806369ffa08a146200024d57806370502107146200027b5780638da5cb5b14620002ab5780639562de5914620002db5762000188565b806301a754ff146200018d578063351bb549146200019957806336768d3e14620001dd5780634309b71414620001fd5762000188565b3662000188577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200018657600080fd5b005b600080fd5b62000197620004a2565b005b348015620001a657600080fd5b50620001c56004803603810190620001bf9190620018e8565b620004bf565b604051620001d4919062001935565b60405180910390f35b620001fb6004803603810190620001f59190620019b7565b620004d3565b005b6200021b600480360381019062000215919062001a57565b620005f1565b005b3480156200022a57600080fd5b5062000235620008c9565b60405162000244919062001b16565b60405180910390f35b3480156200025a57600080fd5b5062000279600480360381019062000273919062001b33565b620008f3565b005b3480156200028857600080fd5b50620002936200095c565b604051620002a2919062001b8b565b60405180910390f35b348015620002b857600080fd5b50620002c362000982565b604051620002d2919062001b8b565b60405180910390f35b620002f96004803603810190620002f3919062001ba8565b620009a6565b005b62000319600480360381019062000313919062001c12565b620009fb565b005b62000339600480360381019062000333919062001de7565b62000aaf565b005b3480156200034857600080fd5b506200035362000e7c565b60405162000362919062001ecd565b60405180910390f35b3480156200037857600080fd5b506200038362000ea0565b60405162000392919062001efb565b60405180910390f35b348015620003a857600080fd5b50620003c76004803603810190620003c19190620019b7565b62000ec4565b005b348015620003d657600080fd5b50620003e162000f60565b604051620003f0919062001f3d565b60405180910390f35b620004176004803603810190620004119190620019b7565b62000f84565b005b3480156200042657600080fd5b506200044560048036038101906200043f9190620019b7565b62000fa2565b60405162000454919062001efb565b60405180910390f35b3480156200046a57600080fd5b5062000489600480360381019062000483919062001f81565b62000fc2565b6040516200049992919062001ff3565b60405180910390f35b620004bd336040518060200160405280600081525062000ff2565b565b6000620004cc826200112e565b9050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200052c57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1663facd743b60006040518263ffffffff1660e01b815260040162000568919062001b8b565b602060405180830381865afa15801562000586573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005ac919062002037565b5080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040516020016200060290620020ca565b6040516020818303038152906040528051906020012060608673ffffffffffffffffffffffffffffffffffffffff16901b5a6bffffffffffffffffffffffff161760028110156200067f576040517faa7feadc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006200068c8362001170565b9050600181600001541115620006ce576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818160000181905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663facd743b896040518263ffffffff1660e01b815260040162000734919062001b8b565b602060405180830381865afa15801562000752573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000778919062002037565b620007af576040517f1574f9f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cd5965836040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200081b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000841919062002131565b73ffffffffffffffffffffffffffffffffffffffff166323caab49888888886040518563ffffffff1660e01b8152600401620008819493929190620021a7565b600060405180830381600087803b1580156200089c57600080fd5b505af1158015620008b1573d6000803e3d6000fd5b50505050600181600001819055505050505050505050565b604051602001620008da90620020ca565b6040516020818303038152906040528051906020012081565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200094c57600080fd5b6200095882826200117a565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b620009f68383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505062000ff2565b505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161462000a5457600080fd5b80600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60018054111562000aec576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026001819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161462000b4d57600080fd5b601481510362000c5b577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000bb057600080fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040162000c0b919062001935565b600060405180830381600087803b15801562000c2657600080fd5b505af115801562000c3b573d6000803e3d6000fd5b5050505062000c5562000c4e826200120d565b836200121b565b62000e70565b60008180602001905181019062000c7391906200229e565b90506000600160ff60fe8460200151901b901c14801562000cdf57508473ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16145b905080801562000d3a57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b1562000dd0577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d856040518263ffffffff1660e01b815260040162000d9b919062001935565b600060405180830381600087803b15801562000db657600080fd5b505af115801562000dcb573d6000803e3d6000fd5b505050505b600062000e0360405160200162000de790620020ca565b6040516020818303038152906040528051906020012062001170565b600001549050600080869050600183111562000e305762000e278488858862001296565b80925081935050505b600081111562000e4d5762000e4c8489876000015184620013e2565b5b600082111562000e6a5762000e698489606086901c85620013e2565b5b50505050505b60018081905550505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161462000f1d57600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b62000f9f816040518060200160405280600081525062000ff2565b50565b60036020528060005260406000206000915054906101000a900460ff1681565b60008062000fe58686868680360381019062000fdf919062002355565b62001296565b9150915094509492505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156200105b57600080fd5b505af115801562001070573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d74054817f00000000000000000000000000000000000000000000000000000000000000008434856040518563ffffffff1660e01b8152600401620010f69493929190620023ff565b600060405180830381600087803b1580156200111157600080fd5b505af115801562001126573d6000803e3d6000fd5b505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000080156200115b5750815b62001167573a62001169565b485b9050919050565b6000819050919050565b80600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620011b557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603620011fb57620011f582620014cc565b62001208565b620012078383620014e1565b5b505050565b600060148201519050919050565b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050506200129257808260405162001265906200188a565b62001271919062002478565b6040518091039082f09050801580156200128f573d6000803e3d6000fd5b50505b5050565b600080600160ff808560200151901b901c03620012ba5782604001519150620013b6565b600160ff60fc8560200151901b901c03620012fe57670de0b6b3a7640000836060015186620012ea9190620024c4565b620012f691906200253e565b9150620013b5565b60005a856bffffffffffffffffffffffff166200131c919062002576565b905060006200133a600160ff60fd8860200151901b901c146200112e565b9050670de0b6b3a76400008186606001518a6200135b57620186a06200135f565b61c3505b62ffffff1685620013719190620025b1565b6200137d9190620024c4565b620013899190620024c4565b6200139591906200253e565b935084604001518411620013aa5783620013b0565b84604001515b935050505b5b848211620013c55781620013c7565b845b91508185620013d7919062002576565b905094509492505050565b8315620014985760008273ffffffffffffffffffffffffffffffffffffffff1682604051620014119062002621565b60006040518083038185875af1925050503d806000811462001450576040519150601f19603f3d011682016040523d82523d6000602084013e62001455565b606091505b505090508062001491576040517f1574f9f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50620014c6565b620014c582828573ffffffffffffffffffffffffffffffffffffffff166200159c9092919063ffffffff16565b5b50505050565b6000479050620014dd82826200121b565b5050565b600082905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040162001523919062001b8b565b602060405180830381865afa15801562001541573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001567919062002638565b90506200159683828473ffffffffffffffffffffffffffffffffffffffff166200159c9092919063ffffffff16565b50505050565b6200161a838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401620015d29291906200266a565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506200161f565b505050565b60006200164c828473ffffffffffffffffffffffffffffffffffffffff16620016be90919063ffffffff16565b905060008151141580156200167457508080602001905181019062001672919062002037565b155b15620016b957826040517f5274afe7000000000000000000000000000000000000000000000000000000008152600401620016b0919062001b8b565b60405180910390fd5b505050565b6060620016ce83836000620016d6565b905092915050565b6060814710156200172057306040517fcd78605900000000000000000000000000000000000000000000000000000000815260040162001717919062001b8b565b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1684866040516200174b9190620026ce565b60006040518083038185875af1925050503d80600081146200178a576040519150601f19603f3d011682016040523d82523d6000602084013e6200178f565b606091505b5091509150620017a1868383620017ac565b925050509392505050565b606082620017c557620017bf8262001844565b6200183c565b60008251148015620017ee575060008473ffffffffffffffffffffffffffffffffffffffff163b145b156200183357836040517f9996b3150000000000000000000000000000000000000000000000000000000081526004016200182a919062001b8b565b60405180910390fd5b8190506200183d565b5b9392505050565b600081511115620018585780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c180620026e883390190565b6000604051905090565b600080fd5b600080fd5b60008115159050919050565b620018c281620018ab565b8114620018ce57600080fd5b50565b600081359050620018e281620018b7565b92915050565b600060208284031215620019015762001900620018a1565b5b60006200191184828501620018d1565b91505092915050565b6000819050919050565b6200192f816200191a565b82525050565b60006020820190506200194c600083018462001924565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200197f8262001952565b9050919050565b620019918162001972565b81146200199d57600080fd5b50565b600081359050620019b18162001986565b92915050565b600060208284031215620019d057620019cf620018a1565b5b6000620019e084828501620019a0565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011262001a115762001a10620019e9565b5b8235905067ffffffffffffffff81111562001a315762001a30620019ee565b5b60208301915083600182028301111562001a505762001a4f620019f3565b5b9250929050565b60008060008060006060868803121562001a765762001a75620018a1565b5b600062001a8688828901620019a0565b955050602086013567ffffffffffffffff81111562001aaa5762001aa9620018a6565b5b62001ab888828901620019f8565b9450945050604086013567ffffffffffffffff81111562001ade5762001add620018a6565b5b62001aec88828901620019f8565b92509250509295509295909350565b6000819050919050565b62001b108162001afb565b82525050565b600060208201905062001b2d600083018462001b05565b92915050565b6000806040838503121562001b4d5762001b4c620018a1565b5b600062001b5d85828601620019a0565b925050602062001b7085828601620019a0565b9150509250929050565b62001b858162001972565b82525050565b600060208201905062001ba2600083018462001b7a565b92915050565b60008060006040848603121562001bc45762001bc3620018a1565b5b600062001bd486828701620019a0565b935050602084013567ffffffffffffffff81111562001bf85762001bf7620018a6565b5b62001c0686828701620019f8565b92509250509250925092565b6000806040838503121562001c2c5762001c2b620018a1565b5b600062001c3c85828601620019a0565b925050602062001c4f85828601620018d1565b9150509250929050565b62001c64816200191a565b811462001c7057600080fd5b50565b60008135905062001c848162001c59565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62001cda8262001c8f565b810181811067ffffffffffffffff8211171562001cfc5762001cfb62001ca0565b5b80604052505050565b600062001d1162001897565b905062001d1f828262001ccf565b919050565b600067ffffffffffffffff82111562001d425762001d4162001ca0565b5b62001d4d8262001c8f565b9050602081019050919050565b82818337600083830152505050565b600062001d8062001d7a8462001d24565b62001d05565b90508281526020810184848401111562001d9f5762001d9e62001c8a565b5b62001dac84828562001d5a565b509392505050565b600082601f83011262001dcc5762001dcb620019e9565b5b813562001dde84826020860162001d69565b91505092915050565b60008060006060848603121562001e035762001e02620018a1565b5b600062001e1386828701620019a0565b935050602062001e268682870162001c73565b925050604084013567ffffffffffffffff81111562001e4a5762001e49620018a6565b5b62001e588682870162001db4565b9150509250925092565b6000819050919050565b600062001e8d62001e8762001e818462001952565b62001e62565b62001952565b9050919050565b600062001ea18262001e6c565b9050919050565b600062001eb58262001e94565b9050919050565b62001ec78162001ea8565b82525050565b600060208201905062001ee4600083018462001ebc565b92915050565b62001ef581620018ab565b82525050565b600060208201905062001f12600083018462001eea565b92915050565b600062001f258262001e94565b9050919050565b62001f378162001f18565b82525050565b600060208201905062001f54600083018462001f2c565b92915050565b600080fd5b60006080828403121562001f785762001f7762001f5a565b5b81905092915050565b60008060008060e0858703121562001f9e5762001f9d620018a1565b5b600062001fae87828801620018d1565b945050602062001fc18782880162001c73565b935050604062001fd48782880162001c73565b925050606062001fe78782880162001f5f565b91505092959194509250565b60006040820190506200200a600083018562001924565b62002019602083018462001924565b9392505050565b6000815190506200203181620018b7565b92915050565b60006020828403121562002050576200204f620018a1565b5b6000620020608482850162002020565b91505092915050565b600082825260208201905092915050565b7f6f6d6e69627269646765726f757465722e72756e6e6572000000000000000000600082015250565b6000620020b260178362002069565b9150620020bf826200207a565b602082019050919050565b60006020820190508181036000830152620020e581620020a3565b9050919050565b6000620020f98262001972565b9050919050565b6200210b81620020ec565b81146200211757600080fd5b50565b6000815190506200212b8162002100565b92915050565b6000602082840312156200214a5762002149620018a1565b5b60006200215a848285016200211a565b91505092915050565b600082825260208201905092915050565b600062002182838562002163565b93506200219183858462001d5a565b6200219c8362001c8f565b840190509392505050565b60006040820190508181036000830152620021c481868862002174565b90508181036020830152620021db81848662002174565b905095945050505050565b600080fd5b600081519050620021fc8162001986565b92915050565b600081519050620022138162001c59565b92915050565b600060808284031215620022325762002231620021e6565b5b6200223e608062001d05565b905060006200225084828501620021eb565b6000830152506020620022668482850162002202565b60208301525060406200227c8482850162002202565b6040830152506060620022928482850162002202565b60608301525092915050565b600060808284031215620022b757620022b6620018a1565b5b6000620022c78482850162002219565b91505092915050565b600060808284031215620022e957620022e8620021e6565b5b620022f5608062001d05565b905060006200230784828501620019a0565b60008301525060206200231d8482850162001c73565b6020830152506040620023338482850162001c73565b6040830152506060620023498482850162001c73565b60608301525092915050565b6000608082840312156200236e576200236d620018a1565b5b60006200237e84828501620022d0565b91505092915050565b600081519050919050565b60005b83811015620023b257808201518184015260208101905062002395565b60008484015250505050565b6000620023cb8262002387565b620023d7818562002163565b9350620023e981856020860162002392565b620023f48162001c8f565b840191505092915050565b600060808201905062002416600083018762001b7a565b62002425602083018662001b7a565b62002434604083018562001924565b8181036060830152620024488184620023be565b905095945050505050565b6000620024608262001952565b9050919050565b620024728162002453565b82525050565b60006020820190506200248f600083018462002467565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620024d1826200191a565b9150620024de836200191a565b9250828202620024ee816200191a565b9150828204841483151762002508576200250762002495565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006200254b826200191a565b915062002558836200191a565b9250826200256b576200256a6200250f565b5b828204905092915050565b600062002583826200191a565b915062002590836200191a565b9250828203905081811115620025ab57620025aa62002495565b5b92915050565b6000620025be826200191a565b9150620025cb836200191a565b9250828201905080821115620025e657620025e562002495565b5b92915050565b600081905092915050565b50565b600062002609600083620025ec565b91506200261682620025f7565b600082019050919050565b60006200262e82620025fa565b9150819050919050565b600060208284031215620026515762002650620018a1565b5b6000620026618482850162002202565b91505092915050565b600060408201905062002681600083018562001b7a565b62002690602083018462001924565b9392505050565b6000620026a48262002387565b620026b08185620025ec565b9350620026c281856020860162002392565b80840191505092915050565b6000620026dc828462002697565b91508190509291505056fe60806040526040516100c13803806100c18339818101604052810190602391906098565b8073ffffffffffffffffffffffffffffffffffffffff16ff5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000606a826041565b9050919050565b6078816061565b8114608257600080fd5b50565b6000815190506092816071565b92915050565b60006020828403121560ab5760aa603c565b5b600060b7848285016085565b9150509291505056fea2646970667358221220c7ab15f0d93ff0906e1c5dba2b8d6faaf901111166a33fec2115aca511b62fd464736f6c634300081800330000000000000000000000001715a3e4a142d8b698131108995174f37aeba10d000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000af2ce0189f46f5663715b0b9ed2a10ea924ab9b00000000000000000000000000000000000000000000000000000000000000001
Deployed Bytecode
0x608060405260043610620001275760003560e01c8063aca2490b11620000a3578063f2fde38b116200006d578063f2fde38b146200039b578063f3ec43c714620003c9578063f52cbf0e14620003f9578063facd743b1462000419578063fba9770a146200045d5762000188565b8063aca2490b14620002fb578063db7af854146200031b578063e78cea92146200033b578063ed5a97d3146200036b5762000188565b8063633a8fa911620000f1578063633a8fa9146200021d57806369ffa08a146200024d57806370502107146200027b5780638da5cb5b14620002ab5780639562de5914620002db5762000188565b806301a754ff146200018d578063351bb549146200019957806336768d3e14620001dd5780634309b71414620001fd5762000188565b3662000188577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200018657600080fd5b005b600080fd5b62000197620004a2565b005b348015620001a657600080fd5b50620001c56004803603810190620001bf9190620018e8565b620004bf565b604051620001d4919062001935565b60405180910390f35b620001fb6004803603810190620001f59190620019b7565b620004d3565b005b6200021b600480360381019062000215919062001a57565b620005f1565b005b3480156200022a57600080fd5b5062000235620008c9565b60405162000244919062001b16565b60405180910390f35b3480156200025a57600080fd5b5062000279600480360381019062000273919062001b33565b620008f3565b005b3480156200028857600080fd5b50620002936200095c565b604051620002a2919062001b8b565b60405180910390f35b348015620002b857600080fd5b50620002c362000982565b604051620002d2919062001b8b565b60405180910390f35b620002f96004803603810190620002f3919062001ba8565b620009a6565b005b62000319600480360381019062000313919062001c12565b620009fb565b005b62000339600480360381019062000333919062001de7565b62000aaf565b005b3480156200034857600080fd5b506200035362000e7c565b60405162000362919062001ecd565b60405180910390f35b3480156200037857600080fd5b506200038362000ea0565b60405162000392919062001efb565b60405180910390f35b348015620003a857600080fd5b50620003c76004803603810190620003c19190620019b7565b62000ec4565b005b348015620003d657600080fd5b50620003e162000f60565b604051620003f0919062001f3d565b60405180910390f35b620004176004803603810190620004119190620019b7565b62000f84565b005b3480156200042657600080fd5b506200044560048036038101906200043f9190620019b7565b62000fa2565b60405162000454919062001efb565b60405180910390f35b3480156200046a57600080fd5b5062000489600480360381019062000483919062001f81565b62000fc2565b6040516200049992919062001ff3565b60405180910390f35b620004bd336040518060200160405280600081525062000ff2565b565b6000620004cc826200112e565b9050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200052c57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1663facd743b60006040518263ffffffff1660e01b815260040162000568919062001b8b565b602060405180830381865afa15801562000586573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005ac919062002037565b5080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040516020016200060290620020ca565b6040516020818303038152906040528051906020012060608673ffffffffffffffffffffffffffffffffffffffff16901b5a6bffffffffffffffffffffffff161760028110156200067f576040517faa7feadc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006200068c8362001170565b9050600181600001541115620006ce576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818160000181905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663facd743b896040518263ffffffff1660e01b815260040162000734919062001b8b565b602060405180830381865afa15801562000752573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000778919062002037565b620007af576040517f1574f9f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000001715a3e4a142d8b698131108995174f37aeba10d73ffffffffffffffffffffffffffffffffffffffff1663cd5965836040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200081b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000841919062002131565b73ffffffffffffffffffffffffffffffffffffffff166323caab49888888886040518563ffffffff1660e01b8152600401620008819493929190620021a7565b600060405180830381600087803b1580156200089c57600080fd5b505af1158015620008b1573d6000803e3d6000fd5b50505050600181600001819055505050505050505050565b604051602001620008da90620020ca565b6040516020818303038152906040528051906020012081565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200094c57600080fd5b6200095882826200117a565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b620009f68383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505062000ff2565b505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161462000a5457600080fd5b80600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60018054111562000aec576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026001819055507f0000000000000000000000001715a3e4a142d8b698131108995174f37aeba10d73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161462000b4d57600080fd5b601481510362000c5b577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000bb057600080fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040162000c0b919062001935565b600060405180830381600087803b15801562000c2657600080fd5b505af115801562000c3b573d6000803e3d6000fd5b5050505062000c5562000c4e826200120d565b836200121b565b62000e70565b60008180602001905181019062000c7391906200229e565b90506000600160ff60fe8460200151901b901c14801562000cdf57508473ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16145b905080801562000d3a57507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b1562000dd0577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d856040518263ffffffff1660e01b815260040162000d9b919062001935565b600060405180830381600087803b15801562000db657600080fd5b505af115801562000dcb573d6000803e3d6000fd5b505050505b600062000e0360405160200162000de790620020ca565b6040516020818303038152906040528051906020012062001170565b600001549050600080869050600183111562000e305762000e278488858862001296565b80925081935050505b600081111562000e4d5762000e4c8489876000015184620013e2565b5b600082111562000e6a5762000e698489606086901c85620013e2565b5b50505050505b60018081905550505050565b7f0000000000000000000000001715a3e4a142d8b698131108995174f37aeba10d81565b7f000000000000000000000000000000000000000000000000000000000000000181565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161462000f1d57600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b62000f9f816040518060200160405280600081525062000ff2565b50565b60036020528060005260406000206000915054906101000a900460ff1681565b60008062000fe58686868680360381019062000fdf919062002355565b62001296565b9150915094509492505050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156200105b57600080fd5b505af115801562001070573d6000803e3d6000fd5b50505050507f0000000000000000000000001715a3e4a142d8b698131108995174f37aeba10d73ffffffffffffffffffffffffffffffffffffffff1663d74054817f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28434856040518563ffffffff1660e01b8152600401620010f69493929190620023ff565b600060405180830381600087803b1580156200111157600080fd5b505af115801562001126573d6000803e3d6000fd5b505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000180156200115b5750815b62001167573a62001169565b485b9050919050565b6000819050919050565b80600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620011b557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603620011fb57620011f582620014cc565b62001208565b620012078383620014e1565b5b505050565b600060148201519050919050565b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050506200129257808260405162001265906200188a565b62001271919062002478565b6040518091039082f09050801580156200128f573d6000803e3d6000fd5b50505b5050565b600080600160ff808560200151901b901c03620012ba5782604001519150620013b6565b600160ff60fc8560200151901b901c03620012fe57670de0b6b3a7640000836060015186620012ea9190620024c4565b620012f691906200253e565b9150620013b5565b60005a856bffffffffffffffffffffffff166200131c919062002576565b905060006200133a600160ff60fd8860200151901b901c146200112e565b9050670de0b6b3a76400008186606001518a6200135b57620186a06200135f565b61c3505b62ffffff1685620013719190620025b1565b6200137d9190620024c4565b620013899190620024c4565b6200139591906200253e565b935084604001518411620013aa5783620013b0565b84604001515b935050505b5b848211620013c55781620013c7565b845b91508185620013d7919062002576565b905094509492505050565b8315620014985760008273ffffffffffffffffffffffffffffffffffffffff1682604051620014119062002621565b60006040518083038185875af1925050503d806000811462001450576040519150601f19603f3d011682016040523d82523d6000602084013e62001455565b606091505b505090508062001491576040517f1574f9f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50620014c6565b620014c582828573ffffffffffffffffffffffffffffffffffffffff166200159c9092919063ffffffff16565b5b50505050565b6000479050620014dd82826200121b565b5050565b600082905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040162001523919062001b8b565b602060405180830381865afa15801562001541573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001567919062002638565b90506200159683828473ffffffffffffffffffffffffffffffffffffffff166200159c9092919063ffffffff16565b50505050565b6200161a838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401620015d29291906200266a565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506200161f565b505050565b60006200164c828473ffffffffffffffffffffffffffffffffffffffff16620016be90919063ffffffff16565b905060008151141580156200167457508080602001905181019062001672919062002037565b155b15620016b957826040517f5274afe7000000000000000000000000000000000000000000000000000000008152600401620016b0919062001b8b565b60405180910390fd5b505050565b6060620016ce83836000620016d6565b905092915050565b6060814710156200172057306040517fcd78605900000000000000000000000000000000000000000000000000000000815260040162001717919062001b8b565b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1684866040516200174b9190620026ce565b60006040518083038185875af1925050503d80600081146200178a576040519150601f19603f3d011682016040523d82523d6000602084013e6200178f565b606091505b5091509150620017a1868383620017ac565b925050509392505050565b606082620017c557620017bf8262001844565b6200183c565b60008251148015620017ee575060008473ffffffffffffffffffffffffffffffffffffffff163b145b156200183357836040517f9996b3150000000000000000000000000000000000000000000000000000000081526004016200182a919062001b8b565b60405180910390fd5b8190506200183d565b5b9392505050565b600081511115620018585780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c180620026e883390190565b6000604051905090565b600080fd5b600080fd5b60008115159050919050565b620018c281620018ab565b8114620018ce57600080fd5b50565b600081359050620018e281620018b7565b92915050565b600060208284031215620019015762001900620018a1565b5b60006200191184828501620018d1565b91505092915050565b6000819050919050565b6200192f816200191a565b82525050565b60006020820190506200194c600083018462001924565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200197f8262001952565b9050919050565b620019918162001972565b81146200199d57600080fd5b50565b600081359050620019b18162001986565b92915050565b600060208284031215620019d057620019cf620018a1565b5b6000620019e084828501620019a0565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011262001a115762001a10620019e9565b5b8235905067ffffffffffffffff81111562001a315762001a30620019ee565b5b60208301915083600182028301111562001a505762001a4f620019f3565b5b9250929050565b60008060008060006060868803121562001a765762001a75620018a1565b5b600062001a8688828901620019a0565b955050602086013567ffffffffffffffff81111562001aaa5762001aa9620018a6565b5b62001ab888828901620019f8565b9450945050604086013567ffffffffffffffff81111562001ade5762001add620018a6565b5b62001aec88828901620019f8565b92509250509295509295909350565b6000819050919050565b62001b108162001afb565b82525050565b600060208201905062001b2d600083018462001b05565b92915050565b6000806040838503121562001b4d5762001b4c620018a1565b5b600062001b5d85828601620019a0565b925050602062001b7085828601620019a0565b9150509250929050565b62001b858162001972565b82525050565b600060208201905062001ba2600083018462001b7a565b92915050565b60008060006040848603121562001bc45762001bc3620018a1565b5b600062001bd486828701620019a0565b935050602084013567ffffffffffffffff81111562001bf85762001bf7620018a6565b5b62001c0686828701620019f8565b92509250509250925092565b6000806040838503121562001c2c5762001c2b620018a1565b5b600062001c3c85828601620019a0565b925050602062001c4f85828601620018d1565b9150509250929050565b62001c64816200191a565b811462001c7057600080fd5b50565b60008135905062001c848162001c59565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62001cda8262001c8f565b810181811067ffffffffffffffff8211171562001cfc5762001cfb62001ca0565b5b80604052505050565b600062001d1162001897565b905062001d1f828262001ccf565b919050565b600067ffffffffffffffff82111562001d425762001d4162001ca0565b5b62001d4d8262001c8f565b9050602081019050919050565b82818337600083830152505050565b600062001d8062001d7a8462001d24565b62001d05565b90508281526020810184848401111562001d9f5762001d9e62001c8a565b5b62001dac84828562001d5a565b509392505050565b600082601f83011262001dcc5762001dcb620019e9565b5b813562001dde84826020860162001d69565b91505092915050565b60008060006060848603121562001e035762001e02620018a1565b5b600062001e1386828701620019a0565b935050602062001e268682870162001c73565b925050604084013567ffffffffffffffff81111562001e4a5762001e49620018a6565b5b62001e588682870162001db4565b9150509250925092565b6000819050919050565b600062001e8d62001e8762001e818462001952565b62001e62565b62001952565b9050919050565b600062001ea18262001e6c565b9050919050565b600062001eb58262001e94565b9050919050565b62001ec78162001ea8565b82525050565b600060208201905062001ee4600083018462001ebc565b92915050565b62001ef581620018ab565b82525050565b600060208201905062001f12600083018462001eea565b92915050565b600062001f258262001e94565b9050919050565b62001f378162001f18565b82525050565b600060208201905062001f54600083018462001f2c565b92915050565b600080fd5b60006080828403121562001f785762001f7762001f5a565b5b81905092915050565b60008060008060e0858703121562001f9e5762001f9d620018a1565b5b600062001fae87828801620018d1565b945050602062001fc18782880162001c73565b935050604062001fd48782880162001c73565b925050606062001fe78782880162001f5f565b91505092959194509250565b60006040820190506200200a600083018562001924565b62002019602083018462001924565b9392505050565b6000815190506200203181620018b7565b92915050565b60006020828403121562002050576200204f620018a1565b5b6000620020608482850162002020565b91505092915050565b600082825260208201905092915050565b7f6f6d6e69627269646765726f757465722e72756e6e6572000000000000000000600082015250565b6000620020b260178362002069565b9150620020bf826200207a565b602082019050919050565b60006020820190508181036000830152620020e581620020a3565b9050919050565b6000620020f98262001972565b9050919050565b6200210b81620020ec565b81146200211757600080fd5b50565b6000815190506200212b8162002100565b92915050565b6000602082840312156200214a5762002149620018a1565b5b60006200215a848285016200211a565b91505092915050565b600082825260208201905092915050565b600062002182838562002163565b93506200219183858462001d5a565b6200219c8362001c8f565b840190509392505050565b60006040820190508181036000830152620021c481868862002174565b90508181036020830152620021db81848662002174565b905095945050505050565b600080fd5b600081519050620021fc8162001986565b92915050565b600081519050620022138162001c59565b92915050565b600060808284031215620022325762002231620021e6565b5b6200223e608062001d05565b905060006200225084828501620021eb565b6000830152506020620022668482850162002202565b60208301525060406200227c8482850162002202565b6040830152506060620022928482850162002202565b60608301525092915050565b600060808284031215620022b757620022b6620018a1565b5b6000620022c78482850162002219565b91505092915050565b600060808284031215620022e957620022e8620021e6565b5b620022f5608062001d05565b905060006200230784828501620019a0565b60008301525060206200231d8482850162001c73565b6020830152506040620023338482850162001c73565b6040830152506060620023498482850162001c73565b60608301525092915050565b6000608082840312156200236e576200236d620018a1565b5b60006200237e84828501620022d0565b91505092915050565b600081519050919050565b60005b83811015620023b257808201518184015260208101905062002395565b60008484015250505050565b6000620023cb8262002387565b620023d7818562002163565b9350620023e981856020860162002392565b620023f48162001c8f565b840191505092915050565b600060808201905062002416600083018762001b7a565b62002425602083018662001b7a565b62002434604083018562001924565b8181036060830152620024488184620023be565b905095945050505050565b6000620024608262001952565b9050919050565b620024728162002453565b82525050565b60006020820190506200248f600083018462002467565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620024d1826200191a565b9150620024de836200191a565b9250828202620024ee816200191a565b9150828204841483151762002508576200250762002495565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006200254b826200191a565b915062002558836200191a565b9250826200256b576200256a6200250f565b5b828204905092915050565b600062002583826200191a565b915062002590836200191a565b9250828203905081811115620025ab57620025aa62002495565b5b92915050565b6000620025be826200191a565b9150620025cb836200191a565b9250828201905080821115620025e657620025e562002495565b5b92915050565b600081905092915050565b50565b600062002609600083620025ec565b91506200261682620025f7565b600082019050919050565b60006200262e82620025fa565b9150819050919050565b600060208284031215620026515762002650620018a1565b5b6000620026618482850162002202565b91505092915050565b600060408201905062002681600083018562001b7a565b62002690602083018462001924565b9392505050565b6000620026a48262002387565b620026b08185620025ec565b9350620026c281856020860162002392565b80840191505092915050565b6000620026dc828462002697565b91508190509291505056fe60806040526040516100c13803806100c18339818101604052810190602391906098565b8073ffffffffffffffffffffffffffffffffffffffff16ff5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000606a826041565b9050919050565b6078816061565b8114608257600080fd5b50565b6000815190506092816071565b92915050565b60006020828403121560ab5760aa603c565b5b600060b7848285016085565b9150509291505056fea2646970667358221220c7ab15f0d93ff0906e1c5dba2b8d6faaf901111166a33fec2115aca511b62fd464736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000001715a3e4a142d8b698131108995174f37aeba10d000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000af2ce0189f46f5663715b0b9ed2a10ea924ab9b00000000000000000000000000000000000000000000000000000000000000001
-----Decoded View---------------
Arg [0] : _bridge (address): 0x1715a3E4A142d8b698131108995174F37aEBA10D
Arg [1] : _wNative (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [2] : _owner (address): 0xAF2ce0189f46f5663715b0b9ED2a10eA924AB9B0
Arg [3] : _EIP1559_ENABLED (bool): True
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000001715a3e4a142d8b698131108995174f37aeba10d
Arg [1] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [2] : 000000000000000000000000af2ce0189f46f5663715b0b9ed2a10ea924ab9b0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000001
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 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.