More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 82 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Collect Rewards | 5321946 | 10 hrs ago | IN | 0 S | 0.00573914 | ||||
Add Liquidity AM... | 5257614 | 22 hrs ago | IN | 0 S | 0.02865032 | ||||
Add Liquidity AM... | 5251959 | 23 hrs ago | IN | 0 S | 0.02918338 | ||||
Collect Rewards | 5247738 | 24 hrs ago | IN | 0 S | 0.00573914 | ||||
Add Liquidity AM... | 5197112 | 34 hrs ago | IN | 0 S | 0.03308046 | ||||
Collect Rewards | 5189557 | 36 hrs ago | IN | 0 S | 0.00573914 | ||||
Add Liquidity AM... | 5186670 | 36 hrs ago | IN | 0 S | 0.02453396 | ||||
Add Liquidity AM... | 5118267 | 47 hrs ago | IN | 0 S | 0.03861632 | ||||
Collect Rewards | 5111936 | 2 days ago | IN | 0 S | 0.00573914 | ||||
Buy Peg Coin AMO | 5045242 | 2 days ago | IN | 0 S | 0.01311557 | ||||
Remove Liquidity... | 5045229 | 2 days ago | IN | 0 S | 0.02518345 | ||||
Collect Rewards | 4997318 | 2 days ago | IN | 0 S | 0.00649269 | ||||
Collect Rewards | 4914530 | 3 days ago | IN | 0 S | 0.00649269 | ||||
Collect Rewards | 4835772 | 3 days ago | IN | 0 S | 0.00649269 | ||||
Collect Rewards | 4759097 | 4 days ago | IN | 0 S | 0.00573914 | ||||
Buy Peg Coin AMO | 4608217 | 5 days ago | IN | 0 S | 0.01313251 | ||||
Remove Liquidity... | 4608168 | 5 days ago | IN | 0 S | 0.03133262 | ||||
Collect Rewards | 4573544 | 5 days ago | IN | 0 S | 0.00573914 | ||||
Add Liquidity AM... | 4513749 | 6 days ago | IN | 0 S | 0.03297811 | ||||
Collect Rewards | 4490214 | 6 days ago | IN | 0 S | 0.00649269 | ||||
Collect Rewards | 4429486 | 6 days ago | IN | 0 S | 0.00649269 | ||||
Collect Rewards | 4354381 | 7 days ago | IN | 0 S | 0.00573914 | ||||
Add Liquidity AM... | 4292000 | 7 days ago | IN | 0 S | 0.04911951 | ||||
Buy Peg Coin AMO | 4290705 | 7 days ago | IN | 0 S | 0.02623104 | ||||
Remove Liquidity... | 4290474 | 7 days ago | IN | 0 S | 0.04851616 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
RebalanceAMO
Compiler Version
v0.8.27+commit.40a35a09
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2025-01-08 */ // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.20 ^0.8.26; // lib/openzeppelin-contracts/contracts/interfaces/draft-IERC6093.sol // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol) /** * @dev Standard ERC20 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens. */ interface IERC20Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC20InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC20InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers. * @param spender Address that may be allowed to operate on tokens without being their owner. * @param allowance Amount of tokens a `spender` is allowed to operate with. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC20InvalidApprover(address approver); /** * @dev Indicates a failure with the `spender` to be approved. Used in approvals. * @param spender Address that may be allowed to operate on tokens without being their owner. */ error ERC20InvalidSpender(address spender); } /** * @dev Standard ERC721 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens. */ interface IERC721Errors { /** * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20. * Used in balance queries. * @param owner Address of the current owner of a token. */ error ERC721InvalidOwner(address owner); /** * @dev Indicates a `tokenId` whose `owner` is the zero address. * @param tokenId Identifier number of a token. */ error ERC721NonexistentToken(uint256 tokenId); /** * @dev Indicates an error related to the ownership over a particular token. Used in transfers. * @param sender Address whose tokens are being transferred. * @param tokenId Identifier number of a token. * @param owner Address of the current owner of a token. */ error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC721InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC721InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param tokenId Identifier number of a token. */ error ERC721InsufficientApproval(address operator, uint256 tokenId); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC721InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC721InvalidOperator(address operator); } /** * @dev Standard ERC1155 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens. */ interface IERC1155Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. * @param tokenId Identifier number of a token. */ error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC1155InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC1155InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param owner Address of the current owner of a token. */ error ERC1155MissingApprovalForAll(address operator, address owner); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC1155InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC1155InvalidOperator(address operator); /** * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation. * Used in batch transfers. * @param idsLength Length of the array of token identifiers * @param valuesLength Length of the array of token amounts */ error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength); } // lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); } // lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Permit.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol) /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * ==== Security Considerations * * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be * considered as an intention to spend the allowance in any specific way. The second is that because permits have * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be * generally recommended is: * * ```solidity * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} * doThing(..., value); * } * * function doThing(..., uint256 value) public { * token.safeTransferFrom(msg.sender, address(this), value); * ... * } * ``` * * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also * {SafeERC20-safeTransferFrom}). * * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so * contracts should have entry points that don't rely on permit. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. * * CAUTION: See Security Considerations above. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // lib/openzeppelin-contracts/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol) /** * @dev Collection of functions related to the address type */ library Address { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error AddressInsufficientBalance(address account); /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedInnerCall(); /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert AddressInsufficientBalance(address(this)); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert FailedInnerCall(); } } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {FailedInnerCall} error. * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert AddressInsufficientBalance(address(this)); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an * unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {FailedInnerCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. */ function _revert(bytes memory returndata) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert FailedInnerCall(); } } } // lib/openzeppelin-contracts/contracts/utils/Context.sol // OpenZeppelin Contracts (last updated v5.0.1) (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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } // src/interfaces/IAdapter.sol interface IAdapter { function balanceLP() external view returns (uint256); function addLiquidity( uint256 _amountPeg, uint256 _amountStable,uint256 _minAmountLP ) external; function removeLiquidity(uint256 amountLP, uint256 minPeg, uint256 minStable) external; function buyPegCoin(uint256 amountStable,uint256 minAmountPeg) external; function sellPegCoin(uint256 amountPeg, uint256 minAmounStable) external; function getReward(address profitManager) external; function withdrawERC20ToAMO(address token, uint256 amount) external; function withdrawEtherToAMO(uint256 amount) external; function withdrawAllToAMO() external; } // src/interfaces/IOracle.sol interface IOracle { function getPrice() external view returns (uint256); } // lib/openzeppelin-contracts/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol) /** * @dev Interface for the optional metadata functions from the ERC20 standard. */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable2Step.sol) /** * @dev Contract module which provides access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is specified at deployment time in the constructor for `Ownable`. This * can later be changed with {transferOwnership} and {acceptOwnership}. * * This module is used through inheritance. It will make available all functions * from parent (Ownable). */ abstract contract Ownable2Step is Ownable { address private _pendingOwner; event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner); /** * @dev Returns the address of the pending owner. */ function pendingOwner() public view virtual returns (address) { return _pendingOwner; } /** * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual override onlyOwner { _pendingOwner = newOwner; emit OwnershipTransferStarted(owner(), newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner. * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual override { delete _pendingOwner; super._transferOwnership(newOwner); } /** * @dev The new owner accepts the ownership transfer. */ function acceptOwnership() public virtual { address sender = _msgSender(); if (pendingOwner() != sender) { revert OwnableUnauthorizedAccount(sender); } _transferOwnership(sender); } } // lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol) /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev An operation with an ERC20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data); if (returndata.length != 0 && !abi.decode(returndata, (bool))) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0; } } // lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol) /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * The default value of {decimals} is 18. To change this, you should override * this function so it returns a different value. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. */ abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors { mapping(address account => uint256) private _balances; mapping(address account => mapping(address spender => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the default value returned by this function, unless * it's overridden. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `value`. */ function transfer(address to, uint256 value) public virtual returns (bool) { address owner = _msgSender(); _transfer(owner, to, value); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 value) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, value); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `value`. * - the caller must have allowance for ``from``'s tokens of at least * `value`. */ function transferFrom(address from, address to, uint256 value) public virtual returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, value); _transfer(from, to, value); return true; } /** * @dev Moves a `value` amount of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * NOTE: This function is not virtual, {_update} should be overridden instead. */ function _transfer(address from, address to, uint256 value) internal { if (from == address(0)) { revert ERC20InvalidSender(address(0)); } if (to == address(0)) { revert ERC20InvalidReceiver(address(0)); } _update(from, to, value); } /** * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from` * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding * this function. * * Emits a {Transfer} event. */ function _update(address from, address to, uint256 value) internal virtual { if (from == address(0)) { // Overflow check required: The rest of the code assumes that totalSupply never overflows _totalSupply += value; } else { uint256 fromBalance = _balances[from]; if (fromBalance < value) { revert ERC20InsufficientBalance(from, fromBalance, value); } unchecked { // Overflow not possible: value <= fromBalance <= totalSupply. _balances[from] = fromBalance - value; } } if (to == address(0)) { unchecked { // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply. _totalSupply -= value; } } else { unchecked { // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256. _balances[to] += value; } } emit Transfer(from, to, value); } /** * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0). * Relies on the `_update` mechanism * * Emits a {Transfer} event with `from` set to the zero address. * * NOTE: This function is not virtual, {_update} should be overridden instead. */ function _mint(address account, uint256 value) internal { if (account == address(0)) { revert ERC20InvalidReceiver(address(0)); } _update(address(0), account, value); } /** * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply. * Relies on the `_update` mechanism. * * Emits a {Transfer} event with `to` set to the zero address. * * NOTE: This function is not virtual, {_update} should be overridden instead */ function _burn(address account, uint256 value) internal { if (account == address(0)) { revert ERC20InvalidSender(address(0)); } _update(account, address(0), value); } /** * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. * * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument. */ function _approve(address owner, address spender, uint256 value) internal { _approve(owner, spender, value, true); } /** * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event. * * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any * `Approval` event during `transferFrom` operations. * * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to * true using the following override: * ``` * function _approve(address owner, address spender, uint256 value, bool) internal virtual override { * super._approve(owner, spender, value, true); * } * ``` * * Requirements are the same as {_approve}. */ function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual { if (owner == address(0)) { revert ERC20InvalidApprover(address(0)); } if (spender == address(0)) { revert ERC20InvalidSpender(address(0)); } _allowances[owner][spender] = value; if (emitEvent) { emit Approval(owner, spender, value); } } /** * @dev Updates `owner` s allowance for `spender` based on spent `value`. * * Does not update the allowance value in case of infinite allowance. * Revert if not enough allowance is available. * * Does not emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 value) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { if (currentAllowance < value) { revert ERC20InsufficientAllowance(spender, currentAllowance, value); } unchecked { _approve(owner, spender, currentAllowance - value, false); } } } } // src/RebalanceAMO.sol contract RebalanceAMO is Ownable2Step { using SafeERC20 for IERC20; // === MANAGEMENT === address public manager; address public securityManager; address public profitManager; uint256 public paused; // 0 for not paused, 1 for paused uint256 public coolDown = 600; // At least 10 minutes between two manager functions uint256 public lastCallSwap = 0; uint256 public lastCallLiquidity = 0; constructor() Ownable(msg.sender) {} modifier onlyManager { require(msg.sender == manager || msg.sender == owner(), "AMO: Not Manager"); _; } modifier onlySecurityManager { require(msg.sender == securityManager || msg.sender == manager || msg.sender == owner(), "AMO: Not Security Manager"); // Changed PSM to AMO for consistency _; } modifier onlySwapCoolDown { require(block.timestamp >= lastCallSwap + coolDown, "AMO: swap Cooling Down"); _; lastCallSwap = block.timestamp; } modifier onlyLiquidityCoolDown { require(block.timestamp >= lastCallLiquidity + coolDown, "AMO: liquidity Cooling Down"); _; lastCallLiquidity = block.timestamp; } modifier whenNotPaused { require(paused == 0, "AMO: Paused"); _; } function pause() external onlySecurityManager { require(paused == 0, "AMO: Already paused"); paused = 1; emit Paused(); } function unpause() external onlyOwner { require(paused == 1, "AMO: Already unpaused"); paused = 0; emit Unpaused(); } function configSecurity(address _manager, address _securityManager, address _profitManager, uint256 _coolDown, uint256 _buySlippage, uint256 _sellSlippage) external onlyOwner { require(_manager != address(0) && _securityManager != address(0) && _profitManager != address(0), "AMO: Zero address"); // Added zero address checks require(_coolDown > 60, "AMO: Invalid cooldown"); // Added validation require(_buySlippage <= ONE && _sellSlippage <= ONE, "AMO: Invalid slippage"); // Added slippage validation manager = _manager; securityManager = _securityManager; profitManager = _profitManager; coolDown = _coolDown; buySlippage = _buySlippage; sellSlippage = _sellSlippage; } // === TOKENS === address public pegCoin; // atToken address public stableCoin; // The stable coin that forms the pair with our token address public adapter; // the dex adapter implementing our interface address public oracle; // the oracle to read the price between pegCoin and stableCoin // @audit: one-shot address configuration bool _addressConfiged; function configAddress(address _pegCoin, address _stableCoin, address _adapter, address _oracle) external onlyOwner { // @audit: one-shot address configuration require(!_addressConfiged, "Address already configured"); _addressConfiged = true; require(_pegCoin != address(0) && _stableCoin != address(0) && _adapter != address(0), "AMO: Zero address"); // Added zero address checks pegCoin = _pegCoin; stableCoin = _stableCoin; adapter = _adapter; oracle = _oracle; // Oracle can be zero address } // === SLIPPAGE CONTROL === uint256 immutable public ONE = 1e18; uint256 public buySlippage = 1e18 * 997 / 1000; // 0.3% uint256 public sellSlippage = 1e18 * 997 / 1000; // 0.3% // === EVENTS === event PegCoinBought(uint256 amountStable, uint256 amountPeg); event PegCoinSold(uint256 amountPeg, uint256 amountStable); event LiquidityAdded(uint256 amountPeg, uint256 amountStable, uint256 amountLP); event LiquidityRemoved(uint256 amountLP, uint256 amountPeg, uint256 amountStable); event RewardsCollected(address to); event Paused(); event Unpaused(); // === MAIN FUNCTIONS === function buyPegCoinAMO( uint256 _amountStable, // The amount of stableCoin to sell uint256 _minPegCoin // The minimum amount of pegCoin to receive ) external onlyManager onlySwapCoolDown whenNotPaused { address _adapter = adapter; address _stableCoin = stableCoin; address _pegCoin = pegCoin; // cache { // input verifications, use curly braces to limit the scope of the variables and avoid stack-too-deep error require(_amountStable > 0, "AMO: Amount must be positive"); // This price is only for slippage check, it is okay to be inaccurate // `1e18` amount of pegCoin = `price` amount of stablecoin, we already consider decimals in getPrice // e.g., if the decimals of stablecoin is 18, then price = 1e18; if the decimals of stablecoin is 6, then price = 1e6 uint price = getPrice(); uint outputAmountAtExpectedPrice = _amountStable * ONE / price; require(_minPegCoin >= outputAmountAtExpectedPrice * buySlippage / ONE, "AMO: Slippage too low"); require(IERC20(_stableCoin).balanceOf(address(this)) >= _amountStable, "AMO: Insufficient stableCoin"); } // transfer stableCoin to adapter IERC20(_stableCoin).safeTransfer(_adapter, _amountStable); uint256 beforeSwap = IERC20(_pegCoin).balanceOf(address(this)); // Let the adapter buy pegCoin (note that the peg coin should be transferred back) IAdapter(_adapter).buyPegCoin(_amountStable, _minPegCoin); uint256 swapAmount = IERC20(_pegCoin).balanceOf(address(this)) - beforeSwap; require(swapAmount >= _minPegCoin, "AMO: insufficient peg coin"); // slippage constriant emit PegCoinBought(_amountStable, swapAmount); } function getPrice() internal view returns (uint) { if (oracle == address(0)) { return 1e18; } else { return IOracle(oracle).getPrice(); } } function sellPegCoinAMO( uint256 _amountPegCoin, // The amount of pegCoin to sell uint256 _minStable // The minimum amount of stableCoin to receive ) external onlyManager onlySwapCoolDown whenNotPaused { address _adapter = adapter; address _stableCoin = stableCoin; address _pegCoin = pegCoin; // cache { // input verifications, use curly braces to limit the scope of the variables and avoid stack-too-deep error require(_amountPegCoin > 0, "AMO: Amount must be positive"); uint price = getPrice(); uint outputAmountAtExpectedPrice = _amountPegCoin * price / ONE; require(_minStable >= outputAmountAtExpectedPrice * sellSlippage / ONE, "AMO: Slippage too low"); require(IERC20(_pegCoin).balanceOf(address(this)) >= _amountPegCoin, "AMO: Insufficient pegCoin"); } // transfer pegCoin to adapter IERC20(_pegCoin).safeTransfer(_adapter, _amountPegCoin); uint256 beforeSwap = IERC20(_stableCoin).balanceOf(address(this)); // Let the adapter sell pegCoin (note that the peg coin should be transferred back) IAdapter(_adapter).sellPegCoin(_amountPegCoin, _minStable); uint256 swapAmount = IERC20(_stableCoin).balanceOf(address(this)) - beforeSwap; // slippage constraint require(swapAmount >= _minStable, "AMO: insufficient stable coin"); emit PegCoinSold(_amountPegCoin, swapAmount); } function addLiquidityAMO( uint256 _amountPeg, // The amount of pegCoin to add liquidity uint256 _amountStable, // The amount of stableCoin to add liquidity uint256 _minAmountLP // The minimum amount of LP to be minted ) external onlyManager onlyLiquidityCoolDown whenNotPaused { address _adapter = adapter; address _stableCoin = stableCoin; address _pegCoin = pegCoin; // cache require(IERC20(_pegCoin).balanceOf(address(this)) >= _amountPeg, "Insufficient pegCoin"); require(IERC20(_stableCoin).balanceOf(address(this)) >= _amountStable, "Insufficient stableCoin"); // transfer pegCoin and stableCoin to adapter IERC20(_pegCoin).safeTransfer(_adapter, _amountPeg); IERC20(_stableCoin).safeTransfer(_adapter, _amountStable); // Let the adapter add liquidity // !!!WARNING: the adapter MUST perform SLIPPAGE CHECKS uint256 beforeSwap = IAdapter(_adapter).balanceLP(); IAdapter(_adapter).addLiquidity(_amountPeg, _amountStable, _minAmountLP); uint256 addAmount = IAdapter(_adapter).balanceLP() - beforeSwap; require(addAmount >= _minAmountLP, "AMO: insufficient LP"); emit LiquidityAdded(_amountPeg, _amountStable, addAmount); } function removeLiquidityAMO( uint256 _amountLP, // The amount of LP token to withdraw uint256 _minPegCoin, // The minimum amount of pegCoin to receive uint256 _minStable // The minimum amount of stableCoin to receive ) external onlyManager onlyLiquidityCoolDown whenNotPaused { address _adapter = adapter; address _stableCoin = stableCoin; address _pegCoin = pegCoin; // cache // input verifications require(_amountLP > 0, "AMO: Amount must be positive"); require(IAdapter(_adapter).balanceLP() >= _amountLP, "AMO: Insufficient LP"); uint256 beforeSwapPeg = IERC20(_pegCoin).balanceOf(address(this)); uint256 beforeSwapStable = IERC20(_stableCoin).balanceOf(address(this)); // Let the adapter remove liquidity (note that the peg/stable coin should be transferred back) IAdapter(_adapter).removeLiquidity(_amountLP, _minPegCoin, _minStable); uint256 swapAmountPeg = IERC20(_pegCoin).balanceOf(address(this)) - beforeSwapPeg; uint256 swapAmountStable = IERC20(_stableCoin).balanceOf(address(this)) - beforeSwapStable; // slippage constraint require(swapAmountPeg >= _minPegCoin, "AMO: insufficient peg coin"); require(swapAmountStable >= _minStable, "AMO: insufficient stable coin"); emit LiquidityRemoved(_amountLP, swapAmountPeg, swapAmountStable); } // This is called to collect rewards and send to profitManager. function collectRewards() external onlyManager whenNotPaused { require(profitManager != address(0), "AMO: ProfitManager not configured"); IAdapter(adapter).getReward(profitManager); emit RewardsCollected(profitManager); } // The adapter should only contain LP token // When there are pegcoin or stablecoin in the adapter, we withdraw them to AMO function withdrawTokens() external onlyManager { uint256 pegBal = IERC20(pegCoin).balanceOf(adapter); if(pegBal > 0){ IAdapter(adapter).withdrawERC20ToAMO(pegCoin, pegBal); } uint256 stableBal = IERC20(stableCoin).balanceOf(adapter); if(stableBal > 0){ IAdapter(adapter).withdrawERC20ToAMO(stableCoin, stableBal); } } // === GOVERNANCE FUNCTIONS & EMERGENCY FUNCTIONS === function RescueTokenToAMO(address tokenAddress, uint256 tokenAmount) external onlyOwner { if(tokenAddress == address(0)){ IAdapter(adapter).withdrawEtherToAMO(tokenAmount); } else { IAdapter(adapter).withdrawERC20ToAMO(tokenAddress, tokenAmount); } } function RescueTokenToOwner(address tokenAddress) external onlyOwner { if(tokenAddress == address(0)){ payable(owner()).call{value: address(this).balance}(""); } else { if (IERC20(tokenAddress).balanceOf(address(this)) > 0) { IERC20(tokenAddress).safeTransfer(owner(), IERC20(tokenAddress).balanceOf(address(this))); } } } // This function can only be called by the multi sig owner in emergency. // It is to avoid using proxy contract and in case any assets are stuck in the contract. function rescue(address target, uint256 value, bytes calldata data) external onlyOwner { (bool success, ) = target.call{value: value}(data); require(success, "Rescue: Call failed"); } receive() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountPeg","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountStable","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountLP","type":"uint256"}],"name":"LiquidityAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountLP","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountPeg","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountStable","type":"uint256"}],"name":"LiquidityRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountStable","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountPeg","type":"uint256"}],"name":"PegCoinBought","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountPeg","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountStable","type":"uint256"}],"name":"PegCoinSold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"RewardsCollected","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpaused","type":"event"},{"inputs":[],"name":"ONE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"RescueTokenToAMO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"RescueTokenToOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"adapter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountPeg","type":"uint256"},{"internalType":"uint256","name":"_amountStable","type":"uint256"},{"internalType":"uint256","name":"_minAmountLP","type":"uint256"}],"name":"addLiquidityAMO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountStable","type":"uint256"},{"internalType":"uint256","name":"_minPegCoin","type":"uint256"}],"name":"buyPegCoinAMO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buySlippage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pegCoin","type":"address"},{"internalType":"address","name":"_stableCoin","type":"address"},{"internalType":"address","name":"_adapter","type":"address"},{"internalType":"address","name":"_oracle","type":"address"}],"name":"configAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"},{"internalType":"address","name":"_securityManager","type":"address"},{"internalType":"address","name":"_profitManager","type":"address"},{"internalType":"uint256","name":"_coolDown","type":"uint256"},{"internalType":"uint256","name":"_buySlippage","type":"uint256"},{"internalType":"uint256","name":"_sellSlippage","type":"uint256"}],"name":"configSecurity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"coolDown","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastCallLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastCallSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pegCoin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"profitManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountLP","type":"uint256"},{"internalType":"uint256","name":"_minPegCoin","type":"uint256"},{"internalType":"uint256","name":"_minStable","type":"uint256"}],"name":"removeLiquidityAMO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"rescue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"securityManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountPegCoin","type":"uint256"},{"internalType":"uint256","name":"_minStable","type":"uint256"}],"name":"sellPegCoinAMO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellSlippage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stableCoin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a06040526102586006555f6007819055600855670de0b6b3a7640000608052670dd60e37b9108000600d819055600e5534801561003b575f5ffd5b50338061006157604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b61006a81610070565b506100db565b600180546001600160a01b03191690556100898161008c565b50565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b608051612bed61011d5f395f818161045a0152818161086e015281816108a501528181611a9501528181611ac801528181612364015261238f0152612bed5ff3fe6080604052600436106101de575f3560e01c806388de8bd8116100fd578063ced1fac411610092578063e30c397811610062578063e30c397814610517578063f2fde38b14610534578063f80c2b8814610553578063fda58fb214610568575f5ffd5b8063ced1fac41461049b578063d22736a7146104ba578063de675a6d146104d9578063de7f9602146104f8575f5ffd5b8063ac866f62116100cd578063ac866f621461040b578063ae96b27d1461042a578063c2ee3a0814610449578063c7e5a39e1461047c575f5ffd5b806388de8bd8146103a75780638d8f2adb146103bc5780638da5cb5b146103d0578063992642e5146103ec575f5ffd5b80635c975abb1161017357806379ba50971161014357806379ba50971461034b5780637dc0d1d01461035f5780638401232e1461037e5780638456cb5914610393575f5ffd5b80635c975abb146102ef5780635fa6c0b91461030457806370bb45b314610323578063715018a614610337575f5ffd5b806331d9ce8b116101ae57806331d9ce8b146102885780633f4ba83a146102a7578063481c6a75146102bb5780634d056f6d146102da575f5ffd5b806303eadcfc146101e9578063050e46151461022557806312f6e13914610246578063176646fa14610269575f5ffd5b366101e557005b5f5ffd5b3480156101f4575f5ffd5b50600b54610208906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610230575f5ffd5b5061024461023f36600461291d565b610587565b005b348015610251575f5ffd5b5061025b600e5481565b60405190815260200161021c565b348015610274575f5ffd5b50610244610283366004612936565b6106f6565b348015610293575f5ffd5b506102446102a2366004612956565b610be5565b3480156102b2575f5ffd5b50610244611129565b3480156102c6575f5ffd5b50600254610208906001600160a01b031681565b3480156102e5575f5ffd5b5061025b60065481565b3480156102fa575f5ffd5b5061025b60055481565b34801561030f575f5ffd5b5061024461031e36600461297f565b6111b2565b34801561032e575f5ffd5b5061024461126d565b348015610342575f5ffd5b50610244611446565b348015610356575f5ffd5b50610244611459565b34801561036a575f5ffd5b50600c54610208906001600160a01b031681565b348015610389575f5ffd5b5061025b600d5481565b34801561039e575f5ffd5b5061024461149a565b3480156103b2575f5ffd5b5061025b60085481565b3480156103c7575f5ffd5b5061024461159c565b3480156103db575f5ffd5b505f546001600160a01b0316610208565b3480156103f7575f5ffd5b50600a54610208906001600160a01b031681565b348015610416575f5ffd5b50610244610425366004612a02565b6117be565b348015610435575f5ffd5b50610244610444366004612936565b61191e565b348015610454575f5ffd5b5061025b7f000000000000000000000000000000000000000000000000000000000000000081565b348015610487575f5ffd5b50610244610496366004612956565b611df7565b3480156104a6575f5ffd5b506102446104b5366004612a53565b61228a565b3480156104c5575f5ffd5b50600454610208906001600160a01b031681565b3480156104e4575f5ffd5b50600354610208906001600160a01b031681565b348015610503575f5ffd5b50600954610208906001600160a01b031681565b348015610522575f5ffd5b506001546001600160a01b0316610208565b34801561053f575f5ffd5b5061024461054e36600461291d565b61244d565b34801561055e575f5ffd5b5061025b60075481565b348015610573575f5ffd5b50610244610582366004612aae565b6124bd565b61058f612556565b6001600160a01b0381166105fa575f546001600160a01b03166001600160a01b0316476040515f6040518083038185875af1925050503d805f81146105ef576040519150601f19603f3d011682016040523d82523d5f602084013e6105f4565b606091505b50505050565b6040516370a0823160e01b81523060048201525f906001600160a01b038316906370a0823190602401602060405180830381865afa15801561063e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106629190612ad6565b11156106f3576106f361067c5f546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa1580156106be573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e29190612ad6565b6001600160a01b0384169190612582565b50565b6002546001600160a01b031633148061071857505f546001600160a01b031633145b61075c5760405162461bcd60e51b815260206004820152601060248201526f20a6a79d102737ba1026b0b730b3b2b960811b60448201526064015b60405180910390fd5b60065460075461076c9190612b01565b4210156107bb5760405162461bcd60e51b815260206004820152601660248201527f414d4f3a207377617020436f6f6c696e6720446f776e000000000000000000006044820152606401610753565b600554156107f95760405162461bcd60e51b815260206004820152600b60248201526a105353ce8814185d5cd95960aa1b6044820152606401610753565b600b54600a546009546001600160a01b03928316929182169116846108605760405162461bcd60e51b815260206004820152601c60248201527f414d4f3a20416d6f756e74206d75737420626520706f736974697665000000006044820152606401610753565b5f610869612607565b90505f7f00000000000000000000000000000000000000000000000000000000000000006108978389612b14565b6108a19190612b2b565b90507f0000000000000000000000000000000000000000000000000000000000000000600e54826108d29190612b14565b6108dc9190612b2b565b86101561092b5760405162461bcd60e51b815260206004820152601560248201527f414d4f3a20536c69707061676520746f6f206c6f7700000000000000000000006044820152606401610753565b6040516370a0823160e01b815230600482015287906001600160a01b038516906370a0823190602401602060405180830381865afa15801561096f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109939190612ad6565b10156109e15760405162461bcd60e51b815260206004820152601960248201527f414d4f3a20496e73756666696369656e7420706567436f696e000000000000006044820152606401610753565b506109f890506001600160a01b0382168487612582565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa158015610a3c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a609190612ad6565b6040517f327da61700000000000000000000000000000000000000000000000000000000815260048101889052602481018790529091506001600160a01b0385169063327da617906044015f604051808303815f87803b158015610ac2575f5ffd5b505af1158015610ad4573d5f5f3e3d5ffd5b50506040516370a0823160e01b81523060048201525f92508391506001600160a01b038616906370a0823190602401602060405180830381865afa158015610b1e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b429190612ad6565b610b4c9190612b4a565b905085811015610b9e5760405162461bcd60e51b815260206004820152601d60248201527f414d4f3a20696e73756666696369656e7420737461626c6520636f696e0000006044820152606401610753565b60408051888152602081018390527fad0db358dc624ee62c6e3d81b2c8ddf81acefba48291d6334a3431d90606738091015b60405180910390a15050426007555050505050565b6002546001600160a01b0316331480610c0757505f546001600160a01b031633145b610c465760405162461bcd60e51b815260206004820152601060248201526f20a6a79d102737ba1026b0b730b3b2b960811b6044820152606401610753565b600654600854610c569190612b01565b421015610ca55760405162461bcd60e51b815260206004820152601b60248201527f414d4f3a206c697175696469747920436f6f6c696e6720446f776e00000000006044820152606401610753565b60055415610ce35760405162461bcd60e51b815260206004820152600b60248201526a105353ce8814185d5cd95960aa1b6044820152606401610753565b600b54600a546009546001600160a01b0392831692918216911685610d4a5760405162461bcd60e51b815260206004820152601c60248201527f414d4f3a20416d6f756e74206d75737420626520706f736974697665000000006044820152606401610753565b85836001600160a01b0316633fd594656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d87573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dab9190612ad6565b1015610df95760405162461bcd60e51b815260206004820152601460248201527f414d4f3a20496e73756666696369656e74204c500000000000000000000000006044820152606401610753565b6040516370a0823160e01b81523060048201525f906001600160a01b038316906370a0823190602401602060405180830381865afa158015610e3d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e619190612ad6565b6040516370a0823160e01b81523060048201529091505f906001600160a01b038516906370a0823190602401602060405180830381865afa158015610ea8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ecc9190612ad6565b6040517f857620e1000000000000000000000000000000000000000000000000000000008152600481018a905260248101899052604481018890529091506001600160a01b0386169063857620e1906064015f604051808303815f87803b158015610f35575f5ffd5b505af1158015610f47573d5f5f3e3d5ffd5b50506040516370a0823160e01b81523060048201525f92508491506001600160a01b038616906370a0823190602401602060405180830381865afa158015610f91573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fb59190612ad6565b610fbf9190612b4a565b6040516370a0823160e01b81523060048201529091505f9083906001600160a01b038816906370a0823190602401602060405180830381865afa158015611008573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061102c9190612ad6565b6110369190612b4a565b9050888210156110885760405162461bcd60e51b815260206004820152601a60248201527f414d4f3a20696e73756666696369656e742070656720636f696e0000000000006044820152606401610753565b878110156110d85760405162461bcd60e51b815260206004820152601d60248201527f414d4f3a20696e73756666696369656e7420737461626c6520636f696e0000006044820152606401610753565b604080518b8152602081018490529081018290527f0bb89aa54ed6940a7e7167bd262b2400d63945045ceff1a52a05f2601ed215f19060600160405180910390a15050426008555050505050505050565b611131612556565b6005546001146111835760405162461bcd60e51b815260206004820152601560248201527f414d4f3a20416c726561647920756e70617573656400000000000000000000006044820152606401610753565b5f60058190556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d169339190a1565b6111ba612556565b5f846001600160a01b03168484846040516111d6929190612b5d565b5f6040518083038185875af1925050503d805f8114611210576040519150601f19603f3d011682016040523d82523d5f602084013e611215565b606091505b50509050806112665760405162461bcd60e51b815260206004820152601360248201527f5265736375653a2043616c6c206661696c6564000000000000000000000000006044820152606401610753565b5050505050565b6002546001600160a01b031633148061128f57505f546001600160a01b031633145b6112ce5760405162461bcd60e51b815260206004820152601060248201526f20a6a79d102737ba1026b0b730b3b2b960811b6044820152606401610753565b6005541561130c5760405162461bcd60e51b815260206004820152600b60248201526a105353ce8814185d5cd95960aa1b6044820152606401610753565b6004546001600160a01b031661138a5760405162461bcd60e51b815260206004820152602160248201527f414d4f3a2050726f6669744d616e61676572206e6f7420636f6e66696775726560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610753565b600b54600480546040517fc00007b00000000000000000000000000000000000000000000000000000000081526001600160a01b03918216928101929092529091169063c00007b0906024015f604051808303815f87803b1580156113ed575f5ffd5b505af11580156113ff573d5f5f3e3d5ffd5b50506004546040516001600160a01b0390911681527fce2b7744cc7fd2d9d8dcf8b8018c06beb1a1501598271dbeb6fca792cbb641b69250602001905060405180910390a1565b61144e612556565b6114575f61269f565b565b60015433906001600160a01b031681146114915760405163118cdaa760e01b81526001600160a01b0382166004820152602401610753565b6106f38161269f565b6003546001600160a01b03163314806114bd57506002546001600160a01b031633145b806114d157505f546001600160a01b031633145b61151d5760405162461bcd60e51b815260206004820152601960248201527f414d4f3a204e6f74205365637572697479204d616e61676572000000000000006044820152606401610753565b6005541561156d5760405162461bcd60e51b815260206004820152601360248201527f414d4f3a20416c726561647920706175736564000000000000000000000000006044820152606401610753565b60016005556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e752905f90a1565b6002546001600160a01b03163314806115be57505f546001600160a01b031633145b6115fd5760405162461bcd60e51b815260206004820152601060248201526f20a6a79d102737ba1026b0b730b3b2b960811b6044820152606401610753565b600954600b546040516370a0823160e01b81526001600160a01b0391821660048201525f9291909116906370a0823190602401602060405180830381865afa15801561164b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061166f9190612ad6565b905080156116db57600b5460095460405163209b1d7d60e21b81526001600160a01b0391821660048201526024810184905291169063826c75f4906044015f604051808303815f87803b1580156116c4575f5ffd5b505af11580156116d6573d5f5f3e3d5ffd5b505050505b600a54600b546040516370a0823160e01b81526001600160a01b0391821660048201525f9291909116906370a0823190602401602060405180830381865afa158015611729573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061174d9190612ad6565b905080156117ba57600b54600a5460405163209b1d7d60e21b81526001600160a01b0391821660048201526024810184905291169063826c75f4906044015b5f604051808303815f87803b1580156117a3575f5ffd5b505af11580156117b5573d5f5f3e3d5ffd5b505050505b5050565b6117c6612556565b600c54600160a01b900460ff16156118205760405162461bcd60e51b815260206004820152601a60248201527f4164647265737320616c726561647920636f6e666967757265640000000000006044820152606401610753565b600c80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1790556001600160a01b0384161580159061186e57506001600160a01b03831615155b801561188257506001600160a01b03821615155b6118ce5760405162461bcd60e51b815260206004820152601160248201527f414d4f3a205a65726f20616464726573730000000000000000000000000000006044820152606401610753565b600980546001600160a01b039586166001600160a01b031991821617909155600a805494861694821694909417909355600b805492851692841692909217909155600c8054919093169116179055565b6002546001600160a01b031633148061194057505f546001600160a01b031633145b61197f5760405162461bcd60e51b815260206004820152601060248201526f20a6a79d102737ba1026b0b730b3b2b960811b6044820152606401610753565b60065460075461198f9190612b01565b4210156119de5760405162461bcd60e51b815260206004820152601660248201527f414d4f3a207377617020436f6f6c696e6720446f776e000000000000000000006044820152606401610753565b60055415611a1c5760405162461bcd60e51b815260206004820152600b60248201526a105353ce8814185d5cd95960aa1b6044820152606401610753565b600b54600a546009546001600160a01b0392831692918216911684611a835760405162461bcd60e51b815260206004820152601c60248201527f414d4f3a20416d6f756e74206d75737420626520706f736974697665000000006044820152606401610753565b5f611a8c612607565b90505f81611aba7f000000000000000000000000000000000000000000000000000000000000000089612b14565b611ac49190612b2b565b90507f0000000000000000000000000000000000000000000000000000000000000000600d5482611af59190612b14565b611aff9190612b2b565b861015611b4e5760405162461bcd60e51b815260206004820152601560248201527f414d4f3a20536c69707061676520746f6f206c6f7700000000000000000000006044820152606401610753565b6040516370a0823160e01b815230600482015287906001600160a01b038616906370a0823190602401602060405180830381865afa158015611b92573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bb69190612ad6565b1015611c045760405162461bcd60e51b815260206004820152601c60248201527f414d4f3a20496e73756666696369656e7420737461626c65436f696e000000006044820152606401610753565b50611c1b90506001600160a01b0383168487612582565b6040516370a0823160e01b81523060048201525f906001600160a01b038316906370a0823190602401602060405180830381865afa158015611c5f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c839190612ad6565b6040517fa8ee96b400000000000000000000000000000000000000000000000000000000815260048101889052602481018790529091506001600160a01b0385169063a8ee96b4906044015f604051808303815f87803b158015611ce5575f5ffd5b505af1158015611cf7573d5f5f3e3d5ffd5b50506040516370a0823160e01b81523060048201525f92508391506001600160a01b038516906370a0823190602401602060405180830381865afa158015611d41573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d659190612ad6565b611d6f9190612b4a565b905085811015611dc15760405162461bcd60e51b815260206004820152601a60248201527f414d4f3a20696e73756666696369656e742070656720636f696e0000000000006044820152606401610753565b60408051888152602081018390527f1c348547c777b956e0677845be31a612f29d699f91076d789842794f20becdb69101610bd0565b6002546001600160a01b0316331480611e1957505f546001600160a01b031633145b611e585760405162461bcd60e51b815260206004820152601060248201526f20a6a79d102737ba1026b0b730b3b2b960811b6044820152606401610753565b600654600854611e689190612b01565b421015611eb75760405162461bcd60e51b815260206004820152601b60248201527f414d4f3a206c697175696469747920436f6f6c696e6720446f776e00000000006044820152606401610753565b60055415611ef55760405162461bcd60e51b815260206004820152600b60248201526a105353ce8814185d5cd95960aa1b6044820152606401610753565b600b54600a546009546040516370a0823160e01b81523060048201526001600160a01b03938416939283169290911690869082906370a0823190602401602060405180830381865afa158015611f4d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f719190612ad6565b1015611fbf5760405162461bcd60e51b815260206004820152601460248201527f496e73756666696369656e7420706567436f696e0000000000000000000000006044820152606401610753565b6040516370a0823160e01b815230600482015285906001600160a01b038416906370a0823190602401602060405180830381865afa158015612003573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120279190612ad6565b10156120755760405162461bcd60e51b815260206004820152601760248201527f496e73756666696369656e7420737461626c65436f696e0000000000000000006044820152606401610753565b6120896001600160a01b0382168488612582565b61209d6001600160a01b0383168487612582565b5f836001600160a01b0316633fd594656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120da573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120fe9190612ad6565b6040517f422f10430000000000000000000000000000000000000000000000000000000081526004810189905260248101889052604481018790529091506001600160a01b0385169063422f1043906064015f604051808303815f87803b158015612167575f5ffd5b505af1158015612179573d5f5f3e3d5ffd5b505050505f81856001600160a01b0316633fd594656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121df9190612ad6565b6121e99190612b4a565b90508581101561223b5760405162461bcd60e51b815260206004820152601460248201527f414d4f3a20696e73756666696369656e74204c500000000000000000000000006044820152606401610753565b60408051898152602081018990529081018290527fd7f28048575eead8851d024ead087913957dfb4fd1a02b4d1573f5352a5a2be39060600160405180910390a1505042600855505050505050565b612292612556565b6001600160a01b038616158015906122b257506001600160a01b03851615155b80156122c657506001600160a01b03841615155b6123125760405162461bcd60e51b815260206004820152601160248201527f414d4f3a205a65726f20616464726573730000000000000000000000000000006044820152606401610753565b603c83116123625760405162461bcd60e51b815260206004820152601560248201527f414d4f3a20496e76616c696420636f6f6c646f776e00000000000000000000006044820152606401610753565b7f000000000000000000000000000000000000000000000000000000000000000082111580156123b257507f00000000000000000000000000000000000000000000000000000000000000008111155b6123fe5760405162461bcd60e51b815260206004820152601560248201527f414d4f3a20496e76616c696420736c69707061676500000000000000000000006044820152606401610753565b600280546001600160a01b03199081166001600160a01b039889161790915560038054821696881696909617909555600480549095169390951692909217909255600691909155600d55600e55565b612455612556565b600180546001600160a01b0383166001600160a01b031990911681179091556124855f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6124c5612556565b6001600160a01b03821661251d57600b546040517f0b07140e000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b0390911690630b07140e9060240161178c565b600b5460405163209b1d7d60e21b81526001600160a01b038481166004830152602482018490529091169063826c75f49060440161178c565b5f546001600160a01b031633146114575760405163118cdaa760e01b8152336004820152602401610753565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526126029084906126b8565b505050565b600c545f906001600160a01b03166126265750670de0b6b3a764000090565b600c5f9054906101000a90046001600160a01b03166001600160a01b03166398d5fdca6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612676573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061269a9190612ad6565b905090565b600180546001600160a01b03191690556106f381612732565b5f6126cc6001600160a01b03841683612781565b905080515f141580156126f05750808060200190518101906126ee9190612b6c565b155b15612602576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401610753565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b606061278e83835f612797565b90505b92915050565b6060814710156127d5576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610753565b5f5f856001600160a01b031684866040516127f09190612b8b565b5f6040518083038185875af1925050503d805f811461282a576040519150601f19603f3d011682016040523d82523d5f602084013e61282f565b606091505b509150915061283f86838361284b565b925050505b9392505050565b6060826128605761285b826128c0565b612844565b815115801561287757506001600160a01b0384163b155b156128b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610753565b5080612844565b8051156128d05780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b0381168114612918575f5ffd5b919050565b5f6020828403121561292d575f5ffd5b61278e82612902565b5f5f60408385031215612947575f5ffd5b50508035926020909101359150565b5f5f5f60608486031215612968575f5ffd5b505081359360208301359350604090920135919050565b5f5f5f5f60608587031215612992575f5ffd5b61299b85612902565b935060208501359250604085013567ffffffffffffffff8111156129bd575f5ffd5b8501601f810187136129cd575f5ffd5b803567ffffffffffffffff8111156129e3575f5ffd5b8760208284010111156129f4575f5ffd5b949793965060200194505050565b5f5f5f5f60808587031215612a15575f5ffd5b612a1e85612902565b9350612a2c60208601612902565b9250612a3a60408601612902565b9150612a4860608601612902565b905092959194509250565b5f5f5f5f5f5f60c08789031215612a68575f5ffd5b612a7187612902565b9550612a7f60208801612902565b9450612a8d60408801612902565b959894975094956060810135955060808101359460a0909101359350915050565b5f5f60408385031215612abf575f5ffd5b612ac883612902565b946020939093013593505050565b5f60208284031215612ae6575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561279157612791612aed565b808202811582820484141761279157612791612aed565b5f82612b4557634e487b7160e01b5f52601260045260245ffd5b500490565b8181038181111561279157612791612aed565b818382375f9101908152919050565b5f60208284031215612b7c575f5ffd5b81518015158114612844575f5ffd5b5f82515f5b81811015612baa5760208186018101518583015201612b90565b505f92019182525091905056fea2646970667358221220442b663d0e4a96fd32fac194bf80a6342e3b9040bd8e0f24e4b16c2cbfeb0c1764736f6c634300081b0033
Deployed Bytecode
0x6080604052600436106101de575f3560e01c806388de8bd8116100fd578063ced1fac411610092578063e30c397811610062578063e30c397814610517578063f2fde38b14610534578063f80c2b8814610553578063fda58fb214610568575f5ffd5b8063ced1fac41461049b578063d22736a7146104ba578063de675a6d146104d9578063de7f9602146104f8575f5ffd5b8063ac866f62116100cd578063ac866f621461040b578063ae96b27d1461042a578063c2ee3a0814610449578063c7e5a39e1461047c575f5ffd5b806388de8bd8146103a75780638d8f2adb146103bc5780638da5cb5b146103d0578063992642e5146103ec575f5ffd5b80635c975abb1161017357806379ba50971161014357806379ba50971461034b5780637dc0d1d01461035f5780638401232e1461037e5780638456cb5914610393575f5ffd5b80635c975abb146102ef5780635fa6c0b91461030457806370bb45b314610323578063715018a614610337575f5ffd5b806331d9ce8b116101ae57806331d9ce8b146102885780633f4ba83a146102a7578063481c6a75146102bb5780634d056f6d146102da575f5ffd5b806303eadcfc146101e9578063050e46151461022557806312f6e13914610246578063176646fa14610269575f5ffd5b366101e557005b5f5ffd5b3480156101f4575f5ffd5b50600b54610208906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610230575f5ffd5b5061024461023f36600461291d565b610587565b005b348015610251575f5ffd5b5061025b600e5481565b60405190815260200161021c565b348015610274575f5ffd5b50610244610283366004612936565b6106f6565b348015610293575f5ffd5b506102446102a2366004612956565b610be5565b3480156102b2575f5ffd5b50610244611129565b3480156102c6575f5ffd5b50600254610208906001600160a01b031681565b3480156102e5575f5ffd5b5061025b60065481565b3480156102fa575f5ffd5b5061025b60055481565b34801561030f575f5ffd5b5061024461031e36600461297f565b6111b2565b34801561032e575f5ffd5b5061024461126d565b348015610342575f5ffd5b50610244611446565b348015610356575f5ffd5b50610244611459565b34801561036a575f5ffd5b50600c54610208906001600160a01b031681565b348015610389575f5ffd5b5061025b600d5481565b34801561039e575f5ffd5b5061024461149a565b3480156103b2575f5ffd5b5061025b60085481565b3480156103c7575f5ffd5b5061024461159c565b3480156103db575f5ffd5b505f546001600160a01b0316610208565b3480156103f7575f5ffd5b50600a54610208906001600160a01b031681565b348015610416575f5ffd5b50610244610425366004612a02565b6117be565b348015610435575f5ffd5b50610244610444366004612936565b61191e565b348015610454575f5ffd5b5061025b7f0000000000000000000000000000000000000000000000000de0b6b3a764000081565b348015610487575f5ffd5b50610244610496366004612956565b611df7565b3480156104a6575f5ffd5b506102446104b5366004612a53565b61228a565b3480156104c5575f5ffd5b50600454610208906001600160a01b031681565b3480156104e4575f5ffd5b50600354610208906001600160a01b031681565b348015610503575f5ffd5b50600954610208906001600160a01b031681565b348015610522575f5ffd5b506001546001600160a01b0316610208565b34801561053f575f5ffd5b5061024461054e36600461291d565b61244d565b34801561055e575f5ffd5b5061025b60075481565b348015610573575f5ffd5b50610244610582366004612aae565b6124bd565b61058f612556565b6001600160a01b0381166105fa575f546001600160a01b03166001600160a01b0316476040515f6040518083038185875af1925050503d805f81146105ef576040519150601f19603f3d011682016040523d82523d5f602084013e6105f4565b606091505b50505050565b6040516370a0823160e01b81523060048201525f906001600160a01b038316906370a0823190602401602060405180830381865afa15801561063e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106629190612ad6565b11156106f3576106f361067c5f546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa1580156106be573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e29190612ad6565b6001600160a01b0384169190612582565b50565b6002546001600160a01b031633148061071857505f546001600160a01b031633145b61075c5760405162461bcd60e51b815260206004820152601060248201526f20a6a79d102737ba1026b0b730b3b2b960811b60448201526064015b60405180910390fd5b60065460075461076c9190612b01565b4210156107bb5760405162461bcd60e51b815260206004820152601660248201527f414d4f3a207377617020436f6f6c696e6720446f776e000000000000000000006044820152606401610753565b600554156107f95760405162461bcd60e51b815260206004820152600b60248201526a105353ce8814185d5cd95960aa1b6044820152606401610753565b600b54600a546009546001600160a01b03928316929182169116846108605760405162461bcd60e51b815260206004820152601c60248201527f414d4f3a20416d6f756e74206d75737420626520706f736974697665000000006044820152606401610753565b5f610869612607565b90505f7f0000000000000000000000000000000000000000000000000de0b6b3a76400006108978389612b14565b6108a19190612b2b565b90507f0000000000000000000000000000000000000000000000000de0b6b3a7640000600e54826108d29190612b14565b6108dc9190612b2b565b86101561092b5760405162461bcd60e51b815260206004820152601560248201527f414d4f3a20536c69707061676520746f6f206c6f7700000000000000000000006044820152606401610753565b6040516370a0823160e01b815230600482015287906001600160a01b038516906370a0823190602401602060405180830381865afa15801561096f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109939190612ad6565b10156109e15760405162461bcd60e51b815260206004820152601960248201527f414d4f3a20496e73756666696369656e7420706567436f696e000000000000006044820152606401610753565b506109f890506001600160a01b0382168487612582565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa158015610a3c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a609190612ad6565b6040517f327da61700000000000000000000000000000000000000000000000000000000815260048101889052602481018790529091506001600160a01b0385169063327da617906044015f604051808303815f87803b158015610ac2575f5ffd5b505af1158015610ad4573d5f5f3e3d5ffd5b50506040516370a0823160e01b81523060048201525f92508391506001600160a01b038616906370a0823190602401602060405180830381865afa158015610b1e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b429190612ad6565b610b4c9190612b4a565b905085811015610b9e5760405162461bcd60e51b815260206004820152601d60248201527f414d4f3a20696e73756666696369656e7420737461626c6520636f696e0000006044820152606401610753565b60408051888152602081018390527fad0db358dc624ee62c6e3d81b2c8ddf81acefba48291d6334a3431d90606738091015b60405180910390a15050426007555050505050565b6002546001600160a01b0316331480610c0757505f546001600160a01b031633145b610c465760405162461bcd60e51b815260206004820152601060248201526f20a6a79d102737ba1026b0b730b3b2b960811b6044820152606401610753565b600654600854610c569190612b01565b421015610ca55760405162461bcd60e51b815260206004820152601b60248201527f414d4f3a206c697175696469747920436f6f6c696e6720446f776e00000000006044820152606401610753565b60055415610ce35760405162461bcd60e51b815260206004820152600b60248201526a105353ce8814185d5cd95960aa1b6044820152606401610753565b600b54600a546009546001600160a01b0392831692918216911685610d4a5760405162461bcd60e51b815260206004820152601c60248201527f414d4f3a20416d6f756e74206d75737420626520706f736974697665000000006044820152606401610753565b85836001600160a01b0316633fd594656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d87573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dab9190612ad6565b1015610df95760405162461bcd60e51b815260206004820152601460248201527f414d4f3a20496e73756666696369656e74204c500000000000000000000000006044820152606401610753565b6040516370a0823160e01b81523060048201525f906001600160a01b038316906370a0823190602401602060405180830381865afa158015610e3d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e619190612ad6565b6040516370a0823160e01b81523060048201529091505f906001600160a01b038516906370a0823190602401602060405180830381865afa158015610ea8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ecc9190612ad6565b6040517f857620e1000000000000000000000000000000000000000000000000000000008152600481018a905260248101899052604481018890529091506001600160a01b0386169063857620e1906064015f604051808303815f87803b158015610f35575f5ffd5b505af1158015610f47573d5f5f3e3d5ffd5b50506040516370a0823160e01b81523060048201525f92508491506001600160a01b038616906370a0823190602401602060405180830381865afa158015610f91573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fb59190612ad6565b610fbf9190612b4a565b6040516370a0823160e01b81523060048201529091505f9083906001600160a01b038816906370a0823190602401602060405180830381865afa158015611008573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061102c9190612ad6565b6110369190612b4a565b9050888210156110885760405162461bcd60e51b815260206004820152601a60248201527f414d4f3a20696e73756666696369656e742070656720636f696e0000000000006044820152606401610753565b878110156110d85760405162461bcd60e51b815260206004820152601d60248201527f414d4f3a20696e73756666696369656e7420737461626c6520636f696e0000006044820152606401610753565b604080518b8152602081018490529081018290527f0bb89aa54ed6940a7e7167bd262b2400d63945045ceff1a52a05f2601ed215f19060600160405180910390a15050426008555050505050505050565b611131612556565b6005546001146111835760405162461bcd60e51b815260206004820152601560248201527f414d4f3a20416c726561647920756e70617573656400000000000000000000006044820152606401610753565b5f60058190556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d169339190a1565b6111ba612556565b5f846001600160a01b03168484846040516111d6929190612b5d565b5f6040518083038185875af1925050503d805f8114611210576040519150601f19603f3d011682016040523d82523d5f602084013e611215565b606091505b50509050806112665760405162461bcd60e51b815260206004820152601360248201527f5265736375653a2043616c6c206661696c6564000000000000000000000000006044820152606401610753565b5050505050565b6002546001600160a01b031633148061128f57505f546001600160a01b031633145b6112ce5760405162461bcd60e51b815260206004820152601060248201526f20a6a79d102737ba1026b0b730b3b2b960811b6044820152606401610753565b6005541561130c5760405162461bcd60e51b815260206004820152600b60248201526a105353ce8814185d5cd95960aa1b6044820152606401610753565b6004546001600160a01b031661138a5760405162461bcd60e51b815260206004820152602160248201527f414d4f3a2050726f6669744d616e61676572206e6f7420636f6e66696775726560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610753565b600b54600480546040517fc00007b00000000000000000000000000000000000000000000000000000000081526001600160a01b03918216928101929092529091169063c00007b0906024015f604051808303815f87803b1580156113ed575f5ffd5b505af11580156113ff573d5f5f3e3d5ffd5b50506004546040516001600160a01b0390911681527fce2b7744cc7fd2d9d8dcf8b8018c06beb1a1501598271dbeb6fca792cbb641b69250602001905060405180910390a1565b61144e612556565b6114575f61269f565b565b60015433906001600160a01b031681146114915760405163118cdaa760e01b81526001600160a01b0382166004820152602401610753565b6106f38161269f565b6003546001600160a01b03163314806114bd57506002546001600160a01b031633145b806114d157505f546001600160a01b031633145b61151d5760405162461bcd60e51b815260206004820152601960248201527f414d4f3a204e6f74205365637572697479204d616e61676572000000000000006044820152606401610753565b6005541561156d5760405162461bcd60e51b815260206004820152601360248201527f414d4f3a20416c726561647920706175736564000000000000000000000000006044820152606401610753565b60016005556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e752905f90a1565b6002546001600160a01b03163314806115be57505f546001600160a01b031633145b6115fd5760405162461bcd60e51b815260206004820152601060248201526f20a6a79d102737ba1026b0b730b3b2b960811b6044820152606401610753565b600954600b546040516370a0823160e01b81526001600160a01b0391821660048201525f9291909116906370a0823190602401602060405180830381865afa15801561164b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061166f9190612ad6565b905080156116db57600b5460095460405163209b1d7d60e21b81526001600160a01b0391821660048201526024810184905291169063826c75f4906044015f604051808303815f87803b1580156116c4575f5ffd5b505af11580156116d6573d5f5f3e3d5ffd5b505050505b600a54600b546040516370a0823160e01b81526001600160a01b0391821660048201525f9291909116906370a0823190602401602060405180830381865afa158015611729573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061174d9190612ad6565b905080156117ba57600b54600a5460405163209b1d7d60e21b81526001600160a01b0391821660048201526024810184905291169063826c75f4906044015b5f604051808303815f87803b1580156117a3575f5ffd5b505af11580156117b5573d5f5f3e3d5ffd5b505050505b5050565b6117c6612556565b600c54600160a01b900460ff16156118205760405162461bcd60e51b815260206004820152601a60248201527f4164647265737320616c726561647920636f6e666967757265640000000000006044820152606401610753565b600c80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1790556001600160a01b0384161580159061186e57506001600160a01b03831615155b801561188257506001600160a01b03821615155b6118ce5760405162461bcd60e51b815260206004820152601160248201527f414d4f3a205a65726f20616464726573730000000000000000000000000000006044820152606401610753565b600980546001600160a01b039586166001600160a01b031991821617909155600a805494861694821694909417909355600b805492851692841692909217909155600c8054919093169116179055565b6002546001600160a01b031633148061194057505f546001600160a01b031633145b61197f5760405162461bcd60e51b815260206004820152601060248201526f20a6a79d102737ba1026b0b730b3b2b960811b6044820152606401610753565b60065460075461198f9190612b01565b4210156119de5760405162461bcd60e51b815260206004820152601660248201527f414d4f3a207377617020436f6f6c696e6720446f776e000000000000000000006044820152606401610753565b60055415611a1c5760405162461bcd60e51b815260206004820152600b60248201526a105353ce8814185d5cd95960aa1b6044820152606401610753565b600b54600a546009546001600160a01b0392831692918216911684611a835760405162461bcd60e51b815260206004820152601c60248201527f414d4f3a20416d6f756e74206d75737420626520706f736974697665000000006044820152606401610753565b5f611a8c612607565b90505f81611aba7f0000000000000000000000000000000000000000000000000de0b6b3a764000089612b14565b611ac49190612b2b565b90507f0000000000000000000000000000000000000000000000000de0b6b3a7640000600d5482611af59190612b14565b611aff9190612b2b565b861015611b4e5760405162461bcd60e51b815260206004820152601560248201527f414d4f3a20536c69707061676520746f6f206c6f7700000000000000000000006044820152606401610753565b6040516370a0823160e01b815230600482015287906001600160a01b038616906370a0823190602401602060405180830381865afa158015611b92573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bb69190612ad6565b1015611c045760405162461bcd60e51b815260206004820152601c60248201527f414d4f3a20496e73756666696369656e7420737461626c65436f696e000000006044820152606401610753565b50611c1b90506001600160a01b0383168487612582565b6040516370a0823160e01b81523060048201525f906001600160a01b038316906370a0823190602401602060405180830381865afa158015611c5f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c839190612ad6565b6040517fa8ee96b400000000000000000000000000000000000000000000000000000000815260048101889052602481018790529091506001600160a01b0385169063a8ee96b4906044015f604051808303815f87803b158015611ce5575f5ffd5b505af1158015611cf7573d5f5f3e3d5ffd5b50506040516370a0823160e01b81523060048201525f92508391506001600160a01b038516906370a0823190602401602060405180830381865afa158015611d41573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d659190612ad6565b611d6f9190612b4a565b905085811015611dc15760405162461bcd60e51b815260206004820152601a60248201527f414d4f3a20696e73756666696369656e742070656720636f696e0000000000006044820152606401610753565b60408051888152602081018390527f1c348547c777b956e0677845be31a612f29d699f91076d789842794f20becdb69101610bd0565b6002546001600160a01b0316331480611e1957505f546001600160a01b031633145b611e585760405162461bcd60e51b815260206004820152601060248201526f20a6a79d102737ba1026b0b730b3b2b960811b6044820152606401610753565b600654600854611e689190612b01565b421015611eb75760405162461bcd60e51b815260206004820152601b60248201527f414d4f3a206c697175696469747920436f6f6c696e6720446f776e00000000006044820152606401610753565b60055415611ef55760405162461bcd60e51b815260206004820152600b60248201526a105353ce8814185d5cd95960aa1b6044820152606401610753565b600b54600a546009546040516370a0823160e01b81523060048201526001600160a01b03938416939283169290911690869082906370a0823190602401602060405180830381865afa158015611f4d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f719190612ad6565b1015611fbf5760405162461bcd60e51b815260206004820152601460248201527f496e73756666696369656e7420706567436f696e0000000000000000000000006044820152606401610753565b6040516370a0823160e01b815230600482015285906001600160a01b038416906370a0823190602401602060405180830381865afa158015612003573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120279190612ad6565b10156120755760405162461bcd60e51b815260206004820152601760248201527f496e73756666696369656e7420737461626c65436f696e0000000000000000006044820152606401610753565b6120896001600160a01b0382168488612582565b61209d6001600160a01b0383168487612582565b5f836001600160a01b0316633fd594656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120da573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120fe9190612ad6565b6040517f422f10430000000000000000000000000000000000000000000000000000000081526004810189905260248101889052604481018790529091506001600160a01b0385169063422f1043906064015f604051808303815f87803b158015612167575f5ffd5b505af1158015612179573d5f5f3e3d5ffd5b505050505f81856001600160a01b0316633fd594656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121df9190612ad6565b6121e99190612b4a565b90508581101561223b5760405162461bcd60e51b815260206004820152601460248201527f414d4f3a20696e73756666696369656e74204c500000000000000000000000006044820152606401610753565b60408051898152602081018990529081018290527fd7f28048575eead8851d024ead087913957dfb4fd1a02b4d1573f5352a5a2be39060600160405180910390a1505042600855505050505050565b612292612556565b6001600160a01b038616158015906122b257506001600160a01b03851615155b80156122c657506001600160a01b03841615155b6123125760405162461bcd60e51b815260206004820152601160248201527f414d4f3a205a65726f20616464726573730000000000000000000000000000006044820152606401610753565b603c83116123625760405162461bcd60e51b815260206004820152601560248201527f414d4f3a20496e76616c696420636f6f6c646f776e00000000000000000000006044820152606401610753565b7f0000000000000000000000000000000000000000000000000de0b6b3a764000082111580156123b257507f0000000000000000000000000000000000000000000000000de0b6b3a76400008111155b6123fe5760405162461bcd60e51b815260206004820152601560248201527f414d4f3a20496e76616c696420736c69707061676500000000000000000000006044820152606401610753565b600280546001600160a01b03199081166001600160a01b039889161790915560038054821696881696909617909555600480549095169390951692909217909255600691909155600d55600e55565b612455612556565b600180546001600160a01b0383166001600160a01b031990911681179091556124855f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6124c5612556565b6001600160a01b03821661251d57600b546040517f0b07140e000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b0390911690630b07140e9060240161178c565b600b5460405163209b1d7d60e21b81526001600160a01b038481166004830152602482018490529091169063826c75f49060440161178c565b5f546001600160a01b031633146114575760405163118cdaa760e01b8152336004820152602401610753565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526126029084906126b8565b505050565b600c545f906001600160a01b03166126265750670de0b6b3a764000090565b600c5f9054906101000a90046001600160a01b03166001600160a01b03166398d5fdca6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612676573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061269a9190612ad6565b905090565b600180546001600160a01b03191690556106f381612732565b5f6126cc6001600160a01b03841683612781565b905080515f141580156126f05750808060200190518101906126ee9190612b6c565b155b15612602576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401610753565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b606061278e83835f612797565b90505b92915050565b6060814710156127d5576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610753565b5f5f856001600160a01b031684866040516127f09190612b8b565b5f6040518083038185875af1925050503d805f811461282a576040519150601f19603f3d011682016040523d82523d5f602084013e61282f565b606091505b509150915061283f86838361284b565b925050505b9392505050565b6060826128605761285b826128c0565b612844565b815115801561287757506001600160a01b0384163b155b156128b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610753565b5080612844565b8051156128d05780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b0381168114612918575f5ffd5b919050565b5f6020828403121561292d575f5ffd5b61278e82612902565b5f5f60408385031215612947575f5ffd5b50508035926020909101359150565b5f5f5f60608486031215612968575f5ffd5b505081359360208301359350604090920135919050565b5f5f5f5f60608587031215612992575f5ffd5b61299b85612902565b935060208501359250604085013567ffffffffffffffff8111156129bd575f5ffd5b8501601f810187136129cd575f5ffd5b803567ffffffffffffffff8111156129e3575f5ffd5b8760208284010111156129f4575f5ffd5b949793965060200194505050565b5f5f5f5f60808587031215612a15575f5ffd5b612a1e85612902565b9350612a2c60208601612902565b9250612a3a60408601612902565b9150612a4860608601612902565b905092959194509250565b5f5f5f5f5f5f60c08789031215612a68575f5ffd5b612a7187612902565b9550612a7f60208801612902565b9450612a8d60408801612902565b959894975094956060810135955060808101359460a0909101359350915050565b5f5f60408385031215612abf575f5ffd5b612ac883612902565b946020939093013593505050565b5f60208284031215612ae6575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561279157612791612aed565b808202811582820484141761279157612791612aed565b5f82612b4557634e487b7160e01b5f52601260045260245ffd5b500490565b8181038181111561279157612791612aed565b818382375f9101908152919050565b5f60208284031215612b7c575f5ffd5b81518015158114612844575f5ffd5b5f82515f5b81811015612baa5760208186018101518583015201612b90565b505f92019182525091905056fea2646970667358221220442b663d0e4a96fd32fac194bf80a6342e3b9040bd8e0f24e4b16c2cbfeb0c1764736f6c634300081b0033
Deployed Bytecode Sourcemap
44704:12279:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47267:22;;;;;;;;;;-1:-1:-1;47267:22:0;;;;-1:-1:-1;;;;;47267:22:0;;;;;;-1:-1:-1;;;;;178:55:1;;;160:74;;148:2;133:18;47267:22:0;;;;;;;;56147:410;;;;;;;;;;-1:-1:-1;56147:410:0;;;;;:::i;:::-;;:::i;:::-;;48228:47;;;;;;;;;;;;;;;;;;;783:25:1;;;771:2;756:18;48228:47:0;637:177:1;50718:1461:0;;;;;;;;;;-1:-1:-1;50718:1461:0;;;;;:::i;:::-;;:::i;53475:1415::-;;;;;;;;;;-1:-1:-1;53475:1415:0;;;;;:::i;:::-;;:::i;46194:149::-;;;;;;;;;;;;;:::i;44809:22::-;;;;;;;;;;-1:-1:-1;44809:22:0;;;;-1:-1:-1;;;;;44809:22:0;;;44972:29;;;;;;;;;;;;;;;;44910:21;;;;;;;;;;;;;;;;56737:206;;;;;;;;;;-1:-1:-1;56737:206:0;;;;;:::i;:::-;;:::i;54967:253::-;;;;;;;;;;;;;:::i;24138:103::-;;;;;;;;;;;;;:::i;27444:235::-;;;;;;;;;;;;;:::i;47342:21::-;;;;;;;;;;-1:-1:-1;47342:21:0;;;;-1:-1:-1;;;;;47342:21:0;;;48167:46;;;;;;;;;;;;;;;;46033:153;;;;;;;;;;;;;:::i;45099:36::-;;;;;;;;;;;;;;;;55362:402;;;;;;;;;;;;;:::i;23463:87::-;;;;;;;;;;-1:-1:-1;23509:7:0;23536:6;-1:-1:-1;;;;;23536:6:0;23463:87;;47181:25;;;;;;;;;;-1:-1:-1;47181:25:0;;;;-1:-1:-1;;;;;47181:25:0;;;47510:573;;;;;;;;;;-1:-1:-1;47510:573:0;;;;;:::i;:::-;;:::i;48739:1766::-;;;;;;;;;;-1:-1:-1;48739:1766:0;;;;;:::i;:::-;;:::i;48125:35::-;;;;;;;;;;;;;;;52187:1280;;;;;;;;;;-1:-1:-1;52187:1280:0;;;;;:::i;:::-;;:::i;46351:759::-;;;;;;;;;;-1:-1:-1;46351:759:0;;;;;:::i;:::-;;:::i;44875:28::-;;;;;;;;;;-1:-1:-1;44875:28:0;;;;-1:-1:-1;;;;;44875:28:0;;;44838:30;;;;;;;;;;-1:-1:-1;44838:30:0;;;;-1:-1:-1;;;;;44838:30:0;;;47141:22;;;;;;;;;;-1:-1:-1;47141:22:0;;;;-1:-1:-1;;;;;47141:22:0;;;26532:101;;;;;;;;;;-1:-1:-1;26612:13:0;;-1:-1:-1;;;;;26612:13:0;26532:101;;26832:181;;;;;;;;;;-1:-1:-1;26832:181:0;;;;;:::i;:::-;;:::i;45061:31::-;;;;;;;;;;;;;;;;55831:308;;;;;;;;;;-1:-1:-1;55831:308:0;;;;;:::i;:::-;;:::i;56147:410::-;23349:13;:11;:13::i;:::-;-1:-1:-1;;;;;56230:26:0;::::1;56227:323;;23509:7:::0;23536:6;-1:-1:-1;;;;;23536:6:0;-1:-1:-1;;;;;56272:21:0::1;56301;56272:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56147:410:::0;:::o;56227:323::-:1;56364:45;::::0;-1:-1:-1;;;56364:45:0;;56403:4:::1;56364:45;::::0;::::1;160:74:1::0;56412:1:0::1;::::0;-1:-1:-1;;;;;56364:30:0;::::1;::::0;::::1;::::0;133:18:1;;56364:45:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:49;56360:179;;;56434:89;56468:7;23509::::0;23536:6;-1:-1:-1;;;;;23536:6:0;;23463:87;56468:7:::1;56477:45;::::0;-1:-1:-1;;;56477:45:0;;56516:4:::1;56477:45;::::0;::::1;160:74:1::0;-1:-1:-1;;;;;56477:30:0;::::1;::::0;::::1;::::0;133:18:1;;56477:45:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;56434:33:0;::::1;::::0;:89;:33:::1;:89::i;:::-;56147:410:::0;:::o;50718:1461::-;45246:7;;-1:-1:-1;;;;;45246:7:0;45232:10;:21;;:46;;-1:-1:-1;23509:7:0;23536:6;-1:-1:-1;;;;;23536:6:0;45257:10;:21;45232:46;45224:75;;;;-1:-1:-1;;;45224:75:0;;4436:2:1;45224:75:0;;;4418:21:1;4475:2;4455:18;;;4448:30;-1:-1:-1;;;4494:18:1;;;4487:46;4550:18;;45224:75:0;;;;;;;;;45629:8:::1;;45614:12;;:23;;;;:::i;:::-;45595:15;:42;;45587:77;;;::::0;-1:-1:-1;;;45587:77:0;;5100:2:1;45587:77:0::1;::::0;::::1;5082:21:1::0;5139:2;5119:18;;;5112:30;5178:24;5158:18;;;5151:52;5220:18;;45587:77:0::1;4898:346:1::0;45587:77:0::1;45978:6:::2;::::0;:11;45970:35:::2;;;::::0;-1:-1:-1;;;45970:35:0;;5451:2:1;45970:35:0::2;::::0;::::2;5433:21:1::0;5490:2;5470:18;;;5463:30;-1:-1:-1;;;5509:18:1;;;5502:41;5560:18;;45970:35:0::2;5249:335:1::0;45970:35:0::2;50973:7:::3;::::0;51004:10:::3;::::0;51035:7:::3;::::0;-1:-1:-1;;;;;50973:7:0;;::::3;::::0;51004:10;;::::3;::::0;51035:7:::3;51189:18:::0;51181:59:::3;;;::::0;-1:-1:-1;;;51181:59:0;;5791:2:1;51181:59:0::3;::::0;::::3;5773:21:1::0;5830:2;5810:18;;;5803:30;5869;5849:18;;;5842:58;5917:18;;51181:59:0::3;5589:352:1::0;51181:59:0::3;51251:10;51264;:8;:10::i;:::-;51251:23:::0;-1:-1:-1;51285:32:0::3;51345:3;51320:22;51251:23:::0;51320:14;:22:::3;:::i;:::-;:28;;;;:::i;:::-;51285:63;;51426:3;51411:12;;51381:27;:42;;;;:::i;:::-;:48;;;;:::i;:::-;51367:10;:62;;51359:96;;;::::0;-1:-1:-1;;;51359:96:0;;6600:2:1;51359:96:0::3;::::0;::::3;6582:21:1::0;6639:2;6619:18;;;6612:30;6678:23;6658:18;;;6651:51;6719:18;;51359:96:0::3;6398:345:1::0;51359:96:0::3;51474:41;::::0;-1:-1:-1;;;51474:41:0;;51509:4:::3;51474:41;::::0;::::3;160:74:1::0;51519:14:0;;-1:-1:-1;;;;;51474:26:0;::::3;::::0;::::3;::::0;133:18:1;;51474:41:0::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;51466:97;;;::::0;-1:-1:-1;;;51466:97:0;;6950:2:1;51466:97:0::3;::::0;::::3;6932:21:1::0;6989:2;6969:18;;;6962:30;7028:27;7008:18;;;7001:55;7073:18;;51466:97:0::3;6748:349:1::0;51466:97:0::3;-1:-1:-1::0;51625:55:0::3;::::0;-1:-1:-1;;;;;;51625:29:0;::::3;51655:8:::0;51665:14;51625:29:::3;:55::i;:::-;51712:44;::::0;-1:-1:-1;;;51712:44:0;;51750:4:::3;51712:44;::::0;::::3;160:74:1::0;51691:18:0::3;::::0;-1:-1:-1;;;;;51712:29:0;::::3;::::0;::::3;::::0;133:18:1;;51712:44:0::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51860:58;::::0;;;;::::3;::::0;::::3;7276:25:1::0;;;7317:18;;;7310:34;;;51691:65:0;;-1:-1:-1;;;;;;51860:30:0;::::3;::::0;::::3;::::0;7249:18:1;;51860:58:0::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;51950:44:0::3;::::0;-1:-1:-1;;;51950:44:0;;51988:4:::3;51950:44;::::0;::::3;160:74:1::0;51929:18:0::3;::::0;-1:-1:-1;51997:10:0;;-1:-1:-1;;;;;;51950:29:0;::::3;::::0;::::3;::::0;133:18:1;;51950:44:0::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;;;;:::i;:::-;51929:78;;52072:10;52058;:24;;52050:66;;;::::0;-1:-1:-1;;;52050:66:0;;7690:2:1;52050:66:0::3;::::0;::::3;7672:21:1::0;7729:2;7709:18;;;7702:30;7768:31;7748:18;;;7741:59;7817:18;;52050:66:0::3;7488:353:1::0;52050:66:0::3;52132:39;::::0;;7276:25:1;;;7332:2;7317:18;;7310:34;;;52132:39:0::3;::::0;7249:18:1;52132:39:0::3;;;;;;;;-1:-1:-1::0;;45702:15:0::1;45687:12;:30:::0;-1:-1:-1;;;;;50718:1461:0:o;53475:1415::-;45246:7;;-1:-1:-1;;;;;45246:7:0;45232:10;:21;;:46;;-1:-1:-1;23509:7:0;23536:6;-1:-1:-1;;;;;23536:6:0;45257:10;:21;45232:46;45224:75;;;;-1:-1:-1;;;45224:75:0;;4436:2:1;45224:75:0;;;4418:21:1;4475:2;4455:18;;;4448:30;-1:-1:-1;;;4494:18:1;;;4487:46;4550:18;;45224:75:0;4234:340:1;45224:75:0;45822:8:::1;;45802:17;;:28;;;;:::i;:::-;45783:15;:47;;45775:87;;;::::0;-1:-1:-1;;;45775:87:0;;8048:2:1;45775:87:0::1;::::0;::::1;8030:21:1::0;8087:2;8067:18;;;8060:30;8126:29;8106:18;;;8099:57;8173:18;;45775:87:0::1;7846:351:1::0;45775:87:0::1;45978:6:::2;::::0;:11;45970:35:::2;;;::::0;-1:-1:-1;;;45970:35:0;;5451:2:1;45970:35:0::2;::::0;::::2;5433:21:1::0;5490:2;5470:18;;;5463:30;-1:-1:-1;;;5509:18:1;;;5502:41;5560:18;;45970:35:0::2;5249:335:1::0;45970:35:0::2;53813:7:::3;::::0;53844:10:::3;::::0;53875:7:::3;::::0;-1:-1:-1;;;;;53813:7:0;;::::3;::::0;53844:10;;::::3;::::0;53875:7:::3;53942:13:::0;53934:54:::3;;;::::0;-1:-1:-1;;;53934:54:0;;5791:2:1;53934:54:0::3;::::0;::::3;5773:21:1::0;5830:2;5810:18;;;5803:30;5869;5849:18;;;5842:58;5917:18;;53934:54:0::3;5589:352:1::0;53934:54:0::3;54041:9;54016:8;-1:-1:-1::0;;;;;54007:28:0::3;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;;53999:76;;;::::0;-1:-1:-1;;;53999:76:0;;8404:2:1;53999:76:0::3;::::0;::::3;8386:21:1::0;8443:2;8423:18;;;8416:30;8482:22;8462:18;;;8455:50;8522:18;;53999:76:0::3;8202:344:1::0;53999:76:0::3;54112:41;::::0;-1:-1:-1;;;54112:41:0;;54147:4:::3;54112:41;::::0;::::3;160:74:1::0;54088:21:0::3;::::0;-1:-1:-1;;;;;54112:26:0;::::3;::::0;::::3;::::0;133:18:1;;54112:41:0::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54191:44;::::0;-1:-1:-1;;;54191:44:0;;54229:4:::3;54191:44;::::0;::::3;160:74:1::0;54088:65:0;;-1:-1:-1;54164:24:0::3;::::0;-1:-1:-1;;;;;54191:29:0;::::3;::::0;::::3;::::0;133:18:1;;54191:44:0::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54350:70;::::0;;;;::::3;::::0;::::3;8753:25:1::0;;;8794:18;;;8787:34;;;8837:18;;;8830:34;;;54164:71:0;;-1:-1:-1;;;;;;54350:34:0;::::3;::::0;::::3;::::0;8726:18:1;;54350:70:0::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;54455:41:0::3;::::0;-1:-1:-1;;;54455:41:0;;54490:4:::3;54455:41;::::0;::::3;160:74:1::0;54431:21:0::3;::::0;-1:-1:-1;54499:13:0;;-1:-1:-1;;;;;;54455:26:0;::::3;::::0;::::3;::::0;133:18:1;;54455:41:0::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;;;;:::i;:::-;54550:44;::::0;-1:-1:-1;;;54550:44:0;;54588:4:::3;54550:44;::::0;::::3;160:74:1::0;54431:81:0;;-1:-1:-1;54523:24:0::3;::::0;54597:16;;-1:-1:-1;;;;;54550:29:0;::::3;::::0;::::3;::::0;133:18:1;;54550:44:0::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:63;;;;:::i;:::-;54523:90;;54681:11;54664:13;:28;;54656:67;;;::::0;-1:-1:-1;;;54656:67:0;;9077:2:1;54656:67:0::3;::::0;::::3;9059:21:1::0;9116:2;9096:18;;;9089:30;9155:28;9135:18;;;9128:56;9201:18;;54656:67:0::3;8875:350:1::0;54656:67:0::3;54762:10;54742:16;:30;;54734:72;;;::::0;-1:-1:-1;;;54734:72:0;;7690:2:1;54734:72:0::3;::::0;::::3;7672:21:1::0;7729:2;7709:18;;;7702:30;7768:31;7748:18;;;7741:59;7817:18;;54734:72:0::3;7488:353:1::0;54734:72:0::3;54822:60;::::0;;8753:25:1;;;8809:2;8794:18;;8787:34;;;8837:18;;;8830:34;;;54822:60:0::3;::::0;8741:2:1;8726:18;54822:60:0::3;;;;;;;-1:-1:-1::0;;45905:15:0::1;45885:17;:35:::0;-1:-1:-1;;;;;;;;53475:1415:0:o;46194:149::-;23349:13;:11;:13::i;:::-;46251:6:::1;;46261:1;46251:11;46243:45;;;::::0;-1:-1:-1;;;46243:45:0;;9432:2:1;46243:45:0::1;::::0;::::1;9414:21:1::0;9471:2;9451:18;;;9444:30;9510:23;9490:18;;;9483:51;9551:18;;46243:45:0::1;9230:345:1::0;46243:45:0::1;46308:1;46299:6;:10:::0;;;46325::::1;::::0;::::1;::::0;46308:1;46325:10:::1;46194:149::o:0;56737:206::-;23349:13;:11;:13::i;:::-;56836:12:::1;56854:6;-1:-1:-1::0;;;;;56854:11:0::1;56873:5;56880:4;;56854:31;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56835:50;;;56904:7;56896:39;;;::::0;-1:-1:-1;;;56896:39:0;;10058:2:1;56896:39:0::1;::::0;::::1;10040:21:1::0;10097:2;10077:18;;;10070:30;10136:21;10116:18;;;10109:49;10175:18;;56896:39:0::1;9856:343:1::0;56896:39:0::1;56824:119;56737:206:::0;;;;:::o;54967:253::-;45246:7;;-1:-1:-1;;;;;45246:7:0;45232:10;:21;;:46;;-1:-1:-1;23509:7:0;23536:6;-1:-1:-1;;;;;23536:6:0;45257:10;:21;45232:46;45224:75;;;;-1:-1:-1;;;45224:75:0;;4436:2:1;45224:75:0;;;4418:21:1;4475:2;4455:18;;;4448:30;-1:-1:-1;;;4494:18:1;;;4487:46;4550:18;;45224:75:0;4234:340:1;45224:75:0;45978:6:::1;::::0;:11;45970:35:::1;;;::::0;-1:-1:-1;;;45970:35:0;;5451:2:1;45970:35:0::1;::::0;::::1;5433:21:1::0;5490:2;5470:18;;;5463:30;-1:-1:-1;;;5509:18:1;;;5502:41;5560:18;;45970:35:0::1;5249:335:1::0;45970:35:0::1;55047:13:::2;::::0;-1:-1:-1;;;;;55047:13:0::2;55039:73;;;::::0;-1:-1:-1;;;55039:73:0;;10406:2:1;55039:73:0::2;::::0;::::2;10388:21:1::0;10445:2;10425:18;;;10418:30;10484:34;10464:18;;;10457:62;10555:3;10535:18;;;10528:31;10576:19;;55039:73:0::2;10204:397:1::0;55039:73:0::2;55132:7;::::0;55151:13:::2;::::0;;55123:42:::2;::::0;;;;-1:-1:-1;;;;;55151:13:0;;::::2;55123:42:::0;;::::2;160:74:1::0;;;;55132:7:0;;::::2;::::0;55123:27:::2;::::0;133:18:1;;55123:42:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;55198:13:0::2;::::0;55181:31:::2;::::0;-1:-1:-1;;;;;55198:13:0;;::::2;160:74:1::0;;55181:31:0::2;::::0;-1:-1:-1;148:2:1;133:18;;-1:-1:-1;55181:31:0::2;;;;;;;54967:253::o:0;24138:103::-;23349:13;:11;:13::i;:::-;24203:30:::1;24230:1;24203:18;:30::i;:::-;24138:103::o:0;27444:235::-;26612:13;;20740:10;;-1:-1:-1;;;;;26612:13:0;27541:24;;27537:98;;27589:34;;-1:-1:-1;;;27589:34:0;;-1:-1:-1;;;;;178:55:1;;27589:34:0;;;160:74:1;133:18;;27589:34:0;14:226:1;27537:98:0;27645:26;27664:6;27645:18;:26::i;46033:153::-;45389:15;;-1:-1:-1;;;;;45389:15:0;45375:10;:29;;:54;;-1:-1:-1;45422:7:0;;-1:-1:-1;;;;;45422:7:0;45408:10;:21;45375:54;:79;;;-1:-1:-1;23509:7:0;23536:6;-1:-1:-1;;;;;23536:6:0;45433:10;:21;45375:79;45367:117;;;;-1:-1:-1;;;45367:117:0;;10808:2:1;45367:117:0;;;10790:21:1;10847:2;10827:18;;;10820:30;10886:27;10866:18;;;10859:55;10931:18;;45367:117:0;10606:349:1;45367:117:0;46098:6:::1;::::0;:11;46090:43:::1;;;::::0;-1:-1:-1;;;46090:43:0;;11162:2:1;46090:43:0::1;::::0;::::1;11144:21:1::0;11201:2;11181:18;;;11174:30;11240:21;11220:18;;;11213:49;11279:18;;46090:43:0::1;10960:343:1::0;46090:43:0::1;46153:1;46144:6;:10:::0;46170:8:::1;::::0;::::1;::::0;;;::::1;46033:153::o:0;55362:402::-;45246:7;;-1:-1:-1;;;;;45246:7:0;45232:10;:21;;:46;;-1:-1:-1;23509:7:0;23536:6;-1:-1:-1;;;;;23536:6:0;45257:10;:21;45232:46;45224:75;;;;-1:-1:-1;;;45224:75:0;;4436:2:1;45224:75:0;;;4418:21:1;4475:2;4455:18;;;4448:30;-1:-1:-1;;;4494:18:1;;;4487:46;4550:18;;45224:75:0;4234:340:1;45224:75:0;55444:7:::1;::::0;55463::::1;::::0;55437:34:::1;::::0;-1:-1:-1;;;55437:34:0;;-1:-1:-1;;;;;55463:7:0;;::::1;55437:34;::::0;::::1;160:74:1::0;55420:14:0::1;::::0;55444:7;;;::::1;::::0;55437:25:::1;::::0;133:18:1;;55437:34:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55420:51:::0;-1:-1:-1;55485:10:0;;55482:94:::1;;55520:7;::::0;55548::::1;::::0;55511:53:::1;::::0;-1:-1:-1;;;55511:53:0;;-1:-1:-1;;;;;55548:7:0;;::::1;55511:53;::::0;::::1;11482:74:1::0;11572:18;;;11565:34;;;55520:7:0;::::1;::::0;55511:36:::1;::::0;11455:18:1;;55511:53:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55482:94;55613:10;::::0;55635:7:::1;::::0;55606:37:::1;::::0;-1:-1:-1;;;55606:37:0;;-1:-1:-1;;;;;55635:7:0;;::::1;55606:37;::::0;::::1;160:74:1::0;55586:17:0::1;::::0;55613:10;;;::::1;::::0;55606:28:::1;::::0;133:18:1;;55606:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55586:57:::0;-1:-1:-1;55657:13:0;;55654:103:::1;;55695:7;::::0;55723:10:::1;::::0;55686:59:::1;::::0;-1:-1:-1;;;55686:59:0;;-1:-1:-1;;;;;55723:10:0;;::::1;55686:59;::::0;::::1;11482:74:1::0;11572:18;;;11565:34;;;55695:7:0;::::1;::::0;55686:36:::1;::::0;11455:18:1;;55686:59:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55654:103;55409:355;;55362:402::o:0;47510:573::-;23349:13;:11;:13::i;:::-;47697:16:::1;::::0;-1:-1:-1;;;47697:16:0;::::1;;;47696:17;47688:56;;;::::0;-1:-1:-1;;;47688:56:0;;11812:2:1;47688:56:0::1;::::0;::::1;11794:21:1::0;11851:2;11831:18;;;11824:30;11890:28;11870:18;;;11863:56;11936:18;;47688:56:0::1;11610:350:1::0;47688:56:0::1;47755:16;:23:::0;;;::::1;-1:-1:-1::0;;;47755:23:0::1;::::0;;-1:-1:-1;;;;;47797:22:0;::::1;::::0;;::::1;::::0;:51:::1;;-1:-1:-1::0;;;;;;47823:25:0;::::1;::::0;::::1;47797:51;:77;;;;-1:-1:-1::0;;;;;;47852:22:0;::::1;::::0;::::1;47797:77;47789:107;;;::::0;-1:-1:-1;;;47789:107:0;;12167:2:1;47789:107:0::1;::::0;::::1;12149:21:1::0;12206:2;12186:18;;;12179:30;12245:19;12225:18;;;12218:47;12282:18;;47789:107:0::1;11965:341:1::0;47789:107:0::1;47936:7;:18:::0;;-1:-1:-1;;;;;47936:18:0;;::::1;-1:-1:-1::0;;;;;;47936:18:0;;::::1;;::::0;;;47965:10:::1;:24:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;48000:7:::1;:18:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;48029:6:::1;:16:::0;;;;;::::1;::::0;::::1;;::::0;;47510:573::o;48739:1766::-;45246:7;;-1:-1:-1;;;;;45246:7:0;45232:10;:21;;:46;;-1:-1:-1;23509:7:0;23536:6;-1:-1:-1;;;;;23536:6:0;45257:10;:21;45232:46;45224:75;;;;-1:-1:-1;;;45224:75:0;;4436:2:1;45224:75:0;;;4418:21:1;4475:2;4455:18;;;4448:30;-1:-1:-1;;;4494:18:1;;;4487:46;4550:18;;45224:75:0;4234:340:1;45224:75:0;45629:8:::1;;45614:12;;:23;;;;:::i;:::-;45595:15;:42;;45587:77;;;::::0;-1:-1:-1;;;45587:77:0;;5100:2:1;45587:77:0::1;::::0;::::1;5082:21:1::0;5139:2;5119:18;;;5112:30;5178:24;5158:18;;;5151:52;5220:18;;45587:77:0::1;4898:346:1::0;45587:77:0::1;45978:6:::2;::::0;:11;45970:35:::2;;;::::0;-1:-1:-1;;;45970:35:0;;5451:2:1;45970:35:0::2;::::0;::::2;5433:21:1::0;5490:2;5470:18;;;5463:30;-1:-1:-1;;;5509:18:1;;;5502:41;5560:18;;45970:35:0::2;5249:335:1::0;45970:35:0::2;48993:7:::3;::::0;49024:10:::3;::::0;49055:7:::3;::::0;-1:-1:-1;;;;;48993:7:0;;::::3;::::0;49024:10;;::::3;::::0;49055:7:::3;49209:17:::0;49201:58:::3;;;::::0;-1:-1:-1;;;49201:58:0;;5791:2:1;49201:58:0::3;::::0;::::3;5773:21:1::0;5830:2;5810:18;;;5803:30;5869;5849:18;;;5842:58;5917:18;;49201:58:0::3;5589:352:1::0;49201:58:0::3;49586:10;49599;:8;:10::i;:::-;49586:23:::0;-1:-1:-1;49620:32:0::3;49586:23:::0;49655:19:::3;49671:3;49655:13:::0;:19:::3;:::i;:::-;:27;;;;:::i;:::-;49620:62;;49760:3;49746:11;;49716:27;:41;;;;:::i;:::-;:47;;;;:::i;:::-;49701:11;:62;;49693:96;;;::::0;-1:-1:-1;;;49693:96:0;;6600:2:1;49693:96:0::3;::::0;::::3;6582:21:1::0;6639:2;6619:18;;;6612:30;6678:23;6658:18;;;6651:51;6719:18;;49693:96:0::3;6398:345:1::0;49693:96:0::3;49808:44;::::0;-1:-1:-1;;;49808:44:0;;49846:4:::3;49808:44;::::0;::::3;160:74:1::0;49856:13:0;;-1:-1:-1;;;;;49808:29:0;::::3;::::0;::::3;::::0;133:18:1;;49808:44:0::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61;;49800:102;;;::::0;-1:-1:-1;;;49800:102:0;;12513:2:1;49800:102:0::3;::::0;::::3;12495:21:1::0;12552:2;12532:18;;;12525:30;12591;12571:18;;;12564:58;12639:18;;49800:102:0::3;12311:352:1::0;49800:102:0::3;-1:-1:-1::0;49967:57:0::3;::::0;-1:-1:-1;;;;;;49967:32:0;::::3;50000:8:::0;50010:13;49967:32:::3;:57::i;:::-;50056:41;::::0;-1:-1:-1;;;50056:41:0;;50091:4:::3;50056:41;::::0;::::3;160:74:1::0;50035:18:0::3;::::0;-1:-1:-1;;;;;50056:26:0;::::3;::::0;::::3;::::0;133:18:1;;50056:41:0::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50200:57;::::0;;;;::::3;::::0;::::3;7276:25:1::0;;;7317:18;;;7310:34;;;50035:62:0;;-1:-1:-1;;;;;;50200:29:0;::::3;::::0;::::3;::::0;7249:18:1;;50200:57:0::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;50289:41:0::3;::::0;-1:-1:-1;;;50289:41:0;;50324:4:::3;50289:41;::::0;::::3;160:74:1::0;50268:18:0::3;::::0;-1:-1:-1;50333:10:0;;-1:-1:-1;;;;;;50289:26:0;::::3;::::0;::::3;::::0;133:18:1;;50289:41:0::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;;;:::i;:::-;50268:75;;50376:11;50362:10;:25;;50354:64;;;::::0;-1:-1:-1;;;50354:64:0;;9077:2:1;50354:64:0::3;::::0;::::3;9059:21:1::0;9116:2;9096:18;;;9089:30;9155:28;9135:18;;;9128:56;9201:18;;50354:64:0::3;8875:350:1::0;50354:64:0::3;50457:40;::::0;;7276:25:1;;;7332:2;7317:18;;7310:34;;;50457:40:0::3;::::0;7249:18:1;50457:40:0::3;7102:248:1::0;52187:1280:0;45246:7;;-1:-1:-1;;;;;45246:7:0;45232:10;:21;;:46;;-1:-1:-1;23509:7:0;23536:6;-1:-1:-1;;;;;23536:6:0;45257:10;:21;45232:46;45224:75;;;;-1:-1:-1;;;45224:75:0;;4436:2:1;45224:75:0;;;4418:21:1;4475:2;4455:18;;;4448:30;-1:-1:-1;;;4494:18:1;;;4487:46;4550:18;;45224:75:0;4234:340:1;45224:75:0;45822:8:::1;;45802:17;;:28;;;;:::i;:::-;45783:15;:47;;45775:87;;;::::0;-1:-1:-1;;;45775:87:0;;8048:2:1;45775:87:0::1;::::0;::::1;8030:21:1::0;8087:2;8067:18;;;8060:30;8126:29;8106:18;;;8099:57;8173:18;;45775:87:0::1;7846:351:1::0;45775:87:0::1;45978:6:::2;::::0;:11;45970:35:::2;;;::::0;-1:-1:-1;;;45970:35:0;;5451:2:1;45970:35:0::2;::::0;::::2;5433:21:1::0;5490:2;5470:18;;;5463:30;-1:-1:-1;;;5509:18:1;;;5502:41;5560:18;;45970:35:0::2;5249:335:1::0;45970:35:0::2;52526:7:::3;::::0;52557:10:::3;::::0;52588:7:::3;::::0;52623:41:::3;::::0;-1:-1:-1;;;52623:41:0;;52658:4:::3;52623:41;::::0;::::3;160:74:1::0;-1:-1:-1;;;;;52526:7:0;;::::3;::::0;52557:10;;::::3;::::0;52588:7;;::::3;::::0;52668:10;;52588:7;;52623:26:::3;::::0;133:18:1;;52623:41:0::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:55;;52615:88;;;::::0;-1:-1:-1;;;52615:88:0;;12870:2:1;52615:88:0::3;::::0;::::3;12852:21:1::0;12909:2;12889:18;;;12882:30;12948:22;12928:18;;;12921:50;12988:18;;52615:88:0::3;12668:344:1::0;52615:88:0::3;52722:44;::::0;-1:-1:-1;;;52722:44:0;;52760:4:::3;52722:44;::::0;::::3;160:74:1::0;52770:13:0;;-1:-1:-1;;;;;52722:29:0;::::3;::::0;::::3;::::0;133:18:1;;52722:44:0::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61;;52714:97;;;::::0;-1:-1:-1;;;52714:97:0;;13219:2:1;52714:97:0::3;::::0;::::3;13201:21:1::0;13258:2;13238:18;;;13231:30;13297:25;13277:18;;;13270:53;13340:18;;52714:97:0::3;13017:347:1::0;52714:97:0::3;52877:51;-1:-1:-1::0;;;;;52877:29:0;::::3;52907:8:::0;52917:10;52877:29:::3;:51::i;:::-;52939:57;-1:-1:-1::0;;;;;52939:32:0;::::3;52972:8:::0;52982:13;52939:32:::3;:57::i;:::-;53114:18;53144:8;-1:-1:-1::0;;;;;53135:28:0::3;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53176:72;::::0;;;;::::3;::::0;::::3;8753:25:1::0;;;8794:18;;;8787:34;;;8837:18;;;8830:34;;;53114:51:0;;-1:-1:-1;;;;;;53176:31:0;::::3;::::0;::::3;::::0;8726:18:1;;53176:72:0::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53259:17;53312:10;53288:8;-1:-1:-1::0;;;;;53279:28:0::3;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;;;;:::i;:::-;53259:63;;53354:12;53341:9;:25;;53333:58;;;::::0;-1:-1:-1;;;53333:58:0;;13571:2:1;53333:58:0::3;::::0;::::3;13553:21:1::0;13610:2;13590:18;;;13583:30;13649:22;13629:18;;;13622:50;13689:18;;53333:58:0::3;13369:344:1::0;53333:58:0::3;53407:52;::::0;;8753:25:1;;;8809:2;8794:18;;8787:34;;;8837:18;;;8830:34;;;53407:52:0::3;::::0;8741:2:1;8726:18;53407:52:0::3;;;;;;;-1:-1:-1::0;;45905:15:0::1;45885:17;:35:::0;-1:-1:-1;;;;;;52187:1280:0:o;46351:759::-;23349:13;:11;:13::i;:::-;-1:-1:-1;;;;;46545:22:0;::::1;::::0;;::::1;::::0;:56:::1;;-1:-1:-1::0;;;;;;46571:30:0;::::1;::::0;::::1;46545:56;:88;;;;-1:-1:-1::0;;;;;;46605:28:0;::::1;::::0;::::1;46545:88;46537:118;;;::::0;-1:-1:-1;;;46537:118:0;;12167:2:1;46537:118:0::1;::::0;::::1;12149:21:1::0;12206:2;12186:18;;;12179:30;12245:19;12225:18;;;12218:47;12282:18;;46537:118:0::1;11965:341:1::0;46537:118:0::1;46715:2;46703:9;:14;46695:48;;;::::0;-1:-1:-1;;;46695:48:0;;13920:2:1;46695:48:0::1;::::0;::::1;13902:21:1::0;13959:2;13939:18;;;13932:30;13998:23;13978:18;;;13971:51;14039:18;;46695:48:0::1;13718:345:1::0;46695:48:0::1;46798:3;46782:12;:19;;:43;;;;;46822:3;46805:13;:20;;46782:43;46774:77;;;::::0;-1:-1:-1;;;46774:77:0;;14270:2:1;46774:77:0::1;::::0;::::1;14252:21:1::0;14309:2;14289:18;;;14282:30;14348:23;14328:18;;;14321:51;14389:18;;46774:77:0::1;14068:345:1::0;46774:77:0::1;46891:7;:18:::0;;-1:-1:-1;;;;;;46891:18:0;;::::1;-1:-1:-1::0;;;;;46891:18:0;;::::1;;::::0;;;46920:15:::1;:34:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;46965:13:::1;:30:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;47006:8:::1;:20:::0;;;;47037:11:::1;:26:::0;47074:12:::1;:28:::0;46351:759::o;26832:181::-;23349:13;:11;:13::i;:::-;26922::::1;:24:::0;;-1:-1:-1;;;;;26922:24:0;::::1;-1:-1:-1::0;;;;;;26922:24:0;;::::1;::::0;::::1;::::0;;;26987:7:::1;23509::::0;23536:6;-1:-1:-1;;;;;23536:6:0;;23463:87;26987:7:::1;-1:-1:-1::0;;;;;26962:43:0::1;;;;;;;;;;;26832:181:::0;:::o;55831:308::-;23349:13;:11;:13::i;:::-;-1:-1:-1;;;;;55933:26:0;::::1;55930:202;;55984:7;::::0;55975:49:::1;::::0;;;;::::1;::::0;::::1;783:25:1::0;;;-1:-1:-1;;;;;55984:7:0;;::::1;::::0;55975:36:::1;::::0;756:18:1;;55975:49:0::1;637:177:1::0;55930:202:0::1;56066:7;::::0;56057:63:::1;::::0;-1:-1:-1;;;56057:63:0;;-1:-1:-1;;;;;11500:55:1;;;56057:63:0::1;::::0;::::1;11482:74:1::0;11572:18;;;11565:34;;;56066:7:0;;::::1;::::0;56057:36:::1;::::0;11455:18:1;;56057:63:0::1;11308:297:1::0;23628:166:0;23509:7;23536:6;-1:-1:-1;;;;;23536:6:0;20740:10;23688:23;23684:103;;23735:40;;-1:-1:-1;;;23735:40:0;;20740:10;23735:40;;;160:74:1;133:18;;23735:40:0;14:226:1;28882:162:0;28992:43;;;-1:-1:-1;;;;;11500:55:1;;28992:43:0;;;11482:74:1;11572:18;;;;11565:34;;;28992:43:0;;;;;;;;;;11455:18:1;;;;28992:43:0;;;;;;;;;;;;;;28965:71;;28985:5;;28965:19;:71::i;:::-;28882:162;;;:::o;50513:197::-;50577:6;;50556:4;;-1:-1:-1;;;;;50577:6:0;50573:130;;-1:-1:-1;50621:4:0;;50513:197::o;50573:130::-;50673:6;;;;;;;;;-1:-1:-1;;;;;50673:6:0;-1:-1:-1;;;;;50665:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50658:33;;50513:197;:::o;27203:156::-;27293:13;27286:20;;-1:-1:-1;;;;;;27286:20:0;;;27317:34;27342:8;27317:24;:34::i;31693:638::-;32117:23;32143:33;-1:-1:-1;;;;;32143:27:0;;32171:4;32143:27;:33::i;:::-;32117:59;;32191:10;:17;32212:1;32191:22;;:57;;;;;32229:10;32218:30;;;;;;;;;;;;:::i;:::-;32217:31;32191:57;32187:137;;;32272:40;;;;;-1:-1:-1;;;;;178:55:1;;32272:40:0;;;160:74:1;133:18;;32272:40:0;14:226:1;24776:191:0;24850:16;24869:6;;-1:-1:-1;;;;;24886:17:0;;;-1:-1:-1;;;;;;24886:17:0;;;;;;24919:40;;24869:6;;;;;;;24919:40;;24850:16;24919:40;24839:128;24776:191;:::o;16339:153::-;16414:12;16446:38;16468:6;16476:4;16482:1;16446:21;:38::i;:::-;16439:45;;16339:153;;;;;:::o;16827:398::-;16926:12;16979:5;16955:21;:29;16951:110;;;17008:41;;;;;17043:4;17008:41;;;160:74:1;133:18;;17008:41:0;14:226:1;16951:110:0;17072:12;17086:23;17113:6;-1:-1:-1;;;;;17113:11:0;17132:5;17139:4;17113:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17071:73;;;;17162:55;17189:6;17197:7;17206:10;17162:26;:55::i;:::-;17155:62;;;;16827:398;;;;;;:::o;18303:597::-;18451:12;18481:7;18476:417;;18505:19;18513:10;18505:7;:19::i;:::-;18476:417;;;18733:17;;:22;:49;;;;-1:-1:-1;;;;;;18759:18:0;;;:23;18733:49;18729:121;;;18810:24;;;;;-1:-1:-1;;;;;178:55:1;;18810:24:0;;;160:74:1;133:18;;18810:24:0;14:226:1;18729:121:0;-1:-1:-1;18871:10:0;18864:17;;19453:528;19586:17;;:21;19582:392;;19818:10;19812:17;19875:15;19862:10;19858:2;19854:19;19847:44;19582:392;19945:17;;;;;;;;;;;;;;245:196:1;313:20;;-1:-1:-1;;;;;362:54:1;;352:65;;342:93;;431:1;428;421:12;342:93;245:196;;;:::o;446:186::-;505:6;558:2;546:9;537:7;533:23;529:32;526:52;;;574:1;571;564:12;526:52;597:29;616:9;597:29;:::i;819:346::-;887:6;895;948:2;936:9;927:7;923:23;919:32;916:52;;;964:1;961;954:12;916:52;-1:-1:-1;;1009:23:1;;;1129:2;1114:18;;;1101:32;;-1:-1:-1;819:346:1:o;1170:466::-;1247:6;1255;1263;1316:2;1304:9;1295:7;1291:23;1287:32;1284:52;;;1332:1;1329;1322:12;1284:52;-1:-1:-1;;1377:23:1;;;1497:2;1482:18;;1469:32;;-1:-1:-1;1600:2:1;1585:18;;;1572:32;;1170:466;-1:-1:-1;1170:466:1:o;1641:774::-;1729:6;1737;1745;1753;1806:2;1794:9;1785:7;1781:23;1777:32;1774:52;;;1822:1;1819;1812:12;1774:52;1845:29;1864:9;1845:29;:::i;:::-;1835:39;-1:-1:-1;1943:2:1;1928:18;;1915:32;;-1:-1:-1;2022:2:1;2007:18;;1994:32;2049:18;2038:30;;2035:50;;;2081:1;2078;2071:12;2035:50;2104:22;;2157:4;2149:13;;2145:27;-1:-1:-1;2135:55:1;;2186:1;2183;2176:12;2135:55;2226:2;2213:16;2252:18;2244:6;2241:30;2238:50;;;2284:1;2281;2274:12;2238:50;2329:7;2324:2;2315:6;2311:2;2307:15;2303:24;2300:37;2297:57;;;2350:1;2347;2340:12;2297:57;1641:774;;;;-1:-1:-1;2381:2:1;2373:11;;-1:-1:-1;;;1641:774:1:o;2420:409::-;2506:6;2514;2522;2530;2583:3;2571:9;2562:7;2558:23;2554:33;2551:53;;;2600:1;2597;2590:12;2551:53;2623:29;2642:9;2623:29;:::i;:::-;2613:39;;2671:38;2705:2;2694:9;2690:18;2671:38;:::i;:::-;2661:48;;2728:38;2762:2;2751:9;2747:18;2728:38;:::i;:::-;2718:48;;2785:38;2819:2;2808:9;2804:18;2785:38;:::i;:::-;2775:48;;2420:409;;;;;;;:::o;2834:691::-;2938:6;2946;2954;2962;2970;2978;3031:3;3019:9;3010:7;3006:23;3002:33;2999:53;;;3048:1;3045;3038:12;2999:53;3071:29;3090:9;3071:29;:::i;:::-;3061:39;;3119:38;3153:2;3142:9;3138:18;3119:38;:::i;:::-;3109:48;;3176:38;3210:2;3199:9;3195:18;3176:38;:::i;:::-;2834:691;;;;-1:-1:-1;3166:48:1;;3283:2;3268:18;;3255:32;;-1:-1:-1;3384:3:1;3369:19;;3356:33;;3488:3;3473:19;;;3460:33;;-1:-1:-1;2834:691:1;-1:-1:-1;;2834:691:1:o;3530:300::-;3598:6;3606;3659:2;3647:9;3638:7;3634:23;3630:32;3627:52;;;3675:1;3672;3665:12;3627:52;3698:29;3717:9;3698:29;:::i;:::-;3688:39;3796:2;3781:18;;;;3768:32;;-1:-1:-1;;;3530:300:1:o;4045:184::-;4115:6;4168:2;4156:9;4147:7;4143:23;4139:32;4136:52;;;4184:1;4181;4174:12;4136:52;-1:-1:-1;4207:16:1;;4045:184;-1:-1:-1;4045:184:1:o;4579:::-;-1:-1:-1;;;4628:1:1;4621:88;4728:4;4725:1;4718:15;4752:4;4749:1;4742:15;4768:125;4833:9;;;4854:10;;;4851:36;;;4867:18;;:::i;5946:168::-;6019:9;;;6050;;6067:15;;;6061:22;;6047:37;6037:71;;6088:18;;:::i;6119:274::-;6159:1;6185;6175:189;;-1:-1:-1;;;6217:1:1;6210:88;6321:4;6318:1;6311:15;6349:4;6346:1;6339:15;6175:189;-1:-1:-1;6378:9:1;;6119:274::o;7355:128::-;7422:9;;;7443:11;;;7440:37;;;7457:18;;:::i;9580:271::-;9763:6;9755;9750:3;9737:33;9719:3;9789:16;;9814:13;;;9789:16;9580:271;-1:-1:-1;9580:271:1:o;14418:277::-;14485:6;14538:2;14526:9;14517:7;14513:23;14509:32;14506:52;;;14554:1;14551;14544:12;14506:52;14586:9;14580:16;14639:5;14632:13;14625:21;14618:5;14615:32;14605:60;;14661:1;14658;14651:12;14700:412;14829:3;14867:6;14861:13;14892:1;14902:129;14916:6;14913:1;14910:13;14902:129;;;15014:4;14998:14;;;14994:25;;14988:32;14975:11;;;14968:53;14931:12;14902:129;;;-1:-1:-1;15086:1:1;15050:16;;15075:13;;;-1:-1:-1;15050:16:1;14700:412;-1:-1:-1;14700:412:1:o
Swarm Source
ipfs://442b663d0e4a96fd32fac194bf80a6342e3b9040bd8e0f24e4b16c2cbfeb0c17
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.