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