Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 76 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Lock | 21208477 | 5 days ago | IN | 0.00069203 ETH | 0.000561 | ||||
Lock | 21206753 | 5 days ago | IN | 0 ETH | 0.00023715 | ||||
Lock | 21199604 | 6 days ago | IN | 0 ETH | 0.00069966 | ||||
Lock | 21103637 | 19 days ago | IN | 0 ETH | 0.00027012 | ||||
Lock | 21103590 | 19 days ago | IN | 0 ETH | 0.00024397 | ||||
Lock | 21024768 | 30 days ago | IN | 0.159 ETH | 0.00034545 | ||||
Lock | 21019721 | 31 days ago | IN | 0 ETH | 0.00040381 | ||||
Lock | 21019486 | 31 days ago | IN | 0 ETH | 0.00061119 | ||||
Lock | 21019485 | 31 days ago | IN | 0 ETH | 0.00055434 | ||||
Lock | 21019460 | 31 days ago | IN | 0 ETH | 0.00055348 | ||||
Lock | 21004277 | 33 days ago | IN | 0.01828048 ETH | 0.00034598 | ||||
Lock | 20918898 | 45 days ago | IN | 0.001 ETH | 0.00051873 | ||||
Lock | 20888581 | 49 days ago | IN | 1.5 ETH | 0.00021092 | ||||
Lock | 20888566 | 49 days ago | IN | 1 ETH | 0.00023277 | ||||
Lock | 20888548 | 49 days ago | IN | 1 ETH | 0.0002219 | ||||
Lock | 20888506 | 49 days ago | IN | 1 ETH | 0.00023233 | ||||
Lock | 20888415 | 49 days ago | IN | 0.002 ETH | 0.00020371 | ||||
Lock | 20865884 | 53 days ago | IN | 0 ETH | 0.00134132 | ||||
Lock | 20865857 | 53 days ago | IN | 0 ETH | 0.00123484 | ||||
Lock | 20865843 | 53 days ago | IN | 0 ETH | 0.00118062 | ||||
Lock | 20839922 | 56 days ago | IN | 0 ETH | 0.0006438 | ||||
Lock | 20839874 | 56 days ago | IN | 0 ETH | 0.0007017 | ||||
Lock | 20839871 | 56 days ago | IN | 0 ETH | 0.00068083 | ||||
Lock | 20839759 | 56 days ago | IN | 0 ETH | 0.00075164 | ||||
Lock | 20839756 | 56 days ago | IN | 0 ETH | 0.00076123 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
21208477 | 5 days ago | 0.00069203 ETH | ||||
21024768 | 30 days ago | 0.159 ETH | ||||
21004277 | 33 days ago | 0.01828048 ETH | ||||
20918898 | 45 days ago | 0.001 ETH | ||||
20888581 | 49 days ago | 1.5 ETH | ||||
20888566 | 49 days ago | 1 ETH | ||||
20888548 | 49 days ago | 1 ETH | ||||
20888506 | 49 days ago | 1 ETH | ||||
20888415 | 49 days ago | 0.002 ETH | ||||
20760032 | 67 days ago | 0.00112815 ETH | ||||
20745105 | 69 days ago | 0.009 ETH | ||||
20727860 | 72 days ago | 0.1 ETH | ||||
20601391 | 90 days ago | 0.009 ETH | ||||
20574095 | 93 days ago | 0.001 ETH | ||||
20380597 | 120 days ago | 0.006 ETH | ||||
19736732 | 210 days ago | 0.000001 ETH | ||||
19736712 | 210 days ago | 0.001 ETH | ||||
19733936 | 211 days ago | 0.000001 ETH | ||||
19730995 | 211 days ago | 0.00000199 ETH | ||||
19730964 | 211 days ago | 0.000001 ETH | ||||
19730864 | 211 days ago | 0.000001 ETH | ||||
19730831 | 211 days ago | 0.00001 ETH | ||||
19730578 | 211 days ago | 0.00073476 ETH | ||||
19730511 | 211 days ago | 0.001 ETH | ||||
19715244 | 213 days ago | 0.001 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
ExchangeBridge
Compiler Version
v0.8.24+commit.e11b9ed9
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-04-09 */ // Sources flattened with hardhat v2.20.1 https://hardhat.org // SPDX-License-Identifier: MIT AND UNLICENSED // File @openzeppelin/contracts/access/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol) pragma solidity ^0.8.20; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev The `account` is missing a role. */ error AccessControlUnauthorizedAccount(address account, bytes32 neededRole); /** * @dev The caller of a function is not the expected one. * * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}. */ error AccessControlBadConfirmation(); /** * @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. */ 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 `callerConfirmation`. */ function renounceRole(bytes32 role, address callerConfirmation) external; } // File @openzeppelin/contracts/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } // File @openzeppelin/contracts/utils/introspection/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @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); } // File @openzeppelin/contracts/utils/introspection/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol) pragma solidity ^0.8.20; /** * @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); * } * ``` */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/access/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol) pragma solidity ^0.8.20; /** * @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: * * ```solidity * 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}: * * ```solidity * 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. We recommend using {AccessControlDefaultAdminRules} * to enforce additional security measures for this role. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address account => bool) hasRole; bytes32 adminRole; } mapping(bytes32 role => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with an {AccessControlUnauthorizedAccount} error including the required role. */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @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 virtual returns (bool) { return _roles[role].hasRole[account]; } /** * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()` * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier. */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account` * is missing `role`. */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert AccessControlUnauthorizedAccount(account, role); } } /** * @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 virtual 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. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual 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. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual 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 `callerConfirmation`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address callerConfirmation) public virtual { if (callerConfirmation != _msgSender()) { revert AccessControlBadConfirmation(); } _revokeRole(role, callerConfirmation); } /** * @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 Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual returns (bool) { if (!hasRole(role, account)) { _roles[role].hasRole[account] = true; emit RoleGranted(role, account, _msgSender()); return true; } else { return false; } } /** * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual returns (bool) { if (hasRole(role, account)) { _roles[role].hasRole[account] = false; emit RoleRevoked(role, account, _msgSender()); return true; } else { return false; } } } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * ==== Security Considerations * * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be * considered as an intention to spend the allowance in any specific way. The second is that because permits have * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be * generally recommended is: * * ```solidity * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} * doThing(..., value); * } * * function doThing(..., uint256 value) public { * token.safeTransferFrom(msg.sender, address(this), value); * ... * } * ``` * * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also * {SafeERC20-safeTransferFrom}). * * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so * contracts should have entry points that don't rely on permit. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. * * CAUTION: See Security Considerations above. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File @openzeppelin/contracts/token/ERC20/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); } // File @openzeppelin/contracts/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol) pragma solidity ^0.8.20; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error AddressInsufficientBalance(address account); /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedInnerCall(); /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert AddressInsufficientBalance(address(this)); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert FailedInnerCall(); } } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {FailedInnerCall} error. * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert AddressInsufficientBalance(address(this)); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an * unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {FailedInnerCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. */ function _revert(bytes memory returndata) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert FailedInnerCall(); } } } // File @openzeppelin/contracts/token/ERC20/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.20; /** * @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; /** * @dev An operation with an ERC20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @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); if (returndata.length != 0 && !abi.decode(returndata, (bool))) { revert SafeERC20FailedOperation(address(token)); } } /** * @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). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // 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 cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0; } } // File @openzeppelin/contracts/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Multicall.sol) pragma solidity ^0.8.20; /** * @dev Provides a function to batch together multiple calls in a single external call. * * Consider any assumption about calldata validation performed by the sender may be violated if it's not especially * careful about sending transactions invoking {multicall}. For example, a relay address that filters function * selectors won't filter calls nested within a {multicall} operation. * * NOTE: Since 5.0.1 and 4.9.4, this contract identifies non-canonical contexts (i.e. `msg.sender` is not {_msgSender}). * If a non-canonical context is identified, the following self `delegatecall` appends the last bytes of `msg.data` * to the subcall. This makes it safe to use with {ERC2771Context}. Contexts that don't affect the resolution of * {_msgSender} are not propagated to subcalls. */ abstract contract Multicall is Context { /** * @dev Receives and executes a batch of function calls on this contract. * @custom:oz-upgrades-unsafe-allow-reachable delegatecall */ function multicall(bytes[] calldata data) external virtual returns (bytes[] memory results) { bytes memory context = msg.sender == _msgSender() ? new bytes(0) : msg.data[msg.data.length - _contextSuffixLength():]; results = new bytes[](data.length); for (uint256 i = 0; i < data.length; i++) { results[i] = Address.functionDelegateCall(address(this), bytes.concat(data[i], context)); } return results; } } // File @openzeppelin/contracts/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/Pausable.sol) pragma solidity ^0.8.20; /** * @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 { bool private _paused; /** * @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); /** * @dev The operation failed because the contract is paused. */ error EnforcedPause(); /** * @dev The operation failed because the contract is not paused. */ error ExpectedPause(); /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { if (paused()) { revert EnforcedPause(); } } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { if (!paused()) { revert ExpectedPause(); } } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File contracts/ExchangeBridge.sol // Original license: SPDX_License_Identifier: UNLICENSED pragma solidity 0.8.24; //TODO slippage values in lock function 10**18 contract ExchangeBridge is AccessControl, Pausable, Multicall { using SafeERC20 for IERC20; address public liquidityPool; bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE"); bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); bytes32 public constant UNPAUSER_ROLE = keccak256("UNPAUSER_ROLE"); bytes32 public constant UNLOCKER_ROLE = keccak256("UNLOCKER_ROLE"); bytes32 public constant TRANSFER_ROLE = keccak256("TRANSFER_ROLE"); mapping(uint256 => bool) public processed; mapping(uint256 => uint256) public chainToFrom; mapping(uint256 => bool) private _tokenWhitelist; mapping(address => bool) public blacklist; bool public forwardNative = true; constructor(address admin, address _liquidityPool) { liquidityPool = _liquidityPool; _grantRole(DEFAULT_ADMIN_ROLE, admin); _grantRole(ADMIN_ROLE, admin); _grantRole(PAUSER_ROLE, admin); _grantRole(UNPAUSER_ROLE, admin); _grantRole(UNLOCKER_ROLE, admin); _grantRole(TRANSFER_ROLE, admin); } receive() external payable whenNotPaused {} event Lock(uint256 indexed fromToken, uint256 indexed toToken, address indexed fromAccount, address toAccount, uint256 fromAmount, string metadata); event Unlock(uint256 indexed cce, uint256 indexed toToken, address indexed toAccount, uint256 toAmount); event AdminTransfer(address indexed token, address recipient, uint256 amount); event SetLiquidityPool(address pool); event SetProcessed(uint256 cce, bool value); event SetTokenWhitelist(uint256 fromToken, bool value); event SetBlacklist(address user, bool value); event SetForwardNative(bool value); function tokenWhitelist(address token) external view returns(bool) { return _tokenWhitelist[toCCA(block.chainid, token)]; } function tokenWhitelist(uint256 cca) external view returns(bool) { return _tokenWhitelist[cca]; } function pause() public onlyRole(PAUSER_ROLE) { _pause(); } function unpause() public onlyRole(UNPAUSER_ROLE) { _unpause(); } function toCCA(uint256 chainId, address localAddress) public pure returns(uint256 cca) { return (chainId << 160) + uint256(uint160(localAddress)); } function fromCCA(uint256 cca) public pure returns(uint256 chainId, address localAddress) { chainId = cca >> 160; localAddress = address(uint160(cca)); } function toCCE(uint64 chainId, uint64 blockNumber, uint64 transactionIndex, uint64 logIndex) public pure returns(uint256 cce) { uint256 bits = 64; return (uint256(chainId) << (3*bits)) + (uint256(blockNumber) << (2*bits)) + (uint256(transactionIndex) << (bits)) + uint256(logIndex); } function fromCCE(uint256 cce) public pure returns(uint64 chainId, uint64 blockNumber, uint64 transactionIndex, uint64 logIndex) { uint256 bits = 64; chainId = uint64(cce >> (3*bits)); blockNumber = uint64(cce >> (2*bits)); transactionIndex = uint64(cce >> bits); logIndex = uint64(cce); } // const { fromTokenAddress, toTokenAddress, amount } = event.returnValues; function _lock(uint256 fromToken, uint256 toToken, address fromAccount, address toAccount, uint256 fromAmount, string calldata metadata) private { ( /* uint256 chainId */, address fromTokenAddress) = fromCCA(fromToken); require(_tokenWhitelist[fromToken], "Token must be whitelisted"); require(!blacklist[fromAccount] && !blacklist[toAccount] && !blacklist[msg.sender], "Accounts cannot be blacklisted"); require(fromAccount != address(0) && toAccount != address(0), "Accounts must not be the null address"); require(fromAmount > 0, "Amount must be greater than 0"); require(fromTokenAddress != address(0) || fromAmount == msg.value, "msg.value must equal amount"); if(fromTokenAddress == address(0)) { if(forwardNative) payable(liquidityPool).transfer(msg.value); } else { IERC20(fromTokenAddress).safeTransferFrom(fromAccount, liquidityPool, fromAmount); } emit Lock(fromToken, toToken, fromAccount, toAccount, fromAmount, metadata); } function lock(uint256 fromToken, uint256 toToken, uint256 amount, string calldata metadata) external payable whenNotPaused { _lock(fromToken, toToken, msg.sender, msg.sender, amount, metadata); } function lock(uint256 fromToken, uint256 toToken, address fromAccount, address toAccount, uint256 amount, string calldata metadata) external payable whenNotPaused { _lock(fromToken, toToken, fromAccount, toAccount, amount, metadata); } function unlock(uint256 cce, uint256 token, address account, uint256 amount) public payable onlyRole(UNLOCKER_ROLE) returns(bool) { bool isProcessed = processed[cce]; if(isProcessed) return false; ( /* uint256 chainId */, address tokenAddress) = fromCCA(token); require(!blacklist[account], "Accounts cannot be blacklisted"); require(account != address(0), "Accounts must not be the null address"); require(amount > 0, "Amount must be greater than 0"); if(tokenAddress == address(0)) { payable(account).transfer(amount); } else { // reverts on failure IERC20(tokenAddress).safeTransferFrom(liquidityPool, account, amount); } processed[cce] = true; uint256 fromChainId = cce >> 3 * 64; uint256 currentFrom = chainToFrom[fromChainId]; if(currentFrom < cce) chainToFrom[fromChainId] = cce; emit Unlock(cce, token, account, amount); return true; } // these are for extracting funds from the contract for when users mistakenly send funds directly to it function transferNative(address payable recipient, uint256 amount) external onlyRole(TRANSFER_ROLE) { recipient.transfer(amount); emit AdminTransfer(address(0), recipient, amount); } function transferERC20(address token, address recipient, uint256 amount) external onlyRole(TRANSFER_ROLE) { IERC20(token).safeTransfer(recipient, amount); emit AdminTransfer(token, recipient, amount); } function setLiquidityPool(address pool) external onlyRole(ADMIN_ROLE) { liquidityPool = pool; emit SetLiquidityPool(pool); } function setProcessed(uint256 cce, bool value) external onlyRole(ADMIN_ROLE) { processed[cce] = value; emit SetProcessed(cce, value); } function setTokenWhitelist(uint256 token, bool value) external onlyRole(ADMIN_ROLE) { _tokenWhitelist[token] = value; emit SetTokenWhitelist(token, value); } function setBlacklist(address user, bool value) external onlyRole(ADMIN_ROLE) { blacklist[user] = value; emit SetBlacklist(user, value); } function setForwardNative(bool value) external onlyRole(ADMIN_ROLE) { forwardNative = value; emit SetForwardNative(value); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"_liquidityPool","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AdminTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromToken","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"toToken","type":"uint256"},{"indexed":true,"internalType":"address","name":"fromAccount","type":"address"},{"indexed":false,"internalType":"address","name":"toAccount","type":"address"},{"indexed":false,"internalType":"uint256","name":"fromAmount","type":"uint256"},{"indexed":false,"internalType":"string","name":"metadata","type":"string"}],"name":"Lock","type":"event"},{"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":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"value","type":"bool"}],"name":"SetBlacklist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"value","type":"bool"}],"name":"SetForwardNative","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pool","type":"address"}],"name":"SetLiquidityPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"cce","type":"uint256"},{"indexed":false,"internalType":"bool","name":"value","type":"bool"}],"name":"SetProcessed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fromToken","type":"uint256"},{"indexed":false,"internalType":"bool","name":"value","type":"bool"}],"name":"SetTokenWhitelist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"cce","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"toToken","type":"uint256"},{"indexed":true,"internalType":"address","name":"toAccount","type":"address"},{"indexed":false,"internalType":"uint256","name":"toAmount","type":"uint256"}],"name":"Unlock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNLOCKER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNPAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"chainToFrom","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forwardNative","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"cca","type":"uint256"}],"name":"fromCCA","outputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"localAddress","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"cce","type":"uint256"}],"name":"fromCCE","outputs":[{"internalType":"uint64","name":"chainId","type":"uint64"},{"internalType":"uint64","name":"blockNumber","type":"uint64"},{"internalType":"uint64","name":"transactionIndex","type":"uint64"},{"internalType":"uint64","name":"logIndex","type":"uint64"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"fromToken","type":"uint256"},{"internalType":"uint256","name":"toToken","type":"uint256"},{"internalType":"address","name":"fromAccount","type":"address"},{"internalType":"address","name":"toAccount","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"metadata","type":"string"}],"name":"lock","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fromToken","type":"uint256"},{"internalType":"uint256","name":"toToken","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"metadata","type":"string"}],"name":"lock","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"processed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setForwardNative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"}],"name":"setLiquidityPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"cce","type":"uint256"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setProcessed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"token","type":"uint256"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setTokenWhitelist","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":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"localAddress","type":"address"}],"name":"toCCA","outputs":[{"internalType":"uint256","name":"cca","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainId","type":"uint64"},{"internalType":"uint64","name":"blockNumber","type":"uint64"},{"internalType":"uint64","name":"transactionIndex","type":"uint64"},{"internalType":"uint64","name":"logIndex","type":"uint64"}],"name":"toCCE","outputs":[{"internalType":"uint256","name":"cce","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"cca","type":"uint256"}],"name":"tokenWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"tokenWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferNative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"cce","type":"uint256"},{"internalType":"uint256","name":"token","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unlock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526006805460ff191660011790553480156200001e57600080fd5b50604051620023a4380380620023a4833981016040819052620000419162000223565b600180546001600160a81b0319166101006001600160a01b038416021790556200006d60008362000157565b506200009a7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217758362000157565b50620000c77f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a8362000157565b50620000f47f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a8362000157565b50620001217fc806897caf4fd5068191157e44d3988e43139a37e0b97b6793e1ed11841406048362000157565b506200014e7f8502233096d909befbda0999bb8ea2f3a6be3c138b9fbf003752a4c8bce86f6c8362000157565b5050506200025b565b6000828152602081815260408083206001600160a01b038516845290915281205460ff16620001fc576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055620001b33390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600162000200565b5060005b92915050565b80516001600160a01b03811681146200021e57600080fd5b919050565b600080604083850312156200023757600080fd5b620002428362000206565b9150620002526020840162000206565b90509250929050565b612139806200026b6000396000f3fe60806040526004361061026e5760003560e01c80637d2e90c211610153578063b1ccdc93116100cb578063ec4b0c761161007f578063f9f92be411610064578063f9f92be4146107cb578063fb1bb9de146107fb578063fb79abdb1461082f57600080fd5b8063ec4b0c7614610791578063efd00e8a146107b157600080fd5b8063d547741f116100b0578063d547741f14610709578063e043b2b214610729578063e63ab1e91461075d57600080fd5b8063b1ccdc93146106a2578063c0c798ee146106b557600080fd5b80639a339fa311610122578063a217fddf11610107578063a217fddf14610640578063a546c57514610655578063ac9650d81461067557600080fd5b80639a339fa3146106005780639db5dbe41461062057600080fd5b80637d2e90c2146105675780638456cb59146105875780638d4b29e21461059c57806391d14854146105bc57600080fd5b80632f2ff15d116101e65780635c975abb116101b5578063665a11ca1161019a578063665a11ca146104d6578063753d75631461051357806375b238fc1461053357600080fd5b80635c975abb1461048e57806362d49284146104a657600080fd5b80632f2ff15d14610419578063360a76a81461043957806336568abe146104595780633f4ba83a1461047957600080fd5b806317d408d21161023d578063206b60f911610222578063206b60f91461037a5780632335c074146103bc578063248a9ca3146103e957600080fd5b806317d408d2146103275780631c3cc0251461036757600080fd5b8063018770201461028257806301ffc9a7146102a257806305a79e06146102d7578063153b0d1e1461030757600080fd5b3661027d5761027b610842565b005b600080fd5b34801561028e57600080fd5b5061027b61029d366004611b24565b610881565b3480156102ae57600080fd5b506102c26102bd366004611b41565b610920565b60405190151581526020015b60405180910390f35b3480156102e357600080fd5b506102c26102f2366004611b83565b60026020526000908152604090205460ff1681565b34801561031357600080fd5b5061027b610322366004611baa565b6109b9565b34801561033357600080fd5b5061034a610342366004611b83565b60a081901c91565b604080519283526001600160a01b039091166020830152016102ce565b6102c2610375366004611be3565b610a48565b34801561038657600080fd5b506103ae7f8502233096d909befbda0999bb8ea2f3a6be3c138b9fbf003752a4c8bce86f6c81565b6040519081526020016102ce565b3480156103c857600080fd5b506103ae6103d7366004611b83565b60036020526000908152604090205481565b3480156103f557600080fd5b506103ae610404366004611b83565b60009081526020819052604090206001015490565b34801561042557600080fd5b5061027b610434366004611c22565b610cc2565b34801561044557600080fd5b5061027b610454366004611c47565b610ced565b34801561046557600080fd5b5061027b610474366004611c22565b610d58565b34801561048557600080fd5b5061027b610da9565b34801561049a57600080fd5b5060015460ff166102c2565b3480156104b257600080fd5b506102c26104c1366004611b83565b60009081526004602052604090205460ff1690565b3480156104e257600080fd5b506001546104fb9061010090046001600160a01b031681565b6040516001600160a01b0390911681526020016102ce565b34801561051f57600080fd5b506102c261052e366004611b24565b610dde565b34801561053f57600080fd5b506103ae7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177581565b34801561057357600080fd5b5061027b610582366004611c64565b610e08565b34801561059357600080fd5b5061027b610eb3565b3480156105a857600080fd5b5061027b6105b7366004611c90565b610ee5565b3480156105c857600080fd5b506102c26105d7366004611c22565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b34801561060c57600080fd5b506103ae61061b366004611c22565b610f61565b34801561062c57600080fd5b5061027b61063b366004611cb5565b610f81565b34801561064c57600080fd5b506103ae600081565b34801561066157600080fd5b5061027b610670366004611c90565b61100b565b34801561068157600080fd5b50610695610690366004611cf6565b611087565b6040516102ce9190611d8f565b61027b6106b0366004611e52565b61116f565b3480156106c157600080fd5b506106d56106d0366004611b83565b61118f565b6040805167ffffffffffffffff958616815293851660208501529184169183019190915290911660608201526080016102ce565b34801561071557600080fd5b5061027b610724366004611c22565b6111c5565b34801561073557600080fd5b506103ae7fc806897caf4fd5068191157e44d3988e43139a37e0b97b6793e1ed118414060481565b34801561076957600080fd5b506103ae7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b34801561079d57600080fd5b506103ae6107ac366004611ef5565b6111ea565b3480156107bd57600080fd5b506006546102c29060ff1681565b3480156107d757600080fd5b506102c26107e6366004611b24565b60056020526000908152604090205460ff1681565b34801561080757600080fd5b506103ae7f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a81565b61027b61083d366004611f49565b611266565b60015460ff161561087f576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217756108ab81611284565b600180547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b038516908102919091179091556040519081527fe926a1c76b7cba5ee912418709df854ad32aab2035491b1d0ce9c0117735452f906020015b60405180910390a15050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806109b357507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217756109e381611284565b6001600160a01b038316600081815260056020908152604091829020805460ff19168615159081179091558251938452908301527ffed07c88bd5d31bfd0ce77ed7ffdc74a163a61cfc5edcec801e3a7954e33d6e791015b60405180910390a1505050565b60007fc806897caf4fd5068191157e44d3988e43139a37e0b97b6793e1ed1184140604610a7481611284565b60008681526002602052604090205460ff168015610a96576000925050610cb9565b6001600160a01b038516600090815260056020526040902054869060ff1615610b065760405162461bcd60e51b815260206004820152601e60248201527f4163636f756e74732063616e6e6f7420626520626c61636b6c6973746564000060448201526064015b60405180910390fd5b6001600160a01b038616610b6a5760405162461bcd60e51b815260206004820152602560248201527f4163636f756e7473206d757374206e6f7420626520746865206e756c6c206164604482015264647265737360d81b6064820152608401610afd565b60008511610bba5760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610afd565b6001600160a01b038116610c04576040516001600160a01b0387169086156108fc029087906000818181858888f19350505050158015610bfe573d6000803e3d6000fd5b50610c24565b600154610c24906001600160a01b0383811691610100900416888861128e565b6000888152600260209081526040808320805460ff1916600117905560c08b901c80845260039092529091205489811015610c6b5760008281526003602052604090208a90555b876001600160a01b0316898b7f87e62b77ca30a0be4c6943c9965118aaf5e9cf046789a04c647646f8e9044d768a604051610ca891815260200190565b60405180910390a460019550505050505b50949350505050565b600082815260208190526040902060010154610cdd81611284565b610ce7838361130a565b50505050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775610d1781611284565b6006805460ff19168315159081179091556040519081527f53b94bfc8864e32aef953694bad4077a5983f3059d5fd51b217d2741eb56d56390602001610914565b6001600160a01b0381163314610d9a576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610da482826113b4565b505050565b7f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a610dd381611284565b610ddb611437565b50565b600060046000610dee4685610f61565b815260208101919091526040016000205460ff1692915050565b7f8502233096d909befbda0999bb8ea2f3a6be3c138b9fbf003752a4c8bce86f6c610e3281611284565b6040516001600160a01b0384169083156108fc029084906000818181858888f19350505050158015610e68573d6000803e3d6000fd5b50604080516001600160a01b0385168152602081018490526000917f728fe8c3e9dd087cac70e8ff44565c920a2bb77c726ed3191394fefb4aabc358910160405180910390a2505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610edd81611284565b610ddb611489565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775610f0f81611284565b600083815260026020908152604091829020805460ff19168515159081179091558251868152918201527f33759c691d25f6b24f6403f92f17104b299f028e8f779e47ff218c7729f15a059101610a3b565b6000610f7a6001600160a01b03831660a085901b611fc0565b9392505050565b7f8502233096d909befbda0999bb8ea2f3a6be3c138b9fbf003752a4c8bce86f6c610fab81611284565b610fbf6001600160a01b03851684846114c4565b604080516001600160a01b038581168252602082018590528616917f728fe8c3e9dd087cac70e8ff44565c920a2bb77c726ed3191394fefb4aabc358910160405180910390a250505050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177561103581611284565b600083815260046020908152604091829020805460ff19168515159081179091558251868152918201527f8e51431983b1f648d303a77c1aa794c687a2d4cb986747dcd18b7296c6fd55129101610a3b565b6040805160008152602081019091526060908267ffffffffffffffff8111156110b2576110b2611fd3565b6040519080825280602002602001820160405280156110e557816020015b60608152602001906001900390816110d05790505b50915060005b83811015611167576111423086868481811061110957611109611fe9565b905060200281019061111b9190611fff565b8560405160200161112e93929190612046565b6040516020818303038152906040526114f5565b83828151811061115457611154611fe9565b60209081029190910101526001016110eb565b505092915050565b611177610842565b6111868787878787878761156b565b50505050505050565b600080808060406111a181600361206d565b86901c94506111b181600261206d565b94969486901c959081901c94909350915050565b6000828152602081905260409020600101546111e081611284565b610ce783836113b4565b6000604067ffffffffffffffff83166fffffffffffffffff000000000000000085831b1661121983600261206d565b67ffffffffffffffff8816901b61123184600361206d565b8967ffffffffffffffff16901b6112489190611fc0565b6112529190611fc0565b61125c9190611fc0565b9695505050505050565b61126e610842565b61127d8585333387878761156b565b5050505050565b610ddb8133611876565b6040516001600160a01b038481166024830152838116604483015260648201839052610ce79186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506118e6565b6000828152602081815260408083206001600160a01b038516845290915281205460ff166113ac576000838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556113643390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016109b3565b5060006109b3565b6000828152602081815260408083206001600160a01b038516845290915281205460ff16156113ac576000838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016109b3565b61143f611962565b6001805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b611491610842565b6001805460ff1916811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2583361146c565b6040516001600160a01b03838116602483015260448201839052610da491859182169063a9059cbb906064016112c3565b6060600080846001600160a01b0316846040516115129190612084565b600060405180830381855af49150503d806000811461154d576040519150601f19603f3d011682016040523d82523d6000602084013e611552565b606091505b509150915061156285838361199e565b95945050505050565b600087815260046020526040902054879060ff166115cb5760405162461bcd60e51b815260206004820152601960248201527f546f6b656e206d7573742062652077686974656c6973746564000000000000006044820152606401610afd565b6001600160a01b03861660009081526005602052604090205460ff1615801561160d57506001600160a01b03851660009081526005602052604090205460ff16155b801561162957503360009081526005602052604090205460ff16155b6116755760405162461bcd60e51b815260206004820152601e60248201527f4163636f756e74732063616e6e6f7420626520626c61636b6c697374656400006044820152606401610afd565b6001600160a01b0386161580159061169557506001600160a01b03851615155b6116ef5760405162461bcd60e51b815260206004820152602560248201527f4163636f756e7473206d757374206e6f7420626520746865206e756c6c206164604482015264647265737360d81b6064820152608401610afd565b6000841161173f5760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610afd565b6001600160a01b03811615158061175557503484145b6117a15760405162461bcd60e51b815260206004820152601b60248201527f6d73672e76616c7565206d75737420657175616c20616d6f756e7400000000006044820152606401610afd565b6001600160a01b0381166118015760065460ff16156117fc576001546040516001600160a01b0361010090920491909116903480156108fc02916000818181858888f193505050501580156117fa573d6000803e3d6000fd5b505b611823565b600154611823906001600160a01b03838116918991610100909104168761128e565b856001600160a01b031687897f6200833ed557d034c30cfa2ca749793cc6ff6554a45ae2c0f2afc4c83492d1f98888888860405161186494939291906120a0565b60405180910390a45050505050505050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff166118e2576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260248101839052604401610afd565b5050565b60006118fb6001600160a01b03841683611a13565b9050805160001415801561192057508080602001905181019061191e91906120e6565b155b15610da4576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401610afd565b60015460ff1661087f576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826119b3576119ae82611a21565b610f7a565b81511580156119ca57506001600160a01b0384163b155b15611a0c576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610afd565b5092915050565b6060610f7a83836000611a63565b805115611a315780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606081471015611aa1576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610afd565b600080856001600160a01b03168486604051611abd9190612084565b60006040518083038185875af1925050503d8060008114611afa576040519150601f19603f3d011682016040523d82523d6000602084013e611aff565b606091505b509150915061125c86838361199e565b6001600160a01b0381168114610ddb57600080fd5b600060208284031215611b3657600080fd5b8135610f7a81611b0f565b600060208284031215611b5357600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610f7a57600080fd5b600060208284031215611b9557600080fd5b5035919050565b8015158114610ddb57600080fd5b60008060408385031215611bbd57600080fd5b8235611bc881611b0f565b91506020830135611bd881611b9c565b809150509250929050565b60008060008060808587031215611bf957600080fd5b84359350602085013592506040850135611c1281611b0f565b9396929550929360600135925050565b60008060408385031215611c3557600080fd5b823591506020830135611bd881611b0f565b600060208284031215611c5957600080fd5b8135610f7a81611b9c565b60008060408385031215611c7757600080fd5b8235611c8281611b0f565b946020939093013593505050565b60008060408385031215611ca357600080fd5b823591506020830135611bd881611b9c565b600080600060608486031215611cca57600080fd5b8335611cd581611b0f565b92506020840135611ce581611b0f565b929592945050506040919091013590565b60008060208385031215611d0957600080fd5b823567ffffffffffffffff80821115611d2157600080fd5b818501915085601f830112611d3557600080fd5b813581811115611d4457600080fd5b8660208260051b8501011115611d5957600080fd5b60209290920196919550909350505050565b60005b83811015611d86578181015183820152602001611d6e565b50506000910152565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015611dfc57878503603f1901845281518051808752611ddd818989018a8501611d6b565b601f01601f191695909501860194509285019290850190600101611db6565b5092979650505050505050565b60008083601f840112611e1b57600080fd5b50813567ffffffffffffffff811115611e3357600080fd5b602083019150836020828501011115611e4b57600080fd5b9250929050565b600080600080600080600060c0888a031215611e6d57600080fd5b87359650602088013595506040880135611e8681611b0f565b94506060880135611e9681611b0f565b93506080880135925060a088013567ffffffffffffffff811115611eb957600080fd5b611ec58a828b01611e09565b989b979a50959850939692959293505050565b803567ffffffffffffffff81168114611ef057600080fd5b919050565b60008060008060808587031215611f0b57600080fd5b611f1485611ed8565b9350611f2260208601611ed8565b9250611f3060408601611ed8565b9150611f3e60608601611ed8565b905092959194509250565b600080600080600060808688031215611f6157600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff811115611f8d57600080fd5b611f9988828901611e09565b969995985093965092949392505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156109b3576109b3611faa565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261201657600080fd5b83018035915067ffffffffffffffff82111561203157600080fd5b602001915036819003821315611e4b57600080fd5b828482376000838201600081528351612063818360208801611d6b565b0195945050505050565b80820281158282048414176109b3576109b3611faa565b60008251612096818460208701611d6b565b9190910192915050565b6001600160a01b038516815283602082015260606040820152816060820152818360808301376000818301608090810191909152601f909201601f191601019392505050565b6000602082840312156120f857600080fd5b8151610f7a81611b9c56fea26469706673582212201dd0f9d7ca48f0c62df1fe150bc0a29fd144ddd75135e7a806434c90343c3a4464736f6c634300081800330000000000000000000000007f745445c9f4d98ce48280390c8ba9b9370ec19a00000000000000000000000007063bfabbcf8733bd6570efa3e38113f09251c1
Deployed Bytecode
0x60806040526004361061026e5760003560e01c80637d2e90c211610153578063b1ccdc93116100cb578063ec4b0c761161007f578063f9f92be411610064578063f9f92be4146107cb578063fb1bb9de146107fb578063fb79abdb1461082f57600080fd5b8063ec4b0c7614610791578063efd00e8a146107b157600080fd5b8063d547741f116100b0578063d547741f14610709578063e043b2b214610729578063e63ab1e91461075d57600080fd5b8063b1ccdc93146106a2578063c0c798ee146106b557600080fd5b80639a339fa311610122578063a217fddf11610107578063a217fddf14610640578063a546c57514610655578063ac9650d81461067557600080fd5b80639a339fa3146106005780639db5dbe41461062057600080fd5b80637d2e90c2146105675780638456cb59146105875780638d4b29e21461059c57806391d14854146105bc57600080fd5b80632f2ff15d116101e65780635c975abb116101b5578063665a11ca1161019a578063665a11ca146104d6578063753d75631461051357806375b238fc1461053357600080fd5b80635c975abb1461048e57806362d49284146104a657600080fd5b80632f2ff15d14610419578063360a76a81461043957806336568abe146104595780633f4ba83a1461047957600080fd5b806317d408d21161023d578063206b60f911610222578063206b60f91461037a5780632335c074146103bc578063248a9ca3146103e957600080fd5b806317d408d2146103275780631c3cc0251461036757600080fd5b8063018770201461028257806301ffc9a7146102a257806305a79e06146102d7578063153b0d1e1461030757600080fd5b3661027d5761027b610842565b005b600080fd5b34801561028e57600080fd5b5061027b61029d366004611b24565b610881565b3480156102ae57600080fd5b506102c26102bd366004611b41565b610920565b60405190151581526020015b60405180910390f35b3480156102e357600080fd5b506102c26102f2366004611b83565b60026020526000908152604090205460ff1681565b34801561031357600080fd5b5061027b610322366004611baa565b6109b9565b34801561033357600080fd5b5061034a610342366004611b83565b60a081901c91565b604080519283526001600160a01b039091166020830152016102ce565b6102c2610375366004611be3565b610a48565b34801561038657600080fd5b506103ae7f8502233096d909befbda0999bb8ea2f3a6be3c138b9fbf003752a4c8bce86f6c81565b6040519081526020016102ce565b3480156103c857600080fd5b506103ae6103d7366004611b83565b60036020526000908152604090205481565b3480156103f557600080fd5b506103ae610404366004611b83565b60009081526020819052604090206001015490565b34801561042557600080fd5b5061027b610434366004611c22565b610cc2565b34801561044557600080fd5b5061027b610454366004611c47565b610ced565b34801561046557600080fd5b5061027b610474366004611c22565b610d58565b34801561048557600080fd5b5061027b610da9565b34801561049a57600080fd5b5060015460ff166102c2565b3480156104b257600080fd5b506102c26104c1366004611b83565b60009081526004602052604090205460ff1690565b3480156104e257600080fd5b506001546104fb9061010090046001600160a01b031681565b6040516001600160a01b0390911681526020016102ce565b34801561051f57600080fd5b506102c261052e366004611b24565b610dde565b34801561053f57600080fd5b506103ae7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177581565b34801561057357600080fd5b5061027b610582366004611c64565b610e08565b34801561059357600080fd5b5061027b610eb3565b3480156105a857600080fd5b5061027b6105b7366004611c90565b610ee5565b3480156105c857600080fd5b506102c26105d7366004611c22565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b34801561060c57600080fd5b506103ae61061b366004611c22565b610f61565b34801561062c57600080fd5b5061027b61063b366004611cb5565b610f81565b34801561064c57600080fd5b506103ae600081565b34801561066157600080fd5b5061027b610670366004611c90565b61100b565b34801561068157600080fd5b50610695610690366004611cf6565b611087565b6040516102ce9190611d8f565b61027b6106b0366004611e52565b61116f565b3480156106c157600080fd5b506106d56106d0366004611b83565b61118f565b6040805167ffffffffffffffff958616815293851660208501529184169183019190915290911660608201526080016102ce565b34801561071557600080fd5b5061027b610724366004611c22565b6111c5565b34801561073557600080fd5b506103ae7fc806897caf4fd5068191157e44d3988e43139a37e0b97b6793e1ed118414060481565b34801561076957600080fd5b506103ae7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b34801561079d57600080fd5b506103ae6107ac366004611ef5565b6111ea565b3480156107bd57600080fd5b506006546102c29060ff1681565b3480156107d757600080fd5b506102c26107e6366004611b24565b60056020526000908152604090205460ff1681565b34801561080757600080fd5b506103ae7f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a81565b61027b61083d366004611f49565b611266565b60015460ff161561087f576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217756108ab81611284565b600180547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b038516908102919091179091556040519081527fe926a1c76b7cba5ee912418709df854ad32aab2035491b1d0ce9c0117735452f906020015b60405180910390a15050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806109b357507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217756109e381611284565b6001600160a01b038316600081815260056020908152604091829020805460ff19168615159081179091558251938452908301527ffed07c88bd5d31bfd0ce77ed7ffdc74a163a61cfc5edcec801e3a7954e33d6e791015b60405180910390a1505050565b60007fc806897caf4fd5068191157e44d3988e43139a37e0b97b6793e1ed1184140604610a7481611284565b60008681526002602052604090205460ff168015610a96576000925050610cb9565b6001600160a01b038516600090815260056020526040902054869060ff1615610b065760405162461bcd60e51b815260206004820152601e60248201527f4163636f756e74732063616e6e6f7420626520626c61636b6c6973746564000060448201526064015b60405180910390fd5b6001600160a01b038616610b6a5760405162461bcd60e51b815260206004820152602560248201527f4163636f756e7473206d757374206e6f7420626520746865206e756c6c206164604482015264647265737360d81b6064820152608401610afd565b60008511610bba5760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610afd565b6001600160a01b038116610c04576040516001600160a01b0387169086156108fc029087906000818181858888f19350505050158015610bfe573d6000803e3d6000fd5b50610c24565b600154610c24906001600160a01b0383811691610100900416888861128e565b6000888152600260209081526040808320805460ff1916600117905560c08b901c80845260039092529091205489811015610c6b5760008281526003602052604090208a90555b876001600160a01b0316898b7f87e62b77ca30a0be4c6943c9965118aaf5e9cf046789a04c647646f8e9044d768a604051610ca891815260200190565b60405180910390a460019550505050505b50949350505050565b600082815260208190526040902060010154610cdd81611284565b610ce7838361130a565b50505050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775610d1781611284565b6006805460ff19168315159081179091556040519081527f53b94bfc8864e32aef953694bad4077a5983f3059d5fd51b217d2741eb56d56390602001610914565b6001600160a01b0381163314610d9a576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610da482826113b4565b505050565b7f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a610dd381611284565b610ddb611437565b50565b600060046000610dee4685610f61565b815260208101919091526040016000205460ff1692915050565b7f8502233096d909befbda0999bb8ea2f3a6be3c138b9fbf003752a4c8bce86f6c610e3281611284565b6040516001600160a01b0384169083156108fc029084906000818181858888f19350505050158015610e68573d6000803e3d6000fd5b50604080516001600160a01b0385168152602081018490526000917f728fe8c3e9dd087cac70e8ff44565c920a2bb77c726ed3191394fefb4aabc358910160405180910390a2505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610edd81611284565b610ddb611489565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775610f0f81611284565b600083815260026020908152604091829020805460ff19168515159081179091558251868152918201527f33759c691d25f6b24f6403f92f17104b299f028e8f779e47ff218c7729f15a059101610a3b565b6000610f7a6001600160a01b03831660a085901b611fc0565b9392505050565b7f8502233096d909befbda0999bb8ea2f3a6be3c138b9fbf003752a4c8bce86f6c610fab81611284565b610fbf6001600160a01b03851684846114c4565b604080516001600160a01b038581168252602082018590528616917f728fe8c3e9dd087cac70e8ff44565c920a2bb77c726ed3191394fefb4aabc358910160405180910390a250505050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177561103581611284565b600083815260046020908152604091829020805460ff19168515159081179091558251868152918201527f8e51431983b1f648d303a77c1aa794c687a2d4cb986747dcd18b7296c6fd55129101610a3b565b6040805160008152602081019091526060908267ffffffffffffffff8111156110b2576110b2611fd3565b6040519080825280602002602001820160405280156110e557816020015b60608152602001906001900390816110d05790505b50915060005b83811015611167576111423086868481811061110957611109611fe9565b905060200281019061111b9190611fff565b8560405160200161112e93929190612046565b6040516020818303038152906040526114f5565b83828151811061115457611154611fe9565b60209081029190910101526001016110eb565b505092915050565b611177610842565b6111868787878787878761156b565b50505050505050565b600080808060406111a181600361206d565b86901c94506111b181600261206d565b94969486901c959081901c94909350915050565b6000828152602081905260409020600101546111e081611284565b610ce783836113b4565b6000604067ffffffffffffffff83166fffffffffffffffff000000000000000085831b1661121983600261206d565b67ffffffffffffffff8816901b61123184600361206d565b8967ffffffffffffffff16901b6112489190611fc0565b6112529190611fc0565b61125c9190611fc0565b9695505050505050565b61126e610842565b61127d8585333387878761156b565b5050505050565b610ddb8133611876565b6040516001600160a01b038481166024830152838116604483015260648201839052610ce79186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506118e6565b6000828152602081815260408083206001600160a01b038516845290915281205460ff166113ac576000838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556113643390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016109b3565b5060006109b3565b6000828152602081815260408083206001600160a01b038516845290915281205460ff16156113ac576000838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016109b3565b61143f611962565b6001805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b611491610842565b6001805460ff1916811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2583361146c565b6040516001600160a01b03838116602483015260448201839052610da491859182169063a9059cbb906064016112c3565b6060600080846001600160a01b0316846040516115129190612084565b600060405180830381855af49150503d806000811461154d576040519150601f19603f3d011682016040523d82523d6000602084013e611552565b606091505b509150915061156285838361199e565b95945050505050565b600087815260046020526040902054879060ff166115cb5760405162461bcd60e51b815260206004820152601960248201527f546f6b656e206d7573742062652077686974656c6973746564000000000000006044820152606401610afd565b6001600160a01b03861660009081526005602052604090205460ff1615801561160d57506001600160a01b03851660009081526005602052604090205460ff16155b801561162957503360009081526005602052604090205460ff16155b6116755760405162461bcd60e51b815260206004820152601e60248201527f4163636f756e74732063616e6e6f7420626520626c61636b6c697374656400006044820152606401610afd565b6001600160a01b0386161580159061169557506001600160a01b03851615155b6116ef5760405162461bcd60e51b815260206004820152602560248201527f4163636f756e7473206d757374206e6f7420626520746865206e756c6c206164604482015264647265737360d81b6064820152608401610afd565b6000841161173f5760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610afd565b6001600160a01b03811615158061175557503484145b6117a15760405162461bcd60e51b815260206004820152601b60248201527f6d73672e76616c7565206d75737420657175616c20616d6f756e7400000000006044820152606401610afd565b6001600160a01b0381166118015760065460ff16156117fc576001546040516001600160a01b0361010090920491909116903480156108fc02916000818181858888f193505050501580156117fa573d6000803e3d6000fd5b505b611823565b600154611823906001600160a01b03838116918991610100909104168761128e565b856001600160a01b031687897f6200833ed557d034c30cfa2ca749793cc6ff6554a45ae2c0f2afc4c83492d1f98888888860405161186494939291906120a0565b60405180910390a45050505050505050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff166118e2576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260248101839052604401610afd565b5050565b60006118fb6001600160a01b03841683611a13565b9050805160001415801561192057508080602001905181019061191e91906120e6565b155b15610da4576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401610afd565b60015460ff1661087f576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826119b3576119ae82611a21565b610f7a565b81511580156119ca57506001600160a01b0384163b155b15611a0c576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610afd565b5092915050565b6060610f7a83836000611a63565b805115611a315780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606081471015611aa1576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610afd565b600080856001600160a01b03168486604051611abd9190612084565b60006040518083038185875af1925050503d8060008114611afa576040519150601f19603f3d011682016040523d82523d6000602084013e611aff565b606091505b509150915061125c86838361199e565b6001600160a01b0381168114610ddb57600080fd5b600060208284031215611b3657600080fd5b8135610f7a81611b0f565b600060208284031215611b5357600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610f7a57600080fd5b600060208284031215611b9557600080fd5b5035919050565b8015158114610ddb57600080fd5b60008060408385031215611bbd57600080fd5b8235611bc881611b0f565b91506020830135611bd881611b9c565b809150509250929050565b60008060008060808587031215611bf957600080fd5b84359350602085013592506040850135611c1281611b0f565b9396929550929360600135925050565b60008060408385031215611c3557600080fd5b823591506020830135611bd881611b0f565b600060208284031215611c5957600080fd5b8135610f7a81611b9c565b60008060408385031215611c7757600080fd5b8235611c8281611b0f565b946020939093013593505050565b60008060408385031215611ca357600080fd5b823591506020830135611bd881611b9c565b600080600060608486031215611cca57600080fd5b8335611cd581611b0f565b92506020840135611ce581611b0f565b929592945050506040919091013590565b60008060208385031215611d0957600080fd5b823567ffffffffffffffff80821115611d2157600080fd5b818501915085601f830112611d3557600080fd5b813581811115611d4457600080fd5b8660208260051b8501011115611d5957600080fd5b60209290920196919550909350505050565b60005b83811015611d86578181015183820152602001611d6e565b50506000910152565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015611dfc57878503603f1901845281518051808752611ddd818989018a8501611d6b565b601f01601f191695909501860194509285019290850190600101611db6565b5092979650505050505050565b60008083601f840112611e1b57600080fd5b50813567ffffffffffffffff811115611e3357600080fd5b602083019150836020828501011115611e4b57600080fd5b9250929050565b600080600080600080600060c0888a031215611e6d57600080fd5b87359650602088013595506040880135611e8681611b0f565b94506060880135611e9681611b0f565b93506080880135925060a088013567ffffffffffffffff811115611eb957600080fd5b611ec58a828b01611e09565b989b979a50959850939692959293505050565b803567ffffffffffffffff81168114611ef057600080fd5b919050565b60008060008060808587031215611f0b57600080fd5b611f1485611ed8565b9350611f2260208601611ed8565b9250611f3060408601611ed8565b9150611f3e60608601611ed8565b905092959194509250565b600080600080600060808688031215611f6157600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff811115611f8d57600080fd5b611f9988828901611e09565b969995985093965092949392505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156109b3576109b3611faa565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261201657600080fd5b83018035915067ffffffffffffffff82111561203157600080fd5b602001915036819003821315611e4b57600080fd5b828482376000838201600081528351612063818360208801611d6b565b0195945050505050565b80820281158282048414176109b3576109b3611faa565b60008251612096818460208701611d6b565b9190910192915050565b6001600160a01b038516815283602082015260606040820152816060820152818360808301376000818301608090810191909152601f909201601f191601019392505050565b6000602082840312156120f857600080fd5b8151610f7a81611b9c56fea26469706673582212201dd0f9d7ca48f0c62df1fe150bc0a29fd144ddd75135e7a806434c90343c3a4464736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000007f745445c9f4d98ce48280390c8ba9b9370ec19a00000000000000000000000007063bfabbcf8733bd6570efa3e38113f09251c1
-----Decoded View---------------
Arg [0] : admin (address): 0x7f745445C9f4D98CE48280390c8ba9B9370ec19a
Arg [1] : _liquidityPool (address): 0x07063BFaBbCf8733Bd6570eFA3e38113f09251c1
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000007f745445c9f4d98ce48280390c8ba9b9370ec19a
Arg [1] : 00000000000000000000000007063bfabbcf8733bd6570efa3e38113f09251c1
Deployed Bytecode Sourcemap
37981:7337:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36377:19;:17;:19::i;:::-;37981:7337;;;;;44490:147;;;;;;;;;;-1:-1:-1;44490:147:0;;;;;:::i;:::-;;:::i;9178:204::-;;;;;;;;;;-1:-1:-1;9178:204:0;;;;;:::i;:::-;;:::i;:::-;;;927:14:1;;920:22;902:41;;890:2;875:18;9178:204:0;;;;;;;;38479:41;;;;;;;;;;-1:-1:-1;38479:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;44999:161;;;;;;;;;;-1:-1:-1;44999:161:0;;;;;:::i;:::-;;:::i;40361:175::-;;;;;;;;;;-1:-1:-1;40361:175:0;;;;;:::i;:::-;40478:3;40471:10;;;;40361:175;;;;;1823:25:1;;;-1:-1:-1;;;;;1884:55:1;;;1879:2;1864:18;;1857:83;1796:18;40361:175:0;1649:297:1;42887:1038:0;;;;;;:::i;:::-;;:::i;38404:66::-;;;;;;;;;;;;38444:26;38404:66;;;;;2554:25:1;;;2542:2;2527:18;38404:66:0;2408:177:1;38527:46:0;;;;;;;;;;-1:-1:-1;38527:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;10458:122;;;;;;;;;;-1:-1:-1;10458:122:0;;;;;:::i;:::-;10523:7;10550:12;;;;;;;;;;:22;;;;10458:122;10890:138;;;;;;;;;;-1:-1:-1;10890:138:0;;;;;:::i;:::-;;:::i;45168:147::-;;;;;;;;;;-1:-1:-1;45168:147:0;;;;;:::i;:::-;;:::i;12027:251::-;;;;;;;;;;-1:-1:-1;12027:251:0;;;;;:::i;:::-;;:::i;40104:79::-;;;;;;;;;;;;;:::i;36772:86::-;;;;;;;;;;-1:-1:-1;36843:7:0;;;;36772:86;;39904:111;;;;;;;;;;-1:-1:-1;39904:111:0;;;;;:::i;:::-;39963:4;39987:20;;;:15;:20;;;;;;;;;39904:111;38085:28;;;;;;;;;;-1:-1:-1;38085:28:0;;;;;;;-1:-1:-1;;;;;38085:28:0;;;;;;-1:-1:-1;;;;;3687:55:1;;;3669:74;;3657:2;3642:18;38085:28:0;3523:226:1;39759:137:0;;;;;;;;;;-1:-1:-1;39759:137:0;;;;;:::i;:::-;;:::i;38122:60::-;;;;;;;;;;;;38159:23;38122:60;;44042:205;;;;;;;;;;-1:-1:-1;44042:205:0;;;;;:::i;:::-;;:::i;40023:73::-;;;;;;;;;;;;;:::i;44645:158::-;;;;;;;;;;-1:-1:-1;44645:158:0;;;;;:::i;:::-;;:::i;9474:138::-;;;;;;;;;;-1:-1:-1;9474:138:0;;;;;:::i;:::-;9551:4;9575:12;;;;;;;;;;;-1:-1:-1;;;;;9575:29:0;;;;;;;;;;;;;;;9474:138;40191:162;;;;;;;;;;-1:-1:-1;40191:162:0;;;;;:::i;:::-;;:::i;44255:225::-;;;;;;;;;;-1:-1:-1;44255:225:0;;;;;:::i;:::-;;:::i;8786:49::-;;;;;;;;;;-1:-1:-1;8786:49:0;8831:4;8786:49;;44811:180;;;;;;;;;;-1:-1:-1;44811:180:0;;;;;:::i;:::-;;:::i;34316:494::-;;;;;;;;;;-1:-1:-1;34316:494:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;42630:249::-;;;;;;:::i;:::-;;:::i;40900:340::-;;;;;;;;;;-1:-1:-1;40900:340:0;;;;;:::i;:::-;;:::i;:::-;;;;8565:18:1;8610:15;;;8592:34;;8662:15;;;8657:2;8642:18;;8635:43;8714:15;;;8694:18;;;8687:43;;;;8766:15;;;8761:2;8746:18;;8739:43;8542:3;8527:19;40900:340:0;8332:456:1;11321:140:0;;;;;;;;;;-1:-1:-1;11321:140:0;;;;;:::i;:::-;;:::i;38331:66::-;;;;;;;;;;;;38371:26;38331:66;;38189:62;;;;;;;;;;;;38227:24;38189:62;;40544:348;;;;;;;;;;-1:-1:-1;40544:348:0;;;;;:::i;:::-;;:::i;38689:32::-;;;;;;;;;;-1:-1:-1;38689:32:0;;;;;;;;38639:41;;;;;;;;;;-1:-1:-1;38639:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;38258:66;;;;;;;;;;;;38298:26;38258:66;;42413:209;;;;;;:::i;:::-;;:::i;36931:132::-;36843:7;;;;36993:63;;;37029:15;;;;;;;;;;;;;;36993:63;36931:132::o;44490:147::-;38159:23;9070:16;9081:4;9070:10;:16::i;:::-;44571:13:::1;:20:::0;;;::::1;;-1:-1:-1::0;;;;;44571:20:0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;44607:22:::1;::::0;3669:74:1;;;44607:22:0::1;::::0;3657:2:1;3642:18;44607:22:0::1;;;;;;;;44490:147:::0;;:::o;9178:204::-;9263:4;9287:47;;;9302:32;9287:47;;:87;;-1:-1:-1;6574:25:0;6559:40;;;;9338:36;9280:94;9178:204;-1:-1:-1;;9178:204:0:o;44999:161::-;38159:23;9070:16;9081:4;9070:10;:16::i;:::-;-1:-1:-1;;;;;45088:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;;;;:23;;-1:-1:-1;;45088:23:0::1;::::0;::::1;;::::0;;::::1;::::0;;;45127:25;;10164:74:1;;;10254:18;;;10247:50;45127:25:0::1;::::0;10137:18:1;45127:25:0::1;;;;;;;;44999:161:::0;;;:::o;42887:1038::-;43011:4;38371:26;9070:16;9081:4;9070:10;:16::i;:::-;43028::::1;43047:14:::0;;;:9:::1;:14;::::0;;;;;::::1;;43072:28:::0;::::1;;;43095:5;43088:12;;;;;43072:28;-1:-1:-1::0;;;;;43198:18:0;::::1;43138:20;43198:18:::0;;;:9:::1;:18;::::0;;;;;40471:10;;43198:18:::1;;43197:19;43189:62;;;::::0;-1:-1:-1;;;43189:62:0;;10510:2:1;43189:62:0::1;::::0;::::1;10492:21:1::0;10549:2;10529:18;;;10522:30;10588:32;10568:18;;;10561:60;10638:18;;43189:62:0::1;;;;;;;;;-1:-1:-1::0;;;;;43270:21:0;::::1;43262:71;;;::::0;-1:-1:-1;;;43262:71:0;;10869:2:1;43262:71:0::1;::::0;::::1;10851:21:1::0;10908:2;10888:18;;;10881:30;10947:34;10927:18;;;10920:62;-1:-1:-1;;;10998:18:1;;;10991:35;11043:19;;43262:71:0::1;10667:401:1::0;43262:71:0::1;43363:1;43354:6;:10;43346:52;;;::::0;-1:-1:-1;;;43346:52:0;;11275:2:1;43346:52:0::1;::::0;::::1;11257:21:1::0;11314:2;11294:18;;;11287:30;11353:31;11333:18;;;11326:59;11402:18;;43346:52:0::1;11073:353:1::0;43346:52:0::1;-1:-1:-1::0;;;;;43414:26:0;::::1;43411:228;;43457:33;::::0;-1:-1:-1;;;;;43457:25:0;::::1;::::0;:33;::::1;;;::::0;43483:6;;43457:33:::1;::::0;;;43483:6;43457:25;:33;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;43411:228;;;43596:13;::::0;43558:69:::1;::::0;-1:-1:-1;;;;;43558:37:0;;::::1;::::0;43596:13:::1;::::0;::::1;;43611:7:::0;43620:6;43558:37:::1;:69::i;:::-;43651:14;::::0;;;:9:::1;:14;::::0;;;;;;;:21;;-1:-1:-1;;43651:21:0::1;43668:4;43651:21;::::0;;43714:6:::1;43707:13:::0;;::::1;43753:24:::0;;;:11:::1;:24:::0;;;;;;;43793:17;;::::1;43790:52;;;43812:24;::::0;;;:11:::1;:24;::::0;;;;:30;;;43790:52:::1;43879:7;-1:-1:-1::0;;;;;43860:35:0::1;43872:5;43867:3;43860:35;43888:6;43860:35;;;;2554:25:1::0;;2542:2;2527:18;;2408:177;43860:35:0::1;;;;;;;;43913:4;43906:11;;;;;;9097:1;42887:1038:::0;;;;;;;:::o;10890:138::-;10523:7;10550:12;;;;;;;;;;:22;;;9070:16;9081:4;9070:10;:16::i;:::-;10995:25:::1;11006:4;11012:7;10995:10;:25::i;:::-;;10890:138:::0;;;:::o;45168:147::-;38159:23;9070:16;9081:4;9070:10;:16::i;:::-;45247:13:::1;:21:::0;;-1:-1:-1;;45247:21:0::1;::::0;::::1;;::::0;;::::1;::::0;;;45284:23:::1;::::0;902:41:1;;;45284:23:0::1;::::0;890:2:1;875:18;45284:23:0::1;762:187:1::0;12027:251:0;-1:-1:-1;;;;;12121:34:0;;4392:10;12121:34;12117:104;;12179:30;;;;;;;;;;;;;;12117:104;12233:37;12245:4;12251:18;12233:11;:37::i;:::-;;12027:251;;:::o;40104:79::-;38298:26;9070:16;9081:4;9070:10;:16::i;:::-;40165:10:::1;:8;:10::i;:::-;40104:79:::0;:::o;39759:137::-;39820:4;39844:15;:44;39860:27;39866:13;39881:5;39860;:27::i;:::-;39844:44;;;;;;;;;;;-1:-1:-1;39844:44:0;;;;;39759:137;-1:-1:-1;;39759:137:0:o;44042:205::-;38444:26;9070:16;9081:4;9070:10;:16::i;:::-;44153:26:::1;::::0;-1:-1:-1;;;;;44153:18:0;::::1;::::0;:26;::::1;;;::::0;44172:6;;44153:26:::1;::::0;;;44172:6;44153:18;:26;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;44195:44:0::1;::::0;;-1:-1:-1;;;;;11631:55:1;;11613:74;;11718:2;11703:18;;11696:34;;;44217:1:0::1;::::0;44195:44:::1;::::0;11586:18:1;44195:44:0::1;;;;;;;44042:205:::0;;;:::o;40023:73::-;38227:24;9070:16;9081:4;9070:10;:16::i;:::-;40080:8:::1;:6;:8::i;44645:158::-:0;38159:23;9070:16;9081:4;9070:10;:16::i;:::-;44733:14:::1;::::0;;;:9:::1;:14;::::0;;;;;;;;:22;;-1:-1:-1;;44733:22:0::1;::::0;::::1;;::::0;;::::1;::::0;;;44771:24;;11909:25:1;;;11950:18;;;11943:50;44771:24:0::1;::::0;11882:18:1;44771:24:0::1;11741:258:1::0;40191:162:0;40265:11;40296:49;-1:-1:-1;;;;;40315:30:0;;40308:3;40297:14;;;40296:49;:::i;:::-;40289:56;40191:162;-1:-1:-1;;;40191:162:0:o;44255:225::-;38444:26;9070:16;9081:4;9070:10;:16::i;:::-;44372:45:::1;-1:-1:-1::0;;;;;44372:26:0;::::1;44399:9:::0;44410:6;44372:26:::1;:45::i;:::-;44433:39;::::0;;-1:-1:-1;;;;;11631:55:1;;;11613:74;;11718:2;11703:18;;11696:34;;;44433:39:0;::::1;::::0;::::1;::::0;11586:18:1;44433:39:0::1;;;;;;;44255:225:::0;;;;:::o;44811:180::-;38159:23;9070:16;9081:4;9070:10;:16::i;:::-;44906:22:::1;::::0;;;:15:::1;:22;::::0;;;;;;;;:30;;-1:-1:-1;;44906:30:0::1;::::0;::::1;;::::0;;::::1;::::0;;;44952:31;;11909:25:1;;;11950:18;;;11943:50;44952:31:0::1;::::0;11882:18:1;44952:31:0::1;11741:258:1::0;34316:494:0;34484:12;;;34419:20;34484:12;;;;;;;;34384:22;;34598:4;34586:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34576:34;;34626:9;34621:157;34641:15;;;34621:157;;;34691:75;34728:4;34748;;34753:1;34748:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;34757;34735:30;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;34691:28;:75::i;:::-;34678:7;34686:1;34678:10;;;;;;;;:::i;:::-;;;;;;;;;;:88;34658:3;;34621:157;;;;34788:14;34316:494;;;;:::o;42630:249::-;36377:19;:17;:19::i;:::-;42804:67:::1;42810:9;42821:7;42830:11;42843:9;42854:6;42862:8;;42804:5;:67::i;:::-;42630:249:::0;;;;;;;:::o;40900:340::-;40950:14;;;;41054:2;41094:6;41054:2;41094:1;:6;:::i;:::-;41086:15;;;;-1:-1:-1;41142:6:0;41144:4;41142:1;:6;:::i;:::-;40900:340;;41134:15;;;;;41187:11;;;;;41134:3;;-1:-1:-1;40900:340:0;-1:-1:-1;;40900:340:0:o;11321:140::-;10523:7;10550:12;;;;;;;;;;:22;;;9070:16;9081:4;9070:10;:16::i;:::-;11427:26:::1;11439:4;11445:7;11427:11;:26::i;40544:348::-:0;40657:11;40696:2;40867:17;;;40815:35;;;;;40790:6;40696:2;40790:1;:6;:::i;:::-;40765:20;;;:32;;40740:6;40742:4;40740:1;:6;:::i;:::-;40727:7;40719:16;;:28;;40718:80;;;;:::i;:::-;:133;;;;:::i;:::-;:166;;;;:::i;:::-;40711:173;40544:348;-1:-1:-1;;;;;;40544:348:0:o;42413:209::-;36377:19;:17;:19::i;:::-;42547:67:::1;42553:9;42564:7;42573:10;42585;42597:6;42605:8;;42547:5;:67::i;:::-;42413:209:::0;;;;;:::o;9827:105::-;9894:30;9905:4;4392:10;9894;:30::i;28936:190::-;29064:53;;-1:-1:-1;;;;;14897:15:1;;;29064:53:0;;;14879:34:1;14949:15;;;14929:18;;;14922:43;14981:18;;;14974:34;;;29037:81:0;;29057:5;;29079:18;;;;;14791::1;;29064:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29037:19;:81::i;12904:324::-;12981:4;9575:12;;;;;;;;;;;-1:-1:-1;;;;;9575:29:0;;;;;;;;;;;;12998:223;;13042:6;:12;;;;;;;;;;;-1:-1:-1;;;;;13042:29:0;;;;;;;;;:36;;-1:-1:-1;;13042:36:0;13074:4;13042:36;;;13125:12;4392:10;;4312:98;13125:12;-1:-1:-1;;;;;13098:40:0;13116:7;-1:-1:-1;;;;;13098:40:0;13110:4;13098:40;;;;;;;;;;-1:-1:-1;13160:4:0;13153:11;;12998:223;-1:-1:-1;13204:5:0;13197:12;;13472:325;13550:4;9575:12;;;;;;;;;;;-1:-1:-1;;;;;9575:29:0;;;;;;;;;;;;13567:223;;;13642:5;13610:12;;;;;;;;;;;-1:-1:-1;;;;;13610:29:0;;;;;;;;;;:37;;-1:-1:-1;;13610:37:0;;;13667:40;4392:10;;13610:12;;13667:40;;13642:5;13667:40;-1:-1:-1;13729:4:0;13722:11;;37673:120;36636:16;:14;:16::i;:::-;37732:7:::1;:15:::0;;-1:-1:-1;;37732:15:0::1;::::0;;37763:22:::1;4392:10:::0;37772:12:::1;37763:22;::::0;-1:-1:-1;;;;;3687:55:1;;;3669:74;;3657:2;3642:18;37763:22:0::1;;;;;;;37673:120::o:0;37414:118::-;36377:19;:17;:19::i;:::-;37484:4:::1;37474:14:::0;;-1:-1:-1;;37474:14:0::1;::::0;::::1;::::0;;37504:20:::1;4392:10:::0;37511:12:::1;4312:98:::0;28529:162;28639:43;;-1:-1:-1;;;;;11631:55:1;;;28639:43:0;;;11613:74:1;11703:18;;;11696:34;;;28612:71:0;;28632:5;;28654:14;;;;;11586:18:1;;28639:43:0;11431:305:1;25035:256:0;25118:12;25144;25158:23;25185:6;-1:-1:-1;;;;;25185:19:0;25205:4;25185:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25143:67;;;;25228:55;25255:6;25263:7;25272:10;25228:26;:55::i;:::-;25221:62;25035:256;-1:-1:-1;;;;;25035:256:0:o;41329:1076::-;41512:24;41579:26;;;:15;:26;;;;;;40471:10;;41579:26;;41571:64;;;;-1:-1:-1;;;41571:64:0;;15513:2:1;41571:64:0;;;15495:21:1;15552:2;15532:18;;;15525:30;15591:27;15571:18;;;15564:55;15636:18;;41571:64:0;15311:349:1;41571:64:0;-1:-1:-1;;;;;41657:22:0;;;;;;:9;:22;;;;;;;;41656:23;:48;;;;-1:-1:-1;;;;;;41684:20:0;;;;;;:9;:20;;;;;;;;41683:21;41656:48;:74;;;;-1:-1:-1;41719:10:0;41709:21;;;;:9;:21;;;;;;;;41708:22;41656:74;41648:117;;;;-1:-1:-1;;;41648:117:0;;10510:2:1;41648:117:0;;;10492:21:1;10549:2;10529:18;;;10522:30;10588:32;10568:18;;;10561:60;10638:18;;41648:117:0;10308:354:1;41648:117:0;-1:-1:-1;;;;;41786:25:0;;;;;;:52;;-1:-1:-1;;;;;;41815:23:0;;;;41786:52;41778:102;;;;-1:-1:-1;;;41778:102:0;;10869:2:1;41778:102:0;;;10851:21:1;10908:2;10888:18;;;10881:30;10947:34;10927:18;;;10920:62;-1:-1:-1;;;10998:18:1;;;10991:35;11043:19;;41778:102:0;10667:401:1;41778:102:0;41914:1;41901:10;:14;41893:56;;;;-1:-1:-1;;;41893:56:0;;11275:2:1;41893:56:0;;;11257:21:1;11314:2;11294:18;;;11287:30;11353:31;11333:18;;;11326:59;11402:18;;41893:56:0;11073:353:1;41893:56:0;-1:-1:-1;;;;;41970:30:0;;;;;:57;;;42018:9;42004:10;:23;41970:57;41962:97;;;;-1:-1:-1;;;41962:97:0;;15867:2:1;41962:97:0;;;15849:21:1;15906:2;15886:18;;;15879:30;15945:29;15925:18;;;15918:57;15992:18;;41962:97:0;15665:351:1;41962:97:0;-1:-1:-1;;;;;42077:30:0;;42074:236;;42127:13;;;;42124:60;;;42150:13;;42142:42;;-1:-1:-1;;;;;42150:13:0;;;;;;;;;42174:9;42142:42;;;;;;;;;42174:9;42150:13;42142:42;;;;;;;;;;;;;;;;;;;;;42124:60;42074:236;;;42272:13;;42217:81;;-1:-1:-1;;;;;42217:41:0;;;;42259:11;;42272:13;;;;;42287:10;42217:41;:81::i;:::-;42352:11;-1:-1:-1;;;;;42327:70:0;42343:7;42332:9;42327:70;42365:9;42376:10;42388:8;;42327:70;;;;;;;;;:::i;:::-;;;;;;;;41474:931;41329:1076;;;;;;;:::o;10068:201::-;9551:4;9575:12;;;;;;;;;;;-1:-1:-1;;;;;9575:29:0;;;;;;;;;;;;10152:110;;10203:47;;;;;-1:-1:-1;;;;;11631:55:1;;10203:47:0;;;11613:74:1;11703:18;;;11696:34;;;11586:18;;10203:47:0;11431:305:1;10152:110:0;10068:201;;:::o;31340:638::-;31764:23;31790:33;-1:-1:-1;;;;;31790:27:0;;31818:4;31790:27;:33::i;:::-;31764:59;;31838:10;:17;31859:1;31838:22;;:57;;;;;31876:10;31865:30;;;;;;;;;;;;:::i;:::-;31864:31;31838:57;31834:137;;;31919:40;;;;;-1:-1:-1;;;;;3687:55:1;;31919:40:0;;;3669:74:1;3642:18;;31919:40:0;3523:226:1;37140:130:0;36843:7;;;;37199:64;;37236:15;;;;;;;;;;;;;;25564:597;25712:12;25742:7;25737:417;;25766:19;25774:10;25766:7;:19::i;:::-;25737:417;;;25994:17;;:22;:49;;;;-1:-1:-1;;;;;;26020:18:0;;;:23;25994:49;25990:121;;;26071:24;;;;;-1:-1:-1;;;;;3687:55:1;;26071:24:0;;;3669:74:1;3642:18;;26071:24:0;3523:226:1;25990:121:0;-1:-1:-1;26132:10:0;25564:597;-1:-1:-1;;25564:597:0:o;23600:153::-;23675:12;23707:38;23729:6;23737:4;23743:1;23707:21;:38::i;26714:528::-;26847:17;;:21;26843:392;;27079:10;27073:17;27136:15;27123:10;27119:2;27115:19;27108:44;26843:392;27206:17;;;;;;;;;;;;;;24088:398;24187:12;24240:5;24216:21;:29;24212:110;;;24269:41;;;;;24304:4;24269:41;;;3669:74:1;3642:18;;24269:41:0;3523:226:1;24212:110:0;24333:12;24347:23;24374:6;-1:-1:-1;;;;;24374:11:0;24393:5;24400:4;24374:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24332:73;;;;24423:55;24450:6;24458:7;24467:10;24423:26;:55::i;14:154:1:-;-1:-1:-1;;;;;93:5:1;89:54;82:5;79:65;69:93;;158:1;155;148:12;173:247;232:6;285:2;273:9;264:7;260:23;256:32;253:52;;;301:1;298;291:12;253:52;340:9;327:23;359:31;384:5;359:31;:::i;425:332::-;483:6;536:2;524:9;515:7;511:23;507:32;504:52;;;552:1;549;542:12;504:52;591:9;578:23;641:66;634:5;630:78;623:5;620:89;610:117;;723:1;720;713:12;954:180;1013:6;1066:2;1054:9;1045:7;1041:23;1037:32;1034:52;;;1082:1;1079;1072:12;1034:52;-1:-1:-1;1105:23:1;;954:180;-1:-1:-1;954:180:1:o;1139:118::-;1225:5;1218:13;1211:21;1204:5;1201:32;1191:60;;1247:1;1244;1237:12;1262:382;1327:6;1335;1388:2;1376:9;1367:7;1363:23;1359:32;1356:52;;;1404:1;1401;1394:12;1356:52;1443:9;1430:23;1462:31;1487:5;1462:31;:::i;:::-;1512:5;-1:-1:-1;1569:2:1;1554:18;;1541:32;1582:30;1541:32;1582:30;:::i;:::-;1631:7;1621:17;;;1262:382;;;;;:::o;1951:452::-;2037:6;2045;2053;2061;2114:3;2102:9;2093:7;2089:23;2085:33;2082:53;;;2131:1;2128;2121:12;2082:53;2167:9;2154:23;2144:33;;2224:2;2213:9;2209:18;2196:32;2186:42;;2278:2;2267:9;2263:18;2250:32;2291:31;2316:5;2291:31;:::i;:::-;1951:452;;;;-1:-1:-1;2341:5:1;;2393:2;2378:18;2365:32;;-1:-1:-1;;1951:452:1:o;2957:315::-;3025:6;3033;3086:2;3074:9;3065:7;3061:23;3057:32;3054:52;;;3102:1;3099;3092:12;3054:52;3138:9;3125:23;3115:33;;3198:2;3187:9;3183:18;3170:32;3211:31;3236:5;3211:31;:::i;3277:241::-;3333:6;3386:2;3374:9;3365:7;3361:23;3357:32;3354:52;;;3402:1;3399;3392:12;3354:52;3441:9;3428:23;3460:28;3482:5;3460:28;:::i;3754:323::-;3830:6;3838;3891:2;3879:9;3870:7;3866:23;3862:32;3859:52;;;3907:1;3904;3897:12;3859:52;3946:9;3933:23;3965:31;3990:5;3965:31;:::i;:::-;4015:5;4067:2;4052:18;;;;4039:32;;-1:-1:-1;;;3754:323:1:o;4082:309::-;4147:6;4155;4208:2;4196:9;4187:7;4183:23;4179:32;4176:52;;;4224:1;4221;4214:12;4176:52;4260:9;4247:23;4237:33;;4320:2;4309:9;4305:18;4292:32;4333:28;4355:5;4333:28;:::i;4716:456::-;4793:6;4801;4809;4862:2;4850:9;4841:7;4837:23;4833:32;4830:52;;;4878:1;4875;4868:12;4830:52;4917:9;4904:23;4936:31;4961:5;4936:31;:::i;:::-;4986:5;-1:-1:-1;5043:2:1;5028:18;;5015:32;5056:33;5015:32;5056:33;:::i;:::-;4716:456;;5108:7;;-1:-1:-1;;;5162:2:1;5147:18;;;;5134:32;;4716:456::o;5177:626::-;5274:6;5282;5335:2;5323:9;5314:7;5310:23;5306:32;5303:52;;;5351:1;5348;5341:12;5303:52;5391:9;5378:23;5420:18;5461:2;5453:6;5450:14;5447:34;;;5477:1;5474;5467:12;5447:34;5515:6;5504:9;5500:22;5490:32;;5560:7;5553:4;5549:2;5545:13;5541:27;5531:55;;5582:1;5579;5572:12;5531:55;5622:2;5609:16;5648:2;5640:6;5637:14;5634:34;;;5664:1;5661;5654:12;5634:34;5717:7;5712:2;5702:6;5699:1;5695:14;5691:2;5687:23;5683:32;5680:45;5677:65;;;5738:1;5735;5728:12;5677:65;5769:2;5761:11;;;;;5791:6;;-1:-1:-1;5177:626:1;;-1:-1:-1;;;;5177:626:1:o;5808:250::-;5893:1;5903:113;5917:6;5914:1;5911:13;5903:113;;;5993:11;;;5987:18;5974:11;;;5967:39;5939:2;5932:10;5903:113;;;-1:-1:-1;;6050:1:1;6032:16;;6025:27;5808:250::o;6063:1012::-;6223:4;6252:2;6292;6281:9;6277:18;6322:2;6311:9;6304:21;6345:6;6380;6374:13;6411:6;6403;6396:22;6449:2;6438:9;6434:18;6427:25;;6511:2;6501:6;6498:1;6494:14;6483:9;6479:30;6475:39;6461:53;;6549:2;6541:6;6537:15;6570:1;6580:466;6594:6;6591:1;6588:13;6580:466;;;6659:22;;;-1:-1:-1;;6655:36:1;6643:49;;6715:13;;6757:9;;6779:24;;;6816:74;6757:9;6864:15;;;6851:11;;;6816:74;:::i;:::-;6956:2;6933:17;-1:-1:-1;;6929:31:1;6917:44;;;;6913:53;;;-1:-1:-1;7024:12:1;;;;6989:15;;;;6616:1;6609:9;6580:466;;;-1:-1:-1;7063:6:1;;6063:1012;-1:-1:-1;;;;;;;6063:1012:1:o;7080:348::-;7132:8;7142:6;7196:3;7189:4;7181:6;7177:17;7173:27;7163:55;;7214:1;7211;7204:12;7163:55;-1:-1:-1;7237:20:1;;7280:18;7269:30;;7266:50;;;7312:1;7309;7302:12;7266:50;7349:4;7341:6;7337:17;7325:29;;7401:3;7394:4;7385:6;7377;7373:19;7369:30;7366:39;7363:59;;;7418:1;7415;7408:12;7363:59;7080:348;;;;;:::o;7433:894::-;7549:6;7557;7565;7573;7581;7589;7597;7650:3;7638:9;7629:7;7625:23;7621:33;7618:53;;;7667:1;7664;7657:12;7618:53;7703:9;7690:23;7680:33;;7760:2;7749:9;7745:18;7732:32;7722:42;;7814:2;7803:9;7799:18;7786:32;7827:31;7852:5;7827:31;:::i;:::-;7877:5;-1:-1:-1;7934:2:1;7919:18;;7906:32;7947:33;7906:32;7947:33;:::i;:::-;7999:7;-1:-1:-1;8053:3:1;8038:19;;8025:33;;-1:-1:-1;8109:3:1;8094:19;;8081:33;8137:18;8126:30;;8123:50;;;8169:1;8166;8159:12;8123:50;8208:59;8259:7;8250:6;8239:9;8235:22;8208:59;:::i;:::-;7433:894;;;;-1:-1:-1;7433:894:1;;-1:-1:-1;7433:894:1;;;;8182:85;;-1:-1:-1;;;7433:894:1:o;8793:171::-;8860:20;;8920:18;8909:30;;8899:41;;8889:69;;8954:1;8951;8944:12;8889:69;8793:171;;;:::o;8969:401::-;9051:6;9059;9067;9075;9128:3;9116:9;9107:7;9103:23;9099:33;9096:53;;;9145:1;9142;9135:12;9096:53;9168:28;9186:9;9168:28;:::i;:::-;9158:38;;9215:37;9248:2;9237:9;9233:18;9215:37;:::i;:::-;9205:47;;9271:37;9304:2;9293:9;9289:18;9271:37;:::i;:::-;9261:47;;9327:37;9360:2;9349:9;9345:18;9327:37;:::i;:::-;9317:47;;8969:401;;;;;;;:::o;9375:616::-;9473:6;9481;9489;9497;9505;9558:3;9546:9;9537:7;9533:23;9529:33;9526:53;;;9575:1;9572;9565:12;9526:53;9611:9;9598:23;9588:33;;9668:2;9657:9;9653:18;9640:32;9630:42;;9719:2;9708:9;9704:18;9691:32;9681:42;;9774:2;9763:9;9759:18;9746:32;9801:18;9793:6;9790:30;9787:50;;;9833:1;9830;9823:12;9787:50;9872:59;9923:7;9914:6;9903:9;9899:22;9872:59;:::i;:::-;9375:616;;;;-1:-1:-1;9375:616:1;;-1:-1:-1;9950:8:1;;9846:85;9375:616;-1:-1:-1;;;9375:616:1:o;12004:184::-;-1:-1:-1;;;12053:1:1;12046:88;12153:4;12150:1;12143:15;12177:4;12174:1;12167:15;12193:125;12258:9;;;12279:10;;;12276:36;;;12292:18;;:::i;13094:184::-;-1:-1:-1;;;13143:1:1;13136:88;13243:4;13240:1;13233:15;13267:4;13264:1;13257:15;13283:184;-1:-1:-1;;;13332:1:1;13325:88;13432:4;13429:1;13422:15;13456:4;13453:1;13446:15;13472:521;13549:4;13555:6;13615:11;13602:25;13709:2;13705:7;13694:8;13678:14;13674:29;13670:43;13650:18;13646:68;13636:96;;13728:1;13725;13718:12;13636:96;13755:33;;13807:20;;;-1:-1:-1;13850:18:1;13839:30;;13836:50;;;13882:1;13879;13872:12;13836:50;13915:4;13903:17;;-1:-1:-1;13946:14:1;13942:27;;;13932:38;;13929:58;;;13983:1;13980;13973:12;13998:440;14227:6;14219;14214:3;14201:33;14183:3;14262:6;14257:3;14253:16;14289:1;14285:2;14278:13;14320:6;14314:13;14336:65;14394:6;14390:2;14383:4;14375:6;14371:17;14336:65;:::i;:::-;14417:15;;13998:440;-1:-1:-1;;;;;13998:440:1:o;14443:168::-;14516:9;;;14547;;14564:15;;;14558:22;;14544:37;14534:71;;14585:18;;:::i;15019:287::-;15148:3;15186:6;15180:13;15202:66;15261:6;15256:3;15249:4;15241:6;15237:17;15202:66;:::i;:::-;15284:16;;;;;15019:287;-1:-1:-1;;15019:287:1:o;16021:584::-;-1:-1:-1;;;;;16240:6:1;16236:55;16225:9;16218:74;16328:6;16323:2;16312:9;16308:18;16301:34;16371:2;16366;16355:9;16351:18;16344:30;16410:6;16405:2;16394:9;16390:18;16383:34;16468:6;16460;16454:3;16443:9;16439:19;16426:49;16525:1;16495:22;;;16519:3;16491:32;;;16484:43;;;;16588:2;16567:15;;;-1:-1:-1;;16563:29:1;16548:45;16544:55;;16021:584;-1:-1:-1;;;16021:584:1:o;16912:245::-;16979:6;17032:2;17020:9;17011:7;17007:23;17003:32;17000:52;;;17048:1;17045;17038:12;17000:52;17080:9;17074:16;17099:28;17121:5;17099:28;:::i
Swarm Source
ipfs://1dd0f9d7ca48f0c62df1fe150bc0a29fd144ddd75135e7a806434c90343c3a44
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.