Latest 25 from a total of 46,005 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Set Contract Reg... | 56658955 | 1096 days ago | IN | 0 ETH | 0.00003694 | ||||
| Set Contract Reg... | 56658936 | 1096 days ago | IN | 0 ETH | 0.00003694 | ||||
| Resolve Queued T... | 56655586 | 1096 days ago | IN | 0 ETH | 0.00012002 | ||||
| Initiate Trade | 56655540 | 1096 days ago | IN | 0 ETH | 0.00010814 | ||||
| Resolve Queued T... | 56653611 | 1096 days ago | IN | 0 ETH | 0.00011116 | ||||
| Initiate Trade | 56653571 | 1096 days ago | IN | 0 ETH | 0.00009744 | ||||
| Resolve Queued T... | 56651367 | 1096 days ago | IN | 0 ETH | 0.00011538 | ||||
| Initiate Trade | 56651340 | 1096 days ago | IN | 0 ETH | 0.00010316 | ||||
| Resolve Queued T... | 56648646 | 1096 days ago | IN | 0 ETH | 0.00010484 | ||||
| Initiate Trade | 56648627 | 1096 days ago | IN | 0 ETH | 0.00008806 | ||||
| Resolve Queued T... | 56646534 | 1096 days ago | IN | 0 ETH | 0.00004607 | ||||
| Resolve Queued T... | 56646511 | 1096 days ago | IN | 0 ETH | 0.00010613 | ||||
| Initiate Trade | 56646463 | 1096 days ago | IN | 0 ETH | 0.00008851 | ||||
| Resolve Queued T... | 56643580 | 1096 days ago | IN | 0 ETH | 0.00004681 | ||||
| Resolve Queued T... | 56643557 | 1096 days ago | IN | 0 ETH | 0.00010547 | ||||
| Initiate Trade | 56643546 | 1096 days ago | IN | 0 ETH | 0.00009008 | ||||
| Resolve Queued T... | 56643467 | 1096 days ago | IN | 0 ETH | 0.00004681 | ||||
| Resolve Queued T... | 56643441 | 1096 days ago | IN | 0 ETH | 0.00010547 | ||||
| Initiate Trade | 56643411 | 1096 days ago | IN | 0 ETH | 0.00009041 | ||||
| Resolve Queued T... | 56642446 | 1096 days ago | IN | 0 ETH | 0.00010498 | ||||
| Initiate Trade | 56642429 | 1096 days ago | IN | 0 ETH | 0.00008998 | ||||
| Resolve Queued T... | 56642418 | 1096 days ago | IN | 0 ETH | 0.0000466 | ||||
| Resolve Queued T... | 56642394 | 1096 days ago | IN | 0 ETH | 0.00010669 | ||||
| Initiate Trade | 56642379 | 1096 days ago | IN | 0 ETH | 0.00009161 | ||||
| Resolve Queued T... | 56642330 | 1096 days ago | IN | 0 ETH | 0.00010526 |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 56655586 | 1096 days ago | 0 ETH | ||||
| 56655586 | 1096 days ago | 0 ETH | ||||
| 56655586 | 1096 days ago | 0 ETH | ||||
| 56655586 | 1096 days ago | 0 ETH | ||||
| 56655540 | 1096 days ago | 0 ETH | ||||
| 56655540 | 1096 days ago | 0 ETH | ||||
| 56653611 | 1096 days ago | 0 ETH | ||||
| 56653611 | 1096 days ago | 0 ETH | ||||
| 56653611 | 1096 days ago | 0 ETH | ||||
| 56653611 | 1096 days ago | 0 ETH | ||||
| 56653571 | 1096 days ago | 0 ETH | ||||
| 56653571 | 1096 days ago | 0 ETH | ||||
| 56651367 | 1096 days ago | 0 ETH | ||||
| 56651367 | 1096 days ago | 0 ETH | ||||
| 56651367 | 1096 days ago | 0 ETH | ||||
| 56651367 | 1096 days ago | 0 ETH | ||||
| 56651340 | 1096 days ago | 0 ETH | ||||
| 56651340 | 1096 days ago | 0 ETH | ||||
| 56648646 | 1096 days ago | 0 ETH | ||||
| 56648646 | 1096 days ago | 0 ETH | ||||
| 56648646 | 1096 days ago | 0 ETH | ||||
| 56648646 | 1096 days ago | 0 ETH | ||||
| 56648627 | 1096 days ago | 0 ETH | ||||
| 56648627 | 1096 days ago | 0 ETH | ||||
| 56646511 | 1096 days ago | 0 ETH |
Cross-Chain Transactions
Contract Source Code (Solidity)
/**
*Submitted for verification at Arbiscan.io on 2022-10-26
*/
// File: 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;
}
}
// File: 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;
}
// File: IERC165.sol
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: 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);
}
// File: InterfacesBinary.sol
interface IOptionRouter {
struct QueuedTrade {
uint256 queueId;
uint256 userQueueIndex;
address user;
uint256 totalFee;
uint256 period;
bool isAbove;
address targetContract;
uint256 expectedStrike;
uint256 slippage;
bool allowPartialFill;
uint256 queuedTime;
uint256 cancellationTime;
bool isQueued;
}
struct Trade {
uint256 queueId;
uint256 price;
}
event OpenTrade(uint256 queueId, address user);
event CancelTrade(uint256 queueId, address user, string reason);
event InitiateTrade(uint256 queueId, address user);
}
interface IBufferBinaryOptions {
event Create(
uint256 indexed id,
address indexed account,
uint256 settlementFee,
uint256 totalFee
);
event Exercise(
uint256 indexed id,
uint256 profit,
uint256 priceAtExpiration
);
event Expire(
uint256 indexed id,
uint256 premium,
uint256 priceAtExpiration
);
function createFromRouter(
address user,
uint256 totalFee,
uint256 period,
bool isAbove,
uint256 strike,
uint256 amount
) external returns (uint256 optionID);
function checkParams(
uint256 totalFee,
bool isAbove,
bool allowPartialFill
) external returns (uint256 amount, uint256 revisedFee);
function runInitialChecks(
uint256 slippage,
uint256 period,
uint256 totalFee
) external view;
function isStrikeValid(
uint256 slippage,
uint256 strike,
uint256 expectedStrike
) external view returns (bool);
enum State {
Inactive,
Active,
Exercised,
Expired
}
enum OptionType {
Invalid,
Put,
Call
}
enum PaymentMethod {
Usdc,
TokenX
}
struct OptionExpiryData {
uint256 optionId;
uint256 priceAtExpiration;
}
struct Option {
State state;
uint256 strike;
uint256 amount;
uint256 lockedAmount;
uint256 premium;
uint256 expiration;
OptionType optionType;
uint256 totalFee;
uint256 createdAt;
}
struct BinaryOptionType {
bool isYes;
bool isAbove;
}
struct SlotDetail {
uint256 strike;
uint256 expiration;
OptionType optionType;
bool isValid;
}
}
interface IBufferOptionsRead {
enum State {
Inactive,
Active,
Exercised,
Expired
}
enum OptionType {
Invalid,
Put,
Call
}
struct Option {
State state;
uint256 strike;
uint256 amount;
uint256 lockedAmount;
uint256 premium;
uint256 expiration;
OptionType optionType;
uint256 totalFee;
uint256 createdAt;
}
struct BinaryOptionType {
bool isYes;
bool isAbove;
}
function priceProvider() external view returns (address);
function expiryToRoundID(uint256 timestamp) external view returns (uint256);
function options(uint256 optionId)
external
view
returns (
State state,
uint256 strike,
uint256 amount,
uint256 lockedAmount,
uint256 premium,
uint256 expiration,
OptionType optionType,
uint256 totalFee,
uint256 createdAt
);
function ownerOf(uint256 optionId) external view returns (address owner);
function nextTokenId() external view returns (uint256 nextToken);
function binaryOptionType(uint256 optionId)
external
view
returns (bool isYes, bool isAbove);
function optionPriceAtExpiration(uint256 optionId)
external
view
returns (uint256 priceAtExpiration);
function config() external view returns (address);
function userOptionIds(address user, uint256 index)
external
view
returns (uint256 optionId);
function userOptionCount(address user)
external
view
returns (uint256 count);
}
interface IOptionRouterRead {
struct QueuedTrade {
uint256 queueId;
uint256 userQueueIndex;
address user;
uint256 totalFee;
uint256 period;
bool isAbove;
address targetContract;
uint256 expectedStrike;
uint256 slippage;
bool allowPartialFill;
uint256 queuedTime;
uint256 cancellationTime;
bool isQueued;
}
function queuedTrades(uint256 queueId)
external
view
returns (QueuedTrade memory);
function userQueueCount(address user) external view returns (uint256);
function userQueuedIds(address user, uint256 index)
external
view
returns (uint256);
function userNextQueueIndexToProcess(address user)
external
view
returns (uint256);
function nextQueueIdToProcess() external view returns (uint256);
function nextQueueId() external view returns (uint256);
function userCancelledQueueCount(address user)
external
view
returns (uint256);
function userCancelledQueuedIds(address user, uint256 index)
external
view
returns (uint256);
}
interface ILiquidityPool {
struct LockedLiquidity {
uint256 amount;
uint256 premium;
bool locked;
}
event Profit(uint256 indexed id, uint256 amount);
event Loss(uint256 indexed id, uint256 amount);
event Provide(address indexed account, uint256 amount, uint256 writeAmount);
event Withdraw(
address indexed account,
uint256 amount,
uint256 writeAmount
);
function unlock(uint256 id) external;
// function unlockPremium(uint256 amount) external;
event UpdateRevertTransfersInLockUpPeriod(
address indexed account,
bool value
);
event InitiateWithdraw(uint256 tokenXAmount, address account);
event ProcessWithdrawRequest(uint256 tokenXAmount, address account);
event UpdatePoolState(bool hasPoolEnded);
event PoolRollOver(uint256 round);
event UpdateMaxLiquidity(uint256 indexed maxLiquidity);
event UpdateExpiry(uint256 expiry);
event UpdateProjectOwner(address account);
function totalTokenXBalance() external view returns (uint256 amount);
function availableBalance() external view returns (uint256 balance);
function unlockWithoutProfit(uint256 id) external;
function send(
uint256 id,
address account,
uint256 amount
) external;
function lock(
uint256 id,
uint256 tokenXAmount,
uint256 premium
) external;
}
interface IOptionsConfig {
enum PermittedTradingType {
All,
OnlyPut,
OnlyCall,
None
}
// event UpdateImpliedVolatility(uint256 value);
event UpdateSettlementFeePercentageForUp(uint256 value);
event UpdateSettlementFeePercentageForDown(uint256 value);
event UpdateSettlementFeeRecipient(address account);
event UpdateStakingFeePercentage(
uint256 treasuryPercentage,
uint256 blpStakingPercentage,
uint256 bfrStakingPercentage,
uint256 insuranceFundPercentage
);
event UpdateOptionCollaterizationRatio(uint256 value);
event UpdateTradingPermission(PermittedTradingType permissionType);
event UpdateStrike(uint256 value);
event UpdateUnits(uint256 value);
event UpdateMaxPeriod(uint256 value);
event UpdateOptionSizePerTxnLimitPercent(uint256 value);
event UpdateSettlementFeeDisbursalContract(address value);
event UpdatePoolUtilizationLimitPercent(uint256 value);
enum OptionType {
Invalid,
Put,
Call
}
}
interface ISettlementFeeDisbursal {
function distributeSettlementFee(uint256 settlementFee)
external
returns (uint256 stakingAmount);
}
// File: ReentrancyGuard.sol
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and make it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}
// File: 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);
}
}
// File: 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;
}
}
// File: AccessControl.sol
/**
* @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 granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) public virtual override {
require(account == _msgSender(), "AccessControl: can only renounce roles for self");
_revokeRole(role, account);
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event. Note that unlike {grantRole}, this function doesn't perform any
* checks on the calling account.
*
* [WARNING]
* ====
* This function should only be called from the constructor when setting
* up the initial roles for the system.
*
* Using this function in any other way is effectively circumventing the admin
* system imposed by {AccessControl}.
* ====
*/
function _setupRole(bytes32 role, address account) internal virtual {
_grantRole(role, account);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*
* Emits a {RoleAdminChanged} event.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
bytes32 previousAdminRole = getRoleAdmin(role);
_roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
function _grantRole(bytes32 role, address account) private {
if (!hasRole(role, account)) {
_roles[role].members[account] = true;
emit RoleGranted(role, account, _msgSender());
}
}
function _revokeRole(bytes32 role, address account) private {
if (hasRole(role, account)) {
_roles[role].members[account] = false;
emit RoleRevoked(role, account, _msgSender());
}
}
}
// File: Router.sol
/**
* @author Heisenberg
* @notice Buffer Options Router Contract
*/
contract OptionRouter is AccessControl, IOptionRouter {
IERC20 public tokenX;
mapping(uint256 => QueuedTrade) public queuedTrades;
mapping(address => bool) public contractRegistry;
bytes32 public constant BOT_ROLE = keccak256("BOT_ROLE");
uint256 MAX_WAIT_TIME = 1 minutes;
uint256 public nextQueueId = 0;
mapping(address => uint256[]) public userQueuedIds;
mapping(address => uint256) public userQueueCount;
mapping(address => uint256[]) public userCancelledQueuedIds;
mapping(address => uint256) public userCancelledQueueCount;
mapping(address => uint256) public userNextQueueIndexToProcess;
uint256 public nextQueueIdToProcess = 0;
constructor(IERC20 _tokenX) {
tokenX = _tokenX;
_setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
}
function _validateContract(address targetContract) private view {
require(
contractRegistry[targetContract],
"Router: Unauthorized contract"
);
}
function setContractRegistry(address targetContract, bool register)
external
onlyRole(DEFAULT_ADMIN_ROLE)
{
contractRegistry[targetContract] = register;
}
function initiateTrade(
uint256 totalFee,
uint256 period,
bool isAbove,
address targetContract,
uint256 expectedStrike,
uint256 slippage,
bool allowPartialFill
) external returns (uint256 queueId) {
_validateContract(targetContract);
IBufferBinaryOptions optionsContract = IBufferBinaryOptions(
targetContract
);
optionsContract.runInitialChecks(slippage, period, totalFee);
// User has to approve first inorder to execute this function
tokenX.transferFrom(msg.sender, address(this), totalFee);
queueId = nextQueueId;
nextQueueId++;
QueuedTrade memory queuedTrade = QueuedTrade(
queueId,
userQueueCount[msg.sender],
msg.sender,
totalFee,
period,
isAbove,
targetContract,
expectedStrike,
slippage,
allowPartialFill,
block.timestamp,
0,
true
);
queuedTrades[queueId] = queuedTrade;
userQueuedIds[msg.sender].push(queueId);
userQueueCount[msg.sender] += 1;
emit InitiateTrade(queueId, msg.sender);
}
function _openQueuedTrade(uint256 queueId, uint256 price) internal {
QueuedTrade storage queuedTrade = queuedTrades[queueId];
IBufferBinaryOptions optionsContract = IBufferBinaryOptions(
queuedTrade.targetContract
);
bool isSlippageWithinRange = optionsContract.isStrikeValid(
queuedTrade.slippage,
price,
queuedTrade.expectedStrike
);
if (!isSlippageWithinRange) {
_cancelQueuedTrade(queueId);
emit CancelTrade(
queueId,
queuedTrade.user,
"Slippage limit exceeds"
);
return;
}
uint256 amount;
uint256 revisedFee;
try
optionsContract.checkParams(
queuedTrade.totalFee,
queuedTrade.isAbove,
queuedTrade.allowPartialFill
)
returns (uint256 _amount, uint256 _revisedFee) {
(amount, revisedFee) = (_amount, _revisedFee);
} catch Error(string memory reason) {
// Cancel the trade
_cancelQueuedTrade(queueId);
emit CancelTrade(queueId, queuedTrade.user, reason);
return;
}
tokenX.transfer(queuedTrade.targetContract, revisedFee);
if (revisedFee < queuedTrade.totalFee) {
tokenX.transfer(
queuedTrade.user,
queuedTrade.totalFee - revisedFee
);
}
try
optionsContract.createFromRouter(
queuedTrade.user,
revisedFee,
queuedTrade.period,
queuedTrade.isAbove,
price,
amount
)
{} catch Error(string memory reason) {
// Cancel the trade
_cancelQueuedTrade(queueId);
emit CancelTrade(queueId, queuedTrade.user, reason);
return;
}
queuedTrade.isQueued = false;
emit OpenTrade(queueId, queuedTrade.user);
}
function _cancelQueuedTrade(uint256 queueId) internal {
QueuedTrade storage queuedTrade = queuedTrades[queueId];
queuedTrade.isQueued = false;
queuedTrade.cancellationTime = block.timestamp;
tokenX.transfer(queuedTrade.user, queuedTrade.totalFee);
userCancelledQueuedIds[queuedTrade.user].push(queueId);
userCancelledQueueCount[queuedTrade.user] += 1;
}
function cancelQueuedTrade(uint256 queueId) external {
QueuedTrade memory queuedTrade = queuedTrades[queueId];
require(msg.sender == queuedTrade.user, "Router: Forbidden");
require(queuedTrade.isQueued, "Router: Trade has already been opened");
_cancelQueuedTrade(queueId);
emit CancelTrade(queueId, queuedTrade.user, "User Cancelled");
}
// Assuming the trades are sent in the order of increasing queueIds and the starting from the nextQueueIdToProcess
function resolveQueuedTrades(Trade[] memory trades)
external
onlyRole(BOT_ROLE)
{
for (uint256 index = 0; index < trades.length; index++) {
QueuedTrade memory queuedTrade = queuedTrades[
trades[index].queueId
];
if (!queuedTrade.isQueued) {
// "Router: Trade has already been opened or cancelled" so ignore this trade
continue;
}
if (block.timestamp - queuedTrade.queuedTime <= MAX_WAIT_TIME) {
_openQueuedTrade(trades[index].queueId, trades[index].price);
} else {
_cancelQueuedTrade(trades[index].queueId);
emit CancelTrade(
trades[index].queueId,
queuedTrade.user,
"Wait time too high"
);
}
// Track the next queueIndex to be processed for user
userNextQueueIndexToProcess[queuedTrade.user] =
queuedTrade.userQueueIndex +
1;
}
// Track the next queueIndex to be processed overall
nextQueueIdToProcess = trades[trades.length - 1].queueId + 1;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract IERC20","name":"_tokenX","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"queueId","type":"uint256"},{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"CancelTrade","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"queueId","type":"uint256"},{"indexed":false,"internalType":"address","name":"user","type":"address"}],"name":"InitiateTrade","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"queueId","type":"uint256"},{"indexed":false,"internalType":"address","name":"user","type":"address"}],"name":"OpenTrade","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"},{"inputs":[],"name":"BOT_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"queueId","type":"uint256"}],"name":"cancelQueuedTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"contractRegistry","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":"uint256","name":"totalFee","type":"uint256"},{"internalType":"uint256","name":"period","type":"uint256"},{"internalType":"bool","name":"isAbove","type":"bool"},{"internalType":"address","name":"targetContract","type":"address"},{"internalType":"uint256","name":"expectedStrike","type":"uint256"},{"internalType":"uint256","name":"slippage","type":"uint256"},{"internalType":"bool","name":"allowPartialFill","type":"bool"}],"name":"initiateTrade","outputs":[{"internalType":"uint256","name":"queueId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nextQueueId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextQueueIdToProcess","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"queuedTrades","outputs":[{"internalType":"uint256","name":"queueId","type":"uint256"},{"internalType":"uint256","name":"userQueueIndex","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"totalFee","type":"uint256"},{"internalType":"uint256","name":"period","type":"uint256"},{"internalType":"bool","name":"isAbove","type":"bool"},{"internalType":"address","name":"targetContract","type":"address"},{"internalType":"uint256","name":"expectedStrike","type":"uint256"},{"internalType":"uint256","name":"slippage","type":"uint256"},{"internalType":"bool","name":"allowPartialFill","type":"bool"},{"internalType":"uint256","name":"queuedTime","type":"uint256"},{"internalType":"uint256","name":"cancellationTime","type":"uint256"},{"internalType":"bool","name":"isQueued","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"queueId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"internalType":"struct IOptionRouter.Trade[]","name":"trades","type":"tuple[]"}],"name":"resolveQueuedTrades","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"targetContract","type":"address"},{"internalType":"bool","name":"register","type":"bool"}],"name":"setContractRegistry","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":[],"name":"tokenX","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userCancelledQueueCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userCancelledQueuedIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userNextQueueIndexToProcess","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userQueueCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userQueuedIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]Contract Creation Code
6080604052603c60045560006005556000600b553480156200002057600080fd5b5060405162001eca38038062001eca833981016040819052620000439162000122565b600180546001600160a01b0319166001600160a01b0383161790556200006b60003362000072565b5062000152565b6200007e828262000082565b5050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff166200007e576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620000de3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60006020828403121562000134578081fd5b81516001600160a01b03811681146200014b578182fd5b9392505050565b611d6880620001626000396000f3fe608060405234801561001057600080fd5b50600436106101125760003560e01c806301ffc9a7146101175780630aadf8fc1461013f57806316dc165b1461016d5780631ea09eae14610198578063248a9ca3146101a15780632661ffb6146101b45780632f2ff15d146101c957806336390f65146101dc57806336568abe146101ef5780633a5dc0081461020257806340b963fa1461021557806356e1783e1461022857806369b836e1146102485780637078956e1461026857806391d148541461027b578063a217fddf1461028e578063a69c678414610296578063aa8c76081461029f578063ae56c6cd146102b2578063b1503774146103ae578063d547741f146103c3578063ed111b06146103d6575b600080fd5b61012a61012536600461191d565b6103f9565b60405190151581526020015b60405180910390f35b61015f61014d366004611773565b60076020526000908152604090205481565b604051908152602001610136565b600154610180906001600160a01b031681565b6040516001600160a01b039091168152602001610136565b61015f60055481565b61015f6101af3660046118da565b610430565b6101c76101c236600461178d565b610445565b005b6101c76101d73660046118f2565b61047d565b6101c76101ea3660046118da565b61049f565b6101c76101fd3660046118f2565b610674565b6101c76102103660046117ec565b6106f2565b61015f610223366004611980565b6109e5565b61015f610236366004611773565b60096020526000908152604090205481565b61015f610256366004611773565b600a6020526000908152604090205481565b61015f6102763660046117c3565b610d84565b61012a6102893660046118f2565b610db5565b61015f600081565b61015f600b5481565b61015f6102ad3660046117c3565b610dde565b6103356102c03660046118da565b600260208190526000918252604090912080546001820154928201546003830154600484015460058501546006860154600787015460088801546009890154600a8a0154600b909a0154989a996001600160a01b03988916999798969760ff808816986101009098049097169693841693168d565b604080519d8e5260208e019c909c526001600160a01b039a8b169b8d019b909b5260608c019890985260808b019690965293151560a08a01529590911660c088015260e087015261010086019390935291151561012085015261014084019190915261016083015215156101808201526101a001610136565b61015f600080516020611d1383398151915281565b6101c76103d13660046118f2565b610dfa565b61012a6103e4366004611773565b60036020526000908152604090205460ff1681565b60006001600160e01b03198216637965db0b60e01b148061042a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60009081526020819052604090206001015490565b60006104518133610e17565b506001600160a01b03919091166000908152600360205260409020805460ff1916911515919091179055565b61048682610430565b6104908133610e17565b61049a8383610e7b565b505050565b60008181526002602081815260409283902083516101a08101855281548152600182015492810192909252918201546001600160a01b039081169382018490526003830154606083015260048301546080830152600583015460ff808216151560a08501526101009182900490921660c0840152600684015460e08401526007840154908301526008830154811615156101208301526009830154610140830152600a830154610160830152600b9092015490911615156101808201529033146105a45760405162461bcd60e51b81526020600482015260116024820152702937baba32b91d102337b93134b23232b760791b60448201526064015b60405180910390fd5b8061018001516106045760405162461bcd60e51b815260206004820152602560248201527f526f757465723a2054726164652068617320616c7265616479206265656e206f6044820152641c195b995960da1b606482015260840161059b565b61060d82610eff565b600080516020611cf38339815191528282604001516040516106689291909182526001600160a01b03166020820152606060408201819052600e908201526d155cd95c8810d85b98d95b1b195960921b608082015260a00190565b60405180910390a15050565b6001600160a01b03811633146106e45760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161059b565b6106ee828261100f565b5050565b600080516020611d1383398151915261070b8133610e17565b60005b82518110156109985760006002600085848151811061073d57634e487b7160e01b600052603260045260246000fd5b60209081029190910181015151825281810192909252604090810160002081516101a0810183528154815260018201549381019390935260028101546001600160a01b03908116928401929092526003810154606084015260048101546080840152600581015460ff808216151560a08601526101009182900490931660c0850152600682015460e08501526007820154908401526008810154821615156101208401526009810154610140840152600a810154610160840152600b015416151561018082018190529091506108135750610986565b6004546101408201516108269042611b4d565b116108905761088b84838151811061084e57634e487b7160e01b600052603260045260246000fd5b60200260200101516000015185848151811061087a57634e487b7160e01b600052603260045260246000fd5b602002602001015160200151611074565b610957565b6108c48483815181106108b357634e487b7160e01b600052603260045260246000fd5b602002602001015160000151610eff565b600080516020611cf38339815191528483815181106108f357634e487b7160e01b600052603260045260246000fd5b602002602001015160000151826040015160405161094e9291909182526001600160a01b03166020820152606060408201819052601290820152710aec2d2e840e8d2daca40e8dede40d0d2ced60731b608082015260a00190565b60405180910390a15b6020810151610967906001611b16565b6040918201516001600160a01b03166000908152600a60205291909120555b8061099081611bfc565b91505061070e565b5081600183516109a89190611b4d565b815181106109c657634e487b7160e01b600052603260045260246000fd5b60200260200101516000015160016109de9190611b16565b600b555050565b60006109f085611504565b60405163b916aa8560e01b815285906001600160a01b0382169063b916aa8590610a229087908c908e90600401611b00565b60006040518083038186803b158015610a3a57600080fd5b505afa158015610a4e573d6000803e3d6000fd5b50506001546040516323b872dd60e01b8152336004820152306024820152604481018d90526001600160a01b0390911692506323b872dd9150606401602060405180830381600087803b158015610aa457600080fd5b505af1158015610ab8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610adc91906118be565b5060058054925082906000610af083611bfc565b91905055506000604051806101a0016040528084815260200160076000336001600160a01b03166001600160a01b03168152602001908152602001600020548152602001336001600160a01b031681526020018b81526020018a81526020018915158152602001886001600160a01b031681526020018781526020018681526020018515158152602001428152602001600081526020016001151581525090508060026000858152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550606082015181600301556080820151816004015560a08201518160050160006101000a81548160ff02191690831515021790555060c08201518160050160016101000a8154816001600160a01b0302191690836001600160a01b0316021790555060e0820151816006015561010082015181600701556101208201518160080160006101000a81548160ff021916908315150217905550610140820151816009015561016082015181600a015561018082015181600b0160006101000a81548160ff02191690831515021790555090505060066000336001600160a01b03166001600160a01b03168152602001908152602001600020839080600181540180825580915050600190039060005260206000200160009091909190915055600160076000336001600160a01b03166001600160a01b031681526020019081526020016000206000828254610d389190611b16565b90915550506040517f567264ea0817cee29213a0338f809a2c6aa07437f29424b290cffce7b352b79890610d6f9085903390611ab6565b60405180910390a15050979650505050505050565b60086020528160005260406000208181548110610da057600080fd5b90600052602060002001600091509150505481565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60066020528160005260406000208181548110610da057600080fd5b610e0382610430565b610e0d8133610e17565b61049a838361100f565b610e218282610db5565b6106ee57610e39816001600160a01b0316601461156f565b610e4483602061156f565b604051602001610e55929190611a1b565b60408051601f198184030181529082905262461bcd60e51b825261059b91600401611aa3565b610e858282610db5565b6106ee576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055610ebb3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600081815260026020819052604091829020600b8101805460ff1916905542600a820155600154918101546003820154935163a9059cbb60e01b815291936001600160a01b039384169363a9059cbb93610f60939091169190600401611a8a565b602060405180830381600087803b158015610f7a57600080fd5b505af1158015610f8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb291906118be565b506002810180546001600160a01b0390811660009081526008602090815260408083208054600181810183559185528385200188905594549093168252600990529081208054909190611006908490611b16565b90915550505050565b6110198282610db5565b156106ee576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000828152600260205260408082206005810154600782015460068301549351631e4c9f7760e11b815292946101009092046001600160a01b03169391928492633c993eee926110ca9290918991600401611b00565b60206040518083038186803b1580156110e257600080fd5b505afa1580156110f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111a91906118be565b9050806111935761112a85610eff565b6002830154604080518781526001600160a01b039092166020830152606082820181905260169083015275536c697070616765206c696d6974206578636565647360501b608083015251600080516020611cf38339815191529181900360a00190a15050505050565b60038301546005840154600885015460405163cbe439e560e01b8152600481019390935260ff91821615156024840152161515604482015260009081906001600160a01b0385169063cbe439e5906064016040805180830381600087803b1580156111fd57600080fd5b505af192505050801561122d575060408051601f3d908101601f1916820190925261122a9181019061195d565b60015b6112af57611239611c43565b806308c379a014156112a3575061124e611c5b565b8061125957506112a5565b61126288610eff565b6002860154604051600080516020611cf383398151915291611291918b916001600160a01b0316908590611acd565b60405180910390a15050505050505050565b505b3d6000803e3d6000fd5b600154600588015460405163a9059cbb60e01b81529395509193506001600160a01b039081169263a9059cbb926112f29261010090910416908590600401611a8a565b602060405180830381600087803b15801561130c57600080fd5b505af1158015611320573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134491906118be565b5084600301548110156113ee57600154600286015460038701546001600160a01b039283169263a9059cbb92169061137d908590611b4d565b6040518363ffffffff1660e01b815260040161139a929190611a8a565b602060405180830381600087803b1580156113b457600080fd5b505af11580156113c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ec91906118be565b505b600285015460048087015460058801546040516384eb637160e01b81526001600160a01b039485169381019390935260248301859052604483019190915260ff16151560648201526084810188905260a48101849052908516906384eb63719060c401602060405180830381600087803b15801561146b57600080fd5b505af192505050801561149b575060408051601f3d908101601f1916820190925261149891810190611945565b60015b6114a757611239611c43565b50600b8501805460ff1916905560028501546040517fbe39a322d7ae62b19e8be1f3730bba85360ef7501d89e363cec00a3d0a628ec1916114f3918a916001600160a01b031690611ab6565b60405180910390a150505050505050565b6001600160a01b03811660009081526003602052604090205460ff1661156c5760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20556e617574686f72697a656420636f6e7472616374000000604482015260640161059b565b50565b6060600061157e836002611b2e565b611589906002611b16565b6001600160401b038111156115ae57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156115d8576020820181803683370190505b509050600360fc1b8160008151811061160157634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061163e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506000611662846002611b2e565b61166d906001611b16565b90505b6001811115611701576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106116af57634e487b7160e01b600052603260045260246000fd5b1a60f81b8282815181106116d357634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c936116fa81611b94565b9050611670565b5083156117505760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161059b565b9392505050565b80356001600160a01b038116811461176e57600080fd5b919050565b600060208284031215611784578081fd5b61175082611757565b6000806040838503121561179f578081fd5b6117a883611757565b915060208301356117b881611ce4565b809150509250929050565b600080604083850312156117d5578182fd5b6117de83611757565b946020939093013593505050565b600060208083850312156117fe578182fd5b82356001600160401b0380821115611814578384fd5b818501915085601f830112611827578384fd5b81358181111561183957611839611c2d565b60409150815161184e858360051b0182611bd0565b818152848101848601600684901b860187018a101561186b578788fd5b8795505b838610156118b05784818b031215611885578788fd5b845161189081611bab565b81358152878201358882015282526001959095019490860190840161186f565b509098975050505050505050565b6000602082840312156118cf578081fd5b815161175081611ce4565b6000602082840312156118eb578081fd5b5035919050565b60008060408385031215611904578182fd5b8235915061191460208401611757565b90509250929050565b60006020828403121561192e578081fd5b81356001600160e01b031981168114611750578182fd5b600060208284031215611956578081fd5b5051919050565b6000806040838503121561196f578182fd5b505080516020909101519092909150565b600080600080600080600060e0888a03121561199a578283fd5b873596506020880135955060408801356119b381611ce4565b94506119c160608901611757565b93506080880135925060a0880135915060c08801356119df81611ce4565b8091505092959891949750929550565b60008151808452611a07816020860160208601611b64565b601f01601f19169290920160200192915050565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b815260008351611a4d816017850160208801611b64565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351611a7e816028840160208801611b64565b01602801949350505050565b6001600160a01b03929092168252602082015260400190565b60208152600061175060208301846119ef565b9182526001600160a01b0316602082015260400190565b8381526001600160a01b0383166020820152606060408201819052600090611af7908301846119ef565b95945050505050565b9283526020830191909152604082015260600190565b60008219821115611b2957611b29611c17565b500190565b6000816000190483118215151615611b4857611b48611c17565b500290565b600082821015611b5f57611b5f611c17565b500390565b60005b83811015611b7f578181015183820152602001611b67565b83811115611b8e576000848401525b50505050565b600081611ba357611ba3611c17565b506000190190565b604081016001600160401b0381118282101715611bca57611bca611c2d565b60405250565b601f8201601f191681016001600160401b0381118282101715611bf557611bf5611c2d565b6040525050565b6000600019821415611c1057611c10611c17565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115611c5857600481823e5160e01c5b90565b600060443d1015611c695790565b6040516003193d81016004833e81513d6001600160401b038083116024840183101715611c9857505050505090565b8285019150815181811115611cb05750505050505090565b843d8701016020828501011115611cca5750505050505090565b611cd960208286010187611bd0565b509095945050505050565b801515811461156c57600080fdfe7b1ec17379893b5b8f526648d3ae6117519cb3a752152ad9fd3843198ec425c66d5c9827c1f410bbb61d3b2a0a34b6b30492d9a1fd38588edca7ec4562ab9c9ba264697066735822122069bb537bd2977ab67cb1141bf8d82354830c90884d1e6710423ad0d6b38e0ceb64736f6c63430008040033000000000000000000000000ff970a61a04b1ca14834a43f5de4533ebddb5cc8
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101125760003560e01c806301ffc9a7146101175780630aadf8fc1461013f57806316dc165b1461016d5780631ea09eae14610198578063248a9ca3146101a15780632661ffb6146101b45780632f2ff15d146101c957806336390f65146101dc57806336568abe146101ef5780633a5dc0081461020257806340b963fa1461021557806356e1783e1461022857806369b836e1146102485780637078956e1461026857806391d148541461027b578063a217fddf1461028e578063a69c678414610296578063aa8c76081461029f578063ae56c6cd146102b2578063b1503774146103ae578063d547741f146103c3578063ed111b06146103d6575b600080fd5b61012a61012536600461191d565b6103f9565b60405190151581526020015b60405180910390f35b61015f61014d366004611773565b60076020526000908152604090205481565b604051908152602001610136565b600154610180906001600160a01b031681565b6040516001600160a01b039091168152602001610136565b61015f60055481565b61015f6101af3660046118da565b610430565b6101c76101c236600461178d565b610445565b005b6101c76101d73660046118f2565b61047d565b6101c76101ea3660046118da565b61049f565b6101c76101fd3660046118f2565b610674565b6101c76102103660046117ec565b6106f2565b61015f610223366004611980565b6109e5565b61015f610236366004611773565b60096020526000908152604090205481565b61015f610256366004611773565b600a6020526000908152604090205481565b61015f6102763660046117c3565b610d84565b61012a6102893660046118f2565b610db5565b61015f600081565b61015f600b5481565b61015f6102ad3660046117c3565b610dde565b6103356102c03660046118da565b600260208190526000918252604090912080546001820154928201546003830154600484015460058501546006860154600787015460088801546009890154600a8a0154600b909a0154989a996001600160a01b03988916999798969760ff808816986101009098049097169693841693168d565b604080519d8e5260208e019c909c526001600160a01b039a8b169b8d019b909b5260608c019890985260808b019690965293151560a08a01529590911660c088015260e087015261010086019390935291151561012085015261014084019190915261016083015215156101808201526101a001610136565b61015f600080516020611d1383398151915281565b6101c76103d13660046118f2565b610dfa565b61012a6103e4366004611773565b60036020526000908152604090205460ff1681565b60006001600160e01b03198216637965db0b60e01b148061042a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60009081526020819052604090206001015490565b60006104518133610e17565b506001600160a01b03919091166000908152600360205260409020805460ff1916911515919091179055565b61048682610430565b6104908133610e17565b61049a8383610e7b565b505050565b60008181526002602081815260409283902083516101a08101855281548152600182015492810192909252918201546001600160a01b039081169382018490526003830154606083015260048301546080830152600583015460ff808216151560a08501526101009182900490921660c0840152600684015460e08401526007840154908301526008830154811615156101208301526009830154610140830152600a830154610160830152600b9092015490911615156101808201529033146105a45760405162461bcd60e51b81526020600482015260116024820152702937baba32b91d102337b93134b23232b760791b60448201526064015b60405180910390fd5b8061018001516106045760405162461bcd60e51b815260206004820152602560248201527f526f757465723a2054726164652068617320616c7265616479206265656e206f6044820152641c195b995960da1b606482015260840161059b565b61060d82610eff565b600080516020611cf38339815191528282604001516040516106689291909182526001600160a01b03166020820152606060408201819052600e908201526d155cd95c8810d85b98d95b1b195960921b608082015260a00190565b60405180910390a15050565b6001600160a01b03811633146106e45760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161059b565b6106ee828261100f565b5050565b600080516020611d1383398151915261070b8133610e17565b60005b82518110156109985760006002600085848151811061073d57634e487b7160e01b600052603260045260246000fd5b60209081029190910181015151825281810192909252604090810160002081516101a0810183528154815260018201549381019390935260028101546001600160a01b03908116928401929092526003810154606084015260048101546080840152600581015460ff808216151560a08601526101009182900490931660c0850152600682015460e08501526007820154908401526008810154821615156101208401526009810154610140840152600a810154610160840152600b015416151561018082018190529091506108135750610986565b6004546101408201516108269042611b4d565b116108905761088b84838151811061084e57634e487b7160e01b600052603260045260246000fd5b60200260200101516000015185848151811061087a57634e487b7160e01b600052603260045260246000fd5b602002602001015160200151611074565b610957565b6108c48483815181106108b357634e487b7160e01b600052603260045260246000fd5b602002602001015160000151610eff565b600080516020611cf38339815191528483815181106108f357634e487b7160e01b600052603260045260246000fd5b602002602001015160000151826040015160405161094e9291909182526001600160a01b03166020820152606060408201819052601290820152710aec2d2e840e8d2daca40e8dede40d0d2ced60731b608082015260a00190565b60405180910390a15b6020810151610967906001611b16565b6040918201516001600160a01b03166000908152600a60205291909120555b8061099081611bfc565b91505061070e565b5081600183516109a89190611b4d565b815181106109c657634e487b7160e01b600052603260045260246000fd5b60200260200101516000015160016109de9190611b16565b600b555050565b60006109f085611504565b60405163b916aa8560e01b815285906001600160a01b0382169063b916aa8590610a229087908c908e90600401611b00565b60006040518083038186803b158015610a3a57600080fd5b505afa158015610a4e573d6000803e3d6000fd5b50506001546040516323b872dd60e01b8152336004820152306024820152604481018d90526001600160a01b0390911692506323b872dd9150606401602060405180830381600087803b158015610aa457600080fd5b505af1158015610ab8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610adc91906118be565b5060058054925082906000610af083611bfc565b91905055506000604051806101a0016040528084815260200160076000336001600160a01b03166001600160a01b03168152602001908152602001600020548152602001336001600160a01b031681526020018b81526020018a81526020018915158152602001886001600160a01b031681526020018781526020018681526020018515158152602001428152602001600081526020016001151581525090508060026000858152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550606082015181600301556080820151816004015560a08201518160050160006101000a81548160ff02191690831515021790555060c08201518160050160016101000a8154816001600160a01b0302191690836001600160a01b0316021790555060e0820151816006015561010082015181600701556101208201518160080160006101000a81548160ff021916908315150217905550610140820151816009015561016082015181600a015561018082015181600b0160006101000a81548160ff02191690831515021790555090505060066000336001600160a01b03166001600160a01b03168152602001908152602001600020839080600181540180825580915050600190039060005260206000200160009091909190915055600160076000336001600160a01b03166001600160a01b031681526020019081526020016000206000828254610d389190611b16565b90915550506040517f567264ea0817cee29213a0338f809a2c6aa07437f29424b290cffce7b352b79890610d6f9085903390611ab6565b60405180910390a15050979650505050505050565b60086020528160005260406000208181548110610da057600080fd5b90600052602060002001600091509150505481565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60066020528160005260406000208181548110610da057600080fd5b610e0382610430565b610e0d8133610e17565b61049a838361100f565b610e218282610db5565b6106ee57610e39816001600160a01b0316601461156f565b610e4483602061156f565b604051602001610e55929190611a1b565b60408051601f198184030181529082905262461bcd60e51b825261059b91600401611aa3565b610e858282610db5565b6106ee576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055610ebb3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600081815260026020819052604091829020600b8101805460ff1916905542600a820155600154918101546003820154935163a9059cbb60e01b815291936001600160a01b039384169363a9059cbb93610f60939091169190600401611a8a565b602060405180830381600087803b158015610f7a57600080fd5b505af1158015610f8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb291906118be565b506002810180546001600160a01b0390811660009081526008602090815260408083208054600181810183559185528385200188905594549093168252600990529081208054909190611006908490611b16565b90915550505050565b6110198282610db5565b156106ee576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000828152600260205260408082206005810154600782015460068301549351631e4c9f7760e11b815292946101009092046001600160a01b03169391928492633c993eee926110ca9290918991600401611b00565b60206040518083038186803b1580156110e257600080fd5b505afa1580156110f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111a91906118be565b9050806111935761112a85610eff565b6002830154604080518781526001600160a01b039092166020830152606082820181905260169083015275536c697070616765206c696d6974206578636565647360501b608083015251600080516020611cf38339815191529181900360a00190a15050505050565b60038301546005840154600885015460405163cbe439e560e01b8152600481019390935260ff91821615156024840152161515604482015260009081906001600160a01b0385169063cbe439e5906064016040805180830381600087803b1580156111fd57600080fd5b505af192505050801561122d575060408051601f3d908101601f1916820190925261122a9181019061195d565b60015b6112af57611239611c43565b806308c379a014156112a3575061124e611c5b565b8061125957506112a5565b61126288610eff565b6002860154604051600080516020611cf383398151915291611291918b916001600160a01b0316908590611acd565b60405180910390a15050505050505050565b505b3d6000803e3d6000fd5b600154600588015460405163a9059cbb60e01b81529395509193506001600160a01b039081169263a9059cbb926112f29261010090910416908590600401611a8a565b602060405180830381600087803b15801561130c57600080fd5b505af1158015611320573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134491906118be565b5084600301548110156113ee57600154600286015460038701546001600160a01b039283169263a9059cbb92169061137d908590611b4d565b6040518363ffffffff1660e01b815260040161139a929190611a8a565b602060405180830381600087803b1580156113b457600080fd5b505af11580156113c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ec91906118be565b505b600285015460048087015460058801546040516384eb637160e01b81526001600160a01b039485169381019390935260248301859052604483019190915260ff16151560648201526084810188905260a48101849052908516906384eb63719060c401602060405180830381600087803b15801561146b57600080fd5b505af192505050801561149b575060408051601f3d908101601f1916820190925261149891810190611945565b60015b6114a757611239611c43565b50600b8501805460ff1916905560028501546040517fbe39a322d7ae62b19e8be1f3730bba85360ef7501d89e363cec00a3d0a628ec1916114f3918a916001600160a01b031690611ab6565b60405180910390a150505050505050565b6001600160a01b03811660009081526003602052604090205460ff1661156c5760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20556e617574686f72697a656420636f6e7472616374000000604482015260640161059b565b50565b6060600061157e836002611b2e565b611589906002611b16565b6001600160401b038111156115ae57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156115d8576020820181803683370190505b509050600360fc1b8160008151811061160157634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061163e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506000611662846002611b2e565b61166d906001611b16565b90505b6001811115611701576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106116af57634e487b7160e01b600052603260045260246000fd5b1a60f81b8282815181106116d357634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c936116fa81611b94565b9050611670565b5083156117505760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161059b565b9392505050565b80356001600160a01b038116811461176e57600080fd5b919050565b600060208284031215611784578081fd5b61175082611757565b6000806040838503121561179f578081fd5b6117a883611757565b915060208301356117b881611ce4565b809150509250929050565b600080604083850312156117d5578182fd5b6117de83611757565b946020939093013593505050565b600060208083850312156117fe578182fd5b82356001600160401b0380821115611814578384fd5b818501915085601f830112611827578384fd5b81358181111561183957611839611c2d565b60409150815161184e858360051b0182611bd0565b818152848101848601600684901b860187018a101561186b578788fd5b8795505b838610156118b05784818b031215611885578788fd5b845161189081611bab565b81358152878201358882015282526001959095019490860190840161186f565b509098975050505050505050565b6000602082840312156118cf578081fd5b815161175081611ce4565b6000602082840312156118eb578081fd5b5035919050565b60008060408385031215611904578182fd5b8235915061191460208401611757565b90509250929050565b60006020828403121561192e578081fd5b81356001600160e01b031981168114611750578182fd5b600060208284031215611956578081fd5b5051919050565b6000806040838503121561196f578182fd5b505080516020909101519092909150565b600080600080600080600060e0888a03121561199a578283fd5b873596506020880135955060408801356119b381611ce4565b94506119c160608901611757565b93506080880135925060a0880135915060c08801356119df81611ce4565b8091505092959891949750929550565b60008151808452611a07816020860160208601611b64565b601f01601f19169290920160200192915050565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b815260008351611a4d816017850160208801611b64565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351611a7e816028840160208801611b64565b01602801949350505050565b6001600160a01b03929092168252602082015260400190565b60208152600061175060208301846119ef565b9182526001600160a01b0316602082015260400190565b8381526001600160a01b0383166020820152606060408201819052600090611af7908301846119ef565b95945050505050565b9283526020830191909152604082015260600190565b60008219821115611b2957611b29611c17565b500190565b6000816000190483118215151615611b4857611b48611c17565b500290565b600082821015611b5f57611b5f611c17565b500390565b60005b83811015611b7f578181015183820152602001611b67565b83811115611b8e576000848401525b50505050565b600081611ba357611ba3611c17565b506000190190565b604081016001600160401b0381118282101715611bca57611bca611c2d565b60405250565b601f8201601f191681016001600160401b0381118282101715611bf557611bf5611c2d565b6040525050565b6000600019821415611c1057611c10611c17565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115611c5857600481823e5160e01c5b90565b600060443d1015611c695790565b6040516003193d81016004833e81513d6001600160401b038083116024840183101715611c9857505050505090565b8285019150815181811115611cb05750505050505090565b843d8701016020828501011115611cca5750505050505090565b611cd960208286010187611bd0565b509095945050505050565b801515811461156c57600080fdfe7b1ec17379893b5b8f526648d3ae6117519cb3a752152ad9fd3843198ec425c66d5c9827c1f410bbb61d3b2a0a34b6b30492d9a1fd38588edca7ec4562ab9c9ba264697066735822122069bb537bd2977ab67cb1141bf8d82354830c90884d1e6710423ad0d6b38e0ceb64736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ff970a61a04b1ca14834a43f5de4533ebddb5cc8
-----Decoded View---------------
Arg [0] : _tokenX (address): 0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000ff970a61a04b1ca14834a43f5de4533ebddb5cc8
Deployed Bytecode Sourcemap
28420:6860:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23699:204;;;;;;:::i;:::-;;:::i;:::-;;;7309:14:1;;7302:22;7284:41;;7272:2;7257:18;23699:204:0;;;;;;;;28820:49;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;7482:25:1;;;7470:2;7455:18;28820:49:0;7437:76:1;28481:20:0;;;;;-1:-1:-1;;;;;28481:20:0;;;;;;-1:-1:-1;;;;;7696:32:1;;;7678:51;;7666:2;7651:18;28481:20:0;7633:102:1;28724:30:0;;;;;;25110:123;;;;;;:::i;:::-;;:::i;29454:191::-;;;;;;:::i;:::-;;:::i;:::-;;25495:147;;;;;;:::i;:::-;;:::i;33510:388::-;;;;;;:::i;:::-;;:::i;26543:218::-;;;;;;:::i;:::-;;:::i;34026:1251::-;;;;;;:::i;:::-;;:::i;29653:1289::-;;;;;;:::i;:::-;;:::i;28944:58::-;;;;;;:::i;:::-;;;;;;;;;;;;;;29011:62;;;;;;:::i;:::-;;;;;;;;;;;;;;28878:59;;;;;;:::i;:::-;;:::i;23995:139::-;;;;;;:::i;:::-;;:::i;23086:49::-;;23131:4;23086:49;;29080:39;;;;;;28763:50;;;;;;:::i;:::-;;:::i;28508:51::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28508:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13069:25:1;;;13125:2;13110:18;;13103:34;;;;-1:-1:-1;;;;;13211:15:1;;;13191:18;;;13184:43;;;;13258:2;13243:18;;13236:34;;;;13301:3;13286:19;;13279:35;;;;13358:14;;13351:22;13164:3;13330:19;;13323:51;13411:15;;;;13405:3;13390:19;;13383:44;13458:3;13443:19;;13436:35;13502:3;13487:19;;13480:35;;;;13559:14;;13552:22;13546:3;13531:19;;13524:51;13606:3;13591:19;;13584:36;;;;13651:3;13636:19;;13629:36;4829:13;4822:21;13714:3;13699:19;;4810:34;13056:3;13041:19;28508:51:0;13023:702:1;28621:56:0;;-1:-1:-1;;;;;;;;;;;28621:56:0;;25887:149;;;;;;:::i;:::-;;:::i;28566:48::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;23699:204;23784:4;-1:-1:-1;;;;;;23808:47:0;;-1:-1:-1;;;23808:47:0;;:87;;-1:-1:-1;;;;;;;;;;21199:40:0;;;23859:36;23801:94;23699:204;-1:-1:-1;;23699:204:0:o;25110:123::-;25176:7;25203:12;;;;;;;;;;:22;;;;25110:123::o;29454:191::-;23131:4;23577:30;23131:4;644:10;23577;:30::i;:::-;-1:-1:-1;;;;;;29594:32:0;;;::::1;;::::0;;;:16:::1;:32;::::0;;;;:43;;-1:-1:-1;;29594:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;29454:191::o;25495:147::-;25578:18;25591:4;25578:12;:18::i;:::-;23577:30;23588:4;644:10;23577;:30::i;:::-;25609:25:::1;25620:4;25626:7;25609:10;:25::i;:::-;25495:147:::0;;;:::o;33510:388::-;33574:30;33607:21;;;:12;:21;;;;;;;;;33574:54;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33574:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33647:10;:30;33639:60;;;;-1:-1:-1;;;33639:60:0;;9292:2:1;33639:60:0;;;9274:21:1;9331:2;9311:18;;;9304:30;-1:-1:-1;;;9350:18:1;;;9343:47;9407:18;;33639:60:0;;;;;;;;;33718:11;:20;;;33710:70;;;;-1:-1:-1;;;33710:70:0;;8886:2:1;33710:70:0;;;8868:21:1;8925:2;8905:18;;;8898:30;8964:34;8944:18;;;8937:62;-1:-1:-1;;;9015:18:1;;;9008:35;9060:19;;33710:70:0;8858:227:1;33710:70:0;33791:27;33810:7;33791:18;:27::i;:::-;-1:-1:-1;;;;;;;;;;;33846:7:0;33855:11;:16;;;33834:56;;;;;;11984:25:1;;;-1:-1:-1;;;;;12045:32:1;12040:2;12025:18;;12018:60;12114:2;12109;12094:18;;12087:30;;;12153:2;12133:18;;;12126:30;-1:-1:-1;;;12187:3:1;12172:19;;12165:45;12065:3;12227:19;;11974:278;33834:56:0;;;;;;;;33510:388;;:::o;26543:218::-;-1:-1:-1;;;;;26639:23:0;;644:10;26639:23;26631:83;;;;-1:-1:-1;;;26631:83:0;;9638:2:1;26631:83:0;;;9620:21:1;9677:2;9657:18;;;9650:30;9716:34;9696:18;;;9689:62;-1:-1:-1;;;9767:18:1;;;9760:45;9822:19;;26631:83:0;9610:237:1;26631:83:0;26727:26;26739:4;26745:7;26727:11;:26::i;:::-;26543:218;;:::o;34026:1251::-;-1:-1:-1;;;;;;;;;;;23577:30:0;28656:21;644:10;23577;:30::i;:::-;34145:13:::1;34140:995;34172:6;:13;34164:5;:21;34140:995;;;34211:30;34244:12;:67;34275:6;34282:5;34275:13;;;;;;-1:-1:-1::0;;;34275:13:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;:21;34244:67;;;;::::1;::::0;;;;;;;;34275:21:::1;34244:67:::0;34211:100;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;34211:100:0;;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;::::0;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;::::1;;;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;;::::0;::::1;;;::::0;;;;;;;;-1:-1:-1;34328:164:0::1;;34468:8;;;34328:164;34556:13;::::0;34530:22:::1;::::0;::::1;::::0;34512:40:::1;::::0;:15:::1;:40;:::i;:::-;:57;34508:420;;34590:60;34607:6;34614:5;34607:13;;;;;;-1:-1:-1::0;;;34607:13:0::1;;;;;;;;;;;;;;;:21;;;34630:6;34637:5;34630:13;;;;;;-1:-1:-1::0;;;34630:13:0::1;;;;;;;;;;;;;;;:19;;;34590:16;:60::i;:::-;34508:420;;;34691:41;34710:6;34717:5;34710:13;;;;;;-1:-1:-1::0;;;34710:13:0::1;;;;;;;;;;;;;;;:21;;;34691:18;:41::i;:::-;-1:-1:-1::0;;;;;;;;;;;34790:6:0::1;34797:5;34790:13;;;;;;-1:-1:-1::0;;;34790:13:0::1;;;;;;;;;;;;;;;:21;;;34834:11;:16;;;34756:156;;;;;;11467:25:1::0;;;-1:-1:-1;;;;;11528:32:1;11523:2;11508:18;;11501:60;11597:2;11592;11577:18;;11570:30;;;11636:2;11616:18;;;11609:30;-1:-1:-1;;;11670:3:1;11655:19;;11648:49;11548:3;11714:19;;11457:282;34756:156:0::1;;;;;;;;34508:420;35076:26;::::0;::::1;::::0;:47:::1;::::0;35122:1:::1;35076:47;:::i;:::-;35039:16;::::0;;::::1;::::0;-1:-1:-1;;;;;35011:45:0::1;;::::0;;;:27:::1;:45;::::0;;;;;:112;34140:995:::1;34187:7:::0;::::1;::::0;::::1;:::i;:::-;;;;34140:995;;;;35232:6;35255:1;35239:6;:13;:17;;;;:::i;:::-;35232:25;;;;;;-1:-1:-1::0;;;35232:25:0::1;;;;;;;;;;;;;;;:33;;;35268:1;35232:37;;;;:::i;:::-;35209:20;:60:::0;-1:-1:-1;;34026:1251:0:o;29653:1289::-;29901:15;29929:33;29947:14;29929:17;:33::i;:::-;30083:60;;-1:-1:-1;;;30083:60:0;;30047:14;;-1:-1:-1;;;;;30083:32:0;;;;;:60;;30116:8;;30126:6;;30134:8;;30083:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30227:6:0;;:56;;-1:-1:-1;;;30227:56:0;;30247:10;30227:56;;;6149:34:1;30267:4:0;6199:18:1;;;6192:43;6251:18;;;6244:34;;;-1:-1:-1;;;;;30227:6:0;;;;-1:-1:-1;30227:19:0;;-1:-1:-1;6084:18:1;;30227:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;30306:11:0;;;;-1:-1:-1;30306:11:0;;30328;:13;30306:11;30328:13;:::i;:::-;;;;;;30354:30;30387:353;;;;;;;;30413:7;30387:353;;;;30435:14;:26;30450:10;-1:-1:-1;;;;;30435:26:0;-1:-1:-1;;;;;30435:26:0;;;;;;;;;;;;;30387:353;;;;30476:10;-1:-1:-1;;;;;30387:353:0;;;;;30501:8;30387:353;;;;30524:6;30387:353;;;;30545:7;30387:353;;;;;;30567:14;-1:-1:-1;;;;;30387:353:0;;;;;30596:14;30387:353;;;;30625:8;30387:353;;;;30648:16;30387:353;;;;;;30679:15;30387:353;;;;30709:1;30387:353;;;;30725:4;30387:353;;;;;30354:386;;30777:11;30753:12;:21;30766:7;30753:21;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30753:35:0;;;;;-1:-1:-1;;;;;30753:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30753:35:0;;;;;-1:-1:-1;;;;;30753:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30801:13;:25;30815:10;-1:-1:-1;;;;;30801:25:0;-1:-1:-1;;;;;30801:25:0;;;;;;;;;;;;30832:7;30801:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30881:1;30851:14;:26;30866:10;-1:-1:-1;;;;;30851:26:0;-1:-1:-1;;;;;30851:26:0;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;-1:-1:-1;;30900:34:0;;;;;;30914:7;;30923:10;;30900:34;:::i;:::-;;;;;;;;29653:1289;;;;;;;;;;;:::o;28878:59::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23995:139::-;24073:4;24097:12;;;;;;;;;;;-1:-1:-1;;;;;24097:29:0;;;;;;;;;;;;;;;23995:139::o;28763:50::-;;;;;;;;;;;;;;;;;;;;25887:149;25971:18;25984:4;25971:12;:18::i;:::-;23577:30;23588:4;644:10;23577;:30::i;:::-;26002:26:::1;26014:4;26020:7;26002:11;:26::i;24424:497::-:0;24505:22;24513:4;24519:7;24505;:22::i;:::-;24500:414;;24693:41;24721:7;-1:-1:-1;;;;;24693:41:0;24731:2;24693:19;:41::i;:::-;24807:38;24835:4;24842:2;24807:19;:38::i;:::-;24598:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;24598:270:0;;;;;;;;;;-1:-1:-1;;;24544:358:0;;;;;;;:::i;27847:229::-;27922:22;27930:4;27936:7;27922;:22::i;:::-;27917:152;;27961:6;:12;;;;;;;;;;;-1:-1:-1;;;;;27961:29:0;;;;;;;;;:36;;-1:-1:-1;;27961:36:0;27993:4;27961:36;;;28044:12;644:10;;564:98;28044:12;-1:-1:-1;;;;;28017:40:0;28035:7;-1:-1:-1;;;;;28017:40:0;28029:4;28017:40;;;;;;;;;;27847:229;;:::o;33088:414::-;33153:31;33187:21;;;:12;:21;;;;;;;;;33219:20;;;:28;;-1:-1:-1;;33219:28:0;;;33289:15;33258:28;;;:46;33219:28;33315:6;33331:16;;;;33349:20;;;;33315:55;;-1:-1:-1;;;33315:55:0;;33187:21;;-1:-1:-1;;;;;33315:6:0;;;;:15;;:55;;33331:16;;;;33349:20;33315:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;33406:16:0;;;;;-1:-1:-1;;;;;33406:16:0;;;33383:40;;;;:22;:40;;;;;;;;:54;;33406:16;33383:54;;;;;;;;;;;;;;;33472:16;;;;;33448:41;;:23;:41;;;;;:46;;:41;;33383:40;33448:46;;33406:16;;33448:46;:::i;:::-;;;;-1:-1:-1;;;;33088:414:0:o;28084:230::-;28159:22;28167:4;28173:7;28159;:22::i;:::-;28155:152;;;28230:5;28198:12;;;;;;;;;;;-1:-1:-1;;;;;28198:29:0;;;;;;;;;;:37;;-1:-1:-1;;28198:37:0;;;28255:40;644:10;;28198:12;;28255:40;;28230:5;28255:40;28084:230;;:::o;30950:2130::-;31028:31;31062:21;;;:12;:21;;;;;;31168:26;;;;31291:20;;;;31346:26;;;;31247:136;;-1:-1:-1;;;31247:136:0;;31062:21;;31168:26;;;;-1:-1:-1;;;;;31168:26:0;;31028:31;;31168:26;;31247:29;;:136;;31291:20;;31326:5;;31247:136;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31218:165;;31401:21;31396:255;;31439:27;31458:7;31439:18;:27::i;:::-;31542:16;;;;31486:130;;;10946:25:1;;;-1:-1:-1;;;;;31542:16:0;;;11002:2:1;10987:18;;10980:60;11076:2;11056:18;;;11049:30;;;11115:2;11095:18;;;11088:30;-1:-1:-1;;;11149:3:1;11134:19;;11127:53;31486:130:0;-1:-1:-1;;;;;;;;;;;31486:130:0;;;;11027:3:1;31486:130:0;;;31633:7;;;30950:2130;;:::o;31396:255::-;31778:20;;;;31817:19;;;;31855:28;;;;31732:166;;-1:-1:-1;;;31732:166:0;;;;;12447:25:1;;;;31817:19:0;;;;12515:14:1;12508:22;12488:18;;;12481:50;31855:28:0;12574:14:1;12567:22;12547:18;;;12540:50;31661:14:0;;;;-1:-1:-1;;;;;31732:27:0;;;;;12420:18:1;;31732:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31732:166:0;;;;;;;;-1:-1:-1;;31732:166:0;;;;;;;;;;;;:::i;:::-;;;31715:521;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;32110:27;32129:7;32110:18;:27::i;:::-;32178:16;;;;32157:46;;-1:-1:-1;;;;;;;;;;;32157:46:0;;;32169:7;;-1:-1:-1;;;;;32178:16:0;;32196:6;;32157:46;:::i;:::-;;;;;;;;32218:7;;;;;;30950:2130;;:::o;31715:521::-;;;;;;;;;;;32248:6;;32264:26;;;;32248:55;;-1:-1:-1;;;32248:55:0;;31994:7;;-1:-1:-1;31994:7:0;;-1:-1:-1;;;;;;32248:6:0;;;;:15;;:55;;:6;32264:26;;;;;31994:7;;32248:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32331:11;:20;;;32318:10;:33;32314:183;;;32368:6;;32402:16;;;;32437:20;;;;-1:-1:-1;;;;;32368:6:0;;;;:15;;32402:16;;32437:33;;32460:10;;32437:33;:::i;:::-;32368:117;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32314:183;32577:16;;;;32641:18;;;;;32678:19;;;;32526:235;;-1:-1:-1;;;32526:235:0;;-1:-1:-1;;;;;32577:16:0;;;32526:235;;;6849:51:1;;;;6916:18;;;6909:34;;;6959:18;;;6952:34;;;;32678:19:0;;7029:14:1;7022:22;7002:18;;;6995:50;7061:19;;;7054:35;;;7105:19;;;7098:35;;;32526:32:0;;;;;;6821:19:1;;32526:235:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32526:235:0;;;;;;;;-1:-1:-1;;32526:235:0;;;;;;;;;;;;:::i;:::-;;;32509:473;;;;:::i;:::-;;32992:20;;;:28;;-1:-1:-1;;32992:28:0;;;33055:16;;;;33036:36;;;;;;33046:7;;-1:-1:-1;;;;;33055:16:0;;33036:36;:::i;:::-;;;;;;;;30950:2130;;;;;;;:::o;29252:194::-;-1:-1:-1;;;;;29349:32:0;;;;;;:16;:32;;;;;;;;29327:111;;;;-1:-1:-1;;;29327:111:0;;8528:2:1;29327:111:0;;;8510:21:1;8567:2;8547:18;;;8540:30;8606:31;8586:18;;;8579:59;8655:18;;29327:111:0;8500:179:1;29327:111:0;29252:194;:::o;19911:451::-;19986:13;20012:19;20044:10;20048:6;20044:1;:10;:::i;:::-;:14;;20057:1;20044:14;:::i;:::-;-1:-1:-1;;;;;20034:25:0;;;;;-1:-1:-1;;;20034:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20034:25:0;;20012:47;;-1:-1:-1;;;20070:6:0;20077:1;20070:9;;;;;;-1:-1:-1;;;20070:9:0;;;;;;;;;;;;:15;-1:-1:-1;;;;;20070:15:0;;;;;;;;;-1:-1:-1;;;20096:6:0;20103:1;20096:9;;;;;;-1:-1:-1;;;20096:9:0;;;;;;;;;;;;:15;-1:-1:-1;;;;;20096:15:0;;;;;;;;-1:-1:-1;20127:9:0;20139:10;20143:6;20139:1;:10;:::i;:::-;:14;;20152:1;20139:14;:::i;:::-;20127:26;;20122:135;20159:1;20155;:5;20122:135;;;-1:-1:-1;;;20207:5:0;20215:3;20207:11;20194:25;;;;;-1:-1:-1;;;20194:25:0;;;;;;;;;;;;20182:6;20189:1;20182:9;;;;;;-1:-1:-1;;;20182:9:0;;;;;;;;;;;;:37;-1:-1:-1;;;;;20182:37:0;;;;;;;;-1:-1:-1;20244:1:0;20234:11;;;;;20162:3;;;:::i;:::-;;;20122:135;;;-1:-1:-1;20275:10:0;;20267:55;;;;-1:-1:-1;;;20267:55:0;;8167:2:1;20267:55:0;;;8149:21:1;;;8186:18;;;8179:30;8245:34;8225:18;;;8218:62;8297:18;;20267:55:0;8139:182:1;20267:55:0;20347:6;19911:451;-1:-1:-1;;;19911:451:0:o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:196::-;251:6;304:2;292:9;283:7;279:23;275:32;272:2;;;325:6;317;310:22;272:2;353:29;372:9;353:29;:::i;393:325::-;458:6;466;519:2;507:9;498:7;494:23;490:32;487:2;;;540:6;532;525:22;487:2;568:29;587:9;568:29;:::i;:::-;558:39;;647:2;636:9;632:18;619:32;660:28;682:5;660:28;:::i;:::-;707:5;697:15;;;477:241;;;;;:::o;723:264::-;791:6;799;852:2;840:9;831:7;827:23;823:32;820:2;;;873:6;865;858:22;820:2;901:29;920:9;901:29;:::i;:::-;891:39;977:2;962:18;;;;949:32;;-1:-1:-1;;;810:177:1:o;992:1332::-;1098:6;1129:2;1172;1160:9;1151:7;1147:23;1143:32;1140:2;;;1193:6;1185;1178:22;1140:2;1225:23;;-1:-1:-1;;;;;1297:14:1;;;1294:2;;;1329:6;1321;1314:22;1294:2;1372:6;1361:9;1357:22;1347:32;;1417:7;1410:4;1406:2;1402:13;1398:27;1388:2;;1444:6;1436;1429:22;1388:2;1485;1472:16;1507:2;1503;1500:10;1497:2;;;1513:18;;:::i;:::-;1552:2;1542:12;;1583:2;1577:9;1595:48;1639:2;1634;1631:1;1627:10;1623:19;1615:6;1595:48;:::i;:::-;1678:18;;;1712:15;;;1747:11;;;1789:1;1785:10;;;1777:19;;1773:28;;1770:41;-1:-1:-1;1767:2:1;;;1829:6;1821;1814:22;1767:2;1856:6;1847:15;;1871:422;1885:2;1882:1;1879:9;1871:422;;;1956:2;1950:3;1941:7;1937:17;1933:26;1930:2;;;1977:6;1969;1962:22;1930:2;2021;2015:9;2037:34;2062:8;2037:34;:::i;:::-;2101:17;;2084:35;;2171:12;;;2158:26;2139:17;;;2132:53;2198:21;;1903:1;1896:9;;;;;2239:12;;;;2271;;1871:422;;;-1:-1:-1;2312:6:1;;1109:1215;-1:-1:-1;;;;;;;;1109:1215:1:o;2329:255::-;2396:6;2449:2;2437:9;2428:7;2424:23;2420:32;2417:2;;;2470:6;2462;2455:22;2417:2;2507:9;2501:16;2526:28;2548:5;2526:28;:::i;2589:190::-;2648:6;2701:2;2689:9;2680:7;2676:23;2672:32;2669:2;;;2722:6;2714;2707:22;2669:2;-1:-1:-1;2750:23:1;;2659:120;-1:-1:-1;2659:120:1:o;2784:264::-;2852:6;2860;2913:2;2901:9;2892:7;2888:23;2884:32;2881:2;;;2934:6;2926;2919:22;2881:2;2975:9;2962:23;2952:33;;3004:38;3038:2;3027:9;3023:18;3004:38;:::i;:::-;2994:48;;2871:177;;;;;:::o;3053:306::-;3111:6;3164:2;3152:9;3143:7;3139:23;3135:32;3132:2;;;3185:6;3177;3170:22;3132:2;3216:23;;-1:-1:-1;;;;;;3268:32:1;;3258:43;;3248:2;;3320:6;3312;3305:22;3559:194;3629:6;3682:2;3670:9;3661:7;3657:23;3653:32;3650:2;;;3703:6;3695;3688:22;3650:2;-1:-1:-1;3731:16:1;;3640:113;-1:-1:-1;3640:113:1:o;3758:255::-;3837:6;3845;3898:2;3886:9;3877:7;3873:23;3869:32;3866:2;;;3919:6;3911;3904:22;3866:2;-1:-1:-1;;3947:16:1;;4003:2;3988:18;;;3982:25;3947:16;;3982:25;;-1:-1:-1;3856:157:1:o;4018:736::-;4125:6;4133;4141;4149;4157;4165;4173;4226:3;4214:9;4205:7;4201:23;4197:33;4194:2;;;4248:6;4240;4233:22;4194:2;4289:9;4276:23;4266:33;;4346:2;4335:9;4331:18;4318:32;4308:42;;4400:2;4389:9;4385:18;4372:32;4413:28;4435:5;4413:28;:::i;:::-;4460:5;-1:-1:-1;4484:38:1;4518:2;4503:18;;4484:38;:::i;:::-;4474:48;;4569:3;4558:9;4554:19;4541:33;4531:43;;4621:3;4610:9;4606:19;4593:33;4583:43;;4678:3;4667:9;4663:19;4650:33;4692:30;4714:7;4692:30;:::i;:::-;4741:7;4731:17;;;4184:570;;;;;;;;;;:::o;4855:258::-;4897:3;4935:5;4929:12;4962:6;4957:3;4950:19;4978:63;5034:6;5027:4;5022:3;5018:14;5011:4;5004:5;5000:16;4978:63;:::i;:::-;5095:2;5074:15;-1:-1:-1;;5070:29:1;5061:39;;;;5102:4;5057:50;;4905:208;-1:-1:-1;;4905:208:1:o;5118:786::-;-1:-1:-1;;;5524:3:1;5517:38;5499:3;5584:6;5578:13;5600:62;5655:6;5650:2;5645:3;5641:12;5634:4;5626:6;5622:17;5600:62;:::i;:::-;-1:-1:-1;;;5721:2:1;5681:16;;;5713:11;;;5706:40;5771:13;;5793:63;5771:13;5842:2;5834:11;;5827:4;5815:17;;5793:63;:::i;:::-;5876:17;5895:2;5872:26;;5507:397;-1:-1:-1;;;;5507:397:1:o;6289:274::-;-1:-1:-1;;;;;6481:32:1;;;;6463:51;;6545:2;6530:18;;6523:34;6451:2;6436:18;;6418:145::o;7740:220::-;7889:2;7878:9;7871:21;7852:4;7909:45;7950:2;7939:9;7935:18;7927:6;7909:45;:::i;10034:274::-;10208:25;;;-1:-1:-1;;;;;10269:32:1;10264:2;10249:18;;10242:60;10196:2;10181:18;;10163:145::o;10313:388::-;10500:25;;;-1:-1:-1;;;;;10561:32:1;;10556:2;10541:18;;10534:60;10630:2;10625;10610:18;;10603:30;;;-1:-1:-1;;10650:45:1;;10676:18;;10668:6;10650:45;:::i;:::-;10642:53;10490:211;-1:-1:-1;;;;;10490:211:1:o;13730:319::-;13932:25;;;13988:2;13973:18;;13966:34;;;;14031:2;14016:18;;14009:34;13920:2;13905:18;;13887:162::o;14054:128::-;14094:3;14125:1;14121:6;14118:1;14115:13;14112:2;;;14131:18;;:::i;:::-;-1:-1:-1;14167:9:1;;14102:80::o;14187:168::-;14227:7;14293:1;14289;14285:6;14281:14;14278:1;14275:21;14270:1;14263:9;14256:17;14252:45;14249:2;;;14300:18;;:::i;:::-;-1:-1:-1;14340:9:1;;14239:116::o;14360:125::-;14400:4;14428:1;14425;14422:8;14419:2;;;14433:18;;:::i;:::-;-1:-1:-1;14470:9:1;;14409:76::o;14490:258::-;14562:1;14572:113;14586:6;14583:1;14580:13;14572:113;;;14662:11;;;14656:18;14643:11;;;14636:39;14608:2;14601:10;14572:113;;;14703:6;14700:1;14697:13;14694:2;;;14738:1;14729:6;14724:3;14720:16;14713:27;14694:2;;14543:205;;;:::o;14753:136::-;14792:3;14820:5;14810:2;;14829:18;;:::i;:::-;-1:-1:-1;;;14865:18:1;;14800:89::o;14894:223::-;14980:2;14968:15;;-1:-1:-1;;;;;14998:34:1;;15034:22;;;14995:62;14992:2;;;15060:18;;:::i;:::-;15096:2;15089:22;-1:-1:-1;14940:177:1:o;15122:249::-;15232:2;15213:13;;-1:-1:-1;;15209:27:1;15197:40;;-1:-1:-1;;;;;15252:34:1;;15288:22;;;15249:62;15246:2;;;15314:18;;:::i;:::-;15350:2;15343:22;-1:-1:-1;;15169:202:1:o;15376:135::-;15415:3;-1:-1:-1;;15436:17:1;;15433:2;;;15456:18;;:::i;:::-;-1:-1:-1;15503:1:1;15492:13;;15423:88::o;15516:127::-;15577:10;15572:3;15568:20;15565:1;15558:31;15608:4;15605:1;15598:15;15632:4;15629:1;15622:15;15648:127;15709:10;15704:3;15700:20;15697:1;15690:31;15740:4;15737:1;15730:15;15764:4;15761:1;15754:15;15780:185;15815:3;15857:1;15839:16;15836:23;15833:2;;;15907:1;15902:3;15897;15882:27;15938:10;15933:3;15929:20;15833:2;15823:142;:::o;15970:671::-;16009:3;16051:4;16033:16;16030:26;16027:2;;;16017:624;:::o;16027:2::-;16093;16087:9;-1:-1:-1;;16158:16:1;16154:25;;16151:1;16087:9;16130:50;16203:11;;16233:16;-1:-1:-1;;;;;16301:14:1;;;16332:4;16320:17;;16317:25;-1:-1:-1;16298:45:1;16295:2;;;16346:5;;;;;16017:624;:::o;16295:2::-;16383:6;16377:4;16373:17;16362:28;;16419:3;16413:10;16446:2;16438:6;16435:14;16432:2;;;16452:5;;;;;;16017:624;:::o;16432:2::-;16536;16517:16;16511:4;16507:27;16503:36;16496:4;16487:6;16482:3;16478:16;16474:27;16471:69;16468:2;;;16543:5;;;;;;16017:624;:::o;16468:2::-;16559:57;16610:4;16601:6;16593;16589:19;16585:30;16579:4;16559:57;:::i;:::-;-1:-1:-1;16632:3:1;;16017:624;-1:-1:-1;;;;;16017:624:1:o;16646:118::-;16732:5;16725:13;16718:21;16711:5;16708:32;16698:2;;16754:1;16751;16744:12
Swarm Source
ipfs://69bb537bd2977ab67cb1141bf8d82354830c90884d1e6710423ad0d6b38e0ceb
Net Worth in USD
Net Worth in ETH
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.