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
Multichain Info
No addresses found
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
L1TokenBridge
Compiler Version
v0.8.21+commit.d9974bed
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (C) 2024 Dai Foundation // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see <https://www.gnu.org/licenses/>. pragma solidity ^0.8.21; import { UUPSUpgradeable, ERC1967Utils } from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; interface TokenLike { function transferFrom(address, address, uint256) external; } interface CrossDomainMessengerLike { function xDomainMessageSender() external view returns (address); function sendMessage(address _target, bytes calldata _message, uint32 _minGasLimit) external payable; } contract L1TokenBridge is UUPSUpgradeable { // --- storage variables --- mapping(address => uint256) public wards; mapping(address => address) public l1ToL2Token; uint256 public isOpen; address public escrow; // --- immutables and const --- address public immutable otherBridge; CrossDomainMessengerLike public immutable messenger; string public constant version = "1"; // --- events --- event Rely(address indexed usr); event Deny(address indexed usr); event File(bytes32 indexed what, address data); event Closed(); event TokenSet(address indexed l1Token, address indexed l2Token); event ERC20BridgeInitiated( address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 amount, bytes extraData ); event ERC20BridgeFinalized( address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 amount, bytes extraData ); // --- modifiers --- modifier auth() { require(wards[msg.sender] == 1, "L1TokenBridge/not-authorized"); _; } modifier onlyOtherBridge() { require( msg.sender == address(messenger) && messenger.xDomainMessageSender() == otherBridge, "L1TokenBridge/not-from-other-bridge" ); _; } // --- constructor --- constructor( address _otherBridge, address _messenger ) { _disableInitializers(); // Avoid initializing in the context of the implementation otherBridge = _otherBridge; messenger = CrossDomainMessengerLike(_messenger); } // --- upgradability --- function initialize() initializer external { __UUPSUpgradeable_init(); isOpen = 1; wards[msg.sender] = 1; emit Rely(msg.sender); } function _authorizeUpgrade(address newImplementation) internal override auth {} function getImplementation() external view returns (address) { return ERC1967Utils.getImplementation(); } // --- administration --- function rely(address usr) external auth { wards[usr] = 1; emit Rely(usr); } function deny(address usr) external auth { wards[usr] = 0; emit Deny(usr); } function file(bytes32 what, address data) external auth { if (what == "escrow") { escrow = data; } else revert("L1TokenBridge/file-unrecognized-param"); emit File(what, data); } function close() external auth { isOpen = 0; emit Closed(); } function registerToken(address l1Token, address l2Token) external auth { l1ToL2Token[l1Token] = l2Token; emit TokenSet(l1Token, l2Token); } // -- bridging -- function _initiateBridgeERC20( address _localToken, address _remoteToken, address _to, uint256 _amount, uint32 _minGasLimit, bytes memory _extraData ) internal { require(isOpen == 1, "L1TokenBridge/closed"); // do not allow initiating new xchain messages if bridge is closed require(_remoteToken != address(0) && l1ToL2Token[_localToken] == _remoteToken, "L1TokenBridge/invalid-token"); TokenLike(_localToken).transferFrom(msg.sender, escrow, _amount); messenger.sendMessage({ _target: address(otherBridge), _message: abi.encodeCall(this.finalizeBridgeERC20, ( // Because this call will be executed on the remote chain, we reverse the order of // the remote and local token addresses relative to their order in the // finalizeBridgeERC20 function. _remoteToken, _localToken, msg.sender, _to, _amount, _extraData )), _minGasLimit: _minGasLimit }); emit ERC20BridgeInitiated(_localToken, _remoteToken, msg.sender, _to, _amount, _extraData); } /// @notice Sends ERC20 tokens to the sender's address on L2. /// @param _localToken Address of the ERC20 on L1. /// @param _remoteToken Address of the corresponding token on L2. /// @param _amount Amount of local tokens to deposit. /// @param _minGasLimit Minimum amount of gas that the bridge can be relayed with. /// @param _extraData Extra data to be sent with the transaction. Note that the recipient will /// not be triggered with this data, but it will be emitted and can be used /// to identify the transaction. function bridgeERC20( address _localToken, address _remoteToken, uint256 _amount, uint32 _minGasLimit, bytes calldata _extraData ) external { require(msg.sender.code.length == 0, "L1TokenBridge/sender-not-eoa"); _initiateBridgeERC20(_localToken, _remoteToken, msg.sender, _amount, _minGasLimit, _extraData); } /// @notice Sends ERC20 tokens to a receiver's address on L2. /// @param _localToken Address of the ERC20 on L1. /// @param _remoteToken Address of the corresponding token on L2. /// @param _to Address of the receiver. /// @param _amount Amount of local tokens to deposit. /// @param _minGasLimit Minimum amount of gas that the bridge can be relayed with. /// @param _extraData Extra data to be sent with the transaction. Note that the recipient will /// not be triggered with this data, but it will be emitted and can be used /// to identify the transaction. function bridgeERC20To( address _localToken, address _remoteToken, address _to, uint256 _amount, uint32 _minGasLimit, bytes calldata _extraData ) external { _initiateBridgeERC20(_localToken, _remoteToken, _to, _amount, _minGasLimit, _extraData); } /// @notice Finalizes an ERC20 bridge on L1. Can only be triggered by the L2TokenBridge. /// @param _localToken Address of the ERC20 on L1. /// @param _remoteToken Address of the corresponding token on L2. /// @param _from Address of the sender. /// @param _to Address of the receiver. /// @param _amount Amount of the ERC20 being bridged. /// @param _extraData Extra data to be sent with the transaction. Note that the recipient will /// not be triggered with this data, but it will be emitted and can be used /// to identify the transaction. function finalizeBridgeERC20( address _localToken, address _remoteToken, address _from, address _to, uint256 _amount, bytes calldata _extraData ) external onlyOtherBridge { TokenLike(_localToken).transferFrom(escrow, _to, _amount); emit ERC20BridgeFinalized(_localToken, _remoteToken, _from, _to, _amount, _extraData); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/UUPSUpgradeable.sol) pragma solidity ^0.8.20; import {IERC1822Proxiable} from "@openzeppelin/contracts/interfaces/draft-IERC1822.sol"; import {ERC1967Utils} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol"; import {Initializable} from "./Initializable.sol"; /** * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy. * * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing * `UUPSUpgradeable` with a custom implementation of upgrades. * * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism. */ abstract contract UUPSUpgradeable is Initializable, IERC1822Proxiable { /// @custom:oz-upgrades-unsafe-allow state-variable-immutable address private immutable __self = address(this); /** * @dev The version of the upgrade interface of the contract. If this getter is missing, both `upgradeTo(address)` * and `upgradeToAndCall(address,bytes)` are present, and `upgradeTo` must be used if no function should be called, * while `upgradeToAndCall` will invoke the `receive` function if the second argument is the empty byte string. * If the getter returns `"5.0.0"`, only `upgradeToAndCall(address,bytes)` is present, and the second argument must * be the empty byte string if no function should be called, making it impossible to invoke the `receive` function * during an upgrade. */ string public constant UPGRADE_INTERFACE_VERSION = "5.0.0"; /** * @dev The call is from an unauthorized context. */ error UUPSUnauthorizedCallContext(); /** * @dev The storage `slot` is unsupported as a UUID. */ error UUPSUnsupportedProxiableUUID(bytes32 slot); /** * @dev Check that the execution is being performed through a delegatecall call and that the execution context is * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to * fail. */ modifier onlyProxy() { _checkProxy(); _; } /** * @dev Check that the execution is not being performed through a delegate call. This allows a function to be * callable on the implementing contract but not through proxies. */ modifier notDelegated() { _checkNotDelegated(); _; } function __UUPSUpgradeable_init() internal onlyInitializing { } function __UUPSUpgradeable_init_unchained() internal onlyInitializing { } /** * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the * implementation. It is used to validate the implementation's compatibility when performing an upgrade. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier. */ function proxiableUUID() external view virtual notDelegated returns (bytes32) { return ERC1967Utils.IMPLEMENTATION_SLOT; } /** * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call * encoded in `data`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. * * @custom:oz-upgrades-unsafe-allow-reachable delegatecall */ function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, data); } /** * @dev Reverts if the execution is not performed via delegatecall or the execution * context is not of a proxy with an ERC1967-compliant implementation pointing to self. * See {_onlyProxy}. */ function _checkProxy() internal view virtual { if ( address(this) == __self || // Must be called through delegatecall ERC1967Utils.getImplementation() != __self // Must be called through an active proxy ) { revert UUPSUnauthorizedCallContext(); } } /** * @dev Reverts if the execution is performed via delegatecall. * See {notDelegated}. */ function _checkNotDelegated() internal view virtual { if (address(this) != __self) { // Must not be called through delegatecall revert UUPSUnauthorizedCallContext(); } } /** * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by * {upgradeToAndCall}. * * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}. * * ```solidity * function _authorizeUpgrade(address) internal onlyOwner {} * ``` */ function _authorizeUpgrade(address newImplementation) internal virtual; /** * @dev Performs an implementation upgrade with a security check for UUPS proxies, and additional setup call. * * As a security check, {proxiableUUID} is invoked in the new implementation, and the return value * is expected to be the implementation slot in ERC1967. * * Emits an {IERC1967-Upgraded} event. */ function _upgradeToAndCallUUPS(address newImplementation, bytes memory data) private { try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) { if (slot != ERC1967Utils.IMPLEMENTATION_SLOT) { revert UUPSUnsupportedProxiableUUID(slot); } ERC1967Utils.upgradeToAndCall(newImplementation, data); } catch { // The implementation is not UUPS revert ERC1967Utils.ERC1967InvalidImplementation(newImplementation); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC1822.sol) pragma solidity ^0.8.20; /** * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified * proxy whose upgrades are fully controlled by the current implementation. */ interface IERC1822Proxiable { /** * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation * address. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. */ function proxiableUUID() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (proxy/ERC1967/ERC1967Utils.sol) pragma solidity ^0.8.20; import {IBeacon} from "../beacon/IBeacon.sol"; import {Address} from "../../utils/Address.sol"; import {StorageSlot} from "../../utils/StorageSlot.sol"; /** * @dev This abstract contract provides getters and event emitting update functions for * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. */ library ERC1967Utils { // We re-declare ERC-1967 events here because they can't be used directly from IERC1967. // This will be fixed in Solidity 0.8.21. At that point we should remove these events. /** * @dev Emitted when the implementation is upgraded. */ event Upgraded(address indexed implementation); /** * @dev Emitted when the admin account has changed. */ event AdminChanged(address previousAdmin, address newAdmin); /** * @dev Emitted when the beacon is changed. */ event BeaconUpgraded(address indexed beacon); /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1. */ // solhint-disable-next-line private-vars-leading-underscore bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /** * @dev The `implementation` of the proxy is invalid. */ error ERC1967InvalidImplementation(address implementation); /** * @dev The `admin` of the proxy is invalid. */ error ERC1967InvalidAdmin(address admin); /** * @dev The `beacon` of the proxy is invalid. */ error ERC1967InvalidBeacon(address beacon); /** * @dev An upgrade function sees `msg.value > 0` that may be lost. */ error ERC1967NonPayable(); /** * @dev Returns the current implementation address. */ function getImplementation() internal view returns (address) { return StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value; } /** * @dev Stores a new address in the EIP1967 implementation slot. */ function _setImplementation(address newImplementation) private { if (newImplementation.code.length == 0) { revert ERC1967InvalidImplementation(newImplementation); } StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value = newImplementation; } /** * @dev Performs implementation upgrade with additional setup call if data is nonempty. * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected * to avoid stuck value in the contract. * * Emits an {IERC1967-Upgraded} event. */ function upgradeToAndCall(address newImplementation, bytes memory data) internal { _setImplementation(newImplementation); emit Upgraded(newImplementation); if (data.length > 0) { Address.functionDelegateCall(newImplementation, data); } else { _checkNonPayable(); } } /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1. */ // solhint-disable-next-line private-vars-leading-underscore bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev Returns the current admin. * * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103` */ function getAdmin() internal view returns (address) { return StorageSlot.getAddressSlot(ADMIN_SLOT).value; } /** * @dev Stores a new address in the EIP1967 admin slot. */ function _setAdmin(address newAdmin) private { if (newAdmin == address(0)) { revert ERC1967InvalidAdmin(address(0)); } StorageSlot.getAddressSlot(ADMIN_SLOT).value = newAdmin; } /** * @dev Changes the admin of the proxy. * * Emits an {IERC1967-AdminChanged} event. */ function changeAdmin(address newAdmin) internal { emit AdminChanged(getAdmin(), newAdmin); _setAdmin(newAdmin); } /** * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. * This is the keccak-256 hash of "eip1967.proxy.beacon" subtracted by 1. */ // solhint-disable-next-line private-vars-leading-underscore bytes32 internal constant BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; /** * @dev Returns the current beacon. */ function getBeacon() internal view returns (address) { return StorageSlot.getAddressSlot(BEACON_SLOT).value; } /** * @dev Stores a new beacon in the EIP1967 beacon slot. */ function _setBeacon(address newBeacon) private { if (newBeacon.code.length == 0) { revert ERC1967InvalidBeacon(newBeacon); } StorageSlot.getAddressSlot(BEACON_SLOT).value = newBeacon; address beaconImplementation = IBeacon(newBeacon).implementation(); if (beaconImplementation.code.length == 0) { revert ERC1967InvalidImplementation(beaconImplementation); } } /** * @dev Change the beacon and trigger a setup call if data is nonempty. * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected * to avoid stuck value in the contract. * * Emits an {IERC1967-BeaconUpgraded} event. * * CAUTION: Invoking this function has no effect on an instance of {BeaconProxy} since v5, since * it uses an immutable beacon without looking at the value of the ERC-1967 beacon slot for * efficiency. */ function upgradeBeaconToAndCall(address newBeacon, bytes memory data) internal { _setBeacon(newBeacon); emit BeaconUpgraded(newBeacon); if (data.length > 0) { Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data); } else { _checkNonPayable(); } } /** * @dev Reverts if `msg.value` is not zero. It can be used to avoid `msg.value` stuck in the contract * if an upgrade doesn't perform an initialization call. */ function _checkNonPayable() private { if (msg.value > 0) { revert ERC1967NonPayable(); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.20; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ```solidity * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Storage of the initializable contract. * * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions * when using with upgradeable contracts. * * @custom:storage-location erc7201:openzeppelin.storage.Initializable */ struct InitializableStorage { /** * @dev Indicates that the contract has been initialized. */ uint64 _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool _initializing; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Initializable")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00; /** * @dev The contract is already initialized. */ error InvalidInitialization(); /** * @dev The contract is not initializing. */ error NotInitializing(); /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint64 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in * production. * * Emits an {Initialized} event. */ modifier initializer() { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); // Cache values to avoid duplicated sloads bool isTopLevelCall = !$._initializing; uint64 initialized = $._initialized; // Allowed calls: // - initialSetup: the contract is not in the initializing state and no previous version was // initialized // - construction: the contract is initialized at version 1 (no reininitialization) and the // current contract is just being deployed bool initialSetup = initialized == 0 && isTopLevelCall; bool construction = initialized == 1 && address(this).code.length == 0; if (!initialSetup && !construction) { revert InvalidInitialization(); } $._initialized = 1; if (isTopLevelCall) { $._initializing = true; } _; if (isTopLevelCall) { $._initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint64 version) { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); if ($._initializing || $._initialized >= version) { revert InvalidInitialization(); } $._initialized = version; $._initializing = true; _; $._initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { _checkInitializing(); _; } /** * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}. */ function _checkInitializing() internal view virtual { if (!_isInitializing()) { revert NotInitializing(); } } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); if ($._initializing) { revert InvalidInitialization(); } if ($._initialized != type(uint64).max) { $._initialized = type(uint64).max; emit Initialized(type(uint64).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint64) { return _getInitializableStorage()._initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _getInitializableStorage()._initializing; } /** * @dev Returns a pointer to the storage namespace. */ // solhint-disable-next-line var-name-mixedcase function _getInitializableStorage() private pure returns (InitializableStorage storage $) { assembly { $.slot := INITIALIZABLE_STORAGE } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/IBeacon.sol) pragma solidity ^0.8.20; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeacon { /** * @dev Must return an address that can be used as a delegate call target. * * {UpgradeableBeacon} will check that this address is a contract. */ function implementation() external view returns (address); }
// 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 } } }
{ "remappings": [ "@openzeppelin/contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/", "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/", "forge-std/=lib/dss-test/lib/forge-std/src/", "ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/", "dss-interfaces/=lib/dss-test/lib/dss-interfaces/src/", "dss-test/=lib/dss-test/src/", "erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/", "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/", "openzeppelin-contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/", "openzeppelin-foundry-upgrades/=lib/openzeppelin-foundry-upgrades/src/", "solidity-stringutils/=lib/openzeppelin-foundry-upgrades/lib/solidity-stringutils/" ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "evmVersion": "paris", "viaIR": false, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_otherBridge","type":"address"},{"internalType":"address","name":"_messenger","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"ERC1967InvalidImplementation","type":"error"},{"inputs":[],"name":"ERC1967NonPayable","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[],"name":"UUPSUnauthorizedCallContext","type":"error"},{"inputs":[{"internalType":"bytes32","name":"slot","type":"bytes32"}],"name":"UUPSUnsupportedProxiableUUID","type":"error"},{"anonymous":false,"inputs":[],"name":"Closed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"usr","type":"address"}],"name":"Deny","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"localToken","type":"address"},{"indexed":true,"internalType":"address","name":"remoteToken","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"extraData","type":"bytes"}],"name":"ERC20BridgeFinalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"localToken","type":"address"},{"indexed":true,"internalType":"address","name":"remoteToken","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"extraData","type":"bytes"}],"name":"ERC20BridgeInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"what","type":"bytes32"},{"indexed":false,"internalType":"address","name":"data","type":"address"}],"name":"File","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"usr","type":"address"}],"name":"Rely","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"l1Token","type":"address"},{"indexed":true,"internalType":"address","name":"l2Token","type":"address"}],"name":"TokenSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"UPGRADE_INTERFACE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_localToken","type":"address"},{"internalType":"address","name":"_remoteToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint32","name":"_minGasLimit","type":"uint32"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"name":"bridgeERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_localToken","type":"address"},{"internalType":"address","name":"_remoteToken","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint32","name":"_minGasLimit","type":"uint32"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"name":"bridgeERC20To","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"close","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"usr","type":"address"}],"name":"deny","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"escrow","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"what","type":"bytes32"},{"internalType":"address","name":"data","type":"address"}],"name":"file","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_localToken","type":"address"},{"internalType":"address","name":"_remoteToken","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"name":"finalizeBridgeERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isOpen","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"l1ToL2Token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"messenger","outputs":[{"internalType":"contract CrossDomainMessengerLike","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"otherBridge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"l1Token","type":"address"},{"internalType":"address","name":"l2Token","type":"address"}],"name":"registerToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"usr","type":"address"}],"name":"rely","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"wards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60e0604052306080523480156200001557600080fd5b50604051620019703803806200197083398101604081905262000038916200012b565b620000426200005a565b6001600160a01b0391821660a0521660c05262000163565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000ab5760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146200010b5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b80516001600160a01b03811681146200012657600080fd5b919050565b600080604083850312156200013f57600080fd5b6200014a836200010e565b91506200015a602084016200010e565b90509250929050565b60805160a05160c0516117ac620001c4600039600081816101580152818161040f015281816104630152610e950152600081816103a2015281816104390152610ec4015260008181610b8501528181610bae0152610d2001526117ac6000f3fe60806040526004361061011f5760003560e01c80638129fc1c116100a0578063ad3cb1cc11610064578063ad3cb1cc14610332578063bf353dbb14610363578063c89701a214610390578063d4e8be83146103c4578063e2fdcc17146103e457600080fd5b80638129fc1c1461029257806387087623146102a75780638a2dc014146102c75780639c52a7f1146102fd578063aaf10f421461031d57600080fd5b80634f1ef286116100e75780634f1ef286146101f057806352d1902d14610203578063540abf731461021857806354fd4d501461023857806365fae35e1461027257600080fd5b80630166a07a146101245780633cb747bf1461014657806343d726d6146101975780634739f7e5146101ac57806347535d7b146101cc575b600080fd5b34801561013057600080fd5b5061014461013f366004611272565b610404565b005b34801561015257600080fd5b5061017a7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101a357600080fd5b5061014461061d565b3480156101b857600080fd5b506101446101c736600461130a565b61067c565b3480156101d857600080fd5b506101e260025481565b60405190815260200161018e565b6101446101fe366004611359565b610702565b34801561020f57600080fd5b506101e2610721565b34801561022457600080fd5b50610144610233366004611436565b61073e565b34801561024457600080fd5b50610265604051806040016040528060018152602001603160f81b81525081565b60405161018e91906114fd565b34801561027e57600080fd5b5061014461028d366004611510565b61078b565b34801561029e57600080fd5b506101446107ff565b3480156102b357600080fd5b506101446102c236600461152d565b61094f565b3480156102d357600080fd5b5061017a6102e2366004611510565b6001602052600090815260409020546001600160a01b031681565b34801561030957600080fd5b50610144610318366004611510565b6109ea565b34801561032957600080fd5b5061017a610a5d565b34801561033e57600080fd5b50610265604051806040016040528060058152602001640352e302e360dc1b81525081565b34801561036f57600080fd5b506101e261037e366004611510565b60006020819052908152604090205481565b34801561039c57600080fd5b5061017a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156103d057600080fd5b506101446103df3660046115b0565b610a83565b3480156103f057600080fd5b5060035461017a906001600160a01b031681565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156104ee57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e391906115d5565b6001600160a01b0316145b61054b5760405162461bcd60e51b815260206004820152602360248201527f4c31546f6b656e4272696467652f6e6f742d66726f6d2d6f746865722d62726960448201526264676560e81b60648201526084015b60405180910390fd5b6003546040516323b872dd60e01b81526001600160a01b039182166004820152858216602482015260448101859052908816906323b872dd90606401600060405180830381600087803b1580156105a157600080fd5b505af11580156105b5573d6000803e3d6000fd5b50505050846001600160a01b0316866001600160a01b0316886001600160a01b03167fd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd8787878760405161060c94939291906115f2565b60405180910390a450505050505050565b3360009081526020819052604090205460011461064c5760405162461bcd60e51b81526004016105429061163a565b600060028190556040517f1cdde67b72a90f19919ac732a437ac2f7a10fc128d28c2a6e525d89ce5cd9d3a9190a1565b336000908152602081905260409020546001146106ab5760405162461bcd60e51b81526004016105429061163a565b6001600160a01b0382811660008181526001602052604080822080546001600160a01b0319169486169485179055517f0dd664a155dd89526bb019e22b00291bb7ca9d07ba3ec4a1a76b410da9797ceb9190a35050565b61070a610b7a565b61071382610c21565b61071d8282610c53565b5050565b600061072b610d15565b5060008051602061175783398151915290565b610782878787878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610d5e92505050565b50505050505050565b336000908152602081905260409020546001146107ba5760405162461bcd60e51b81526004016105429061163a565b6001600160a01b03811660008181526020819052604080822060019055517fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a609190a250565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff166000811580156108455750825b905060008267ffffffffffffffff1660011480156108625750303b155b905081158015610870575080155b1561088e5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156108b857845460ff60401b1916600160401b1785555b6108c0610feb565b600160028190553360008181526020819052604080822093909355915190917fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a6091a2831561094857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050565b333b1561099e5760405162461bcd60e51b815260206004820152601c60248201527f4c31546f6b656e4272696467652f73656e6465722d6e6f742d656f61000000006044820152606401610542565b6109e2868633878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610d5e92505050565b505050505050565b33600090815260208190526040902054600114610a195760405162461bcd60e51b81526004016105429061163a565b6001600160a01b038116600081815260208190526040808220829055517f184450df2e323acec0ed3b5c7531b81f9b4cdef7914dfd4c0a4317416bb5251b9190a250565b6000610a7e600080516020611757833981519152546001600160a01b031690565b905090565b33600090815260208190526040902054600114610ab25760405162461bcd60e51b81526004016105429061163a565b8165657363726f7760d01b03610ae257600380546001600160a01b0319166001600160a01b038316179055610b38565b60405162461bcd60e51b815260206004820152602560248201527f4c31546f6b656e4272696467652f66696c652d756e7265636f676e697a65642d604482015264706172616d60d81b6064820152608401610542565b6040516001600160a01b038216815282907f8fef588b5fc1afbf5b2f06c1a435d513f208da2e6704c3d8f0e0ec91167066ba9060200160405180910390a25050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610c0157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610bf5600080516020611757833981519152546001600160a01b031690565b6001600160a01b031614155b15610c1f5760405163703e46dd60e11b815260040160405180910390fd5b565b33600090815260208190526040902054600114610c505760405162461bcd60e51b81526004016105429061163a565b50565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610cad575060408051601f3d908101601f19168201909252610caa91810190611671565b60015b610cd557604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610542565b6000805160206117578339815191528114610d0657604051632a87526960e21b815260048101829052602401610542565b610d108383610ff3565b505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c1f5760405163703e46dd60e11b815260040160405180910390fd5b600254600114610da75760405162461bcd60e51b8152602060048201526014602482015273130c551bdad95b909c9a5919d94bd8db1bdcd95960621b6044820152606401610542565b6001600160a01b03851615801590610ddb57506001600160a01b038681166000908152600160205260409020548116908616145b610e275760405162461bcd60e51b815260206004820152601b60248201527f4c31546f6b656e4272696467652f696e76616c69642d746f6b656e00000000006044820152606401610542565b6003546040516323b872dd60e01b81523360048201526001600160a01b03918216602482015260448101859052908716906323b872dd90606401600060405180830381600087803b158015610e7b57600080fd5b505af1158015610e8f573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633dbb202b7f0000000000000000000000000000000000000000000000000000000000000000306001600160a01b0316630166a07a898b338b8b8a604051602401610f0d9695949392919061168a565b60408051808303601f1901815291815260208201805160e094851b6001600160e01b03909116179052519185901b6001600160e01b0319168252610f589392509087906004016116d9565b600060405180830381600087803b158015610f7257600080fd5b505af1158015610f86573d6000803e3d6000fd5b50505050336001600160a01b0316856001600160a01b0316876001600160a01b03167f7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf878786604051610fdb93929190611713565b60405180910390a4505050505050565b610c1f611049565b610ffc82611092565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561104157610d1082826110f7565b61071d61116d565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610c1f57604051631afcd79f60e31b815260040160405180910390fd5b806001600160a01b03163b6000036110c857604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610542565b60008051602061175783398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b031684604051611114919061173a565b600060405180830381855af49150503d806000811461114f576040519150601f19603f3d011682016040523d82523d6000602084013e611154565b606091505b509150915061116485838361118c565b95945050505050565b3415610c1f5760405163b398979f60e01b815260040160405180910390fd5b6060826111a15761119c826111eb565b6111e4565b81511580156111b857506001600160a01b0384163b155b156111e157604051639996b31560e01b81526001600160a01b0385166004820152602401610542565b50805b9392505050565b8051156111fb5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6001600160a01b0381168114610c5057600080fd5b60008083601f84011261123b57600080fd5b50813567ffffffffffffffff81111561125357600080fd5b60208301915083602082850101111561126b57600080fd5b9250929050565b600080600080600080600060c0888a03121561128d57600080fd5b873561129881611214565b965060208801356112a881611214565b955060408801356112b881611214565b945060608801356112c881611214565b93506080880135925060a088013567ffffffffffffffff8111156112eb57600080fd5b6112f78a828b01611229565b989b979a50959850939692959293505050565b6000806040838503121561131d57600080fd5b823561132881611214565b9150602083013561133881611214565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561136c57600080fd5b823561137781611214565b9150602083013567ffffffffffffffff8082111561139457600080fd5b818501915085601f8301126113a857600080fd5b8135818111156113ba576113ba611343565b604051601f8201601f19908116603f011681019083821181831017156113e2576113e2611343565b816040528281528860208487010111156113fb57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b803563ffffffff8116811461143157600080fd5b919050565b600080600080600080600060c0888a03121561145157600080fd5b873561145c81611214565b9650602088013561146c81611214565b9550604088013561147c81611214565b9450606088013593506114916080890161141d565b925060a088013567ffffffffffffffff8111156112eb57600080fd5b60005b838110156114c85781810151838201526020016114b0565b50506000910152565b600081518084526114e98160208601602086016114ad565b601f01601f19169290920160200192915050565b6020815260006111e460208301846114d1565b60006020828403121561152257600080fd5b81356111e481611214565b60008060008060008060a0878903121561154657600080fd5b863561155181611214565b9550602087013561156181611214565b9450604087013593506115766060880161141d565b9250608087013567ffffffffffffffff81111561159257600080fd5b61159e89828a01611229565b979a9699509497509295939492505050565b600080604083850312156115c357600080fd5b82359150602083013561133881611214565b6000602082840312156115e757600080fd5b81516111e481611214565b6001600160a01b0385168152602081018490526060604082018190528101829052818360808301376000818301608090810191909152601f909201601f191601019392505050565b6020808252601c908201527f4c31546f6b656e4272696467652f6e6f742d617574686f72697a656400000000604082015260600190565b60006020828403121561168357600080fd5b5051919050565b6001600160a01b03878116825286811660208301528581166040830152841660608201526080810183905260c060a082018190526000906116cd908301846114d1565b98975050505050505050565b6001600160a01b03841681526060602082018190526000906116fd908301856114d1565b905063ffffffff83166040830152949350505050565b60018060a01b038416815282602082015260606040820152600061116460608301846114d1565b6000825161174c8184602087016114ad565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220cdf4d77d558f0c0035a3ed779f16a4621b234a748c84b29453b7ef2ddc2b0ea664736f6c63430008150033000000000000000000000000ee44cdb68d618d58f75d9fe0818b640bd7b8a7b7000000000000000000000000866e82a600a1414e583f7f13623f1ac5d58b0afa
Deployed Bytecode
0x60806040526004361061011f5760003560e01c80638129fc1c116100a0578063ad3cb1cc11610064578063ad3cb1cc14610332578063bf353dbb14610363578063c89701a214610390578063d4e8be83146103c4578063e2fdcc17146103e457600080fd5b80638129fc1c1461029257806387087623146102a75780638a2dc014146102c75780639c52a7f1146102fd578063aaf10f421461031d57600080fd5b80634f1ef286116100e75780634f1ef286146101f057806352d1902d14610203578063540abf731461021857806354fd4d501461023857806365fae35e1461027257600080fd5b80630166a07a146101245780633cb747bf1461014657806343d726d6146101975780634739f7e5146101ac57806347535d7b146101cc575b600080fd5b34801561013057600080fd5b5061014461013f366004611272565b610404565b005b34801561015257600080fd5b5061017a7f000000000000000000000000866e82a600a1414e583f7f13623f1ac5d58b0afa81565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101a357600080fd5b5061014461061d565b3480156101b857600080fd5b506101446101c736600461130a565b61067c565b3480156101d857600080fd5b506101e260025481565b60405190815260200161018e565b6101446101fe366004611359565b610702565b34801561020f57600080fd5b506101e2610721565b34801561022457600080fd5b50610144610233366004611436565b61073e565b34801561024457600080fd5b50610265604051806040016040528060018152602001603160f81b81525081565b60405161018e91906114fd565b34801561027e57600080fd5b5061014461028d366004611510565b61078b565b34801561029e57600080fd5b506101446107ff565b3480156102b357600080fd5b506101446102c236600461152d565b61094f565b3480156102d357600080fd5b5061017a6102e2366004611510565b6001602052600090815260409020546001600160a01b031681565b34801561030957600080fd5b50610144610318366004611510565b6109ea565b34801561032957600080fd5b5061017a610a5d565b34801561033e57600080fd5b50610265604051806040016040528060058152602001640352e302e360dc1b81525081565b34801561036f57600080fd5b506101e261037e366004611510565b60006020819052908152604090205481565b34801561039c57600080fd5b5061017a7f000000000000000000000000ee44cdb68d618d58f75d9fe0818b640bd7b8a7b781565b3480156103d057600080fd5b506101446103df3660046115b0565b610a83565b3480156103f057600080fd5b5060035461017a906001600160a01b031681565b336001600160a01b037f000000000000000000000000866e82a600a1414e583f7f13623f1ac5d58b0afa161480156104ee57507f000000000000000000000000ee44cdb68d618d58f75d9fe0818b640bd7b8a7b76001600160a01b03167f000000000000000000000000866e82a600a1414e583f7f13623f1ac5d58b0afa6001600160a01b0316636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e391906115d5565b6001600160a01b0316145b61054b5760405162461bcd60e51b815260206004820152602360248201527f4c31546f6b656e4272696467652f6e6f742d66726f6d2d6f746865722d62726960448201526264676560e81b60648201526084015b60405180910390fd5b6003546040516323b872dd60e01b81526001600160a01b039182166004820152858216602482015260448101859052908816906323b872dd90606401600060405180830381600087803b1580156105a157600080fd5b505af11580156105b5573d6000803e3d6000fd5b50505050846001600160a01b0316866001600160a01b0316886001600160a01b03167fd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd8787878760405161060c94939291906115f2565b60405180910390a450505050505050565b3360009081526020819052604090205460011461064c5760405162461bcd60e51b81526004016105429061163a565b600060028190556040517f1cdde67b72a90f19919ac732a437ac2f7a10fc128d28c2a6e525d89ce5cd9d3a9190a1565b336000908152602081905260409020546001146106ab5760405162461bcd60e51b81526004016105429061163a565b6001600160a01b0382811660008181526001602052604080822080546001600160a01b0319169486169485179055517f0dd664a155dd89526bb019e22b00291bb7ca9d07ba3ec4a1a76b410da9797ceb9190a35050565b61070a610b7a565b61071382610c21565b61071d8282610c53565b5050565b600061072b610d15565b5060008051602061175783398151915290565b610782878787878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610d5e92505050565b50505050505050565b336000908152602081905260409020546001146107ba5760405162461bcd60e51b81526004016105429061163a565b6001600160a01b03811660008181526020819052604080822060019055517fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a609190a250565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff166000811580156108455750825b905060008267ffffffffffffffff1660011480156108625750303b155b905081158015610870575080155b1561088e5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156108b857845460ff60401b1916600160401b1785555b6108c0610feb565b600160028190553360008181526020819052604080822093909355915190917fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a6091a2831561094857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050565b333b1561099e5760405162461bcd60e51b815260206004820152601c60248201527f4c31546f6b656e4272696467652f73656e6465722d6e6f742d656f61000000006044820152606401610542565b6109e2868633878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610d5e92505050565b505050505050565b33600090815260208190526040902054600114610a195760405162461bcd60e51b81526004016105429061163a565b6001600160a01b038116600081815260208190526040808220829055517f184450df2e323acec0ed3b5c7531b81f9b4cdef7914dfd4c0a4317416bb5251b9190a250565b6000610a7e600080516020611757833981519152546001600160a01b031690565b905090565b33600090815260208190526040902054600114610ab25760405162461bcd60e51b81526004016105429061163a565b8165657363726f7760d01b03610ae257600380546001600160a01b0319166001600160a01b038316179055610b38565b60405162461bcd60e51b815260206004820152602560248201527f4c31546f6b656e4272696467652f66696c652d756e7265636f676e697a65642d604482015264706172616d60d81b6064820152608401610542565b6040516001600160a01b038216815282907f8fef588b5fc1afbf5b2f06c1a435d513f208da2e6704c3d8f0e0ec91167066ba9060200160405180910390a25050565b306001600160a01b037f000000000000000000000000aefd31c2e593dc971f9cb42cbbd5d4ad7f1970b6161480610c0157507f000000000000000000000000aefd31c2e593dc971f9cb42cbbd5d4ad7f1970b66001600160a01b0316610bf5600080516020611757833981519152546001600160a01b031690565b6001600160a01b031614155b15610c1f5760405163703e46dd60e11b815260040160405180910390fd5b565b33600090815260208190526040902054600114610c505760405162461bcd60e51b81526004016105429061163a565b50565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610cad575060408051601f3d908101601f19168201909252610caa91810190611671565b60015b610cd557604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610542565b6000805160206117578339815191528114610d0657604051632a87526960e21b815260048101829052602401610542565b610d108383610ff3565b505050565b306001600160a01b037f000000000000000000000000aefd31c2e593dc971f9cb42cbbd5d4ad7f1970b61614610c1f5760405163703e46dd60e11b815260040160405180910390fd5b600254600114610da75760405162461bcd60e51b8152602060048201526014602482015273130c551bdad95b909c9a5919d94bd8db1bdcd95960621b6044820152606401610542565b6001600160a01b03851615801590610ddb57506001600160a01b038681166000908152600160205260409020548116908616145b610e275760405162461bcd60e51b815260206004820152601b60248201527f4c31546f6b656e4272696467652f696e76616c69642d746f6b656e00000000006044820152606401610542565b6003546040516323b872dd60e01b81523360048201526001600160a01b03918216602482015260448101859052908716906323b872dd90606401600060405180830381600087803b158015610e7b57600080fd5b505af1158015610e8f573d6000803e3d6000fd5b505050507f000000000000000000000000866e82a600a1414e583f7f13623f1ac5d58b0afa6001600160a01b0316633dbb202b7f000000000000000000000000ee44cdb68d618d58f75d9fe0818b640bd7b8a7b7306001600160a01b0316630166a07a898b338b8b8a604051602401610f0d9695949392919061168a565b60408051808303601f1901815291815260208201805160e094851b6001600160e01b03909116179052519185901b6001600160e01b0319168252610f589392509087906004016116d9565b600060405180830381600087803b158015610f7257600080fd5b505af1158015610f86573d6000803e3d6000fd5b50505050336001600160a01b0316856001600160a01b0316876001600160a01b03167f7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf878786604051610fdb93929190611713565b60405180910390a4505050505050565b610c1f611049565b610ffc82611092565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561104157610d1082826110f7565b61071d61116d565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610c1f57604051631afcd79f60e31b815260040160405180910390fd5b806001600160a01b03163b6000036110c857604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610542565b60008051602061175783398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b031684604051611114919061173a565b600060405180830381855af49150503d806000811461114f576040519150601f19603f3d011682016040523d82523d6000602084013e611154565b606091505b509150915061116485838361118c565b95945050505050565b3415610c1f5760405163b398979f60e01b815260040160405180910390fd5b6060826111a15761119c826111eb565b6111e4565b81511580156111b857506001600160a01b0384163b155b156111e157604051639996b31560e01b81526001600160a01b0385166004820152602401610542565b50805b9392505050565b8051156111fb5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6001600160a01b0381168114610c5057600080fd5b60008083601f84011261123b57600080fd5b50813567ffffffffffffffff81111561125357600080fd5b60208301915083602082850101111561126b57600080fd5b9250929050565b600080600080600080600060c0888a03121561128d57600080fd5b873561129881611214565b965060208801356112a881611214565b955060408801356112b881611214565b945060608801356112c881611214565b93506080880135925060a088013567ffffffffffffffff8111156112eb57600080fd5b6112f78a828b01611229565b989b979a50959850939692959293505050565b6000806040838503121561131d57600080fd5b823561132881611214565b9150602083013561133881611214565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561136c57600080fd5b823561137781611214565b9150602083013567ffffffffffffffff8082111561139457600080fd5b818501915085601f8301126113a857600080fd5b8135818111156113ba576113ba611343565b604051601f8201601f19908116603f011681019083821181831017156113e2576113e2611343565b816040528281528860208487010111156113fb57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b803563ffffffff8116811461143157600080fd5b919050565b600080600080600080600060c0888a03121561145157600080fd5b873561145c81611214565b9650602088013561146c81611214565b9550604088013561147c81611214565b9450606088013593506114916080890161141d565b925060a088013567ffffffffffffffff8111156112eb57600080fd5b60005b838110156114c85781810151838201526020016114b0565b50506000910152565b600081518084526114e98160208601602086016114ad565b601f01601f19169290920160200192915050565b6020815260006111e460208301846114d1565b60006020828403121561152257600080fd5b81356111e481611214565b60008060008060008060a0878903121561154657600080fd5b863561155181611214565b9550602087013561156181611214565b9450604087013593506115766060880161141d565b9250608087013567ffffffffffffffff81111561159257600080fd5b61159e89828a01611229565b979a9699509497509295939492505050565b600080604083850312156115c357600080fd5b82359150602083013561133881611214565b6000602082840312156115e757600080fd5b81516111e481611214565b6001600160a01b0385168152602081018490526060604082018190528101829052818360808301376000818301608090810191909152601f909201601f191601019392505050565b6020808252601c908201527f4c31546f6b656e4272696467652f6e6f742d617574686f72697a656400000000604082015260600190565b60006020828403121561168357600080fd5b5051919050565b6001600160a01b03878116825286811660208301528581166040830152841660608201526080810183905260c060a082018190526000906116cd908301846114d1565b98975050505050505050565b6001600160a01b03841681526060602082018190526000906116fd908301856114d1565b905063ffffffff83166040830152949350505050565b60018060a01b038416815282602082015260606040820152600061116460608301846114d1565b6000825161174c8184602087016114ad565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220cdf4d77d558f0c0035a3ed779f16a4621b234a748c84b29453b7ef2ddc2b0ea664736f6c63430008150033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ee44cdb68d618d58f75d9fe0818b640bd7b8a7b7000000000000000000000000866e82a600a1414e583f7f13623f1ac5d58b0afa
-----Decoded View---------------
Arg [0] : _otherBridge (address): 0xee44cdb68D618d58F75d9fe0818B640BD7B8A7B7
Arg [1] : _messenger (address): 0x866E82a600A1414e583f7F13623F1aC5d58b0Afa
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000ee44cdb68d618d58f75d9fe0818b640bd7b8a7b7
Arg [1] : 000000000000000000000000866e82a600a1414e583f7f13623f1ac5d58b0afa
Deployed Bytecode Sourcemap
1203:7139:7:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7927:413;;;;;;;;;;-1:-1:-1;7927:413:7;;;;;:::i;:::-;;:::i;:::-;;1517:51;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1742:32:8;;;1724:51;;1712:2;1697:18;1517:51:7;;;;;;;;3814:81;;;;;;;;;;;;;:::i;3901:159::-;;;;;;;;;;-1:-1:-1;3901:159:7;;;;;:::i;:::-;;:::i;1383:21::-;;;;;;;;;;;;;;;;;;;2325:25:8;;;2313:2;2298:18;1383:21:7;2179:177:8;4158:214:1;;;;;;:::i;:::-;;:::i;3705:134::-;;;;;;;;;;;;;:::i;6966:311:7:-;;;;;;;;;;-1:-1:-1;6966:311:7;;;;;:::i;:::-;;:::i;1574:36::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1574:36:7;;;;;;;;;;;;:::i;3387:96::-;;;;;;;;;;-1:-1:-1;3387:96:7;;;;;:::i;:::-;;:::i;2975:167::-;;;;;;;;;;;;;:::i;5934:373::-;;;;;;;;;;-1:-1:-1;5934:373:7;;;;;:::i;:::-;;:::i;1331:46::-;;;;;;;;;;-1:-1:-1;1331:46:7;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;1331:46:7;;;3489:96;;;;;;;;;;-1:-1:-1;3489:96:7;;;;;:::i;:::-;;:::i;3233:117::-;;;;;;;;;;;;;:::i;1819:58:1:-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1819:58:1;;;;;1285:40:7;;;;;;;;;;-1:-1:-1;1285:40:7;;;;;:::i;:::-;;;;;;;;;;;;;;;1475:36;;;;;;;;;;;;;;;3591:217;;;;;;;;;;-1:-1:-1;3591:217:7;;;;;:::i;:::-;;:::i;1410:21::-;;;;;;;;;;-1:-1:-1;1410:21:7;;;;-1:-1:-1;;;;;1410:21:7;;;7927:413;2474:10;-1:-1:-1;;;;;2496:9:7;2474:32;;:83;;;;;2546:11;-1:-1:-1;;;;;2510:47:7;:9;-1:-1:-1;;;;;2510:30:7;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2510:47:7;;2474:83;2453:165;;;;-1:-1:-1;;;2453:165:7;;7704:2:8;2453:165:7;;;7686:21:8;7743:2;7723:18;;;7716:30;7782:34;7762:18;;;7755:62;-1:-1:-1;;;7833:18:8;;;7826:33;7876:19;;2453:165:7;;;;;;;;;8216:6:::1;::::0;8180:57:::1;::::0;-1:-1:-1;;;8180:57:7;;-1:-1:-1;;;;;8216:6:7;;::::1;8180:57;::::0;::::1;8146:34:8::0;8216:15;;;8196:18;;;8189:43;8248:18;;;8241:34;;;8180:35:7;;::::1;::::0;::::1;::::0;8081:18:8;;8180:57:7::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;8301:5;-1:-1:-1::0;;;;;8253:80:7::1;8287:12;-1:-1:-1::0;;;;;8253:80:7::1;8274:11;-1:-1:-1::0;;;;;8253:80:7::1;;8308:3;8313:7;8322:10;;8253:80;;;;;;;;;:::i;:::-;;;;;;;;7927:413:::0;;;;;;;:::o;3814:81::-;2343:10;2337:5;:17;;;;;;;;;;;2358:1;2337:22;2329:63;;;;-1:-1:-1;;;2329:63:7;;;;;;;:::i;:::-;3864:1:::1;3855:6;:10:::0;;;3880:8:::1;::::0;::::1;::::0;3864:1;3880:8:::1;3814:81::o:0;3901:159::-;2343:10;2337:5;:17;;;;;;;;;;;2358:1;2337:22;2329:63;;;;-1:-1:-1;;;2329:63:7;;;;;;;:::i;:::-;-1:-1:-1;;;;;3982:20:7;;::::1;;::::0;;;:11:::1;:20;::::0;;;;;:30;;-1:-1:-1;;;;;;3982:30:7::1;::::0;;::::1;::::0;;::::1;::::0;;4027:26;::::1;::::0;3982:20;4027:26:::1;3901:159:::0;;:::o;4158:214:1:-;2653:13;:11;:13::i;:::-;4273:36:::1;4291:17;4273;:36::i;:::-;4319:46;4341:17;4360:4;4319:21;:46::i;:::-;4158:214:::0;;:::o;3705:134::-;3774:7;2924:20;:18;:20::i;:::-;-1:-1:-1;;;;;;;;;;;;3705:134:1;:::o;6966:311:7:-;7183:87;7204:11;7217:12;7231:3;7236:7;7245:12;7259:10;;7183:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7183:20:7;;-1:-1:-1;;;7183:87:7:i;:::-;6966:311;;;;;;;:::o;3387:96::-;2343:10;2337:5;:17;;;;;;;;;;;2358:1;2337:22;2329:63;;;;-1:-1:-1;;;2329:63:7;;;;;;;:::i;:::-;-1:-1:-1;;;;;3438:10:7;::::1;:5;:10:::0;;;::::1;::::0;;;;;;;3451:1:::1;3438:14:::0;;3467:9;::::1;::::0;3438:5;3467:9:::1;3387:96:::0;:::o;2975:167::-;8870:21:0;4302:15;;-1:-1:-1;;;4302:15:0;;;;4301:16;;4348:14;;4158:30;4726:16;;:34;;;;;4746:14;4726:34;4706:54;;4770:17;4790:11;:16;;4805:1;4790:16;:50;;;;-1:-1:-1;4818:4:0;4810:25;:30;4790:50;4770:70;;4856:12;4855:13;:30;;;;;4873:12;4872:13;4855:30;4851:91;;;4908:23;;-1:-1:-1;;;4908:23:0;;;;;;;;;;;4851:91;4951:18;;-1:-1:-1;;4951:18:0;4968:1;4951:18;;;4979:67;;;;5013:22;;-1:-1:-1;;;;5013:22:0;-1:-1:-1;;;5013:22:0;;;4979:67;3028:24:7::1;:22;:24::i;:::-;3072:1;3063:6;:10:::0;;;3089::::1;3083:5;:17:::0;;;::::1;::::0;;;;;;;:21;;;;3119:16;;3089:10;;3119:16:::1;::::0;::::1;5070:14:0::0;5066:101;;;5100:23;;-1:-1:-1;;;;5100:23:0;;;5142:14;;-1:-1:-1;9360:50:8;;5142:14:0;;9348:2:8;9333:18;5142:14:0;;;;;;;5066:101;4092:1081;;;;;2975:167:7:o;5934:373::-;6136:10;:22;:27;6128:68;;;;-1:-1:-1;;;6128:68:7;;9623:2:8;6128:68:7;;;9605:21:8;9662:2;9642:18;;;9635:30;9701;9681:18;;;9674:58;9749:18;;6128:68:7;9421:352:8;6128:68:7;6206:94;6227:11;6240:12;6254:10;6266:7;6275:12;6289:10;;6206:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6206:20:7;;-1:-1:-1;;;6206:94:7:i;:::-;5934:373;;;;;;:::o;3489:96::-;2343:10;2337:5;:17;;;;;;;;;;;2358:1;2337:22;2329:63;;;;-1:-1:-1;;;2329:63:7;;;;;;;:::i;:::-;-1:-1:-1;;;;;3540:10:7;::::1;3553:1;3540:10:::0;;;::::1;::::0;;;;;;;:14;;;3569:9;::::1;::::0;3553:1;3569:9:::1;3489:96:::0;:::o;3233:117::-;3285:7;3311:32;-1:-1:-1;;;;;;;;;;;2035:53:3;-1:-1:-1;;;;;2035:53:3;;1957:138;3311:32:7;3304:39;;3233:117;:::o;3591:217::-;2343:10;2337:5;:17;;;;;;;;;;;2358:1;2337:22;2329:63;;;;-1:-1:-1;;;2329:63:7;;;;;;;:::i;:::-;3661:4:::1;-1:-1:-1::0;;;3661:16:7;3657:113:::1;;3693:6;:13:::0;;-1:-1:-1;;;;;;3693:13:7::1;-1:-1:-1::0;;;;;3693:13:7;::::1;;::::0;;3657:113:::1;;;3723:47;::::0;-1:-1:-1;;;3723:47:7;;9980:2:8;3723:47:7::1;::::0;::::1;9962:21:8::0;10019:2;9999:18;;;9992:30;10058:34;10038:18;;;10031:62;-1:-1:-1;;;10109:18:8;;;10102:35;10154:19;;3723:47:7::1;9778:401:8::0;3657:113:7::1;3785:16;::::0;-1:-1:-1;;;;;1742:32:8;;1724:51;;3790:4:7;;3785:16:::1;::::0;1712:2:8;1697:18;3785:16:7::1;;;;;;;3591:217:::0;;:::o;4599:312:1:-;4679:4;-1:-1:-1;;;;;4688:6:1;4671:23;;;:120;;;4785:6;-1:-1:-1;;;;;4749:42:1;:32;-1:-1:-1;;;;;;;;;;;2035:53:3;-1:-1:-1;;;;;2035:53:3;;1957:138;4749:32:1;-1:-1:-1;;;;;4749:42:1;;;4671:120;4654:251;;;4865:29;;-1:-1:-1;;;4865:29:1;;;;;;;;;;;4654:251;4599:312::o;3148:79:7:-;2343:10;2337:5;:17;;;;;;;;;;;2358:1;2337:22;2329:63;;;;-1:-1:-1;;;2329:63:7;;;;;;;:::i;:::-;3148:79;:::o;6052:538:1:-;6169:17;-1:-1:-1;;;;;6151:50:1;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6151:52:1;;;;;;;;-1:-1:-1;;6151:52:1;;;;;;;;;;;;:::i;:::-;;;6147:437;;6513:60;;-1:-1:-1;;;6513:60:1;;-1:-1:-1;;;;;1742:32:8;;6513:60:1;;;1724:51:8;1697:18;;6513:60:1;1545:236:8;6147:437:1;-1:-1:-1;;;;;;;;;;;6245:40:1;;6241:120;;6312:34;;-1:-1:-1;;;6312:34:1;;;;;2325:25:8;;;2298:18;;6312:34:1;2179:177:8;6241:120:1;6374:54;6404:17;6423:4;6374:29;:54::i;:::-;6204:235;6052:538;;:::o;5028:213::-;5102:4;-1:-1:-1;;;;;5111:6:1;5094:23;;5090:145;;5195:29;;-1:-1:-1;;;5195:29:1;;;;;;;;;;;4089:1239:7;4319:6;;4329:1;4319:11;4311:44;;;;-1:-1:-1;;;4311:44:7;;10575:2:8;4311:44:7;;;10557:21:8;10614:2;10594:18;;;10587:30;-1:-1:-1;;;10633:18:8;;;10626:50;10693:18;;4311:44:7;10373:344:8;4311:44:7;-1:-1:-1;;;;;4440:26:7;;;;;;:70;;-1:-1:-1;;;;;;4470:24:7;;;;;;;:11;:24;;;;;;;;:40;;;;4440:70;4432:110;;;;-1:-1:-1;;;4432:110:7;;10924:2:8;4432:110:7;;;10906:21:8;10963:2;10943:18;;;10936:30;11002:29;10982:18;;;10975:57;11049:18;;4432:110:7;10722:351:8;4432:110:7;4601:6;;4553:64;;-1:-1:-1;;;4553:64:7;;4589:10;4553:64;;;8146:34:8;-1:-1:-1;;;;;4601:6:7;;;8196:18:8;;;8189:43;8248:18;;;8241:34;;;4553:35:7;;;;;;8081:18:8;;4553:64:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4628:9;-1:-1:-1;;;;;4628:21:7;;4681:11;4732:4;-1:-1:-1;;;;;4732:24:7;;5011:12;5041:11;5070:10;5098:3;5119:7;5144:10;4717:452;;;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;4717:452:7;;;;;;;;;;;;;;;-1:-1:-1;;;;;4717:452:7;;;;;;4628:592;;;;;-1:-1:-1;;;;;;4628:592:7;;;;;;-1:-1:-1;4717:452:7;5197:12;;4628:592;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5284:10;-1:-1:-1;;;;;5236:85:7;5270:12;-1:-1:-1;;;;;5236:85:7;5257:11;-1:-1:-1;;;;;5236:85:7;;5296:3;5301:7;5310:10;5236:85;;;;;;;;:::i;:::-;;;;;;;;4089:1239;;;;;;:::o;2968:67:1:-;6931:20:0;:18;:20::i;2779:335:3:-;2870:37;2889:17;2870:18;:37::i;:::-;2922:27;;-1:-1:-1;;;;;2922:27:3;;;;;;;;2964:11;;:15;2960:148;;2995:53;3024:17;3043:4;2995:28;:53::i;2960:148::-;3079:18;:16;:18::i;7084:141:0:-;8870:21;8560:40;-1:-1:-1;;;8560:40:0;;;;7146:73;;7191:17;;-1:-1:-1;;;7191:17:0;;;;;;;;;;;2186:281:3;2263:17;-1:-1:-1;;;;;2263:29:3;;2296:1;2263:34;2259:119;;2320:47;;-1:-1:-1;;;2320:47:3;;-1:-1:-1;;;;;1742:32:8;;2320:47:3;;;1724:51:8;1697:18;;2320:47:3;1545:236:8;2259:119:3;-1:-1:-1;;;;;;;;;;;2387:73:3;;-1:-1:-1;;;;;;2387:73:3;-1:-1:-1;;;;;2387:73:3;;;;;;;;;;2186:281::o;4106:253:5:-;4189:12;4214;4228:23;4255:6;-1:-1:-1;;;;;4255:19:5;4275:4;4255:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4213:67;;;;4297:55;4324:6;4332:7;4341:10;4297:26;:55::i;:::-;4290:62;4106:253;-1:-1:-1;;;;;4106:253:5:o;6598:122:3:-;6648:9;:13;6644:70;;6684:19;;-1:-1:-1;;;6684:19:3;;;;;;;;;;;4625:582:5;4769:12;4798:7;4793:408;;4821:19;4829:10;4821:7;:19::i;:::-;4793:408;;;5045:17;;:22;:49;;;;-1:-1:-1;;;;;;5071:18:5;;;:23;5045:49;5041:119;;;5121:24;;-1:-1:-1;;;5121:24:5;;-1:-1:-1;;;;;1742:32:8;;5121:24:5;;;1724:51:8;1697:18;;5121:24:5;1545:236:8;5041:119:5;-1:-1:-1;5180:10:5;4793:408;4625:582;;;;;:::o;5743:516::-;5874:17;;:21;5870:383;;6102:10;6096:17;6158:15;6145:10;6141:2;6137:19;6130:44;5870:383;6225:17;;-1:-1:-1;;;6225:17:5;;;;;;;;;;;14:131:8;-1:-1:-1;;;;;89:31:8;;79:42;;69:70;;135:1;132;125:12;150:347;201:8;211:6;265:3;258:4;250:6;246:17;242:27;232:55;;283:1;280;273:12;232:55;-1:-1:-1;306:20:8;;349:18;338:30;;335:50;;;381:1;378;371:12;335:50;418:4;410:6;406:17;394:29;;470:3;463:4;454:6;446;442:19;438:30;435:39;432:59;;;487:1;484;477:12;432:59;150:347;;;;;:::o;502:1038::-;617:6;625;633;641;649;657;665;718:3;706:9;697:7;693:23;689:33;686:53;;;735:1;732;725:12;686:53;774:9;761:23;793:31;818:5;793:31;:::i;:::-;843:5;-1:-1:-1;900:2:8;885:18;;872:32;913:33;872:32;913:33;:::i;:::-;965:7;-1:-1:-1;1024:2:8;1009:18;;996:32;1037:33;996:32;1037:33;:::i;:::-;1089:7;-1:-1:-1;1148:2:8;1133:18;;1120:32;1161:33;1120:32;1161:33;:::i;:::-;1213:7;-1:-1:-1;1267:3:8;1252:19;;1239:33;;-1:-1:-1;1323:3:8;1308:19;;1295:33;1351:18;1340:30;;1337:50;;;1383:1;1380;1373:12;1337:50;1422:58;1472:7;1463:6;1452:9;1448:22;1422:58;:::i;:::-;502:1038;;;;-1:-1:-1;502:1038:8;;-1:-1:-1;502:1038:8;;;;1396:84;;-1:-1:-1;;;502:1038:8:o;1786:388::-;1854:6;1862;1915:2;1903:9;1894:7;1890:23;1886:32;1883:52;;;1931:1;1928;1921:12;1883:52;1970:9;1957:23;1989:31;2014:5;1989:31;:::i;:::-;2039:5;-1:-1:-1;2096:2:8;2081:18;;2068:32;2109:33;2068:32;2109:33;:::i;:::-;2161:7;2151:17;;;1786:388;;;;;:::o;2361:127::-;2422:10;2417:3;2413:20;2410:1;2403:31;2453:4;2450:1;2443:15;2477:4;2474:1;2467:15;2493:1056;2570:6;2578;2631:2;2619:9;2610:7;2606:23;2602:32;2599:52;;;2647:1;2644;2637:12;2599:52;2686:9;2673:23;2705:31;2730:5;2705:31;:::i;:::-;2755:5;-1:-1:-1;2811:2:8;2796:18;;2783:32;2834:18;2864:14;;;2861:34;;;2891:1;2888;2881:12;2861:34;2929:6;2918:9;2914:22;2904:32;;2974:7;2967:4;2963:2;2959:13;2955:27;2945:55;;2996:1;2993;2986:12;2945:55;3032:2;3019:16;3054:2;3050;3047:10;3044:36;;;3060:18;;:::i;:::-;3135:2;3129:9;3103:2;3189:13;;-1:-1:-1;;3185:22:8;;;3209:2;3181:31;3177:40;3165:53;;;3233:18;;;3253:22;;;3230:46;3227:72;;;3279:18;;:::i;:::-;3319:10;3315:2;3308:22;3354:2;3346:6;3339:18;3394:7;3389:2;3384;3380;3376:11;3372:20;3369:33;3366:53;;;3415:1;3412;3405:12;3366:53;3471:2;3466;3462;3458:11;3453:2;3445:6;3441:15;3428:46;3516:1;3511:2;3506;3498:6;3494:15;3490:24;3483:35;3537:6;3527:16;;;;;;;2493:1056;;;;;:::o;3736:163::-;3803:20;;3863:10;3852:22;;3842:33;;3832:61;;3889:1;3886;3879:12;3832:61;3736:163;;;:::o;3904:969::-;4018:6;4026;4034;4042;4050;4058;4066;4119:3;4107:9;4098:7;4094:23;4090:33;4087:53;;;4136:1;4133;4126:12;4087:53;4175:9;4162:23;4194:31;4219:5;4194:31;:::i;:::-;4244:5;-1:-1:-1;4301:2:8;4286:18;;4273:32;4314:33;4273:32;4314:33;:::i;:::-;4366:7;-1:-1:-1;4425:2:8;4410:18;;4397:32;4438:33;4397:32;4438:33;:::i;:::-;4490:7;-1:-1:-1;4544:2:8;4529:18;;4516:32;;-1:-1:-1;4567:38:8;4600:3;4585:19;;4567:38;:::i;:::-;4557:48;;4656:3;4645:9;4641:19;4628:33;4684:18;4676:6;4673:30;4670:50;;;4716:1;4713;4706:12;4878:250;4963:1;4973:113;4987:6;4984:1;4981:13;4973:113;;;5063:11;;;5057:18;5044:11;;;5037:39;5009:2;5002:10;4973:113;;;-1:-1:-1;;5120:1:8;5102:16;;5095:27;4878:250::o;5133:271::-;5175:3;5213:5;5207:12;5240:6;5235:3;5228:19;5256:76;5325:6;5318:4;5313:3;5309:14;5302:4;5295:5;5291:16;5256:76;:::i;:::-;5386:2;5365:15;-1:-1:-1;;5361:29:8;5352:39;;;;5393:4;5348:50;;5133:271;-1:-1:-1;;5133:271:8:o;5409:220::-;5558:2;5547:9;5540:21;5521:4;5578:45;5619:2;5608:9;5604:18;5596:6;5578:45;:::i;5634:247::-;5693:6;5746:2;5734:9;5725:7;5721:23;5717:32;5714:52;;;5762:1;5759;5752:12;5714:52;5801:9;5788:23;5820:31;5845:5;5820:31;:::i;5886:827::-;5991:6;5999;6007;6015;6023;6031;6084:3;6072:9;6063:7;6059:23;6055:33;6052:53;;;6101:1;6098;6091:12;6052:53;6140:9;6127:23;6159:31;6184:5;6159:31;:::i;:::-;6209:5;-1:-1:-1;6266:2:8;6251:18;;6238:32;6279:33;6238:32;6279:33;:::i;:::-;6331:7;-1:-1:-1;6385:2:8;6370:18;;6357:32;;-1:-1:-1;6408:37:8;6441:2;6426:18;;6408:37;:::i;:::-;6398:47;;6496:3;6485:9;6481:19;6468:33;6524:18;6516:6;6513:30;6510:50;;;6556:1;6553;6546:12;6510:50;6595:58;6645:7;6636:6;6625:9;6621:22;6595:58;:::i;:::-;5886:827;;;;-1:-1:-1;5886:827:8;;-1:-1:-1;5886:827:8;;6672:8;;5886:827;-1:-1:-1;;;5886:827:8:o;6926:315::-;6994:6;7002;7055:2;7043:9;7034:7;7030:23;7026:32;7023:52;;;7071:1;7068;7061:12;7023:52;7107:9;7094:23;7084:33;;7167:2;7156:9;7152:18;7139:32;7180:31;7205:5;7180:31;:::i;7246:251::-;7316:6;7369:2;7357:9;7348:7;7344:23;7340:32;7337:52;;;7385:1;7382;7375:12;7337:52;7417:9;7411:16;7436:31;7461:5;7436:31;:::i;8286:559::-;-1:-1:-1;;;;;8499:32:8;;8481:51;;8563:2;8548:18;;8541:34;;;8611:2;8606;8591:18;;8584:30;;;8630:18;;8623:34;;;8650:6;8700;8694:3;8679:19;;8666:49;8765:1;8735:22;;;8759:3;8731:32;;;8724:43;;;;8828:2;8807:15;;;-1:-1:-1;;8803:29:8;8788:45;8784:55;;8286:559;-1:-1:-1;;;8286:559:8:o;8850:352::-;9052:2;9034:21;;;9091:2;9071:18;;;9064:30;9130;9125:2;9110:18;;9103:58;9193:2;9178:18;;8850:352::o;10184:184::-;10254:6;10307:2;10295:9;10286:7;10282:23;10278:32;10275:52;;;10323:1;10320;10313:12;10275:52;-1:-1:-1;10346:16:8;;10184:184;-1:-1:-1;10184:184:8:o;11078:651::-;-1:-1:-1;;;;;11403:15:8;;;11385:34;;11455:15;;;11450:2;11435:18;;11428:43;11507:15;;;11502:2;11487:18;;11480:43;11559:15;;11554:2;11539:18;;11532:43;11606:3;11591:19;;11584:35;;;11656:3;11365;11635:19;;11628:32;;;11328:4;;11677:46;;11703:19;;11695:6;11677:46;:::i;:::-;11669:54;11078:651;-1:-1:-1;;;;;;;;11078:651:8:o;11734:401::-;-1:-1:-1;;;;;11935:32:8;;11917:51;;12004:2;11999;11984:18;;11977:30;;;-1:-1:-1;;12024:45:8;;12050:18;;12042:6;12024:45;:::i;:::-;12016:53;;12117:10;12109:6;12105:23;12100:2;12089:9;12085:18;12078:51;11734:401;;;;;;:::o;12140:386::-;12372:1;12368;12363:3;12359:11;12355:19;12347:6;12343:32;12332:9;12325:51;12412:6;12407:2;12396:9;12392:18;12385:34;12455:2;12450;12439:9;12435:18;12428:30;12306:4;12475:45;12516:2;12505:9;12501:18;12493:6;12475:45;:::i;12531:287::-;12660:3;12698:6;12692:13;12714:66;12773:6;12768:3;12761:4;12753:6;12749:17;12714:66;:::i;:::-;12796:16;;;;;12531:287;-1:-1:-1;;12531:287:8:o
Swarm Source
ipfs://cdf4d77d558f0c0035a3ed779f16a4621b234a748c84b29453b7ef2ddc2b0ea6
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.