Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 236 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Send | 18588173 | 363 days ago | IN | 0 ETH | 0.00275234 | ||||
Send | 17689886 | 489 days ago | IN | 0 ETH | 0.00189081 | ||||
Send | 17680585 | 490 days ago | IN | 0 ETH | 0.00189111 | ||||
Deposit | 16708841 | 627 days ago | IN | 0 ETH | 0.00532191 | ||||
Deposit | 16366961 | 675 days ago | IN | 0 ETH | 0.00117472 | ||||
Deposit | 16194408 | 699 days ago | IN | 0 ETH | 0.00087767 | ||||
Deposit | 16194367 | 699 days ago | IN | 0 ETH | 0.00093482 | ||||
Deposit | 16163015 | 704 days ago | IN | 0 ETH | 0.00108666 | ||||
Deposit | 16049970 | 720 days ago | IN | 0 ETH | 0.00082645 | ||||
Deposit | 16009004 | 725 days ago | IN | 0 ETH | 0.00079328 | ||||
Deposit | 16002235 | 726 days ago | IN | 0 ETH | 0.00094787 | ||||
Deposit | 15990368 | 728 days ago | IN | 0 ETH | 0.00109688 | ||||
Deposit | 15896803 | 741 days ago | IN | 0 ETH | 0.00082317 | ||||
Deposit | 15895312 | 741 days ago | IN | 0 ETH | 0.00120223 | ||||
Deposit | 15847621 | 748 days ago | IN | 0 ETH | 0.00170982 | ||||
Deposit | 15798563 | 755 days ago | IN | 0 ETH | 0.00327522 | ||||
Deposit | 15782329 | 757 days ago | IN | 0 ETH | 0.00251777 | ||||
Deposit | 15773612 | 758 days ago | IN | 0 ETH | 0.00114794 | ||||
Deposit | 15572886 | 786 days ago | IN | 0 ETH | 0.00053709 | ||||
Deposit | 15501474 | 797 days ago | IN | 0 ETH | 0.00106219 | ||||
Deposit | 15495220 | 798 days ago | IN | 0 ETH | 0.0006735 | ||||
Deposit | 15495211 | 798 days ago | IN | 0 ETH | 0.00150796 | ||||
Deposit | 15467947 | 803 days ago | IN | 0 ETH | 0.00040077 | ||||
Deposit | 15455048 | 805 days ago | IN | 0 ETH | 0.00103912 | ||||
Send | 15453504 | 805 days ago | IN | 0 ETH | 0.0031515 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
RelayManagerETH
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-11-22 */ pragma solidity 0.8.4; // SPDX-License-Identifier: MIT /** * @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 make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @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' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender) + 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)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } /* * @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) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { function hasRole(bytes32 role, address account) external view returns (bool); function getRoleAdmin(bytes32 role) external view returns (bytes32); function grantRole(bytes32 role, address account) external; function revokeRole(bytes32 role, address account) external; function renounceRole(bytes32 role, address account) external; } /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping (address => bool) members; bytes32 adminRole; } mapping (bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/ */ function _checkRole(bytes32 role, address account) internal view { if(!hasRole(role, account)) { revert(string(abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ))); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { emit RoleAdminChanged(role, getRoleAdmin(role), adminRole); _roles[role].adminRole = adminRole; } function _grantRole(bytes32 role, address account) private { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } /** * @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); } /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { // Divide the signature in r, s and v variables bytes32 r; bytes32 s; uint8 v; // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solhint-disable-next-line no-inline-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } } else if (signature.length == 64) { // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solhint-disable-next-line no-inline-assembly assembly { let vs := mload(add(signature, 0x40)) r := mload(add(signature, 0x20)) s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } } else { revert("ECDSA: invalid signature length"); } return recover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value"); require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value"); // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); require(signer != address(0), "ECDSA: invalid signature"); return signer; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } contract RelayManagerETH is AccessControl, ReentrancyGuard { using SafeERC20 for IERC20; using ECDSA for bytes32; // The contract owner address address public owner; // Proposed contract new owner address address public newOwner; bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE"); // IDO token address IERC20 public ido; // Bridge wallet for collecting fees address public bridgeWallet; // Signer check length threshold uint8 public threshold = 1; // Signer count uint8 public signerLength; // Fixed Admin Fee in IDO uint256 public adminFee; // bps uint256 public adminFeeAccumulated; uint256 public minTransferAmount; // address => signer status mapping(address => bool) private _signers; // Transfer nonce mapping(address => uint256) public nonces; // transfer from address => nonce => processed status mapping(address => mapping(uint256 => bool)) public processedNonces; // Events event Deposited(address indexed from, address indexed receiver, uint256 toChainId, uint256 amount, uint256 nonce); event Sent(address indexed receiver, uint256 indexed amount, uint256 indexed transferredAmount, uint256 nonce); event AdminFeeChanged(uint256 indexed AdminFee); event EthReceived(address indexed sender, uint256 amount); event BridgeWalletChanged(address indexed bridgeWallet); event ThresholdChanged(uint8 threshold); event SignerAdded(address indexed signer); event SignerRemoved(address indexed signer); constructor( IERC20 _ido, uint256 _adminFee, address _bridgeWallet, uint8 _threshold, address[] memory signers_ ) { require(_adminFee != 0, "RelayManagerETH: ADMIN_FEE_INVALID"); require(_threshold >= 1, "RelayManager2Secure: THRESHOLD_INVALID"); require(_bridgeWallet != address(0), "RelayManager2Secure: BRIDGE_WALLET_ADDRESS_INVALID"); address sender = _msgSender(); for (uint8 i = 0; i < signers_.length; i++) { if (signers_[i] != address(0) && !_signers[signers_[i]]) { _signers[signers_[i]] = true; signerLength++; } } // signer length must not be less than threshold require(signerLength >= _threshold, "RelayManager2Secure: SIGNERS_NOT_ENOUGH"); ido = _ido; owner = sender; adminFee = _adminFee; bridgeWallet = _bridgeWallet; threshold = _threshold; _setupRole(DEFAULT_ADMIN_ROLE, sender); _setupRole(OPERATOR_ROLE, sender); emit OwnershipTransferred(address(0), sender); } receive() external payable { emit EthReceived(_msgSender(), msg.value); } /**************************| | Setters | |_________________________*/ /** * @dev Set admin fee */ function setAdminFee( uint256 newAdminFee, bytes[] calldata signatures ) external onlyOperator { require(newAdminFee != 0, "RelayManager2Secure: ADMIN_FEE_INVALID"); require( _verify(keccak256(abi.encodePacked(newAdminFee)), signatures), "RelayManager2Secure: INVALID_SIGNATURE" ); adminFee = newAdminFee; emit AdminFeeChanged(newAdminFee); } /** * @dev Set threshold */ function setThreshold( uint8 newThreshold, bytes[] calldata signatures ) external onlyOperator { require(newThreshold >= 1, "RelayManager2Secure: THRESHOLD_INVALID"); require( _verify(keccak256(abi.encodePacked(newThreshold)), signatures), "RelayManager2Secure: INVALID_SIGNATURE" ); threshold = newThreshold; emit ThresholdChanged(newThreshold); } /** * @dev Add new signer * `signer` must not be zero address */ function addSigner( address signer, bytes[] calldata signatures ) external onlyOperator { require( _verify(keccak256(abi.encodePacked(signer)), signatures), "RelayManager2Secure: INVALID_SIGNATURE" ); if (signer != address(0) && !_signers[signer]) { _signers[signer] = true; signerLength++; } emit SignerAdded(signer); } /** * @dev Remove signer */ function removeSigner( address signer, bytes[] calldata signatures ) external onlyOperator { require( _verify(keccak256(abi.encodePacked(signer)), signatures), "RelayManager2Secure: INVALID_SIGNATURE" ); if (_signers[signer] && --signerLength >= threshold) { _signers[signer] = false; } emit SignerRemoved(signer); } /** * @dev Set bridge wallet address for collecting admin fees */ function setBridgeWallet( address newBridgeWallet, bytes[] calldata signatures ) external onlyOperator { require(newBridgeWallet != address(0), "RelayManager2Secure: BRIDGE_WALLET_ADDRESS_INVALID"); require( _verify(keccak256(abi.encodePacked(newBridgeWallet)), signatures), "RelayManager2Secure: INVALID_SIGNATURE" ); bridgeWallet = newBridgeWallet; emit BridgeWalletChanged(newBridgeWallet); } /** * @dev Set minimum transfer amount * Only `owner` can call */ function setMinTransferAmount(uint256 newMinTransferAmount) external onlyOwner { minTransferAmount = newMinTransferAmount; } /****************************| | Ownership | |___________________________*/ event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner == _msgSender(), "RelayManagerETH: CALLER_NO_OWNER"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() external onlyOwner { emit OwnershipTransferred(owner, address(0)); owner = address(0); } /** * @dev Transfer the contract ownership. * The new owner still needs to accept the transfer. * can only be called by the contract owner. */ function transferOwnership(address _newOwner) external onlyOwner { require(_newOwner != address(0), "RelayManagerETH: INVALID_ADDRESS"); require(_newOwner != owner, "RelayManagerETH: OWNERSHIP_SELF_TRANSFER"); newOwner = _newOwner; } /** * @dev The new owner accept an ownership transfer. */ function acceptOwnership() external { require(_msgSender() == newOwner, "RelayManagerETH: CALLER_NO_NEW_OWNER"); emit OwnershipTransferred(owner, newOwner); owner = newOwner; newOwner = address(0); } /***********************| | Role | |______________________*/ /** * @dev Restricted to members of the operator role. */ modifier onlyOperator() { require(hasRole(OPERATOR_ROLE, _msgSender()), "RelayManagerETH: CALLER_NO_OPERATOR_ROLE"); _; } /** * @dev Add an account to the operator role. */ function addOperator(address account) public onlyOwner { grantRole(OPERATOR_ROLE, account); } /** * @dev Remove an account from the operator role. */ function removeOperator(address account) public onlyOwner { revokeRole(OPERATOR_ROLE, account); } /** * @dev Check if an account is operator. */ function checkOperator(address account) public view returns (bool) { return hasRole(OPERATOR_ROLE, account); } /***************************| | Transfer | |__________________________*/ /** * @dev Deposit (lock) funds to the relay contract for cross-chain transfer */ function deposit( address receiver, uint256 amount, uint256 toChainId ) external { require(amount >= minTransferAmount, "RelayManagerETH: DEPOSIT_AMOUNT_INVALID"); require(receiver != address(0), "RelayManagerETH: RECEIVER_ZERO_ADDRESS"); address sender = _msgSender(); // Lock tokens ido.safeTransferFrom(sender, address(this), amount); emit Deposited(sender, receiver, toChainId, amount, nonces[sender]++); } /** * @dev Send (unlock) funds to the receiver to process cross-chain transfer * `depositHash = keccak256(abi.encodePacked(senderAddress, tokenAddress, nonce))` */ function send( address from, address receiver, uint256 amount, uint256 nonce, bytes[] calldata signatures ) external nonReentrant onlyOperator { _send(from, receiver, amount, nonce, signatures); } /**********************| | Fee | |_____________________*/ function _send( address from, address receiver, uint256 amount, uint256 nonce, bytes[] calldata _signatures ) internal { require(receiver != address(0), "RelayManagerETH: RECEIVER_ZERO_ADDRESS"); require(amount > adminFee, "RelayManagerETH: SEND_AMOUNT_INVALID"); require( _verify(keccak256(abi.encodePacked(from, receiver, amount, nonce)), _signatures), "RelayManager2Secure: INVALID_SIGNATURE" ); require(!processedNonces[from][nonce], 'RelayManager2Secure: TRANSFER_NONCE_ALREADY_PROCESSED'); // Mark the nonce processed state true to avoid double sending processedNonces[from][nonce] = true; // Calculate real amount to transfer considering adminFee and gasFee adminFeeAccumulated += adminFee; uint256 amountToTransfer = amount - adminFee; // Unlock tokens ido.safeTransfer(receiver, amountToTransfer); ido.safeTransfer(bridgeWallet, adminFee); emit Sent(receiver, amount, amountToTransfer, nonce); } /** * @dev Check signer status of `_candidate` */ function isSigner(address _candidate) public view returns (bool) { return _signers[_candidate]; } function _verify( bytes32 _hash, bytes[] memory _signatures ) private view returns (bool) { bytes32 h = _hash.toEthSignedMessageHash(); address lastSigner = address(0x0); address currentSigner; for (uint256 i = 0; i < _signatures.length; i++) { currentSigner = h.recover( _signatures[i]); if (currentSigner <= lastSigner) { return false; } if (!_signers[currentSigner]) { return false; } lastSigner = currentSigner; } if (_signatures.length < threshold) { return false; } return true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"_ido","type":"address"},{"internalType":"uint256","name":"_adminFee","type":"uint256"},{"internalType":"address","name":"_bridgeWallet","type":"address"},{"internalType":"uint8","name":"_threshold","type":"uint8"},{"internalType":"address[]","name":"signers_","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"AdminFee","type":"uint256"}],"name":"AdminFeeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"bridgeWallet","type":"address"}],"name":"BridgeWalletChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"toChainId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EthReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"transferredAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"Sent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"signer","type":"address"}],"name":"SignerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"signer","type":"address"}],"name":"SignerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"threshold","type":"uint8"}],"name":"ThresholdChanged","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"addSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"adminFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adminFeeAccumulated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridgeWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"checkOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"toChainId","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ido","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_candidate","type":"address"}],"name":"isSigner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minTransferAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"newOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"processedNonces","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"removeSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"send","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAdminFee","type":"uint256"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"setAdminFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newBridgeWallet","type":"address"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"setBridgeWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMinTransferAmount","type":"uint256"}],"name":"setMinTransferAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newThreshold","type":"uint8"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"setThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signerLength","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"threshold","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526005805460ff60a01b1916600160a01b1790553480156200002457600080fd5b5060405162002c2a38038062002c2a8339810160408190526200004791620004e2565b6001805583620000a95760405162461bcd60e51b815260206004820152602260248201527f52656c61794d616e616765724554483a2041444d494e5f4645455f494e56414c604482015261125160f21b60648201526084015b60405180910390fd5b60018260ff1610156200010e5760405162461bcd60e51b815260206004820152602660248201527f52656c61794d616e61676572325365637572653a205448524553484f4c445f4960448201526513959053125160d21b6064820152608401620000a0565b6001600160a01b038316620001815760405162461bcd60e51b815260206004820152603260248201527f52656c61794d616e61676572325365637572653a204252494447455f57414c4c604482015271115517d05111149154d4d7d253959053125160721b6064820152608401620000a0565b3360005b82518160ff161015620002db5760006001600160a01b0316838260ff1681518110620001c157634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316141580156200022d575060096000848360ff16815181106200020457634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16155b15620002c657600160096000858460ff16815181106200025d57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790556005805460ff600160a81b90910416906015620002ac8362000608565b91906101000a81548160ff021916908360ff160217905550505b80620002d28162000608565b91505062000185565b5060055460ff808516600160a81b9092041610156200034d5760405162461bcd60e51b815260206004820152602760248201527f52656c61794d616e61676572325365637572653a205349474e4552535f4e4f546044820152660be8a9c9eaa8e960cb1b6064820152608401620000a0565b600480546001600160a01b03199081166001600160a01b0389811691909117909255600280549091168383161790556006869055600580549186166001600160a81b031990921691909117600160a01b60ff861602179055620003b260008262000420565b620003de7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9298262000420565b6040516001600160a01b038216906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350505050505062000664565b6200042c828262000430565b5050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff166200042c576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556200048c3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b8051620004dd816200064b565b919050565b600080600080600060a08688031215620004fa578081fd5b855162000507816200064b565b809550506020808701519450604087015162000523816200064b565b606088015190945060ff811681146200053a578283fd5b60808801519093506001600160401b038082111562000557578384fd5b818901915089601f8301126200056b578384fd5b81518181111562000580576200058062000635565b8060051b604051601f19603f83011681018181108582111715620005a857620005a862000635565b604052828152858101935084860182860187018e1015620005c7578788fd5b8795505b83861015620005f457620005df81620004d0565b855260019590950194938601938601620005cb565b508096505050505050509295509295909350565b600060ff821660ff8114156200062c57634e487b7160e01b82526011600452602482fd5b60010192915050565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146200066157600080fd5b50565b6125b680620006746000396000f3fe6080604052600436106101fd5760003560e01c80637ecebe001161010d578063c59b0929116100a0578063de1ac2fd1161006f578063de1ac2fd14610641578063eeb522aa14610661578063f2fde38b14610681578063f5b541a6146106a1578063fa89c171146106c357600080fd5b8063c59b0929146105c1578063d4ee1d90146105e1578063d547741f14610601578063d9ce0dd71461062157600080fd5b8063a0be06f9116100dc578063a0be06f914610556578063a217fddf1461056c578063ac8a584a14610581578063b92e6396146105a157600080fd5b80637ecebe00146104b15780638da5cb5b146104de57806391d14854146105165780639870d7fe1461053657600080fd5b806342cde4e811610190578063688414311161015f57806368841431146103fd578063715018a61461041357806379ba5097146104285780637cc702401461043d5780637df73e271461047857600080fd5b806342cde4e8146103865780634a5280b2146103a75780635553acb4146103c7578063651d537b146103e757600080fd5b8063248a9ca3116101cc578063248a9ca3146102d55780632f2ff15d1461031357806330c942e01461033357806336568abe1461036657600080fd5b806301ffc9a71461023e5780630985b7a9146102735780630efe6a8b14610295578063237dc6a6146102b557600080fd5b366102395760405134815233907f85177f287940f2f05425a4029951af0e047a7f9c4eaa9a6e6917bcd869f866959060200160405180910390a2005b600080fd5b34801561024a57600080fd5b5061025e6102593660046120fb565b6106e3565b60405190151581526020015b60405180910390f35b34801561027f57600080fd5b5061029361028e366004611fec565b61071a565b005b3480156102a157600080fd5b506102936102b0366004612066565b610876565b3480156102c157600080fd5b506102936102d0366004612123565b61098f565b3480156102e157600080fd5b506103056102f03660046120b8565b60009081526020819052604090206001015490565b60405190815260200161026a565b34801561031f57600080fd5b5061029361032e3660046120d0565b610a86565b34801561033f57600080fd5b5060055461035490600160a81b900460ff1681565b60405160ff909116815260200161026a565b34801561037257600080fd5b506102936103813660046120d0565b610ab1565b34801561039257600080fd5b5060055461035490600160a01b900460ff1681565b3480156103b357600080fd5b506102936103c2366004611fec565b610b2f565b3480156103d357600080fd5b506102936103e2366004612154565b610c66565b3480156103f357600080fd5b5061030560075481565b34801561040957600080fd5b5061030560085481565b34801561041f57600080fd5b50610293610d92565b34801561043457600080fd5b50610293610e06565b34801561044957600080fd5b5061025e61045836600461203d565b600b60209081526000928352604080842090915290825290205460ff1681565b34801561048457600080fd5b5061025e610493366004611f5c565b6001600160a01b031660009081526009602052604090205460ff1690565b3480156104bd57600080fd5b506103056104cc366004611f5c565b600a6020526000908152604090205481565b3480156104ea57600080fd5b506002546104fe906001600160a01b031681565b6040516001600160a01b03909116815260200161026a565b34801561052257600080fd5b5061025e6105313660046120d0565b610edb565b34801561054257600080fd5b50610293610551366004611f5c565b610f04565b34801561056257600080fd5b5061030560065481565b34801561057857600080fd5b50610305600081565b34801561058d57600080fd5b5061029361059c366004611f5c565b610f49565b3480156105ad57600080fd5b506102936105bc3660046120b8565b610f8b565b3480156105cd57600080fd5b506102936105dc366004611f76565b610fba565b3480156105ed57600080fd5b506003546104fe906001600160a01b031681565b34801561060d57600080fd5b5061029361061c3660046120d0565b611060565b34801561062d57600080fd5b5061029361063c366004611fec565b611086565b34801561064d57600080fd5b5061025e61065c366004611f5c565b6111bf565b34801561066d57600080fd5b506004546104fe906001600160a01b031681565b34801561068d57600080fd5b5061029361069c366004611f5c565b6111d9565b3480156106ad57600080fd5b5061030560008051602061256183398151915281565b3480156106cf57600080fd5b506005546104fe906001600160a01b031681565b60006001600160e01b03198216637965db0b60e01b148061071457506301ffc9a760e01b6001600160e01b03198316145b92915050565b61073260008051602061256183398151915233610edb565b6107575760405162461bcd60e51b815260040161074e9061223c565b60405180910390fd5b6001600160a01b0383166107c85760405162461bcd60e51b815260206004820152603260248201527f52656c61794d616e61676572325365637572653a204252494447455f57414c4c604482015271115517d05111149154d4d7d253959053125160721b606482015260840161074e565b6040516001600160601b0319606085901b16602082015261080e906034015b60408051601f19818403018152919052805160209091012061080983856123c4565b6112ea565b61082a5760405162461bcd60e51b815260040161074e90612284565b600580546001600160a01b0319166001600160a01b0385169081179091556040517f3d404489754a9c7213f4329d18f5295de26e0e4e003355eabc3dfbba4552a6c390600090a2505050565b6008548210156108d85760405162461bcd60e51b815260206004820152602760248201527f52656c61794d616e616765724554483a204445504f5349545f414d4f554e545f6044820152661253959053125160ca1b606482015260840161074e565b6001600160a01b0383166108fe5760405162461bcd60e51b815260040161074e906122ff565b6004543390610918906001600160a01b0316823086611428565b6001600160a01b038181166000818152600a602052604081208054938816937f8bab6aed5a508937051a144e61d6e61336834a66aaee250a00613ae6f744c422928792899291610967836124f9565b909155506040805193845260208401929092529082015260600160405180910390a350505050565b6109a760008051602061256183398151915233610edb565b6109c35760405162461bcd60e51b815260040161074e9061223c565b82610a1f5760405162461bcd60e51b815260206004820152602660248201527f52656c61794d616e61676572325365637572653a2041444d494e5f4645455f4960448201526513959053125160d21b606482015260840161074e565b610a35836040516020016107e791815260200190565b610a515760405162461bcd60e51b815260040161074e90612284565b600683905560405183907f11a80b766155f9b8f16a7da44d66269fd694cb1c247f4814244586f68dd5348790600090a2505050565b600082815260208190526040902060010154610aa28133611499565b610aac83836114fd565b505050565b6001600160a01b0381163314610b215760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161074e565b610b2b8282611581565b5050565b610b4760008051602061256183398151915233610edb565b610b635760405162461bcd60e51b815260040161074e9061223c565b6040516001600160601b0319606085901b166020820152610b86906034016107e7565b610ba25760405162461bcd60e51b815260040161074e90612284565b6001600160a01b03831660009081526009602052604090205460ff168015610c0757506005805460ff600160a01b820481169291601591610bea91600160a81b9004166124dc565b91906101000a81548160ff021916908360ff160217905560ff1610155b15610c2d576001600160a01b0383166000908152600960205260409020805460ff191690555b6040516001600160a01b038416907f3525e22824a8a7df2c9a6029941c824cf95b6447f1e13d5128fd3826d35afe8b90600090a2505050565b610c7e60008051602061256183398151915233610edb565b610c9a5760405162461bcd60e51b815260040161074e9061223c565b60018360ff161015610cfd5760405162461bcd60e51b815260206004820152602660248201527f52656c61794d616e61676572325365637572653a205448524553484f4c445f4960448201526513959053125160d21b606482015260840161074e565b6040516001600160f81b031960f885901b166020820152610d20906021016107e7565b610d3c5760405162461bcd60e51b815260040161074e90612284565b6005805460ff60a01b1916600160a01b60ff8616908102919091179091556040519081527f541ae612d90d592d7865e446bfd28eb8c1de1ced93c6f992a6df36c9e7bd33ff9060200160405180910390a1505050565b6002546001600160a01b03163314610dbc5760405162461bcd60e51b815260040161074e906122ca565b6002546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600280546001600160a01b0319169055565b6003546001600160a01b0316336001600160a01b031614610e755760405162461bcd60e51b8152602060048201526024808201527f52656c61794d616e616765724554483a2043414c4c45525f4e4f5f4e45575f4f6044820152632ba722a960e11b606482015260840161074e565b6003546002546040516001600160a01b0392831692909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a360038054600280546001600160a01b03199081166001600160a01b03841617909155169055565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6002546001600160a01b03163314610f2e5760405162461bcd60e51b815260040161074e906122ca565b610f4660008051602061256183398151915282610a86565b50565b6002546001600160a01b03163314610f735760405162461bcd60e51b815260040161074e906122ca565b610f4660008051602061256183398151915282611060565b6002546001600160a01b03163314610fb55760405162461bcd60e51b815260040161074e906122ca565b600855565b6002600154141561100d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161074e565b600260015561102a60008051602061256183398151915233610edb565b6110465760405162461bcd60e51b815260040161074e9061223c565b6110548686868686866115e6565b50506001805550505050565b60008281526020819052604090206001015461107c8133611499565b610aac8383611581565b61109e60008051602061256183398151915233610edb565b6110ba5760405162461bcd60e51b815260040161074e9061223c565b6040516001600160601b0319606085901b1660208201526110dd906034016107e7565b6110f95760405162461bcd60e51b815260040161074e90612284565b6001600160a01b0383161580159061112a57506001600160a01b03831660009081526009602052604090205460ff16155b15611186576001600160a01b0383166000908152600960205260409020805460ff1916600117905560058054600160a81b900460ff1690601561116c83612514565b91906101000a81548160ff021916908360ff160217905550505b6040516001600160a01b038416907f47d1c22a25bb3a5d4e481b9b1e6944c2eade3181a0a20b495ed61d35b5323f2490600090a2505050565b600061071460008051602061256183398151915283610edb565b6002546001600160a01b031633146112035760405162461bcd60e51b815260040161074e906122ca565b6001600160a01b0381166112595760405162461bcd60e51b815260206004820181905260248201527f52656c61794d616e616765724554483a20494e56414c49445f41444452455353604482015260640161074e565b6002546001600160a01b03828116911614156112c85760405162461bcd60e51b815260206004820152602860248201527f52656c61794d616e616765724554483a204f574e4552534849505f53454c465f6044820152672a2920a729a322a960c11b606482015260840161074e565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b600080611344846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b9050600080805b85518110156113f95761138e86828151811061137757634e487b7160e01b600052603260045260246000fd5b60200260200101518561183490919063ffffffff16565b9150826001600160a01b0316826001600160a01b0316116113b6576000945050505050610714565b6001600160a01b03821660009081526009602052604090205460ff166113e3576000945050505050610714565b81925080806113f1906124f9565b91505061134b565b506005548551600160a01b90910460ff16111561141c5760009350505050610714565b50600195945050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526114939085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526118ea565b50505050565b6114a38282610edb565b610b2b576114bb816001600160a01b031660146119bc565b6114c68360206119bc565b6040516020016114d7929190612194565b60408051601f198184030181529082905262461bcd60e51b825261074e91600401612209565b6115078282610edb565b610b2b576000828152602081815260408083206001600160a01b03851684529091529020805460ff1916600117905561153d3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61158b8282610edb565b15610b2b576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160a01b03851661160c5760405162461bcd60e51b815260040161074e906122ff565b60065484116116695760405162461bcd60e51b8152602060048201526024808201527f52656c61794d616e616765724554483a2053454e445f414d4f554e545f494e566044820152631053125160e21b606482015260840161074e565b6040516001600160601b0319606088811b8216602084015287901b16603482015260488101859052606881018490526116a4906088016107e7565b6116c05760405162461bcd60e51b815260040161074e90612284565b6001600160a01b0386166000908152600b6020908152604080832086845290915290205460ff16156117525760405162461bcd60e51b815260206004820152603560248201527f52656c61794d616e61676572325365637572653a205452414e534645525f4e4f6044820152741390d157d053149150511657d41493d0d154d4d151605a1b606482015260840161074e565b6001600160a01b0386166000908152600b602090815260408083208684529091528120805460ff191660011790556006546007805491929091611796908490612376565b90915550506006546000906117ab90866123ad565b6004549091506117c5906001600160a01b03168783611ba5565b6005546006546004546117e6926001600160a01b0391821692911690611ba5565b8085876001600160a01b03167fce013f6e1c999dd262655ffab7053a4f8133c229c8d3a63d84ffaf30e323a0428760405161182391815260200190565b60405180910390a450505050505050565b60008060008084516041141561185e5750505060208201516040830151606084015160001a6118d4565b84516040141561188c5750505060408201516020830151906001600160ff1b0381169060ff1c601b016118d4565b60405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161074e565b6118e086828585611bd5565b9695505050505050565b600061193f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611d7e9092919063ffffffff16565b805190915015610aac578080602001905181019061195d9190612098565b610aac5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161074e565b606060006119cb83600261238e565b6119d6906002612376565b67ffffffffffffffff8111156119fc57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611a26576020820181803683370190505b509050600360fc1b81600081518110611a4f57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611a8c57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506000611ab084600261238e565b611abb906001612376565b90505b6001811115611b4f576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611afd57634e487b7160e01b600052603260045260246000fd5b1a60f81b828281518110611b2157634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c93611b48816124c5565b9050611abe565b508315611b9e5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161074e565b9392505050565b6040516001600160a01b038316602482015260448101829052610aac90849063a9059cbb60e01b9060640161145c565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115611c525760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161074e565b8360ff16601b1480611c6757508360ff16601c145b611cbe5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161074e565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa158015611d12573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611d755760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161074e565b95945050505050565b6060611d8d8484600085611d95565b949350505050565b606082471015611df65760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161074e565b843b611e445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161074e565b600080866001600160a01b03168587604051611e609190612178565b60006040518083038185875af1925050503d8060008114611e9d576040519150601f19603f3d011682016040523d82523d6000602084013e611ea2565b606091505b5091509150611eb2828286611ebd565b979650505050505050565b60608315611ecc575081611b9e565b825115611edc5782518084602001fd5b8160405162461bcd60e51b815260040161074e9190612209565b80356001600160a01b0381168114611f0d57600080fd5b919050565b60008083601f840112611f23578182fd5b50813567ffffffffffffffff811115611f3a578182fd5b6020830191508360208260051b8501011115611f5557600080fd5b9250929050565b600060208284031215611f6d578081fd5b611b9e82611ef6565b60008060008060008060a08789031215611f8e578182fd5b611f9787611ef6565b9550611fa560208801611ef6565b94506040870135935060608701359250608087013567ffffffffffffffff811115611fce578283fd5b611fda89828a01611f12565b979a9699509497509295939492505050565b600080600060408486031215612000578283fd5b61200984611ef6565b9250602084013567ffffffffffffffff811115612024578283fd5b61203086828701611f12565b9497909650939450505050565b6000806040838503121561204f578182fd5b61205883611ef6565b946020939093013593505050565b60008060006060848603121561207a578283fd5b61208384611ef6565b95602085013595506040909401359392505050565b6000602082840312156120a9578081fd5b81518015158114611b9e578182fd5b6000602082840312156120c9578081fd5b5035919050565b600080604083850312156120e2578182fd5b823591506120f260208401611ef6565b90509250929050565b60006020828403121561210c578081fd5b81356001600160e01b031981168114611b9e578182fd5b600080600060408486031215612137578283fd5b83359250602084013567ffffffffffffffff811115612024578283fd5b600080600060408486031215612168578283fd5b833560ff81168114612009578384fd5b6000825161218a818460208701612499565b9190910192915050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516121cc816017850160208801612499565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516121fd816028840160208801612499565b01602801949350505050565b6020815260008251806020840152612228816040850160208701612499565b601f01601f19169190910160400192915050565b60208082526028908201527f52656c61794d616e616765724554483a2043414c4c45525f4e4f5f4f50455241604082015267544f525f524f4c4560c01b606082015260800190565b60208082526026908201527f52656c61794d616e61676572325365637572653a20494e56414c49445f5349476040820152654e415455524560d01b606082015260800190565b6020808252818101527f52656c61794d616e616765724554483a2043414c4c45525f4e4f5f4f574e4552604082015260600190565b60208082526026908201527f52656c61794d616e616765724554483a2052454345495645525f5a45524f5f4160408201526544445245535360d01b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff8111828210171561236e5761236e61254a565b604052919050565b6000821982111561238957612389612534565b500190565b60008160001904831182151516156123a8576123a8612534565b500290565b6000828210156123bf576123bf612534565b500390565b600067ffffffffffffffff808411156123df576123df61254a565b8360051b60206123f0818301612345565b8681528181019086368582011115612406578687fd5b8694505b8885101561248d57803586811115612420578788fd5b8801601f3681830112612431578889fd5b8135888111156124435761244361254a565b612454818301601f19168801612345565b9150808252368782850101111561246957898afd5b8087840188840137810186018990528452506001949094019391830191830161240a565b50979650505050505050565b60005b838110156124b457818101518382015260200161249c565b838111156114935750506000910152565b6000816124d4576124d4612534565b506000190190565b600060ff8216806124ef576124ef612534565b6000190192915050565b600060001982141561250d5761250d612534565b5060010190565b600060ff821660ff81141561252b5761252b612534565b60010192915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfe97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929a26469706673582212203e369cb60ebb63a375131f49431293e36bb91f2dc8e34bc2745348f3bcba4b6864736f6c63430008040033000000000000000000000000f9c53268e9de692ae1b2ea5216e24e1c3ad7cb1e00000000000000000000000000000000000000000000001043561a8829300000000000000000000000000000bc8693289d3ed657396a17d92e781c4115cc03a7000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000008142409931f554d99013de129cddc70ea016d62d
Deployed Bytecode
0x6080604052600436106101fd5760003560e01c80637ecebe001161010d578063c59b0929116100a0578063de1ac2fd1161006f578063de1ac2fd14610641578063eeb522aa14610661578063f2fde38b14610681578063f5b541a6146106a1578063fa89c171146106c357600080fd5b8063c59b0929146105c1578063d4ee1d90146105e1578063d547741f14610601578063d9ce0dd71461062157600080fd5b8063a0be06f9116100dc578063a0be06f914610556578063a217fddf1461056c578063ac8a584a14610581578063b92e6396146105a157600080fd5b80637ecebe00146104b15780638da5cb5b146104de57806391d14854146105165780639870d7fe1461053657600080fd5b806342cde4e811610190578063688414311161015f57806368841431146103fd578063715018a61461041357806379ba5097146104285780637cc702401461043d5780637df73e271461047857600080fd5b806342cde4e8146103865780634a5280b2146103a75780635553acb4146103c7578063651d537b146103e757600080fd5b8063248a9ca3116101cc578063248a9ca3146102d55780632f2ff15d1461031357806330c942e01461033357806336568abe1461036657600080fd5b806301ffc9a71461023e5780630985b7a9146102735780630efe6a8b14610295578063237dc6a6146102b557600080fd5b366102395760405134815233907f85177f287940f2f05425a4029951af0e047a7f9c4eaa9a6e6917bcd869f866959060200160405180910390a2005b600080fd5b34801561024a57600080fd5b5061025e6102593660046120fb565b6106e3565b60405190151581526020015b60405180910390f35b34801561027f57600080fd5b5061029361028e366004611fec565b61071a565b005b3480156102a157600080fd5b506102936102b0366004612066565b610876565b3480156102c157600080fd5b506102936102d0366004612123565b61098f565b3480156102e157600080fd5b506103056102f03660046120b8565b60009081526020819052604090206001015490565b60405190815260200161026a565b34801561031f57600080fd5b5061029361032e3660046120d0565b610a86565b34801561033f57600080fd5b5060055461035490600160a81b900460ff1681565b60405160ff909116815260200161026a565b34801561037257600080fd5b506102936103813660046120d0565b610ab1565b34801561039257600080fd5b5060055461035490600160a01b900460ff1681565b3480156103b357600080fd5b506102936103c2366004611fec565b610b2f565b3480156103d357600080fd5b506102936103e2366004612154565b610c66565b3480156103f357600080fd5b5061030560075481565b34801561040957600080fd5b5061030560085481565b34801561041f57600080fd5b50610293610d92565b34801561043457600080fd5b50610293610e06565b34801561044957600080fd5b5061025e61045836600461203d565b600b60209081526000928352604080842090915290825290205460ff1681565b34801561048457600080fd5b5061025e610493366004611f5c565b6001600160a01b031660009081526009602052604090205460ff1690565b3480156104bd57600080fd5b506103056104cc366004611f5c565b600a6020526000908152604090205481565b3480156104ea57600080fd5b506002546104fe906001600160a01b031681565b6040516001600160a01b03909116815260200161026a565b34801561052257600080fd5b5061025e6105313660046120d0565b610edb565b34801561054257600080fd5b50610293610551366004611f5c565b610f04565b34801561056257600080fd5b5061030560065481565b34801561057857600080fd5b50610305600081565b34801561058d57600080fd5b5061029361059c366004611f5c565b610f49565b3480156105ad57600080fd5b506102936105bc3660046120b8565b610f8b565b3480156105cd57600080fd5b506102936105dc366004611f76565b610fba565b3480156105ed57600080fd5b506003546104fe906001600160a01b031681565b34801561060d57600080fd5b5061029361061c3660046120d0565b611060565b34801561062d57600080fd5b5061029361063c366004611fec565b611086565b34801561064d57600080fd5b5061025e61065c366004611f5c565b6111bf565b34801561066d57600080fd5b506004546104fe906001600160a01b031681565b34801561068d57600080fd5b5061029361069c366004611f5c565b6111d9565b3480156106ad57600080fd5b5061030560008051602061256183398151915281565b3480156106cf57600080fd5b506005546104fe906001600160a01b031681565b60006001600160e01b03198216637965db0b60e01b148061071457506301ffc9a760e01b6001600160e01b03198316145b92915050565b61073260008051602061256183398151915233610edb565b6107575760405162461bcd60e51b815260040161074e9061223c565b60405180910390fd5b6001600160a01b0383166107c85760405162461bcd60e51b815260206004820152603260248201527f52656c61794d616e61676572325365637572653a204252494447455f57414c4c604482015271115517d05111149154d4d7d253959053125160721b606482015260840161074e565b6040516001600160601b0319606085901b16602082015261080e906034015b60408051601f19818403018152919052805160209091012061080983856123c4565b6112ea565b61082a5760405162461bcd60e51b815260040161074e90612284565b600580546001600160a01b0319166001600160a01b0385169081179091556040517f3d404489754a9c7213f4329d18f5295de26e0e4e003355eabc3dfbba4552a6c390600090a2505050565b6008548210156108d85760405162461bcd60e51b815260206004820152602760248201527f52656c61794d616e616765724554483a204445504f5349545f414d4f554e545f6044820152661253959053125160ca1b606482015260840161074e565b6001600160a01b0383166108fe5760405162461bcd60e51b815260040161074e906122ff565b6004543390610918906001600160a01b0316823086611428565b6001600160a01b038181166000818152600a602052604081208054938816937f8bab6aed5a508937051a144e61d6e61336834a66aaee250a00613ae6f744c422928792899291610967836124f9565b909155506040805193845260208401929092529082015260600160405180910390a350505050565b6109a760008051602061256183398151915233610edb565b6109c35760405162461bcd60e51b815260040161074e9061223c565b82610a1f5760405162461bcd60e51b815260206004820152602660248201527f52656c61794d616e61676572325365637572653a2041444d494e5f4645455f4960448201526513959053125160d21b606482015260840161074e565b610a35836040516020016107e791815260200190565b610a515760405162461bcd60e51b815260040161074e90612284565b600683905560405183907f11a80b766155f9b8f16a7da44d66269fd694cb1c247f4814244586f68dd5348790600090a2505050565b600082815260208190526040902060010154610aa28133611499565b610aac83836114fd565b505050565b6001600160a01b0381163314610b215760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161074e565b610b2b8282611581565b5050565b610b4760008051602061256183398151915233610edb565b610b635760405162461bcd60e51b815260040161074e9061223c565b6040516001600160601b0319606085901b166020820152610b86906034016107e7565b610ba25760405162461bcd60e51b815260040161074e90612284565b6001600160a01b03831660009081526009602052604090205460ff168015610c0757506005805460ff600160a01b820481169291601591610bea91600160a81b9004166124dc565b91906101000a81548160ff021916908360ff160217905560ff1610155b15610c2d576001600160a01b0383166000908152600960205260409020805460ff191690555b6040516001600160a01b038416907f3525e22824a8a7df2c9a6029941c824cf95b6447f1e13d5128fd3826d35afe8b90600090a2505050565b610c7e60008051602061256183398151915233610edb565b610c9a5760405162461bcd60e51b815260040161074e9061223c565b60018360ff161015610cfd5760405162461bcd60e51b815260206004820152602660248201527f52656c61794d616e61676572325365637572653a205448524553484f4c445f4960448201526513959053125160d21b606482015260840161074e565b6040516001600160f81b031960f885901b166020820152610d20906021016107e7565b610d3c5760405162461bcd60e51b815260040161074e90612284565b6005805460ff60a01b1916600160a01b60ff8616908102919091179091556040519081527f541ae612d90d592d7865e446bfd28eb8c1de1ced93c6f992a6df36c9e7bd33ff9060200160405180910390a1505050565b6002546001600160a01b03163314610dbc5760405162461bcd60e51b815260040161074e906122ca565b6002546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600280546001600160a01b0319169055565b6003546001600160a01b0316336001600160a01b031614610e755760405162461bcd60e51b8152602060048201526024808201527f52656c61794d616e616765724554483a2043414c4c45525f4e4f5f4e45575f4f6044820152632ba722a960e11b606482015260840161074e565b6003546002546040516001600160a01b0392831692909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a360038054600280546001600160a01b03199081166001600160a01b03841617909155169055565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6002546001600160a01b03163314610f2e5760405162461bcd60e51b815260040161074e906122ca565b610f4660008051602061256183398151915282610a86565b50565b6002546001600160a01b03163314610f735760405162461bcd60e51b815260040161074e906122ca565b610f4660008051602061256183398151915282611060565b6002546001600160a01b03163314610fb55760405162461bcd60e51b815260040161074e906122ca565b600855565b6002600154141561100d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161074e565b600260015561102a60008051602061256183398151915233610edb565b6110465760405162461bcd60e51b815260040161074e9061223c565b6110548686868686866115e6565b50506001805550505050565b60008281526020819052604090206001015461107c8133611499565b610aac8383611581565b61109e60008051602061256183398151915233610edb565b6110ba5760405162461bcd60e51b815260040161074e9061223c565b6040516001600160601b0319606085901b1660208201526110dd906034016107e7565b6110f95760405162461bcd60e51b815260040161074e90612284565b6001600160a01b0383161580159061112a57506001600160a01b03831660009081526009602052604090205460ff16155b15611186576001600160a01b0383166000908152600960205260409020805460ff1916600117905560058054600160a81b900460ff1690601561116c83612514565b91906101000a81548160ff021916908360ff160217905550505b6040516001600160a01b038416907f47d1c22a25bb3a5d4e481b9b1e6944c2eade3181a0a20b495ed61d35b5323f2490600090a2505050565b600061071460008051602061256183398151915283610edb565b6002546001600160a01b031633146112035760405162461bcd60e51b815260040161074e906122ca565b6001600160a01b0381166112595760405162461bcd60e51b815260206004820181905260248201527f52656c61794d616e616765724554483a20494e56414c49445f41444452455353604482015260640161074e565b6002546001600160a01b03828116911614156112c85760405162461bcd60e51b815260206004820152602860248201527f52656c61794d616e616765724554483a204f574e4552534849505f53454c465f6044820152672a2920a729a322a960c11b606482015260840161074e565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b600080611344846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b9050600080805b85518110156113f95761138e86828151811061137757634e487b7160e01b600052603260045260246000fd5b60200260200101518561183490919063ffffffff16565b9150826001600160a01b0316826001600160a01b0316116113b6576000945050505050610714565b6001600160a01b03821660009081526009602052604090205460ff166113e3576000945050505050610714565b81925080806113f1906124f9565b91505061134b565b506005548551600160a01b90910460ff16111561141c5760009350505050610714565b50600195945050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526114939085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526118ea565b50505050565b6114a38282610edb565b610b2b576114bb816001600160a01b031660146119bc565b6114c68360206119bc565b6040516020016114d7929190612194565b60408051601f198184030181529082905262461bcd60e51b825261074e91600401612209565b6115078282610edb565b610b2b576000828152602081815260408083206001600160a01b03851684529091529020805460ff1916600117905561153d3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61158b8282610edb565b15610b2b576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160a01b03851661160c5760405162461bcd60e51b815260040161074e906122ff565b60065484116116695760405162461bcd60e51b8152602060048201526024808201527f52656c61794d616e616765724554483a2053454e445f414d4f554e545f494e566044820152631053125160e21b606482015260840161074e565b6040516001600160601b0319606088811b8216602084015287901b16603482015260488101859052606881018490526116a4906088016107e7565b6116c05760405162461bcd60e51b815260040161074e90612284565b6001600160a01b0386166000908152600b6020908152604080832086845290915290205460ff16156117525760405162461bcd60e51b815260206004820152603560248201527f52656c61794d616e61676572325365637572653a205452414e534645525f4e4f6044820152741390d157d053149150511657d41493d0d154d4d151605a1b606482015260840161074e565b6001600160a01b0386166000908152600b602090815260408083208684529091528120805460ff191660011790556006546007805491929091611796908490612376565b90915550506006546000906117ab90866123ad565b6004549091506117c5906001600160a01b03168783611ba5565b6005546006546004546117e6926001600160a01b0391821692911690611ba5565b8085876001600160a01b03167fce013f6e1c999dd262655ffab7053a4f8133c229c8d3a63d84ffaf30e323a0428760405161182391815260200190565b60405180910390a450505050505050565b60008060008084516041141561185e5750505060208201516040830151606084015160001a6118d4565b84516040141561188c5750505060408201516020830151906001600160ff1b0381169060ff1c601b016118d4565b60405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161074e565b6118e086828585611bd5565b9695505050505050565b600061193f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611d7e9092919063ffffffff16565b805190915015610aac578080602001905181019061195d9190612098565b610aac5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161074e565b606060006119cb83600261238e565b6119d6906002612376565b67ffffffffffffffff8111156119fc57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611a26576020820181803683370190505b509050600360fc1b81600081518110611a4f57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611a8c57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506000611ab084600261238e565b611abb906001612376565b90505b6001811115611b4f576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611afd57634e487b7160e01b600052603260045260246000fd5b1a60f81b828281518110611b2157634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c93611b48816124c5565b9050611abe565b508315611b9e5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161074e565b9392505050565b6040516001600160a01b038316602482015260448101829052610aac90849063a9059cbb60e01b9060640161145c565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115611c525760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161074e565b8360ff16601b1480611c6757508360ff16601c145b611cbe5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161074e565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa158015611d12573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611d755760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161074e565b95945050505050565b6060611d8d8484600085611d95565b949350505050565b606082471015611df65760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161074e565b843b611e445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161074e565b600080866001600160a01b03168587604051611e609190612178565b60006040518083038185875af1925050503d8060008114611e9d576040519150601f19603f3d011682016040523d82523d6000602084013e611ea2565b606091505b5091509150611eb2828286611ebd565b979650505050505050565b60608315611ecc575081611b9e565b825115611edc5782518084602001fd5b8160405162461bcd60e51b815260040161074e9190612209565b80356001600160a01b0381168114611f0d57600080fd5b919050565b60008083601f840112611f23578182fd5b50813567ffffffffffffffff811115611f3a578182fd5b6020830191508360208260051b8501011115611f5557600080fd5b9250929050565b600060208284031215611f6d578081fd5b611b9e82611ef6565b60008060008060008060a08789031215611f8e578182fd5b611f9787611ef6565b9550611fa560208801611ef6565b94506040870135935060608701359250608087013567ffffffffffffffff811115611fce578283fd5b611fda89828a01611f12565b979a9699509497509295939492505050565b600080600060408486031215612000578283fd5b61200984611ef6565b9250602084013567ffffffffffffffff811115612024578283fd5b61203086828701611f12565b9497909650939450505050565b6000806040838503121561204f578182fd5b61205883611ef6565b946020939093013593505050565b60008060006060848603121561207a578283fd5b61208384611ef6565b95602085013595506040909401359392505050565b6000602082840312156120a9578081fd5b81518015158114611b9e578182fd5b6000602082840312156120c9578081fd5b5035919050565b600080604083850312156120e2578182fd5b823591506120f260208401611ef6565b90509250929050565b60006020828403121561210c578081fd5b81356001600160e01b031981168114611b9e578182fd5b600080600060408486031215612137578283fd5b83359250602084013567ffffffffffffffff811115612024578283fd5b600080600060408486031215612168578283fd5b833560ff81168114612009578384fd5b6000825161218a818460208701612499565b9190910192915050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516121cc816017850160208801612499565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516121fd816028840160208801612499565b01602801949350505050565b6020815260008251806020840152612228816040850160208701612499565b601f01601f19169190910160400192915050565b60208082526028908201527f52656c61794d616e616765724554483a2043414c4c45525f4e4f5f4f50455241604082015267544f525f524f4c4560c01b606082015260800190565b60208082526026908201527f52656c61794d616e61676572325365637572653a20494e56414c49445f5349476040820152654e415455524560d01b606082015260800190565b6020808252818101527f52656c61794d616e616765724554483a2043414c4c45525f4e4f5f4f574e4552604082015260600190565b60208082526026908201527f52656c61794d616e616765724554483a2052454345495645525f5a45524f5f4160408201526544445245535360d01b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff8111828210171561236e5761236e61254a565b604052919050565b6000821982111561238957612389612534565b500190565b60008160001904831182151516156123a8576123a8612534565b500290565b6000828210156123bf576123bf612534565b500390565b600067ffffffffffffffff808411156123df576123df61254a565b8360051b60206123f0818301612345565b8681528181019086368582011115612406578687fd5b8694505b8885101561248d57803586811115612420578788fd5b8801601f3681830112612431578889fd5b8135888111156124435761244361254a565b612454818301601f19168801612345565b9150808252368782850101111561246957898afd5b8087840188840137810186018990528452506001949094019391830191830161240a565b50979650505050505050565b60005b838110156124b457818101518382015260200161249c565b838111156114935750506000910152565b6000816124d4576124d4612534565b506000190190565b600060ff8216806124ef576124ef612534565b6000190192915050565b600060001982141561250d5761250d612534565b5060010190565b600060ff821660ff81141561252b5761252b612534565b60010192915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfe97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929a26469706673582212203e369cb60ebb63a375131f49431293e36bb91f2dc8e34bc2745348f3bcba4b6864736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f9c53268e9de692ae1b2ea5216e24e1c3ad7cb1e00000000000000000000000000000000000000000000001043561a8829300000000000000000000000000000bc8693289d3ed657396a17d92e781c4115cc03a7000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000008142409931f554d99013de129cddc70ea016d62d
-----Decoded View---------------
Arg [0] : _ido (address): 0xF9c53268e9de692AE1b2ea5216E24e1c3ad7CB1E
Arg [1] : _adminFee (uint256): 300000000000000000000
Arg [2] : _bridgeWallet (address): 0xBC8693289D3ED657396A17d92E781C4115Cc03A7
Arg [3] : _threshold (uint8): 1
Arg [4] : signers_ (address[]): 0x8142409931f554d99013de129cdDc70EA016d62d
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000f9c53268e9de692ae1b2ea5216e24e1c3ad7cb1e
Arg [1] : 00000000000000000000000000000000000000000000001043561a8829300000
Arg [2] : 000000000000000000000000bc8693289d3ed657396a17d92e781c4115cc03a7
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [4] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [6] : 0000000000000000000000008142409931f554d99013de129cddc70ea016d62d
Deployed Bytecode Sourcemap
37329:10778:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39960:36;;39986:9;8955:25:1;;17666:10:0;;39960:36;;8943:2:1;8928:18;39960:36:0;;;;;;;37329:10778;;;;;25545:217;;;;;;;;;;-1:-1:-1;25545:217:0;;;;;:::i;:::-;;:::i;:::-;;;8782:14:1;;8775:22;8757:41;;8745:2;8730:18;25545:217:0;;;;;;;;41998:452;;;;;;;;;;-1:-1:-1;41998:452:0;;;;;:::i;:::-;;:::i;:::-;;45293:463;;;;;;;;;;-1:-1:-1;45293:463:0;;;;;:::i;:::-;;:::i;40147:399::-;;;;;;;;;;-1:-1:-1;40147:399:0;;;;;:::i;:::-;;:::i;26856:123::-;;;;;;;;;;-1:-1:-1;26856:123:0;;;;;:::i;:::-;26922:7;26949:12;;;;;;;;;;:22;;;;26856:123;;;;8955:25:1;;;8943:2;8928:18;26856:123:0;8910:76:1;27241:147:0;;;;;;;;;;-1:-1:-1;27241:147:0;;;;;:::i;:::-;;:::i;37863:25::-;;;;;;;;;;-1:-1:-1;37863:25:0;;;;-1:-1:-1;;;37863:25:0;;;;;;;;;19741:4:1;19729:17;;;19711:36;;19699:2;19684:18;37863:25:0;19666:87:1;28289:218:0;;;;;;;;;;-1:-1:-1;28289:218:0;;;;;:::i;:::-;;:::i;37813:26::-;;;;;;;;;;-1:-1:-1;37813:26:0;;;;-1:-1:-1;;;37813:26:0;;;;;;41532:382;;;;;;;;;;-1:-1:-1;41532:382:0;;;;;:::i;:::-;;:::i;40595:405::-;;;;;;;;;;-1:-1:-1;40595:405:0;;;;;:::i;:::-;;:::i;37959:34::-;;;;;;;;;;;;;;;;37998:32;;;;;;;;;;;;;;;;43404:130;;;;;;;;;;;;;:::i;44034:222::-;;;;;;;;;;;;;:::i;38244:67::-;;;;;;;;;;-1:-1:-1;38244:67:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;47376:105;;;;;;;;;;-1:-1:-1;47376:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;47455:20:0;47435:4;47455:20;;;:8;:20;;;;;;;;;47376:105;38139:41;;;;;;;;;;-1:-1:-1;38139:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;37489:20;;;;;;;;;;-1:-1:-1;37489:20:0;;;;-1:-1:-1;;;;;37489:20:0;;;;;;-1:-1:-1;;;;;7914:32:1;;;7896:51;;7884:2;7869:18;37489:20:0;7851:102:1;25854:139:0;;;;;;;;;;-1:-1:-1;25854:139:0;;;;;:::i;:::-;;:::i;44626:101::-;;;;;;;;;;-1:-1:-1;44626:101:0;;;;;:::i;:::-;;:::i;37924:23::-;;;;;;;;;;;;;;;;23819:49;;;;;;;;;;-1:-1:-1;23819:49:0;23864:4;23819:49;;44802:105;;;;;;;;;;-1:-1:-1;44802:105:0;;;;;:::i;:::-;;:::i;42542:132::-;;;;;;;;;;-1:-1:-1;42542:132:0;;;;;:::i;:::-;;:::i;45948:232::-;;;;;;;;;;-1:-1:-1;45948:232:0;;;;;:::i;:::-;;:::i;37556:23::-;;;;;;;;;;-1:-1:-1;37556:23:0;;;;-1:-1:-1;;;;;37556:23:0;;;27633:149;;;;;;;;;;-1:-1:-1;27633:149:0;;;;;:::i;:::-;;:::i;41090:393::-;;;;;;;;;;-1:-1:-1;41090:393:0;;;;;:::i;:::-;;:::i;44973:118::-;;;;;;;;;;-1:-1:-1;44973:118:0;;;;;:::i;:::-;;:::i;37681:17::-;;;;;;;;;;-1:-1:-1;37681:17:0;;;;-1:-1:-1;;;;;37681:17:0;;;43706:251;;;;;;;;;;-1:-1:-1;43706:251:0;;;;;:::i;:::-;;:::i;37586:66::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;37586:66:0;;37745:27;;;;;;;;;;-1:-1:-1;37745:27:0;;;;-1:-1:-1;;;;;37745:27:0;;;25545:217;25630:4;-1:-1:-1;;;;;;25654:47:0;;-1:-1:-1;;;25654:47:0;;:100;;-1:-1:-1;;;;;;;;;;21476:40:0;;;25718:36;25647:107;25545:217;-1:-1:-1;;25545:217:0:o;41998:452::-;44461:36;-1:-1:-1;;;;;;;;;;;17666:10:0;25854:139;:::i;44461:36::-;44453:89;;;;-1:-1:-1;;;44453:89:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;42129:29:0;::::1;42121:92;;;::::0;-1:-1:-1;;;42121:92:0;;13742:2:1;42121:92:0::1;::::0;::::1;13724:21:1::0;13781:2;13761:18;;;13754:30;13820:34;13800:18;;;13793:62;-1:-1:-1;;;13871:18:1;;;13864:48;13929:19;;42121:92:0::1;13714:240:1::0;42121:92:0::1;42254:33;::::0;-1:-1:-1;;;;;;5342:2:1;5338:15;;;5334:53;42254:33:0::1;::::0;::::1;5322:66:1::0;42236:65:0::1;::::0;5404:12:1;;42254:33:0::1;;::::0;;-1:-1:-1;;42254:33:0;;::::1;::::0;;;;;;42244:44;;42254:33:::1;42244:44:::0;;::::1;::::0;42236:65:::1;42290:10:::0;;42236:65:::1;:::i;:::-;:7;:65::i;:::-;42220:137;;;;-1:-1:-1::0;;;42220:137:0::1;;;;;;;:::i;:::-;42364:12;:30:::0;;-1:-1:-1;;;;;;42364:30:0::1;-1:-1:-1::0;;;;;42364:30:0;::::1;::::0;;::::1;::::0;;;42408:36:::1;::::0;::::1;::::0;-1:-1:-1;;42408:36:0::1;41998:452:::0;;;:::o;45293:463::-;45417:17;;45407:6;:27;;45399:79;;;;-1:-1:-1;;;45399:79:0;;11329:2:1;45399:79:0;;;11311:21:1;11368:2;11348:18;;;11341:30;11407:34;11387:18;;;11380:62;-1:-1:-1;;;11458:18:1;;;11451:37;11505:19;;45399:79:0;11301:229:1;45399:79:0;-1:-1:-1;;;;;45493:22:0;;45485:73;;;;-1:-1:-1;;;45485:73:0;;;;;;;:::i;:::-;45621:3;;17666:10;;45621:51;;-1:-1:-1;;;;;45621:3:0;17666:10;45658:4;45665:6;45621:20;:51::i;:::-;-1:-1:-1;;;;;45686:64:0;;;45733:14;;;;:6;:14;;;;;:16;;45686:64;;;;;;45714:9;;45725:6;;45733:16;;;;:::i;:::-;;;;-1:-1:-1;45686:64:0;;;19447:25:1;;;19503:2;19488:18;;19481:34;;;;19531:18;;;19524:34;19435:2;19420:18;45686:64:0;;;;;;;45293:463;;;;:::o;40147:399::-;44461:36;-1:-1:-1;;;;;;;;;;;17666:10:0;25854:139;:::i;44461:36::-;44453:89;;;;-1:-1:-1;;;44453:89:0;;;;;;;:::i;:::-;40270:16;40262:67:::1;;;::::0;-1:-1:-1;;;40262:67:0;;12928:2:1;40262:67:0::1;::::0;::::1;12910:21:1::0;12967:2;12947:18;;;12940:30;13006:34;12986:18;;;12979:62;-1:-1:-1;;;13057:18:1;;;13050:36;13103:19;;40262:67:0::1;12900:228:1::0;40262:67:0::1;40352:61;40387:11;40370:29;;;;;;7480:19:1::0;;7524:2;7515:12;;7470:63;40352:61:0::1;40336:133;;;;-1:-1:-1::0;;;40336:133:0::1;;;;;;;:::i;:::-;40476:8;:22:::0;;;40512:28:::1;::::0;40487:11;;40512:28:::1;::::0;;;::::1;40147:399:::0;;;:::o;27241:147::-;26922:7;26949:12;;;;;;;;;;:22;;;25423:30;25434:4;17666:10;25423;:30::i;:::-;27355:25:::1;27366:4;27372:7;27355:10;:25::i;:::-;27241:147:::0;;;:::o;28289:218::-;-1:-1:-1;;;;;28385:23:0;;17666:10;28385:23;28377:83;;;;-1:-1:-1;;;28377:83:0;;18849:2:1;28377:83:0;;;18831:21:1;18888:2;18868:18;;;18861:30;18927:34;18907:18;;;18900:62;-1:-1:-1;;;18978:18:1;;;18971:45;19033:19;;28377:83:0;18821:237:1;28377:83:0;28473:26;28485:4;28491:7;28473:11;:26::i;:::-;28289:218;;:::o;41532:382::-;44461:36;-1:-1:-1;;;;;;;;;;;17666:10:0;25854:139;:::i;44461:36::-;44453:89;;;;-1:-1:-1;;;44453:89:0;;;;;;;:::i;:::-;41677:24:::1;::::0;-1:-1:-1;;;;;;5342:2:1;5338:15;;;5334:53;41677:24:0::1;::::0;::::1;5322:66:1::0;41659:56:0::1;::::0;5404:12:1;;41677:24:0::1;5312:110:1::0;41659:56:0::1;41643:128;;;;-1:-1:-1::0;;;41643:128:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;41784:16:0;::::1;;::::0;;;:8:::1;:16;::::0;;;;;::::1;;:47:::0;::::1;;;-1:-1:-1::0;41822:9:0::1;::::0;;::::1;-1:-1:-1::0;;;41822:9:0;::::1;::::0;::::1;::::0;;41806:12:::1;::::0;41804:14:::1;::::0;-1:-1:-1;;;41804:14:0;::::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:27;;;;41784:47;41780:94;;;-1:-1:-1::0;;;;;41842:16:0;::::1;41861:5;41842:16:::0;;;:8:::1;:16;::::0;;;;:24;;-1:-1:-1;;41842:24:0::1;::::0;;41780:94:::1;41887:21;::::0;-1:-1:-1;;;;;41887:21:0;::::1;::::0;::::1;::::0;;;::::1;41532:382:::0;;;:::o;40595:405::-;44461:36;-1:-1:-1;;;;;;;;;;;17666:10:0;25854:139;:::i;44461:36::-;44453:89;;;;-1:-1:-1;;;44453:89:0;;;;;;;:::i;:::-;40734:1:::1;40718:12;:17;;;;40710:68;;;::::0;-1:-1:-1;;;40710:68:0;;15735:2:1;40710:68:0::1;::::0;::::1;15717:21:1::0;15774:2;15754:18;;;15747:30;15813:34;15793:18;;;15786:62;-1:-1:-1;;;15864:18:1;;;15857:36;15910:19;;40710:68:0::1;15707:228:1::0;40710:68:0::1;40819:30;::::0;-1:-1:-1;;;;;;7701:3:1;7679:16;;;7675:36;40819:30:0::1;::::0;::::1;7663:49:1::0;40801:62:0::1;::::0;7728:11:1;;40819:30:0::1;7653:92:1::0;40801:62:0::1;40785:134;;;;-1:-1:-1::0;;;40785:134:0::1;;;;;;;:::i;:::-;40926:9;:24:::0;;-1:-1:-1;;;;40926:24:0::1;-1:-1:-1::0;;;40926:24:0::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;40964:30:::1;::::0;19711:36:1;;;40964:30:0::1;::::0;19699:2:1;19684:18;40964:30:0::1;;;;;;;40595:405:::0;;;:::o;43404:130::-;42991:5;;-1:-1:-1;;;;;42991:5:0;17666:10;42991:21;42983:66;;;;-1:-1:-1;;;42983:66:0;;;;;;;:::i;:::-;43485:5:::1;::::0;43464:39:::1;::::0;43500:1:::1;::::0;-1:-1:-1;;;;;43485:5:0::1;::::0;43464:39:::1;::::0;43500:1;;43464:39:::1;43510:5;:18:::0;;-1:-1:-1;;;;;;43510:18:0::1;::::0;;43404:130::o;44034:222::-;44101:8;;-1:-1:-1;;;;;44101:8:0;17666:10;-1:-1:-1;;;;;44085:24:0;;44077:73;;;;-1:-1:-1;;;44077:73:0;;17676:2:1;44077:73:0;;;17658:21:1;17715:2;17695:18;;;17688:30;17754:34;17734:18;;;17727:62;-1:-1:-1;;;17805:18:1;;;17798:34;17849:19;;44077:73:0;17648:226:1;44077:73:0;44190:8;;44183:5;;44162:37;;-1:-1:-1;;;;;44190:8:0;;;;44183:5;;;;44162:37;;44190:8;;44162:37;44214:8;;;44206:5;:16;;-1:-1:-1;;;;;;44206:16:0;;;-1:-1:-1;;;;;44214:8:0;;44206:16;;;;44229:21;;;44034:222::o;25854:139::-;25932:4;25956:12;;;;;;;;;;;-1:-1:-1;;;;;25956:29:0;;;;;;;;;;;;;;;25854:139::o;44626:101::-;42991:5;;-1:-1:-1;;;;;42991:5:0;17666:10;42991:21;42983:66;;;;-1:-1:-1;;;42983:66:0;;;;;;;:::i;:::-;44688:33:::1;-1:-1:-1::0;;;;;;;;;;;44713:7:0::1;44688:9;:33::i;:::-;44626:101:::0;:::o;44802:105::-;42991:5;;-1:-1:-1;;;;;42991:5:0;17666:10;42991:21;42983:66;;;;-1:-1:-1;;;42983:66:0;;;;;;;:::i;:::-;44867:34:::1;-1:-1:-1::0;;;;;;;;;;;44893:7:0::1;44867:10;:34::i;42542:132::-:0;42991:5;;-1:-1:-1;;;;;42991:5:0;17666:10;42991:21;42983:66;;;;-1:-1:-1;;;42983:66:0;;;;;;;:::i;:::-;42628:17:::1;:40:::0;42542:132::o;45948:232::-;1712:1;2309:7;;:19;;2301:63;;;;-1:-1:-1;;;2301:63:0;;17316:2:1;2301:63:0;;;17298:21:1;17355:2;17335:18;;;17328:30;17394:33;17374:18;;;17367:61;17445:18;;2301:63:0;17288:181:1;2301:63:0;1712:1;2442:7;:18;44461:36:::1;-1:-1:-1::0;;;;;;;;;;;17666:10:0;25854:139;:::i;44461:36::-:1;44453:89;;;;-1:-1:-1::0;;;44453:89:0::1;;;;;;;:::i;:::-;46126:48:::2;46132:4;46138:8;46148:6;46156:5;46163:10;;46126:5;:48::i;:::-;-1:-1:-1::0;;1668:1:0;2621:22;;-1:-1:-1;;;;45948:232:0:o;27633:149::-;26922:7;26949:12;;;;;;;;;;:22;;;25423:30;25434:4;17666:10;25423;:30::i;:::-;27748:26:::1;27760:4;27766:7;27748:11;:26::i;41090:393::-:0;44461:36;-1:-1:-1;;;;;;;;;;;17666:10:0;25854:139;:::i;44461:36::-;44453:89;;;;-1:-1:-1;;;44453:89:0;;;;;;;:::i;:::-;41232:24:::1;::::0;-1:-1:-1;;;;;;5342:2:1;5338:15;;;5334:53;41232:24:0::1;::::0;::::1;5322:66:1::0;41214:56:0::1;::::0;5404:12:1;;41232:24:0::1;5312:110:1::0;41214:56:0::1;41198:128;;;;-1:-1:-1::0;;;41198:128:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;41339:20:0;::::1;::::0;;::::1;::::0;:41:::1;;-1:-1:-1::0;;;;;;41364:16:0;::::1;;::::0;;;:8:::1;:16;::::0;;;;;::::1;;41363:17;41339:41;41335:110;;;-1:-1:-1::0;;;;;41391:16:0;::::1;;::::0;;;:8:::1;:16;::::0;;;;:23;;-1:-1:-1;;41391:23:0::1;41410:4;41391:23;::::0;;41423:12:::1;:14:::0;;-1:-1:-1;;;41423:14:0;::::1;41391:23;41423:14;::::0;:12:::1;:14;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;41335:110;41458:19;::::0;-1:-1:-1;;;;;41458:19:0;::::1;::::0;::::1;::::0;;;::::1;41090:393:::0;;;:::o;44973:118::-;45034:4;45054:31;-1:-1:-1;;;;;;;;;;;45077:7:0;45054;:31::i;43706:251::-;42991:5;;-1:-1:-1;;;;;42991:5:0;17666:10;42991:21;42983:66;;;;-1:-1:-1;;;42983:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43786:23:0;::::1;43778:68;;;::::0;-1:-1:-1;;;43778:68:0;;14971:2:1;43778:68:0::1;::::0;::::1;14953:21:1::0;;;14990:18;;;14983:30;15049:34;15029:18;;;15022:62;15101:18;;43778:68:0::1;14943:182:1::0;43778:68:0::1;43874:5;::::0;-1:-1:-1;;;;;43861:18:0;;::::1;43874:5:::0;::::1;43861:18;;43853:71;;;::::0;-1:-1:-1;;;43853:71:0;;11737:2:1;43853:71:0::1;::::0;::::1;11719:21:1::0;11776:2;11756:18;;;11749:30;11815:34;11795:18;;;11788:62;-1:-1:-1;;;11866:18:1;;;11859:38;11914:19;;43853:71:0::1;11709:230:1::0;43853:71:0::1;43931:8;:20:::0;;-1:-1:-1;;;;;;43931:20:0::1;-1:-1:-1::0;;;;;43931:20:0;;;::::1;::::0;;;::::1;::::0;;43706:251::o;47487:617::-;47584:4;47597:9;47609:30;:5;36707:58;;6417:66:1;36707:58:0;;;6405:79:1;6500:12;;;6493:28;;;36574:7:0;;6537:12:1;;36707:58:0;;;;;;;;;;;;36697:69;;;;;;36690:76;;36505:269;;;;47609:30;47597:42;-1:-1:-1;47646:18:0;;;47716:290;47740:11;:18;47736:1;:22;47716:290;;;47790:26;47801:11;47813:1;47801:14;;;;;;-1:-1:-1;;;47801:14:0;;;;;;;;;;;;;;;47790:1;:9;;:26;;;;:::i;:::-;47774:42;;47848:10;-1:-1:-1;;;;;47831:27:0;:13;-1:-1:-1;;;;;47831:27:0;;47827:66;;47878:5;47871:12;;;;;;;;47827:66;-1:-1:-1;;;;;47906:23:0;;;;;;:8;:23;;;;;;;;47901:63;;47949:5;47942:12;;;;;;;;47901:63;47985:13;47972:26;;47760:3;;;;;:::i;:::-;;;;47716:290;;;-1:-1:-1;48039:9:0;;48018:18;;-1:-1:-1;;;48039:9:0;;;;;-1:-1:-1;48014:65:0;;;48066:5;48059:12;;;;;;;48014:65;-1:-1:-1;48094:4:0;;47487:617;-1:-1:-1;;;;;47487:617:0:o;14028:205::-;14156:68;;-1:-1:-1;;;;;8216:15:1;;;14156:68:0;;;8198:34:1;8268:15;;8248:18;;;8241:43;8300:18;;;8293:34;;;14129:96:0;;14149:5;;-1:-1:-1;;;14179:27:0;8133:18:1;;14156:68:0;;;;-1:-1:-1;;14156:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;14156:68:0;-1:-1:-1;;;;;;14156:68:0;;;;;;;;;;14129:19;:96::i;:::-;14028:205;;;;:::o;26283:384::-;26363:22;26371:4;26377:7;26363;:22::i;:::-;26359:301;;26495:41;26523:7;-1:-1:-1;;;;;26495:41:0;26533:2;26495:19;:41::i;:::-;26593:38;26621:4;26628:2;26593:19;:38::i;:::-;26416:230;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;26416:230:0;;;;;;;;;;-1:-1:-1;;;26402:246:0;;;;;;;:::i;29537:229::-;29612:22;29620:4;29626:7;29612;:22::i;:::-;29607:152;;29651:6;:12;;;;;;;;;;;-1:-1:-1;;;;;29651:29:0;;;;;;;;;:36;;-1:-1:-1;;29651:36:0;29683:4;29651:36;;;29734:12;17666:10;;17586:98;29734:12;-1:-1:-1;;;;;29707:40:0;29725:7;-1:-1:-1;;;;;29707:40:0;29719:4;29707:40;;;;;;;;;;29537:229;;:::o;29774:230::-;29849:22;29857:4;29863:7;29849;:22::i;:::-;29845:152;;;29920:5;29888:12;;;;;;;;;;;-1:-1:-1;;;;;29888:29:0;;;;;;;;;;:37;;-1:-1:-1;;29888:37:0;;;29945:40;17666:10;;29888:12;;29945:40;;29920:5;29945:40;29774:230;;:::o;46278:1033::-;-1:-1:-1;;;;;46440:22:0;;46432:73;;;;-1:-1:-1;;;46432:73:0;;;;;;;:::i;:::-;46529:8;;46520:6;:17;46512:66;;;;-1:-1:-1;;;46512:66:0;;16500:2:1;46512:66:0;;;16482:21:1;16539:2;16519:18;;;16512:30;16578:34;16558:18;;;16551:62;-1:-1:-1;;;16629:18:1;;;16622:34;16673:19;;46512:66:0;16472:226:1;46512:66:0;46619:47;;-1:-1:-1;;;;;;5710:2:1;5706:15;;;5702:24;;46619:47:0;;;5690:37:1;5761:15;;;5757:24;5743:12;;;5736:46;5798:12;;;5791:28;;;5835:12;;;5828:28;;;46601:80:0;;5872:13:1;;46619:47:0;5630:261:1;46601:80:0;46585:152;;;;-1:-1:-1;;;46585:152:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46753:21:0;;;;;;:15;:21;;;;;;;;:28;;;;;;;;;;;46752:29;46744:95;;;;-1:-1:-1;;;46744:95:0;;12506:2:1;46744:95:0;;;12488:21:1;12545:2;12525:18;;;12518:30;12584:34;12564:18;;;12557:62;-1:-1:-1;;;12635:18:1;;;12628:51;12696:19;;46744:95:0;12478:243:1;46744:95:0;-1:-1:-1;;;;;46914:21:0;;;;;;:15;:21;;;;;;;;:28;;;;;;;;:35;;-1:-1:-1;;46914:35:0;46945:4;46914:35;;;47065:8;;47042:19;:31;;47065:8;;47042:19;;:31;;47065:8;;47042:31;:::i;:::-;;;;-1:-1:-1;;47116:8:0;;47080:24;;47107:17;;:6;:17;:::i;:::-;47153:3;;47080:44;;-1:-1:-1;47153:44:0;;-1:-1:-1;;;;;47153:3:0;47170:8;47080:44;47153:16;:44::i;:::-;47221:12;;47235:8;;47204:3;;:40;;-1:-1:-1;;;;;47204:3:0;;;;47221:12;;;47204:16;:40::i;:::-;47281:16;47273:6;47263:8;-1:-1:-1;;;;;47258:47:0;;47299:5;47258:47;;;;8955:25:1;;8943:2;8928:18;;8910:76;47258:47:0;;;;;;;;46278:1033;;;;;;;:::o;33142:1492::-;33220:7;33297:9;33317;33337:7;33557:9;:16;33577:2;33557:22;33553:1032;;;-1:-1:-1;;;33844:4:0;33829:20;;33823:27;33894:4;33879:20;;33873:27;33952:4;33937:20;;33931:27;33928:1;33923:36;33799:175;;;33995:9;:16;34015:2;33995:22;33991:594;;;-1:-1:-1;;;34287:4:0;34272:20;;34266:27;34337:4;34322:20;;34316:27;;-1:-1:-1;;;;;34366:75:0;;;34472:3;34468:12;34482:2;34464:21;34237:263;;;34532:41;;-1:-1:-1;;;34532:41:0;;12146:2:1;34532:41:0;;;12128:21:1;12185:2;12165:18;;;12158:30;12224:33;12204:18;;;12197:61;12275:18;;34532:41:0;12118:181:1;33991:594:0;34604:22;34612:4;34618:1;34621;34624;34604:7;:22::i;:::-;34597:29;33142:1492;-1:-1:-1;;;;;;33142:1492:0:o;16277:761::-;16701:23;16727:69;16755:4;16727:69;;;;;;;;;;;;;;;;;16735:5;-1:-1:-1;;;;;16727:27:0;;;:69;;;;;:::i;:::-;16811:17;;16701:95;;-1:-1:-1;16811:21:0;16807:224;;16953:10;16942:30;;;;;;;;;;;;:::i;:::-;16934:85;;;;-1:-1:-1;;;16934:85:0;;16905:2:1;16934:85:0;;;16887:21:1;16944:2;16924:18;;;16917:30;16983:34;16963:18;;;16956:62;-1:-1:-1;;;17034:18:1;;;17027:40;17084:19;;16934:85:0;16877:232:1;19459:447:0;19534:13;19560:19;19592:10;19596:6;19592:1;:10;:::i;:::-;:14;;19605:1;19592:14;:::i;:::-;19582:25;;;;;;-1:-1:-1;;;19582:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19582:25:0;;19560:47;;-1:-1:-1;;;19618:6:0;19625:1;19618:9;;;;;;-1:-1:-1;;;19618:9:0;;;;;;;;;;;;:15;-1:-1:-1;;;;;19618:15:0;;;;;;;;;-1:-1:-1;;;19644:6:0;19651:1;19644:9;;;;;;-1:-1:-1;;;19644:9:0;;;;;;;;;;;;:15;-1:-1:-1;;;;;19644:15:0;;;;;;;;-1:-1:-1;19675:9:0;19687:10;19691:6;19687:1;:10;:::i;:::-;:14;;19700:1;19687:14;:::i;:::-;19675:26;;19670:131;19707:1;19703;:5;19670:131;;;-1:-1:-1;;;19751:5:0;19759:3;19751:11;19742:21;;;;;-1:-1:-1;;;19742:21:0;;;;;;;;;;;;19730:6;19737:1;19730:9;;;;;;-1:-1:-1;;;19730:9:0;;;;;;;;;;;;:33;-1:-1:-1;;;;;19730:33:0;;;;;;;;-1:-1:-1;19788:1:0;19778:11;;;;;19710:3;;;:::i;:::-;;;19670:131;;;-1:-1:-1;19819:10:0;;19811:55;;;;-1:-1:-1;;;19811:55:0;;10559:2:1;19811:55:0;;;10541:21:1;;;10578:18;;;10571:30;10637:34;10617:18;;;10610:62;10689:18;;19811:55:0;10531:182:1;19811:55:0;19891:6;19459:447;-1:-1:-1;;;19459:447:0:o;13843:177::-;13953:58;;-1:-1:-1;;;;;8530:32:1;;13953:58:0;;;8512:51:1;8579:18;;;8572:34;;;13926:86:0;;13946:5;;-1:-1:-1;;;13976:23:0;8485:18:1;;13953:58:0;8467:145:1;34773:1432:0;34858:7;35783:66;35769:80;;;35761:127;;;;-1:-1:-1;;;35761:127:0;;14161:2:1;35761:127:0;;;14143:21:1;14200:2;14180:18;;;14173:30;14239:34;14219:18;;;14212:62;-1:-1:-1;;;14290:18:1;;;14283:32;14332:19;;35761:127:0;14133:224:1;35761:127:0;35907:1;:7;;35912:2;35907:7;:18;;;;35918:1;:7;;35923:2;35918:7;35907:18;35899:65;;;;-1:-1:-1;;;35899:65:0;;15332:2:1;35899:65:0;;;15314:21:1;15371:2;15351:18;;;15344:30;15410:34;15390:18;;;15383:62;-1:-1:-1;;;15461:18:1;;;15454:32;15503:19;;35899:65:0;15304:224:1;35899:65:0;36079:24;;;36062:14;36079:24;;;;;;;;;9218:25:1;;;9291:4;9279:17;;9259:18;;;9252:45;;;;9313:18;;;9306:34;;;9356:18;;;9349:34;;;36079:24:0;;9190:19:1;;36079:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36079:24:0;;-1:-1:-1;;36079:24:0;;;-1:-1:-1;;;;;;;36122:20:0;;36114:57;;;;-1:-1:-1;;;36114:57:0;;10206:2:1;36114:57:0;;;10188:21:1;10245:2;10225:18;;;10218:30;10284:26;10264:18;;;10257:54;10328:18;;36114:57:0;10178:174:1;36114:57:0;36191:6;34773:1432;-1:-1:-1;;;;;34773:1432:0:o;8974:195::-;9077:12;9109:52;9131:6;9139:4;9145:1;9148:12;9109:21;:52::i;:::-;9102:59;8974:195;-1:-1:-1;;;;8974:195:0:o;10026:530::-;10153:12;10211:5;10186:21;:30;;10178:81;;;;-1:-1:-1;;;10178:81:0;;14564:2:1;10178:81:0;;;14546:21:1;14603:2;14583:18;;;14576:30;14642:34;14622:18;;;14615:62;-1:-1:-1;;;14693:18:1;;;14686:36;14739:19;;10178:81:0;14536:228:1;10178:81:0;6423:20;;10270:60;;;;-1:-1:-1;;;10270:60:0;;16142:2:1;10270:60:0;;;16124:21:1;16181:2;16161:18;;;16154:30;16220:31;16200:18;;;16193:59;16269:18;;10270:60:0;16114:179:1;10270:60:0;10404:12;10418:23;10445:6;-1:-1:-1;;;;;10445:11:0;10465:5;10473:4;10445:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10403:75;;;;10496:52;10514:7;10523:10;10535:12;10496:17;:52::i;:::-;10489:59;10026:530;-1:-1:-1;;;;;;;10026:530:0:o;12566:742::-;12681:12;12710:7;12706:595;;;-1:-1:-1;12741:10:0;12734:17;;12706:595;12855:17;;:21;12851:439;;13118:10;13112:17;13179:15;13166:10;13162:2;13158:19;13151:44;13066:148;13261:12;13254:20;;-1:-1:-1;;;13254:20:0;;;;;;;;:::i;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:402::-;262:8;272:6;326:3;319:4;311:6;307:17;303:27;293:2;;351:8;341;334:26;293:2;-1:-1:-1;381:20:1;;424:18;413:30;;410:2;;;463:8;453;446:26;410:2;507:4;499:6;495:17;483:29;;567:3;560:4;550:6;547:1;543:14;535:6;531:27;527:38;524:47;521:2;;;584:1;581;574:12;521:2;283:311;;;;;:::o;599:196::-;658:6;711:2;699:9;690:7;686:23;682:32;679:2;;;732:6;724;717:22;679:2;760:29;779:9;760:29;:::i;800:761::-;933:6;941;949;957;965;973;1026:3;1014:9;1005:7;1001:23;997:33;994:2;;;1048:6;1040;1033:22;994:2;1076:29;1095:9;1076:29;:::i;:::-;1066:39;;1124:38;1158:2;1147:9;1143:18;1124:38;:::i;:::-;1114:48;;1209:2;1198:9;1194:18;1181:32;1171:42;;1260:2;1249:9;1245:18;1232:32;1222:42;;1315:3;1304:9;1300:19;1287:33;1343:18;1335:6;1332:30;1329:2;;;1380:6;1372;1365:22;1329:2;1424:77;1493:7;1484:6;1473:9;1469:22;1424:77;:::i;:::-;984:577;;;;-1:-1:-1;984:577:1;;-1:-1:-1;984:577:1;;1520:8;;984:577;-1:-1:-1;;;984:577:1:o;1566:549::-;1672:6;1680;1688;1741:2;1729:9;1720:7;1716:23;1712:32;1709:2;;;1762:6;1754;1747:22;1709:2;1790:29;1809:9;1790:29;:::i;:::-;1780:39;;1870:2;1859:9;1855:18;1842:32;1897:18;1889:6;1886:30;1883:2;;;1934:6;1926;1919:22;1883:2;1978:77;2047:7;2038:6;2027:9;2023:22;1978:77;:::i;:::-;1699:416;;2074:8;;-1:-1:-1;1952:103:1;;-1:-1:-1;;;;1699:416:1:o;2120:264::-;2188:6;2196;2249:2;2237:9;2228:7;2224:23;2220:32;2217:2;;;2270:6;2262;2255:22;2217:2;2298:29;2317:9;2298:29;:::i;:::-;2288:39;2374:2;2359:18;;;;2346:32;;-1:-1:-1;;;2207:177:1:o;2389:332::-;2466:6;2474;2482;2535:2;2523:9;2514:7;2510:23;2506:32;2503:2;;;2556:6;2548;2541:22;2503:2;2584:29;2603:9;2584:29;:::i;:::-;2574:39;2660:2;2645:18;;2632:32;;-1:-1:-1;2711:2:1;2696:18;;;2683:32;;2493:228;-1:-1:-1;;;2493:228:1:o;2726:297::-;2793:6;2846:2;2834:9;2825:7;2821:23;2817:32;2814:2;;;2867:6;2859;2852:22;2814:2;2904:9;2898:16;2957:5;2950:13;2943:21;2936:5;2933:32;2923:2;;2984:6;2976;2969:22;3028:190;3087:6;3140:2;3128:9;3119:7;3115:23;3111:32;3108:2;;;3161:6;3153;3146:22;3108:2;-1:-1:-1;3189:23:1;;3098:120;-1:-1:-1;3098:120:1:o;3223:264::-;3291:6;3299;3352:2;3340:9;3331:7;3327:23;3323:32;3320:2;;;3373:6;3365;3358:22;3320:2;3414:9;3401:23;3391:33;;3443:38;3477:2;3466:9;3462:18;3443:38;:::i;:::-;3433:48;;3310:177;;;;;:::o;3492:306::-;3550:6;3603:2;3591:9;3582:7;3578:23;3574:32;3571:2;;;3624:6;3616;3609:22;3571:2;3655:23;;-1:-1:-1;;;;;;3707:32:1;;3697:43;;3687:2;;3759:6;3751;3744:22;3998:543;4104:6;4112;4120;4173:2;4161:9;4152:7;4148:23;4144:32;4141:2;;;4194:6;4186;4179:22;4141:2;4235:9;4222:23;4212:33;;4296:2;4285:9;4281:18;4268:32;4323:18;4315:6;4312:30;4309:2;;;4360:6;4352;4345:22;4546:642;4650:6;4658;4666;4719:2;4707:9;4698:7;4694:23;4690:32;4687:2;;;4740:6;4732;4725:22;4687:2;4784:9;4771:23;4834:4;4827:5;4823:16;4816:5;4813:27;4803:2;;4859:6;4851;4844:22;5896:274;6025:3;6063:6;6057:13;6079:53;6125:6;6120:3;6113:4;6105:6;6101:17;6079:53;:::i;:::-;6148:16;;;;;6033:137;-1:-1:-1;;6033:137:1:o;6560:786::-;6971:25;6966:3;6959:38;6941:3;7026:6;7020:13;7042:62;7097:6;7092:2;7087:3;7083:12;7076:4;7068:6;7064:17;7042:62;:::i;:::-;-1:-1:-1;;;7163:2:1;7123:16;;;7155:11;;;7148:40;7213:13;;7235:63;7213:13;7284:2;7276:11;;7269:4;7257:17;;7235:63;:::i;:::-;7318:17;7337:2;7314:26;;6949:397;-1:-1:-1;;;;6949:397:1:o;9616:383::-;9765:2;9754:9;9747:21;9728:4;9797:6;9791:13;9840:6;9835:2;9824:9;9820:18;9813:34;9856:66;9915:6;9910:2;9899:9;9895:18;9890:2;9882:6;9878:15;9856:66;:::i;:::-;9983:2;9962:15;-1:-1:-1;;9958:29:1;9943:45;;;;9990:2;9939:54;;9737:262;-1:-1:-1;;9737:262:1:o;10718:404::-;10920:2;10902:21;;;10959:2;10939:18;;;10932:30;10998:34;10993:2;10978:18;;10971:62;-1:-1:-1;;;11064:2:1;11049:18;;11042:38;11112:3;11097:19;;10892:230::o;13133:402::-;13335:2;13317:21;;;13374:2;13354:18;;;13347:30;13413:34;13408:2;13393:18;;13386:62;-1:-1:-1;;;13479:2:1;13464:18;;13457:36;13525:3;13510:19;;13307:228::o;17879:356::-;18081:2;18063:21;;;18100:18;;;18093:30;18159:34;18154:2;18139:18;;18132:62;18226:2;18211:18;;18053:182::o;18240:402::-;18442:2;18424:21;;;18481:2;18461:18;;;18454:30;18520:34;18515:2;18500:18;;18493:62;-1:-1:-1;;;18586:2:1;18571:18;;18564:36;18632:3;18617:19;;18414:228::o;19758:275::-;19829:2;19823:9;19894:2;19875:13;;-1:-1:-1;;19871:27:1;19859:40;;19929:18;19914:34;;19950:22;;;19911:62;19908:2;;;19976:18;;:::i;:::-;20012:2;20005:22;19803:230;;-1:-1:-1;19803:230:1:o;20038:128::-;20078:3;20109:1;20105:6;20102:1;20099:13;20096:2;;;20115:18;;:::i;:::-;-1:-1:-1;20151:9:1;;20086:80::o;20171:168::-;20211:7;20277:1;20273;20269:6;20265:14;20262:1;20259:21;20254:1;20247:9;20240:17;20236:45;20233:2;;;20284:18;;:::i;:::-;-1:-1:-1;20324:9:1;;20223:116::o;20344:125::-;20384:4;20412:1;20409;20406:8;20403:2;;;20417:18;;:::i;:::-;-1:-1:-1;20454:9:1;;20393:76::o;20474:1426::-;20610:9;20644:18;20685:2;20677:6;20674:14;20671:2;;;20691:18;;:::i;:::-;20737:6;20734:1;20730:14;20763:4;20787:28;20811:2;20807;20803:11;20787:28;:::i;:::-;20849:19;;;20884:12;;;;20916:5;20952:14;20936;;;20933:34;20930:2;;;20988:9;20977;20970:28;20930:2;21018:9;21009:18;;21036:831;21050:6;21047:1;21044:13;21036:831;;;21131:3;21118:17;21167:2;21154:11;21151:19;21148:2;;;21191:9;21180;21173:28;21148:2;21226:23;;21272:4;21316:14;21303:11;;;21299:32;21289:2;;21353:9;21342;21335:28;21289:2;21401;21388:16;21427:2;21423;21420:10;21417:2;;;21433:18;;:::i;:::-;21479:51;21503:11;;;-1:-1:-1;;21499:25:1;21495:34;;21479:51;:::i;:::-;21466:64;;21557:2;21550:5;21543:17;21601:14;21596:2;21591;21587;21583:11;21579:20;21576:40;21573:2;;;21637:9;21626;21619:28;21573:2;21704;21699;21695;21691:11;21686:2;21679:5;21675:14;21662:45;21731:14;;21727:23;;21720:42;;;21775:18;;-1:-1:-1;21072:1:1;21065:9;;;;;21813:12;;;;21845;;21036:831;;;-1:-1:-1;21889:5:1;20624:1276;-1:-1:-1;;;;;;;20624:1276:1:o;21905:258::-;21977:1;21987:113;22001:6;21998:1;21995:13;21987:113;;;22077:11;;;22071:18;22058:11;;;22051:39;22023:2;22016:10;21987:113;;;22118:6;22115:1;22112:13;22109:2;;;-1:-1:-1;;22153:1:1;22135:16;;22128:27;21958:205::o;22168:136::-;22207:3;22235:5;22225:2;;22244:18;;:::i;:::-;-1:-1:-1;;;22280:18:1;;22215:89::o;22309:178::-;22346:3;22390:4;22383:5;22379:16;22414:7;22404:2;;22425:18;;:::i;:::-;-1:-1:-1;;22461:20:1;;22354:133;-1:-1:-1;;22354:133:1:o;22492:135::-;22531:3;-1:-1:-1;;22552:17:1;;22549:2;;;22572:18;;:::i;:::-;-1:-1:-1;22619:1:1;22608:13;;22539:88::o;22632:175::-;22669:3;22713:4;22706:5;22702:16;22742:4;22733:7;22730:17;22727:2;;;22750:18;;:::i;:::-;22799:1;22786:15;;22677:130;-1:-1:-1;;22677:130:1:o;22812:127::-;22873:10;22868:3;22864:20;22861:1;22854:31;22904:4;22901:1;22894:15;22928:4;22925:1;22918:15;22944:127;23005:10;23000:3;22996:20;22993:1;22986:31;23036:4;23033:1;23026:15;23060:4;23057:1;23050:15
Swarm Source
ipfs://3e369cb60ebb63a375131f49431293e36bb91f2dc8e34bc2745348f3bcba4b68
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 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.