More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 138 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Bridge Tokens | 19796722 | 236 days ago | IN | 0.01 ETH | 0.00185779 | ||||
Bridge Tokens | 19764274 | 241 days ago | IN | 0.01 ETH | 0.00193811 | ||||
Bridge Tokens | 19687195 | 251 days ago | IN | 0.01 ETH | 0.00186456 | ||||
Bridge Tokens | 19681220 | 252 days ago | IN | 0.01 ETH | 0.00290945 | ||||
Bridge Tokens | 19668924 | 254 days ago | IN | 0.01 ETH | 0.00339831 | ||||
Bridge Tokens | 19655761 | 256 days ago | IN | 0.01 ETH | 0.00260586 | ||||
Bridge Tokens | 19650471 | 256 days ago | IN | 0.01 ETH | 0.00448302 | ||||
Bridge Tokens | 19642187 | 258 days ago | IN | 0.01 ETH | 0.00761844 | ||||
Bridge Tokens | 19637176 | 258 days ago | IN | 0.01 ETH | 0.00284514 | ||||
Bridge Tokens | 19607225 | 262 days ago | IN | 0.01 ETH | 0.00251832 | ||||
Bridge Tokens | 19604455 | 263 days ago | IN | 0.01 ETH | 0.0047125 | ||||
Bridge Tokens | 19601251 | 263 days ago | IN | 0.01 ETH | 0.00281391 | ||||
Bridge Tokens | 19598545 | 264 days ago | IN | 0.01 ETH | 0.00320125 | ||||
Bridge Tokens | 19597373 | 264 days ago | IN | 0.01 ETH | 0.00411498 | ||||
Bridge Tokens | 19593326 | 264 days ago | IN | 0.01 ETH | 0.00328445 | ||||
Bridge Tokens | 19591609 | 265 days ago | IN | 0.01 ETH | 0.00492915 | ||||
Bridge Tokens | 19589311 | 265 days ago | IN | 0.01 ETH | 0.00326516 | ||||
Bridge Tokens | 19572566 | 267 days ago | IN | 0.01 ETH | 0.00650966 | ||||
Bridge Tokens | 19566630 | 268 days ago | IN | 0.01 ETH | 0.01088727 | ||||
Bridge Tokens | 19565617 | 268 days ago | IN | 0.01 ETH | 0.00451475 | ||||
Bridge Tokens | 19564003 | 269 days ago | IN | 0.01 ETH | 0.00614559 | ||||
Bridge Tokens | 19560527 | 269 days ago | IN | 0.01 ETH | 0.00420113 | ||||
Bridge Tokens | 19554558 | 270 days ago | IN | 0.01 ETH | 0.00529005 | ||||
Bridge Tokens | 19554552 | 270 days ago | IN | 0.01 ETH | 0.00485136 | ||||
Bridge Tokens | 19554033 | 270 days ago | IN | 0.01 ETH | 0.00483568 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
19796722 | 236 days ago | 0.01 ETH | ||||
19764274 | 241 days ago | 0.01 ETH | ||||
19687195 | 251 days ago | 0.01 ETH | ||||
19681220 | 252 days ago | 0.01 ETH | ||||
19668924 | 254 days ago | 0.01 ETH | ||||
19655761 | 256 days ago | 0.01 ETH | ||||
19650471 | 256 days ago | 0.01 ETH | ||||
19642187 | 258 days ago | 0.01 ETH | ||||
19637176 | 258 days ago | 0.01 ETH | ||||
19607225 | 262 days ago | 0.01 ETH | ||||
19604455 | 263 days ago | 0.01 ETH | ||||
19601251 | 263 days ago | 0.01 ETH | ||||
19598545 | 264 days ago | 0.01 ETH | ||||
19597373 | 264 days ago | 0.01 ETH | ||||
19593326 | 264 days ago | 0.01 ETH | ||||
19591609 | 265 days ago | 0.01 ETH | ||||
19589311 | 265 days ago | 0.01 ETH | ||||
19572566 | 267 days ago | 0.01 ETH | ||||
19566630 | 268 days ago | 0.01 ETH | ||||
19565617 | 268 days ago | 0.01 ETH | ||||
19564003 | 269 days ago | 0.01 ETH | ||||
19560527 | 269 days ago | 0.01 ETH | ||||
19554558 | 270 days ago | 0.01 ETH | ||||
19554552 | 270 days ago | 0.01 ETH | ||||
19554033 | 270 days ago | 0.01 ETH |
Loading...
Loading
Contract Name:
mainBridge
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-03-14 */ /** *Submitted for verification at Arbiscan.io on 2023-03-19 */ // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) 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(errorMessage); } } } // File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @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. */ 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]. */ 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); } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @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 amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @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; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @layerzerolabs/solidity-examples/contracts/util/ExcessivelySafeCall.sol pragma solidity >=0.7.6; library ExcessivelySafeCall { uint256 constant LOW_28_MASK = 0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff; /// @notice Use when you _really_ really _really_ don't trust the called /// contract. This prevents the called contract from causing reversion of /// the caller in as many ways as we can. /// @dev The main difference between this and a solidity low-level call is /// that we limit the number of bytes that the callee can cause to be /// copied to caller memory. This prevents stupid things like malicious /// contracts returning 10,000,000 bytes causing a local OOG when copying /// to memory. /// @param _target The address to call /// @param _gas The amount of gas to forward to the remote contract /// @param _maxCopy The maximum number of bytes of returndata to copy /// to memory. /// @param _calldata The data to send to the remote contract /// @return success and returndata, as `.call()`. Returndata is capped to /// `_maxCopy` bytes. function excessivelySafeCall( address _target, uint256 _gas, uint16 _maxCopy, bytes memory _calldata ) internal returns (bool, bytes memory) { // set up for assembly call uint256 _toCopy; bool _success; bytes memory _returnData = new bytes(_maxCopy); // dispatch message to recipient // by assembly calling "handle" function // we call via assembly to avoid memcopying a very large returndata // returned by a malicious contract assembly { _success := call( _gas, // gas _target, // recipient 0, // ether value add(_calldata, 0x20), // inloc mload(_calldata), // inlen 0, // outloc 0 // outlen ) // limit our copy to 256 bytes _toCopy := returndatasize() if gt(_toCopy, _maxCopy) { _toCopy := _maxCopy } // Store the length of the copied bytes mstore(_returnData, _toCopy) // copy the bytes from returndata[0:_toCopy] returndatacopy(add(_returnData, 0x20), 0, _toCopy) } return (_success, _returnData); } /// @notice Use when you _really_ really _really_ don't trust the called /// contract. This prevents the called contract from causing reversion of /// the caller in as many ways as we can. /// @dev The main difference between this and a solidity low-level call is /// that we limit the number of bytes that the callee can cause to be /// copied to caller memory. This prevents stupid things like malicious /// contracts returning 10,000,000 bytes causing a local OOG when copying /// to memory. /// @param _target The address to call /// @param _gas The amount of gas to forward to the remote contract /// @param _maxCopy The maximum number of bytes of returndata to copy /// to memory. /// @param _calldata The data to send to the remote contract /// @return success and returndata, as `.call()`. Returndata is capped to /// `_maxCopy` bytes. function excessivelySafeStaticCall( address _target, uint256 _gas, uint16 _maxCopy, bytes memory _calldata ) internal view returns (bool, bytes memory) { // set up for assembly call uint256 _toCopy; bool _success; bytes memory _returnData = new bytes(_maxCopy); // dispatch message to recipient // by assembly calling "handle" function // we call via assembly to avoid memcopying a very large returndata // returned by a malicious contract assembly { _success := staticcall( _gas, // gas _target, // recipient add(_calldata, 0x20), // inloc mload(_calldata), // inlen 0, // outloc 0 // outlen ) // limit our copy to 256 bytes _toCopy := returndatasize() if gt(_toCopy, _maxCopy) { _toCopy := _maxCopy } // Store the length of the copied bytes mstore(_returnData, _toCopy) // copy the bytes from returndata[0:_toCopy] returndatacopy(add(_returnData, 0x20), 0, _toCopy) } return (_success, _returnData); } /** * @notice Swaps function selectors in encoded contract calls * @dev Allows reuse of encoded calldata for functions with identical * argument types but different names. It simply swaps out the first 4 bytes * for the new selector. This function modifies memory in place, and should * only be used with caution. * @param _newSelector The new 4-byte selector * @param _buf The encoded contract args */ function swapSelector(bytes4 _newSelector, bytes memory _buf) internal pure { require(_buf.length >= 4); uint256 _mask = LOW_28_MASK; assembly { // load the first word of let _word := mload(add(_buf, 0x20)) // mask out the top 4 bytes // /x _word := and(_word, _mask) _word := or(_newSelector, _word) mstore(add(_buf, 0x20), _word) } } } // File: @layerzerolabs/solidity-examples/contracts/util/BytesLib.sol /* * @title Solidity Bytes Arrays Utils * @author Gonçalo Sá <[email protected]> * * @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity. * The library lets you concatenate, slice and type cast bytes arrays both in memory and storage. */ pragma solidity >=0.8.0 <0.9.0; library BytesLib { function concat( bytes memory _preBytes, bytes memory _postBytes ) internal pure returns (bytes memory) { bytes memory tempBytes; assembly { // Get a location of some free memory and store it in tempBytes as // Solidity does for memory variables. tempBytes := mload(0x40) // Store the length of the first bytes array at the beginning of // the memory for tempBytes. let length := mload(_preBytes) mstore(tempBytes, length) // Maintain a memory counter for the current write location in the // temp bytes array by adding the 32 bytes for the array length to // the starting location. let mc := add(tempBytes, 0x20) // Stop copying when the memory counter reaches the length of the // first bytes array. let end := add(mc, length) for { // Initialize a copy counter to the start of the _preBytes data, // 32 bytes into its memory. let cc := add(_preBytes, 0x20) } lt(mc, end) { // Increase both counters by 32 bytes each iteration. mc := add(mc, 0x20) cc := add(cc, 0x20) } { // Write the _preBytes data into the tempBytes memory 32 bytes // at a time. mstore(mc, mload(cc)) } // Add the length of _postBytes to the current length of tempBytes // and store it as the new length in the first 32 bytes of the // tempBytes memory. length := mload(_postBytes) mstore(tempBytes, add(length, mload(tempBytes))) // Move the memory counter back from a multiple of 0x20 to the // actual end of the _preBytes data. mc := end // Stop copying when the memory counter reaches the new combined // length of the arrays. end := add(mc, length) for { let cc := add(_postBytes, 0x20) } lt(mc, end) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { mstore(mc, mload(cc)) } // Update the free-memory pointer by padding our last write location // to 32 bytes: add 31 bytes to the end of tempBytes to move to the // next 32 byte block, then round down to the nearest multiple of // 32. If the sum of the length of the two arrays is zero then add // one before rounding down to leave a blank 32 bytes (the length block with 0). mstore(0x40, and( add(add(end, iszero(add(length, mload(_preBytes)))), 31), not(31) // Round down to the nearest 32 bytes. )) } return tempBytes; } function concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal { assembly { // Read the first 32 bytes of _preBytes storage, which is the length // of the array. (We don't need to use the offset into the slot // because arrays use the entire slot.) let fslot := sload(_preBytes.slot) // Arrays of 31 bytes or less have an even value in their slot, // while longer arrays have an odd value. The actual length is // the slot divided by two for odd values, and the lowest order // byte divided by two for even values. // If the slot is even, bitwise and the slot with 255 and divide by // two to get the length. If the slot is odd, bitwise and the slot // with -1 and divide by two. let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2) let mlength := mload(_postBytes) let newlength := add(slength, mlength) // slength can contain both the length and contents of the array // if length < 32 bytes so let's prepare for that // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage switch add(lt(slength, 32), lt(newlength, 32)) case 2 { // Since the new array still fits in the slot, we just need to // update the contents of the slot. // uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length sstore( _preBytes.slot, // all the modifications to the slot are inside this // next block add( // we can just add to the slot contents because the // bytes we want to change are the LSBs fslot, add( mul( div( // load the bytes from memory mload(add(_postBytes, 0x20)), // zero all bytes to the right exp(0x100, sub(32, mlength)) ), // and now shift left the number of bytes to // leave space for the length in the slot exp(0x100, sub(32, newlength)) ), // increase length by the double of the memory // bytes length mul(mlength, 2) ) ) ) } case 1 { // The stored value fits in the slot, but the combined value // will exceed it. // get the keccak hash to get the contents of the array mstore(0x0, _preBytes.slot) let sc := add(keccak256(0x0, 0x20), div(slength, 32)) // save new length sstore(_preBytes.slot, add(mul(newlength, 2), 1)) // The contents of the _postBytes array start 32 bytes into // the structure. Our first read should obtain the `submod` // bytes that can fit into the unused space in the last word // of the stored array. To get this, we read 32 bytes starting // from `submod`, so the data we read overlaps with the array // contents by `submod` bytes. Masking the lowest-order // `submod` bytes allows us to add that value directly to the // stored value. let submod := sub(32, slength) let mc := add(_postBytes, submod) let end := add(_postBytes, mlength) let mask := sub(exp(0x100, submod), 1) sstore( sc, add( and( fslot, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ), and(mload(mc), mask) ) ) for { mc := add(mc, 0x20) sc := add(sc, 1) } lt(mc, end) { sc := add(sc, 1) mc := add(mc, 0x20) } { sstore(sc, mload(mc)) } mask := exp(0x100, sub(mc, end)) sstore(sc, mul(div(mload(mc), mask), mask)) } default { // get the keccak hash to get the contents of the array mstore(0x0, _preBytes.slot) // Start copying to the last used word of the stored array. let sc := add(keccak256(0x0, 0x20), div(slength, 32)) // save new length sstore(_preBytes.slot, add(mul(newlength, 2), 1)) // Copy over the first `submod` bytes of the new data as in // case 1 above. let slengthmod := mod(slength, 32) let mlengthmod := mod(mlength, 32) let submod := sub(32, slengthmod) let mc := add(_postBytes, submod) let end := add(_postBytes, mlength) let mask := sub(exp(0x100, submod), 1) sstore(sc, add(sload(sc), and(mload(mc), mask))) for { sc := add(sc, 1) mc := add(mc, 0x20) } lt(mc, end) { sc := add(sc, 1) mc := add(mc, 0x20) } { sstore(sc, mload(mc)) } mask := exp(0x100, sub(mc, end)) sstore(sc, mul(div(mload(mc), mask), mask)) } } } function slice( bytes memory _bytes, uint256 _start, uint256 _length ) internal pure returns (bytes memory) { require(_length + 31 >= _length, "slice_overflow"); require(_bytes.length >= _start + _length, "slice_outOfBounds"); bytes memory tempBytes; assembly { switch iszero(_length) case 0 { // Get a location of some free memory and store it in tempBytes as // Solidity does for memory variables. tempBytes := mload(0x40) // The first word of the slice result is potentially a partial // word read from the original array. To read it, we calculate // the length of that partial word and start copying that many // bytes into the array. The first word we copy will start with // data we don't care about, but the last `lengthmod` bytes will // land at the beginning of the contents of the new array. When // we're done copying, we overwrite the full first word with // the actual length of the slice. let lengthmod := and(_length, 31) // The multiplication in the next line is necessary // because when slicing multiples of 32 bytes (lengthmod == 0) // the following copy loop was copying the origin's length // and then ending prematurely not copying everything it should. let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod))) let end := add(mc, _length) for { // The multiplication in the next line has the same exact purpose // as the one above. let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start) } lt(mc, end) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { mstore(mc, mload(cc)) } mstore(tempBytes, _length) //update free-memory pointer //allocating the array padded to 32 bytes like the compiler does now mstore(0x40, and(add(mc, 31), not(31))) } //if we want a zero-length slice let's just return a zero-length array default { tempBytes := mload(0x40) //zero out the 32 bytes slice we are about to return //we need to do it because Solidity does not garbage collect mstore(tempBytes, 0) mstore(0x40, add(tempBytes, 0x20)) } } return tempBytes; } function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) { require(_bytes.length >= _start + 20, "toAddress_outOfBounds"); address tempAddress; assembly { tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000) } return tempAddress; } function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) { require(_bytes.length >= _start + 1 , "toUint8_outOfBounds"); uint8 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x1), _start)) } return tempUint; } function toUint16(bytes memory _bytes, uint256 _start) internal pure returns (uint16) { require(_bytes.length >= _start + 2, "toUint16_outOfBounds"); uint16 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x2), _start)) } return tempUint; } function toUint32(bytes memory _bytes, uint256 _start) internal pure returns (uint32) { require(_bytes.length >= _start + 4, "toUint32_outOfBounds"); uint32 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x4), _start)) } return tempUint; } function toUint64(bytes memory _bytes, uint256 _start) internal pure returns (uint64) { require(_bytes.length >= _start + 8, "toUint64_outOfBounds"); uint64 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x8), _start)) } return tempUint; } function toUint96(bytes memory _bytes, uint256 _start) internal pure returns (uint96) { require(_bytes.length >= _start + 12, "toUint96_outOfBounds"); uint96 tempUint; assembly { tempUint := mload(add(add(_bytes, 0xc), _start)) } return tempUint; } function toUint128(bytes memory _bytes, uint256 _start) internal pure returns (uint128) { require(_bytes.length >= _start + 16, "toUint128_outOfBounds"); uint128 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x10), _start)) } return tempUint; } function toUint256(bytes memory _bytes, uint256 _start) internal pure returns (uint256) { require(_bytes.length >= _start + 32, "toUint256_outOfBounds"); uint256 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x20), _start)) } return tempUint; } function toBytes32(bytes memory _bytes, uint256 _start) internal pure returns (bytes32) { require(_bytes.length >= _start + 32, "toBytes32_outOfBounds"); bytes32 tempBytes32; assembly { tempBytes32 := mload(add(add(_bytes, 0x20), _start)) } return tempBytes32; } function equal(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bool) { bool success = true; assembly { let length := mload(_preBytes) // if lengths don't match the arrays are not equal switch eq(length, mload(_postBytes)) case 1 { // cb is a circuit breaker in the for loop since there's // no said feature for inline assembly loops // cb = 1 - don't breaker // cb = 0 - break let cb := 1 let mc := add(_preBytes, 0x20) let end := add(mc, length) for { let cc := add(_postBytes, 0x20) // the next line is the loop condition: // while(uint256(mc < end) + cb == 2) } eq(add(lt(mc, end), cb), 2) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { // if any of these checks fails then arrays are not equal if iszero(eq(mload(mc), mload(cc))) { // unsuccess: success := 0 cb := 0 } } } default { // unsuccess: success := 0 } } return success; } function equalStorage( bytes storage _preBytes, bytes memory _postBytes ) internal view returns (bool) { bool success = true; assembly { // we know _preBytes_offset is 0 let fslot := sload(_preBytes.slot) // Decode the length of the stored array like in concatStorage(). let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2) let mlength := mload(_postBytes) // if lengths don't match the arrays are not equal switch eq(slength, mlength) case 1 { // slength can contain both the length and contents of the array // if length < 32 bytes so let's prepare for that // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage if iszero(iszero(slength)) { switch lt(slength, 32) case 1 { // blank the last byte which is the length fslot := mul(div(fslot, 0x100), 0x100) if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) { // unsuccess: success := 0 } } default { // cb is a circuit breaker in the for loop since there's // no said feature for inline assembly loops // cb = 1 - don't breaker // cb = 0 - break let cb := 1 // get the keccak hash to get the contents of the array mstore(0x0, _preBytes.slot) let sc := keccak256(0x0, 0x20) let mc := add(_postBytes, 0x20) let end := add(mc, mlength) // the next line is the loop condition: // while(uint256(mc < end) + cb == 2) for {} eq(add(lt(mc, end), cb), 2) { sc := add(sc, 1) mc := add(mc, 0x20) } { if iszero(eq(sload(sc), mload(mc))) { // unsuccess: success := 0 cb := 0 } } } } } default { // unsuccess: success := 0 } } return success; } } // File: @layerzerolabs/solidity-examples/contracts/interfaces/ILayerZeroUserApplicationConfig.sol pragma solidity >=0.5.0; interface ILayerZeroUserApplicationConfig { // @notice set the configuration of the LayerZero messaging library of the specified version // @param _version - messaging library version // @param _chainId - the chainId for the pending config change // @param _configType - type of configuration. every messaging library has its own convention. // @param _config - configuration in the bytes. can encode arbitrary content. function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external; // @notice set the send() LayerZero messaging library version to _version // @param _version - new messaging library version function setSendVersion(uint16 _version) external; // @notice set the lzReceive() LayerZero messaging library version to _version // @param _version - new messaging library version function setReceiveVersion(uint16 _version) external; // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload // @param _srcChainId - the chainId of the source chain // @param _srcAddress - the contract address of the source contract at the source chain function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external; } // File: @layerzerolabs/solidity-examples/contracts/interfaces/ILayerZeroEndpoint.sol pragma solidity >=0.5.0; interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig { // @notice send a LayerZero message to the specified address at a LayerZero endpoint. // @param _dstChainId - the destination chain identifier // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains // @param _payload - a custom bytes payload to send to the destination contract // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction // @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination function send(uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable; // @notice used by the messaging library to publish verified payload // @param _srcChainId - the source chain identifier // @param _srcAddress - the source contract (as bytes) at the source chain // @param _dstAddress - the address on destination chain // @param _nonce - the unbound message ordering nonce // @param _gasLimit - the gas limit for external contract execution // @param _payload - verified payload to send to the destination contract function receivePayload(uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint _gasLimit, bytes calldata _payload) external; // @notice get the inboundNonce of a lzApp from a source chain which could be EVM or non-EVM chain // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64); // @notice get the outboundNonce from this source chain which, consequently, is always an EVM // @param _srcAddress - the source chain contract address function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64); // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery // @param _dstChainId - the destination chain identifier // @param _userApplication - the user app address on this EVM chain // @param _payload - the custom message to send over LayerZero // @param _payInZRO - if false, user app pays the protocol fee in native token // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain function estimateFees(uint16 _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam) external view returns (uint nativeFee, uint zroFee); // @notice get this Endpoint's immutable source identifier function getChainId() external view returns (uint16); // @notice the interface to retry failed message on this Endpoint destination // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address // @param _payload - the payload to be retried function retryPayload(uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload) external; // @notice query if any STORED payload (message blocking) at the endpoint. // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool); // @notice query if the _libraryAddress is valid for sending msgs. // @param _userApplication - the user app address on this EVM chain function getSendLibraryAddress(address _userApplication) external view returns (address); // @notice query if the _libraryAddress is valid for receiving msgs. // @param _userApplication - the user app address on this EVM chain function getReceiveLibraryAddress(address _userApplication) external view returns (address); // @notice query if the non-reentrancy guard for send() is on // @return true if the guard is on. false otherwise function isSendingPayload() external view returns (bool); // @notice query if the non-reentrancy guard for receive() is on // @return true if the guard is on. false otherwise function isReceivingPayload() external view returns (bool); // @notice get the configuration of the LayerZero messaging library of the specified version // @param _version - messaging library version // @param _chainId - the chainId for the pending config change // @param _userApplication - the contract address of the user application // @param _configType - type of configuration. every messaging library has its own convention. function getConfig(uint16 _version, uint16 _chainId, address _userApplication, uint _configType) external view returns (bytes memory); // @notice get the send() LayerZero messaging library version // @param _userApplication - the contract address of the user application function getSendVersion(address _userApplication) external view returns (uint16); // @notice get the lzReceive() LayerZero messaging library version // @param _userApplication - the contract address of the user application function getReceiveVersion(address _userApplication) external view returns (uint16); } // File: @layerzerolabs/solidity-examples/contracts/interfaces/ILayerZeroReceiver.sol pragma solidity >=0.5.0; interface ILayerZeroReceiver { // @notice LayerZero endpoint will invoke this function to deliver the message on the destination // @param _srcChainId - the source endpoint identifier // @param _srcAddress - the source sending contract address from the source chain // @param _nonce - the ordered message nonce // @param _payload - the signed payload is the UA bytes has encoded to be sent function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) external; } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @layerzerolabs/solidity-examples/contracts/lzApp/LzApp.sol pragma solidity ^0.8.0; /* * a generic LzReceiver implementation */ abstract contract LzApp is Ownable, ILayerZeroReceiver, ILayerZeroUserApplicationConfig { using BytesLib for bytes; // ua can not send payload larger than this by default, but it can be changed by the ua owner uint constant public DEFAULT_PAYLOAD_SIZE_LIMIT = 10000; ILayerZeroEndpoint public immutable lzEndpoint; mapping(uint16 => bytes) public trustedRemoteLookup; mapping(uint16 => mapping(uint16 => uint)) public minDstGasLookup; mapping(uint16 => uint) public payloadSizeLimitLookup; address public precrime; event SetPrecrime(address precrime); event SetTrustedRemote(uint16 _remoteChainId, bytes _path); event SetTrustedRemoteAddress(uint16 _remoteChainId, bytes _remoteAddress); event SetMinDstGas(uint16 _dstChainId, uint16 _type, uint _minDstGas); constructor(address _endpoint) { lzEndpoint = ILayerZeroEndpoint(_endpoint); } function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) public virtual override { // lzReceive must be called by the endpoint for security require(_msgSender() == address(lzEndpoint), "LzApp: invalid endpoint caller"); bytes memory trustedRemote = trustedRemoteLookup[_srcChainId]; // if will still block the message pathway from (srcChainId, srcAddress). should not receive message from untrusted remote. require(_srcAddress.length == trustedRemote.length && trustedRemote.length > 0 && keccak256(_srcAddress) == keccak256(trustedRemote), "LzApp: invalid source sending contract"); _blockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload); } // abstract function - the default behaviour of LayerZero is blocking. See: NonblockingLzApp if you dont need to enforce ordered messaging function _blockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual; function _lzSend(uint16 _dstChainId, bytes memory _payload, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams, uint _nativeFee) internal virtual { bytes memory trustedRemote = trustedRemoteLookup[_dstChainId]; require(trustedRemote.length != 0, "LzApp: destination chain is not a trusted source"); _checkPayloadSize(_dstChainId, _payload.length); lzEndpoint.send{value: _nativeFee}(_dstChainId, trustedRemote, _payload, _refundAddress, _zroPaymentAddress, _adapterParams); } function _checkGasLimit(uint16 _dstChainId, uint16 _type, bytes memory _adapterParams, uint _extraGas) internal view virtual { uint providedGasLimit = _getGasLimit(_adapterParams); uint minGasLimit = minDstGasLookup[_dstChainId][_type] + _extraGas; require(minGasLimit > 0, "LzApp: minGasLimit not set"); require(providedGasLimit >= minGasLimit, "LzApp: gas limit is too low"); } function _getGasLimit(bytes memory _adapterParams) internal pure virtual returns (uint gasLimit) { require(_adapterParams.length >= 34, "LzApp: invalid adapterParams"); assembly { gasLimit := mload(add(_adapterParams, 34)) } } function _checkPayloadSize(uint16 _dstChainId, uint _payloadSize) internal view virtual { uint payloadSizeLimit = payloadSizeLimitLookup[_dstChainId]; if (payloadSizeLimit == 0) { // use default if not set payloadSizeLimit = DEFAULT_PAYLOAD_SIZE_LIMIT; } require(_payloadSize <= payloadSizeLimit, "LzApp: payload size is too large"); } //---------------------------UserApplication config---------------------------------------- function getConfig(uint16 _version, uint16 _chainId, address, uint _configType) external view returns (bytes memory) { return lzEndpoint.getConfig(_version, _chainId, address(this), _configType); } // generic config for LayerZero user Application function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external override onlyOwner { lzEndpoint.setConfig(_version, _chainId, _configType, _config); } function setSendVersion(uint16 _version) external override onlyOwner { lzEndpoint.setSendVersion(_version); } function setReceiveVersion(uint16 _version) external override onlyOwner { lzEndpoint.setReceiveVersion(_version); } function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external override onlyOwner { lzEndpoint.forceResumeReceive(_srcChainId, _srcAddress); } // _path = abi.encodePacked(remoteAddress, localAddress) // this function set the trusted path for the cross-chain communication function setTrustedRemote(uint16 _srcChainId, bytes calldata _path) external onlyOwner { trustedRemoteLookup[_srcChainId] = _path; emit SetTrustedRemote(_srcChainId, _path); } function setTrustedRemoteAddress(uint16 _remoteChainId, bytes calldata _remoteAddress) external onlyOwner { trustedRemoteLookup[_remoteChainId] = abi.encodePacked(_remoteAddress, address(this)); emit SetTrustedRemoteAddress(_remoteChainId, _remoteAddress); } function getTrustedRemoteAddress(uint16 _remoteChainId) external view returns (bytes memory) { bytes memory path = trustedRemoteLookup[_remoteChainId]; require(path.length != 0, "LzApp: no trusted path record"); return path.slice(0, path.length - 20); // the last 20 bytes should be address(this) } function setPrecrime(address _precrime) external onlyOwner { precrime = _precrime; emit SetPrecrime(_precrime); } function setMinDstGas(uint16 _dstChainId, uint16 _packetType, uint _minGas) external onlyOwner { require(_minGas > 0, "LzApp: invalid minGas"); minDstGasLookup[_dstChainId][_packetType] = _minGas; emit SetMinDstGas(_dstChainId, _packetType, _minGas); } // if the size is 0, it means default size limit function setPayloadSizeLimit(uint16 _dstChainId, uint _size) external onlyOwner { payloadSizeLimitLookup[_dstChainId] = _size; } //--------------------------- VIEW FUNCTION ---------------------------------------- function isTrustedRemote(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool) { bytes memory trustedSource = trustedRemoteLookup[_srcChainId]; return keccak256(trustedSource) == keccak256(_srcAddress); } } // File: @layerzerolabs/solidity-examples/contracts/lzApp/NonblockingLzApp.sol pragma solidity ^0.8.0; /* * the default LayerZero messaging behaviour is blocking, i.e. any failed message will block the channel * this abstract class try-catch all fail messages and store locally for future retry. hence, non-blocking * NOTE: if the srcAddress is not configured properly, it will still block the message pathway from (srcChainId, srcAddress) */ abstract contract NonblockingLzApp is LzApp { using ExcessivelySafeCall for address; constructor(address _endpoint) LzApp(_endpoint) {} mapping(uint16 => mapping(bytes => mapping(uint64 => bytes32))) public failedMessages; event MessageFailed(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload, bytes _reason); event RetryMessageSuccess(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes32 _payloadHash); // overriding the virtual function in LzReceiver function _blockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual override { (bool success, bytes memory reason) = address(this).excessivelySafeCall(gasleft(), 150, abi.encodeWithSelector(this.nonblockingLzReceive.selector, _srcChainId, _srcAddress, _nonce, _payload)); // try-catch all errors/exceptions if (!success) { _storeFailedMessage(_srcChainId, _srcAddress, _nonce, _payload, reason); } } function _storeFailedMessage(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload, bytes memory _reason) internal virtual { failedMessages[_srcChainId][_srcAddress][_nonce] = keccak256(_payload); emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload, _reason); } function nonblockingLzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) public virtual { // only internal transaction require(_msgSender() == address(this), "NonblockingLzApp: caller must be LzApp"); _nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload); } //@notice override this function function _nonblockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual; function retryMessage(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) public payable virtual { // assert there is message to retry bytes32 payloadHash = failedMessages[_srcChainId][_srcAddress][_nonce]; require(payloadHash != bytes32(0), "NonblockingLzApp: no stored message"); require(keccak256(_payload) == payloadHash, "NonblockingLzApp: invalid payload"); // clear the stored message failedMessages[_srcChainId][_srcAddress][_nonce] = bytes32(0); // execute the message. revert if it fails again _nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload); emit RetryMessageSuccess(_srcChainId, _srcAddress, _nonce, payloadHash); } } // File: contracts/bridge/arbitrumBridge.sol //SPDX-License-Identifier: MIT pragma solidity 0.8.17; contract mainBridge is Ownable, NonblockingLzApp{ using SafeERC20 for IERC20; // Structs struct MintMessage { address to; uint amount; uint id; } uint256 fee = 0; bool open = true; IERC20[] public assets; // Events event MintMessageReceived(uint16 indexed srcChainId, address indexed to, uint amount, uint id); event BridgingInitiated(uint16 indexed targetChainId, address indexed to, uint amount, uint id); constructor( address _lzEndpoint, IERC20 _asset ) NonblockingLzApp(_lzEndpoint) { assets.push( _asset); } function setOpen(bool _open) external onlyOwner { open = _open; } function setFee(uint256 _fee) external onlyOwner { require(_fee <= 100000, "Over 100%"); fee = _fee; } function addAsset(IERC20 _asset) external onlyOwner { assets.push(_asset); } // @dev Helper to build MintMessage function buildBridgeMessage(address to, uint amount, uint id) private pure returns (bytes memory) { return abi.encode( MintMessage({ to: to, amount: amount, id: id }) ); } // @notice Mints asset bridged from the other side, can only be invoked by a trusted remote // @param payload message sent from the other side function _nonblockingLzReceive( uint16 srcChainId, bytes memory /* srcAddress */, uint64 /* nonce */, bytes memory payload ) internal override { MintMessage memory message = abi.decode(payload, (MintMessage)); assets[message.id].safeTransfer(message.to, message.amount); emit MintMessageReceived(srcChainId, message.to, message.amount, message.id); } // @notice Burns asset from caller, then sends a cross-chain message to the destination chain. // @param dstChainId The **LayerZero** destination chain ID. function bridgeTokens(uint16 dstChainId, uint amount, uint id) external payable { require(msg.value != 0, "!fee"); require(amount > 0, "!amount"); require(open, "bridge is paused"); uint256 feeAmount = amount*fee/100000; amount -= feeAmount; address sender = _msgSender(); _lzSend( dstChainId, buildBridgeMessage(sender, amount, id), payable(sender), // refund address (LayerZero will refund any extra gas back to caller) address(0x0), // unused bytes(""), // unused msg.value // native fee amount ); assets[id].safeTransferFrom(sender, owner(), feeAmount); assets[id].safeTransferFrom(sender, address(this), amount); emit BridgingInitiated(dstChainId, sender, amount, id); } // @notice Used by the frontend to estimate how much native token should be sent with bridgeTokens() for LayerZero fees. // @param dstChainId The **LayerZero** destination chain ID. function estimateNativeFee( uint16 dstChainId, address to, uint amount, uint id ) external view returns (uint nativeFee) { (nativeFee, ) = lzEndpoint.estimateFees( dstChainId, address(this), buildBridgeMessage(to, amount, id), false, bytes("") ); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_lzEndpoint","type":"address"},{"internalType":"contract IERC20","name":"_asset","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"targetChainId","type":"uint16"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"BridgingInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"_reason","type":"bytes"}],"name":"MessageFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"srcChainId","type":"uint16"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"MintMessageReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"_payloadHash","type":"bytes32"}],"name":"RetryMessageSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"_type","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"_minDstGas","type":"uint256"}],"name":"SetMinDstGas","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"precrime","type":"address"}],"name":"SetPrecrime","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_path","type":"bytes"}],"name":"SetTrustedRemote","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_remoteAddress","type":"bytes"}],"name":"SetTrustedRemoteAddress","type":"event"},{"inputs":[],"name":"DEFAULT_PAYLOAD_SIZE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_asset","type":"address"}],"name":"addAsset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"assets","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"dstChainId","type":"uint16"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"bridgeTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"dstChainId","type":"uint16"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"estimateNativeFee","outputs":[{"internalType":"uint256","name":"nativeFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"failedMessages","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"forceResumeReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"_configType","type":"uint256"}],"name":"getConfig","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"}],"name":"getTrustedRemoteAddress","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"isTrustedRemote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lzEndpoint","outputs":[{"internalType":"contract ILayerZeroEndpoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"}],"name":"minDstGasLookup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"nonblockingLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"payloadSizeLimitLookup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"precrime","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"retryMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"_configType","type":"uint256"},{"internalType":"bytes","name":"_config","type":"bytes"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint16","name":"_packetType","type":"uint16"},{"internalType":"uint256","name":"_minGas","type":"uint256"}],"name":"setMinDstGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_open","type":"bool"}],"name":"setOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint256","name":"_size","type":"uint256"}],"name":"setPayloadSizeLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_precrime","type":"address"}],"name":"setPrecrime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setReceiveVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setSendVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_path","type":"bytes"}],"name":"setTrustedRemote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"internalType":"bytes","name":"_remoteAddress","type":"bytes"}],"name":"setTrustedRemoteAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"trustedRemoteLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a060405260006006556007805460ff191660011790553480156200002357600080fd5b5060405162002f2938038062002f2983398101604081905262000046916200011c565b81806200005333620000b3565b6001600160a01b03908116608052600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169390911692909217909155506200015b9050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146200011957600080fd5b50565b600080604083850312156200013057600080fd5b82516200013d8162000103565b6020840151909250620001508162000103565b809150509250929050565b608051612d7a620001af6000396000818161050e0152818161063c015281816108bb0152818161097c01528181610b1e0152818161117901528181611319015281816117f50152611bd10152612d7a6000f3fe6080604052600436106101d75760003560e01c80638cfd8f5c11610102578063c446183411610095578063df2a5b3b11610064578063df2a5b3b146105b9578063eb8d72b7146105d9578063f2fde38b146105f9578063f5ecbdbc1461061957600080fd5b8063c446183414610550578063cbed8b9c14610566578063cf35bdd014610586578063d1deba1f146105a657600080fd5b8063a6c3d165116100d1578063a6c3d165146104bc578063ace6250d146104dc578063b353aaa7146104fc578063baf3292d1461053057600080fd5b80638cfd8f5c146104125780638da5cb5b1461044a578063950c8a741461047c5780639f38369a1461049c57600080fd5b806342d65a8d1161017a5780636fdca5e0116101495780636fdca5e01461039d578063715018a6146103bd5780637533d788146103d25780637abdc2b5146103ff57600080fd5b806342d65a8d146102ee5780635b8c41e61461030e57806366ad5c8a1461035d57806369fe0e2d1461037d57600080fd5b806310ddb137116101b657806310ddb1371461023e578063298410e51461025e5780633d8b38f61461027e5780633f1f4fa4146102b357600080fd5b80621d3567146101dc57806307e0db17146101fe5780630df374831461021e575b600080fd5b3480156101e857600080fd5b506101fc6101f7366004612294565b610639565b005b34801561020a57600080fd5b506101fc610219366004612328565b610881565b34801561022a57600080fd5b506101fc610239366004612343565b610923565b34801561024a57600080fd5b506101fc610259366004612328565b610942565b34801561026a57600080fd5b506101fc610279366004612382565b6109b3565b34801561028a57600080fd5b5061029e61029936600461239f565b610a1a565b60405190151581526020015b60405180910390f35b3480156102bf57600080fd5b506102e06102ce366004612328565b60036020526000908152604090205481565b6040519081526020016102aa565b3480156102fa57600080fd5b506101fc61030936600461239f565b610ae6565b34801561031a57600080fd5b506102e0610329366004612461565b6005602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205481565b34801561036957600080fd5b506101fc610378366004612294565b610b85565b34801561038957600080fd5b506101fc610398366004612502565b610c78565b3480156103a957600080fd5b506101fc6103b8366004612529565b610cd8565b3480156103c957600080fd5b506101fc610cf3565b3480156103de57600080fd5b506103f26103ed366004612328565b610d07565b6040516102aa9190612596565b6101fc61040d3660046125a9565b610da1565b34801561041e57600080fd5b506102e061042d3660046125dc565b600260209081526000928352604080842090915290825290205481565b34801561045657600080fd5b506000546001600160a01b03165b6040516001600160a01b0390911681526020016102aa565b34801561048857600080fd5b50600454610464906001600160a01b031681565b3480156104a857600080fd5b506103f26104b7366004612328565b610fd6565b3480156104c857600080fd5b506101fc6104d736600461239f565b6110ec565b3480156104e857600080fd5b506102e06104f736600461260f565b611175565b34801561050857600080fd5b506104647f000000000000000000000000000000000000000000000000000000000000000081565b34801561053c57600080fd5b506101fc61054b366004612382565b611278565b34801561055c57600080fd5b506102e061271081565b34801561057257600080fd5b506101fc610581366004612653565b6112e1565b34801561059257600080fd5b506104646105a1366004612502565b61138f565b6101fc6105b4366004612294565b6113b9565b3480156105c557600080fd5b506101fc6105d43660046126c2565b611607565b3480156105e557600080fd5b506101fc6105f436600461239f565b6116c1565b34801561060557600080fd5b506101fc610614366004612382565b61171b565b34801561062557600080fd5b506103f26106343660046126fe565b6117ab565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146106b65760405162461bcd60e51b815260206004820152601e60248201527f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c6572000060448201526064015b60405180910390fd5b61ffff8616600090815260016020526040812080546106d49061274b565b80601f01602080910402602001604051908101604052809291908181526020018280546107009061274b565b801561074d5780601f106107225761010080835404028352916020019161074d565b820191906000526020600020905b81548152906001019060200180831161073057829003601f168201915b50505050509050805186869050148015610768575060008151115b80156107905750805160208201206040516107869088908890612785565b6040518091039020145b6108025760405162461bcd60e51b815260206004820152602660248201527f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084016106ad565b6108788787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a018190048102820181019092528881528a93509150889088908190840183828082843760009201919091525061187792505050565b50505050505050565b61088961191d565b6040517f07e0db1700000000000000000000000000000000000000000000000000000000815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906307e0db17906024015b600060405180830381600087803b15801561090857600080fd5b505af115801561091c573d6000803e3d6000fd5b5050505050565b61092b61191d565b61ffff909116600090815260036020526040902055565b61094a61191d565b6040517f10ddb13700000000000000000000000000000000000000000000000000000000815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906310ddb137906024016108ee565b6109bb61191d565b600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee301805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b61ffff831660009081526001602052604081208054829190610a3b9061274b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a679061274b565b8015610ab45780601f10610a8957610100808354040283529160200191610ab4565b820191906000526020600020905b815481529060010190602001808311610a9757829003601f168201915b505050505090508383604051610acb929190612785565b60405180910390208180519060200120149150509392505050565b610aee61191d565b6040517f42d65a8d0000000000000000000000000000000000000000000000000000000081526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906342d65a8d90610b57908690869086906004016127be565b600060405180830381600087803b158015610b7157600080fd5b505af1158015610878573d6000803e3d6000fd5b333014610bfa5760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d75737420626560448201527f204c7a417070000000000000000000000000000000000000000000000000000060648201526084016106ad565b610c708686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f89018190048102820181019092528781528993509150879087908190840183828082843760009201919091525061197792505050565b505050505050565b610c8061191d565b620186a0811115610cd35760405162461bcd60e51b815260206004820152600960248201527f4f7665722031303025000000000000000000000000000000000000000000000060448201526064016106ad565b600655565b610ce061191d565b6007805460ff1916911515919091179055565b610cfb61191d565b610d056000611a24565b565b60016020526000908152604090208054610d209061274b565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4c9061274b565b8015610d995780601f10610d6e57610100808354040283529160200191610d99565b820191906000526020600020905b815481529060010190602001808311610d7c57829003601f168201915b505050505081565b34600003610df35760405162461bcd60e51b81526004016106ad9060208082526004908201527f2166656500000000000000000000000000000000000000000000000000000000604082015260600190565b60008211610e435760405162461bcd60e51b815260206004820152600760248201527f21616d6f756e740000000000000000000000000000000000000000000000000060448201526064016106ad565b60075460ff16610e955760405162461bcd60e51b815260206004820152601060248201527f627269646765206973207061757365640000000000000000000000000000000060448201526064016106ad565b6000620186a060065484610ea991906127f2565b610eb3919061280f565b9050610ebf8184612831565b60408051606080820183523380835260208084018681529385018881528551918201839052935181860152925183830152835180840390920182526080909201909252919450610f249086908360006040518060200160405280600081525034611a81565b610f6b81610f3a6000546001600160a01b031690565b8460088781548110610f4e57610f4e612844565b6000918252602090912001546001600160a01b0316929190611c4d565b610f8481308660088781548110610f4e57610f4e612844565b60408051858152602081018590526001600160a01b0383169161ffff8816917f408f171819ef02f8672a5df5271ad907beef1b3fb9eff27d5d711b7d452a9abc91015b60405180910390a35050505050565b61ffff8116600090815260016020526040812080546060929190610ff99061274b565b80601f01602080910402602001604051908101604052809291908181526020018280546110259061274b565b80156110725780601f1061104757610100808354040283529160200191611072565b820191906000526020600020905b81548152906001019060200180831161105557829003601f168201915b5050505050905080516000036110ca5760405162461bcd60e51b815260206004820152601d60248201527f4c7a4170703a206e6f20747275737465642070617468207265636f726400000060448201526064016106ad565b6110e56000601483516110dd9190612831565b839190611d04565b9392505050565b6110f461191d565b8181306040516020016111099392919061285a565b60408051601f1981840301815291815261ffff851660009081526001602052209061113490826128c6565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce838383604051611168939291906127be565b60405180910390a1505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166340a7bb1086306111fc88888860408051606080820183526001600160a01b03959095168082526020808301958652918301938452825191820152925183820152905182840152805180830390930183526080909101905290565b6000604051806020016040528060008152506040518663ffffffff1660e01b815260040161122e959493929190612986565b6040805180830381865afa15801561124a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126e91906129d8565b5095945050505050565b61128061191d565b6004805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b9060200160405180910390a150565b6112e961191d565b6040517fcbed8b9c0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063cbed8b9c9061135690889088908890889088906004016129fc565b600060405180830381600087803b15801561137057600080fd5b505af1158015611384573d6000803e3d6000fd5b505050505050505050565b6008818154811061139f57600080fd5b6000918252602090912001546001600160a01b0316905081565b61ffff861660009081526005602052604080822090516113dc9088908890612785565b908152604080516020928190038301902067ffffffffffffffff8716600090815292529020549050806114775760405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201527f616765000000000000000000000000000000000000000000000000000000000060648201526084016106ad565b808383604051611488929190612785565b6040518091039020146115035760405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f6160448201527f640000000000000000000000000000000000000000000000000000000000000060648201526084016106ad565b61ffff871660009081526005602052604080822090516115269089908990612785565b908152604080516020928190038301812067ffffffffffffffff8916600090815290845282902093909355601f880182900482028301820190528682526115bf918991899089908190840183828082843760009201919091525050604080516020601f8a018190048102820181019092528881528a93509150889088908190840183828082843760009201919091525061197792505050565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e587878787856040516115f6959493929190612a2a565b60405180910390a150505050505050565b61160f61191d565b6000811161165f5760405162461bcd60e51b815260206004820152601560248201527f4c7a4170703a20696e76616c6964206d696e476173000000000000000000000060448201526064016106ad565b61ffff83811660008181526002602090815260408083209487168084529482529182902085905581519283528201929092529081018290527f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac090606001611168565b6116c961191d565b61ffff831660009081526001602052604090206116e7828483612a66565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab838383604051611168939291906127be565b61172361191d565b6001600160a01b03811661179f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016106ad565b6117a881611a24565b50565b6040517ff5ecbdbc00000000000000000000000000000000000000000000000000000000815261ffff808616600483015284166024820152306044820152606481018290526060907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f5ecbdbc90608401600060405180830381865afa158015611844573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261186c9190810190612b26565b90505b949350505050565b6000806119075a60966366ad5c8a60e01b8989898960405160240161189f9493929190612b9d565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915230929190611e2c565b9150915081610c7057610c708686868685611eb7565b6000546001600160a01b03163314610d055760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106ad565b60008180602001905181019061198d9190612bdc565b90506119cf8160000151826020015160088460400151815481106119b3576119b3612844565b6000918252602090912001546001600160a01b03169190611f55565b80600001516001600160a01b03168561ffff167f8ccf63c741a8dffe586cedf350da01b6ef48c4391db986e1736848c4d344802483602001518460400151604051610fc7929190918252602082015260400190565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61ffff861660009081526001602052604081208054611a9f9061274b565b80601f0160208091040260200160405190810160405280929190818152602001828054611acb9061274b565b8015611b185780601f10611aed57610100808354040283529160200191611b18565b820191906000526020600020905b815481529060010190602001808311611afb57829003601f168201915b505050505090508051600003611b965760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201527f61207472757374656420736f757263650000000000000000000000000000000060648201526084016106ad565b611ba1878751611fa3565b6040517fc58031000000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c5803100908490611c12908b9086908c908c908c908c90600401612c3e565b6000604051808303818588803b158015611c2b57600080fd5b505af1158015611c3f573d6000803e3d6000fd5b505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611cfe9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612014565b50505050565b606081611d1281601f612ca5565b1015611d605760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016106ad565b611d6a8284612ca5565b84511015611dba5760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016106ad565b606082158015611dd95760405191506000825260208201604052611e23565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015611e12578051835260209283019201611dfa565b5050858452601f01601f1916604052505b50949350505050565b6000606060008060008661ffff1667ffffffffffffffff811115611e5257611e526123f2565b6040519080825280601f01601f191660200182016040528015611e7c576020820181803683370190505b50905060008087516020890160008d8df191503d925086831115611e9e578692505b828152826000602083013e909890975095505050505050565b8180519060200120600560008761ffff1661ffff16815260200190815260200160002085604051611ee89190612cb8565b90815260408051918290036020908101832067ffffffffffffffff88166000908152915220919091557fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c90611f469087908790879087908790612cd4565b60405180910390a15050505050565b6040516001600160a01b038316602482015260448101829052611f9e9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401611c9a565b505050565b61ffff821660009081526003602052604081205490819003611fc457506127105b80821115611f9e5760405162461bcd60e51b815260206004820181905260248201527f4c7a4170703a207061796c6f61642073697a6520697320746f6f206c6172676560448201526064016106ad565b6000612069826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166120f99092919063ffffffff16565b805190915015611f9e57808060200190518101906120879190612d27565b611f9e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016106ad565b606061186f848460008585600080866001600160a01b031685876040516121209190612cb8565b60006040518083038185875af1925050503d806000811461215d576040519150601f19603f3d011682016040523d82523d6000602084013e612162565b606091505b50915091506121738783838761217e565b979650505050505050565b606083156121ed5782516000036121e6576001600160a01b0385163b6121e65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106ad565b508161186f565b61186f83838151156122025781518083602001fd5b8060405162461bcd60e51b81526004016106ad9190612596565b803561ffff8116811461222e57600080fd5b919050565b60008083601f84011261224557600080fd5b50813567ffffffffffffffff81111561225d57600080fd5b60208301915083602082850101111561227557600080fd5b9250929050565b803567ffffffffffffffff8116811461222e57600080fd5b600080600080600080608087890312156122ad57600080fd5b6122b68761221c565b9550602087013567ffffffffffffffff808211156122d357600080fd5b6122df8a838b01612233565b90975095508591506122f360408a0161227c565b9450606089013591508082111561230957600080fd5b5061231689828a01612233565b979a9699509497509295939492505050565b60006020828403121561233a57600080fd5b6110e58261221c565b6000806040838503121561235657600080fd5b61235f8361221c565b946020939093013593505050565b6001600160a01b03811681146117a857600080fd5b60006020828403121561239457600080fd5b81356110e58161236d565b6000806000604084860312156123b457600080fd5b6123bd8461221c565b9250602084013567ffffffffffffffff8111156123d957600080fd5b6123e586828701612233565b9497909650939450505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612431576124316123f2565b604052919050565b600067ffffffffffffffff821115612453576124536123f2565b50601f01601f191660200190565b60008060006060848603121561247657600080fd5b61247f8461221c565b9250602084013567ffffffffffffffff81111561249b57600080fd5b8401601f810186136124ac57600080fd5b80356124bf6124ba82612439565b612408565b8181528760208385010111156124d457600080fd5b816020840160208301376000602083830101528094505050506124f96040850161227c565b90509250925092565b60006020828403121561251457600080fd5b5035919050565b80151581146117a857600080fd5b60006020828403121561253b57600080fd5b81356110e58161251b565b60005b83811015612561578181015183820152602001612549565b50506000910152565b60008151808452612582816020860160208601612546565b601f01601f19169290920160200192915050565b6020815260006110e5602083018461256a565b6000806000606084860312156125be57600080fd5b6125c78461221c565b95602085013595506040909401359392505050565b600080604083850312156125ef57600080fd5b6125f88361221c565b91506126066020840161221c565b90509250929050565b6000806000806080858703121561262557600080fd5b61262e8561221c565b9350602085013561263e8161236d565b93969395505050506040820135916060013590565b60008060008060006080868803121561266b57600080fd5b6126748661221c565b94506126826020870161221c565b935060408601359250606086013567ffffffffffffffff8111156126a557600080fd5b6126b188828901612233565b969995985093965092949392505050565b6000806000606084860312156126d757600080fd5b6126e08461221c565b92506126ee6020850161221c565b9150604084013590509250925092565b6000806000806080858703121561271457600080fd5b61271d8561221c565b935061272b6020860161221c565b9250604085013561273b8161236d565b9396929550929360600135925050565b600181811c9082168061275f57607f821691505b60208210810361277f57634e487b7160e01b600052602260045260246000fd5b50919050565b8183823760009101908152919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b61ffff8416815260406020820152600061186c604083018486612795565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417612809576128096127dc565b92915050565b60008261282c57634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115612809576128096127dc565b634e487b7160e01b600052603260045260246000fd5b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b601f821115611f9e57600081815260208120601f850160051c810160208610156128a75750805b601f850160051c820191505b81811015610c70578281556001016128b3565b815167ffffffffffffffff8111156128e0576128e06123f2565b6128f4816128ee845461274b565b84612880565b602080601f83116001811461292957600084156129115750858301515b600019600386901b1c1916600185901b178555610c70565b600085815260208120601f198616915b8281101561295857888601518255948401946001909101908401612939565b50858210156129765787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff861681526001600160a01b038516602082015260a0604082015260006129b260a083018661256a565b841515606084015282810360808401526129cc818561256a565b98975050505050505050565b600080604083850312156129eb57600080fd5b505080516020909101519092909150565b600061ffff808816835280871660208401525084604083015260806060830152612173608083018486612795565b61ffff86168152608060208201526000612a48608083018688612795565b67ffffffffffffffff94909416604083015250606001529392505050565b67ffffffffffffffff831115612a7e57612a7e6123f2565b612a9283612a8c835461274b565b83612880565b6000601f841160018114612ac65760008515612aae5750838201355b600019600387901b1c1916600186901b17835561091c565b600083815260209020601f19861690835b82811015612af75786850135825560209485019460019092019101612ad7565b5086821015612b145760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b600060208284031215612b3857600080fd5b815167ffffffffffffffff811115612b4f57600080fd5b8201601f81018413612b6057600080fd5b8051612b6e6124ba82612439565b818152856020838501011115612b8357600080fd5b612b94826020830160208601612546565b95945050505050565b61ffff85168152608060208201526000612bba608083018661256a565b67ffffffffffffffff851660408401528281036060840152612173818561256a565b600060608284031215612bee57600080fd5b6040516060810181811067ffffffffffffffff82111715612c1157612c116123f2565b6040528251612c1f8161236d565b8152602083810151908201526040928301519281019290925250919050565b61ffff8716815260c060208201526000612c5b60c083018861256a565b8281036040840152612c6d818861256a565b6001600160a01b0387811660608601528616608085015283810360a08501529050612c98818561256a565b9998505050505050505050565b80820180821115612809576128096127dc565b60008251612cca818460208701612546565b9190910192915050565b61ffff8616815260a060208201526000612cf160a083018761256a565b67ffffffffffffffff861660408401528281036060840152612d13818661256a565b905082810360808401526129cc818561256a565b600060208284031215612d3957600080fd5b81516110e58161251b56fea26469706673582212208b9e037fd1df19b164dadabf341953dfda34c41ac577a0c5ac15e8d2bbcf2bbd64736f6c6343000811003300000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675000000000000000000000000a709aad0691fc67279577566640ae1d6515c1b81
Deployed Bytecode
0x6080604052600436106101d75760003560e01c80638cfd8f5c11610102578063c446183411610095578063df2a5b3b11610064578063df2a5b3b146105b9578063eb8d72b7146105d9578063f2fde38b146105f9578063f5ecbdbc1461061957600080fd5b8063c446183414610550578063cbed8b9c14610566578063cf35bdd014610586578063d1deba1f146105a657600080fd5b8063a6c3d165116100d1578063a6c3d165146104bc578063ace6250d146104dc578063b353aaa7146104fc578063baf3292d1461053057600080fd5b80638cfd8f5c146104125780638da5cb5b1461044a578063950c8a741461047c5780639f38369a1461049c57600080fd5b806342d65a8d1161017a5780636fdca5e0116101495780636fdca5e01461039d578063715018a6146103bd5780637533d788146103d25780637abdc2b5146103ff57600080fd5b806342d65a8d146102ee5780635b8c41e61461030e57806366ad5c8a1461035d57806369fe0e2d1461037d57600080fd5b806310ddb137116101b657806310ddb1371461023e578063298410e51461025e5780633d8b38f61461027e5780633f1f4fa4146102b357600080fd5b80621d3567146101dc57806307e0db17146101fe5780630df374831461021e575b600080fd5b3480156101e857600080fd5b506101fc6101f7366004612294565b610639565b005b34801561020a57600080fd5b506101fc610219366004612328565b610881565b34801561022a57600080fd5b506101fc610239366004612343565b610923565b34801561024a57600080fd5b506101fc610259366004612328565b610942565b34801561026a57600080fd5b506101fc610279366004612382565b6109b3565b34801561028a57600080fd5b5061029e61029936600461239f565b610a1a565b60405190151581526020015b60405180910390f35b3480156102bf57600080fd5b506102e06102ce366004612328565b60036020526000908152604090205481565b6040519081526020016102aa565b3480156102fa57600080fd5b506101fc61030936600461239f565b610ae6565b34801561031a57600080fd5b506102e0610329366004612461565b6005602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205481565b34801561036957600080fd5b506101fc610378366004612294565b610b85565b34801561038957600080fd5b506101fc610398366004612502565b610c78565b3480156103a957600080fd5b506101fc6103b8366004612529565b610cd8565b3480156103c957600080fd5b506101fc610cf3565b3480156103de57600080fd5b506103f26103ed366004612328565b610d07565b6040516102aa9190612596565b6101fc61040d3660046125a9565b610da1565b34801561041e57600080fd5b506102e061042d3660046125dc565b600260209081526000928352604080842090915290825290205481565b34801561045657600080fd5b506000546001600160a01b03165b6040516001600160a01b0390911681526020016102aa565b34801561048857600080fd5b50600454610464906001600160a01b031681565b3480156104a857600080fd5b506103f26104b7366004612328565b610fd6565b3480156104c857600080fd5b506101fc6104d736600461239f565b6110ec565b3480156104e857600080fd5b506102e06104f736600461260f565b611175565b34801561050857600080fd5b506104647f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67581565b34801561053c57600080fd5b506101fc61054b366004612382565b611278565b34801561055c57600080fd5b506102e061271081565b34801561057257600080fd5b506101fc610581366004612653565b6112e1565b34801561059257600080fd5b506104646105a1366004612502565b61138f565b6101fc6105b4366004612294565b6113b9565b3480156105c557600080fd5b506101fc6105d43660046126c2565b611607565b3480156105e557600080fd5b506101fc6105f436600461239f565b6116c1565b34801561060557600080fd5b506101fc610614366004612382565b61171b565b34801561062557600080fd5b506103f26106343660046126fe565b6117ab565b337f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6756001600160a01b0316146106b65760405162461bcd60e51b815260206004820152601e60248201527f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c6572000060448201526064015b60405180910390fd5b61ffff8616600090815260016020526040812080546106d49061274b565b80601f01602080910402602001604051908101604052809291908181526020018280546107009061274b565b801561074d5780601f106107225761010080835404028352916020019161074d565b820191906000526020600020905b81548152906001019060200180831161073057829003601f168201915b50505050509050805186869050148015610768575060008151115b80156107905750805160208201206040516107869088908890612785565b6040518091039020145b6108025760405162461bcd60e51b815260206004820152602660248201527f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084016106ad565b6108788787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a018190048102820181019092528881528a93509150889088908190840183828082843760009201919091525061187792505050565b50505050505050565b61088961191d565b6040517f07e0db1700000000000000000000000000000000000000000000000000000000815261ffff821660048201527f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6756001600160a01b0316906307e0db17906024015b600060405180830381600087803b15801561090857600080fd5b505af115801561091c573d6000803e3d6000fd5b5050505050565b61092b61191d565b61ffff909116600090815260036020526040902055565b61094a61191d565b6040517f10ddb13700000000000000000000000000000000000000000000000000000000815261ffff821660048201527f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6756001600160a01b0316906310ddb137906024016108ee565b6109bb61191d565b600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee301805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b61ffff831660009081526001602052604081208054829190610a3b9061274b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a679061274b565b8015610ab45780601f10610a8957610100808354040283529160200191610ab4565b820191906000526020600020905b815481529060010190602001808311610a9757829003601f168201915b505050505090508383604051610acb929190612785565b60405180910390208180519060200120149150509392505050565b610aee61191d565b6040517f42d65a8d0000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67516906342d65a8d90610b57908690869086906004016127be565b600060405180830381600087803b158015610b7157600080fd5b505af1158015610878573d6000803e3d6000fd5b333014610bfa5760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d75737420626560448201527f204c7a417070000000000000000000000000000000000000000000000000000060648201526084016106ad565b610c708686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f89018190048102820181019092528781528993509150879087908190840183828082843760009201919091525061197792505050565b505050505050565b610c8061191d565b620186a0811115610cd35760405162461bcd60e51b815260206004820152600960248201527f4f7665722031303025000000000000000000000000000000000000000000000060448201526064016106ad565b600655565b610ce061191d565b6007805460ff1916911515919091179055565b610cfb61191d565b610d056000611a24565b565b60016020526000908152604090208054610d209061274b565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4c9061274b565b8015610d995780601f10610d6e57610100808354040283529160200191610d99565b820191906000526020600020905b815481529060010190602001808311610d7c57829003601f168201915b505050505081565b34600003610df35760405162461bcd60e51b81526004016106ad9060208082526004908201527f2166656500000000000000000000000000000000000000000000000000000000604082015260600190565b60008211610e435760405162461bcd60e51b815260206004820152600760248201527f21616d6f756e740000000000000000000000000000000000000000000000000060448201526064016106ad565b60075460ff16610e955760405162461bcd60e51b815260206004820152601060248201527f627269646765206973207061757365640000000000000000000000000000000060448201526064016106ad565b6000620186a060065484610ea991906127f2565b610eb3919061280f565b9050610ebf8184612831565b60408051606080820183523380835260208084018681529385018881528551918201839052935181860152925183830152835180840390920182526080909201909252919450610f249086908360006040518060200160405280600081525034611a81565b610f6b81610f3a6000546001600160a01b031690565b8460088781548110610f4e57610f4e612844565b6000918252602090912001546001600160a01b0316929190611c4d565b610f8481308660088781548110610f4e57610f4e612844565b60408051858152602081018590526001600160a01b0383169161ffff8816917f408f171819ef02f8672a5df5271ad907beef1b3fb9eff27d5d711b7d452a9abc91015b60405180910390a35050505050565b61ffff8116600090815260016020526040812080546060929190610ff99061274b565b80601f01602080910402602001604051908101604052809291908181526020018280546110259061274b565b80156110725780601f1061104757610100808354040283529160200191611072565b820191906000526020600020905b81548152906001019060200180831161105557829003601f168201915b5050505050905080516000036110ca5760405162461bcd60e51b815260206004820152601d60248201527f4c7a4170703a206e6f20747275737465642070617468207265636f726400000060448201526064016106ad565b6110e56000601483516110dd9190612831565b839190611d04565b9392505050565b6110f461191d565b8181306040516020016111099392919061285a565b60408051601f1981840301815291815261ffff851660009081526001602052209061113490826128c6565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce838383604051611168939291906127be565b60405180910390a1505050565b60007f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6756001600160a01b03166340a7bb1086306111fc88888860408051606080820183526001600160a01b03959095168082526020808301958652918301938452825191820152925183820152905182840152805180830390930183526080909101905290565b6000604051806020016040528060008152506040518663ffffffff1660e01b815260040161122e959493929190612986565b6040805180830381865afa15801561124a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126e91906129d8565b5095945050505050565b61128061191d565b6004805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b9060200160405180910390a150565b6112e961191d565b6040517fcbed8b9c0000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675169063cbed8b9c9061135690889088908890889088906004016129fc565b600060405180830381600087803b15801561137057600080fd5b505af1158015611384573d6000803e3d6000fd5b505050505050505050565b6008818154811061139f57600080fd5b6000918252602090912001546001600160a01b0316905081565b61ffff861660009081526005602052604080822090516113dc9088908890612785565b908152604080516020928190038301902067ffffffffffffffff8716600090815292529020549050806114775760405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201527f616765000000000000000000000000000000000000000000000000000000000060648201526084016106ad565b808383604051611488929190612785565b6040518091039020146115035760405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f6160448201527f640000000000000000000000000000000000000000000000000000000000000060648201526084016106ad565b61ffff871660009081526005602052604080822090516115269089908990612785565b908152604080516020928190038301812067ffffffffffffffff8916600090815290845282902093909355601f880182900482028301820190528682526115bf918991899089908190840183828082843760009201919091525050604080516020601f8a018190048102820181019092528881528a93509150889088908190840183828082843760009201919091525061197792505050565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e587878787856040516115f6959493929190612a2a565b60405180910390a150505050505050565b61160f61191d565b6000811161165f5760405162461bcd60e51b815260206004820152601560248201527f4c7a4170703a20696e76616c6964206d696e476173000000000000000000000060448201526064016106ad565b61ffff83811660008181526002602090815260408083209487168084529482529182902085905581519283528201929092529081018290527f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac090606001611168565b6116c961191d565b61ffff831660009081526001602052604090206116e7828483612a66565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab838383604051611168939291906127be565b61172361191d565b6001600160a01b03811661179f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016106ad565b6117a881611a24565b50565b6040517ff5ecbdbc00000000000000000000000000000000000000000000000000000000815261ffff808616600483015284166024820152306044820152606481018290526060907f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6756001600160a01b03169063f5ecbdbc90608401600060405180830381865afa158015611844573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261186c9190810190612b26565b90505b949350505050565b6000806119075a60966366ad5c8a60e01b8989898960405160240161189f9493929190612b9d565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915230929190611e2c565b9150915081610c7057610c708686868685611eb7565b6000546001600160a01b03163314610d055760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106ad565b60008180602001905181019061198d9190612bdc565b90506119cf8160000151826020015160088460400151815481106119b3576119b3612844565b6000918252602090912001546001600160a01b03169190611f55565b80600001516001600160a01b03168561ffff167f8ccf63c741a8dffe586cedf350da01b6ef48c4391db986e1736848c4d344802483602001518460400151604051610fc7929190918252602082015260400190565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61ffff861660009081526001602052604081208054611a9f9061274b565b80601f0160208091040260200160405190810160405280929190818152602001828054611acb9061274b565b8015611b185780601f10611aed57610100808354040283529160200191611b18565b820191906000526020600020905b815481529060010190602001808311611afb57829003601f168201915b505050505090508051600003611b965760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201527f61207472757374656420736f757263650000000000000000000000000000000060648201526084016106ad565b611ba1878751611fa3565b6040517fc58031000000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675169063c5803100908490611c12908b9086908c908c908c908c90600401612c3e565b6000604051808303818588803b158015611c2b57600080fd5b505af1158015611c3f573d6000803e3d6000fd5b505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611cfe9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612014565b50505050565b606081611d1281601f612ca5565b1015611d605760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016106ad565b611d6a8284612ca5565b84511015611dba5760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016106ad565b606082158015611dd95760405191506000825260208201604052611e23565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015611e12578051835260209283019201611dfa565b5050858452601f01601f1916604052505b50949350505050565b6000606060008060008661ffff1667ffffffffffffffff811115611e5257611e526123f2565b6040519080825280601f01601f191660200182016040528015611e7c576020820181803683370190505b50905060008087516020890160008d8df191503d925086831115611e9e578692505b828152826000602083013e909890975095505050505050565b8180519060200120600560008761ffff1661ffff16815260200190815260200160002085604051611ee89190612cb8565b90815260408051918290036020908101832067ffffffffffffffff88166000908152915220919091557fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c90611f469087908790879087908790612cd4565b60405180910390a15050505050565b6040516001600160a01b038316602482015260448101829052611f9e9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401611c9a565b505050565b61ffff821660009081526003602052604081205490819003611fc457506127105b80821115611f9e5760405162461bcd60e51b815260206004820181905260248201527f4c7a4170703a207061796c6f61642073697a6520697320746f6f206c6172676560448201526064016106ad565b6000612069826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166120f99092919063ffffffff16565b805190915015611f9e57808060200190518101906120879190612d27565b611f9e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016106ad565b606061186f848460008585600080866001600160a01b031685876040516121209190612cb8565b60006040518083038185875af1925050503d806000811461215d576040519150601f19603f3d011682016040523d82523d6000602084013e612162565b606091505b50915091506121738783838761217e565b979650505050505050565b606083156121ed5782516000036121e6576001600160a01b0385163b6121e65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106ad565b508161186f565b61186f83838151156122025781518083602001fd5b8060405162461bcd60e51b81526004016106ad9190612596565b803561ffff8116811461222e57600080fd5b919050565b60008083601f84011261224557600080fd5b50813567ffffffffffffffff81111561225d57600080fd5b60208301915083602082850101111561227557600080fd5b9250929050565b803567ffffffffffffffff8116811461222e57600080fd5b600080600080600080608087890312156122ad57600080fd5b6122b68761221c565b9550602087013567ffffffffffffffff808211156122d357600080fd5b6122df8a838b01612233565b90975095508591506122f360408a0161227c565b9450606089013591508082111561230957600080fd5b5061231689828a01612233565b979a9699509497509295939492505050565b60006020828403121561233a57600080fd5b6110e58261221c565b6000806040838503121561235657600080fd5b61235f8361221c565b946020939093013593505050565b6001600160a01b03811681146117a857600080fd5b60006020828403121561239457600080fd5b81356110e58161236d565b6000806000604084860312156123b457600080fd5b6123bd8461221c565b9250602084013567ffffffffffffffff8111156123d957600080fd5b6123e586828701612233565b9497909650939450505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612431576124316123f2565b604052919050565b600067ffffffffffffffff821115612453576124536123f2565b50601f01601f191660200190565b60008060006060848603121561247657600080fd5b61247f8461221c565b9250602084013567ffffffffffffffff81111561249b57600080fd5b8401601f810186136124ac57600080fd5b80356124bf6124ba82612439565b612408565b8181528760208385010111156124d457600080fd5b816020840160208301376000602083830101528094505050506124f96040850161227c565b90509250925092565b60006020828403121561251457600080fd5b5035919050565b80151581146117a857600080fd5b60006020828403121561253b57600080fd5b81356110e58161251b565b60005b83811015612561578181015183820152602001612549565b50506000910152565b60008151808452612582816020860160208601612546565b601f01601f19169290920160200192915050565b6020815260006110e5602083018461256a565b6000806000606084860312156125be57600080fd5b6125c78461221c565b95602085013595506040909401359392505050565b600080604083850312156125ef57600080fd5b6125f88361221c565b91506126066020840161221c565b90509250929050565b6000806000806080858703121561262557600080fd5b61262e8561221c565b9350602085013561263e8161236d565b93969395505050506040820135916060013590565b60008060008060006080868803121561266b57600080fd5b6126748661221c565b94506126826020870161221c565b935060408601359250606086013567ffffffffffffffff8111156126a557600080fd5b6126b188828901612233565b969995985093965092949392505050565b6000806000606084860312156126d757600080fd5b6126e08461221c565b92506126ee6020850161221c565b9150604084013590509250925092565b6000806000806080858703121561271457600080fd5b61271d8561221c565b935061272b6020860161221c565b9250604085013561273b8161236d565b9396929550929360600135925050565b600181811c9082168061275f57607f821691505b60208210810361277f57634e487b7160e01b600052602260045260246000fd5b50919050565b8183823760009101908152919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b61ffff8416815260406020820152600061186c604083018486612795565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417612809576128096127dc565b92915050565b60008261282c57634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115612809576128096127dc565b634e487b7160e01b600052603260045260246000fd5b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b601f821115611f9e57600081815260208120601f850160051c810160208610156128a75750805b601f850160051c820191505b81811015610c70578281556001016128b3565b815167ffffffffffffffff8111156128e0576128e06123f2565b6128f4816128ee845461274b565b84612880565b602080601f83116001811461292957600084156129115750858301515b600019600386901b1c1916600185901b178555610c70565b600085815260208120601f198616915b8281101561295857888601518255948401946001909101908401612939565b50858210156129765787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff861681526001600160a01b038516602082015260a0604082015260006129b260a083018661256a565b841515606084015282810360808401526129cc818561256a565b98975050505050505050565b600080604083850312156129eb57600080fd5b505080516020909101519092909150565b600061ffff808816835280871660208401525084604083015260806060830152612173608083018486612795565b61ffff86168152608060208201526000612a48608083018688612795565b67ffffffffffffffff94909416604083015250606001529392505050565b67ffffffffffffffff831115612a7e57612a7e6123f2565b612a9283612a8c835461274b565b83612880565b6000601f841160018114612ac65760008515612aae5750838201355b600019600387901b1c1916600186901b17835561091c565b600083815260209020601f19861690835b82811015612af75786850135825560209485019460019092019101612ad7565b5086821015612b145760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b600060208284031215612b3857600080fd5b815167ffffffffffffffff811115612b4f57600080fd5b8201601f81018413612b6057600080fd5b8051612b6e6124ba82612439565b818152856020838501011115612b8357600080fd5b612b94826020830160208601612546565b95945050505050565b61ffff85168152608060208201526000612bba608083018661256a565b67ffffffffffffffff851660408401528281036060840152612173818561256a565b600060608284031215612bee57600080fd5b6040516060810181811067ffffffffffffffff82111715612c1157612c116123f2565b6040528251612c1f8161236d565b8152602083810151908201526040928301519281019290925250919050565b61ffff8716815260c060208201526000612c5b60c083018861256a565b8281036040840152612c6d818861256a565b6001600160a01b0387811660608601528616608085015283810360a08501529050612c98818561256a565b9998505050505050505050565b80820180821115612809576128096127dc565b60008251612cca818460208701612546565b9190910192915050565b61ffff8616815260a060208201526000612cf160a083018761256a565b67ffffffffffffffff861660408401528281036060840152612d13818661256a565b905082810360808401526129cc818561256a565b600060208284031215612d3957600080fd5b81516110e58161251b56fea26469706673582212208b9e037fd1df19b164dadabf341953dfda34c41ac577a0c5ac15e8d2bbcf2bbd64736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675000000000000000000000000a709aad0691fc67279577566640ae1d6515c1b81
-----Decoded View---------------
Arg [0] : _lzEndpoint (address): 0x66A71Dcef29A0fFBDBE3c6a460a3B5BC225Cd675
Arg [1] : _asset (address): 0xa709aaD0691Fc67279577566640ae1D6515c1b81
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675
Arg [1] : 000000000000000000000000a709aad0691fc67279577566640ae1d6515c1b81
Deployed Bytecode Sourcemap
65428:3555:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56453:762;;;;;;;;;;-1:-1:-1;56453:762:0;;;;;:::i;:::-;;:::i;:::-;;59751:123;;;;;;;;;;-1:-1:-1;59751:123:0;;;;;:::i;:::-;;:::i;61667:142::-;;;;;;;;;;-1:-1:-1;61667:142:0;;;;;:::i;:::-;;:::i;59882:129::-;;;;;;;;;;-1:-1:-1;59882:129:0;;;;;:::i;:::-;;:::i;66301:90::-;;;;;;;;;;-1:-1:-1;66301:90:0;;;;;:::i;:::-;;:::i;61907:250::-;;;;;;;;;;-1:-1:-1;61907:250:0;;;;;:::i;:::-;;:::i;:::-;;;3111:14:1;;3104:22;3086:41;;3074:2;3059:18;61907:250:0;;;;;;;;55995:53;;;;;;;;;;-1:-1:-1;55995:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;3284:25:1;;;3272:2;3257:18;55995:53:0;3138:177:1;60019:178:0;;;;;;;;;;-1:-1:-1;60019:178:0;;;;;:::i;:::-;;:::i;62785:85::-;;;;;;;;;;-1:-1:-1;62785:85:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64007:346;;;;;;;;;;-1:-1:-1;64007:346:0;;;;;:::i;:::-;;:::i;66168:125::-;;;;;;;;;;-1:-1:-1;66168:125:0;;;;;:::i;:::-;;:::i;66081:79::-;;;;;;;;;;-1:-1:-1;66081:79:0;;;;;:::i;:::-;;:::i;54543:103::-;;;;;;;;;;;;;:::i;55865:51::-;;;;;;;;;;-1:-1:-1;55865:51:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;67498:905::-;;;;;;:::i;:::-;;:::i;55923:65::-;;;;;;;;;;-1:-1:-1;55923:65:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;53895:87;;;;;;;;;;-1:-1:-1;53941:7:0;53968:6;-1:-1:-1;;;;;53968:6:0;53895:87;;;-1:-1:-1;;;;;7038:55:1;;;7020:74;;7008:2;6993:18;53895:87:0;6874:226:1;56055:23:0;;;;;;;;;;-1:-1:-1;56055:23:0;;;;-1:-1:-1;;;;;56055:23:0;;;60839:330;;;;;;;;;;-1:-1:-1;60839:330:0;;;;;:::i;:::-;;:::i;60550:281::-;;;;;;;;;;-1:-1:-1;60550:281:0;;;;;:::i;:::-;;:::i;68603:377::-;;;;;;;;;;-1:-1:-1;68603:377:0;;;;;:::i;:::-;;:::i;55812:46::-;;;;;;;;;;;;;;;61177:136;;;;;;;;;;-1:-1:-1;61177:136:0;;;;;:::i;:::-;;:::i;55748:55::-;;;;;;;;;;;;55798:5;55748:55;;59539:204;;;;;;;;;;-1:-1:-1;59539:204:0;;;;;:::i;:::-;;:::i;65673:22::-;;;;;;;;;;-1:-1:-1;65673:22:0;;;;;:::i;:::-;;:::i;64539:767::-;;;;;;:::i;:::-;;:::i;61321:284::-;;;;;;;;;;-1:-1:-1;61321:284:0;;;;;:::i;:::-;;:::i;60344:198::-;;;;;;;;;;-1:-1:-1;60344:198:0;;;;;:::i;:::-;;:::i;54801:201::-;;;;;;;;;;-1:-1:-1;54801:201:0;;;;;:::i;:::-;;:::i;59266:211::-;;;;;;;;;;-1:-1:-1;59266:211:0;;;;;:::i;:::-;;:::i;56453:762::-;52526:10;56693;-1:-1:-1;;;;;56669:35:0;;56661:78;;;;-1:-1:-1;;;56661:78:0;;9968:2:1;56661:78:0;;;9950:21:1;10007:2;9987:18;;;9980:30;10046:32;10026:18;;;10019:60;10096:18;;56661:78:0;;;;;;;;;56781:32;;;56752:26;56781:32;;;:19;:32;;;;;56752:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56987:13;:20;56965:11;;:18;;:42;:70;;;;;57034:1;57011:13;:20;:24;56965:70;:124;;;;-1:-1:-1;57065:24:0;;;;;;57039:22;;;;57049:11;;;;57039:22;:::i;:::-;;;;;;;;:50;56965:124;56957:175;;;;-1:-1:-1;;;56957:175:0;;11045:2:1;56957:175:0;;;11027:21:1;11084:2;11064:18;;;11057:30;11123:34;11103:18;;;11096:62;11194:8;11174:18;;;11167:36;11220:19;;56957:175:0;10843:402:1;56957:175:0;57145:62;57164:11;57177;;57145:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;57145:62:0;;;;;;;;;;;;;;;;;;;;;;57190:6;;-1:-1:-1;57145:62:0;-1:-1:-1;57198:8:0;;;;;;57145:62;;57198:8;;;;57145:62;;;;;;;;;-1:-1:-1;57145:18:0;;-1:-1:-1;;;57145:62:0:i;:::-;56584:631;56453:762;;;;;;:::o;59751:123::-;53781:13;:11;:13::i;:::-;59831:35:::1;::::0;;;;11424:6:1;11412:19;;59831:35:0::1;::::0;::::1;11394:38:1::0;59831:10:0::1;-1:-1:-1::0;;;;;59831:25:0::1;::::0;::::1;::::0;11367:18:1;;59831:35:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;59751:123:::0;:::o;61667:142::-;53781:13;:11;:13::i;:::-;61758:35:::1;::::0;;::::1;;::::0;;;:22:::1;:35;::::0;;;;:43;61667:142::o;59882:129::-;53781:13;:11;:13::i;:::-;59965:38:::1;::::0;;;;11424:6:1;11412:19;;59965:38:0::1;::::0;::::1;11394::1::0;59965:10:0::1;-1:-1:-1::0;;;;;59965:28:0::1;::::0;::::1;::::0;11367:18:1;;59965:38:0::1;11250:188:1::0;66301:90:0;53781:13;:11;:13::i;:::-;66364:6:::1;:19:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;66364:19:0;;;;;::::1;::::0;;-1:-1:-1;;66364:19:0::1;-1:-1:-1::0;;;;;66364:19:0;;;::::1;::::0;;;::::1;::::0;;66301:90::o;61907:250::-;62049:32;;;62003:4;62049:32;;;:19;:32;;;;;62020:61;;62003:4;;62049:32;62020:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62137:11;;62127:22;;;;;;;:::i;:::-;;;;;;;;62109:13;62099:24;;;;;;:50;62092:57;;;61907:250;;;;;:::o;60019:178::-;53781:13;:11;:13::i;:::-;60134:55:::1;::::0;;;;-1:-1:-1;;;;;60134:10:0::1;:29;::::0;::::1;::::0;:55:::1;::::0;60164:11;;60177;;;;60134:55:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;64007:346:::0;52526:10;64221:4;64197:29;64189:80;;;;-1:-1:-1;;;64189:80:0;;12247:2:1;64189:80:0;;;12229:21:1;12286:2;12266:18;;;12259:30;12325:34;12305:18;;;12298:62;12396:8;12376:18;;;12369:36;12422:19;;64189:80:0;12045:402:1;64189:80:0;64280:65;64302:11;64315;;64280:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;64280:65:0;;;;;;;;;;;;;;;;;;;;;;64328:6;;-1:-1:-1;64280:65:0;-1:-1:-1;64336:8:0;;;;;;64280:65;;64336:8;;;;64280:65;;;;;;;;;-1:-1:-1;64280:21:0;;-1:-1:-1;;;64280:65:0:i;:::-;64007:346;;;;;;:::o;66168:125::-;53781:13;:11;:13::i;:::-;66244:6:::1;66236:4;:14;;66228:36;;;::::0;-1:-1:-1;;;66228:36:0;;12654:2:1;66228:36:0::1;::::0;::::1;12636:21:1::0;12693:1;12673:18;;;12666:29;12731:11;12711:18;;;12704:39;12760:18;;66228:36:0::1;12452:332:1::0;66228:36:0::1;66275:3;:10:::0;66168:125::o;66081:79::-;53781:13;:11;:13::i;:::-;66140:4:::1;:12:::0;;-1:-1:-1;;66140:12:0::1;::::0;::::1;;::::0;;;::::1;::::0;;66081:79::o;54543:103::-;53781:13;:11;:13::i;:::-;54608:30:::1;54635:1;54608:18;:30::i;:::-;54543:103::o:0;55865:51::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;67498:905::-;67597:9;67610:1;67597:14;67589:31;;;;-1:-1:-1;;;67589:31:0;;;;;;12991:2:1;12973:21;;;13030:1;13010:18;;;13003:29;13068:6;13063:2;13048:18;;13041:34;13107:2;13092:18;;12789:327;67589:31:0;67648:1;67639:6;:10;67631:30;;;;-1:-1:-1;;;67631:30:0;;13323:2:1;67631:30:0;;;13305:21:1;13362:1;13342:18;;;13335:29;13400:9;13380:18;;;13373:37;13427:18;;67631:30:0;13121:330:1;67631:30:0;67680:4;;;;67672:33;;;;-1:-1:-1;;;67672:33:0;;13658:2:1;67672:33:0;;;13640:21:1;13697:2;13677:18;;;13670:30;13736:18;13716;;;13709:46;13772:18;;67672:33:0;13456:340:1;67672:33:0;67716:17;67747:6;67743:3;;67736:6;:10;;;;:::i;:::-;:17;;;;:::i;:::-;67716:37;-1:-1:-1;67764:19:0;67716:37;67764:19;;:::i;:::-;66581:111;;;66524:12;66581:111;;;;;52526:10;66581:111;;;;;;;;;;;;;;;;66556:147;;;;;25895:81:1;;;26014:24;;25992:20;;;25985:54;26077:24;;26055:20;;;26048:54;66556:147:0;;;;;;;;;;25868:18:1;;;;66556:147:0;;;67764:19;;-1:-1:-1;67836:333:0;;67858:10;;67944:6;68046:3;68079:9;;;;;;;;;;;;68120;67836:7;:333::i;:::-;68190:55;68218:6;68226:7;53941;53968:6;-1:-1:-1;;;;;53968:6:0;;53895:87;68226:7;68235:9;68190:6;68197:2;68190:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;68190:10:0;;:55;;:27;:55::i;:::-;68256:58;68284:6;68300:4;68307:6;68256;68263:2;68256:10;;;;;;;;:::i;:58::-;68346:49;;;14938:25:1;;;14994:2;14979:18;;14972:34;;;-1:-1:-1;;;;;68346:49:0;;;;;;;;;14911:18:1;68346:49:0;;;;;;;;67578:825;;67498:905;;;:::o;60839:330::-;60963:35;;;60943:17;60963:35;;;:19;:35;;;;;60943:55;;60918:12;;60943:17;60963:35;60943:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61017:4;:11;61032:1;61017:16;61009:58;;;;-1:-1:-1;;;61009:58:0;;15219:2:1;61009:58:0;;;15201:21:1;15258:2;15238:18;;;15231:30;15297:31;15277:18;;;15270:59;15346:18;;61009:58:0;15017:353:1;61009:58:0;61085:31;61096:1;61113:2;61099:4;:11;:16;;;;:::i;:::-;61085:4;;:31;:10;:31::i;:::-;61078:38;60839:330;-1:-1:-1;;;60839:330:0:o;60550:281::-;53781:13;:11;:13::i;:::-;60722:14:::1;;60746:4;60705:47;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;60705:47:0;;::::1;::::0;;;;;;60667:35:::1;::::0;::::1;;::::0;;;:19:::1;60705:47;60667:35:::0;;;:85:::1;::::0;:35;:85:::1;:::i;:::-;;60768:55;60792:14;60808;;60768:55;;;;;;;;:::i;:::-;;;;;;;;60550:281:::0;;;:::o;68603:377::-;68749:14;68792:10;-1:-1:-1;;;;;68792:23:0;;68830:10;68863:4;68883:34;68902:2;68906:6;68914:2;66581:111;;;66524:12;66581:111;;;;;-1:-1:-1;;;;;66581:111:0;;;;;;;;;;;;;;;;;;;;66556:147;;;;;25895:81:1;26014:24;;25992:20;;;25985:54;26077:24;;26055:20;;;26048:54;66556:147:0;;;;;;;;;;25868:18:1;;;;66556:147:0;;;66440:271;68883:34;68932:5;68952:9;;;;;;;;;;;;68792:180;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;68776:196:0;68603:377;-1:-1:-1;;;;;68603:377:0:o;61177:136::-;53781:13;:11;:13::i;:::-;61247:8:::1;:20:::0;;-1:-1:-1;;61247:20:0::1;-1:-1:-1::0;;;;;61247:20:0;::::1;::::0;;::::1;::::0;;;61283:22:::1;::::0;7020:74:1;;;61283:22:0::1;::::0;7008:2:1;6993:18;61283:22:0::1;;;;;;;61177:136:::0;:::o;59539:204::-;53781:13;:11;:13::i;:::-;59673:62:::1;::::0;;;;-1:-1:-1;;;;;59673:10:0::1;:20;::::0;::::1;::::0;:62:::1;::::0;59694:8;;59704;;59714:11;;59727:7;;;;59673:62:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;59539:204:::0;;;;;:::o;65673:22::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;65673:22:0;;-1:-1:-1;65673:22:0;:::o;64539:767::-;64750:27;;;64728:19;64750:27;;;:14;:27;;;;;;:40;;;;64778:11;;;;64750:40;:::i;:::-;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;-1:-1:-1;64750:48:0;64809:73;;;;-1:-1:-1;;;64809:73:0;;19561:2:1;64809:73:0;;;19543:21:1;19600:2;19580:18;;;19573:30;19639:34;19619:18;;;19612:62;19710:5;19690:18;;;19683:33;19733:19;;64809:73:0;19359:399:1;64809:73:0;64924:11;64911:8;;64901:19;;;;;;;:::i;:::-;;;;;;;;:34;64893:80;;;;-1:-1:-1;;;64893:80:0;;19965:2:1;64893:80:0;;;19947:21:1;20004:2;19984:18;;;19977:30;20043:34;20023:18;;;20016:62;20114:3;20094:18;;;20087:31;20135:19;;64893:80:0;19763:397:1;64893:80:0;65021:27;;;65080:1;65021:27;;;:14;:27;;;;;;:40;;;;65049:11;;;;65021:40;:::i;:::-;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;:61;;;;65151:65;;;;;;;;;;;;;;;;;;;65173:11;;65186;;65151:65;;;;;;65186:11;65151:65;;65186:11;65151:65;;;;;;;;;-1:-1:-1;;65151:65:0;;;;;;;;;;;;;;;;;;;;;;65199:6;;-1:-1:-1;65151:65:0;-1:-1:-1;65207:8:0;;;;;;65151:65;;65207:8;;;;65151:65;;;;;;;;;-1:-1:-1;65151:21:0;;-1:-1:-1;;;65151:65:0:i;:::-;65232:66;65252:11;65265;;65278:6;65286:11;65232:66;;;;;;;;;;:::i;:::-;;;;;;;;64672:634;64539:767;;;;;;:::o;61321:284::-;53781:13;:11;:13::i;:::-;61445:1:::1;61435:7;:11;61427:45;;;::::0;-1:-1:-1;;;61427:45:0;;20865:2:1;61427:45:0::1;::::0;::::1;20847:21:1::0;20904:2;20884:18;;;20877:30;20943:23;20923:18;;;20916:51;20984:18;;61427:45:0::1;20663:345:1::0;61427:45:0::1;61483:28;::::0;;::::1;;::::0;;;:15:::1;:28;::::0;;;;;;;:41;;::::1;::::0;;;;;;;;;;:51;;;61550:47;;21236:34:1;;;21286:18;;21279:43;;;;21338:18;;;21331:34;;;61550:47:0::1;::::0;21199:2:1;21184:18;61550:47:0::1;21013:358:1::0;60344:198:0;53781:13;:11;:13::i;:::-;60442:32:::1;::::0;::::1;;::::0;;;:19:::1;:32;::::0;;;;:40:::1;60477:5:::0;;60442:32;:40:::1;:::i;:::-;;60498:36;60515:11;60528:5;;60498:36;;;;;;;;:::i;54801:201::-:0;53781:13;:11;:13::i;:::-;-1:-1:-1;;;;;54890:22:0;::::1;54882:73;;;::::0;-1:-1:-1;;;54882:73:0;;22785:2:1;54882:73:0::1;::::0;::::1;22767:21:1::0;22824:2;22804:18;;;22797:30;22863:34;22843:18;;;22836:62;22934:8;22914:18;;;22907:36;22960:19;;54882:73:0::1;22583:402:1::0;54882:73:0::1;54966:28;54985:8;54966:18;:28::i;:::-;54801:201:::0;:::o;59266:211::-;59401:68;;;;;23227:6:1;23260:15;;;59401:68:0;;;23242:34:1;23312:15;;23292:18;;;23285:43;59450:4:0;23344:18:1;;;23337:83;23436:18;;;23429:34;;;59369:12:0;;59401:10;-1:-1:-1;;;;;59401:20:0;;;;23189:19:1;;59401:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;59401:68:0;;;;;;;;;;;;:::i;:::-;59394:75;;59266:211;;;;;;;:::o;63154:514::-;63304:12;63318:19;63341:153;63375:9;63386:3;63414:34;;;63450:11;63463;63476:6;63484:8;63391:102;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;63391:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;63349:4;;63341:153;;:33;:153::i;:::-;63303:191;;;;63554:7;63549:112;;63578:71;63598:11;63611;63624:6;63632:8;63642:6;63578:19;:71::i;54060:132::-;53941:7;53968:6;-1:-1:-1;;;;;53968:6:0;52526:10;54124:23;54116:68;;;;-1:-1:-1;;;54116:68:0;;24888:2:1;54116:68:0;;;24870:21:1;;;24907:18;;;24900:30;24966:34;24946:18;;;24939:62;25018:18;;54116:68:0;24686:356:1;66872:452:0;67067:26;67107:7;67096:34;;;;;;;;;;;;:::i;:::-;67067:63;;67151:59;67183:7;:10;;;67195:7;:14;;;67151:6;67158:7;:10;;;67151:18;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;67151:18:0;;:59;:31;:59::i;:::-;67277:7;:10;;;-1:-1:-1;;;;;67245:71:0;67265:10;67245:71;;;67289:7;:14;;;67305:7;:10;;;67245:71;;;;;;14938:25:1;;;14994:2;14979:18;;14972:34;14926:2;14911:18;;14764:248;55162:191:0;55236:16;55255:6;;-1:-1:-1;;;;;55272:17:0;;;-1:-1:-1;;55272:17:0;;;;;;55305:40;;55255:6;;;;;;;55305:40;;55236:16;55305:40;55225:128;55162:191;:::o;57504:553::-;57727:32;;;57698:26;57727:32;;;:19;:32;;;;;57698:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57778:13;:20;57802:1;57778:25;57770:86;;;;-1:-1:-1;;;57770:86:0;;26315:2:1;57770:86:0;;;26297:21:1;26354:2;26334:18;;;26327:30;26393:34;26373:18;;;26366:62;26464:18;26444;;;26437:46;26500:19;;57770:86:0;26113:412:1;57770:86:0;57867:47;57885:11;57898:8;:15;57867:17;:47::i;:::-;57925:124;;;;;-1:-1:-1;;;;;57925:10:0;:15;;;;57948:10;;57925:124;;57960:11;;57973:13;;57988:8;;57998:14;;58014:18;;58034:14;;57925:124;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57687:370;57504:553;;;;;;:::o;15675:248::-;15846:68;;-1:-1:-1;;;;;27676:15:1;;;15846:68:0;;;27658:34:1;27728:15;;27708:18;;;27701:43;27760:18;;;27753:34;;;15819:96:0;;15839:5;;15869:27;;27570:18:1;;15846:68:0;;;;-1:-1:-1;;15846:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;15819:19;:96::i;:::-;15675:248;;;;:::o;33957:2779::-;34098:12;34152:7;34136:12;34152:7;34146:2;34136:12;:::i;:::-;:23;;34128:50;;;;-1:-1:-1;;;34128:50:0;;28130:2:1;34128:50:0;;;28112:21:1;28169:2;28149:18;;;28142:30;28208:16;28188:18;;;28181:44;28242:18;;34128:50:0;27928:338:1;34128:50:0;34214:16;34223:7;34214:6;:16;:::i;:::-;34197:6;:13;:33;;34189:63;;;;-1:-1:-1;;;34189:63:0;;28473:2:1;34189:63:0;;;28455:21:1;28512:2;28492:18;;;28485:30;28551:19;28531:18;;;28524:47;28588:18;;34189:63:0;28271:341:1;34189:63:0;34265:22;34331:15;;34360:1933;;;;36437:4;36431:11;36418:24;;36618:1;36607:9;36600:20;36668:4;36657:9;36653:20;36647:4;36640:34;34324:2365;;34360:1933;34537:4;34531:11;34518:24;;35174:2;35165:7;35161:16;35546:9;35539:17;35533:4;35529:28;35517:9;35506;35502:25;35498:60;35595:7;35591:2;35587:16;35844:6;35830:9;35823:17;35817:4;35813:28;35801:9;35793:6;35789:22;35785:57;35781:70;35623:426;35878:3;35874:2;35871:11;35623:426;;;36020:9;;36009:21;;35920:4;35912:13;;;;35953;35623:426;;;-1:-1:-1;;36069:26:0;;;36273:2;36256:11;-1:-1:-1;;36252:25:0;36246:4;36239:39;-1:-1:-1;34324:2365:0;-1:-1:-1;36719:9:0;33957:2779;-1:-1:-1;;;;33957:2779:0:o;20425:1275::-;20587:4;20593:12;20655:15;20681:13;20705:24;20742:8;20732:19;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20732:19:0;;20705:46;;21233:1;21207;21173:9;21167:16;21138:4;21127:9;21123:20;21092:1;21057:7;21031:4;21012:247;21000:259;;21324:16;21313:27;;21369:8;21360:7;21357:21;21354:78;;;21409:8;21398:19;;21354:78;21515:7;21502:11;21495:28;21633:7;21630:1;21623:4;21610:11;21606:22;21591:50;21670:8;;;;-1:-1:-1;20425:1275:0;-1:-1:-1;;;;;;20425:1275:0:o;63676:323::-;63900:8;63890:19;;;;;;63839:14;:27;63854:11;63839:27;;;;;;;;;;;;;;;63867:11;63839:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:48;;;;;;;;;;:70;;;;63925:66;;;;63939:11;;63952;;63880:6;;63973:8;;63983:7;;63925:66;:::i;:::-;;;;;;;;63676:323;;;;;:::o;15456:211::-;15600:58;;-1:-1:-1;;;;;29822:55:1;;15600:58:0;;;29804:74:1;29894:18;;;29887:34;;;15573:86:0;;15593:5;;15623:23;;29777:18:1;;15600:58:0;29630:297:1;15573:86:0;15456:211;;;:::o;58772:389::-;58895:35;;;58871:21;58895:35;;;:22;:35;;;;;;;58945:21;;;58941:125;;-1:-1:-1;55798:5:0;58941:125;59100:16;59084:12;:32;;59076:77;;;;-1:-1:-1;;;59076:77:0;;30134:2:1;59076:77:0;;;30116:21:1;;;30153:18;;;30146:30;30212:34;30192:18;;;30185:62;30264:18;;59076:77:0;29932:356:1;18523:716:0;18947:23;18973:69;19001:4;18973:69;;;;;;;;;;;;;;;;;18981:5;-1:-1:-1;;;;;18973:27:0;;;:69;;;;;:::i;:::-;19057:17;;18947:95;;-1:-1:-1;19057:21:0;19053:179;;19154:10;19143:30;;;;;;;;;;;;:::i;:::-;19135:85;;;;-1:-1:-1;;;19135:85:0;;30745:2:1;19135:85:0;;;30727:21:1;30784:2;30764:18;;;30757:30;30823:34;30803:18;;;30796:62;30894:12;30874:18;;;30867:40;30924:19;;19135:85:0;30543:406:1;4060:229:0;4197:12;4229:52;4251:6;4259:4;4265:1;4268:12;4197;5468;5482:23;5509:6;-1:-1:-1;;;;;5509:11:0;5528:5;5535:4;5509:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5467:73;;;;5558:69;5585:6;5593:7;5602:10;5614:12;5558:26;:69::i;:::-;5551:76;5180:455;-1:-1:-1;;;;;;;5180:455:0:o;7753:644::-;7938:12;7967:7;7963:427;;;7995:10;:17;8016:1;7995:22;7991:290;;-1:-1:-1;;;;;1598:19:0;;;8205:60;;;;-1:-1:-1;;;8205:60:0;;31563:2:1;8205:60:0;;;31545:21:1;31602:2;31582:18;;;31575:30;31641:31;31621:18;;;31614:59;31690:18;;8205:60:0;31361:353:1;8205:60:0;-1:-1:-1;8302:10:0;8295:17;;7963:427;8345:33;8353:10;8365:12;9100:17;;:21;9096:388;;9332:10;9326:17;9389:15;9376:10;9372:2;9368:19;9361:44;9096:388;9459:12;9452:20;;-1:-1:-1;;;9452:20:0;;;;;;;;:::i;14:159:1:-;81:20;;141:6;130:18;;120:29;;110:57;;163:1;160;153:12;110:57;14:159;;;:::o;178:347::-;229:8;239:6;293:3;286:4;278:6;274:17;270:27;260:55;;311:1;308;301:12;260:55;-1:-1:-1;334:20:1;;377:18;366:30;;363:50;;;409:1;406;399:12;363:50;446:4;438:6;434:17;422:29;;498:3;491:4;482:6;474;470:19;466:30;463:39;460:59;;;515:1;512;505:12;460:59;178:347;;;;;:::o;530:171::-;597:20;;657:18;646:30;;636:41;;626:69;;691:1;688;681:12;706:862;812:6;820;828;836;844;852;905:3;893:9;884:7;880:23;876:33;873:53;;;922:1;919;912:12;873:53;945:28;963:9;945:28;:::i;:::-;935:38;;1024:2;1013:9;1009:18;996:32;1047:18;1088:2;1080:6;1077:14;1074:34;;;1104:1;1101;1094:12;1074:34;1143:58;1193:7;1184:6;1173:9;1169:22;1143:58;:::i;:::-;1220:8;;-1:-1:-1;1117:84:1;-1:-1:-1;1117:84:1;;-1:-1:-1;1274:37:1;1307:2;1292:18;;1274:37;:::i;:::-;1264:47;;1364:2;1353:9;1349:18;1336:32;1320:48;;1393:2;1383:8;1380:16;1377:36;;;1409:1;1406;1399:12;1377:36;;1448:60;1500:7;1489:8;1478:9;1474:24;1448:60;:::i;:::-;706:862;;;;-1:-1:-1;706:862:1;;-1:-1:-1;706:862:1;;1527:8;;706:862;-1:-1:-1;;;706:862:1:o;1573:184::-;1631:6;1684:2;1672:9;1663:7;1659:23;1655:32;1652:52;;;1700:1;1697;1690:12;1652:52;1723:28;1741:9;1723:28;:::i;1762:252::-;1829:6;1837;1890:2;1878:9;1869:7;1865:23;1861:32;1858:52;;;1906:1;1903;1896:12;1858:52;1929:28;1947:9;1929:28;:::i;:::-;1919:38;2004:2;1989:18;;;;1976:32;;-1:-1:-1;;;1762:252:1:o;2019:162::-;-1:-1:-1;;;;;2106:5:1;2102:54;2095:5;2092:65;2082:93;;2171:1;2168;2161:12;2186:269;2259:6;2312:2;2300:9;2291:7;2287:23;2283:32;2280:52;;;2328:1;2325;2318:12;2280:52;2367:9;2354:23;2386:39;2419:5;2386:39;:::i;2460:481::-;2538:6;2546;2554;2607:2;2595:9;2586:7;2582:23;2578:32;2575:52;;;2623:1;2620;2613:12;2575:52;2646:28;2664:9;2646:28;:::i;:::-;2636:38;;2725:2;2714:9;2710:18;2697:32;2752:18;2744:6;2741:30;2738:50;;;2784:1;2781;2774:12;2738:50;2823:58;2873:7;2864:6;2853:9;2849:22;2823:58;:::i;:::-;2460:481;;2900:8;;-1:-1:-1;2797:84:1;;-1:-1:-1;;;;2460:481:1:o;3320:184::-;-1:-1:-1;;;3369:1:1;3362:88;3469:4;3466:1;3459:15;3493:4;3490:1;3483:15;3509:275;3580:2;3574:9;3645:2;3626:13;;-1:-1:-1;;3622:27:1;3610:40;;3680:18;3665:34;;3701:22;;;3662:62;3659:88;;;3727:18;;:::i;:::-;3763:2;3756:22;3509:275;;-1:-1:-1;3509:275:1:o;3789:186::-;3837:4;3870:18;3862:6;3859:30;3856:56;;;3892:18;;:::i;:::-;-1:-1:-1;3958:2:1;3937:15;-1:-1:-1;;3933:29:1;3964:4;3929:40;;3789:186::o;3980:815::-;4064:6;4072;4080;4133:2;4121:9;4112:7;4108:23;4104:32;4101:52;;;4149:1;4146;4139:12;4101:52;4172:28;4190:9;4172:28;:::i;:::-;4162:38;;4251:2;4240:9;4236:18;4223:32;4278:18;4270:6;4267:30;4264:50;;;4310:1;4307;4300:12;4264:50;4333:22;;4386:4;4378:13;;4374:27;-1:-1:-1;4364:55:1;;4415:1;4412;4405:12;4364:55;4451:2;4438:16;4476:48;4492:31;4520:2;4492:31;:::i;:::-;4476:48;:::i;:::-;4547:2;4540:5;4533:17;4587:7;4582:2;4577;4573;4569:11;4565:20;4562:33;4559:53;;;4608:1;4605;4598:12;4559:53;4663:2;4658;4654;4650:11;4645:2;4638:5;4634:14;4621:45;4707:1;4702:2;4697;4690:5;4686:14;4682:23;4675:34;4728:5;4718:15;;;;;4752:37;4785:2;4774:9;4770:18;4752:37;:::i;:::-;4742:47;;3980:815;;;;;:::o;4982:180::-;5041:6;5094:2;5082:9;5073:7;5069:23;5065:32;5062:52;;;5110:1;5107;5100:12;5062:52;-1:-1:-1;5133:23:1;;4982:180;-1:-1:-1;4982:180:1:o;5167:118::-;5253:5;5246:13;5239:21;5232:5;5229:32;5219:60;;5275:1;5272;5265:12;5290:241;5346:6;5399:2;5387:9;5378:7;5374:23;5370:32;5367:52;;;5415:1;5412;5405:12;5367:52;5454:9;5441:23;5473:28;5495:5;5473:28;:::i;5536:250::-;5621:1;5631:113;5645:6;5642:1;5639:13;5631:113;;;5721:11;;;5715:18;5702:11;;;5695:39;5667:2;5660:10;5631:113;;;-1:-1:-1;;5778:1:1;5760:16;;5753:27;5536:250::o;5791:270::-;5832:3;5870:5;5864:12;5897:6;5892:3;5885:19;5913:76;5982:6;5975:4;5970:3;5966:14;5959:4;5952:5;5948:16;5913:76;:::i;:::-;6043:2;6022:15;-1:-1:-1;;6018:29:1;6009:39;;;;6050:4;6005:50;;5791:270;-1:-1:-1;;5791:270:1:o;6066:217::-;6213:2;6202:9;6195:21;6176:4;6233:44;6273:2;6262:9;6258:18;6250:6;6233:44;:::i;6288:320::-;6364:6;6372;6380;6433:2;6421:9;6412:7;6408:23;6404:32;6401:52;;;6449:1;6446;6439:12;6401:52;6472:28;6490:9;6472:28;:::i;:::-;6462:38;6547:2;6532:18;;6519:32;;-1:-1:-1;6598:2:1;6583:18;;;6570:32;;6288:320;-1:-1:-1;;;6288:320:1:o;6613:256::-;6679:6;6687;6740:2;6728:9;6719:7;6715:23;6711:32;6708:52;;;6756:1;6753;6746:12;6708:52;6779:28;6797:9;6779:28;:::i;:::-;6769:38;;6826:37;6859:2;6848:9;6844:18;6826:37;:::i;:::-;6816:47;;6613:256;;;;;:::o;7105:464::-;7190:6;7198;7206;7214;7267:3;7255:9;7246:7;7242:23;7238:33;7235:53;;;7284:1;7281;7274:12;7235:53;7307:28;7325:9;7307:28;:::i;:::-;7297:38;;7385:2;7374:9;7370:18;7357:32;7398:39;7431:5;7398:39;:::i;:::-;7105:464;;7456:5;;-1:-1:-1;;;;7508:2:1;7493:18;;7480:32;;7559:2;7544:18;7531:32;;7105:464::o;8092:622::-;8187:6;8195;8203;8211;8219;8272:3;8260:9;8251:7;8247:23;8243:33;8240:53;;;8289:1;8286;8279:12;8240:53;8312:28;8330:9;8312:28;:::i;:::-;8302:38;;8359:37;8392:2;8381:9;8377:18;8359:37;:::i;:::-;8349:47;;8443:2;8432:9;8428:18;8415:32;8405:42;;8498:2;8487:9;8483:18;8470:32;8525:18;8517:6;8514:30;8511:50;;;8557:1;8554;8547:12;8511:50;8596:58;8646:7;8637:6;8626:9;8622:22;8596:58;:::i;:::-;8092:622;;;;-1:-1:-1;8092:622:1;;-1:-1:-1;8673:8:1;;8570:84;8092:622;-1:-1:-1;;;8092:622:1:o;8964:324::-;9039:6;9047;9055;9108:2;9096:9;9087:7;9083:23;9079:32;9076:52;;;9124:1;9121;9114:12;9076:52;9147:28;9165:9;9147:28;:::i;:::-;9137:38;;9194:37;9227:2;9216:9;9212:18;9194:37;:::i;:::-;9184:47;;9278:2;9267:9;9263:18;9250:32;9240:42;;8964:324;;;;;:::o;9293:468::-;9377:6;9385;9393;9401;9454:3;9442:9;9433:7;9429:23;9425:33;9422:53;;;9471:1;9468;9461:12;9422:53;9494:28;9512:9;9494:28;:::i;:::-;9484:38;;9541:37;9574:2;9563:9;9559:18;9541:37;:::i;:::-;9531:47;;9628:2;9617:9;9613:18;9600:32;9641:39;9674:5;9641:39;:::i;:::-;9293:468;;;;-1:-1:-1;9699:5:1;;9751:2;9736:18;9723:32;;-1:-1:-1;;9293:468:1:o;10125:437::-;10204:1;10200:12;;;;10247;;;10268:61;;10322:4;10314:6;10310:17;10300:27;;10268:61;10375:2;10367:6;10364:14;10344:18;10341:38;10338:218;;-1:-1:-1;;;10409:1:1;10402:88;10513:4;10510:1;10503:15;10541:4;10538:1;10531:15;10338:218;;10125:437;;;:::o;10567:271::-;10750:6;10742;10737:3;10724:33;10706:3;10776:16;;10801:13;;;10776:16;10567:271;-1:-1:-1;10567:271:1:o;11443:266::-;11531:6;11526:3;11519:19;11583:6;11576:5;11569:4;11564:3;11560:14;11547:43;-1:-1:-1;11635:1:1;11610:16;;;11628:4;11606:27;;;11599:38;;;;11691:2;11670:15;;;-1:-1:-1;;11666:29:1;11657:39;;;11653:50;;11443:266::o;11714:326::-;11909:6;11901;11897:19;11886:9;11879:38;11953:2;11948;11937:9;11933:18;11926:30;11860:4;11973:61;12030:2;12019:9;12015:18;12007:6;11999;11973:61;:::i;13801:184::-;-1:-1:-1;;;13850:1:1;13843:88;13950:4;13947:1;13940:15;13974:4;13971:1;13964:15;13990:168;14063:9;;;14094;;14111:15;;;14105:22;;14091:37;14081:71;;14132:18;;:::i;:::-;13990:168;;;;:::o;14163:274::-;14203:1;14229;14219:189;;-1:-1:-1;;;14261:1:1;14254:88;14365:4;14362:1;14355:15;14393:4;14390:1;14383:15;14219:189;-1:-1:-1;14422:9:1;;14163:274::o;14442:128::-;14509:9;;;14530:11;;;14527:37;;;14544:18;;:::i;14575:184::-;-1:-1:-1;;;14624:1:1;14617:88;14724:4;14721:1;14714:15;14748:4;14745:1;14738:15;15375:360;15586:6;15578;15573:3;15560:33;15656:2;15652:15;;;;-1:-1:-1;;15648:53:1;15612:16;;15637:65;;;15726:2;15718:11;;15375:360;-1:-1:-1;15375:360:1:o;15865:544::-;15966:2;15961:3;15958:11;15955:448;;;16002:1;16027:5;16023:2;16016:17;16072:4;16068:2;16058:19;16142:2;16130:10;16126:19;16123:1;16119:27;16113:4;16109:38;16178:4;16166:10;16163:20;16160:47;;;-1:-1:-1;16201:4:1;16160:47;16256:2;16251:3;16247:12;16244:1;16240:20;16234:4;16230:31;16220:41;;16311:82;16329:2;16322:5;16319:13;16311:82;;;16374:17;;;16355:1;16344:13;16311:82;;16585:1348;16709:3;16703:10;16736:18;16728:6;16725:30;16722:56;;;16758:18;;:::i;:::-;16787:96;16876:6;16836:38;16868:4;16862:11;16836:38;:::i;:::-;16830:4;16787:96;:::i;:::-;16938:4;;17002:2;16991:14;;17019:1;17014:662;;;;17720:1;17737:6;17734:89;;;-1:-1:-1;17789:19:1;;;17783:26;17734:89;-1:-1:-1;;16542:1:1;16538:11;;;16534:24;16530:29;16520:40;16566:1;16562:11;;;16517:57;17836:81;;16984:943;;17014:662;15812:1;15805:14;;;15849:4;15836:18;;-1:-1:-1;;17050:20:1;;;17167:236;17181:7;17178:1;17175:14;17167:236;;;17270:19;;;17264:26;17249:42;;17362:27;;;;17330:1;17318:14;;;;17197:19;;17167:236;;;17171:3;17431:6;17422:7;17419:19;17416:201;;;17492:19;;;17486:26;-1:-1:-1;;17575:1:1;17571:14;;;17587:3;17567:24;17563:37;17559:42;17544:58;17529:74;;17416:201;-1:-1:-1;;;;;17663:1:1;17647:14;;;17643:22;17630:36;;-1:-1:-1;16585:1348:1:o;17938:663::-;18219:6;18211;18207:19;18196:9;18189:38;-1:-1:-1;;;;;18267:6:1;18263:55;18258:2;18247:9;18243:18;18236:83;18355:3;18350:2;18339:9;18335:18;18328:31;18170:4;18382:45;18422:3;18411:9;18407:19;18399:6;18382:45;:::i;:::-;18477:6;18470:14;18463:22;18458:2;18447:9;18443:18;18436:50;18535:9;18527:6;18523:22;18517:3;18506:9;18502:19;18495:51;18563:32;18588:6;18580;18563:32;:::i;:::-;18555:40;17938:663;-1:-1:-1;;;;;;;;17938:663:1:o;18606:245::-;18685:6;18693;18746:2;18734:9;18725:7;18721:23;18717:32;18714:52;;;18762:1;18759;18752:12;18714:52;-1:-1:-1;;18785:16:1;;18841:2;18826:18;;;18820:25;18785:16;;18820:25;;-1:-1:-1;18606:245:1:o;18856:498::-;19056:4;19085:6;19130:2;19122:6;19118:15;19107:9;19100:34;19182:2;19174:6;19170:15;19165:2;19154:9;19150:18;19143:43;;19222:6;19217:2;19206:9;19202:18;19195:34;19265:3;19260:2;19249:9;19245:18;19238:31;19286:62;19343:3;19332:9;19328:19;19320:6;19312;19286:62;:::i;20165:493::-;20414:6;20406;20402:19;20391:9;20384:38;20458:3;20453:2;20442:9;20438:18;20431:31;20365:4;20479:62;20536:3;20525:9;20521:19;20513:6;20505;20479:62;:::i;:::-;20589:18;20577:31;;;;20572:2;20557:18;;20550:59;-1:-1:-1;20640:2:1;20625:18;20618:34;20471:70;20165:493;-1:-1:-1;;;20165:493:1:o;21376:1202::-;21498:18;21493:3;21490:27;21487:53;;;21520:18;;:::i;:::-;21549:93;21638:3;21598:38;21630:4;21624:11;21598:38;:::i;:::-;21592:4;21549:93;:::i;:::-;21668:1;21693:2;21688:3;21685:11;21710:1;21705:615;;;;22364:1;22381:3;22378:93;;;-1:-1:-1;22437:19:1;;;22424:33;22378:93;-1:-1:-1;;16542:1:1;16538:11;;;16534:24;16530:29;16520:40;16566:1;16562:11;;;16517:57;22484:78;;21678:894;;21705:615;15812:1;15805:14;;;15849:4;15836:18;;-1:-1:-1;;21741:17:1;;;21841:9;21863:229;21877:7;21874:1;21871:14;21863:229;;;21966:19;;;21953:33;21938:49;;22073:4;22058:20;;;;22026:1;22014:14;;;;21893:12;21863:229;;;21867:3;22120;22111:7;22108:16;22105:159;;;22244:1;22240:6;22234:3;22228;22225:1;22221:11;22217:21;22213:34;22209:39;22196:9;22191:3;22187:19;22174:33;22170:79;22162:6;22155:95;22105:159;;;22307:1;22301:3;22298:1;22294:11;22290:19;22284:4;22277:33;21678:894;;21376:1202;;;:::o;23474:647::-;23553:6;23606:2;23594:9;23585:7;23581:23;23577:32;23574:52;;;23622:1;23619;23612:12;23574:52;23655:9;23649:16;23688:18;23680:6;23677:30;23674:50;;;23720:1;23717;23710:12;23674:50;23743:22;;23796:4;23788:13;;23784:27;-1:-1:-1;23774:55:1;;23825:1;23822;23815:12;23774:55;23854:2;23848:9;23879:48;23895:31;23923:2;23895:31;:::i;23879:48::-;23950:2;23943:5;23936:17;23990:7;23985:2;23980;23976;23972:11;23968:20;23965:33;23962:53;;;24011:1;24008;24001:12;23962:53;24024:67;24088:2;24083;24076:5;24072:14;24067:2;24063;24059:11;24024:67;:::i;:::-;24110:5;23474:647;-1:-1:-1;;;;;23474:647:1:o;24126:555::-;24383:6;24375;24371:19;24360:9;24353:38;24427:3;24422:2;24411:9;24407:18;24400:31;24334:4;24454:45;24494:3;24483:9;24479:19;24471:6;24454:45;:::i;:::-;24547:18;24539:6;24535:31;24530:2;24519:9;24515:18;24508:59;24615:9;24607:6;24603:22;24598:2;24587:9;24583:18;24576:50;24643:32;24668:6;24660;24643:32;:::i;25047:639::-;25146:6;25199:2;25187:9;25178:7;25174:23;25170:32;25167:52;;;25215:1;25212;25205:12;25167:52;25248:2;25242:9;25290:2;25282:6;25278:15;25359:6;25347:10;25344:22;25323:18;25311:10;25308:34;25305:62;25302:88;;;25370:18;;:::i;:::-;25406:2;25399:22;25443:16;;25468:39;25443:16;25468:39;:::i;:::-;25516:21;;25591:2;25576:18;;;25570:25;25553:15;;;25546:50;25650:2;25635:18;;;25629:25;25612:15;;;25605:50;;;;-1:-1:-1;25523:6:1;25047:639;-1:-1:-1;25047:639:1:o;26530:860::-;26879:6;26871;26867:19;26856:9;26849:38;26923:3;26918:2;26907:9;26903:18;26896:31;26830:4;26950:45;26990:3;26979:9;26975:19;26967:6;26950:45;:::i;:::-;27043:9;27035:6;27031:22;27026:2;27015:9;27011:18;27004:50;27077:32;27102:6;27094;27077:32;:::i;:::-;-1:-1:-1;;;;;27206:15:1;;;27201:2;27186:18;;27179:43;27259:15;;27253:3;27238:19;;27231:44;27312:22;;;27306:3;27291:19;;27284:51;27063:46;-1:-1:-1;27352:32:1;27063:46;27369:6;27352:32;:::i;:::-;27344:40;26530:860;-1:-1:-1;;;;;;;;;26530:860:1:o;27798:125::-;27863:9;;;27884:10;;;27881:36;;;27897:18;;:::i;28617:287::-;28746:3;28784:6;28778:13;28800:66;28859:6;28854:3;28847:4;28839:6;28835:17;28800:66;:::i;:::-;28882:16;;;;;28617:287;-1:-1:-1;;28617:287:1:o;28909:716::-;29212:6;29204;29200:19;29189:9;29182:38;29256:3;29251:2;29240:9;29236:18;29229:31;29163:4;29283:45;29323:3;29312:9;29308:19;29300:6;29283:45;:::i;:::-;29376:18;29368:6;29364:31;29359:2;29348:9;29344:18;29337:59;29444:9;29436:6;29432:22;29427:2;29416:9;29412:18;29405:50;29478:32;29503:6;29495;29478:32;:::i;:::-;29464:46;;29559:9;29551:6;29547:22;29541:3;29530:9;29526:19;29519:51;29587:32;29612:6;29604;29587:32;:::i;30293:245::-;30360:6;30413:2;30401:9;30392:7;30388:23;30384:32;30381:52;;;30429:1;30426;30419:12;30381:52;30461:9;30455:16;30480:28;30502:5;30480:28;:::i
Swarm Source
ipfs://8b9e037fd1df19b164dadabf341953dfda34c41ac577a0c5ac15e8d2bbcf2bbd
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.