Contract
0xd23b4da264a756f427e13c72ab6ca5a6c95e4608
3
Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x55Be05ecC1c417B16163b000CB71DcE8526a5D06
Contract Name:
MainContract
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at FtmScan.com on 2021-12-28 */ // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @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); } // OpenZeppelin Contracts v4.4.0 (utils/Context.sol) /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // OpenZeppelin Contracts v4.4.0 (utils/Strings.sol) /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "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] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol) /** * @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); } // OpenZeppelin Contracts v4.4.0 (token/ERC20/utils/SafeERC20.sol) // OpenZeppelin Contracts v4.4.0 (utils/Address.sol) /** * @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; 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"); (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"); (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"); (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"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // 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 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' 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 require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // OpenZeppelin Contracts v4.4.0 (access/AccessControl.sol) // OpenZeppelin Contracts v4.4.0 (access/IAccessControl.sol) /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @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 {AccessControl-_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 Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @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) external; /** * @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) external; /** * @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) external; } // OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol) /** * @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 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 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]{40}) is missing role (0x[0-9a-f]{64})$/ * * _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]{40}) is missing role (0x[0-9a-f]{64})$/ */ 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 revoked `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}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ 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 { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // OpenZeppelin Contracts v4.4.0 (security/Pausable.sol) /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } contract ECDSAOffsetRecovery { function getHashPacked( address user, uint256 amountWithFee, bytes32 originalTxHash, uint256 blockchainNum ) public pure returns (bytes32) { return keccak256(abi.encodePacked(user, amountWithFee, originalTxHash, blockchainNum)); } function toEthSignedMessageHash(bytes32 hash) public 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) ); } function ecOffsetRecover( bytes32 hash, bytes memory signature, uint256 offset ) public pure returns (address) { bytes32 r; bytes32 s; uint8 v; // Divide the signature in r, s and v variables with inline assembly. assembly { r := mload(add(signature, add(offset, 0x20))) s := mload(add(signature, add(offset, 0x40))) v := byte(0, mload(add(signature, add(offset, 0x60)))) } // Version of signature should be 27 or 28, but 0 and 1 are also possible versions if (v < 27) { v += 27; } // If the version is correct return the signer address if (v != 27 && v != 28) { return (address(0)); } // bytes memory prefix = "\x19Ethereum Signed Message:\n32"; // hash = keccak256(abi.encodePacked(prefix, hash)); // solium-disable-next-line arg-overflow return ecrecover(toEthSignedMessageHash(hash), v, r, s); } } /// @title Contains 512-bit math functions /// @notice Facilitates multiplication and division that can have overflow of an intermediate value without any loss of precision /// @dev Handles "phantom overflow" i.e., allows multiplication and division where an intermediate value overflows 256 bits library FullMath { /// @notice Calculates floor(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 /// @param a The multiplicand /// @param b The multiplier /// @param denominator The divisor /// @return result The 256-bit result /// @dev Credit to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv function mulDiv( uint256 a, uint256 b, uint256 denominator ) internal pure returns (uint256 result) { // 512-bit multiply [prod1 prod0] = a * b // Compute the product mod 2**256 and mod 2**256 - 1 // then use the Chinese Remainder Theorem to reconstruct // the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2**256 + prod0 uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(a, b, not(0)) prod0 := mul(a, b) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division if (prod1 == 0) { require(denominator > 0); assembly { result := div(prod0, denominator) } return result; } // Make sure the result is less than 2**256. // Also prevents denominator == 0 require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0] // Compute remainder using mulmod uint256 remainder; assembly { remainder := mulmod(a, b, denominator) } // Subtract 256 bit number from 512 bit number assembly { prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator // Compute largest power of two divisor of denominator. // Always >= 1. uint256 twos = (type(uint256).max - denominator + 1) & denominator; // Divide denominator by power of two assembly { denominator := div(denominator, twos) } // Divide [prod1 prod0] by the factors of two assembly { prod0 := div(prod0, twos) } // Shift in bits from prod1 into prod0. For this we need // to flip `twos` such that it is 2**256 / twos. // If twos is zero, then it becomes one assembly { twos := add(div(sub(0, twos), twos), 1) } prod0 |= prod1 * twos; // Invert denominator mod 2**256 // Now that denominator is an odd number, it has an inverse // modulo 2**256 such that denominator * inv = 1 mod 2**256. // Compute the inverse by starting with a seed that is correct // correct for four bits. That is, denominator * inv = 1 mod 2**4 uint256 inv = (3 * denominator) ^ 2; // Now use Newton-Raphson iteration to improve the precision. // Thanks to Hensel's lifting lemma, this also works in modular // arithmetic, doubling the correct bits in each step. inv *= 2 - denominator * inv; // inverse mod 2**8 inv *= 2 - denominator * inv; // inverse mod 2**16 inv *= 2 - denominator * inv; // inverse mod 2**32 inv *= 2 - denominator * inv; // inverse mod 2**64 inv *= 2 - denominator * inv; // inverse mod 2**128 inv *= 2 - denominator * inv; // inverse mod 2**256 // Because the division is now exact we can divide by multiplying // with the modular inverse of denominator. This will give us the // correct result modulo 2**256. Since the precoditions guarantee // that the outcome is less than 2**256, this is the final result. // We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inv; return result; } } abstract contract Storage is AccessControl, Pausable, ECDSAOffsetRecovery{ bytes32 public constant OWNER_ROLE = keccak256("OWNER_ROLE"); bytes32 public constant MANAGER_ROLE = keccak256("MANAGER_ROLE"); bytes32 public constant RELAYER_ROLE = keccak256("RELAYER_ROLE"); bytes32 public constant VALIDATOR_ROLE = keccak256("VALIDATOR_ROLE"); uint128 public numOfThisBlockchain; address public blockchainRouter; mapping(uint256 => bytes32) public RubicAddresses; mapping(uint256 => bool) public existingOtherBlockchain; mapping(uint256 => uint256) public feeAmountOfBlockchain; mapping(uint256 => uint256) public blockchainCryptoFee; uint256 public constant SIGNATURE_LENGTH = 65; mapping(bytes32 => uint256) public processedTransactions; uint256 public minConfirmationSignatures = 3; uint256 public minTokenAmount; uint256 public maxTokenAmount; uint256 public maxGasPrice; uint256 public minConfirmationBlocks; uint256 public refundSlippage; uint256 public accTokenFee = 1; } abstract contract MainBase is Storage{ using Address for address payable; using SafeERC20 for IERC20; bytes32 internal constant IMPLEMENTATION_MAPPING_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; struct Implementation{ address router; address _address; } /** * @dev throws if transaction sender is not in owner role */ modifier onlyOwner() { require( hasRole(OWNER_ROLE, _msgSender()), "Caller is not in owner role" ); _; } /** * @dev throws if transaction sender is not in owner or manager role */ modifier onlyOwnerAndManager() { require( hasRole(OWNER_ROLE, _msgSender()) || hasRole(MANAGER_ROLE, _msgSender()), "Caller is not in owner or manager role" ); _; } /** * @dev throws if transaction sender is not in relayer role */ modifier onlyRelayer() { require( hasRole(RELAYER_ROLE, _msgSender()), "swapContract: Caller is not in relayer role" ); _; } modifier onlyOwnerAndManagerAndRelayer(){ require( hasRole(OWNER_ROLE, _msgSender()) || hasRole(MANAGER_ROLE, _msgSender()) || hasRole(RELAYER_ROLE, _msgSender()), "swapContract: not ownr mngr rlyr" ); _; } function getOtherBlockchainAvailableByNum(uint256 blockchain) external view returns (bool) { return existingOtherBlockchain[blockchain]; } /** * @dev Registers another blockchain for availability to swap * @param numOfOtherBlockchain number of blockchain */ function addOtherBlockchain(uint128 numOfOtherBlockchain) external onlyOwner { require( numOfOtherBlockchain != numOfThisBlockchain, "swapContract: Cannot add this blockchain to array of other blockchains" ); require( !existingOtherBlockchain[numOfOtherBlockchain], "swapContract: This blockchain is already added" ); existingOtherBlockchain[numOfOtherBlockchain] = true; } /** * @dev Unregisters another blockchain for availability to swap * @param numOfOtherBlockchain number of blockchain */ function removeOtherBlockchain(uint128 numOfOtherBlockchain) external onlyOwner { require( existingOtherBlockchain[numOfOtherBlockchain], "swapContract: This blockchain was not added" ); existingOtherBlockchain[numOfOtherBlockchain] = false; } /** * @dev Change existing blockchain id * @param oldNumOfOtherBlockchain number of existing blockchain * @param newNumOfOtherBlockchain number of new blockchain */ function changeOtherBlockchain( uint128 oldNumOfOtherBlockchain, uint128 newNumOfOtherBlockchain ) external onlyOwner { require( oldNumOfOtherBlockchain != newNumOfOtherBlockchain, "swapContract: Cannot change blockchains with same number" ); require( newNumOfOtherBlockchain != numOfThisBlockchain, "swapContract: Cannot add this blockchain to array of other blockchains" ); require( existingOtherBlockchain[oldNumOfOtherBlockchain], "swapContract: This blockchain was not added" ); require( !existingOtherBlockchain[newNumOfOtherBlockchain], "swapContract: This blockchain is already added" ); existingOtherBlockchain[oldNumOfOtherBlockchain] = false; existingOtherBlockchain[newNumOfOtherBlockchain] = true; } // FEE MANAGEMENT /** * @dev Sends collected crypto fee to the owner */ function collectCryptoFee(address toAddress) external onlyOwner { require(isRelayer(toAddress), 'swapContract: fee can be sent only to a relayer'); payable(toAddress).sendValue(address(this).balance); } /** * @dev Sends collected token fee to the owner */ function collectTokenFee() external onlyOwner { IERC20 _Rubic = IERC20(address(uint160(uint256(RubicAddresses[numOfThisBlockchain])))); _Rubic.safeTransfer( msg.sender, accTokenFee - 1 ); accTokenFee = 1; //GAS savings } /** * @dev Changes fee values for blockchains in feeAmountOfBlockchain variables * @notice fee is represented as hundredths of a bip, i.e. 1e-6 * @param _blockchainNum Existing number of blockchain * @param feeAmount Fee amount to substruct from transfer amount */ function setFeeAmountOfBlockchain(uint128 _blockchainNum, uint256 feeAmount) external onlyOwnerAndManager { feeAmountOfBlockchain[_blockchainNum] = feeAmount; } /** * @dev Changes crypto fee values for blockchains in blockchainCryptoFee variables * @param _blockchainNum Existing number of blockchain * @param feeAmount Fee amount that must be sent calling transferToOtherBlockchain */ function setCryptoFeeOfBlockchain(uint128 _blockchainNum, uint256 feeAmount) external onlyOwnerAndManagerAndRelayer { blockchainCryptoFee[_blockchainNum] = feeAmount; } /** * @dev Changes the address of Rubic in the certain blockchain * @param _blockchainNum Existing number of blockchain * @param _RubicAddress The Rubic address */ function setRubicAddressOfBlockchain( uint128 _blockchainNum, bytes32 _RubicAddress ) external onlyOwnerAndManager { RubicAddresses[_blockchainNum] = _RubicAddress; } /** * @dev Approves tokens to a swap Router. We can approve the most popular tokens before any swaps * To spare users from paying for it * @param _token The token address to approve */ function approveTokenToRouter(IERC20 _token, address _router) external onlyOwnerAndManager{ _token.approve(_router, type(uint256).max); } /** * @dev With this function owner, which is a multisig account, can withdraw some RBC from the pool * @param amount The amount to withdraw */ function poolBalancing(uint256 amount) external onlyOwner{ IERC20(address(uint160(uint256(RubicAddresses[numOfThisBlockchain])))).transfer(msg.sender, amount); } // VALIDATOR CONFIRMATIONS MANAGEMENT /** * @dev Changes requirement for minimal amount of signatures to validate on transfer * @param _minConfirmationSignatures Number of signatures to verify */ function setMinConfirmationSignatures(uint256 _minConfirmationSignatures) external onlyOwner { require( _minConfirmationSignatures > 0, "swapContract: At least 1 confirmation can be set" ); minConfirmationSignatures = _minConfirmationSignatures; } /** * @dev Changes requirement for minimal token amount on transfers * @param _minTokenAmount Amount of tokens */ function setMinTokenAmount(uint256 _minTokenAmount) external onlyOwnerAndManager { minTokenAmount = _minTokenAmount; } /** * @dev Changes requirement for maximum token amount on transfers * @param _maxTokenAmount Amount of tokens */ function setMaxTokenAmount(uint256 _maxTokenAmount) external onlyOwnerAndManager { maxTokenAmount = _maxTokenAmount; } /** * @dev Changes parameter of maximum gas price on which relayer nodes will operate * @param _maxGasPrice Price of gas in wei */ function setMaxGasPrice(uint256 _maxGasPrice) external onlyOwnerAndManager { require(_maxGasPrice > 0, "swapContract: Gas price cannot be zero"); maxGasPrice = _maxGasPrice; } /** * @dev Changes requirement for minimal amount of block to consider tx confirmed on validator * @param _minConfirmationBlocks Amount of blocks */ function setMinConfirmationBlocks(uint256 _minConfirmationBlocks) external onlyOwnerAndManager { minConfirmationBlocks = _minConfirmationBlocks; } function setRefundSlippage(uint256 _refundSlippage) external onlyOwnerAndManager { refundSlippage = _refundSlippage; } /** * @dev Transfers permissions of contract ownership. * Will setup new owner and one manager on contract. * Main purpose of this function is to transfer ownership from deployer account ot real owner * @param newOwner Address of new owner * @param newManager Address of new manager */ function transferOwnerAndSetManager(address newOwner, address newManager) external onlyOwner { require( newOwner != _msgSender(), "swapContract: New owner must be different than current" ); require( newOwner != address(0x0), "swapContract: Owner cannot be zero address" ); require( newManager != address(0x0), "swapContract: Owner cannot be zero address" ); _setupRole(DEFAULT_ADMIN_ROLE, newOwner); _setupRole(OWNER_ROLE, newOwner); _setupRole(MANAGER_ROLE, newManager); renounceRole(OWNER_ROLE, _msgSender()); renounceRole(DEFAULT_ADMIN_ROLE, _msgSender()); } /** * @dev Pauses transfers of tokens on contract */ function pauseExecution() external onlyOwner { _pause(); } /** * @dev Resumes transfers of tokens on contract */ function continueExecution() external onlyOwner { _unpause(); } /** * @dev Function to check if address is belongs to owner role * @param account Address to check */ function isOwner(address account) public view returns (bool) { return hasRole(OWNER_ROLE, account); } /** * @dev Function to check if address is belongs to manager role * @param account Address to check */ function isManager(address account) public view returns (bool) { return hasRole(MANAGER_ROLE, account); } /** * @dev Function to check if address is belongs to relayer role * @param account Address to check */ function isRelayer(address account) public view returns (bool) { return hasRole(RELAYER_ROLE, account); } /** * @dev Function to check if address is belongs to validator role * @param account Address to check * */ function isValidator(address account) public view returns (bool) { return hasRole(VALIDATOR_ROLE, account); } /** * @dev Function changes values associated with certain originalTxHash * @param originalTxHash Transaction hash to change * @param statusCode Associated status: 0-Not processed, 1-Processed, 2-Reverted */ function changeTxStatus( bytes32 originalTxHash, uint256 statusCode ) external onlyRelayer { require( statusCode != 0, "swapContract: you cannot set the statusCode to 0" ); require( processedTransactions[originalTxHash] != 1, "swapContract: transaction with this originalTxHash has already been set as succeed" ); processedTransactions[originalTxHash] = statusCode; } /** * @dev Plain fallback function to receive crypto */ receive() external payable {} } contract MainContract is MainBase{ constructor( uint128 _numOfThisBlockchain, uint128[] memory _numsOfOtherBlockchains, uint256[] memory tokenLimits, uint256 _maxGasPrice, uint256 _minConfirmationBlocks, uint256 _refundSlippage, bytes32[] memory _RubicAddresses ) { for (uint256 i = 0; i < _numsOfOtherBlockchains.length; i++) { require( _numsOfOtherBlockchains[i] != _numOfThisBlockchain, "swapContract: Number of this blockchain is in array of other blockchains" ); existingOtherBlockchain[_numsOfOtherBlockchains[i]] = true; } for (uint256 i = 0; i < _RubicAddresses.length; i++) { RubicAddresses[i + 1] = _RubicAddresses[i]; } require(_maxGasPrice > 0, "swapContract: Gas price cannot be zero"); numOfThisBlockchain = _numOfThisBlockchain; minTokenAmount = tokenLimits[0]; maxTokenAmount = tokenLimits[1]; maxGasPrice = _maxGasPrice; refundSlippage = _refundSlippage; minConfirmationBlocks = _minConfirmationBlocks; _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(OWNER_ROLE, _msgSender()); } function getStorageValue(bytes4 sig, bytes32 slot) internal view returns (Implementation storage impl) { assembly { // Store num in memory scratch space (note: lookup "free memory pointer" if you need to allocate space) mstore(0, sig) // Store slot number in scratch space after num mstore(32, slot) // Create hash from previously stored num and slot let hash := keccak256(0, 64) // Load mapping value using the just calculated hash impl.slot := hash } } function getInfoAboutSig(bytes4 sig, bytes32 slot) external view returns( address implementationAddress, address router ){ Implementation storage impl; assembly { // Store num in memory scratch space (note: lookup "free memory pointer" if you need to allocate space) mstore(0, sig) // Store slot number in scratch space after num mstore(32, slot) // Create hash from previously stored num and slot let hash := keccak256(0, 64) // Load mapping value using the just calculated hash impl.slot := hash } implementationAddress = impl._address; router = impl.router; } function addInstance( bytes4 sig, address _address, address _router ) external onlyOwner{ Implementation storage impl = getStorageValue(sig, IMPLEMENTATION_MAPPING_SLOT); impl._address = _address; impl.router = _router; IERC20(address(uint160(uint256(RubicAddresses[numOfThisBlockchain])))).approve( _router, type(uint256).max ); } function setRouter(bytes4 sig, address _router) external onlyOwnerAndManager{ require(_router != address(0), 'router cannot be zero'); Implementation storage impl = getStorageValue(sig, IMPLEMENTATION_MAPPING_SLOT); impl.router = _router; IERC20(address(uint160(uint256(RubicAddresses[numOfThisBlockchain])))).approve( _router, type(uint256).max ); } fallback() external payable{ Implementation storage impl = getStorageValue(msg.sig, IMPLEMENTATION_MAPPING_SLOT); address implementation = impl._address; blockchainRouter = impl.router; require(blockchainRouter != address(0), 'no instanceaAbb'); assembly{ // Copy msg.data. We take full control of memory in this inline assembly // block because it will not return to Solidity code. We overwrite the // Solidity scratch pad at memory position 0. calldatacopy(0, 0, calldatasize()) // Call the implementation. // out and outsize are 0 because we don't know the size yet. let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) // Copy the returned data. returndatacopy(0, 0, returndatasize()) switch result // delegatecall returns 0 on error. case 0 { revert(0, returndatasize()) } default { return(0, returndatasize()) } } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint128","name":"_numOfThisBlockchain","type":"uint128"},{"internalType":"uint128[]","name":"_numsOfOtherBlockchains","type":"uint128[]"},{"internalType":"uint256[]","name":"tokenLimits","type":"uint256[]"},{"internalType":"uint256","name":"_maxGasPrice","type":"uint256"},{"internalType":"uint256","name":"_minConfirmationBlocks","type":"uint256"},{"internalType":"uint256","name":"_refundSlippage","type":"uint256"},{"internalType":"bytes32[]","name":"_RubicAddresses","type":"bytes32[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OWNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RELAYER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"RubicAddresses","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SIGNATURE_LENGTH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accTokenFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"sig","type":"bytes4"},{"internalType":"address","name":"_address","type":"address"},{"internalType":"address","name":"_router","type":"address"}],"name":"addInstance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"numOfOtherBlockchain","type":"uint128"}],"name":"addOtherBlockchain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"address","name":"_router","type":"address"}],"name":"approveTokenToRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"blockchainCryptoFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blockchainRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"oldNumOfOtherBlockchain","type":"uint128"},{"internalType":"uint128","name":"newNumOfOtherBlockchain","type":"uint128"}],"name":"changeOtherBlockchain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"originalTxHash","type":"bytes32"},{"internalType":"uint256","name":"statusCode","type":"uint256"}],"name":"changeTxStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"toAddress","type":"address"}],"name":"collectCryptoFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectTokenFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"continueExecution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"offset","type":"uint256"}],"name":"ecOffsetRecover","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"existingOtherBlockchain","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"feeAmountOfBlockchain","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amountWithFee","type":"uint256"},{"internalType":"bytes32","name":"originalTxHash","type":"bytes32"},{"internalType":"uint256","name":"blockchainNum","type":"uint256"}],"name":"getHashPacked","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes4","name":"sig","type":"bytes4"},{"internalType":"bytes32","name":"slot","type":"bytes32"}],"name":"getInfoAboutSig","outputs":[{"internalType":"address","name":"implementationAddress","type":"address"},{"internalType":"address","name":"router","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockchain","type":"uint256"}],"name":"getOtherBlockchainAvailableByNum","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[{"internalType":"address","name":"account","type":"address"}],"name":"isManager","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isRelayer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isValidator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxGasPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokenAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minConfirmationBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minConfirmationSignatures","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minTokenAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numOfThisBlockchain","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseExecution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"poolBalancing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"processedTransactions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refundSlippage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"numOfOtherBlockchain","type":"uint128"}],"name":"removeOtherBlockchain","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":"uint128","name":"_blockchainNum","type":"uint128"},{"internalType":"uint256","name":"feeAmount","type":"uint256"}],"name":"setCryptoFeeOfBlockchain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_blockchainNum","type":"uint128"},{"internalType":"uint256","name":"feeAmount","type":"uint256"}],"name":"setFeeAmountOfBlockchain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxGasPrice","type":"uint256"}],"name":"setMaxGasPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTokenAmount","type":"uint256"}],"name":"setMaxTokenAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minConfirmationBlocks","type":"uint256"}],"name":"setMinConfirmationBlocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minConfirmationSignatures","type":"uint256"}],"name":"setMinConfirmationSignatures","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minTokenAmount","type":"uint256"}],"name":"setMinTokenAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_refundSlippage","type":"uint256"}],"name":"setRefundSlippage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"sig","type":"bytes4"},{"internalType":"address","name":"_router","type":"address"}],"name":"setRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_blockchainNum","type":"uint128"},{"internalType":"bytes32","name":"_RubicAddress","type":"bytes32"}],"name":"setRubicAddressOfBlockchain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"toEthSignedMessageHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"},{"internalType":"address","name":"newManager","type":"address"}],"name":"transferOwnerAndSetManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405260036008556001600e553480156200001b57600080fd5b5060405162003667380380620036678339810160408190526200003e916200047a565b6001805460ff1916905560005b86518110156200018f57876001600160801b03168782815181106200008057634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160801b031614156200011c5760405162461bcd60e51b815260206004820152604860248201527f73776170436f6e74726163743a204e756d626572206f66207468697320626c6f60448201527f636b636861696e20697320696e206172726179206f66206f7468657220626c6f606482015267636b636861696e7360c01b608482015260a4015b60405180910390fd5b6001600460008984815181106200014357634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160801b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055508080620001869062000617565b9150506200004b565b5060005b8151811015620001ff57818181518110620001be57634e487b7160e01b600052603260045260246000fd5b602002602001015160036000836001620001d99190620005fc565b815260208101919091526040016000205580620001f68162000617565b91505062000193565b5060008411620002615760405162461bcd60e51b815260206004820152602660248201527f73776170436f6e74726163743a204761732070726963652063616e6e6f74206260448201526565207a65726f60d01b606482015260840162000113565b60018054610100600160881b0319166101006001600160801b038a160217905584518590600090620002a357634e487b7160e01b600052603260045260246000fd5b602002602001015160098190555084600181518110620002d357634e487b7160e01b600052603260045260246000fd5b6020908102919091010151600a55600b849055600d829055600c839055620002fd60003362000336565b620003297fb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e3362000336565b5050505050505062000661565b62000342828262000346565b5050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1662000342576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620003a23390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600082601f830112620003f7578081fd5b81516020620004106200040a83620005d6565b620005a3565b80838252828201915082860187848660051b890101111562000430578586fd5b855b85811015620004505781518452928401929084019060010162000432565b5090979650505050505050565b80516001600160801b03811681146200047557600080fd5b919050565b600080600080600080600060e0888a03121562000495578283fd5b620004a0886200045d565b602089810151919850906001600160401b0380821115620004bf578586fd5b818b0191508b601f830112620004d3578586fd5b8151620004e46200040a82620005d6565b8082825285820191508585018f878560051b88010111156200050457898afd5b8995505b8386101562000531576200051c816200045d565b83526001959095019491860191860162000508565b5060408e0151909b5094505050808311156200054b578586fd5b620005598c848d01620003e6565b975060608b0151965060808b0151955060a08b0151945060c08b015192508083111562000584578384fd5b5050620005948a828b01620003e6565b91505092959891949750929550565b604051601f8201601f191681016001600160401b0381118282101715620005ce57620005ce6200064b565b604052919050565b60006001600160401b03821115620005f257620005f26200064b565b5060051b60200190565b6000821982111562000612576200061262000635565b500190565b60006000198214156200062e576200062e62000635565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b612ff680620006716000396000f3fe6080604052600436106103855760003560e01c80638124bb0f116101d1578063ae029b0711610102578063d547741f116100a0578063f33096d81161006f578063f33096d814610c5a578063f3ae241514610c7a578063f4389a3214610c9a578063facd743b14610cba5761038c565b8063d547741f14610bc9578063e14ad02d14610be9578063e58378bb14610c16578063ec87621c14610c385761038c565b8063bf9cfe05116100dc578063bf9cfe0514610b22578063c49baebe14610b5f578063cfe6a3a514610b93578063d2fa635e14610ba95761038c565b8063ae029b0714610ac2578063b839a80e14610ae2578063be8c9ad414610b025761038c565b80639294a0301161016f578063a217fddf11610149578063a217fddf14610a4a578063a39140c514610a5f578063aa16944a14610a75578063ac2e493614610a955761038c565b80639294a030146109b55780639e82a100146109cb578063a097553914610a2a5761038c565b80638ce74cd0116101ab5780638ce74cd0146108dd578063918a15cf146108f357806391d1485414610961578063926d7d7f146109815761038c565b80638124bb0f1461088257806389affc9c146108975780638a926d0f146108c75761038c565b80632f2ff15d116102b65780634d832750116102545780635c975abb116102235780635c975abb146107fa5780635fdb9ec914610812578063640429b5146108325780636b31ad12146108625761038c565b80634d83275014610778578063534ec2b2146107b0578063540bc5ea146107c5578063541d5548146107da5761038c565b80633db99b36116102905780633db99b36146107025780633de39c111461072257806345b6abc5146107385780634c83377c146107585761038c565b80632f2ff15d146106a25780632f54bf6e146106c257806336568abe146106e25761038c565b80631f041ec61161032357806321c83d7f116102fd57806321c83d7f14610605578063248a9ca3146106255780632a3221c6146106555780632dd39c55146106755761038c565b80631f041ec61461055e57806320b337c414610573578063213feaf5146105935761038c565b806312b57cea1161035f57806312b57cea146104cd57806314d74858146104f15780631641f1ba1461051e5780631b7f05f81461053e5761038c565b806301ffc9a714610456578063101347951461048b578063102a95af146104ad5761038c565b3661038c57005b600080356001600160e01b03191681527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6020526040812060018101548154600280546001600160a01b0319166001600160a01b0392831690811790915592935016906104325760405162461bcd60e51b815260206004820152600f60248201526e37379034b739ba30b731b2b0a0b13160891b60448201526064015b60405180910390fd5b3660008037600080366000845af43d6000803e808015610451573d6000f35b3d6000fd5b34801561046257600080fd5b50610476610471366004612bbd565b610cda565b60405190151581526020015b60405180910390f35b34801561049757600080fd5b506104ab6104a6366004612aa2565b610d11565b005b3480156104b957600080fd5b506104ab6104c8366004612a10565b610deb565b3480156104d957600080fd5b506104e360085481565b604051908152602001610482565b3480156104fd57600080fd5b506104e361050c366004612aa2565b60056020526000908152604090205481565b34801561052a57600080fd5b506104ab610539366004612aa2565b610fce565b34801561054a57600080fd5b506104ab610559366004612aa2565b611025565b34801561056a57600080fd5b506104ab6110c7565b34801561057f57600080fd5b506104ab61058e366004612c75565b611105565b34801561059f57600080fd5b506104e36105ae366004612a48565b6040516bffffffffffffffffffffffff19606086901b166020820152603481018490526054810183905260748101829052600090609401604051602081830303815290604052805190602001209050949350505050565b34801561061157600080fd5b506104ab6106203660046129f4565b6111d6565b34801561063157600080fd5b506104e3610640366004612aa2565b60009081526020819052604090206001015490565b34801561066157600080fd5b506104ab610670366004612caa565b61128d565b34801561068157600080fd5b506104e3610690366004612aa2565b60036020526000908152604090205481565b3480156106ae57600080fd5b506104ab6106bd366004612aba565b6114b3565b3480156106ce57600080fd5b506104766106dd3660046129f4565b6114de565b3480156106ee57600080fd5b506104ab6106fd366004612aba565b6114f8565b34801561070e57600080fd5b506104ab61071d366004612c75565b611572565b34801561072e57600080fd5b506104e3600b5481565b34801561074457600080fd5b506104ab610753366004612bd7565b61167d565b34801561076457600080fd5b506104ab610773366004612c8f565b611815565b34801561078457600080fd5b50610798610793366004612ade565b6118e3565b6040516001600160a01b039091168152602001610482565b3480156107bc57600080fd5b506104ab6119fa565b3480156107d157600080fd5b506104e3604181565b3480156107e657600080fd5b506104766107f53660046129f4565b611a7c565b34801561080657600080fd5b5060015460ff16610476565b34801561081e57600080fd5b506104ab61082d366004612aa2565b611aa8565b34801561083e57600080fd5b5061047661084d366004612aa2565b60009081526004602052604090205460ff1690565b34801561086e57600080fd5b506104ab61087d366004612c63565b611aff565b34801561088e57600080fd5b506104ab611bd4565b3480156108a357600080fd5b506104766108b2366004612aa2565b60046020526000908152604090205460ff1681565b3480156108d357600080fd5b506104e3600a5481565b3480156108e957600080fd5b506104e3600c5481565b3480156108ff57600080fd5b506104e361090e366004612aa2565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b34801561096d57600080fd5b5061047661097c366004612aba565b611c10565b34801561098d57600080fd5b506104e37fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc481565b3480156109c157600080fd5b506104e360095481565b3480156109d757600080fd5b50610a0a6109e6366004612c3a565b600091825260205260409020600181015490546001600160a01b0391821692911690565b604080516001600160a01b03938416815292909116602083015201610482565b348015610a3657600080fd5b506104ab610a45366004612b9c565b611c39565b348015610a5657600080fd5b506104e3600081565b348015610a6b57600080fd5b506104e3600d5481565b348015610a8157600080fd5b506104ab610a90366004612aa2565b611ddb565b348015610aa157600080fd5b506104e3610ab0366004612aa2565b60076020526000908152604090205481565b348015610ace57600080fd5b506104ab610add366004612c8f565b611e32565b348015610aee57600080fd5b506104ab610afd366004612aa2565b611ea0565b348015610b0e57600080fd5b506104ab610b1d366004612bf2565b611ef7565b348015610b2e57600080fd5b50600154610b479061010090046001600160801b031681565b6040516001600160801b039091168152602001610482565b348015610b6b57600080fd5b506104e37f21702c8af46127c7fa207f89d0b0a8441bb32959a0ac7df790e9ab1a25c9892681565b348015610b9f57600080fd5b506104e3600e5481565b348015610bb557600080fd5b506104ab610bc4366004612aa2565b61202d565b348015610bd557600080fd5b506104ab610be4366004612aba565b6120e3565b348015610bf557600080fd5b506104e3610c04366004612aa2565b60066020526000908152604090205481565b348015610c2257600080fd5b506104e3600080516020612f8183398151915281565b348015610c4457600080fd5b506104e3600080516020612fa183398151915281565b348015610c6657600080fd5b50600254610798906001600160a01b031681565b348015610c8657600080fd5b50610476610c953660046129f4565b612109565b348015610ca657600080fd5b506104ab610cb5366004612c8f565b612123565b348015610cc657600080fd5b50610476610cd53660046129f4565b612191565b60006001600160e01b03198216637965db0b60e01b1480610d0b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b610d29600080516020612f8183398151915233611c10565b610d455760405162461bcd60e51b815260040161042990612e52565b60015461010090046001600160801b03166000908152600360205260409081902054905163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b158015610daf57600080fd5b505af1158015610dc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de79190612a82565b5050565b610e03600080516020612f8183398151915233611c10565b610e1f5760405162461bcd60e51b815260040161042990612e52565b6001600160a01b038216331415610e9e5760405162461bcd60e51b815260206004820152603660248201527f73776170436f6e74726163743a204e6577206f776e6572206d7573742062652060448201527f646966666572656e74207468616e2063757272656e74000000000000000000006064820152608401610429565b6001600160a01b038216610f075760405162461bcd60e51b815260206004820152602a60248201527f73776170436f6e74726163743a204f776e65722063616e6e6f74206265207a65604482015269726f206164647265737360b01b6064820152608401610429565b6001600160a01b038116610f705760405162461bcd60e51b815260206004820152602a60248201527f73776170436f6e74726163743a204f776e65722063616e6e6f74206265207a65604482015269726f206164647265737360b01b6064820152608401610429565b610f7b6000836121bd565b610f93600080516020612f81833981519152836121bd565b610fab600080516020612fa1833981519152826121bd565b610fc3600080516020612f81833981519152336114f8565b610de76000336114f8565b610fe6600080516020612f8183398151915233611c10565b806110045750611004600080516020612fa183398151915233611c10565b6110205760405162461bcd60e51b815260040161042990612e0c565b600955565b61103d600080516020612f8183398151915233611c10565b6110595760405162461bcd60e51b815260040161042990612e52565b600081116110c25760405162461bcd60e51b815260206004820152603060248201527f73776170436f6e74726163743a204174206c65617374203120636f6e6669726d60448201526f185d1a5bdb8818d85b881899481cd95d60821b6064820152608401610429565b600855565b6110df600080516020612f8183398151915233611c10565b6110fb5760405162461bcd60e51b815260040161042990612e52565b6111036121c7565b565b61111d600080516020612f8183398151915233611c10565b6111395760405162461bcd60e51b815260040161042990612e52565b6001600160801b03811660009081526004602052604090205460ff166111b55760405162461bcd60e51b815260206004820152602b60248201527f73776170436f6e74726163743a205468697320626c6f636b636861696e20776160448201526a1cc81b9bdd08185919195960aa1b6064820152608401610429565b6001600160801b03166000908152600460205260409020805460ff19169055565b6111ee600080516020612f8183398151915233611c10565b61120a5760405162461bcd60e51b815260040161042990612e52565b61121381611a7c565b6112775760405162461bcd60e51b815260206004820152602f60248201527f73776170436f6e74726163743a206665652063616e2062652073656e74206f6e60448201526e363c903a379030903932b630bcb2b960891b6064820152608401610429565b61128a6001600160a01b03821647612259565b50565b6112a5600080516020612f8183398151915233611c10565b6112c15760405162461bcd60e51b815260040161042990612e52565b806001600160801b0316826001600160801b031614156113495760405162461bcd60e51b815260206004820152603860248201527f73776170436f6e74726163743a2043616e6e6f74206368616e676520626c6f6360448201527f6b636861696e7320776974682073616d65206e756d62657200000000000000006064820152608401610429565b6001546001600160801b0382811661010090920416141561137c5760405162461bcd60e51b815260040161042990612da0565b6001600160801b03821660009081526004602052604090205460ff166113f85760405162461bcd60e51b815260206004820152602b60248201527f73776170436f6e74726163743a205468697320626c6f636b636861696e20776160448201526a1cc81b9bdd08185919195960aa1b6064820152608401610429565b6001600160801b03811660009081526004602052604090205460ff16156114785760405162461bcd60e51b815260206004820152602e60248201527f73776170436f6e74726163743a205468697320626c6f636b636861696e20697360448201526d08185b1c9958591e48185919195960921b6064820152608401610429565b6001600160801b03918216600090815260046020526040808220805460ff199081169091559290931681529190912080549091166001179055565b6000828152602081905260409020600101546114cf8133612372565b6114d983836123d6565b505050565b6000610d0b600080516020612f8183398151915283611c10565b6001600160a01b03811633146115685760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610429565b610de7828261245a565b61158a600080516020612f8183398151915233611c10565b6115a65760405162461bcd60e51b815260040161042990612e52565b6001546001600160801b038281166101009092041614156115d95760405162461bcd60e51b815260040161042990612da0565b6001600160801b03811660009081526004602052604090205460ff16156116595760405162461bcd60e51b815260206004820152602e60248201527f73776170436f6e74726163743a205468697320626c6f636b636861696e20697360448201526d08185b1c9958591e48185919195960921b6064820152608401610429565b6001600160801b03166000908152600460205260409020805460ff19166001179055565b611695600080516020612f8183398151915233611c10565b806116b357506116b3600080516020612fa183398151915233611c10565b6116cf5760405162461bcd60e51b815260040161042990612e0c565b6001600160a01b0381166117255760405162461bcd60e51b815260206004820152601560248201527f726f757465722063616e6e6f74206265207a65726f00000000000000000000006044820152606401610429565b60008281527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6020526040812080546001600160a01b0319166001600160a01b03848116918217835560015461010090046001600160801b03166000908152600360205260409081902054905163095ea7b360e01b815260048101939093526000196024840152929350919091169063095ea7b390604401602060405180830381600087803b1580156117d757600080fd5b505af11580156117eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061180f9190612a82565b50505050565b61182d600080516020612f8183398151915233611c10565b8061184b575061184b600080516020612fa183398151915233611c10565b8061187b575061187b7fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc433611c10565b6118c75760405162461bcd60e51b815260206004820181905260248201527f73776170436f6e74726163743a206e6f74206f776e72206d6e677220726c79726044820152606401610429565b6001600160801b03909116600090815260066020526040902055565b8181016020810151604082015160609092015160009290831a601b81101561191357611910601b82612ea1565b90505b8060ff16601b1415801561192b57508060ff16601c14155b1561193c57600093505050506119f3565b6001611995886040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b6040805160008152602081018083529290925260ff841690820152606081018590526080810184905260a0016020604051602081039080840390855afa1580156119e3573d6000803e3d6000fd5b5050506020604051035193505050505b9392505050565b611a12600080516020612f8183398151915233611c10565b611a2e5760405162461bcd60e51b815260040161042990612e52565b6001805461010090046001600160801b0316600090815260036020526040902054600e549091611a74913391611a6391612ee5565b6001600160a01b03841691906124bf565b506001600e55565b6000610d0b7fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc483611c10565b611ac0600080516020612f8183398151915233611c10565b80611ade5750611ade600080516020612fa183398151915233611c10565b611afa5760405162461bcd60e51b815260040161042990612e0c565b600c55565b611b17600080516020612f8183398151915233611c10565b80611b355750611b35600080516020612fa183398151915233611c10565b611b515760405162461bcd60e51b815260040161042990612e0c565b60405163095ea7b360e01b81526001600160a01b038281166004830152600019602483015283169063095ea7b390604401602060405180830381600087803b158015611b9c57600080fd5b505af1158015611bb0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d99190612a82565b611bec600080516020612f8183398151915233611c10565b611c085760405162461bcd60e51b815260040161042990612e52565b611103612511565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b611c637fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc433611c10565b611cc35760405162461bcd60e51b815260206004820152602b60248201527f73776170436f6e74726163743a2043616c6c6572206973206e6f7420696e207260448201526a656c6179657220726f6c6560a81b6064820152608401610429565b80611d295760405162461bcd60e51b815260206004820152603060248201527f73776170436f6e74726163743a20796f752063616e6e6f74207365742074686560448201526f020737461747573436f646520746f20360841b6064820152608401610429565b60008281526007602052604090205460011415611dc95760405162461bcd60e51b815260206004820152605260248201527f73776170436f6e74726163743a207472616e73616374696f6e2077697468207460448201527f686973206f726967696e616c5478486173682068617320616c7265616479206260648201527119595b881cd95d08185cc81cdd58d8d9595960721b608482015260a401610429565b60009182526007602052604090912055565b611df3600080516020612f8183398151915233611c10565b80611e115750611e11600080516020612fa183398151915233611c10565b611e2d5760405162461bcd60e51b815260040161042990612e0c565b600d55565b611e4a600080516020612f8183398151915233611c10565b80611e685750611e68600080516020612fa183398151915233611c10565b611e845760405162461bcd60e51b815260040161042990612e0c565b6001600160801b03909116600090815260036020526040902055565b611eb8600080516020612f8183398151915233611c10565b80611ed65750611ed6600080516020612fa183398151915233611c10565b611ef25760405162461bcd60e51b815260040161042990612e0c565b600a55565b611f0f600080516020612f8183398151915233611c10565b611f2b5760405162461bcd60e51b815260040161042990612e52565b60008381527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60205260408120600181810180546001600160a01b038781166001600160a01b031992831617909255835486831691168117845591546001600160801b03610100909104166000908152600360205260409081902054905163095ea7b360e01b815260048101939093526000196024840152929350919091169063095ea7b390604401602060405180830381600087803b158015611fee57600080fd5b505af1158015612002573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120269190612a82565b5050505050565b612045600080516020612f8183398151915233611c10565b806120635750612063600080516020612fa183398151915233611c10565b61207f5760405162461bcd60e51b815260040161042990612e0c565b600081116120de5760405162461bcd60e51b815260206004820152602660248201527f73776170436f6e74726163743a204761732070726963652063616e6e6f74206260448201526565207a65726f60d01b6064820152608401610429565b600b55565b6000828152602081905260409020600101546120ff8133612372565b6114d9838361245a565b6000610d0b600080516020612fa183398151915283611c10565b61213b600080516020612f8183398151915233611c10565b806121595750612159600080516020612fa183398151915233611c10565b6121755760405162461bcd60e51b815260040161042990612e0c565b6001600160801b03909116600090815260056020526040902055565b6000610d0b7f21702c8af46127c7fa207f89d0b0a8441bb32959a0ac7df790e9ab1a25c9892683611c10565b610de782826123d6565b60015460ff161561220d5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610429565b6001805460ff1916811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258335b6040516001600160a01b03909116815260200160405180910390a1565b804710156122a95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610429565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146122f6576040519150601f19603f3d011682016040523d82523d6000602084013e6122fb565b606091505b50509050806114d95760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610429565b61237c8282611c10565b610de757612394816001600160a01b03166014612594565b61239f836020612594565b6040516020016123b0929190612cf8565b60408051601f198184030181529082905262461bcd60e51b825261042991600401612d6d565b6123e08282611c10565b610de7576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556124163390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6124648282611c10565b15610de7576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526114d9908490612776565b60015460ff166125635760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610429565b6001805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa3361223c565b606060006125a3836002612ec6565b6125ae906002612e89565b67ffffffffffffffff8111156125d457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156125fe576020820181803683370190505b509050600360fc1b8160008151811061262757634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061266457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506000612688846002612ec6565b612693906001612e89565b90505b6001811115612727576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106126d557634e487b7160e01b600052603260045260246000fd5b1a60f81b8282815181106126f957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c9361272081612f28565b9050612696565b5083156119f35760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610429565b60006127cb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166128489092919063ffffffff16565b8051909150156114d957808060200190518101906127e99190612a82565b6114d95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610429565b6060612857848460008561285f565b949350505050565b6060824710156128c05760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610429565b843b61290e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610429565b600080866001600160a01b0316858760405161292a9190612cdc565b60006040518083038185875af1925050503d8060008114612967576040519150601f19603f3d011682016040523d82523d6000602084013e61296c565b606091505b509150915061297c828286612987565b979650505050505050565b606083156129965750816119f3565b8251156129a65782518084602001fd5b8160405162461bcd60e51b81526004016104299190612d6d565b80356001600160e01b0319811681146129d857600080fd5b919050565b80356001600160801b03811681146129d857600080fd5b600060208284031215612a05578081fd5b81356119f381612f6b565b60008060408385031215612a22578081fd5b8235612a2d81612f6b565b91506020830135612a3d81612f6b565b809150509250929050565b60008060008060808587031215612a5d578182fd5b8435612a6881612f6b565b966020860135965060408601359560600135945092505050565b600060208284031215612a93578081fd5b815180151581146119f3578182fd5b600060208284031215612ab3578081fd5b5035919050565b60008060408385031215612acc578182fd5b823591506020830135612a3d81612f6b565b600080600060608486031215612af2578283fd5b83359250602084013567ffffffffffffffff80821115612b10578384fd5b818601915086601f830112612b23578384fd5b813581811115612b3557612b35612f55565b604051601f8201601f19908116603f01168101908382118183101715612b5d57612b5d612f55565b81604052828152896020848701011115612b75578687fd5b82602086016020830137918201602001959095529497949650505050604092909201359150565b60008060408385031215612bae578182fd5b50508035926020909101359150565b600060208284031215612bce578081fd5b6119f3826129c0565b60008060408385031215612be9578182fd5b612a2d836129c0565b600080600060608486031215612c06578283fd5b612c0f846129c0565b92506020840135612c1f81612f6b565b91506040840135612c2f81612f6b565b809150509250925092565b60008060408385031215612c4c578182fd5b612c55836129c0565b946020939093013593505050565b60008060408385031215612a22578182fd5b600060208284031215612c86578081fd5b6119f3826129dd565b60008060408385031215612ca1578182fd5b612c55836129dd565b60008060408385031215612cbc578182fd5b612cc5836129dd565b9150612cd3602084016129dd565b90509250929050565b60008251612cee818460208701612efc565b9190910192915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351612d30816017850160208801612efc565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351612d61816028840160208801612efc565b01602801949350505050565b6020815260008251806020840152612d8c816040850160208701612efc565b601f01601f19169190910160400192915050565b60208082526046908201527f73776170436f6e74726163743a2043616e6e6f7420616464207468697320626c60408201527f6f636b636861696e20746f206172726179206f66206f7468657220626c6f636b606082015265636861696e7360d01b608082015260a00190565b60208082526026908201527f43616c6c6572206973206e6f7420696e206f776e6572206f72206d616e6167656040820152657220726f6c6560d01b606082015260800190565b6020808252601b908201527f43616c6c6572206973206e6f7420696e206f776e657220726f6c650000000000604082015260600190565b60008219821115612e9c57612e9c612f3f565b500190565b600060ff821660ff84168060ff03821115612ebe57612ebe612f3f565b019392505050565b6000816000190483118215151615612ee057612ee0612f3f565b500290565b600082821015612ef757612ef7612f3f565b500390565b60005b83811015612f17578181015183820152602001612eff565b8381111561180f5750506000910152565b600081612f3757612f37612f3f565b506000190190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461128a57600080fdfeb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08a26469706673582212206c8cbc1a20ec9100e34aef8d1d2e0dcfc3ce9b596b559ec14105a8000ae7e0a064736f6c63430008040033000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000002e90edd000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a817c80000000000000000000000000000000000000000000000000000000000000000080000000000000000000000008ac76a51cc950d9822d68b83fe1ad97b32cd580d000000000000000000000000aff4481d10270f50f203e0763e2597776068cbc50000000000000000000000002791bca1f2de4661ed88a30c99a7a9449aa84174000000000000000000000000a7d7079b0fead91f3e65f86e8915cb59c1a4c66400000000000000000000000004068da6c83afcfa0e13ba15a6696662335d5b75000000000000000000000000e3f5a90f9cb311505cd691a46596599aa1a0ad7d000000000000000000000000985458e523db3d53125813ed68c274899e9dfab4c6fa7af3bedbad3a3d65f36aabc97431b1bbe4c2d2f6e0e47ca60203452f5d61
Deployed ByteCode Sourcemap
51636:4657:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55191:27;55237:7;;-1:-1:-1;;;;;;55237:7:0;53191:14;;39735:66;53287:2;53280:16;53399:2;53386:16;;55310:13;;;;55353:11;;55334:16;:30;;-1:-1:-1;;;;;;55334:30:0;-1:-1:-1;;;;;55353:11:0;;;55334:30;;;;;;55191:83;;-1:-1:-1;55310:13:0;;55375:58;;;;-1:-1:-1;;;55375:58:0;;16870:2:1;55375:58:0;;;16852:21:1;16909:2;16889:18;;;16882:30;-1:-1:-1;;;16928:18:1;;;16921:45;16983:18;;55375:58:0;;;;;;;;;55715:14;55712:1;55709;55696:34;55933:1;55930;55914:14;55911:1;55895:14;55888:5;55875:60;56012:16;56009:1;56006;55991:38;56052:6;56121:68;;;;56240:16;56237:1;56230:27;56121:68;56157:16;56154:1;56147:27;24926:204;;;;;;;;;;-1:-1:-1;24926:204:0;;;;;:::i;:::-;;:::i;:::-;;;9740:14:1;;9733:22;9715:41;;9703:2;9688:18;24926:204:0;;;;;;;;46126:175;;;;;;;;;;-1:-1:-1;46126:175:0;;;;;:::i;:::-;;:::i;:::-;;48686:766;;;;;;;;;;-1:-1:-1;48686:766:0;;;;;:::i;:::-;;:::i;39283:44::-;;;;;;;;;;;;;;;;;;;9913:25:1;;;9901:2;9886:18;39283:44:0;9868:76:1;39040:56:0;;;;;;;;;;-1:-1:-1;39040:56:0;;;;;:::i;:::-;;;;;;;;;;;;;;47008:155;;;;;;;;;;-1:-1:-1;47008:155:0;;;;;:::i;:::-;;:::i;46535:328::-;;;;;;;;;;-1:-1:-1;46535:328:0;;;;;:::i;:::-;;:::i;49530:72::-;;;;;;;;;;;;;:::i;42046:324::-;;;;;;;;;;-1:-1:-1;42046:324:0;;;;;:::i;:::-;;:::i;32170:285::-;;;;;;;;;;-1:-1:-1;32170:285:0;;;;;:::i;:::-;32378:68;;-1:-1:-1;;6848:2:1;6844:15;;;6840:53;32378:68:0;;;6828:66:1;6910:12;;;6903:28;;;6947:12;;;6940:28;;;6984:12;;;6977:28;;;32341:7:0;;7021:13:1;;32378:68:0;;;;;;;;;;;;32368:79;;;;;;32361:86;;32170:285;;;;;;;43612:225;;;;;;;;;;-1:-1:-1;43612:225:0;;;;;:::i;:::-;;:::i;26337:123::-;;;;;;;;;;-1:-1:-1;26337:123:0;;;;;:::i;:::-;26403:7;26430:12;;;;;;;;;;:22;;;;26337:123;42572:936;;;;;;;;;;-1:-1:-1;42572:936:0;;;;;:::i;:::-;;:::i;38922:49::-;;;;;;;;;;-1:-1:-1;38922:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;26722:147;;;;;;;;;;-1:-1:-1;26722:147:0;;;;;:::i;:::-;;:::i;49891:115::-;;;;;;;;;;-1:-1:-1;49891:115:0;;;;;:::i;:::-;;:::i;27770:218::-;;;;;;;;;;-1:-1:-1;27770:218:0;;;;;:::i;:::-;;:::i;41396:498::-;;;;;;;;;;-1:-1:-1;41396:498:0;;;;;:::i;:::-;;:::i;39408:26::-;;;;;;;;;;;;;;;;54719:426;;;;;;;;;;-1:-1:-1;54719:426:0;;;;;:::i;:::-;;:::i;44969:205::-;;;;;;;;;;-1:-1:-1;44969:205:0;;;;;:::i;:::-;;:::i;32815:1053::-;;;;;;;;;;-1:-1:-1;32815:1053:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8874:55:1;;;8856:74;;8844:2;8829:18;32815:1053:0;8811:125:1;43915:287:0;;;;;;;;;;;;;:::i;39166:45::-;;;;;;;;;;;;39209:2;39166:45;;50395:119;;;;;;;;;;-1:-1:-1;50395:119:0;;;;;:::i;:::-;;:::i;30940:86::-;;;;;;;;;;-1:-1:-1;31011:7:0;;;;30940:86;;48005:183;;;;;;;;;;-1:-1:-1;48005:183:0;;;;;:::i;:::-;;:::i;41062:184::-;;;;;;;;;;-1:-1:-1;41062:184:0;;;;;:::i;:::-;41174:4;41203:35;;;:23;:35;;;;;;;;;41062:184;45800:151;;;;;;;;;;-1:-1:-1;45800:151:0;;;;;:::i;:::-;;:::i;49681:77::-;;;;;;;;;;;;;:::i;38978:55::-;;;;;;;;;;-1:-1:-1;38978:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;39372:29;;;;;;;;;;;;;;;;39441:36;;;;;;;;;;;;;;;;32463:344;;;;;;;;;;-1:-1:-1;32463:344:0;;;;;:::i;:::-;32726:58;;7566:66:1;32726:58:0;;;7554:79:1;7649:12;;;7642:28;;;32557:7:0;;7686:12:1;;32726:58:0;;;;;;;;;;;;32698:101;;;;;;32678:121;;32463:344;;;;25222:139;;;;;;;;;;-1:-1:-1;25222:139:0;;;;;:::i;:::-;;:::i;38695:64::-;;;;;;;;;;;;38734:25;38695:64;;39336:29;;;;;;;;;;;;;;;;53525:739;;;;;;;;;;-1:-1:-1;53525:739:0;;;;;:::i;:::-;53608:29;53859:14;;;53955:2;53948:16;54067:2;54054:16;;54212:13;;;;54245:11;;-1:-1:-1;;;;;54212:13:0;;;;54245:11;;;53525:739;;;;;-1:-1:-1;;;;;9194:15:1;;;9176:34;;9246:15;;;;9241:2;9226:18;;9219:43;9088:18;53525:739:0;9070:198:1;51027:492:0;;;;;;;;;;-1:-1:-1;51027:492:0;;;;;:::i;:::-;;:::i;24313:49::-;;;;;;;;;;-1:-1:-1;24313:49:0;24358:4;24313:49;;39484:29;;;;;;;;;;;;;;;;48196:155;;;;;;;;;;-1:-1:-1;48196:155:0;;;;;:::i;:::-;;:::i;39220:56::-;;;;;;;;;;-1:-1:-1;39220:56:0;;;;;:::i;:::-;;;;;;;;;;;;;;45375:203;;;;;;;;;;-1:-1:-1;45375:203:0;;;;;:::i;:::-;;:::i;47308:155::-;;;;;;;;;;-1:-1:-1;47308:155:0;;;;;:::i;:::-;;:::i;54272:439::-;;;;;;;;;;-1:-1:-1;54272:439:0;;;;;:::i;:::-;;:::i;38843:34::-;;;;;;;;;;-1:-1:-1;38843:34:0;;;;;;;-1:-1:-1;;;;;38843:34:0;;;;;;-1:-1:-1;;;;;21279:47:1;;;21261:66;;21249:2;21234:18;38843:34:0;21216:117:1;38766:68:0;;;;;;;;;;;;38807:27;38766:68;;39522:30;;;;;;;;;;;;;;;;47625:198;;;;;;;;;;-1:-1:-1;47625:198:0;;;;;:::i;:::-;;:::i;27114:149::-;;;;;;;;;;-1:-1:-1;27114:149:0;;;;;:::i;:::-;;:::i;39103:54::-;;;;;;;;;;-1:-1:-1;39103:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;38557:60;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;38557:60:0;;38624:64;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;38624:64:0;;38884:31;;;;;;;;;;-1:-1:-1;38884:31:0;;;;-1:-1:-1;;;;;38884:31:0;;;50141:119;;;;;;;;;;-1:-1:-1;50141:119:0;;;;;:::i;:::-;;:::i;44510:197::-;;;;;;;;;;-1:-1:-1;44510:197:0;;;;;:::i;:::-;;:::i;50659:123::-;;;;;;;;;;-1:-1:-1;50659:123:0;;;;;:::i;:::-;;:::i;24926:204::-;25011:4;-1:-1:-1;;;;;;25035:47:0;;-1:-1:-1;;;25035:47:0;;:87;;-1:-1:-1;;;;;;;;;;22454:40:0;;;25086:36;25028:94;24926:204;-1:-1:-1;;24926:204:0:o;46126:175::-;40036:33;-1:-1:-1;;;;;;;;;;;1560:10:0;25222:139;:::i;40036:33::-;40014:110;;;;-1:-1:-1;;;40014:110:0;;;;;;;:::i;:::-;46240:19:::1;::::0;::::1;::::0;::::1;-1:-1:-1::0;;;;;46240:19:0::1;46225:35;::::0;;;:14:::1;:35;::::0;;;;;;;46194:99;;-1:-1:-1;;;46194:99:0;;46274:10:::1;46194:99;::::0;::::1;9447:74:1::0;9537:18;;;9530:34;;;-1:-1:-1;;;;;46194:79:0;;::::1;::::0;::::1;::::0;9420:18:1;;46194:99:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;46126:175:::0;:::o;48686:766::-;40036:33;-1:-1:-1;;;;;;;;;;;1560:10:0;25222:139;:::i;40036:33::-;40014:110;;;;-1:-1:-1;;;40014:110:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48835:24:0;::::1;1560:10:::0;48835:24:::1;;48813:128;;;::::0;-1:-1:-1;;;48813:128:0;;11303:2:1;48813:128:0::1;::::0;::::1;11285:21:1::0;11342:2;11322:18;;;11315:30;11381:34;11361:18;;;11354:62;11452:24;11432:18;;;11425:52;11494:19;;48813:128:0::1;11275:244:1::0;48813:128:0::1;-1:-1:-1::0;;;;;48974:24:0;::::1;48952:116;;;::::0;-1:-1:-1;;;48952:116:0;;13747:2:1;48952:116:0::1;::::0;::::1;13729:21:1::0;13786:2;13766:18;;;13759:30;13825:34;13805:18;;;13798:62;-1:-1:-1;;;13876:18:1;;;13869:40;13926:19;;48952:116:0::1;13719:232:1::0;48952:116:0::1;-1:-1:-1::0;;;;;49101:26:0;::::1;49079:118;;;::::0;-1:-1:-1;;;49079:118:0;;13747:2:1;49079:118:0::1;::::0;::::1;13729:21:1::0;13786:2;13766:18;;;13759:30;13825:34;13805:18;;;13798:62;-1:-1:-1;;;13876:18:1;;;13869:40;13926:19;;49079:118:0::1;13719:232:1::0;49079:118:0::1;49208:40;24358:4;49239:8:::0;49208:10:::1;:40::i;:::-;49259:32;-1:-1:-1::0;;;;;;;;;;;49282:8:0::1;49259:10;:32::i;:::-;49302:36;-1:-1:-1::0;;;;;;;;;;;49327:10:0::1;49302;:36::i;:::-;49349:38;-1:-1:-1::0;;;;;;;;;;;1560:10:0;27770:218;:::i;49349:38::-:1;49398:46;24358:4;1560:10:::0;27770:218;:::i;47008:155::-;40308:33;-1:-1:-1;;;;;;;;;;;1560:10:0;25222:139;:::i;40308:33::-;:89;;;-1:-1:-1;40362:35:0;-1:-1:-1;;;;;;;;;;;1560:10:0;25222:139;:::i;40362:35::-;40286:177;;;;-1:-1:-1;;;40286:177:0;;;;;;;:::i;:::-;47123:14:::1;:32:::0;47008:155::o;46535:328::-;40036:33;-1:-1:-1;;;;;;;;;;;1560:10:0;25222:139;:::i;40036:33::-;40014:110;;;;-1:-1:-1;;;40014:110:0;;;;;;;:::i;:::-;46713:1:::1;46684:26;:30;46662:128;;;::::0;-1:-1:-1;;;46662:128:0;;17626:2:1;46662:128:0::1;::::0;::::1;17608:21:1::0;17665:2;17645:18;;;17638:30;17704:34;17684:18;;;17677:62;-1:-1:-1;;;17755:18:1;;;17748:46;17811:19;;46662:128:0::1;17598:238:1::0;46662:128:0::1;46801:25;:54:::0;46535:328::o;49530:72::-;40036:33;-1:-1:-1;;;;;;;;;;;1560:10:0;25222:139;:::i;40036:33::-;40014:110;;;;-1:-1:-1;;;40014:110:0;;;;;;;:::i;:::-;49586:8:::1;:6;:8::i;:::-;49530:72::o:0;42046:324::-;40036:33;-1:-1:-1;;;;;;;;;;;1560:10:0;25222:139;:::i;40036:33::-;40014:110;;;;-1:-1:-1;;;40014:110:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42182:45:0;::::1;;::::0;;;:23:::1;:45;::::0;;;;;::::1;;42160:138;;;::::0;-1:-1:-1;;;42160:138:0;;17214:2:1;42160:138:0::1;::::0;::::1;17196:21:1::0;17253:2;17233:18;;;17226:30;17292:34;17272:18;;;17265:62;-1:-1:-1;;;17343:18:1;;;17336:41;17394:19;;42160:138:0::1;17186:233:1::0;42160:138:0::1;-1:-1:-1::0;;;;;42309:45:0::1;42357:5;42309:45:::0;;;:23:::1;:45;::::0;;;;:53;;-1:-1:-1;;42309:53:0::1;::::0;;42046:324::o;43612:225::-;40036:33;-1:-1:-1;;;;;;;;;;;1560:10:0;25222:139;:::i;40036:33::-;40014:110;;;;-1:-1:-1;;;40014:110:0;;;;;;;:::i;:::-;43695:20:::1;43705:9;43695;:20::i;:::-;43687:80;;;::::0;-1:-1:-1;;;43687:80:0;;20485:2:1;43687:80:0::1;::::0;::::1;20467:21:1::0;20524:2;20504:18;;;20497:30;20563:34;20543:18;;;20536:62;-1:-1:-1;;;20614:18:1;;;20607:45;20669:19;;43687:80:0::1;20457:237:1::0;43687:80:0::1;43778:51;-1:-1:-1::0;;;;;43778:28:0;::::1;43807:21;43778:28;:51::i;:::-;43612:225:::0;:::o;42572:936::-;40036:33;-1:-1:-1;;;;;;;;;;;1560:10:0;25222:139;:::i;40036:33::-;40014:110;;;;-1:-1:-1;;;40014:110:0;;;;;;;:::i;:::-;42773:23:::1;-1:-1:-1::0;;;;;42746:50:0::1;:23;-1:-1:-1::0;;;;;42746:50:0::1;;;42724:156;;;::::0;-1:-1:-1;;;42724:156:0;;13322:2:1;42724:156:0::1;::::0;::::1;13304:21:1::0;13361:2;13341:18;;;13334:30;13400:34;13380:18;;;13373:62;13471:26;13451:18;;;13444:54;13515:19;;42724:156:0::1;13294:246:1::0;42724:156:0::1;42940:19;::::0;-1:-1:-1;;;;;42913:46:0;;::::1;42940:19;::::0;;::::1;;42913:46;;42891:166;;;;-1:-1:-1::0;;;42891:166:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;43090:48:0;::::1;;::::0;;;:23:::1;:48;::::0;;;;;::::1;;43068:141;;;::::0;-1:-1:-1;;;43068:141:0;;17214:2:1;43068:141:0::1;::::0;::::1;17196:21:1::0;17253:2;17233:18;;;17226:30;17292:34;17272:18;;;17265:62;-1:-1:-1;;;17343:18:1;;;17336:41;17394:19;;43068:141:0::1;17186:233:1::0;43068:141:0::1;-1:-1:-1::0;;;;;43243:48:0;::::1;;::::0;;;:23:::1;:48;::::0;;;;;::::1;;43242:49;43220:145;;;::::0;-1:-1:-1;;;43220:145:0;;18810:2:1;43220:145:0::1;::::0;::::1;18792:21:1::0;18849:2;18829:18;;;18822:30;18888:34;18868:18;;;18861:62;-1:-1:-1;;;18939:18:1;;;18932:44;18993:19;;43220:145:0::1;18782:236:1::0;43220:145:0::1;-1:-1:-1::0;;;;;43378:48:0;;::::1;43429:5;43378:48:::0;;;:23:::1;:48;::::0;;;;;:56;;-1:-1:-1;;43378:56:0;;::::1;::::0;;;43445:48;;;::::1;::::0;;;;;;:55;;;;::::1;43378:56:::0;43445:55:::1;::::0;;42572:936::o;26722:147::-;26403:7;26430:12;;;;;;;;;;:22;;;24804:30;24815:4;1560:10;24804;:30::i;:::-;26836:25:::1;26847:4;26853:7;26836:10;:25::i;:::-;26722:147:::0;;;:::o;49891:115::-;49946:4;49970:28;-1:-1:-1;;;;;;;;;;;49990:7:0;49970;:28::i;27770:218::-;-1:-1:-1;;;;;27866:23:0;;1560:10;27866:23;27858:83;;;;-1:-1:-1;;;27858:83:0;;20901:2:1;27858:83:0;;;20883:21:1;20940:2;20920:18;;;20913:30;20979:34;20959:18;;;20952:62;-1:-1:-1;;;21030:18:1;;;21023:45;21085:19;;27858:83:0;20873:237:1;27858:83:0;27954:26;27966:4;27972:7;27954:11;:26::i;41396:498::-;40036:33;-1:-1:-1;;;;;;;;;;;1560:10:0;25222:139;:::i;40036:33::-;40014:110;;;;-1:-1:-1;;;40014:110:0;;;;;;;:::i;:::-;41553:19:::1;::::0;-1:-1:-1;;;;;41529:43:0;;::::1;41553:19;::::0;;::::1;;41529:43;;41507:163;;;;-1:-1:-1::0;;;41507:163:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;41704:45:0;::::1;;::::0;;;:23:::1;:45;::::0;;;;;::::1;;41703:46;41681:142;;;::::0;-1:-1:-1;;;41681:142:0;;18810:2:1;41681:142:0::1;::::0;::::1;18792:21:1::0;18849:2;18829:18;;;18822:30;18888:34;18868:18;;;18861:62;-1:-1:-1;;;18939:18:1;;;18932:44;18993:19;;41681:142:0::1;18782:236:1::0;41681:142:0::1;-1:-1:-1::0;;;;;41834:45:0::1;;::::0;;;:23:::1;:45;::::0;;;;:52;;-1:-1:-1;;41834:52:0::1;41882:4;41834:52;::::0;;41396:498::o;54719:426::-;40308:33;-1:-1:-1;;;;;;;;;;;1560:10:0;25222:139;:::i;40308:33::-;:89;;;-1:-1:-1;40362:35:0;-1:-1:-1;;;;;;;;;;;1560:10:0;25222:139;:::i;40362:35::-;40286:177;;;;-1:-1:-1;;;40286:177:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;54814:21:0;::::1;54806:55;;;::::0;-1:-1:-1;;;54806:55:0;;18043:2:1;54806:55:0::1;::::0;::::1;18025:21:1::0;18082:2;18062:18;;;18055:30;18121:23;18101:18;;;18094:51;18162:18;;54806:55:0::1;18015:171:1::0;54806:55:0::1;54872:27;53191:14:::0;;;39735:66:::1;53287:2:::0;53280:16;53399:2;53386:16;;54962:21;;-1:-1:-1;;;;;;54962:21:0::1;-1:-1:-1::0;;;;;54962:21:0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;55040:19:0;54962:21:::1;55040:19:::0;::::1;-1:-1:-1::0;;;;;55040:19:0::1;-1:-1:-1::0;55025:35:0;;;:14:::1;:35;::::0;;;;;;;54994:143;;-1:-1:-1;;;54994:143:0;;::::1;::::0;::::1;9447:74:1::0;;;;-1:-1:-1;;9537:18:1;;;9530:34;54962:21:0;;-1:-1:-1;54994:78:0;;;::::1;::::0;::::1;::::0;9420:18:1;;54994:143:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40474:1;54719:426:::0;;:::o;44969:205::-;40837:33;-1:-1:-1;;;;;;;;;;;1560:10:0;25222:139;:::i;40837:33::-;:85;;;-1:-1:-1;40887:35:0;-1:-1:-1;;;;;;;;;;;1560:10:0;25222:139;:::i;40887:35::-;40837:137;;;-1:-1:-1;40939:35:0;38734:25;1560:10;25222:139;:::i;40939:35::-;40815:219;;;;-1:-1:-1;;;40815:219:0;;12482:2:1;40815:219:0;;;12464:21:1;;;12501:18;;;12494:30;12560:34;12540:18;;;12533:62;12612:18;;40815:219:0;12454:182:1;40815:219:0;-1:-1:-1;;;;;45119:35:0;;::::1;;::::0;;;:19:::1;:35;::::0;;;;:47;44969:205::o;32815:1053::-;33143:33;;;33170:4;33143:33;;33137:40;33229:4;33202:33;;33196:40;33296:4;33269:33;;;33263:40;32949:7;;33196:40;33255:49;;33427:2;33423:6;;33419:46;;;33446:7;33451:2;33446:7;;:::i;:::-;;;33419:46;33545:1;:7;;33550:2;33545:7;;:18;;;;;33556:1;:7;;33561:2;33556:7;;33545:18;33541:70;;;33596:1;33580:19;;;;;;;33541:70;33812:48;33822:28;33845:4;32726:58;;7566:66:1;32726:58:0;;;7554:79:1;7649:12;;;7642:28;;;32557:7:0;;7686:12:1;;32726:58:0;;;;;;;;;;;;32698:101;;;;;;32678:121;;32463:344;;;;33822:28;33812:48;;;;;;;;;;;;10176:25:1;;;;10249:4;10237:17;;10217:18;;;10210:45;10271:18;;;10264:34;;;10314:18;;;10307:34;;;10148:19;;33812:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33805:55;;;;;32815:1053;;;;;;:::o;43915:287::-;40036:33;-1:-1:-1;;;;;;;;;;;1560:10:0;25222:139;:::i;40036:33::-;40014:110;;;;-1:-1:-1;;;40014:110:0;;;;;;;:::i;:::-;44034:19:::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;44034:19:0::1;43972:13;44019:35:::0;;;:14:::1;:35;::::0;;;;;44128:11:::1;::::0;44019:35;;44069:85:::1;::::0;44103:10:::1;::::0;44128:15:::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;;;;44069:19:0;::::1;::::0;:85;:19:::1;:85::i;:::-;-1:-1:-1::0;44179:1:0::1;44165:11;:15:::0;43915:287::o;50395:119::-;50452:4;50476:30;38734:25;50498:7;50476;:30::i;48005:183::-;40308:33;-1:-1:-1;;;;;;;;;;;1560:10:0;25222:139;:::i;40308:33::-;:89;;;-1:-1:-1;40362:35:0;-1:-1:-1;;;;;;;;;;;1560:10:0;25222:139;:::i;40362:35::-;40286:177;;;;-1:-1:-1;;;40286:177:0;;;;;;;:::i;:::-;48134:21:::1;:46:::0;48005:183::o;45800:151::-;40308:33;-1:-1:-1;;;;;;;;;;;1560:10:0;25222:139;:::i;40308:33::-;:89;;;-1:-1:-1;40362:35:0;-1:-1:-1;;;;;;;;;;;1560:10:0;25222:139;:::i;40362:35::-;40286:177;;;;-1:-1:-1;;;40286:177:0;;;;;;;:::i;:::-;45901:42:::1;::::0;-1:-1:-1;;;45901:42:0;;-1:-1:-1;;;;;9465:55:1;;;45901:42:0::1;::::0;::::1;9447:74:1::0;-1:-1:-1;;9537:18:1;;;9530:34;45901:14:0;::::1;::::0;::::1;::::0;9420:18:1;;45901:42:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;49681:77::-:0;40036:33;-1:-1:-1;;;;;;;;;;;1560:10:0;25222:139;:::i;40036:33::-;40014:110;;;;-1:-1:-1;;;40014:110:0;;;;;;;:::i;:::-;49740:10:::1;:8;:10::i;25222:139::-:0;25300:4;25324:12;;;;;;;;;;;-1:-1:-1;;;;;25324:29:0;;;;;;;;;;;;;;;25222:139::o;51027:492::-;40630:35;38734:25;1560:10;25222:139;:::i;40630:35::-;40608:128;;;;-1:-1:-1;;;40608:128:0;;15348:2:1;40608:128:0;;;15330:21:1;15387:2;15367:18;;;15360:30;15426:34;15406:18;;;15399:62;-1:-1:-1;;;15477:18:1;;;15470:41;15528:19;;40608:128:0;15320:233:1;40608:128:0;51174:15;51152:113:::1;;;::::0;-1:-1:-1;;;51152:113:0;;18393:2:1;51152:113:0::1;::::0;::::1;18375:21:1::0;18432:2;18412:18;;;18405:30;18471:34;18451:18;;;18444:62;-1:-1:-1;;;18522:18:1;;;18515:46;18578:19;;51152:113:0::1;18365:238:1::0;51152:113:0::1;51298:37;::::0;;;:21:::1;:37;::::0;;;;;51339:1:::1;51298:42;;51276:174;;;::::0;-1:-1:-1;;;51276:174:0;;19583:2:1;51276:174:0::1;::::0;::::1;19565:21:1::0;19622:2;19602:18;;;19595:30;19661:34;19641:18;;;19634:62;19732:34;19712:18;;;19705:62;-1:-1:-1;;;19783:19:1;;;19776:49;19842:19;;51276:174:0::1;19555:312:1::0;51276:174:0::1;51461:37;::::0;;;:21:::1;:37;::::0;;;;;:50;51027:492::o;48196:155::-;40308:33;-1:-1:-1;;;;;;;;;;;1560:10:0;25222:139;:::i;40308:33::-;:89;;;-1:-1:-1;40362:35:0;-1:-1:-1;;;;;;;;;;;1560:10:0;25222:139;:::i;40362:35::-;40286:177;;;;-1:-1:-1;;;40286:177:0;;;;;;;:::i;:::-;48311:14:::1;:32:::0;48196:155::o;45375:203::-;40308:33;-1:-1:-1;;;;;;;;;;;1560:10:0;25222:139;:::i;40308:33::-;:89;;;-1:-1:-1;40362:35:0;-1:-1:-1;;;;;;;;;;;1560:10:0;25222:139;:::i;40362:35::-;40286:177;;;;-1:-1:-1;;;40286:177:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45524:30:0;;::::1;;::::0;;;:14:::1;:30;::::0;;;;:46;45375:203::o;47308:155::-;40308:33;-1:-1:-1;;;;;;;;;;;1560:10:0;25222:139;:::i;40308:33::-;:89;;;-1:-1:-1;40362:35:0;-1:-1:-1;;;;;;;;;;;1560:10:0;25222:139;:::i;40362:35::-;40286:177;;;;-1:-1:-1;;;40286:177:0;;;;;;;:::i;:::-;47423:14:::1;:32:::0;47308:155::o;54272:439::-;40036:33;-1:-1:-1;;;;;;;;;;;1560:10:0;25222:139;:::i;40036:33::-;40014:110;;;;-1:-1:-1;;;40014:110:0;;;;;;;:::i;:::-;54403:27:::1;53191:14:::0;;;39735:66:::1;53287:2:::0;53280:16;53399:2;53386:16;;54493:13:::1;::::0;;::::1;:24:::0;;-1:-1:-1;;;;;54493:24:0;;::::1;-1:-1:-1::0;;;;;;54493:24:0;;::::1;;::::0;;;54528:21;;;;::::1;::::0;::::1;::::0;::::1;::::0;;54606:19;;-1:-1:-1;;;;;54493:24:0::1;54606:19:::0;;::::1;;-1:-1:-1::0;54591:35:0;;;:14:::1;:35;::::0;;;;;;;54560:143;;-1:-1:-1;;;54560:143:0;;::::1;::::0;::::1;9447:74:1::0;;;;-1:-1:-1;;9537:18:1;;;9530:34;54493:13:0;;-1:-1:-1;54560:78:0;;;::::1;::::0;::::1;::::0;9420:18:1;;54560:143:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40135:1;54272:439:::0;;;:::o;47625:198::-;40308:33;-1:-1:-1;;;;;;;;;;;1560:10:0;25222:139;:::i;40308:33::-;:89;;;-1:-1:-1;40362:35:0;-1:-1:-1;;;;;;;;;;;1560:10:0;25222:139;:::i;40362:35::-;40286:177;;;;-1:-1:-1;;;40286:177:0;;;;;;;:::i;:::-;47734:1:::1;47719:12;:16;47711:67;;;::::0;-1:-1:-1;;;47711:67:0;;12075:2:1;47711:67:0::1;::::0;::::1;12057:21:1::0;12114:2;12094:18;;;12087:30;12153:34;12133:18;;;12126:62;-1:-1:-1;;;12204:18:1;;;12197:36;12250:19;;47711:67:0::1;12047:228:1::0;47711:67:0::1;47789:11;:26:::0;47625:198::o;27114:149::-;26403:7;26430:12;;;;;;;;;;:22;;;24804:30;24815:4;1560:10;24804;:30::i;:::-;27229:26:::1;27241:4;27247:7;27229:11;:26::i;50141:119::-:0;50198:4;50222:30;-1:-1:-1;;;;;;;;;;;50244:7:0;50222;:30::i;44510:197::-;40308:33;-1:-1:-1;;;;;;;;;;;1560:10:0;25222:139;:::i;40308:33::-;:89;;;-1:-1:-1;40362:35:0;-1:-1:-1;;;;;;;;;;;1560:10:0;25222:139;:::i;40362:35::-;40286:177;;;;-1:-1:-1;;;40286:177:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44650:37:0;;::::1;;::::0;;;:21:::1;:37;::::0;;;;:49;44510:197::o;50659:123::-;50718:4;50742:32;38807:27;50766:7;50742;:32::i;28647:112::-;28726:25;28737:4;28743:7;28726:10;:25::i;31740:118::-;31011:7;;;;31265:9;31257:38;;;;-1:-1:-1;;;31257:38:0;;16525:2:1;31257:38:0;;;16507:21:1;16564:2;16544:18;;;16537:30;-1:-1:-1;;;16583:18:1;;;16576:46;16639:18;;31257:38:0;16497:166:1;31257:38:0;31810:4:::1;31800:14:::0;;-1:-1:-1;;31800:14:0::1;::::0;::::1;::::0;;31830:20:::1;1560:10:::0;31837:12:::1;31830:20;::::0;-1:-1:-1;;;;;8874:55:1;;;8856:74;;8844:2;8829:18;31830:20:0::1;;;;;;;31740:118::o:0;8706:317::-;8821:6;8796:21;:31;;8788:73;;;;-1:-1:-1;;;8788:73:0;;15760:2:1;8788:73:0;;;15742:21:1;15799:2;15779:18;;;15772:30;15838:31;15818:18;;;15811:59;15887:18;;8788:73:0;15732:179:1;8788:73:0;8875:12;8893:9;-1:-1:-1;;;;;8893:14:0;8915:6;8893:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8874:52;;;8945:7;8937:78;;;;-1:-1:-1;;;8937:78:0;;14921:2:1;8937:78:0;;;14903:21:1;14960:2;14940:18;;;14933:30;14999:34;14979:18;;;14972:62;15070:28;15050:18;;;15043:56;15116:19;;8937:78:0;14893:248:1;25651:497:0;25732:22;25740:4;25746:7;25732;:22::i;:::-;25727:414;;25920:41;25948:7;-1:-1:-1;;;;;25920:41:0;25958:2;25920:19;:41::i;:::-;26034:38;26062:4;26069:2;26034:19;:38::i;:::-;25825:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;25825:270:0;;;;;;;;;;-1:-1:-1;;;25771:358:0;;;;;;;:::i;29271:238::-;29355:22;29363:4;29369:7;29355;:22::i;:::-;29350:152;;29394:6;:12;;;;;;;;;;;-1:-1:-1;;;;;29394:29:0;;;;;;;;;:36;;-1:-1:-1;;29394:36:0;29426:4;29394:36;;;29477:12;1560:10;;1480:98;29477:12;-1:-1:-1;;;;;29450:40:0;29468:7;-1:-1:-1;;;;;29450:40:0;29462:4;29450:40;;;;;;;;;;29271:238;;:::o;29641:239::-;29725:22;29733:4;29739:7;29725;:22::i;:::-;29721:152;;;29796:5;29764:12;;;;;;;;;;;-1:-1:-1;;;;;29764:29:0;;;;;;;;;;:37;;-1:-1:-1;;29764:37:0;;;29821:40;1560:10;;29764:12;;29821:40;;29796:5;29821:40;29641:239;;:::o;15243:211::-;15387:58;;;-1:-1:-1;;;;;9465:55:1;;15387:58:0;;;9447:74:1;9537:18;;;;9530:34;;;15387:58:0;;;;;;;;;;9420:18:1;;;;15387:58:0;;;;;;;;-1:-1:-1;;;;;15387:58:0;-1:-1:-1;;;15387:58:0;;;15360:86;;15380:5;;15360:19;:86::i;31999:120::-;31011:7;;;;31535:41;;;;-1:-1:-1;;;31535:41:0;;11726:2:1;31535:41:0;;;11708:21:1;11765:2;11745:18;;;11738:30;11804:22;11784:18;;;11777:50;11844:18;;31535:41:0;11698:170:1;31535:41:0;32058:7:::1;:15:::0;;-1:-1:-1;;32058:15:0::1;::::0;;32089:22:::1;1560:10:::0;32098:12:::1;1480:98:::0;3281:451;3356:13;3382:19;3414:10;3418:6;3414:1;:10;:::i;:::-;:14;;3427:1;3414:14;:::i;:::-;3404:25;;;;;;-1:-1:-1;;;3404:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3404:25:0;;3382:47;;-1:-1:-1;;;3440:6:0;3447:1;3440:9;;;;;;-1:-1:-1;;;3440:9:0;;;;;;;;;;;;:15;-1:-1:-1;;;;;3440:15:0;;;;;;;;;-1:-1:-1;;;3466:6:0;3473:1;3466:9;;;;;;-1:-1:-1;;;3466:9:0;;;;;;;;;;;;:15;-1:-1:-1;;;;;3466:15:0;;;;;;;;-1:-1:-1;3497:9:0;3509:10;3513:6;3509:1;:10;:::i;:::-;:14;;3522:1;3509:14;:::i;:::-;3497:26;;3492:135;3529:1;3525;:5;3492:135;;;-1:-1:-1;;;3577:5:0;3585:3;3577:11;3564:25;;;;;-1:-1:-1;;;3564:25:0;;;;;;;;;;;;3552:6;3559:1;3552:9;;;;;;-1:-1:-1;;;3552:9:0;;;;;;;;;;;;:37;-1:-1:-1;;;;;3552:37:0;;;;;;;;-1:-1:-1;3614:1:0;3604:11;;;;;3532:3;;;:::i;:::-;;;3492:135;;;-1:-1:-1;3645:10:0;;3637:55;;;;-1:-1:-1;;;3637:55:0;;10942:2:1;3637:55:0;;;10924:21:1;;;10961:18;;;10954:30;11020:34;11000:18;;;10993:62;11072:18;;3637:55:0;10914:182:1;17816:716:0;18240:23;18266:69;18294:4;18266:69;;;;;;;;;;;;;;;;;18274:5;-1:-1:-1;;;;;18266:27:0;;;:69;;;;;:::i;:::-;18350:17;;18240:95;;-1:-1:-1;18350:21:0;18346:179;;18447:10;18436:30;;;;;;;;;;;;:::i;:::-;18428:85;;;;-1:-1:-1;;;18428:85:0;;20074:2:1;18428:85:0;;;20056:21:1;20113:2;20093:18;;;20086:30;20152:34;20132:18;;;20125:62;-1:-1:-1;;;20203:18:1;;;20196:40;20253:19;;18428:85:0;20046:232:1;10190:229:0;10327:12;10359:52;10381:6;10389:4;10395:1;10398:12;10359:21;:52::i;:::-;10352:59;10190:229;-1:-1:-1;;;;10190:229:0:o;11310:510::-;11480:12;11538:5;11513:21;:30;;11505:81;;;;-1:-1:-1;;;11505:81:0;;16118:2:1;11505:81:0;;;16100:21:1;16157:2;16137:18;;;16130:30;16196:34;16176:18;;;16169:62;-1:-1:-1;;;16247:18:1;;;16240:36;16293:19;;11505:81:0;16090:228:1;11505:81:0;7707:20;;11597:60;;;;-1:-1:-1;;;11597:60:0;;19225:2:1;11597:60:0;;;19207:21:1;19264:2;19244:18;;;19237:30;19303:31;19283:18;;;19276:59;19352:18;;11597:60:0;19197:179:1;11597:60:0;11671:12;11685:23;11712:6;-1:-1:-1;;;;;11712:11:0;11731:5;11738:4;11712:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11670:73;;;;11761:51;11778:7;11787:10;11799:12;11761:16;:51::i;:::-;11754:58;11310:510;-1:-1:-1;;;;;;;11310:510:0:o;13996:712::-;14146:12;14175:7;14171:530;;;-1:-1:-1;14206:10:0;14199:17;;14171:530;14320:17;;:21;14316:374;;14518:10;14512:17;14579:15;14566:10;14562:2;14558:19;14551:44;14466:148;14661:12;14654:20;;-1:-1:-1;;;14654:20:0;;;;;;;;:::i;14:173:1:-;81:20;;-1:-1:-1;;;;;;130:32:1;;120:43;;110:2;;177:1;174;167:12;110:2;62:125;;;:::o;192:188::-;260:20;;-1:-1:-1;;;;;309:46:1;;299:57;;289:2;;370:1;367;360:12;385:257;444:6;497:2;485:9;476:7;472:23;468:32;465:2;;;518:6;510;503:22;465:2;562:9;549:23;581:31;606:5;581:31;:::i;647:398::-;715:6;723;776:2;764:9;755:7;751:23;747:32;744:2;;;797:6;789;782:22;744:2;841:9;828:23;860:31;885:5;860:31;:::i;:::-;910:5;-1:-1:-1;967:2:1;952:18;;939:32;980:33;939:32;980:33;:::i;:::-;1032:7;1022:17;;;734:311;;;;;:::o;1050:462::-;1136:6;1144;1152;1160;1213:3;1201:9;1192:7;1188:23;1184:33;1181:2;;;1235:6;1227;1220:22;1181:2;1279:9;1266:23;1298:31;1323:5;1298:31;:::i;:::-;1348:5;1400:2;1385:18;;1372:32;;-1:-1:-1;1451:2:1;1436:18;;1423:32;;1502:2;1487:18;1474:32;;-1:-1:-1;1171:341:1;-1:-1:-1;;;1171:341:1:o;1517:297::-;1584:6;1637:2;1625:9;1616:7;1612:23;1608:32;1605:2;;;1658:6;1650;1643:22;1605:2;1695:9;1689:16;1748:5;1741:13;1734:21;1727:5;1724:32;1714:2;;1775:6;1767;1760:22;1819:190;1878:6;1931:2;1919:9;1910:7;1906:23;1902:32;1899:2;;;1952:6;1944;1937:22;1899:2;-1:-1:-1;1980:23:1;;1889:120;-1:-1:-1;1889:120:1:o;2014:325::-;2082:6;2090;2143:2;2131:9;2122:7;2118:23;2114:32;2111:2;;;2164:6;2156;2149:22;2111:2;2205:9;2192:23;2182:33;;2265:2;2254:9;2250:18;2237:32;2278:31;2303:5;2278:31;:::i;2344:1102::-;2430:6;2438;2446;2499:2;2487:9;2478:7;2474:23;2470:32;2467:2;;;2520:6;2512;2505:22;2467:2;2561:9;2548:23;2538:33;;2622:2;2611:9;2607:18;2594:32;2645:18;2686:2;2678:6;2675:14;2672:2;;;2707:6;2699;2692:22;2672:2;2750:6;2739:9;2735:22;2725:32;;2795:7;2788:4;2784:2;2780:13;2776:27;2766:2;;2822:6;2814;2807:22;2766:2;2863;2850:16;2885:2;2881;2878:10;2875:2;;;2891:18;;:::i;:::-;2966:2;2960:9;2934:2;3020:13;;-1:-1:-1;;3016:22:1;;;3040:2;3012:31;3008:40;2996:53;;;3064:18;;;3084:22;;;3061:46;3058:2;;;3110:18;;:::i;:::-;3150:10;3146:2;3139:22;3185:2;3177:6;3170:18;3225:7;3220:2;3215;3211;3207:11;3203:20;3200:33;3197:2;;;3251:6;3243;3236:22;3197:2;3312;3307;3303;3299:11;3294:2;3286:6;3282:15;3269:46;3335:15;;;3352:2;3331:24;3324:40;;;;2457:989;;3339:6;;-1:-1:-1;;;;3436:2:1;3421:18;;;;3408:32;;-1:-1:-1;2457:989:1:o;3451:258::-;3519:6;3527;3580:2;3568:9;3559:7;3555:23;3551:32;3548:2;;;3601:6;3593;3586:22;3548:2;-1:-1:-1;;3629:23:1;;;3699:2;3684:18;;;3671:32;;-1:-1:-1;3538:171:1:o;3714:194::-;3772:6;3825:2;3813:9;3804:7;3800:23;3796:32;3793:2;;;3846:6;3838;3831:22;3793:2;3874:28;3892:9;3874:28;:::i;3913:329::-;3980:6;3988;4041:2;4029:9;4020:7;4016:23;4012:32;4009:2;;;4062:6;4054;4047:22;4009:2;4090:28;4108:9;4090:28;:::i;4247:470::-;4323:6;4331;4339;4392:2;4380:9;4371:7;4367:23;4363:32;4360:2;;;4413:6;4405;4398:22;4360:2;4441:28;4459:9;4441:28;:::i;:::-;4431:38;;4519:2;4508:9;4504:18;4491:32;4532:31;4557:5;4532:31;:::i;:::-;4582:5;-1:-1:-1;4639:2:1;4624:18;;4611:32;4652:33;4611:32;4652:33;:::i;:::-;4704:7;4694:17;;;4350:367;;;;;:::o;4722:262::-;4789:6;4797;4850:2;4838:9;4829:7;4825:23;4821:32;4818:2;;;4871:6;4863;4856:22;4818:2;4899:28;4917:9;4899:28;:::i;:::-;4889:38;4974:2;4959:18;;;;4946:32;;-1:-1:-1;;;4808:176:1:o;4989:412::-;5071:6;5079;5132:2;5120:9;5111:7;5107:23;5103:32;5100:2;;;5153:6;5145;5138:22;5406:196;5465:6;5518:2;5506:9;5497:7;5493:23;5489:32;5486:2;;;5539:6;5531;5524:22;5486:2;5567:29;5586:9;5567:29;:::i;5607:264::-;5675:6;5683;5736:2;5724:9;5715:7;5711:23;5707:32;5704:2;;;5757:6;5749;5742:22;5704:2;5785:29;5804:9;5785:29;:::i;5876:270::-;5944:6;5952;6005:2;5993:9;5984:7;5980:23;5976:32;5973:2;;;6026:6;6018;6011:22;5973:2;6054:29;6073:9;6054:29;:::i;:::-;6044:39;;6102:38;6136:2;6125:9;6121:18;6102:38;:::i;:::-;6092:48;;5963:183;;;;;:::o;7045:274::-;7174:3;7212:6;7206:13;7228:53;7274:6;7269:3;7262:4;7254:6;7250:17;7228:53;:::i;:::-;7297:16;;;;;7182:137;-1:-1:-1;;7182:137:1:o;7919:786::-;8330:25;8325:3;8318:38;8300:3;8385:6;8379:13;8401:62;8456:6;8451:2;8446:3;8442:12;8435:4;8427:6;8423:17;8401:62;:::i;:::-;-1:-1:-1;;;8522:2:1;8482:16;;;8514:11;;;8507:40;8572:13;;8594:63;8572:13;8643:2;8635:11;;8628:4;8616:17;;8594:63;:::i;:::-;8677:17;8696:2;8673:26;;8308:397;-1:-1:-1;;;;8308:397:1:o;10352:383::-;10501:2;10490:9;10483:21;10464:4;10533:6;10527:13;10576:6;10571:2;10560:9;10556:18;10549:34;10592:66;10651:6;10646:2;10635:9;10631:18;10626:2;10618:6;10614:15;10592:66;:::i;:::-;10719:2;10698:15;-1:-1:-1;;10694:29:1;10679:45;;;;10726:2;10675:54;;10473:262;-1:-1:-1;;10473:262:1:o;12641:474::-;12843:2;12825:21;;;12882:2;12862:18;;;12855:30;12921:34;12916:2;12901:18;;12894:62;12992:34;12987:2;12972:18;;12965:62;-1:-1:-1;;;13058:3:1;13043:19;;13036:37;13105:3;13090:19;;12815:300::o;13956:402::-;14158:2;14140:21;;;14197:2;14177:18;;;14170:30;14236:34;14231:2;14216:18;;14209:62;-1:-1:-1;;;14302:2:1;14287:18;;14280:36;14348:3;14333:19;;14130:228::o;14363:351::-;14565:2;14547:21;;;14604:2;14584:18;;;14577:30;14643:29;14638:2;14623:18;;14616:57;14705:2;14690:18;;14537:177::o;21520:128::-;21560:3;21591:1;21587:6;21584:1;21581:13;21578:2;;;21597:18;;:::i;:::-;-1:-1:-1;21633:9:1;;21568:80::o;21653:204::-;21691:3;21727:4;21724:1;21720:12;21759:4;21756:1;21752:12;21794:3;21788:4;21784:14;21779:3;21776:23;21773:2;;;21802:18;;:::i;:::-;21838:13;;21699:158;-1:-1:-1;;;21699:158:1:o;21862:168::-;21902:7;21968:1;21964;21960:6;21956:14;21953:1;21950:21;21945:1;21938:9;21931:17;21927:45;21924:2;;;21975:18;;:::i;:::-;-1:-1:-1;22015:9:1;;21914:116::o;22035:125::-;22075:4;22103:1;22100;22097:8;22094:2;;;22108:18;;:::i;:::-;-1:-1:-1;22145:9:1;;22084:76::o;22165:258::-;22237:1;22247:113;22261:6;22258:1;22255:13;22247:113;;;22337:11;;;22331:18;22318:11;;;22311:39;22283:2;22276:10;22247:113;;;22378:6;22375:1;22372:13;22369:2;;;-1:-1:-1;;22413:1:1;22395:16;;22388:27;22218:205::o;22428:136::-;22467:3;22495:5;22485:2;;22504:18;;:::i;:::-;-1:-1:-1;;;22540:18:1;;22475:89::o;22569:127::-;22630:10;22625:3;22621:20;22618:1;22611:31;22661:4;22658:1;22651:15;22685:4;22682:1;22675:15;22701:127;22762:10;22757:3;22753:20;22750:1;22743:31;22793:4;22790:1;22783:15;22817:4;22814:1;22807:15;22833:154;-1:-1:-1;;;;;22912:5:1;22908:54;22901:5;22898:65;22888:2;;22977:1;22974;22967:12
Swarm Source
ipfs://6c8cbc1a20ec9100e34aef8d1d2e0dcfc3ce9b596b559ec14105a8000ae7e0a0
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Validator ID :
0 FTM
Amount Staked
0
Amount Delegated
0
Staking Total
0
Staking Start Epoch
0
Staking Start Time
0
Proof of Importance
0
Origination Score
0
Validation Score
0
Active
0
Online
0
Downtime
0 s
Address | Amount | claimed Rewards | Created On Epoch | Created On |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.