Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 180 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Bridge | 20277430 | 2 days ago | IN | 0 ETH | 0.00065291 | ||||
Bridge | 20277040 | 2 days ago | IN | 0 ETH | 0.00118273 | ||||
Bridge | 20275557 | 3 days ago | IN | 0 ETH | 0.0002272 | ||||
Bridge | 20273583 | 3 days ago | IN | 0 ETH | 0.00020901 | ||||
Bridge | 20273581 | 3 days ago | IN | 0 ETH | 0.00021083 | ||||
Bridge | 20267389 | 4 days ago | IN | 0 ETH | 0.00016834 | ||||
Bridge | 20260731 | 5 days ago | IN | 0 ETH | 0.00058687 | ||||
Bridge | 20244578 | 7 days ago | IN | 0 ETH | 0.00016276 | ||||
Bridge | 20241875 | 7 days ago | IN | 0 ETH | 0.0003332 | ||||
Bridge | 20241789 | 7 days ago | IN | 0 ETH | 0.00038858 | ||||
Bridge | 20241528 | 7 days ago | IN | 0 ETH | 0.00075224 | ||||
Bridge | 20241476 | 7 days ago | IN | 0 ETH | 0.00076062 | ||||
Bridge | 20241307 | 7 days ago | IN | 0 ETH | 0.00086239 | ||||
Bridge | 20212189 | 12 days ago | IN | 0 ETH | 0.00071563 | ||||
Bridge | 20209060 | 12 days ago | IN | 0 ETH | 0.00026587 | ||||
Bridge | 20208242 | 12 days ago | IN | 0 ETH | 0.00018972 | ||||
Bridge | 20208087 | 12 days ago | IN | 0 ETH | 0.00016896 | ||||
Bridge | 20178982 | 16 days ago | IN | 0 ETH | 0.00026668 | ||||
Bridge | 20173335 | 17 days ago | IN | 0 ETH | 0.00021135 | ||||
Bridge | 20166404 | 18 days ago | IN | 0 ETH | 0.00024006 | ||||
Bridge | 20165413 | 18 days ago | IN | 0 ETH | 0.00033681 | ||||
Bridge | 20152238 | 20 days ago | IN | 0 ETH | 0.00015927 | ||||
Bridge | 20142616 | 21 days ago | IN | 0 ETH | 0.00020811 | ||||
Bridge | 20141853 | 21 days ago | IN | 0 ETH | 0.00106822 | ||||
Bridge | 20141852 | 21 days ago | IN | 0 ETH | 0.00053512 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
BridgeERC20V3
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-03-14 */ // SPDX-License-Identifier: UNLICENSED // Sources flattened with hardhat v2.12.6 https://hardhat.org // File @openzeppelin/contracts/utils/[email protected] // 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/security/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // 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/[email protected] // 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/utils/[email protected] // 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/utils/[email protected] // 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 @openzeppelin/contracts/security/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File @openzeppelin/contracts/utils/structs/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } } // File contracts/solc-0_8_x/shared/abstracts/NativeRepresentation.sol pragma solidity ^0.8.17; abstract contract NativeRepresentation { address public constant NATIVE_REPRESENTATION = address(type(uint160).max); } // File contracts/solc-0_8_x/shared/abstracts/OptimizedCommittee.sol pragma solidity ^0.8.0; abstract contract OptimizedCommittee { address public committee; struct CallData { address target; bytes data; } modifier onlyCommittee() { _onlyCommittee(); _; } function _onlyCommittee() internal view { require(msg.sender == committee, "FORBIDDEN"); } function setCommittee(address _committee) external onlyCommittee { committee = _committee; } function multiCall(CallData[] calldata callData) external onlyCommittee { for (uint256 i; i < callData.length; i++) { (bool success, ) = callData[i].target.call(callData[i].data); require(success, "Transaction call failed"); } } } // File contracts/solc-0_8_x/shared/interfaces/IBurnable.sol pragma solidity ^0.8.0; interface IBurnable { // support ERC20, ERC721 function burn(uint256) external; // support ERC20, ERC721 function burnFrom(address, uint256) external; //support ERC1155 function burn(address account, uint256 id, uint256 amount) external; //support ERC1155 function burnBatch( address account, uint256[] calldata ids, uint256[] calldata amounts ) external; } // File contracts/solc-0_8_x/BridgeERC20V3.sol pragma solidity ^0.8.17; contract BridgeERC20V3 is OptimizedCommittee, Pausable, ReentrancyGuard, NativeRepresentation { using SafeERC20 for IERC20; using EnumerableSet for EnumerableSet.UintSet; enum DEST_TOKEN_TYPE { INVALID_0, NATIVE, ERC20, NATIVE_ERC20 } enum FEE_TYPE { NO_FEE, FIX, PERCENTAGE } enum TOKEN_STRATEGY { LOCK, BURN } struct ChainIDAndAllowedDestTokenTypes { uint248 chainID; DEST_TOKEN_TYPE allowedDestTokenTypes; } // 4 words struct ERC20BridgeInfo { // 1st word // If not enabled, not allowed to use this struct. bool enabled; // If zero address, indicates native currency. address token; // // 2nd word uint64 chainID; DEST_TOKEN_TYPE allowedDestTokenTypes; address feeReceiver; // // 3rd word // If fee type is PERCENTAGE, this is in basis point units (0.01%). uint256 fee; // // 4th word FEE_TYPE feeType; TOKEN_STRATEGY strategy; // Represents the distributor address that we are going to move the assets to. address receiver; } // The first 8 bits are destination allowed token types; the following 248 bits are destination chain ID. mapping(address => EnumerableSet.UintSet) private _allowedDestTokenTypesAndDestChains; // Token address -> Chain ID mapping(address => mapping(uint64 => ERC20BridgeInfo)) public bridgeMap; event Bridge( address indexed token, address indexed from, uint256 amount, uint256 indexed destChainID, DEST_TOKEN_TYPE destTokenType ); event SetBridgeInfo( address indexed token, uint256 indexed destChainID, DEST_TOKEN_TYPE indexed allowedDestTokenTypes ); event DeleteBridgeInfo( address indexed token, uint256 indexed destChainID, DEST_TOKEN_TYPE indexed allowedDestTokenTypes ); constructor(address committee_, ERC20BridgeInfo[] memory edges_) { committee = committee_; for (uint256 i; i < edges_.length; i++) { _setBridgeInfo(edges_[i]); } } ////////////////////////////////////////////////////////////////////////////////////////////////// function pause() external onlyCommittee { _pause(); } function unpause() external onlyCommittee { _unpause(); } function setBridgeInfo(ERC20BridgeInfo memory bridgeInfo_) external onlyCommittee { _setBridgeInfo(bridgeInfo_); } function deleteBridgeInfo(address token_, uint64 chainID_) external onlyCommittee { ERC20BridgeInfo memory bridgeInfo = bridgeMap[token_][chainID_]; _onlyExistedBridge(bridgeInfo); _deleteBridgeInfo(bridgeInfo); } function getDestChainIDsAndAllowedTokenTypes( address token_ ) external view returns (ChainIDAndAllowedDestTokenTypes[] memory) { uint256 length = _allowedDestTokenTypesAndDestChains[token_].length(); ChainIDAndAllowedDestTokenTypes[] memory results = new ChainIDAndAllowedDestTokenTypes[](length); uint256 tmp; for (uint256 i; i < length; i++) { tmp = _allowedDestTokenTypesAndDestChains[token_].at(i); results[i].chainID = _getChainID(tmp); results[i].allowedDestTokenTypes = _getAllowedDestTokenTypes(tmp); } return results; } function computeFeeByFeeType(address token_, uint64 chainID_, uint256 amount_) public view returns (uint256) { ERC20BridgeInfo storage tmp = bridgeMap[token_][chainID_]; return _computeFeeByFeeType(tmp.feeType, amount_, tmp.fee); } ////////////////////////////////////////////////////////////////////////////////////////////////// function bridge( address token_, uint256 amount_, uint64 destChainID_, DEST_TOKEN_TYPE destTokenType_ ) external whenNotPaused nonReentrant { _bridge(token_, amount_, destChainID_, destTokenType_); } function bridge(uint64 destChainID_, DEST_TOKEN_TYPE destTokenType_) external payable whenNotPaused nonReentrant { _bridge(NATIVE_REPRESENTATION, msg.value, destChainID_, destTokenType_); } ////////////////////////////////////////////////////////////////////////////////////////////////// function _setBridgeInfo(ERC20BridgeInfo memory bridgeInfo_) private { require(bridgeInfo_.token != address(0), "INVALID_ADDRESS"); if (bridgeInfo_.token == NATIVE_REPRESENTATION) { require(bridgeInfo_.strategy == TOKEN_STRATEGY.LOCK, "BRIDGE_NATIVE_INVALID_STRATEGY"); } // storage so we don't load the whole thing. ERC20BridgeInfo storage tmp = bridgeMap[bridgeInfo_.token][bridgeInfo_.chainID]; if (tmp.token != address(0)) { _deleteBridgeInfo(tmp); } bridgeMap[bridgeInfo_.token][bridgeInfo_.chainID] = bridgeInfo_; _allowedDestTokenTypesAndDestChains[bridgeInfo_.token].add( _composeAllowedDestTokenTypesAndChainID(bridgeInfo_.allowedDestTokenTypes, bridgeInfo_.chainID) ); emit SetBridgeInfo(bridgeInfo_.token, bridgeInfo_.chainID, bridgeInfo_.allowedDestTokenTypes); } function _deleteBridgeInfo(ERC20BridgeInfo memory bridgeInfo_) private { emit DeleteBridgeInfo(bridgeInfo_.token, bridgeInfo_.chainID, bridgeInfo_.allowedDestTokenTypes); _allowedDestTokenTypesAndDestChains[bridgeInfo_.token].remove( _composeAllowedDestTokenTypesAndChainID(bridgeInfo_.allowedDestTokenTypes, bridgeInfo_.chainID) ); delete bridgeMap[bridgeInfo_.token][bridgeInfo_.chainID]; } function _bridge(address token_, uint256 amount_, uint64 destChainID_, DEST_TOKEN_TYPE destTokenType_) private { ERC20BridgeInfo memory bridgeInfo = bridgeMap[token_][destChainID_]; require(!_isContract(msg.sender), "IS_CONTRACT"); _onlyEnabledBridge(bridgeInfo); uint256 fee = 0; if (bridgeInfo.feeType != FEE_TYPE.NO_FEE) { fee = _computeFeeByFeeType(bridgeInfo.feeType, amount_, bridgeInfo.fee); } uint256 totalAmount = amount_ - fee; require( uint256(bridgeInfo.allowedDestTokenTypes) & uint256(destTokenType_) > 0 && uint256(destTokenType_) < 3, "DEST_TYPE_NOT_ALLOWED" ); if (token_ == NATIVE_REPRESENTATION) { _transferNative(bridgeInfo.receiver, totalAmount); if (fee > 0) { _transferNative(bridgeInfo.feeReceiver, fee); } } else { if (bridgeInfo.strategy == TOKEN_STRATEGY.LOCK) { IERC20(token_).safeTransferFrom(msg.sender, bridgeInfo.receiver, totalAmount); } else { IBurnable(address(token_)).burnFrom(msg.sender, totalAmount); } if (fee > 0) { IERC20(token_).safeTransferFrom(msg.sender, bridgeInfo.feeReceiver, fee); } } emit Bridge(bridgeInfo.token, msg.sender, totalAmount, destChainID_, destTokenType_); } function _transferNative(address to_, uint256 val_) private { bool success; (success, ) = to_.call{ value: val_ }(""); require(success, "UNSUCCESSFUL_TRANSFER"); } function _isContract(address account_) private view returns (bool) { uint32 size; assembly { size := extcodesize(account_) } return size > 0; } function _onlyExistedBridge(ERC20BridgeInfo memory bridgeInfo_) private pure { require(bridgeInfo_.token != address(0), "NOT_EXISTED"); } function _onlyEnabledBridge(ERC20BridgeInfo memory bridgeInfo_) private pure { require(bridgeInfo_.enabled, "NOT_ENABLED"); } function _computeFeeByFeeType(FEE_TYPE feeType_, uint256 amount_, uint256 fee_) private pure returns (uint256) { if (feeType_ == FEE_TYPE.FIX) { return fee_; } else if (feeType_ == FEE_TYPE.PERCENTAGE) { return (amount_ * fee_) / 10000; } return 0; } function _composeAllowedDestTokenTypesAndChainID( DEST_TOKEN_TYPE allowedDestTokenTypes_, uint64 destChainID_ ) private pure returns (uint256) { return (uint256(allowedDestTokenTypes_) << 248) + uint256(destChainID_); } function _getAllowedDestTokenTypes(uint256 val_) private pure returns (DEST_TOKEN_TYPE) { return DEST_TOKEN_TYPE(val_ >> 248); } function _getChainID(uint256 val_) private pure returns (uint64) { return uint64(val_); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"committee_","type":"address"},{"components":[{"internalType":"bool","name":"enabled","type":"bool"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint64","name":"chainID","type":"uint64"},{"internalType":"enum BridgeERC20V3.DEST_TOKEN_TYPE","name":"allowedDestTokenTypes","type":"uint8"},{"internalType":"address","name":"feeReceiver","type":"address"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"enum BridgeERC20V3.FEE_TYPE","name":"feeType","type":"uint8"},{"internalType":"enum BridgeERC20V3.TOKEN_STRATEGY","name":"strategy","type":"uint8"},{"internalType":"address","name":"receiver","type":"address"}],"internalType":"struct BridgeERC20V3.ERC20BridgeInfo[]","name":"edges_","type":"tuple[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"destChainID","type":"uint256"},{"indexed":false,"internalType":"enum BridgeERC20V3.DEST_TOKEN_TYPE","name":"destTokenType","type":"uint8"}],"name":"Bridge","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"destChainID","type":"uint256"},{"indexed":true,"internalType":"enum BridgeERC20V3.DEST_TOKEN_TYPE","name":"allowedDestTokenTypes","type":"uint8"}],"name":"DeleteBridgeInfo","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"destChainID","type":"uint256"},{"indexed":true,"internalType":"enum BridgeERC20V3.DEST_TOKEN_TYPE","name":"allowedDestTokenTypes","type":"uint8"}],"name":"SetBridgeInfo","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"NATIVE_REPRESENTATION","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"},{"internalType":"uint64","name":"destChainID_","type":"uint64"},{"internalType":"enum BridgeERC20V3.DEST_TOKEN_TYPE","name":"destTokenType_","type":"uint8"}],"name":"bridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"destChainID_","type":"uint64"},{"internalType":"enum BridgeERC20V3.DEST_TOKEN_TYPE","name":"destTokenType_","type":"uint8"}],"name":"bridge","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"bridgeMap","outputs":[{"internalType":"bool","name":"enabled","type":"bool"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint64","name":"chainID","type":"uint64"},{"internalType":"enum BridgeERC20V3.DEST_TOKEN_TYPE","name":"allowedDestTokenTypes","type":"uint8"},{"internalType":"address","name":"feeReceiver","type":"address"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"enum BridgeERC20V3.FEE_TYPE","name":"feeType","type":"uint8"},{"internalType":"enum BridgeERC20V3.TOKEN_STRATEGY","name":"strategy","type":"uint8"},{"internalType":"address","name":"receiver","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"committee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token_","type":"address"},{"internalType":"uint64","name":"chainID_","type":"uint64"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"computeFeeByFeeType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token_","type":"address"},{"internalType":"uint64","name":"chainID_","type":"uint64"}],"name":"deleteBridgeInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token_","type":"address"}],"name":"getDestChainIDsAndAllowedTokenTypes","outputs":[{"components":[{"internalType":"uint248","name":"chainID","type":"uint248"},{"internalType":"enum BridgeERC20V3.DEST_TOKEN_TYPE","name":"allowedDestTokenTypes","type":"uint8"}],"internalType":"struct BridgeERC20V3.ChainIDAndAllowedDestTokenTypes[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct OptimizedCommittee.CallData[]","name":"callData","type":"tuple[]"}],"name":"multiCall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bool","name":"enabled","type":"bool"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint64","name":"chainID","type":"uint64"},{"internalType":"enum BridgeERC20V3.DEST_TOKEN_TYPE","name":"allowedDestTokenTypes","type":"uint8"},{"internalType":"address","name":"feeReceiver","type":"address"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"enum BridgeERC20V3.FEE_TYPE","name":"feeType","type":"uint8"},{"internalType":"enum BridgeERC20V3.TOKEN_STRATEGY","name":"strategy","type":"uint8"},{"internalType":"address","name":"receiver","type":"address"}],"internalType":"struct BridgeERC20V3.ERC20BridgeInfo","name":"bridgeInfo_","type":"tuple"}],"name":"setBridgeInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_committee","type":"address"}],"name":"setCommittee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162003373380380620033738339810160408190526200003491620008f5565b60008054600180556001600160a81b0319166001600160a01b0384161781555b8151811015620000a0576200008b82828151811062000077576200007762000a73565b6020026020010151620000a960201b60201c565b80620000978162000a9f565b91505062000054565b50505062000b13565b60208101516001600160a01b0316620000fb5760405162461bcd60e51b815260206004820152600f60248201526e494e56414c49445f4144445245535360881b60448201526064015b60405180910390fd5b6001600160a01b03801681602001516001600160a01b031603620001835760008160e00151600181111562000134576200013462000abb565b14620001835760405162461bcd60e51b815260206004820152601e60248201527f4252494447455f4e41544956455f494e56414c49445f535452415445475900006044820152606401620000f2565b6020808201516001600160a01b039081166000908152600383526040808220818601516001600160401b0316835290935291909120805490916101009091041615620002fe576040805161012081018252825460ff808216151583526001600160a01b0361010083041660208401526001600160401b03600160a81b83041693830193909352620002fe9284916060840191600160e81b90910416600381111562000232576200023262000abb565b600381111562000246576200024662000abb565b815260018201546001600160a01b031660208201526002808301546040830152600383015460609092019160ff169081111562000287576200028762000abb565b60028111156200029b576200029b62000abb565b81526020016003820160019054906101000a900460ff166001811115620002c657620002c662000abb565b6001811115620002da57620002da62000abb565b8152600391909101546201000090046001600160a01b031660209091015262000545565b602080830180516001600160a01b0390811660009081526003808552604080832081890180516001600160401b0390811686529190975292208751815495519651909316600160a81b02600160a81b600160e81b03199690941661010002610100600160a81b0319931515939093166001600160a81b0319909516949094179190911793841682178355606086015186949092849260ff60e81b19909116600160a81b600160f01b03199092169190911790600160e81b908490811115620003ca57620003ca62000abb565b021790555060808201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a0820151816002015560c08201518160030160006101000a81548160ff0219169083600281111562000433576200043362000abb565b021790555060e082015160038201805461ff00191661010083600181111562000460576200046062000abb565b02179055506101009190910151600390910180546001600160a01b03909216620100000262010000600160b01b031990921691909117905560608201516040830151620004df91620004b2916200065f565b6020808501516001600160a01b0316600090815260028252604090209190620009a162000698821b17901c565b5081606001516003811115620004f957620004f962000abb565b82604001516001600160401b031683602001516001600160a01b03167f9dee709f68d1cc837483454e3aac7dc5094955fd5fb7b415751bfe42b0c4569260405160405180910390a45050565b806060015160038111156200055e576200055e62000abb565b81604001516001600160401b031682602001516001600160a01b03167f8df36136a8be7122756e08ec7a06503306139bf39b95a04b798a1901a69fc06760405160405180910390a4620005f1620005c4826060015183604001516200065f60201b60201c565b6020808401516001600160a01b0316600090815260028252604090209190620009b6620006a6821b17901c565b506020808201516001600160a01b0316600090815260038083526040808320948101516001600160401b031683529390925291822080546001600160f01b03191681556001810180546001600160a01b031916905560028101929092550180546001600160b01b0319169055565b6000816001600160401b031660f884600381111562000682576200068262000abb565b6200068f92911b62000ad1565b90505b92915050565b60006200068f8383620006b4565b60006200068f838362000706565b6000818152600183016020526040812054620006fd5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000692565b50600062000692565b60008181526001830160205260408120548015620007ff5760006200072d60018362000ae7565b8554909150600090620007439060019062000ae7565b9050818114620007af57600086600001828154811062000767576200076762000a73565b90600052602060002001549050808760000184815481106200078d576200078d62000a73565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080620007c357620007c362000afd565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505062000692565b600091505062000692565b80516001600160a01b03811681146200082257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60405161012081016001600160401b038111828210171562000863576200086362000827565b60405290565b604051601f8201601f191681016001600160401b038111828210171562000894576200089462000827565b604052919050565b805180151581146200082257600080fd5b80516001600160401b03811681146200082257600080fd5b8051600481106200082257600080fd5b8051600381106200082257600080fd5b8051600281106200082257600080fd5b60008060408084860312156200090a57600080fd5b62000915846200080a565b602085810151919450906001600160401b03808211156200093557600080fd5b818701915087601f8301126200094a57600080fd5b8151818111156200095f576200095f62000827565b6200096f848260051b0162000869565b818152848101925061012091820284018501918a8311156200099057600080fd5b938501935b8285101562000a625780858c031215620009af5760008081fd5b620009b96200083d565b620009c4866200089c565b8152620009d38787016200080a565b87820152620009e4888701620008ad565b888201526060620009f7818801620008c5565b90820152608062000a0a8782016200080a565b9082015260a0868101519082015260c062000a27818801620008d5565b9082015260e062000a3a878201620008e5565b9082015261010062000a4e8782016200080a565b908201528452938401939285019262000995565b508096505050505050509250929050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820162000ab45762000ab462000a89565b5060010190565b634e487b7160e01b600052602160045260246000fd5b8082018082111562000692576200069262000a89565b8181038181111562000692576200069262000a89565b634e487b7160e01b600052603160045260246000fd5b6128508062000b236000396000f3fe6080604052600436106100dd5760003560e01c806396aba99f1161007f578063bdedd70511610059578063bdedd70514610276578063d6b898ae14610296578063d864e740146102a9578063f95c8b83146102d657600080fd5b806396aba99f14610209578063a61a7c6e14610229578063bddae40e1461025657600080fd5b80635c975abb116100bb5780635c975abb146101395780636a379f0a146101795780637c51bb9e146101a75780638456cb59146101f457600080fd5b8063185a7a1f146100e2578063387e2ce4146101045780633f4ba83a14610124575b600080fd5b3480156100ee57600080fd5b506101026100fd366004612114565b6103b8565b005b34801561011057600080fd5b5061010261011f366004612156565b61056a565b34801561013057600080fd5b50610102610595565b34801561014557600080fd5b5060005474010000000000000000000000000000000000000000900460ff1660405190151581526020015b60405180910390f35b34801561018557600080fd5b506101996101943660046121a3565b6105a7565b604051908152602001610170565b3480156101b357600080fd5b506101cf73ffffffffffffffffffffffffffffffffffffffff81565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610170565b34801561020057600080fd5b50610102610604565b34801561021557600080fd5b50610102610224366004612296565b610614565b34801561023557600080fd5b50610249610244366004612345565b610628565b60405161017091906123a3565b34801561026257600080fd5b50610102610271366004612345565b6107b3565b34801561028257600080fd5b5061010261029136600461241c565b610802565b6101026102a4366004612491565b610964565b3480156102b557600080fd5b506000546101cf9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156102e257600080fd5b506103a36102f1366004612114565b60036020818152600093845260408085209091529183529120805460018201546002830154929093015460ff8083169473ffffffffffffffffffffffffffffffffffffffff61010080860482169667ffffffffffffffff7501000000000000000000000000000000000000000000880416967d01000000000000000000000000000000000000000000000000000000000090048516959383169490938082169392810490911691620100009091041689565b604051610170999897969594939291906124bb565b6103c06109c2565b73ffffffffffffffffffffffffffffffffffffffff808316600090815260036020818152604080842067ffffffffffffffff8088168652908352818520825161012081018452815460ff8082161515835261010082049099169582019590955275010000000000000000000000000000000000000000008504909216928201929092529394909260608501927d01000000000000000000000000000000000000000000000000000000000090049091169081111561048057610480612360565b600381111561049157610491612360565b8152600182015473ffffffffffffffffffffffffffffffffffffffff1660208201526002808301546040830152600383015460609092019160ff16908111156104dc576104dc612360565b60028111156104ed576104ed612360565b81526020016003820160019054906101000a900460ff16600181111561051557610515612360565b600181111561052657610526612360565b81526003919091015462010000900473ffffffffffffffffffffffffffffffffffffffff16602090910152905061055c81610a43565b61056581610ac4565b505050565b610572610c39565b61057a610cbe565b61058684848484610d31565b61058f60018055565b50505050565b61059d6109c2565b6105a5611213565b565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260036020818152604080842067ffffffffffffffff8716855290915282209081015460028201546105f99160ff16908590611290565b9150505b9392505050565b61060c6109c2565b6105a56112f3565b61061c6109c2565b61062581611362565b50565b73ffffffffffffffffffffffffffffffffffffffff811660009081526002602052604081206060919061065a906119a5565b905060008167ffffffffffffffff811115610677576106776121df565b6040519080825280602002602001820160405280156106bc57816020015b60408051808201909152600080825260208201528152602001906001900390816106955790505b5090506000805b838110156107a95773ffffffffffffffffffffffffffffffffffffffff861660009081526002602052604090206106fa90826119af565b91508167ffffffffffffffff168382815181106107195761071961256b565b60209081029190910101517effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9091169052610752826119bb565b8382815181106107645761076461256b565b602002602001015160200190600381111561078157610781612360565b9081600381111561079457610794612360565b905250806107a1816125c9565b9150506106c3565b5090949350505050565b6107bb6109c2565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b61080a6109c2565b60005b818110156105655760008383838181106108295761082961256b565b905060200281019061083b9190612601565b610849906020810190612345565b73ffffffffffffffffffffffffffffffffffffffff168484848181106108715761087161256b565b90506020028101906108839190612601565b61089190602081019061263f565b60405161089f9291906126ab565b6000604051808303816000865af19150503d80600081146108dc576040519150601f19603f3d011682016040523d82523d6000602084013e6108e1565b606091505b5050905080610951576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5472616e73616374696f6e2063616c6c206661696c656400000000000000000060448201526064015b60405180910390fd5b508061095c816125c9565b91505061080d565b61096c610c39565b610974610cbe565b61099473ffffffffffffffffffffffffffffffffffffffff348484610d31565b61099d60018055565b5050565b60006109ad83836119d3565b90505b92915050565b60006109ad8383611a22565b60005473ffffffffffffffffffffffffffffffffffffffff1633146105a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f464f5242494444454e00000000000000000000000000000000000000000000006044820152606401610948565b602081015173ffffffffffffffffffffffffffffffffffffffff16610625576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4e4f545f455849535445440000000000000000000000000000000000000000006044820152606401610948565b80606001516003811115610ada57610ada612360565b816040015167ffffffffffffffff16826020015173ffffffffffffffffffffffffffffffffffffffff167f8df36136a8be7122756e08ec7a06503306139bf39b95a04b798a1901a69fc06760405160405180910390a4610b75610b4582606001518360400151611b15565b60208084015173ffffffffffffffffffffffffffffffffffffffff166000908152600290915260409020906109b6565b5060208082015173ffffffffffffffffffffffffffffffffffffffff166000908152600380835260408083209481015167ffffffffffffffff1683529390925291822080547fffff0000000000000000000000000000000000000000000000000000000000001681556001810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905560028101929092550180547fffffffffffffffffffff00000000000000000000000000000000000000000000169055565b60005474010000000000000000000000000000000000000000900460ff16156105a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610948565b600260015403610d2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610948565b6002600155565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260036020818152604080842067ffffffffffffffff8089168652908352818520825161012081018452815460ff8082161515835261010082049099169582019590955275010000000000000000000000000000000000000000008504909216928201929092529394909260608501927d010000000000000000000000000000000000000000000000000000000000900490911690811115610df157610df1612360565b6003811115610e0257610e02612360565b8152600182015473ffffffffffffffffffffffffffffffffffffffff1660208201526002808301546040830152600383015460609092019160ff1690811115610e4d57610e4d612360565b6002811115610e5e57610e5e612360565b81526020016003820160019054906101000a900460ff166001811115610e8657610e86612360565b6001811115610e9757610e97612360565b81526003919091015462010000900473ffffffffffffffffffffffffffffffffffffffff166020909101529050333b63ffffffff1615610f33576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f49535f434f4e54524143540000000000000000000000000000000000000000006044820152606401610948565b610f3c81611b41565b6000808260c001516002811115610f5557610f55612360565b14610f7057610f6d8260c00151868460a00151611290565b90505b6000610f7c82876126bb565b90506000846003811115610f9257610f92612360565b84606001516003811115610fa857610fa8612360565b16118015610fc757506003846003811115610fc557610fc5612360565b105b61102d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f444553545f545950455f4e4f545f414c4c4f57454400000000000000000000006044820152606401610948565b7fffffffffffffffffffffffff000000000000000000000000000000000000000173ffffffffffffffffffffffffffffffffffffffff8816016110925761107983610100015182611ba9565b811561108d5761108d836080015183611ba9565b611194565b60008360e0015160018111156110aa576110aa612360565b036110de576101008301516110d99073ffffffffffffffffffffffffffffffffffffffff891690339084611c75565b611165565b6040517f79cc67900000000000000000000000000000000000000000000000000000000081523360048201526024810182905273ffffffffffffffffffffffffffffffffffffffff8816906379cc679090604401600060405180830381600087803b15801561114c57600080fd5b505af1158015611160573d6000803e3d6000fd5b505050505b81156111945760808301516111949073ffffffffffffffffffffffffffffffffffffffff891690339085611c75565b8467ffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16846020015173ffffffffffffffffffffffffffffffffffffffff167f9b3c015169424641c0bda2f9b9326b3fa148a6bd4dde6ee2e3003a9e768a113684886040516112029291906126ce565b60405180910390a450505050505050565b61121b611d0a565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b600060018460028111156112a6576112a6612360565b036112b25750806105fd565b60028460028111156112c6576112c6612360565b036112e9576127106112d883856126e2565b6112e291906126f9565b90506105fd565b5060009392505050565b6112fb610c39565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586112663390565b602081015173ffffffffffffffffffffffffffffffffffffffff166113e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f494e56414c49445f4144445245535300000000000000000000000000000000006044820152606401610948565b73ffffffffffffffffffffffffffffffffffffffff8016816020015173ffffffffffffffffffffffffffffffffffffffff16036114995760008160e00151600181111561143257611432612360565b14611499576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4252494447455f4e41544956455f494e56414c49445f535452415445475900006044820152606401610948565b60208082015173ffffffffffffffffffffffffffffffffffffffff90811660009081526003835260408082208186015167ffffffffffffffff16835290935291909120805490916101009091041615611661576040805161012081018252825460ff8082161515835273ffffffffffffffffffffffffffffffffffffffff610100830416602084015267ffffffffffffffff75010000000000000000000000000000000000000000008304169383019390935261166192849160608401917d01000000000000000000000000000000000000000000000000000000000090910416600381111561158b5761158b612360565b600381111561159c5761159c612360565b8152600182015473ffffffffffffffffffffffffffffffffffffffff1660208201526002808301546040830152600383015460609092019160ff16908111156115e7576115e7612360565b60028111156115f8576115f8612360565b81526020016003820160019054906101000a900460ff16600181111561162057611620612360565b600181111561163157611631612360565b81526003919091015462010000900473ffffffffffffffffffffffffffffffffffffffff16602090910152610ac4565b6020808301805173ffffffffffffffffffffffffffffffffffffffff908116600090815260038085526040808320818901805167ffffffffffffffff908116865291909752922087518154955196519093167501000000000000000000000000000000000000000000027fffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff96909416610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff931515939093167fffffffffffffffffffffff00000000000000000000000000000000000000000090951694909417919091179384168217835560608601518694909284927fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9091167fffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff90921691909117907d0100000000000000000000000000000000000000000000000000000000009084908111156117d8576117d8612360565b021790555060808201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a0820151816002015560c08201518160030160006101000a81548160ff0219169083600281111561185857611858612360565b021790555060e08201516003820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010083600181111561189f5761189f612360565b02179055506101008201518160030160026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505061193461190483606001518460400151611b15565b60208085015173ffffffffffffffffffffffffffffffffffffffff166000908152600290915260409020906109a1565b508160600151600381111561194b5761194b612360565b826040015167ffffffffffffffff16836020015173ffffffffffffffffffffffffffffffffffffffff167f9dee709f68d1cc837483454e3aac7dc5094955fd5fb7b415751bfe42b0c4569260405160405180910390a45050565b60006109b0825490565b60006109ad8383611d8e565b600060f882901c60038111156109b0576109b0612360565b6000818152600183016020526040812054611a1a575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556109b0565b5060006109b0565b60008181526001830160205260408120548015611b0b576000611a466001836126bb565b8554909150600090611a5a906001906126bb565b9050818114611abf576000866000018281548110611a7a57611a7a61256b565b9060005260206000200154905080876000018481548110611a9d57611a9d61256b565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611ad057611ad0612734565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506109b0565b60009150506109b0565b60008167ffffffffffffffff1660f8846003811115611b3657611b36612360565b6109ad92911b612763565b8051610625576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4e4f545f454e41424c45440000000000000000000000000000000000000000006044820152606401610948565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611c03576040519150601f19603f3d011682016040523d82523d6000602084013e611c08565b606091505b50508091505080610565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f554e5355434345535346554c5f5452414e5346455200000000000000000000006044820152606401610948565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905261058f908590611db8565b60005474010000000000000000000000000000000000000000900460ff166105a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610948565b6000826000018281548110611da557611da561256b565b9060005260206000200154905092915050565b6000611e1a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611ec49092919063ffffffff16565b8051909150156105655780806020019051810190611e389190612776565b610565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610948565b6060611ed38484600085611edb565b949350505050565b606082471015611f6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610948565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611f9691906127b7565b60006040518083038185875af1925050503d8060008114611fd3576040519150601f19603f3d011682016040523d82523d6000602084013e611fd8565b606091505b5091509150611fe987838387611ff4565b979650505050505050565b6060831561208a5782516000036120835773ffffffffffffffffffffffffffffffffffffffff85163b612083576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610948565b5081611ed3565b611ed3838381511561209f5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094891906127c9565b803573ffffffffffffffffffffffffffffffffffffffff811681146120f757600080fd5b919050565b803567ffffffffffffffff811681146120f757600080fd5b6000806040838503121561212757600080fd5b612130836120d3565b915061213e602084016120fc565b90509250929050565b8035600481106120f757600080fd5b6000806000806080858703121561216c57600080fd5b612175856120d3565b93506020850135925061218a604086016120fc565b915061219860608601612147565b905092959194509250565b6000806000606084860312156121b857600080fd5b6121c1846120d3565b92506121cf602085016120fc565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610120810167ffffffffffffffff81118282101715612259577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405290565b801515811461062557600080fd5b80356120f78161225f565b8035600381106120f757600080fd5b8035600281106120f757600080fd5b600061012082840312156122a957600080fd5b6122b161220e565b6122ba8361226d565b81526122c8602084016120d3565b60208201526122d9604084016120fc565b60408201526122ea60608401612147565b60608201526122fb608084016120d3565b608082015260a083013560a082015261231660c08401612278565b60c082015261232760e08401612287565b60e082015261010061233a8185016120d3565b908201529392505050565b60006020828403121561235757600080fd5b6109ad826120d3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004811061239f5761239f612360565b9052565b602080825282518282018190526000919060409081850190868401855b8281101561240f57815180517effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1685528601516123fe8786018261238f565b5092840192908501906001016123c0565b5091979650505050505050565b6000806020838503121561242f57600080fd5b823567ffffffffffffffff8082111561244757600080fd5b818501915085601f83011261245b57600080fd5b81358181111561246a57600080fd5b8660208260051b850101111561247f57600080fd5b60209290920196919550909350505050565b600080604083850312156124a457600080fd5b6124ad836120fc565b915061213e60208401612147565b891515815273ffffffffffffffffffffffffffffffffffffffff898116602083015267ffffffffffffffff89166040830152610120820190612500606084018a61238f565b8716608083015260a082018690526003851061251e5761251e612360565b8460c08301526002841061253457612534612360565b8360e083015261255d61010083018473ffffffffffffffffffffffffffffffffffffffff169052565b9a9950505050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036125fa576125fa61259a565b5060010190565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261263557600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261267457600080fd5b83018035915067ffffffffffffffff82111561268f57600080fd5b6020019150368190038213156126a457600080fd5b9250929050565b8183823760009101908152919050565b818103818111156109b0576109b061259a565b828152604081016105fd602083018461238f565b80820281158282048414176109b0576109b061259a565b60008261272f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b808201808211156109b0576109b061259a565b60006020828403121561278857600080fd5b81516105fd8161225f565b60005b838110156127ae578181015183820152602001612796565b50506000910152565b60008251612635818460208701612793565b60208152600082518060208401526127e8816040850160208701612793565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fea26469706673582212203ebd56b27642553d79ad5d23eb5c7f55cd784763c5812e94fb8531e7f04cf1c764736f6c63430008110033000000000000000000000000b94968dc900588ff723ec633f8f460561f85bcde0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000649cef6d11ed6f88535462e147304d3fe5ae14d000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e89c18d9b6d88ec01ccf7974871520b83f14d3b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d920d9e80875dc86dfc0c913635766e0967718cd0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e89c18d9b6d88ec01ccf7974871520b83f14d3b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d920d9e80875dc86dfc0c913635766e0967718cd0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e89c18d9b6d88ec01ccf7974871520b83f14d3b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d920d9e80875dc86dfc0c913635766e0967718cd0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000940bdcb99a0ee5fb008a606778ae87ed9789f257000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e89c18d9b6d88ec01ccf7974871520b83f14d3b0000000000000000000000000000000000000000000000015af1d78b58c4000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d920d9e80875dc86dfc0c913635766e0967718cd
Deployed Bytecode
0x6080604052600436106100dd5760003560e01c806396aba99f1161007f578063bdedd70511610059578063bdedd70514610276578063d6b898ae14610296578063d864e740146102a9578063f95c8b83146102d657600080fd5b806396aba99f14610209578063a61a7c6e14610229578063bddae40e1461025657600080fd5b80635c975abb116100bb5780635c975abb146101395780636a379f0a146101795780637c51bb9e146101a75780638456cb59146101f457600080fd5b8063185a7a1f146100e2578063387e2ce4146101045780633f4ba83a14610124575b600080fd5b3480156100ee57600080fd5b506101026100fd366004612114565b6103b8565b005b34801561011057600080fd5b5061010261011f366004612156565b61056a565b34801561013057600080fd5b50610102610595565b34801561014557600080fd5b5060005474010000000000000000000000000000000000000000900460ff1660405190151581526020015b60405180910390f35b34801561018557600080fd5b506101996101943660046121a3565b6105a7565b604051908152602001610170565b3480156101b357600080fd5b506101cf73ffffffffffffffffffffffffffffffffffffffff81565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610170565b34801561020057600080fd5b50610102610604565b34801561021557600080fd5b50610102610224366004612296565b610614565b34801561023557600080fd5b50610249610244366004612345565b610628565b60405161017091906123a3565b34801561026257600080fd5b50610102610271366004612345565b6107b3565b34801561028257600080fd5b5061010261029136600461241c565b610802565b6101026102a4366004612491565b610964565b3480156102b557600080fd5b506000546101cf9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156102e257600080fd5b506103a36102f1366004612114565b60036020818152600093845260408085209091529183529120805460018201546002830154929093015460ff8083169473ffffffffffffffffffffffffffffffffffffffff61010080860482169667ffffffffffffffff7501000000000000000000000000000000000000000000880416967d01000000000000000000000000000000000000000000000000000000000090048516959383169490938082169392810490911691620100009091041689565b604051610170999897969594939291906124bb565b6103c06109c2565b73ffffffffffffffffffffffffffffffffffffffff808316600090815260036020818152604080842067ffffffffffffffff8088168652908352818520825161012081018452815460ff8082161515835261010082049099169582019590955275010000000000000000000000000000000000000000008504909216928201929092529394909260608501927d01000000000000000000000000000000000000000000000000000000000090049091169081111561048057610480612360565b600381111561049157610491612360565b8152600182015473ffffffffffffffffffffffffffffffffffffffff1660208201526002808301546040830152600383015460609092019160ff16908111156104dc576104dc612360565b60028111156104ed576104ed612360565b81526020016003820160019054906101000a900460ff16600181111561051557610515612360565b600181111561052657610526612360565b81526003919091015462010000900473ffffffffffffffffffffffffffffffffffffffff16602090910152905061055c81610a43565b61056581610ac4565b505050565b610572610c39565b61057a610cbe565b61058684848484610d31565b61058f60018055565b50505050565b61059d6109c2565b6105a5611213565b565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260036020818152604080842067ffffffffffffffff8716855290915282209081015460028201546105f99160ff16908590611290565b9150505b9392505050565b61060c6109c2565b6105a56112f3565b61061c6109c2565b61062581611362565b50565b73ffffffffffffffffffffffffffffffffffffffff811660009081526002602052604081206060919061065a906119a5565b905060008167ffffffffffffffff811115610677576106776121df565b6040519080825280602002602001820160405280156106bc57816020015b60408051808201909152600080825260208201528152602001906001900390816106955790505b5090506000805b838110156107a95773ffffffffffffffffffffffffffffffffffffffff861660009081526002602052604090206106fa90826119af565b91508167ffffffffffffffff168382815181106107195761071961256b565b60209081029190910101517effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9091169052610752826119bb565b8382815181106107645761076461256b565b602002602001015160200190600381111561078157610781612360565b9081600381111561079457610794612360565b905250806107a1816125c9565b9150506106c3565b5090949350505050565b6107bb6109c2565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b61080a6109c2565b60005b818110156105655760008383838181106108295761082961256b565b905060200281019061083b9190612601565b610849906020810190612345565b73ffffffffffffffffffffffffffffffffffffffff168484848181106108715761087161256b565b90506020028101906108839190612601565b61089190602081019061263f565b60405161089f9291906126ab565b6000604051808303816000865af19150503d80600081146108dc576040519150601f19603f3d011682016040523d82523d6000602084013e6108e1565b606091505b5050905080610951576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5472616e73616374696f6e2063616c6c206661696c656400000000000000000060448201526064015b60405180910390fd5b508061095c816125c9565b91505061080d565b61096c610c39565b610974610cbe565b61099473ffffffffffffffffffffffffffffffffffffffff348484610d31565b61099d60018055565b5050565b60006109ad83836119d3565b90505b92915050565b60006109ad8383611a22565b60005473ffffffffffffffffffffffffffffffffffffffff1633146105a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f464f5242494444454e00000000000000000000000000000000000000000000006044820152606401610948565b602081015173ffffffffffffffffffffffffffffffffffffffff16610625576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4e4f545f455849535445440000000000000000000000000000000000000000006044820152606401610948565b80606001516003811115610ada57610ada612360565b816040015167ffffffffffffffff16826020015173ffffffffffffffffffffffffffffffffffffffff167f8df36136a8be7122756e08ec7a06503306139bf39b95a04b798a1901a69fc06760405160405180910390a4610b75610b4582606001518360400151611b15565b60208084015173ffffffffffffffffffffffffffffffffffffffff166000908152600290915260409020906109b6565b5060208082015173ffffffffffffffffffffffffffffffffffffffff166000908152600380835260408083209481015167ffffffffffffffff1683529390925291822080547fffff0000000000000000000000000000000000000000000000000000000000001681556001810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905560028101929092550180547fffffffffffffffffffff00000000000000000000000000000000000000000000169055565b60005474010000000000000000000000000000000000000000900460ff16156105a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610948565b600260015403610d2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610948565b6002600155565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260036020818152604080842067ffffffffffffffff8089168652908352818520825161012081018452815460ff8082161515835261010082049099169582019590955275010000000000000000000000000000000000000000008504909216928201929092529394909260608501927d010000000000000000000000000000000000000000000000000000000000900490911690811115610df157610df1612360565b6003811115610e0257610e02612360565b8152600182015473ffffffffffffffffffffffffffffffffffffffff1660208201526002808301546040830152600383015460609092019160ff1690811115610e4d57610e4d612360565b6002811115610e5e57610e5e612360565b81526020016003820160019054906101000a900460ff166001811115610e8657610e86612360565b6001811115610e9757610e97612360565b81526003919091015462010000900473ffffffffffffffffffffffffffffffffffffffff166020909101529050333b63ffffffff1615610f33576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f49535f434f4e54524143540000000000000000000000000000000000000000006044820152606401610948565b610f3c81611b41565b6000808260c001516002811115610f5557610f55612360565b14610f7057610f6d8260c00151868460a00151611290565b90505b6000610f7c82876126bb565b90506000846003811115610f9257610f92612360565b84606001516003811115610fa857610fa8612360565b16118015610fc757506003846003811115610fc557610fc5612360565b105b61102d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f444553545f545950455f4e4f545f414c4c4f57454400000000000000000000006044820152606401610948565b7fffffffffffffffffffffffff000000000000000000000000000000000000000173ffffffffffffffffffffffffffffffffffffffff8816016110925761107983610100015182611ba9565b811561108d5761108d836080015183611ba9565b611194565b60008360e0015160018111156110aa576110aa612360565b036110de576101008301516110d99073ffffffffffffffffffffffffffffffffffffffff891690339084611c75565b611165565b6040517f79cc67900000000000000000000000000000000000000000000000000000000081523360048201526024810182905273ffffffffffffffffffffffffffffffffffffffff8816906379cc679090604401600060405180830381600087803b15801561114c57600080fd5b505af1158015611160573d6000803e3d6000fd5b505050505b81156111945760808301516111949073ffffffffffffffffffffffffffffffffffffffff891690339085611c75565b8467ffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16846020015173ffffffffffffffffffffffffffffffffffffffff167f9b3c015169424641c0bda2f9b9326b3fa148a6bd4dde6ee2e3003a9e768a113684886040516112029291906126ce565b60405180910390a450505050505050565b61121b611d0a565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b600060018460028111156112a6576112a6612360565b036112b25750806105fd565b60028460028111156112c6576112c6612360565b036112e9576127106112d883856126e2565b6112e291906126f9565b90506105fd565b5060009392505050565b6112fb610c39565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586112663390565b602081015173ffffffffffffffffffffffffffffffffffffffff166113e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f494e56414c49445f4144445245535300000000000000000000000000000000006044820152606401610948565b73ffffffffffffffffffffffffffffffffffffffff8016816020015173ffffffffffffffffffffffffffffffffffffffff16036114995760008160e00151600181111561143257611432612360565b14611499576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4252494447455f4e41544956455f494e56414c49445f535452415445475900006044820152606401610948565b60208082015173ffffffffffffffffffffffffffffffffffffffff90811660009081526003835260408082208186015167ffffffffffffffff16835290935291909120805490916101009091041615611661576040805161012081018252825460ff8082161515835273ffffffffffffffffffffffffffffffffffffffff610100830416602084015267ffffffffffffffff75010000000000000000000000000000000000000000008304169383019390935261166192849160608401917d01000000000000000000000000000000000000000000000000000000000090910416600381111561158b5761158b612360565b600381111561159c5761159c612360565b8152600182015473ffffffffffffffffffffffffffffffffffffffff1660208201526002808301546040830152600383015460609092019160ff16908111156115e7576115e7612360565b60028111156115f8576115f8612360565b81526020016003820160019054906101000a900460ff16600181111561162057611620612360565b600181111561163157611631612360565b81526003919091015462010000900473ffffffffffffffffffffffffffffffffffffffff16602090910152610ac4565b6020808301805173ffffffffffffffffffffffffffffffffffffffff908116600090815260038085526040808320818901805167ffffffffffffffff908116865291909752922087518154955196519093167501000000000000000000000000000000000000000000027fffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff96909416610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff931515939093167fffffffffffffffffffffff00000000000000000000000000000000000000000090951694909417919091179384168217835560608601518694909284927fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9091167fffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff90921691909117907d0100000000000000000000000000000000000000000000000000000000009084908111156117d8576117d8612360565b021790555060808201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a0820151816002015560c08201518160030160006101000a81548160ff0219169083600281111561185857611858612360565b021790555060e08201516003820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010083600181111561189f5761189f612360565b02179055506101008201518160030160026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505061193461190483606001518460400151611b15565b60208085015173ffffffffffffffffffffffffffffffffffffffff166000908152600290915260409020906109a1565b508160600151600381111561194b5761194b612360565b826040015167ffffffffffffffff16836020015173ffffffffffffffffffffffffffffffffffffffff167f9dee709f68d1cc837483454e3aac7dc5094955fd5fb7b415751bfe42b0c4569260405160405180910390a45050565b60006109b0825490565b60006109ad8383611d8e565b600060f882901c60038111156109b0576109b0612360565b6000818152600183016020526040812054611a1a575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556109b0565b5060006109b0565b60008181526001830160205260408120548015611b0b576000611a466001836126bb565b8554909150600090611a5a906001906126bb565b9050818114611abf576000866000018281548110611a7a57611a7a61256b565b9060005260206000200154905080876000018481548110611a9d57611a9d61256b565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611ad057611ad0612734565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506109b0565b60009150506109b0565b60008167ffffffffffffffff1660f8846003811115611b3657611b36612360565b6109ad92911b612763565b8051610625576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4e4f545f454e41424c45440000000000000000000000000000000000000000006044820152606401610948565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611c03576040519150601f19603f3d011682016040523d82523d6000602084013e611c08565b606091505b50508091505080610565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f554e5355434345535346554c5f5452414e5346455200000000000000000000006044820152606401610948565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905261058f908590611db8565b60005474010000000000000000000000000000000000000000900460ff166105a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610948565b6000826000018281548110611da557611da561256b565b9060005260206000200154905092915050565b6000611e1a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611ec49092919063ffffffff16565b8051909150156105655780806020019051810190611e389190612776565b610565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610948565b6060611ed38484600085611edb565b949350505050565b606082471015611f6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610948565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611f9691906127b7565b60006040518083038185875af1925050503d8060008114611fd3576040519150601f19603f3d011682016040523d82523d6000602084013e611fd8565b606091505b5091509150611fe987838387611ff4565b979650505050505050565b6060831561208a5782516000036120835773ffffffffffffffffffffffffffffffffffffffff85163b612083576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610948565b5081611ed3565b611ed3838381511561209f5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094891906127c9565b803573ffffffffffffffffffffffffffffffffffffffff811681146120f757600080fd5b919050565b803567ffffffffffffffff811681146120f757600080fd5b6000806040838503121561212757600080fd5b612130836120d3565b915061213e602084016120fc565b90509250929050565b8035600481106120f757600080fd5b6000806000806080858703121561216c57600080fd5b612175856120d3565b93506020850135925061218a604086016120fc565b915061219860608601612147565b905092959194509250565b6000806000606084860312156121b857600080fd5b6121c1846120d3565b92506121cf602085016120fc565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610120810167ffffffffffffffff81118282101715612259577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405290565b801515811461062557600080fd5b80356120f78161225f565b8035600381106120f757600080fd5b8035600281106120f757600080fd5b600061012082840312156122a957600080fd5b6122b161220e565b6122ba8361226d565b81526122c8602084016120d3565b60208201526122d9604084016120fc565b60408201526122ea60608401612147565b60608201526122fb608084016120d3565b608082015260a083013560a082015261231660c08401612278565b60c082015261232760e08401612287565b60e082015261010061233a8185016120d3565b908201529392505050565b60006020828403121561235757600080fd5b6109ad826120d3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004811061239f5761239f612360565b9052565b602080825282518282018190526000919060409081850190868401855b8281101561240f57815180517effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1685528601516123fe8786018261238f565b5092840192908501906001016123c0565b5091979650505050505050565b6000806020838503121561242f57600080fd5b823567ffffffffffffffff8082111561244757600080fd5b818501915085601f83011261245b57600080fd5b81358181111561246a57600080fd5b8660208260051b850101111561247f57600080fd5b60209290920196919550909350505050565b600080604083850312156124a457600080fd5b6124ad836120fc565b915061213e60208401612147565b891515815273ffffffffffffffffffffffffffffffffffffffff898116602083015267ffffffffffffffff89166040830152610120820190612500606084018a61238f565b8716608083015260a082018690526003851061251e5761251e612360565b8460c08301526002841061253457612534612360565b8360e083015261255d61010083018473ffffffffffffffffffffffffffffffffffffffff169052565b9a9950505050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036125fa576125fa61259a565b5060010190565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261263557600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261267457600080fd5b83018035915067ffffffffffffffff82111561268f57600080fd5b6020019150368190038213156126a457600080fd5b9250929050565b8183823760009101908152919050565b818103818111156109b0576109b061259a565b828152604081016105fd602083018461238f565b80820281158282048414176109b0576109b061259a565b60008261272f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b808201808211156109b0576109b061259a565b60006020828403121561278857600080fd5b81516105fd8161225f565b60005b838110156127ae578181015183820152602001612796565b50506000910152565b60008251612635818460208701612793565b60208152600082518060208401526127e8816040850160208701612793565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fea26469706673582212203ebd56b27642553d79ad5d23eb5c7f55cd784763c5812e94fb8531e7f04cf1c764736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b94968dc900588ff723ec633f8f460561f85bcde0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000649cef6d11ed6f88535462e147304d3fe5ae14d000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e89c18d9b6d88ec01ccf7974871520b83f14d3b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d920d9e80875dc86dfc0c913635766e0967718cd0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e89c18d9b6d88ec01ccf7974871520b83f14d3b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d920d9e80875dc86dfc0c913635766e0967718cd0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e89c18d9b6d88ec01ccf7974871520b83f14d3b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d920d9e80875dc86dfc0c913635766e0967718cd0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000940bdcb99a0ee5fb008a606778ae87ed9789f257000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e89c18d9b6d88ec01ccf7974871520b83f14d3b0000000000000000000000000000000000000000000000015af1d78b58c4000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d920d9e80875dc86dfc0c913635766e0967718cd
-----Decoded View---------------
Arg [0] : committee_ (address): 0xB94968dc900588fF723eC633f8f460561f85BcdE
Arg [1] : edges_ (tuple[]): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]
-----Encoded View---------------
39 Constructor Arguments found :
Arg [0] : 000000000000000000000000b94968dc900588ff723ec633f8f460561f85bcde
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [4] : 0000000000000000000000000649cef6d11ed6f88535462e147304d3fe5ae14d
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [7] : 0000000000000000000000000e89c18d9b6d88ec01ccf7974871520b83f14d3b
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [11] : 000000000000000000000000d920d9e80875dc86dfc0c913635766e0967718cd
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [13] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [16] : 0000000000000000000000000e89c18d9b6d88ec01ccf7974871520b83f14d3b
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [20] : 000000000000000000000000d920d9e80875dc86dfc0c913635766e0967718cd
Arg [21] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [22] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [23] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [24] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [25] : 0000000000000000000000000e89c18d9b6d88ec01ccf7974871520b83f14d3b
Arg [26] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [27] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [28] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [29] : 000000000000000000000000d920d9e80875dc86dfc0c913635766e0967718cd
Arg [30] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [31] : 000000000000000000000000940bdcb99a0ee5fb008a606778ae87ed9789f257
Arg [32] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [33] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [34] : 0000000000000000000000000e89c18d9b6d88ec01ccf7974871520b83f14d3b
Arg [35] : 0000000000000000000000000000000000000000000000015af1d78b58c40000
Arg [36] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [37] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [38] : 000000000000000000000000d920d9e80875dc86dfc0c913635766e0967718cd
Deployed Bytecode Sourcemap
40895:9007:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43634:245;;;;;;;;;;-1:-1:-1;43634:245:0;;;;;:::i;:::-;;:::i;:::-;;44904:254;;;;;;;;;;-1:-1:-1;44904:254:0;;;;;:::i;:::-;;:::i;43419:71::-;;;;;;;;;;;;;:::i;2679:86::-;;;;;;;;;;-1:-1:-1;2726:4:0;2750:7;;;;;;2679:86;;1419:14:1;;1412:22;1394:41;;1382:2;1367:18;2679:86:0;;;;;;;;44536:254;;;;;;;;;;-1:-1:-1;44536:254:0;;;;;:::i;:::-;;:::i;:::-;;;1923:25:1;;;1911:2;1896:18;44536:254:0;1777:177:1;39338:74:0;;;;;;;;;;;;39394:17;39338:74;;;;;2267:42:1;2255:55;;;2237:74;;2225:2;2210:18;39338:74:0;2091:226:1;43344:67:0;;;;;;;;;;;;;:::i;43498:128::-;;;;;;;;;;-1:-1:-1;43498:128:0;;;;;:::i;:::-;;:::i;43887:641::-;;;;;;;;;;-1:-1:-1;43887:641:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;39870:106::-;;;;;;;;;;-1:-1:-1;39870:106:0;;;;;:::i;:::-;;:::i;39984:277::-;;;;;;;;;;-1:-1:-1;39984:277:0;;;;;:::i;:::-;;:::i;45166:203::-;;;;;;:::i;:::-;;:::i;39567:24::-;;;;;;;;;;-1:-1:-1;39567:24:0;;;;;;;;42423:71;;;;;;;;;;-1:-1:-1;42423:71:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;43634:245::-;39714:16;:14;:16::i;:::-;43763:17:::1;::::0;;::::1;43727:33;43763:17:::0;;;:9:::1;:17;::::0;;;;;;;:27:::1;::::0;;::::1;::::0;;;;;;;;43727:63;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;;;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;;;;;:33;;43763:27;;43727:63;;;;;;::::1;::::0;;::::1;::::0;;::::1;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;::::0;;::::1;::::0;::::1;::::0;::::1;;;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;::::1;;::::0;;::::1;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;::::0;;::::1;::::0;;;::::1;::::0;;;::::1;;;;::::0;;::::1;::::0;;-1:-1:-1;43801:30:0::1;43727:63:::0;43801:18:::1;:30::i;:::-;43842:29;43860:10;43842:17;:29::i;:::-;43716:163;43634:245:::0;;:::o;44904:254::-;2284:19;:17;:19::i;:::-;25210:21:::1;:19;:21::i;:::-;45096:54:::2;45104:6;45112:7;45121:12;45135:14;45096:7;:54::i;:::-;25254:20:::1;24648:1:::0;25774:22;;25591:213;25254:20:::1;44904:254:::0;;;;:::o;43419:71::-;39714:16;:14;:16::i;:::-;43472:10:::1;:8;:10::i;:::-;43419:71::o:0;44536:254::-;44686:17;;;44636:7;44686:17;;;:9;:17;;;;;;;;:27;;;;;;;;;;44752:11;;;;44774:7;;;;44731:51;;44752:11;;;44765:7;;44731:20;:51::i;:::-;44724:58;;;44536:254;;;;;;:::o;43344:67::-;39714:16;:14;:16::i;:::-;43395:8:::1;:6;:8::i;43498:128::-:0;39714:16;:14;:16::i;:::-;43591:27:::1;43606:11;43591:14;:27::i;:::-;43498:128:::0;:::o;43887:641::-;44057:43;;;44040:14;44057:43;;;:35;:43;;;;;43987:40;;44040:14;44057:52;;:50;:52::i;:::-;44040:69;;44120:48;44209:6;44171:45;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;44171:45:0;;;;;;;;;;;;;;;;44120:96;;44227:11;44254:9;44249:247;44269:6;44265:1;:10;44249:247;;;44303:43;;;;;;;:35;:43;;;;;:49;;44350:1;44303:46;:49::i;:::-;44297:55;-1:-1:-1;44297:55:0;44367:37;;:7;44375:1;44367:10;;;;;;;;:::i;:::-;;;;;;;;;;;:37;;;;;;44454:30;44480:3;44454:25;:30::i;:::-;44419:7;44427:1;44419:10;;;;;;;;:::i;:::-;;;;;;;:32;;:65;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;44277:3:0;;;;:::i;:::-;;;;44249:247;;;-1:-1:-1;44513:7:0;;43887:641;-1:-1:-1;;;;43887:641:0:o;39870:106::-;39714:16;:14;:16::i;:::-;39946:9:::1;:22:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;39870:106::o;39984:277::-;39714:16;:14;:16::i;:::-;40072:9:::1;40067:187;40083:19:::0;;::::1;40067:187;;;40125:12;40143:8;;40152:1;40143:11;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:18;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;:23;;40167:8;;40176:1;40167:11;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:16;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;40143:41;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40124:60;;;40207:7;40199:43;;;::::0;::::1;::::0;;9949:2:1;40199:43:0::1;::::0;::::1;9931:21:1::0;9988:2;9968:18;;;9961:30;10027:25;10007:18;;;10000:53;10070:18;;40199:43:0::1;;;;;;;;;-1:-1:-1::0;40104:3:0;::::1;::::0;::::1;:::i;:::-;;;;40067:187;;45166:203:::0;2284:19;:17;:19::i;:::-;25210:21:::1;:19;:21::i;:::-;45290:71:::2;39394:17;45321:9;45332:12;45346:14;45290:7;:71::i;:::-;25254:20:::1;24648:1:::0;25774:22;;25591:213;25254:20:::1;45166:203:::0;;:::o;36955:131::-;37022:4;37046:32;37051:3;37071:5;37046:4;:32::i;:::-;37039:39;;36955:131;;;;;:::o;37262:137::-;37332:4;37356:35;37364:3;37384:5;37356:7;:35::i;39758:104::-;39831:9;;;;39817:10;:23;39809:45;;;;;;;10301:2:1;39809:45:0;;;10283:21:1;10340:1;10320:18;;;10313:29;10378:11;10358:18;;;10351:39;10407:18;;39809:45:0;10099:332:1;48751:151:0;48847:17;;;;:31;;48839:55;;;;;;;10638:2:1;48839:55:0;;;10620:21:1;10677:2;10657:18;;;10650:30;10716:13;10696:18;;;10689:41;10747:18;;48839:55:0;10436:335:1;46414:448:0;46558:11;:33;;;46501:91;;;;;;;;:::i;:::-;46537:11;:19;;;46501:91;;46518:11;:17;;;46501:91;;;;;;;;;;;;46605:182;46681:95;46721:11;:33;;;46756:11;:19;;;46681:39;:95::i;:::-;46641:17;;;;;46605:54;;;;;;:35;:54;;;;;;;:61;:182::i;:::-;-1:-1:-1;46815:17:0;;;;;46805:28;;;;;;:9;:28;;;;;;;46834:19;;;;46805:49;;;;;;;;;;;46798:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46414:448::o;2838:108::-;2726:4;2750:7;;;;;;2908:9;2900:38;;;;;;;10978:2:1;2900:38:0;;;10960:21:1;11017:2;10997:18;;;10990:30;11056:18;11036;;;11029:46;11092:18;;2900:38:0;10776:340:1;25290:293:0;24692:1;25424:7;;:19;25416:63;;;;;;;11323:2:1;25416:63:0;;;11305:21:1;11362:2;11342:18;;;11335:30;11401:33;11381:18;;;11374:61;11452:18;;25416:63:0;11121:355:1;25416:63:0;24692:1;25557:7;:18;25290:293::o;46870:1465::-;47028:17;;;;46992:33;47028:17;;;:9;:17;;;;;;;;:31;;;;;;;;;;;;46992:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:33;;47028:31;;46992:67;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47093:10:0;48678:21;48727:8;;;47072:48;;;;;;;11683:2:1;47072:48:0;;;11665:21:1;11722:2;11702:18;;;11695:30;11761:13;11741:18;;;11734:41;11792:18;;47072:48:0;11481:335:1;47072:48:0;47131:30;47150:10;47131:18;:30::i;:::-;47174:11;;47204:10;:18;;;:37;;;;;;;;:::i;:::-;;47200:141;;47264:65;47285:10;:18;;;47305:7;47314:10;:14;;;47264:20;:65::i;:::-;47258:71;;47200:141;47351:19;47373:13;47383:3;47373:7;:13;:::i;:::-;47351:35;;47489:1;47471:14;47463:23;;;;;;;;:::i;:::-;47427:10;:32;;;47419:41;;;;;;;;:::i;:::-;:67;:71;:102;;;;;47520:1;47502:14;47494:23;;;;;;;;:::i;:::-;:27;47419:102;47397:173;;;;;;;12156:2:1;47397:173:0;;;12138:21:1;12195:2;12175:18;;;12168:30;12234:23;12214:18;;;12207:51;12275:18;;47397:173:0;11954:345:1;47397:173:0;47587:31;39394:17;47587:31;;;47583:648;;47635:49;47651:10;:19;;;47672:11;47635:15;:49::i;:::-;47703:7;;47699:92;;47731:44;47747:10;:22;;;47771:3;47731:15;:44::i;:::-;47583:648;;;47850:19;47827:10;:19;;;:42;;;;;;;;:::i;:::-;;47823:261;;47934:19;;;;47890:77;;:31;;;;47922:10;;47955:11;47890:31;:77::i;:::-;47823:261;;;48008:60;;;;;48044:10;48008:60;;;12478:74:1;12568:18;;;12561:34;;;48008:35:0;;;;;;12451:18:1;;48008:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47823:261;48104:7;;48100:120;;48176:22;;;;48132:72;;:31;;;;48164:10;;48200:3;48132:31;:72::i;:::-;48298:12;48248:79;;48273:10;48248:79;;48255:10;:16;;;48248:79;;;48285:11;48312:14;48248:79;;;;;;;:::i;:::-;;;;;;;;46981:1354;;;46870:1465;;;;:::o;3534:120::-;2543:16;:14;:16::i;:::-;3603:5:::1;3593:15:::0;;;::::1;::::0;;3624:22:::1;868:10:::0;3633:12:::1;3624:22;::::0;2267:42:1;2255:55;;;2237:74;;2225:2;2210:18;3624:22:0::1;;;;;;;3534:120::o:0;49057:317::-;49159:7;49195:12;49183:8;:24;;;;;;;;:::i;:::-;;49179:169;;-1:-1:-1;49231:4:0;49224:11;;49179:169;49269:19;49257:8;:31;;;;;;;;:::i;:::-;;49253:95;;49331:5;49313:14;49323:4;49313:7;:14;:::i;:::-;49312:24;;;;:::i;:::-;49305:31;;;;49253:95;-1:-1:-1;49365:1:0;49057:317;;;;;:::o;3275:118::-;2284:19;:17;:19::i;:::-;3335:7:::1;:14:::0;;;::::1;::::0;::::1;::::0;;3365:20:::1;3372:12;868:10:::0;;788:98;45483:923;45570:17;;;;:31;;45562:59;;;;;;;13556:2:1;45562:59:0;;;13538:21:1;13595:2;13575:18;;;13568:30;13634:17;13614:18;;;13607:45;13669:18;;45562:59:0;13354:339:1;45562:59:0;39394:17;45636:42;;:11;:17;;;:42;;;45632:161;;45727:19;45703:11;:20;;;:43;;;;;;;;:::i;:::-;;45695:86;;;;;;;13900:2:1;45695:86:0;;;13882:21:1;13939:2;13919:18;;;13912:30;13978:32;13958:18;;;13951:60;14028:18;;45695:86:0;13698:354:1;45695:86:0;45899:17;;;;;45889:28;;;;45859:27;45889:28;;;:9;:28;;;;;;45918:19;;;;45889:49;;;;;;;;;;;45953:9;;45889:49;;45953:9;;;;;:23;45949:78;;45993:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46011:3;;45993:22;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:17;:22::i;:::-;46049:17;;;;;;46039:28;;;;;;;;:9;:28;;;;;;;46068:19;;;;;46039:49;;;;;;;;;;;;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46091:11;;46039:63;;:49;;:63;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;46039:63:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46113:179;46186:95;46226:11;:33;;;46261:11;:19;;;46186:39;:95::i;:::-;46149:17;;;;;46113:54;;;;;;:35;:54;;;;;;;:58;:179::i;:::-;;46364:11;:33;;;46310:88;;;;;;;;:::i;:::-;46343:11;:19;;;46310:88;;46324:11;:17;;;46310:88;;;;;;;;;;;;45551:855;45483:923;:::o;37717:114::-;37777:7;37804:19;37812:3;30518:18;;30435:109;38185:137;38256:7;38291:22;38295:3;38307:5;38291:3;:22::i;49646:142::-;49717:15;49776:3;49768:4;:11;;49752:28;;;;;;;;:::i;28124:414::-;28187:4;30317:19;;;:12;;;:19;;;;;;28204:327;;-1:-1:-1;28247:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;28430:18;;28408:19;;;:12;;;:19;;;;;;:40;;;;28463:11;;28204:327;-1:-1:-1;28514:5:0;28507:12;;28714:1420;28780:4;28919:19;;;:12;;;:19;;;;;;28955:15;;28951:1176;;29330:21;29354:14;29367:1;29354:10;:14;:::i;:::-;29403:18;;29330:38;;-1:-1:-1;29383:17:0;;29403:22;;29424:1;;29403:22;:::i;:::-;29383:42;;29459:13;29446:9;:26;29442:405;;29493:17;29513:3;:11;;29525:9;29513:22;;;;;;;;:::i;:::-;;;;;;;;;29493:42;;29667:9;29638:3;:11;;29650:13;29638:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;29752:23;;;:12;;;:23;;;;;:36;;;29442:405;29928:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;30023:3;:12;;:19;30036:5;30023:19;;;;;;;;;;;30016:26;;;30066:4;30059:11;;;;;;;28951:1176;30110:5;30103:12;;;;;49382:256;49539:7;49617:12;49609:21;;49602:3;49575:22;49567:31;;;;;;;;:::i;:::-;49566:64;;;49567:38;49566:64;:::i;48910:139::-;49006:19;;48998:43;;;;;;;14578:2:1;48998:43:0;;;14560:21:1;14617:2;14597:18;;;14590:30;14656:13;14636:18;;;14629:41;14687:18;;48998:43:0;14376:335:1;48343:195:0;48414:12;48451:3;:8;;48468:4;48451:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48437:41;;;;;48497:7;48489:41;;;;;;;15128:2:1;48489:41:0;;;15110:21:1;15167:2;15147:18;;;15140:30;15206:23;15186:18;;;15179:51;15247:18;;48489:41:0;14926:345:1;19288:248:0;19459:68;;;15488:42:1;15557:15;;;19459:68:0;;;15539:34:1;15609:15;;15589:18;;;15582:43;15641:18;;;;15634:34;;;19459:68:0;;;;;;;;;;15451:18:1;;;;19459:68:0;;;;;;;;;;19482:27;19459:68;;;19432:96;;19452:5;;19432:19;:96::i;3023:108::-;2726:4;2750:7;;;;;;3082:41;;;;;;;15881:2:1;3082:41:0;;;15863:21:1;15920:2;15900:18;;;15893:30;15959:22;15939:18;;;15932:50;15999:18;;3082:41:0;15679:344:1;30898:120:0;30965:7;30992:3;:11;;31004:5;30992:18;;;;;;;;:::i;:::-;;;;;;;;;30985:25;;30898:120;;;;:::o;22136:716::-;22560:23;22586:69;22614:4;22586:69;;;;;;;;;;;;;;;;;22594:5;22586:27;;;;:69;;;;;:::i;:::-;22670:17;;22560:95;;-1:-1:-1;22670:21:0;22666:179;;22767:10;22756:30;;;;;;;;;;;;:::i;:::-;22748:85;;;;;;;16480:2:1;22748:85:0;;;16462:21:1;16519:2;16499:18;;;16492:30;16558:34;16538:18;;;16531:62;16629:12;16609:18;;;16602:40;16659:19;;22748:85:0;16278:406:1;12913:229:0;13050:12;13082:52;13104:6;13112:4;13118:1;13121:12;13082:21;:52::i;:::-;13075:59;12913:229;-1:-1:-1;;;;12913:229:0:o;14033:455::-;14203:12;14261:5;14236:21;:30;;14228:81;;;;;;;16891:2:1;14228:81:0;;;16873:21:1;16930:2;16910:18;;;16903:30;16969:34;16949:18;;;16942:62;17040:8;17020:18;;;17013:36;17066:19;;14228:81:0;16689:402:1;14228:81:0;14321:12;14335:23;14362:6;:11;;14381:5;14388:4;14362:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14320:73;;;;14411:69;14438:6;14446:7;14455:10;14467:12;14411:26;:69::i;:::-;14404:76;14033:455;-1:-1:-1;;;;;;;14033:455:0:o;16606:644::-;16791:12;16820:7;16816:427;;;16848:10;:17;16869:1;16848:22;16844:290;;10451:19;;;;17058:60;;;;;;;17845:2:1;17058:60:0;;;17827:21:1;17884:2;17864:18;;;17857:30;17923:31;17903:18;;;17896:59;17972:18;;17058:60:0;17643:353:1;17058:60:0;-1:-1:-1;17155:10:0;17148:17;;16816:427;17198:33;17206:10;17218:12;17953:17;;:21;17949:388;;18185:10;18179:17;18242:15;18229:10;18225:2;18221:19;18214:44;17949:388;18312:12;18305:20;;;;;;;;;;;:::i;14:196:1:-;82:20;;142:42;131:54;;121:65;;111:93;;200:1;197;190:12;111:93;14:196;;;:::o;215:171::-;282:20;;342:18;331:30;;321:41;;311:69;;376:1;373;366:12;391:258;458:6;466;519:2;507:9;498:7;494:23;490:32;487:52;;;535:1;532;525:12;487:52;558:29;577:9;558:29;:::i;:::-;548:39;;606:37;639:2;628:9;624:18;606:37;:::i;:::-;596:47;;391:258;;;;;:::o;654:156::-;735:20;;784:1;774:12;;764:40;;800:1;797;790:12;815:434;920:6;928;936;944;997:3;985:9;976:7;972:23;968:33;965:53;;;1014:1;1011;1004:12;965:53;1037:29;1056:9;1037:29;:::i;:::-;1027:39;;1113:2;1102:9;1098:18;1085:32;1075:42;;1136:37;1169:2;1158:9;1154:18;1136:37;:::i;:::-;1126:47;;1192:51;1239:2;1228:9;1224:18;1192:51;:::i;:::-;1182:61;;815:434;;;;;;;:::o;1446:326::-;1522:6;1530;1538;1591:2;1579:9;1570:7;1566:23;1562:32;1559:52;;;1607:1;1604;1597:12;1559:52;1630:29;1649:9;1630:29;:::i;:::-;1620:39;;1678:37;1711:2;1700:9;1696:18;1678:37;:::i;:::-;1668:47;;1762:2;1751:9;1747:18;1734:32;1724:42;;1446:326;;;;;:::o;2322:184::-;2374:77;2371:1;2364:88;2471:4;2468:1;2461:15;2495:4;2492:1;2485:15;2511:401;2578:2;2572:9;2620:3;2608:16;;2654:18;2639:34;;2675:22;;;2636:62;2633:242;;;2731:77;2728:1;2721:88;2832:4;2829:1;2822:15;2860:4;2857:1;2850:15;2633:242;2891:2;2884:22;2511:401;:::o;2917:118::-;3003:5;2996:13;2989:21;2982:5;2979:32;2969:60;;3025:1;3022;3015:12;3040:128;3105:20;;3134:28;3105:20;3134:28;:::i;3173:149::-;3247:20;;3296:1;3286:12;;3276:40;;3312:1;3309;3302:12;3327:155;3407:20;;3456:1;3446:12;;3436:40;;3472:1;3469;3462:12;3487:907;3579:6;3632:3;3620:9;3611:7;3607:23;3603:33;3600:53;;;3649:1;3646;3639:12;3600:53;3675:17;;:::i;:::-;3715:26;3731:9;3715:26;:::i;:::-;3708:5;3701:41;3774:38;3808:2;3797:9;3793:18;3774:38;:::i;:::-;3769:2;3762:5;3758:14;3751:62;3845:37;3878:2;3867:9;3863:18;3845:37;:::i;:::-;3840:2;3833:5;3829:14;3822:61;3915:51;3962:2;3951:9;3947:18;3915:51;:::i;:::-;3910:2;3903:5;3899:14;3892:75;4000:39;4034:3;4023:9;4019:19;4000:39;:::i;:::-;3994:3;3987:5;3983:15;3976:64;4101:3;4090:9;4086:19;4073:33;4067:3;4060:5;4056:15;4049:58;4140:45;4180:3;4169:9;4165:19;4140:45;:::i;:::-;4134:3;4127:5;4123:15;4116:70;4219:51;4265:3;4254:9;4250:19;4219:51;:::i;:::-;4213:3;4206:5;4202:15;4195:76;4290:3;4325:38;4359:2;4348:9;4344:18;4325:38;:::i;:::-;4309:14;;;4302:62;4313:5;3487:907;-1:-1:-1;;;3487:907:1:o;4399:186::-;4458:6;4511:2;4499:9;4490:7;4486:23;4482:32;4479:52;;;4527:1;4524;4517:12;4479:52;4550:29;4569:9;4550:29;:::i;4590:184::-;4642:77;4639:1;4632:88;4739:4;4736:1;4729:15;4763:4;4760:1;4753:15;4779:146;4866:1;4859:5;4856:12;4846:46;;4872:18;;:::i;:::-;4901;;4779:146::o;4930:977::-;5199:2;5251:21;;;5321:13;;5224:18;;;5343:22;;;5170:4;;5199:2;5384;;5402:18;;;;5443:15;;;5170:4;5486:395;5500:6;5497:1;5494:13;5486:395;;;5559:13;;5601:9;;5612:64;5597:80;5585:93;;5717:11;;5711:18;5742:59;5788:12;;;5711:18;5742:59;:::i;:::-;-1:-1:-1;5821:12:1;;;;5856:15;;;;5522:1;5515:9;5486:395;;;-1:-1:-1;5898:3:1;;4930:977;-1:-1:-1;;;;;;;4930:977:1:o;5912:643::-;6026:6;6034;6087:2;6075:9;6066:7;6062:23;6058:32;6055:52;;;6103:1;6100;6093:12;6055:52;6143:9;6130:23;6172:18;6213:2;6205:6;6202:14;6199:34;;;6229:1;6226;6219:12;6199:34;6267:6;6256:9;6252:22;6242:32;;6312:7;6305:4;6301:2;6297:13;6293:27;6283:55;;6334:1;6331;6324:12;6283:55;6374:2;6361:16;6400:2;6392:6;6389:14;6386:34;;;6416:1;6413;6406:12;6386:34;6469:7;6464:2;6454:6;6451:1;6447:14;6443:2;6439:23;6435:32;6432:45;6429:65;;;6490:1;6487;6480:12;6429:65;6521:2;6513:11;;;;;6543:6;;-1:-1:-1;5912:643:1;;-1:-1:-1;;;;5912:643:1:o;6560:291::-;6647:6;6655;6708:2;6696:9;6687:7;6683:23;6679:32;6676:52;;;6724:1;6721;6714:12;6676:52;6747:28;6765:9;6747:28;:::i;:::-;6737:38;;6794:51;6841:2;6830:9;6826:18;6794:51;:::i;6856:1058::-;7290:14;;7283:22;7265:41;;7325:42;7403:15;;;7398:2;7383:18;;7376:43;7467:18;7455:31;;7450:2;7435:18;;7428:59;7252:3;7237:19;;;7496:59;7551:2;7536:18;;7528:6;7496:59;:::i;:::-;7592:15;;7586:3;7571:19;;7564:44;7639:3;7624:19;;7617:35;;;7682:1;7671:13;;7661:47;;7688:18;;:::i;:::-;7745:6;7739:3;7728:9;7724:19;7717:35;7782:1;7774:6;7771:13;7761:47;;7788:18;;:::i;:::-;7845:6;7839:3;7828:9;7824:19;7817:35;7861:47;7903:3;7892:9;7888:19;7880:6;2036:42;2025:54;2013:67;;1959:127;7861:47;6856:1058;;;;;;;;;;;;:::o;7919:184::-;7971:77;7968:1;7961:88;8068:4;8065:1;8058:15;8092:4;8089:1;8082:15;8108:184;8160:77;8157:1;8150:88;8257:4;8254:1;8247:15;8281:4;8278:1;8271:15;8297:195;8336:3;8367:66;8360:5;8357:77;8354:103;;8437:18;;:::i;:::-;-1:-1:-1;8484:1:1;8473:13;;8297:195::o;8497:384::-;8591:4;8649:11;8636:25;8739:66;8728:8;8712:14;8708:29;8704:102;8684:18;8680:127;8670:155;;8821:1;8818;8811:12;8670:155;8842:33;;;;;8497:384;-1:-1:-1;;8497:384:1:o;8886:580::-;8963:4;8969:6;9029:11;9016:25;9119:66;9108:8;9092:14;9088:29;9084:102;9064:18;9060:127;9050:155;;9201:1;9198;9191:12;9050:155;9228:33;;9280:20;;;-1:-1:-1;9323:18:1;9312:30;;9309:50;;;9355:1;9352;9345:12;9309:50;9388:4;9376:17;;-1:-1:-1;9419:14:1;9415:27;;;9405:38;;9402:58;;;9456:1;9453;9446:12;9402:58;8886:580;;;;;:::o;9471:271::-;9654:6;9646;9641:3;9628:33;9610:3;9680:16;;9705:13;;;9680:16;9471:271;-1:-1:-1;9471:271:1:o;11821:128::-;11888:9;;;11909:11;;;11906:37;;;11923:18;;:::i;12606:291::-;12798:25;;;12786:2;12771:18;;12832:59;12887:2;12872:18;;12864:6;12832:59;:::i;12902:168::-;12975:9;;;13006;;13023:15;;;13017:22;;13003:37;12993:71;;13044:18;;:::i;13075:274::-;13115:1;13141;13131:189;;13176:77;13173:1;13166:88;13277:4;13274:1;13267:15;13305:4;13302:1;13295:15;13131:189;-1:-1:-1;13334:9:1;;13075:274::o;14057:184::-;14109:77;14106:1;14099:88;14206:4;14203:1;14196:15;14230:4;14227:1;14220:15;14246:125;14311:9;;;14332:10;;;14329:36;;;14345:18;;:::i;16028:245::-;16095:6;16148:2;16136:9;16127:7;16123:23;16119:32;16116:52;;;16164:1;16161;16154:12;16116:52;16196:9;16190:16;16215:28;16237:5;16215:28;:::i;17096:250::-;17181:1;17191:113;17205:6;17202:1;17199:13;17191:113;;;17281:11;;;17275:18;17262:11;;;17255:39;17227:2;17220:10;17191:113;;;-1:-1:-1;;17338:1:1;17320:16;;17313:27;17096:250::o;17351:287::-;17480:3;17518:6;17512:13;17534:66;17593:6;17588:3;17581:4;17573:6;17569:17;17534:66;:::i;18001:455::-;18150:2;18139:9;18132:21;18113:4;18182:6;18176:13;18225:6;18220:2;18209:9;18205:18;18198:34;18241:79;18313:6;18308:2;18297:9;18293:18;18288:2;18280:6;18276:15;18241:79;:::i;:::-;18372:2;18360:15;18377:66;18356:88;18341:104;;;;18447:2;18337:113;;18001:455;-1:-1:-1;;18001:455:1:o
Swarm Source
ipfs://3ebd56b27642553d79ad5d23eb5c7f55cd784763c5812e94fb8531e7f04cf1c7
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.