More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 52 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Create Limit Ord... | 12876167 | 1 hrs ago | IN | 0 S | 0.01137955 | ||||
Execute Swap | 12875621 | 1 hr ago | IN | 0 S | 0.0227197 | ||||
Deposit Token | 12875518 | 1 hr ago | IN | 0 S | 0.0049348 | ||||
Transfer | 12875408 | 1 hr ago | IN | 20 S | 0.00443135 | ||||
Withdraw | 12874963 | 1 hr ago | IN | 0 S | 0.00509486 | ||||
Withdraw | 12874869 | 1 hr ago | IN | 0 S | 0.0062141 | ||||
Withdraw | 12874482 | 1 hr ago | IN | 0 S | 0.00640415 | ||||
Withdraw | 12874213 | 1 hr ago | IN | 0 S | 0.00582365 | ||||
Withdraw | 12874213 | 1 hr ago | IN | 0 S | 0.00634625 | ||||
Cancel Limit Ord... | 12874155 | 1 hr ago | IN | 0 S | 0.004074 | ||||
Create Limit Ord... | 12873261 | 1 hr ago | IN | 0 S | 0.01063237 | ||||
Execute Limit Or... | 12873247 | 1 hr ago | IN | 0 S | 0.0173459 | ||||
Transfer | 12866175 | 2 hrs ago | IN | 1 S | 0.00289235 | ||||
Create Limit Ord... | 12862637 | 2 hrs ago | IN | 0 S | 0.0106095 | ||||
Transfer | 12862373 | 2 hrs ago | IN | 10 S | 0.00289235 | ||||
Create Limit Ord... | 12859715 | 2 hrs ago | IN | 0 S | 0.01061005 | ||||
Transfer | 12859360 | 2 hrs ago | IN | 20 S | 0.00289235 | ||||
Transfer | 12859025 | 2 hrs ago | IN | 20 S | 0.00366185 | ||||
Execute Wallet S... | 12858897 | 2 hrs ago | IN | 0 S | 0.02238868 | ||||
Create Limit Ord... | 12839939 | 4 hrs ago | IN | 0 S | 0.0113801 | ||||
Execute Limit Or... | 12839912 | 4 hrs ago | IN | 0 S | 0.0196269 | ||||
Execute Limit Or... | 12839842 | 4 hrs ago | IN | 0 S | 0.01610515 | ||||
Create Limit Ord... | 12839782 | 4 hrs ago | IN | 0 S | 0.01137955 | ||||
Cancel Limit Ord... | 12839362 | 4 hrs ago | IN | 0 S | 0.0038666 | ||||
Execute Limit Or... | 12824969 | 6 hrs ago | IN | 0 S | 0.0157567 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
AITradingAssistant
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
No with 200 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.28; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; interface IWETH { function deposit() external payable; function depositFor(address account) external payable returns (bool); function withdraw(uint256) external; function withdrawTo(address account, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); } contract AITradingAssistant is Ownable, ReentrancyGuard { using SafeERC20 for IERC20; address public immutable WETH; address public orderExecutor; constructor( address initialOwner, address _weth, address initialExecutor ) Ownable(initialOwner) { WETH = _weth; orderExecutor = initialExecutor; } modifier onlyExecutorOrOwner() { require(msg.sender == owner() || msg.sender == orderExecutor, "Not authorized"); _; } struct OrderDetails { bytes32 orderId; address tokenIn; address tokenOut; uint256 amountIn; uint256 amountOutMin; } struct LimitOrder { address user; address tokenIn; address tokenOut; uint256 amountIn; uint256 amountOutMin; } // State variables mapping(address => mapping(address => uint256)) public userBalances; // user => token => amount mapping(bytes32 => LimitOrder) public limitOrders; bytes32[] public activeOrderIds; // Events event Received(address user, uint256 amount); event TokenReceived(address user, address token, uint256 amount); event Deposited(address user, address token, uint256 amount); event Withdrawn(address user, address token, uint256 amount); event LimitOrderCreated( bytes32 indexed orderId, address user, address tokenIn, address tokenOut, uint256 amountIn, uint256 amountOutMin ); event LimitOrderCancelled(bytes32 indexed orderId); event LimitOrderExecuted( bytes32 indexed orderId, address user, address tokenIn, address tokenOut, uint256 amountIn, uint256 amountOut ); event SwapExecuted( address user, address tokenIn, address tokenOut, uint256 amountIn, uint256 amountOut ); event WalletSwapExecuted( address user, address tokenIn, address tokenOut, uint256 amountIn, uint256 amountOut ); receive() external payable { IWETH(WETH).deposit{value: msg.value}(); userBalances[msg.sender][WETH] += msg.value; emit Received(msg.sender, msg.value); } function setOrderExecutor(address newExecutor) external onlyOwner { require(newExecutor != address(0), "Invalid executor address"); orderExecutor = newExecutor; } function depositToken( address token, uint256 amount, address user ) external nonReentrant { require(token != address(0), "Invalid token address"); require(amount > 0, "Amount must be greater than 0"); IERC20(token).safeTransferFrom(msg.sender, address(this), amount); userBalances[user][token] += amount; emit TokenReceived(user, token, amount); } function depositFor( address user, address token, uint256 amount ) external onlyOwner nonReentrant { require(token != address(0), "Invalid token address"); userBalances[user][token] += amount; emit Deposited(user, token, amount); } function createLimitOrder( address user, address tokenIn, address tokenOut, uint256 amountIn, uint256 amountOutMin ) external onlyOwner returns (bytes32) { require(userBalances[user][tokenIn] >= amountIn, "Insufficient balance"); bytes32 orderId = keccak256( abi.encodePacked( user, tokenIn, tokenOut, amountIn, amountOutMin, block.timestamp ) ); require(limitOrders[orderId].amountIn == 0, "Order ID collision"); limitOrders[orderId] = LimitOrder({ user: user, tokenIn: tokenIn, tokenOut: tokenOut, amountIn: amountIn, amountOutMin: amountOutMin }); activeOrderIds.push(orderId); userBalances[user][tokenIn] -= amountIn; emit LimitOrderCreated( orderId, user, tokenIn, tokenOut, amountIn, amountOutMin ); return orderId; } function cancelLimitOrder(bytes32 orderId) public { LimitOrder memory order = limitOrders[orderId]; require(order.user != address(0), "Order does not exist"); require( msg.sender == owner() || msg.sender == order.user, "Unauthorized" ); userBalances[order.user][order.tokenIn] += order.amountIn; for (uint i = 0; i < activeOrderIds.length; i++) { if (activeOrderIds[i] == orderId) { activeOrderIds[i] = activeOrderIds[activeOrderIds.length - 1]; activeOrderIds.pop(); break; } } delete limitOrders[orderId]; emit LimitOrderCancelled(orderId); } function executeLimitOrder( bytes32 orderId, address router, bytes calldata swapData ) external onlyExecutorOrOwner nonReentrant { LimitOrder memory order = limitOrders[orderId]; require(order.user != address(0), "Order does not exist"); uint256 balanceBefore = IERC20(order.tokenOut).balanceOf(address(this)); IERC20(order.tokenIn).approve(router, order.amountIn); (bool success, ) = router.call(swapData); require(success, "Swap failed"); uint256 balanceAfter = IERC20(order.tokenOut).balanceOf(address(this)); uint256 amountOut = balanceAfter - balanceBefore; require(amountOut >= order.amountOutMin, "Insufficient output amount"); userBalances[order.user][order.tokenOut] += amountOut; for (uint i = 0; i < activeOrderIds.length; i++) { if (activeOrderIds[i] == orderId) { activeOrderIds[i] = activeOrderIds[activeOrderIds.length - 1]; activeOrderIds.pop(); break; } } delete limitOrders[orderId]; emit LimitOrderExecuted( orderId, order.user, order.tokenIn, order.tokenOut, order.amountIn, amountOut ); } function executeSwap( address user, address tokenIn, address tokenOut, uint256 amountIn, address router, bytes calldata swapData ) external onlyOwner nonReentrant { require(userBalances[user][tokenIn] >= amountIn, "Insufficient balance"); userBalances[user][tokenIn] -= amountIn; uint256 balanceBefore = IERC20(tokenOut).balanceOf(address(this)); IERC20(tokenIn).approve(router, amountIn); (bool success, ) = router.call(swapData); require(success, "Swap failed"); uint256 balanceAfter = IERC20(tokenOut).balanceOf(address(this)); uint256 amountOut = balanceAfter - balanceBefore; userBalances[user][tokenOut] += amountOut; emit SwapExecuted( user, tokenIn, tokenOut, amountIn, amountOut ); } function executeWalletSwap( address user, address tokenIn, address tokenOut, uint256 amountIn, uint256 amountOutMin, address router, bytes calldata swapData ) external onlyOwner nonReentrant { IERC20(tokenIn).safeTransferFrom(user, address(this), amountIn); uint256 balanceBefore = IERC20(tokenOut).balanceOf(address(this)); IERC20(tokenIn).approve(router, amountIn); (bool success, ) = router.call(swapData); require(success, "Swap failed"); uint256 balanceAfter = IERC20(tokenOut).balanceOf(address(this)); uint256 amountOut = balanceAfter - balanceBefore; require(amountOut >= amountOutMin, "Insufficient output amount"); if (tokenOut == WETH) { bool unwrapSuccess = IWETH(WETH).withdrawTo(user, amountOut); require(unwrapSuccess, "wS unwrap failed"); } else { IERC20(tokenOut).safeTransfer(user, amountOut); } emit WalletSwapExecuted( user, tokenIn, tokenOut, amountIn, amountOut ); } function withdraw( address user, address token, uint256 amount ) external onlyOwner nonReentrant { require(userBalances[user][token] >= amount, "Insufficient balance"); userBalances[user][token] -= amount; for (uint i = 0; i < activeOrderIds.length; i++) { LimitOrder storage order = limitOrders[activeOrderIds[i]]; if (order.user == user && order.tokenIn == token) { cancelLimitOrder(activeOrderIds[i]); } } if (token == WETH) { bool success = IWETH(WETH).withdrawTo(user, amount); require(success, "WETH withdrawal failed"); } else { IERC20(token).safeTransfer(user, amount); } emit Withdrawn(user, token, amount); } function userEmergencyWithdraw(address token) external nonReentrant { uint256 balance = userBalances[msg.sender][token]; require(balance > 0, "No balance to withdraw"); userBalances[msg.sender][token] = 0; for (uint i = 0; i < activeOrderIds.length; i++) { LimitOrder storage order = limitOrders[activeOrderIds[i]]; if (order.user == msg.sender && order.tokenIn == token) { cancelLimitOrder(activeOrderIds[i]); } } if (token == WETH) { IWETH(WETH).withdraw(balance); (bool success, ) = msg.sender.call{value: balance}(""); require(success, "ETH transfer failed"); } else { IERC20(token).safeTransfer(msg.sender, balance); } emit Withdrawn(msg.sender, token, balance); } function emergencyWithdraw(address token) external onlyOwner { if (token == WETH) { uint256 balance = address(this).balance; IWETH(WETH).withdraw(balance); (bool success, ) = owner().call{value: balance}(""); require(success, "ETH transfer failed"); } else { IERC20(token).safeTransfer( owner(), IERC20(token).balanceOf(address(this)) ); } } function getUserBalance(address user, address token) external view returns (uint256) { return userBalances[user][token]; } function getTotalActiveOrders() external view returns (uint256) { return activeOrderIds.length; } function getActiveOrders(uint256 offset, uint256 limit) external view returns (OrderDetails[] memory orders, uint256 total) { uint256 totalCount = activeOrderIds.length; uint256 size = limit; if (offset + limit > totalCount) { size = totalCount > offset ? totalCount - offset : 0; } OrderDetails[] memory result = new OrderDetails[](size); for (uint256 i = 0; i < size; i++) { uint256 orderIndex = offset + i; bytes32 orderId = activeOrderIds[orderIndex]; LimitOrder memory order = limitOrders[orderId]; result[i] = OrderDetails({ orderId: orderId, tokenIn: order.tokenIn, tokenOut: order.tokenOut, amountIn: order.amountIn, amountOutMin: order.amountOutMin }); } return (result, totalCount); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; import {Context} from "../utils/Context.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); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC1363.sol) pragma solidity ^0.8.20; import {IERC20} from "./IERC20.sol"; import {IERC165} from "./IERC165.sol"; /** * @title IERC1363 * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363]. * * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction. */ interface IERC1363 is IERC20, IERC165 { /* * Note: the ERC-165 identifier for this interface is 0xb0202a11. * 0xb0202a11 === * bytes4(keccak256('transferAndCall(address,uint256)')) ^ * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^ * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^ * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^ * bytes4(keccak256('approveAndCall(address,uint256)')) ^ * bytes4(keccak256('approveAndCall(address,uint256,bytes)')) */ /** * @dev Moves a `value` amount of tokens from the caller's account to `to` * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferAndCall(address to, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from the caller's account to `to` * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @param data Additional data with no specified format, sent in call to `to`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param from The address which you want to send tokens from. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferFromAndCall(address from, address to, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param from The address which you want to send tokens from. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @param data Additional data with no specified format, sent in call to `to`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`. * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function approveAndCall(address spender, uint256 value) external returns (bool); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`. * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. * @param data Additional data with no specified format, sent in call to `spender`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol) pragma solidity ^0.8.20; import {IERC165} from "../utils/introspection/IERC165.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol) pragma solidity ^0.8.20; import {IERC20} from "../token/ERC20/IERC20.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC-20 standard as defined in the ERC. */ 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.2.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.20; import {IERC20} from "../IERC20.sol"; import {IERC1363} from "../../../interfaces/IERC1363.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC-20 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 { /** * @dev An operation with an ERC-20 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. * * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client" * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior. */ 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. * * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client" * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior. */ 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. * * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function * only sets the "standard" allowance. Any temporary allowance will remain active, in addition to the value being * set here. */ 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 Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * Reverts if the returned value is other than `true`. */ function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal { if (to.code.length == 0) { safeTransfer(token, to, value); } else if (!token.transferAndCall(to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * Reverts if the returned value is other than `true`. */ function transferFromAndCallRelaxed( IERC1363 token, address from, address to, uint256 value, bytes memory data ) internal { if (to.code.length == 0) { safeTransferFrom(token, from, to, value); } else if (!token.transferFromAndCall(from, to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}. * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall} * once without retrying, and relies on the returned value to be true. * * Reverts if the returned value is other than `true`. */ function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal { if (to.code.length == 0) { forceApprove(token, to, value); } else if (!token.approveAndCall(to, value, data)) { 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 {_callOptionalReturnBool} that reverts if call fails to meet the requirements. */ function _callOptionalReturn(IERC20 token, bytes memory data) private { uint256 returnSize; uint256 returnValue; assembly ("memory-safe") { let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20) // bubble errors if iszero(success) { let ptr := mload(0x40) returndatacopy(ptr, 0, returndatasize()) revert(ptr, returndatasize()) } returnSize := returndatasize() returnValue := mload(0) } if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) { 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 silently catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { bool success; uint256 returnSize; uint256 returnValue; assembly ("memory-safe") { success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20) returnSize := returndatasize() returnValue := mload(0) } return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC-165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[ERC]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol) pragma solidity ^0.8.20; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at, * consider using {ReentrancyGuardTransient} instead. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant NOT_ENTERED = 1; uint256 private constant ENTERED = 2; uint256 private _status; /** * @dev Unauthorized reentrant call. */ error ReentrancyGuardReentrantCall(); constructor() { _status = NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be NOT_ENTERED if (_status == ENTERED) { revert ReentrancyGuardReentrantCall(); } // Any calls to nonReentrant after this point will fail _status = ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == ENTERED; } }
{ "viaIR": true, "evmVersion": "cancun", "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"},{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address","name":"initialExecutor","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"orderId","type":"bytes32"}],"name":"LimitOrderCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"orderId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOutMin","type":"uint256"}],"name":"LimitOrderCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"orderId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"LimitOrderExecuted","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":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Received","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"SwapExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokenReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"WalletSwapExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"activeOrderIds","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"orderId","type":"bytes32"}],"name":"cancelLimitOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"}],"name":"createLimitOrder","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"depositToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"orderId","type":"bytes32"},{"internalType":"address","name":"router","type":"address"},{"internalType":"bytes","name":"swapData","type":"bytes"}],"name":"executeLimitOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"router","type":"address"},{"internalType":"bytes","name":"swapData","type":"bytes"}],"name":"executeSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address","name":"router","type":"address"},{"internalType":"bytes","name":"swapData","type":"bytes"}],"name":"executeWalletSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"offset","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"getActiveOrders","outputs":[{"components":[{"internalType":"bytes32","name":"orderId","type":"bytes32"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"}],"internalType":"struct AITradingAssistant.OrderDetails[]","name":"orders","type":"tuple[]"},{"internalType":"uint256","name":"total","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalActiveOrders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"token","type":"address"}],"name":"getUserBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"limitOrders","outputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"orderExecutor","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newExecutor","type":"address"}],"name":"setOrderExecutor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"userBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"userEmergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a06040523461007f5761001a610014610160565b916101fd565b610022610084565b613dc46103ed82396080518181816108a4015281816112a3015281816112dc01528181611f5601528181611f9a01528181612ddc01528181612e15015281816137160152818161374f0152818161397801526139ff0152613dc490f35b61008a565b60405190565b5f80fd5b601f801991011690565b634e487b7160e01b5f52604160045260245ffd5b906100b69061008e565b810190811060018060401b038211176100ce57604052565b610098565b906100e66100df610084565b92836100ac565b565b5f80fd5b60018060a01b031690565b610100906100ec565b90565b61010c816100f7565b0361011357565b5f80fd5b9050519061012482610103565b565b909160608284031261015b57610158610141845f8501610117565b9361014f8160208601610117565b93604001610117565b90565b6100e8565b61017e6141b180380380610173816100d3565b928339810190610126565b909192565b5f1b90565b9061019960018060a01b0391610183565b9181191691161790565b90565b6101ba6101b56101bf926100ec565b6101a3565b6100ec565b90565b6101cb906101a6565b90565b6101d7906101c2565b90565b90565b906101f26101ed6101f9926101ce565b6101da565b8254610188565b9055565b9061020b610215939261029b565b60805260026101dd565b565b90565b90565b61023161022c61023692610217565b6101a3565b61021a565b90565b610243600161021d565b90565b906102525f1991610183565b9181191691161790565b61027061026b6102759261021a565b6101a3565b61021a565b90565b90565b9061029061028b6102979261025c565b610278565b8254610246565b9055565b6102a490610305565b6102b66102af610239565b600161027b565b565b90565b6102cf6102ca6102d4926102b8565b6101a3565b6100ec565b90565b6102e0906102bb565b90565b6102ec906100f7565b9052565b9190610303905f602085019401906102e3565b565b8061032061031a6103155f6102d7565b6100f7565b916100f7565b146103305761032e9061038d565b565b61035361033c5f6102d7565b5f918291631e4fbdf760e01b8352600483016102f0565b0390fd5b5f1c90565b60018060a01b031690565b61037361037891610357565b61035c565b90565b6103859054610367565b90565b5f0190565b6103965f61037b565b6103a0825f6101dd565b906103d46103ce7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0936101ce565b916101ce565b916103dd610084565b806103e781610388565b0390a356fe6080604052600436101561001d575b36610e2f5761001b613970565b005b6100275f35610186565b8063117b26121461018157806325aec7501461017c57806331062eed146101775780634584eff6146101725780636805d6ad1461016d5780636ff1c9bc14610168578063715018a614610163578063756677a11461015e5780637c95cdc6146101595780638da5cb5b146101545780638f10a7f21461014f5780639d5755821461014a578063a849d64414610145578063ad5c464814610140578063adb519801461013b578063b3db428b14610136578063ca697db414610131578063d9caed121461012c578063dc4c46ab14610127578063e747d8b114610122578063eabc1bb71461011d5763f2fde38b0361000e57610dfc565b610dc7565b610cce565b610c0d565b610b87565b610b4e565b610a18565b6109a8565b6108c6565b61086d565b6107f5565b610782565b6106d5565b61067c565b6104fb565b6104c8565b610495565b61045f565b6103ff565b610386565b61031b565b6101fb565b60e01c90565b60405190565b5f80fd5b5f80fd5b5f80fd5b60018060a01b031690565b6101b29061019e565b90565b6101be816101a9565b036101c557565b5f80fd5b905035906101d6826101b5565b565b906020828203126101f1576101ee915f016101c9565b90565b610196565b5f0190565b346102295761021361020e3660046101d8565b611406565b61021b61018c565b80610225816101f6565b0390f35b610192565b90565b61023a8161022e565b0361024157565b5f80fd5b9050359061025282610231565b565b5f80fd5b5f80fd5b5f80fd5b909182601f8301121561029a5781359167ffffffffffffffff831161029557602001926001830284011161029057565b61025c565b610258565b610254565b9160c083830312610316576102b6825f85016101c9565b926102c483602083016101c9565b926102d281604084016101c9565b926102e08260608501610245565b926102ee83608083016101c9565b9260a082013567ffffffffffffffff81116103115761030d9201610260565b9091565b61019a565b610196565b346103505761033a61032e36600461029f565b9594909493919361194f565b61034261018c565b8061034c816101f6565b0390f35b610192565b5f91031261035f57565b610196565b61036d9061022e565b9052565b9190610384905f60208501940190610364565b565b346103b657610396366004610355565b6103b26103a1611964565b6103a961018c565b91829182610371565b0390f35b610192565b90565b6103c7816103bb565b036103ce57565b5f80fd5b905035906103df826103be565b565b906020828203126103fa576103f7915f016103d2565b90565b610196565b3461042d576104176104123660046103e1565b611d0c565b61041f61018c565b80610429816101f6565b0390f35b610192565b919060408382031261045a578061044e610457925f86016101c9565b936020016101c9565b90565b610196565b346104905761048c61047b610475366004610432565b90611f12565b61048361018c565b91829182610371565b0390f35b610192565b346104c3576104ad6104a83660046101d8565b612129565b6104b561018c565b806104bf816101f6565b0390f35b610192565b346104f6576104d8366004610355565b6104e0612159565b6104e861018c565b806104f2816101f6565b0390f35b610192565b346105295761051361050e3660046101d8565b612268565b61051b61018c565b80610525816101f6565b0390f35b610192565b9190604083820312610556578061054a610553925f8601610245565b93602001610245565b90565b610196565b5190565b60209181520190565b60200190565b610577906103bb565b9052565b610584906101a9565b9052565b6105919061022e565b9052565b906080806105ed936105ad5f8201515f86019061056e565b6105bf6020820151602086019061057b565b6105d16040820151604086019061057b565b6105e360608201516060860190610588565b0151910190610588565b565b906105fc8160a093610595565b0190565b60200190565b9061062361061d6106168461055b565b809361055f565b92610568565b905f5b8181106106335750505090565b90919261064c61064660019286516105ef565b94610600565b9101919091610626565b9291602061067261067a9360408701908782035f890152610606565b940190610364565b565b346106ae5761069561068f36600461052e565b9061239f565b906106aa6106a161018c565b92839283610656565b0390f35b610192565b6106bc906101a9565b9052565b91906106d3905f602085019401906106b3565b565b34610705576106e5366004610355565b6107016106f0612522565b6106f861018c565b918291826106c0565b0390f35b610192565b919060a08382031261075b57610722815f85016101c9565b9261073082602083016101c9565b9261075861074184604085016101c9565b9361074f8160608601610245565b93608001610245565b90565b610196565b610769906103bb565b9052565b9190610780905f60208501940190610760565b565b346107b6576107b26107a161079836600461070a565b939290926128ed565b6107a961018c565b9182918261076d565b0390f35b610192565b90916060828403126107f0576107ed6107d6845f85016101c9565b936107e48160208601610245565b936040016101c9565b90565b610196565b346108245761080e6108083660046107bb565b91612af6565b61081661018c565b80610820816101f6565b0390f35b610192565b1c90565b60018060a01b031690565b61084890600861084d9302610829565b61082d565b90565b9061085b9154610838565b90565b61086a60025f90610850565b90565b3461089d5761087d366004610355565b61089961088861085e565b61089061018c565b918291826106c0565b0390f35b610192565b7f000000000000000000000000000000000000000000000000000000000000000090565b346108f6576108d6366004610355565b6108f26108e16108a2565b6108e961018c565b918291826106c0565b0390f35b610192565b90565b61091261090d6109179261019e565b6108fb565b61019e565b90565b610923906108fe565b90565b61092f9061091a565b90565b9061093c90610926565b5f5260205260405f2090565b9061095290610926565b5f5260205260405f2090565b90565b6109719060086109769302610829565b61095e565b90565b906109849154610961565b90565b6109a06109a59261099b6003935f94610932565b610948565b610979565b90565b346109d9576109d56109c46109be366004610432565b90610987565b6109cc61018c565b91829182610371565b0390f35b610192565b9091606082840312610a1357610a106109f9845f85016101c9565b93610a0781602086016101c9565b93604001610245565b90565b610196565b34610a4757610a31610a2b3660046109de565b91612bcd565b610a3961018c565b80610a43816101f6565b0390f35b610192565b610a55906103bb565b90565b90610a6290610a4c565b5f5260205260405f2090565b5f1c90565b610a7f610a8491610a6e565b61082d565b90565b610a919054610a73565b90565b610aa0610aa591610a6e565b61095e565b90565b610ab29054610a94565b90565b610ac0906004610a58565b610acb5f8201610a87565b91610ad860018301610a87565b91610ae560028201610a87565b91610afe6004610af760038501610aa8565b9301610aa8565b90565b90959492610b4c94610b3b610b4592610b31608096610b2760a088019c5f8901906106b3565b60208701906106b3565b60408501906106b3565b6060830190610364565b0190610364565b565b34610b8257610b7e610b69610b643660046103e1565b610ab5565b91610b7595939561018c565b95869586610b01565b0390f35b610192565b34610bb657610ba0610b9a3660046109de565b91612f16565b610ba861018c565b80610bb2816101f6565b0390f35b610192565b91606083830312610c0857610bd2825f85016103d2565b92610be083602083016101c9565b92604082013567ffffffffffffffff8111610c0357610bff9201610260565b9091565b61019a565b610196565b34610c3f57610c29610c20366004610bbb565b929190916134b7565b610c3161018c565b80610c3b816101f6565b0390f35b610192565b9060e082820312610cc957610c5b815f84016101c9565b92610c6982602085016101c9565b92610c7783604083016101c9565b92610c858160608401610245565b92610c938260808501610245565b92610ca18360a083016101c9565b9260c082013567ffffffffffffffff8111610cc457610cc09201610260565b9091565b61019a565b610196565b34610d0657610cf0610ce1366004610c44565b969590959491949392936138ee565b610cf861018c565b80610d02816101f6565b0390f35b610192565b90602082820312610d2457610d21915f01610245565b90565b610196565b634e487b7160e01b5f52603260045260245ffd5b5490565b5f5260205f2090565b610d5381610d3d565b821015610d6d57610d65600191610d41565b910201905f90565b610d29565b90565b610d85906008610d8a9302610829565b610d72565b90565b90610d989154610d75565b90565b6005610da681610d3d565b821015610dc357610dc091610dba91610d4a565b90610d8d565b90565b5f80fd5b34610df757610df3610de2610ddd366004610d0b565b610d9b565b610dea61018c565b9182918261076d565b0390f35b610192565b34610e2a57610e14610e0f3660046101d8565b613965565b610e1c61018c565b80610e26816101f6565b0390f35b610192565b5f80fd5b610e4490610e3f613ad8565b611161565b610e4c613b3d565b565b90565b610e65610e60610e6a92610e4e565b6108fb565b61022e565b90565b60209181520190565b5f7f4e6f2062616c616e636520746f20776974686472617700000000000000000000910152565b610eaa6016602092610e6d565b610eb381610e76565b0190565b610ecc9060208101905f818303910152610e9d565b90565b15610ed657565b610ede61018c565b62461bcd60e51b815280610ef460048201610eb7565b0390fd5b5f1b90565b90610f095f1991610ef8565b9181191691161790565b610f27610f22610f2c9261022e565b6108fb565b61022e565b90565b90565b90610f47610f42610f4e92610f13565b610f2f565b8254610efd565b9055565b6001610f5e910161022e565b90565b90565b610f6d906108fe565b90565b610f7990610f64565b90565b610f85906108fe565b90565b610f9190610f7c565b90565b610f9d9061091a565b90565b5f80fd5b601f801991011690565b634e487b7160e01b5f52604160045260245ffd5b90610fcc90610fa4565b810190811067ffffffffffffffff821117610fe657604052565b610fae565b60e01b90565b5f910312610ffb57565b610196565b61100861018c565b3d5f823e3d90fd5b905090565b6110205f8092611010565b0190565b61102d90611015565b90565b9061104361103c61018c565b9283610fc2565b565b67ffffffffffffffff81116110635761105f602091610fa4565b0190565b610fae565b9061107a61107583611045565b611030565b918252565b606090565b3d5f1461109f576110943d611068565b903d5f602084013e5b565b6110a761107f565b9061109d565b5f7f455448207472616e73666572206661696c656400000000000000000000000000910152565b6110e16013602092610e6d565b6110ea816110ad565b0190565b6111039060208101905f8183039101526110d4565b90565b1561110d57565b61111561018c565b62461bcd60e51b81528061112b600482016110ee565b0390fd5b60409061115861115f949695939661114e60608401985f8501906106b3565b60208301906106b3565b0190610364565b565b61117f61117a61117360033390610932565b8390610948565b610aa8565b9061119c826111966111905f610e51565b9161022e565b11610ecf565b6111c36111a85f610e51565b6111be6111b760033390610932565b8490610948565b610f32565b6111cc5f610e51565b5b806111e96111e36111de6005610d3d565b61022e565b9161022e565b10156112985761124b9061121b611216600461121061120a60058690610d4a565b90610d8d565b90610a58565b610f61565b6112265f8201610a87565b611238611232336101a9565b916101a9565b149081611272575b50611250575b610f52565b6111cd565b61126d61126861126260058490610d4a565b90610d8d565b611d0c565b611246565b61127f9150600101610a87565b61129161128b856101a9565b916101a9565b145f611240565b5090816112cd6112c77f00000000000000000000000000000000000000000000000000000000000000006101a9565b916101a9565b145f146113ed576113056113007f0000000000000000000000000000000000000000000000000000000000000000610f88565b610f94565b632e1a7d4d82823b156113e85761133b926113305f809461132461018c565b96879586948593610feb565b835260048301610371565b03925af180156113e3576113b7575b506113775f80338461135a61018c565b908161136581611024565b03925af1611371611084565b50611106565b5b339190916113b27fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb936113a961018c565b9384938461112f565b0390a1565b6113d6905f3d81116113dc575b6113ce8183610fc2565b810190610ff1565b5f61134a565b503d6113c4565b611000565b610fa0565b6114016113f983610f70565b338391613b82565b611378565b61140f90610e33565b565b90611428969594939291611423613bd0565b61142a565b565b9061144196959493929161143c613ad8565b61168f565b611449613b3d565b565b5f7f496e73756666696369656e742062616c616e6365000000000000000000000000910152565b61147f6014602092610e6d565b6114888161144b565b0190565b6114a19060208101905f818303910152611472565b90565b156114ab57565b6114b361018c565b62461bcd60e51b8152806114c96004820161148c565b0390fd5b634e487b7160e01b5f52601160045260245ffd5b6114f06114f69193929361022e565b9261022e565b820391821161150157565b6114cd565b61150f9061091a565b90565b61151b9061091a565b90565b9050519061152b82610231565b565b9060208282031261154657611543915f0161151e565b90565b610196565b151590565b6115598161154b565b0361156057565b5f80fd5b9050519061157182611550565b565b9060208282031261158c57611589915f01611564565b90565b610196565b9160206115b29294936115ab60408201965f8301906106b3565b0190610364565b565b90825f939282370152565b9091826115cf816115d693611010565b80936115b4565b0190565b90916115e5926115bf565b90565b5f7f53776170206661696c6564000000000000000000000000000000000000000000910152565b61161c600b602092610e6d565b611625816115e8565b0190565b61163e9060208101905f81830391015261160f565b90565b1561164857565b61165061018c565b62461bcd60e51b81528061166660048201611629565b0390fd5b61167961167f9193929361022e565b9261022e565b820180921161168a57565b6114cd565b9194929590936116cf6116b66116b16116aa60038790610932565b8890610948565b610aa8565b6116c86116c28a61022e565b9161022e565b10156114a4565b611701876116fb6116ec6116e560038890610932565b8990610948565b916116f683610aa8565b6114e1565b90610f32565b611749602061171761171289610f70565b611506565b6370a082319061173e61172930611512565b9261173261018c565b95869485938493610feb565b8352600483016106c0565b03915afa90811561194a575f9161191c575b509361176e61176987610f70565b611506565b90602063095ea7b39284906117965f8d966117a161178a61018c565b98899687958694610feb565b845260048401611591565b03925af1938415611917575f809481946117e2976118eb575b50926117d06117c761018c565b938492836115da565b03925af16117dc611084565b50611641565b61182a60206117f86117f387610f70565b611506565b6370a082319061181f61180a30611512565b9261181361018c565b95869485938493610feb565b8352600483016106c0565b03915afa9283156118e6576118b39361184a925f916118b8575b506114e1565b9061187d8261187761186861186160038690610932565b8990610948565b9161187283610aa8565b61166a565b90610f32565b9293947f764f0dc063c06f32d89a3f3af80c0db4be8a090901f589a478b447e0a51f09f1956118aa61018c565b95869586610b01565b0390a1565b6118d9915060203d81116118df575b6118d18183610fc2565b81019061152d565b5f611844565b503d6118c7565b611000565b61190b9060203d8111611910575b6119038183610fc2565b810190611573565b6117ba565b503d6118f9565b611000565b61193d915060203d8111611943575b6119358183610fc2565b81019061152d565b5f61175b565b503d61192b565b611000565b9061195e969594939291611411565b565b5f90565b61196c611960565b506119776005610d3d565b90565b90611984906101a9565b9052565b906119929061022e565b9052565b6119a060a0611030565b90565b90611a22611a1960046119b4611996565b946119cb6119c35f8301610a87565b5f880161197a565b6119e36119da60018301610a87565b6020880161197a565b6119fb6119f260028301610a87565b6040880161197a565b611a13611a0a60038301610aa8565b60608801611988565b01610aa8565b60808401611988565b565b611a2d906119a3565b90565b611a3a90516101a9565b90565b611a51611a4c611a5692610e4e565b6108fb565b61019e565b90565b611a6290611a3d565b90565b5f7f4f7264657220646f6573206e6f74206578697374000000000000000000000000910152565b611a996014602092610e6d565b611aa281611a65565b0190565b611abb9060208101905f818303910152611a8c565b90565b15611ac557565b611acd61018c565b62461bcd60e51b815280611ae360048201611aa6565b0390fd5b5f7f556e617574686f72697a65640000000000000000000000000000000000000000910152565b611b1b600c602092610e6d565b611b2481611ae7565b0190565b611b3d9060208101905f818303910152611b0e565b90565b15611b4757565b611b4f61018c565b62461bcd60e51b815280611b6560048201611b28565b0390fd5b611b73905161022e565b90565b90565b611b8d611b88611b9292611b76565b6108fb565b61022e565b90565b1b90565b91906008611bb4910291611bae5f1984611b95565b92611b95565b9181191691161790565b611bc790610a6e565b90565b9190611be0611bdb611be893610a4c565b611bbe565b908354611b99565b9055565b90565b634e487b7160e01b5f52603160045260245ffd5b5490565b5f5260205f2090565b611c1981611c03565b821015611c3357611c2b600191611c07565b910201905f90565b610d29565b5f90565b611c4e91611c48611c38565b91611bca565b565b611c5981611c03565b8015611c7a576001900390611c77611c718383611c10565b90611c3c565b55565b611bef565b9190611c95611c90611c9d93610f13565b610f2f565b908354611b99565b9055565b611cb391611cad611960565b91611c7f565b565b5f6004611ce0928280820155826001820155826002820155611cda8360038301611ca1565b01611ca1565b565b634e487b7160e01b5f525f60045260245ffd5b905f03611d0757611d0590611cb5565b565b611ce2565b611dcd611d23611d1e60048490610a58565b611a24565b611d52611d315f8301611a30565b611d4b611d45611d405f611a59565b6101a9565b916101a9565b1415611abe565b33611d6c611d66611d61612522565b6101a9565b916101a9565b148015611ee9575b611d7d90611b40565b611dc7611db8611d8f60608401611b69565b92611db26020611dab6003611da55f8601611a30565b90610932565b9201611a30565b90610948565b91611dc283610aa8565b61166a565b90610f32565b611dd65f610e51565b5b80611df3611ded611de86005610d3d565b61022e565b9161022e565b1015611ee357611e0e611e0860058390610d4a565b90610d8d565b611e20611e1a846103bb565b916103bb565b14611e3357611e2e90610f52565b611dd7565b611e7990611e73611e6b611e656005611e5f611e4f6005610d3d565b611e596001611b79565b906114e1565b90610d4a565b90610d8d565b916005610d4a565b90611bca565b611e8b611e866005611bec565b611c50565b5b611ea15f611e9c60048490610a58565b611cf5565b611ecb7f575e1bd37dd781403bf952371b71926fd0d9bd7e5d82b1b7989371d3d935fec891610a4c565b90611ed461018c565b80611ede816101f6565b0390a2565b50611e8c565b50611d7d33611f0a611f04611eff5f8601611a30565b6101a9565b916101a9565b149050611d74565b611f3791611f2d611f3292611f25611960565b506003610932565b610948565b610aa8565b90565b611f4b90611f46613bd0565b611f4d565b565b80611f80611f7a7f00000000000000000000000000000000000000000000000000000000000000006101a9565b916101a9565b145f146120785750611f9130611512565b31611fc3611fbe7f0000000000000000000000000000000000000000000000000000000000000000610f88565b610f94565b632e1a7d4d82823b1561207357611ff992611fee5f8094611fe261018c565b96879586948593610feb565b835260048301610371565b03925af1801561206e5761203f925f928392612042575b50612019612522565b9061202261018c565b908161202d81611024565b03925af1612039611084565b50611106565b5b565b61206190833d8111612067575b6120598183610fc2565b810190610ff1565b5f612010565b503d61204f565b611000565b610fa0565b806120856120d392610f70565b9060206120a161209c612096612522565b93610f70565b611506565b6370a08231906120c86120b330611512565b926120bc61018c565b97889485938493610feb565b8352600483016106c0565b03915afa918215612124576120ef935f936120f4575b50613b82565b612040565b61211691935060203d811161211d575b61210e8183610fc2565b81019061152d565b915f6120e9565b503d612104565b611000565b61213290611f3a565b565b61213c613bd0565b612144612146565b565b6121576121525f611a59565b613c1e565b565b612161612134565b565b6121749061216f613bd0565b612236565b565b5f7f496e76616c6964206578656375746f7220616464726573730000000000000000910152565b6121aa6018602092610e6d565b6121b381612176565b0190565b6121cc9060208101905f81830391015261219d565b90565b156121d657565b6121de61018c565b62461bcd60e51b8152806121f4600482016121b7565b0390fd5b9061220960018060a01b0391610ef8565b9181191691161790565b90565b9061222b61222661223292610926565b612213565b82546121f8565b9055565b6122669061225f8161225861225261224d5f611a59565b6101a9565b916101a9565b14156121cf565b6002612216565b565b61227190612163565b565b606090565b67ffffffffffffffff81116122905760208091020190565b610fae565b906122a76122a283612278565b611030565b918252565b6122b660a0611030565b90565b5f90565b5f90565b5f90565b6122cd6122ac565b90602080808080866122dd6122b9565b8152016122e86122bd565b8152016122f36122bd565b8152016122fe6122c1565b8152016123096122c1565b81525050565b6123176122c5565b90565b5f5b82811061232857505050565b60209061233361230f565b818401520161231c565b9061236261234a83612295565b926020806123588693612278565b920191039061231a565b565b61236e60a0611030565b90565b9061237b906103bb565b9052565b906123898261055b565b81101561239a576020809102010190565b610d29565b916123a8612273565b506123b1611960565b506123bc6005610d3d565b6123c6838561166a565b6123d86123d28361022e565b9161022e565b116124e2575b6123e78361233d565b916123f15f610e51565b5b806124056123ff8761022e565b9161022e565b10156124d9576124d4906124cd61243061242a6124238a859061166a565b6005610d4a565b90610d8d565b6124ba61244761244260048490610a58565b611a24565b6124b161245660208301611a30565b916124a861246660408301611a30565b61249f612481608061247a60608701611b69565b9501611b69565b9561249661248d612364565b995f8b01612371565b6020890161197a565b6040870161197a565b60608501611988565b60808301611988565b8683916124c7838361237f565b5261237f565b5150610f52565b6123f2565b50925092509190565b8092506124f76124f18561022e565b9161022e565b115f14612510576125098284906114e1565b5b916123de565b6125195f610e51565b61250a565b5f90565b61252a61251e565b506125345f610a87565b90565b9061254d9594939291612548613bd0565b612747565b90565b60601b90565b61255f90612550565b90565b61256b90612556565b90565b61257a61257f916101a9565b612562565b9052565b90565b6125926125979161022e565b612583565b9052565b6125eb946125db60146020999895966125d3828c996125cb82896125c38e9b6125e39d61256e565b01809261256e565b01809261256e565b018092612586565b018092612586565b018092612586565b0190565b60200190565b5190565b5f7f4f7264657220494420636f6c6c6973696f6e0000000000000000000000000000910152565b61262d6012602092610e6d565b612636816125f9565b0190565b61264f9060208101905f818303910152612620565b90565b1561265957565b61266161018c565b62461bcd60e51b8152806126776004820161263a565b0390fd5b61268560a0611030565b90565b906126fe60806004612704946126ab5f82016126a55f8801611a30565b90612216565b6126c4600182016126be60208801611a30565b90612216565b6126dd600282016126d760408801611a30565b90612216565b6126f6600382016126f060608801611b69565b90610f32565b019201611b69565b90610f32565b565b9061271091612688565b565b9081549168010000000000000000831015612742578261273a91600161274095018155611c10565b90611bca565b565b610fae565b929190925061278661276d61276861276160038790610932565b8490610948565b610aa8565b61277f6127798761022e565b9161022e565b10156114a4565b6128e7836127bb83916127ac86898b9042926127a061018c565b9788966020880161259b565b60208201810382520382610fc2565b6127cd6127c7826125f5565b916125ef565b20956128016127e960036127e360048b90610a58565b01610aa8565b6127fb6127f55f610e51565b9161022e565b14612652565b6128608561284f856128468861283d8c91612834899561282b61282261267b565b995f8b0161197a565b6020890161197a565b6040870161197a565b60608501611988565b60808301611988565b61285b60048a90610a58565b612706565b61287461286d6005611bec565b8890612712565b6128a6866128a061289161288a60038a90610932565b8790610948565b9161289b83610aa8565b6114e1565b90610f32565b86949293956128d57f7603cff60dc3d7d1025c12f1b8ade67aa4b048ccf2c115ac624b5cbfdfe9759496610a4c565b966128de61018c565b95869586610b01565b0390a290565b90612902949392916128fd611c38565b612537565b90565b906129189291612913613ad8565b612a26565b612920613b3d565b565b5f7f496e76616c696420746f6b656e20616464726573730000000000000000000000910152565b6129566015602092610e6d565b61295f81612922565b0190565b6129789060208101905f818303910152612949565b90565b1561298257565b61298a61018c565b62461bcd60e51b8152806129a060048201612963565b0390fd5b5f7f416d6f756e74206d7573742062652067726561746572207468616e2030000000910152565b6129d8601d602092610e6d565b6129e1816129a4565b0190565b6129fa9060208101905f8183039101526129cb565b90565b15612a0457565b612a0c61018c565b62461bcd60e51b815280612a22600482016129e5565b0390fd5b91612a4c83612a45612a3f612a3a5f611a59565b6101a9565b916101a9565b141561297b565b612a6882612a62612a5c5f610e51565b9161022e565b116129fd565b612a86612a7484610f70565b33612a7e30611512565b908592613c7d565b612ab882612ab2612aa3612a9c60038690610932565b8790610948565b91612aad83610aa8565b61166a565b90610f32565b919091612af17fa83965f0e7c5e026e57c9ba2dd91e4ebcca352f2d514498c1e9ed23ba653860093612ae861018c565b9384938461112f565b0390a1565b90612b019291612905565b565b90612b169291612b11613bd0565b612b18565b565b90612b2b9291612b26613ad8565b612b35565b612b33613b3d565b565b919091612b5d83612b56612b50612b4b5f611a59565b6101a9565b916101a9565b141561297b565b612b8f82612b89612b7a612b7360038690610932565b8790610948565b91612b8483610aa8565b61166a565b90610f32565b919091612bc87f8752a472e571a816aea92eec8dae9baf628e840f4929fbcc2d155e6233ff68a793612bbf61018c565b9384938461112f565b0390a1565b90612bd89291612b03565b565b90612bed9291612be8613bd0565b612bef565b565b90612c029291612bfd613ad8565b612c8e565b612c0a613b3d565b565b5f7f57455448207769746864726177616c206661696c656400000000000000000000910152565b612c406016602092610e6d565b612c4981612c0c565b0190565b612c629060208101905f818303910152612c33565b90565b15612c6c57565b612c7461018c565b62461bcd60e51b815280612c8a60048201612c4d565b0390fd5b90612cc9612cb0612cab612ca460038690610932565b8490610948565b610aa8565b612cc2612cbc8661022e565b9161022e565b10156114a4565b612cfb83612cf5612ce6612cdf60038790610932565b8590610948565b91612cf083610aa8565b6114e1565b90610f32565b612d045f610e51565b5b80612d21612d1b612d166005610d3d565b61022e565b9161022e565b1015612dd057612d8390612d53612d4e6004612d48612d4260058690610d4a565b90610d8d565b90610a58565b610f61565b612d5e5f8201610a87565b612d70612d6a876101a9565b916101a9565b149081612daa575b50612d88575b610f52565b612d05565b612da5612da0612d9a60058490610d4a565b90610d8d565b611d0c565b612d7e565b612db79150600101610a87565b612dc9612dc3856101a9565b916101a9565b145f612d78565b50919082612e06612e007f00000000000000000000000000000000000000000000000000000000000000006101a9565b916101a9565b145f14612efd57612e3e612e397f0000000000000000000000000000000000000000000000000000000000000000610f88565b610f94565b602063205c2878918390612e655f8795612e70612e5961018c565b97889687958694610feb565b845260048401611591565b03925af18015612ef857612e8b915f91612eca575b50612c65565b5b919091612ec57fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb93612ebc61018c565b9384938461112f565b0390a1565b612eeb915060203d8111612ef1575b612ee38183610fc2565b810190611573565b5f612e85565b503d612ed9565b611000565b612f11612f0984610f70565b828491613b82565b612e8c565b90612f219291612bda565b565b5f7f4e6f7420617574686f72697a6564000000000000000000000000000000000000910152565b612f57600e602092610e6d565b612f6081612f23565b0190565b612f799060208101905f818303910152612f4a565b90565b15612f8357565b612f8b61018c565b62461bcd60e51b815280612fa160048201612f64565b0390fd5b90612fdc93929133612fc6612fc0612fbb612522565b6101a9565b916101a9565b148015612fde575b612fd790612f7c565b613006565b565b50612fd733612ffe612ff8612ff36002610a87565b6101a9565b916101a9565b149050612fce565b9061301a939291613015613ad8565b6130a6565b613022613b3d565b565b5f7f496e73756666696369656e74206f757470757420616d6f756e74000000000000910152565b613058601a602092610e6d565b61306181613024565b0190565b61307a9060208101905f81830391015261304b565b90565b1561308457565b61308c61018c565b62461bcd60e51b8152806130a260048201613065565b0390fd5b92906130bc6130b760048690610a58565b611a24565b926130ec6130cb5f8601611a30565b6130e56130df6130da5f611a59565b6101a9565b916101a9565b1415611abe565b61313f602061310d61310861310360408901611a30565b610f70565b611506565b6370a082319061313461311f30611512565b9261312861018c565b95869485938493610feb565b8352600483016106c0565b03915afa9081156134b2575f91613484575b509161316f61316a61316560208801611a30565b610f70565b611506565b602063095ea7b39183906131a15f61318960608c01611b69565b956131ac61319561018c565b97889687958694610feb565b845260048401611591565b03925af192831561347f57613241955f809481946131f197613453575b50926131df6131d661018c565b938492836115da565b03925af16131eb611084565b50611641565b602061320f61320a61320560408701611a30565b610f70565b611506565b6370a082319061323661322130611512565b9261322a61018c565b96879485938493610feb565b8352600483016106c0565b03915afa801561344e5761325c925f91613420575b506114e1565b6132848161327d61327761327260808701611b69565b61022e565b9161022e565b101561307d565b6132cb816132c56132b66132a4600361329e5f8901611a30565b90610932565b6132b060408801611a30565b90610948565b916132c083610aa8565b61166a565b90610f32565b6132d45f610e51565b5b806132f16132eb6132e66005610d3d565b61022e565b9161022e565b10156134185761330c61330660058390610d4a565b90610d8d565b61331e613318866103bb565b916103bb565b146133315761332c90610f52565b6132d5565b61337b9061337561336d6133676005979596976133616133516005610d3d565b61335b6001611b79565b906114e1565b90610d4a565b90610d8d565b916005610d4a565b90611bca565b61338d6133886005611bec565b611c50565b5b6133a35f61339e60048490610a58565b611cf5565b906133af5f8401611a30565b6134136133be60208601611a30565b926133d760606133d060408901611a30565b9701611b69565b6134017f2edad8618ac6f3343f778b8dab83cf8b9805b60a8bd146c61a0ee0b49f0e19db96610a4c565b9661340a61018c565b95869586610b01565b0390a2565b50909161338e565b613441915060203d8111613447575b6134398183610fc2565b81019061152d565b5f613256565b503d61342f565b611000565b6134739060203d8111613478575b61346b8183610fc2565b810190611573565b6131c9565b503d613461565b611000565b6134a5915060203d81116134ab575b61349d8183610fc2565b81019061152d565b5f613151565b503d613493565b611000565b906134c3939291612fa5565b565b906134dd979695949392916134d8613bd0565b6134df565b565b906134f7979695949392916134f2613ad8565b613583565b6134ff613b3d565b565b5f7f775320756e77726170206661696c656400000000000000000000000000000000910152565b6135356010602092610e6d565b61353e81613501565b0190565b6135579060208101905f818303910152613528565b90565b1561356157565b61356961018c565b62461bcd60e51b81528061357f60048201613542565b0390fd5b93929690949591956135a961359787610f70565b866135a130611512565b908b92613c7d565b6135f160206135bf6135ba8a610f70565b611506565b6370a08231906135e66135d130611512565b926135da61018c565b95869485938493610feb565b8352600483016106c0565b03915afa9081156138e9575f916138bb575b509261361661361188610f70565b611506565b9060208a63095ea7b39361363e5f87939661364961363261018c565b98899687958694610feb565b845260048401611591565b03925af19384156138b6575f8094819461368a9761388a575b509261367861366f61018c565b938492836115da565b03925af1613684611084565b50611641565b6136d260206136a061369b88610f70565b611506565b6370a08231906136c76136b230611512565b926136bb61018c565b95869485938493610feb565b8352600483016106c0565b03915afa9182156138855761370d926136f2925f91613857575b506114e1565b91613706613700849261022e565b9161022e565b101561307d565b8361374061373a7f00000000000000000000000000000000000000000000000000000000000000006101a9565b916101a9565b145f1461383a576137786137737f0000000000000000000000000000000000000000000000000000000000000000610f88565b610f94565b91602063205c28789382906137a05f86976137ab61379461018c565b998a9687958694610feb565b845260048401611591565b03925af192831561383557613802936137cb915f91613807575b5061355a565b5b9293947faf0d0b3f0627a3fe52a22bdad10593df8d5ba3f0ed6d06f12333a3f62e17c750956137f961018c565b95869586610b01565b0390a1565b613828915060203d811161382e575b6138208183610fc2565b810190611573565b5f6137c5565b503d613816565b611000565b6138029161385261384a86610f70565b828491613b82565b6137cc565b613878915060203d811161387e575b6138708183610fc2565b81019061152d565b5f6136ec565b503d613866565b611000565b6138aa9060203d81116138af575b6138a28183610fc2565b810190611573565b613662565b503d613898565b611000565b6138dc915060203d81116138e2575b6138d48183610fc2565b81019061152d565b5f613603565b503d6138ca565b611000565b906138fe979695949392916134c5565b565b6139119061390c613bd0565b613913565b565b8061392e6139286139235f611a59565b6101a9565b916101a9565b1461393e5761393c90613c1e565b565b61396161394a5f611a59565b5f918291631e4fbdf760e01b8352600483016106c0565b0390fd5b61396e90613900565b565b6139a161399c7f0000000000000000000000000000000000000000000000000000000000000000610f88565b610f94565b63d0e30db0349190813b15613aa7575f916139c8916139be61018c565b9485938492610feb565b8252816139d7600482016101f6565b03925af18015613aa257613a76575b50613a3934613a33613a246139fd60033390610932565b7f000000000000000000000000000000000000000000000000000000000000000090610948565b91613a2e83610aa8565b61166a565b90610f32565b33347f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587491613a71613a6861018c565b92839283611591565b0390a1565b613a95905f3d8111613a9b575b613a8d8183610fc2565b810190610ff1565b5f6139e6565b503d613a83565b611000565b610fa0565b90565b613ac3613abe613ac892613aac565b6108fb565b61022e565b90565b613ad56002613aaf565b90565b613ae26001610aa8565b613afb613af5613af0613acb565b61022e565b9161022e565b14613b1457613b12613b0b613acb565b6001610f32565b565b5f633ee5aeb560e01b815280613b2c600482016101f6565b0390fd5b613b3a6001611b79565b90565b613b4f613b48613b30565b6001610f32565b565b63ffffffff1690565b63ffffffff60e01b1690565b613b7a613b75613b7f92613b51565b610feb565b613b5a565b90565b90613bc9613bce93613bba60049493613ba163a9059cbb919391613b66565b92613baa61018c565b9687946020860190815201611591565b60208201810382520383610fc2565b613ccd565b565b613bd8612522565b613bf1613beb613be6613d81565b6101a9565b916101a9565b03613bf857565b613c1a613c03613d81565b5f91829163118cdaa760e01b8352600483016106c0565b0390fd5b613c275f610a87565b613c31825f612216565b90613c65613c5f7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610926565b91610926565b91613c6e61018c565b80613c78816101f6565b0390a3565b600492613cb7613ccb9593613cc69394613c9e6323b872dd92949192613b66565b93613ca761018c565b978895602087019081520161112f565b60208201810382520383610fc2565b613ccd565b565b905f602091613cda611960565b50613ce3611960565b50828151910182855af115613d76573d5f5190613d08613d025f610e51565b9161022e565b145f14613d5c5750613d1981611506565b3b613d2c613d265f610e51565b9161022e565b145b613d355750565b613d41613d5891611506565b5f918291635274afe760e01b8352600483016106c0565b0390fd5b613d6f613d696001611b79565b9161022e565b1415613d2e565b6040513d5f823e3d90fd5b613d8961251e565b50339056fea26469706673582212202cda928d6a2af0c538c08b7717560f306458218b2468fdda2984eeb4914cc80b64736f6c634300081c0033000000000000000000000000023e6a00892c3211f7909a75559317356fdd025a000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38000000000000000000000000b61be3ae770f2af4f6b0cfc9febeb027b62178d0
Deployed Bytecode
0x6080604052600436101561001d575b36610e2f5761001b613970565b005b6100275f35610186565b8063117b26121461018157806325aec7501461017c57806331062eed146101775780634584eff6146101725780636805d6ad1461016d5780636ff1c9bc14610168578063715018a614610163578063756677a11461015e5780637c95cdc6146101595780638da5cb5b146101545780638f10a7f21461014f5780639d5755821461014a578063a849d64414610145578063ad5c464814610140578063adb519801461013b578063b3db428b14610136578063ca697db414610131578063d9caed121461012c578063dc4c46ab14610127578063e747d8b114610122578063eabc1bb71461011d5763f2fde38b0361000e57610dfc565b610dc7565b610cce565b610c0d565b610b87565b610b4e565b610a18565b6109a8565b6108c6565b61086d565b6107f5565b610782565b6106d5565b61067c565b6104fb565b6104c8565b610495565b61045f565b6103ff565b610386565b61031b565b6101fb565b60e01c90565b60405190565b5f80fd5b5f80fd5b5f80fd5b60018060a01b031690565b6101b29061019e565b90565b6101be816101a9565b036101c557565b5f80fd5b905035906101d6826101b5565b565b906020828203126101f1576101ee915f016101c9565b90565b610196565b5f0190565b346102295761021361020e3660046101d8565b611406565b61021b61018c565b80610225816101f6565b0390f35b610192565b90565b61023a8161022e565b0361024157565b5f80fd5b9050359061025282610231565b565b5f80fd5b5f80fd5b5f80fd5b909182601f8301121561029a5781359167ffffffffffffffff831161029557602001926001830284011161029057565b61025c565b610258565b610254565b9160c083830312610316576102b6825f85016101c9565b926102c483602083016101c9565b926102d281604084016101c9565b926102e08260608501610245565b926102ee83608083016101c9565b9260a082013567ffffffffffffffff81116103115761030d9201610260565b9091565b61019a565b610196565b346103505761033a61032e36600461029f565b9594909493919361194f565b61034261018c565b8061034c816101f6565b0390f35b610192565b5f91031261035f57565b610196565b61036d9061022e565b9052565b9190610384905f60208501940190610364565b565b346103b657610396366004610355565b6103b26103a1611964565b6103a961018c565b91829182610371565b0390f35b610192565b90565b6103c7816103bb565b036103ce57565b5f80fd5b905035906103df826103be565b565b906020828203126103fa576103f7915f016103d2565b90565b610196565b3461042d576104176104123660046103e1565b611d0c565b61041f61018c565b80610429816101f6565b0390f35b610192565b919060408382031261045a578061044e610457925f86016101c9565b936020016101c9565b90565b610196565b346104905761048c61047b610475366004610432565b90611f12565b61048361018c565b91829182610371565b0390f35b610192565b346104c3576104ad6104a83660046101d8565b612129565b6104b561018c565b806104bf816101f6565b0390f35b610192565b346104f6576104d8366004610355565b6104e0612159565b6104e861018c565b806104f2816101f6565b0390f35b610192565b346105295761051361050e3660046101d8565b612268565b61051b61018c565b80610525816101f6565b0390f35b610192565b9190604083820312610556578061054a610553925f8601610245565b93602001610245565b90565b610196565b5190565b60209181520190565b60200190565b610577906103bb565b9052565b610584906101a9565b9052565b6105919061022e565b9052565b906080806105ed936105ad5f8201515f86019061056e565b6105bf6020820151602086019061057b565b6105d16040820151604086019061057b565b6105e360608201516060860190610588565b0151910190610588565b565b906105fc8160a093610595565b0190565b60200190565b9061062361061d6106168461055b565b809361055f565b92610568565b905f5b8181106106335750505090565b90919261064c61064660019286516105ef565b94610600565b9101919091610626565b9291602061067261067a9360408701908782035f890152610606565b940190610364565b565b346106ae5761069561068f36600461052e565b9061239f565b906106aa6106a161018c565b92839283610656565b0390f35b610192565b6106bc906101a9565b9052565b91906106d3905f602085019401906106b3565b565b34610705576106e5366004610355565b6107016106f0612522565b6106f861018c565b918291826106c0565b0390f35b610192565b919060a08382031261075b57610722815f85016101c9565b9261073082602083016101c9565b9261075861074184604085016101c9565b9361074f8160608601610245565b93608001610245565b90565b610196565b610769906103bb565b9052565b9190610780905f60208501940190610760565b565b346107b6576107b26107a161079836600461070a565b939290926128ed565b6107a961018c565b9182918261076d565b0390f35b610192565b90916060828403126107f0576107ed6107d6845f85016101c9565b936107e48160208601610245565b936040016101c9565b90565b610196565b346108245761080e6108083660046107bb565b91612af6565b61081661018c565b80610820816101f6565b0390f35b610192565b1c90565b60018060a01b031690565b61084890600861084d9302610829565b61082d565b90565b9061085b9154610838565b90565b61086a60025f90610850565b90565b3461089d5761087d366004610355565b61089961088861085e565b61089061018c565b918291826106c0565b0390f35b610192565b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3890565b346108f6576108d6366004610355565b6108f26108e16108a2565b6108e961018c565b918291826106c0565b0390f35b610192565b90565b61091261090d6109179261019e565b6108fb565b61019e565b90565b610923906108fe565b90565b61092f9061091a565b90565b9061093c90610926565b5f5260205260405f2090565b9061095290610926565b5f5260205260405f2090565b90565b6109719060086109769302610829565b61095e565b90565b906109849154610961565b90565b6109a06109a59261099b6003935f94610932565b610948565b610979565b90565b346109d9576109d56109c46109be366004610432565b90610987565b6109cc61018c565b91829182610371565b0390f35b610192565b9091606082840312610a1357610a106109f9845f85016101c9565b93610a0781602086016101c9565b93604001610245565b90565b610196565b34610a4757610a31610a2b3660046109de565b91612bcd565b610a3961018c565b80610a43816101f6565b0390f35b610192565b610a55906103bb565b90565b90610a6290610a4c565b5f5260205260405f2090565b5f1c90565b610a7f610a8491610a6e565b61082d565b90565b610a919054610a73565b90565b610aa0610aa591610a6e565b61095e565b90565b610ab29054610a94565b90565b610ac0906004610a58565b610acb5f8201610a87565b91610ad860018301610a87565b91610ae560028201610a87565b91610afe6004610af760038501610aa8565b9301610aa8565b90565b90959492610b4c94610b3b610b4592610b31608096610b2760a088019c5f8901906106b3565b60208701906106b3565b60408501906106b3565b6060830190610364565b0190610364565b565b34610b8257610b7e610b69610b643660046103e1565b610ab5565b91610b7595939561018c565b95869586610b01565b0390f35b610192565b34610bb657610ba0610b9a3660046109de565b91612f16565b610ba861018c565b80610bb2816101f6565b0390f35b610192565b91606083830312610c0857610bd2825f85016103d2565b92610be083602083016101c9565b92604082013567ffffffffffffffff8111610c0357610bff9201610260565b9091565b61019a565b610196565b34610c3f57610c29610c20366004610bbb565b929190916134b7565b610c3161018c565b80610c3b816101f6565b0390f35b610192565b9060e082820312610cc957610c5b815f84016101c9565b92610c6982602085016101c9565b92610c7783604083016101c9565b92610c858160608401610245565b92610c938260808501610245565b92610ca18360a083016101c9565b9260c082013567ffffffffffffffff8111610cc457610cc09201610260565b9091565b61019a565b610196565b34610d0657610cf0610ce1366004610c44565b969590959491949392936138ee565b610cf861018c565b80610d02816101f6565b0390f35b610192565b90602082820312610d2457610d21915f01610245565b90565b610196565b634e487b7160e01b5f52603260045260245ffd5b5490565b5f5260205f2090565b610d5381610d3d565b821015610d6d57610d65600191610d41565b910201905f90565b610d29565b90565b610d85906008610d8a9302610829565b610d72565b90565b90610d989154610d75565b90565b6005610da681610d3d565b821015610dc357610dc091610dba91610d4a565b90610d8d565b90565b5f80fd5b34610df757610df3610de2610ddd366004610d0b565b610d9b565b610dea61018c565b9182918261076d565b0390f35b610192565b34610e2a57610e14610e0f3660046101d8565b613965565b610e1c61018c565b80610e26816101f6565b0390f35b610192565b5f80fd5b610e4490610e3f613ad8565b611161565b610e4c613b3d565b565b90565b610e65610e60610e6a92610e4e565b6108fb565b61022e565b90565b60209181520190565b5f7f4e6f2062616c616e636520746f20776974686472617700000000000000000000910152565b610eaa6016602092610e6d565b610eb381610e76565b0190565b610ecc9060208101905f818303910152610e9d565b90565b15610ed657565b610ede61018c565b62461bcd60e51b815280610ef460048201610eb7565b0390fd5b5f1b90565b90610f095f1991610ef8565b9181191691161790565b610f27610f22610f2c9261022e565b6108fb565b61022e565b90565b90565b90610f47610f42610f4e92610f13565b610f2f565b8254610efd565b9055565b6001610f5e910161022e565b90565b90565b610f6d906108fe565b90565b610f7990610f64565b90565b610f85906108fe565b90565b610f9190610f7c565b90565b610f9d9061091a565b90565b5f80fd5b601f801991011690565b634e487b7160e01b5f52604160045260245ffd5b90610fcc90610fa4565b810190811067ffffffffffffffff821117610fe657604052565b610fae565b60e01b90565b5f910312610ffb57565b610196565b61100861018c565b3d5f823e3d90fd5b905090565b6110205f8092611010565b0190565b61102d90611015565b90565b9061104361103c61018c565b9283610fc2565b565b67ffffffffffffffff81116110635761105f602091610fa4565b0190565b610fae565b9061107a61107583611045565b611030565b918252565b606090565b3d5f1461109f576110943d611068565b903d5f602084013e5b565b6110a761107f565b9061109d565b5f7f455448207472616e73666572206661696c656400000000000000000000000000910152565b6110e16013602092610e6d565b6110ea816110ad565b0190565b6111039060208101905f8183039101526110d4565b90565b1561110d57565b61111561018c565b62461bcd60e51b81528061112b600482016110ee565b0390fd5b60409061115861115f949695939661114e60608401985f8501906106b3565b60208301906106b3565b0190610364565b565b61117f61117a61117360033390610932565b8390610948565b610aa8565b9061119c826111966111905f610e51565b9161022e565b11610ecf565b6111c36111a85f610e51565b6111be6111b760033390610932565b8490610948565b610f32565b6111cc5f610e51565b5b806111e96111e36111de6005610d3d565b61022e565b9161022e565b10156112985761124b9061121b611216600461121061120a60058690610d4a565b90610d8d565b90610a58565b610f61565b6112265f8201610a87565b611238611232336101a9565b916101a9565b149081611272575b50611250575b610f52565b6111cd565b61126d61126861126260058490610d4a565b90610d8d565b611d0c565b611246565b61127f9150600101610a87565b61129161128b856101a9565b916101a9565b145f611240565b5090816112cd6112c77f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386101a9565b916101a9565b145f146113ed576113056113007f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38610f88565b610f94565b632e1a7d4d82823b156113e85761133b926113305f809461132461018c565b96879586948593610feb565b835260048301610371565b03925af180156113e3576113b7575b506113775f80338461135a61018c565b908161136581611024565b03925af1611371611084565b50611106565b5b339190916113b27fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb936113a961018c565b9384938461112f565b0390a1565b6113d6905f3d81116113dc575b6113ce8183610fc2565b810190610ff1565b5f61134a565b503d6113c4565b611000565b610fa0565b6114016113f983610f70565b338391613b82565b611378565b61140f90610e33565b565b90611428969594939291611423613bd0565b61142a565b565b9061144196959493929161143c613ad8565b61168f565b611449613b3d565b565b5f7f496e73756666696369656e742062616c616e6365000000000000000000000000910152565b61147f6014602092610e6d565b6114888161144b565b0190565b6114a19060208101905f818303910152611472565b90565b156114ab57565b6114b361018c565b62461bcd60e51b8152806114c96004820161148c565b0390fd5b634e487b7160e01b5f52601160045260245ffd5b6114f06114f69193929361022e565b9261022e565b820391821161150157565b6114cd565b61150f9061091a565b90565b61151b9061091a565b90565b9050519061152b82610231565b565b9060208282031261154657611543915f0161151e565b90565b610196565b151590565b6115598161154b565b0361156057565b5f80fd5b9050519061157182611550565b565b9060208282031261158c57611589915f01611564565b90565b610196565b9160206115b29294936115ab60408201965f8301906106b3565b0190610364565b565b90825f939282370152565b9091826115cf816115d693611010565b80936115b4565b0190565b90916115e5926115bf565b90565b5f7f53776170206661696c6564000000000000000000000000000000000000000000910152565b61161c600b602092610e6d565b611625816115e8565b0190565b61163e9060208101905f81830391015261160f565b90565b1561164857565b61165061018c565b62461bcd60e51b81528061166660048201611629565b0390fd5b61167961167f9193929361022e565b9261022e565b820180921161168a57565b6114cd565b9194929590936116cf6116b66116b16116aa60038790610932565b8890610948565b610aa8565b6116c86116c28a61022e565b9161022e565b10156114a4565b611701876116fb6116ec6116e560038890610932565b8990610948565b916116f683610aa8565b6114e1565b90610f32565b611749602061171761171289610f70565b611506565b6370a082319061173e61172930611512565b9261173261018c565b95869485938493610feb565b8352600483016106c0565b03915afa90811561194a575f9161191c575b509361176e61176987610f70565b611506565b90602063095ea7b39284906117965f8d966117a161178a61018c565b98899687958694610feb565b845260048401611591565b03925af1938415611917575f809481946117e2976118eb575b50926117d06117c761018c565b938492836115da565b03925af16117dc611084565b50611641565b61182a60206117f86117f387610f70565b611506565b6370a082319061181f61180a30611512565b9261181361018c565b95869485938493610feb565b8352600483016106c0565b03915afa9283156118e6576118b39361184a925f916118b8575b506114e1565b9061187d8261187761186861186160038690610932565b8990610948565b9161187283610aa8565b61166a565b90610f32565b9293947f764f0dc063c06f32d89a3f3af80c0db4be8a090901f589a478b447e0a51f09f1956118aa61018c565b95869586610b01565b0390a1565b6118d9915060203d81116118df575b6118d18183610fc2565b81019061152d565b5f611844565b503d6118c7565b611000565b61190b9060203d8111611910575b6119038183610fc2565b810190611573565b6117ba565b503d6118f9565b611000565b61193d915060203d8111611943575b6119358183610fc2565b81019061152d565b5f61175b565b503d61192b565b611000565b9061195e969594939291611411565b565b5f90565b61196c611960565b506119776005610d3d565b90565b90611984906101a9565b9052565b906119929061022e565b9052565b6119a060a0611030565b90565b90611a22611a1960046119b4611996565b946119cb6119c35f8301610a87565b5f880161197a565b6119e36119da60018301610a87565b6020880161197a565b6119fb6119f260028301610a87565b6040880161197a565b611a13611a0a60038301610aa8565b60608801611988565b01610aa8565b60808401611988565b565b611a2d906119a3565b90565b611a3a90516101a9565b90565b611a51611a4c611a5692610e4e565b6108fb565b61019e565b90565b611a6290611a3d565b90565b5f7f4f7264657220646f6573206e6f74206578697374000000000000000000000000910152565b611a996014602092610e6d565b611aa281611a65565b0190565b611abb9060208101905f818303910152611a8c565b90565b15611ac557565b611acd61018c565b62461bcd60e51b815280611ae360048201611aa6565b0390fd5b5f7f556e617574686f72697a65640000000000000000000000000000000000000000910152565b611b1b600c602092610e6d565b611b2481611ae7565b0190565b611b3d9060208101905f818303910152611b0e565b90565b15611b4757565b611b4f61018c565b62461bcd60e51b815280611b6560048201611b28565b0390fd5b611b73905161022e565b90565b90565b611b8d611b88611b9292611b76565b6108fb565b61022e565b90565b1b90565b91906008611bb4910291611bae5f1984611b95565b92611b95565b9181191691161790565b611bc790610a6e565b90565b9190611be0611bdb611be893610a4c565b611bbe565b908354611b99565b9055565b90565b634e487b7160e01b5f52603160045260245ffd5b5490565b5f5260205f2090565b611c1981611c03565b821015611c3357611c2b600191611c07565b910201905f90565b610d29565b5f90565b611c4e91611c48611c38565b91611bca565b565b611c5981611c03565b8015611c7a576001900390611c77611c718383611c10565b90611c3c565b55565b611bef565b9190611c95611c90611c9d93610f13565b610f2f565b908354611b99565b9055565b611cb391611cad611960565b91611c7f565b565b5f6004611ce0928280820155826001820155826002820155611cda8360038301611ca1565b01611ca1565b565b634e487b7160e01b5f525f60045260245ffd5b905f03611d0757611d0590611cb5565b565b611ce2565b611dcd611d23611d1e60048490610a58565b611a24565b611d52611d315f8301611a30565b611d4b611d45611d405f611a59565b6101a9565b916101a9565b1415611abe565b33611d6c611d66611d61612522565b6101a9565b916101a9565b148015611ee9575b611d7d90611b40565b611dc7611db8611d8f60608401611b69565b92611db26020611dab6003611da55f8601611a30565b90610932565b9201611a30565b90610948565b91611dc283610aa8565b61166a565b90610f32565b611dd65f610e51565b5b80611df3611ded611de86005610d3d565b61022e565b9161022e565b1015611ee357611e0e611e0860058390610d4a565b90610d8d565b611e20611e1a846103bb565b916103bb565b14611e3357611e2e90610f52565b611dd7565b611e7990611e73611e6b611e656005611e5f611e4f6005610d3d565b611e596001611b79565b906114e1565b90610d4a565b90610d8d565b916005610d4a565b90611bca565b611e8b611e866005611bec565b611c50565b5b611ea15f611e9c60048490610a58565b611cf5565b611ecb7f575e1bd37dd781403bf952371b71926fd0d9bd7e5d82b1b7989371d3d935fec891610a4c565b90611ed461018c565b80611ede816101f6565b0390a2565b50611e8c565b50611d7d33611f0a611f04611eff5f8601611a30565b6101a9565b916101a9565b149050611d74565b611f3791611f2d611f3292611f25611960565b506003610932565b610948565b610aa8565b90565b611f4b90611f46613bd0565b611f4d565b565b80611f80611f7a7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386101a9565b916101a9565b145f146120785750611f9130611512565b31611fc3611fbe7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38610f88565b610f94565b632e1a7d4d82823b1561207357611ff992611fee5f8094611fe261018c565b96879586948593610feb565b835260048301610371565b03925af1801561206e5761203f925f928392612042575b50612019612522565b9061202261018c565b908161202d81611024565b03925af1612039611084565b50611106565b5b565b61206190833d8111612067575b6120598183610fc2565b810190610ff1565b5f612010565b503d61204f565b611000565b610fa0565b806120856120d392610f70565b9060206120a161209c612096612522565b93610f70565b611506565b6370a08231906120c86120b330611512565b926120bc61018c565b97889485938493610feb565b8352600483016106c0565b03915afa918215612124576120ef935f936120f4575b50613b82565b612040565b61211691935060203d811161211d575b61210e8183610fc2565b81019061152d565b915f6120e9565b503d612104565b611000565b61213290611f3a565b565b61213c613bd0565b612144612146565b565b6121576121525f611a59565b613c1e565b565b612161612134565b565b6121749061216f613bd0565b612236565b565b5f7f496e76616c6964206578656375746f7220616464726573730000000000000000910152565b6121aa6018602092610e6d565b6121b381612176565b0190565b6121cc9060208101905f81830391015261219d565b90565b156121d657565b6121de61018c565b62461bcd60e51b8152806121f4600482016121b7565b0390fd5b9061220960018060a01b0391610ef8565b9181191691161790565b90565b9061222b61222661223292610926565b612213565b82546121f8565b9055565b6122669061225f8161225861225261224d5f611a59565b6101a9565b916101a9565b14156121cf565b6002612216565b565b61227190612163565b565b606090565b67ffffffffffffffff81116122905760208091020190565b610fae565b906122a76122a283612278565b611030565b918252565b6122b660a0611030565b90565b5f90565b5f90565b5f90565b6122cd6122ac565b90602080808080866122dd6122b9565b8152016122e86122bd565b8152016122f36122bd565b8152016122fe6122c1565b8152016123096122c1565b81525050565b6123176122c5565b90565b5f5b82811061232857505050565b60209061233361230f565b818401520161231c565b9061236261234a83612295565b926020806123588693612278565b920191039061231a565b565b61236e60a0611030565b90565b9061237b906103bb565b9052565b906123898261055b565b81101561239a576020809102010190565b610d29565b916123a8612273565b506123b1611960565b506123bc6005610d3d565b6123c6838561166a565b6123d86123d28361022e565b9161022e565b116124e2575b6123e78361233d565b916123f15f610e51565b5b806124056123ff8761022e565b9161022e565b10156124d9576124d4906124cd61243061242a6124238a859061166a565b6005610d4a565b90610d8d565b6124ba61244761244260048490610a58565b611a24565b6124b161245660208301611a30565b916124a861246660408301611a30565b61249f612481608061247a60608701611b69565b9501611b69565b9561249661248d612364565b995f8b01612371565b6020890161197a565b6040870161197a565b60608501611988565b60808301611988565b8683916124c7838361237f565b5261237f565b5150610f52565b6123f2565b50925092509190565b8092506124f76124f18561022e565b9161022e565b115f14612510576125098284906114e1565b5b916123de565b6125195f610e51565b61250a565b5f90565b61252a61251e565b506125345f610a87565b90565b9061254d9594939291612548613bd0565b612747565b90565b60601b90565b61255f90612550565b90565b61256b90612556565b90565b61257a61257f916101a9565b612562565b9052565b90565b6125926125979161022e565b612583565b9052565b6125eb946125db60146020999895966125d3828c996125cb82896125c38e9b6125e39d61256e565b01809261256e565b01809261256e565b018092612586565b018092612586565b018092612586565b0190565b60200190565b5190565b5f7f4f7264657220494420636f6c6c6973696f6e0000000000000000000000000000910152565b61262d6012602092610e6d565b612636816125f9565b0190565b61264f9060208101905f818303910152612620565b90565b1561265957565b61266161018c565b62461bcd60e51b8152806126776004820161263a565b0390fd5b61268560a0611030565b90565b906126fe60806004612704946126ab5f82016126a55f8801611a30565b90612216565b6126c4600182016126be60208801611a30565b90612216565b6126dd600282016126d760408801611a30565b90612216565b6126f6600382016126f060608801611b69565b90610f32565b019201611b69565b90610f32565b565b9061271091612688565b565b9081549168010000000000000000831015612742578261273a91600161274095018155611c10565b90611bca565b565b610fae565b929190925061278661276d61276861276160038790610932565b8490610948565b610aa8565b61277f6127798761022e565b9161022e565b10156114a4565b6128e7836127bb83916127ac86898b9042926127a061018c565b9788966020880161259b565b60208201810382520382610fc2565b6127cd6127c7826125f5565b916125ef565b20956128016127e960036127e360048b90610a58565b01610aa8565b6127fb6127f55f610e51565b9161022e565b14612652565b6128608561284f856128468861283d8c91612834899561282b61282261267b565b995f8b0161197a565b6020890161197a565b6040870161197a565b60608501611988565b60808301611988565b61285b60048a90610a58565b612706565b61287461286d6005611bec565b8890612712565b6128a6866128a061289161288a60038a90610932565b8790610948565b9161289b83610aa8565b6114e1565b90610f32565b86949293956128d57f7603cff60dc3d7d1025c12f1b8ade67aa4b048ccf2c115ac624b5cbfdfe9759496610a4c565b966128de61018c565b95869586610b01565b0390a290565b90612902949392916128fd611c38565b612537565b90565b906129189291612913613ad8565b612a26565b612920613b3d565b565b5f7f496e76616c696420746f6b656e20616464726573730000000000000000000000910152565b6129566015602092610e6d565b61295f81612922565b0190565b6129789060208101905f818303910152612949565b90565b1561298257565b61298a61018c565b62461bcd60e51b8152806129a060048201612963565b0390fd5b5f7f416d6f756e74206d7573742062652067726561746572207468616e2030000000910152565b6129d8601d602092610e6d565b6129e1816129a4565b0190565b6129fa9060208101905f8183039101526129cb565b90565b15612a0457565b612a0c61018c565b62461bcd60e51b815280612a22600482016129e5565b0390fd5b91612a4c83612a45612a3f612a3a5f611a59565b6101a9565b916101a9565b141561297b565b612a6882612a62612a5c5f610e51565b9161022e565b116129fd565b612a86612a7484610f70565b33612a7e30611512565b908592613c7d565b612ab882612ab2612aa3612a9c60038690610932565b8790610948565b91612aad83610aa8565b61166a565b90610f32565b919091612af17fa83965f0e7c5e026e57c9ba2dd91e4ebcca352f2d514498c1e9ed23ba653860093612ae861018c565b9384938461112f565b0390a1565b90612b019291612905565b565b90612b169291612b11613bd0565b612b18565b565b90612b2b9291612b26613ad8565b612b35565b612b33613b3d565b565b919091612b5d83612b56612b50612b4b5f611a59565b6101a9565b916101a9565b141561297b565b612b8f82612b89612b7a612b7360038690610932565b8790610948565b91612b8483610aa8565b61166a565b90610f32565b919091612bc87f8752a472e571a816aea92eec8dae9baf628e840f4929fbcc2d155e6233ff68a793612bbf61018c565b9384938461112f565b0390a1565b90612bd89291612b03565b565b90612bed9291612be8613bd0565b612bef565b565b90612c029291612bfd613ad8565b612c8e565b612c0a613b3d565b565b5f7f57455448207769746864726177616c206661696c656400000000000000000000910152565b612c406016602092610e6d565b612c4981612c0c565b0190565b612c629060208101905f818303910152612c33565b90565b15612c6c57565b612c7461018c565b62461bcd60e51b815280612c8a60048201612c4d565b0390fd5b90612cc9612cb0612cab612ca460038690610932565b8490610948565b610aa8565b612cc2612cbc8661022e565b9161022e565b10156114a4565b612cfb83612cf5612ce6612cdf60038790610932565b8590610948565b91612cf083610aa8565b6114e1565b90610f32565b612d045f610e51565b5b80612d21612d1b612d166005610d3d565b61022e565b9161022e565b1015612dd057612d8390612d53612d4e6004612d48612d4260058690610d4a565b90610d8d565b90610a58565b610f61565b612d5e5f8201610a87565b612d70612d6a876101a9565b916101a9565b149081612daa575b50612d88575b610f52565b612d05565b612da5612da0612d9a60058490610d4a565b90610d8d565b611d0c565b612d7e565b612db79150600101610a87565b612dc9612dc3856101a9565b916101a9565b145f612d78565b50919082612e06612e007f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386101a9565b916101a9565b145f14612efd57612e3e612e397f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38610f88565b610f94565b602063205c2878918390612e655f8795612e70612e5961018c565b97889687958694610feb565b845260048401611591565b03925af18015612ef857612e8b915f91612eca575b50612c65565b5b919091612ec57fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb93612ebc61018c565b9384938461112f565b0390a1565b612eeb915060203d8111612ef1575b612ee38183610fc2565b810190611573565b5f612e85565b503d612ed9565b611000565b612f11612f0984610f70565b828491613b82565b612e8c565b90612f219291612bda565b565b5f7f4e6f7420617574686f72697a6564000000000000000000000000000000000000910152565b612f57600e602092610e6d565b612f6081612f23565b0190565b612f799060208101905f818303910152612f4a565b90565b15612f8357565b612f8b61018c565b62461bcd60e51b815280612fa160048201612f64565b0390fd5b90612fdc93929133612fc6612fc0612fbb612522565b6101a9565b916101a9565b148015612fde575b612fd790612f7c565b613006565b565b50612fd733612ffe612ff8612ff36002610a87565b6101a9565b916101a9565b149050612fce565b9061301a939291613015613ad8565b6130a6565b613022613b3d565b565b5f7f496e73756666696369656e74206f757470757420616d6f756e74000000000000910152565b613058601a602092610e6d565b61306181613024565b0190565b61307a9060208101905f81830391015261304b565b90565b1561308457565b61308c61018c565b62461bcd60e51b8152806130a260048201613065565b0390fd5b92906130bc6130b760048690610a58565b611a24565b926130ec6130cb5f8601611a30565b6130e56130df6130da5f611a59565b6101a9565b916101a9565b1415611abe565b61313f602061310d61310861310360408901611a30565b610f70565b611506565b6370a082319061313461311f30611512565b9261312861018c565b95869485938493610feb565b8352600483016106c0565b03915afa9081156134b2575f91613484575b509161316f61316a61316560208801611a30565b610f70565b611506565b602063095ea7b39183906131a15f61318960608c01611b69565b956131ac61319561018c565b97889687958694610feb565b845260048401611591565b03925af192831561347f57613241955f809481946131f197613453575b50926131df6131d661018c565b938492836115da565b03925af16131eb611084565b50611641565b602061320f61320a61320560408701611a30565b610f70565b611506565b6370a082319061323661322130611512565b9261322a61018c565b96879485938493610feb565b8352600483016106c0565b03915afa801561344e5761325c925f91613420575b506114e1565b6132848161327d61327761327260808701611b69565b61022e565b9161022e565b101561307d565b6132cb816132c56132b66132a4600361329e5f8901611a30565b90610932565b6132b060408801611a30565b90610948565b916132c083610aa8565b61166a565b90610f32565b6132d45f610e51565b5b806132f16132eb6132e66005610d3d565b61022e565b9161022e565b10156134185761330c61330660058390610d4a565b90610d8d565b61331e613318866103bb565b916103bb565b146133315761332c90610f52565b6132d5565b61337b9061337561336d6133676005979596976133616133516005610d3d565b61335b6001611b79565b906114e1565b90610d4a565b90610d8d565b916005610d4a565b90611bca565b61338d6133886005611bec565b611c50565b5b6133a35f61339e60048490610a58565b611cf5565b906133af5f8401611a30565b6134136133be60208601611a30565b926133d760606133d060408901611a30565b9701611b69565b6134017f2edad8618ac6f3343f778b8dab83cf8b9805b60a8bd146c61a0ee0b49f0e19db96610a4c565b9661340a61018c565b95869586610b01565b0390a2565b50909161338e565b613441915060203d8111613447575b6134398183610fc2565b81019061152d565b5f613256565b503d61342f565b611000565b6134739060203d8111613478575b61346b8183610fc2565b810190611573565b6131c9565b503d613461565b611000565b6134a5915060203d81116134ab575b61349d8183610fc2565b81019061152d565b5f613151565b503d613493565b611000565b906134c3939291612fa5565b565b906134dd979695949392916134d8613bd0565b6134df565b565b906134f7979695949392916134f2613ad8565b613583565b6134ff613b3d565b565b5f7f775320756e77726170206661696c656400000000000000000000000000000000910152565b6135356010602092610e6d565b61353e81613501565b0190565b6135579060208101905f818303910152613528565b90565b1561356157565b61356961018c565b62461bcd60e51b81528061357f60048201613542565b0390fd5b93929690949591956135a961359787610f70565b866135a130611512565b908b92613c7d565b6135f160206135bf6135ba8a610f70565b611506565b6370a08231906135e66135d130611512565b926135da61018c565b95869485938493610feb565b8352600483016106c0565b03915afa9081156138e9575f916138bb575b509261361661361188610f70565b611506565b9060208a63095ea7b39361363e5f87939661364961363261018c565b98899687958694610feb565b845260048401611591565b03925af19384156138b6575f8094819461368a9761388a575b509261367861366f61018c565b938492836115da565b03925af1613684611084565b50611641565b6136d260206136a061369b88610f70565b611506565b6370a08231906136c76136b230611512565b926136bb61018c565b95869485938493610feb565b8352600483016106c0565b03915afa9182156138855761370d926136f2925f91613857575b506114e1565b91613706613700849261022e565b9161022e565b101561307d565b8361374061373a7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386101a9565b916101a9565b145f1461383a576137786137737f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38610f88565b610f94565b91602063205c28789382906137a05f86976137ab61379461018c565b998a9687958694610feb565b845260048401611591565b03925af192831561383557613802936137cb915f91613807575b5061355a565b5b9293947faf0d0b3f0627a3fe52a22bdad10593df8d5ba3f0ed6d06f12333a3f62e17c750956137f961018c565b95869586610b01565b0390a1565b613828915060203d811161382e575b6138208183610fc2565b810190611573565b5f6137c5565b503d613816565b611000565b6138029161385261384a86610f70565b828491613b82565b6137cc565b613878915060203d811161387e575b6138708183610fc2565b81019061152d565b5f6136ec565b503d613866565b611000565b6138aa9060203d81116138af575b6138a28183610fc2565b810190611573565b613662565b503d613898565b611000565b6138dc915060203d81116138e2575b6138d48183610fc2565b81019061152d565b5f613603565b503d6138ca565b611000565b906138fe979695949392916134c5565b565b6139119061390c613bd0565b613913565b565b8061392e6139286139235f611a59565b6101a9565b916101a9565b1461393e5761393c90613c1e565b565b61396161394a5f611a59565b5f918291631e4fbdf760e01b8352600483016106c0565b0390fd5b61396e90613900565b565b6139a161399c7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38610f88565b610f94565b63d0e30db0349190813b15613aa7575f916139c8916139be61018c565b9485938492610feb565b8252816139d7600482016101f6565b03925af18015613aa257613a76575b50613a3934613a33613a246139fd60033390610932565b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3890610948565b91613a2e83610aa8565b61166a565b90610f32565b33347f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587491613a71613a6861018c565b92839283611591565b0390a1565b613a95905f3d8111613a9b575b613a8d8183610fc2565b810190610ff1565b5f6139e6565b503d613a83565b611000565b610fa0565b90565b613ac3613abe613ac892613aac565b6108fb565b61022e565b90565b613ad56002613aaf565b90565b613ae26001610aa8565b613afb613af5613af0613acb565b61022e565b9161022e565b14613b1457613b12613b0b613acb565b6001610f32565b565b5f633ee5aeb560e01b815280613b2c600482016101f6565b0390fd5b613b3a6001611b79565b90565b613b4f613b48613b30565b6001610f32565b565b63ffffffff1690565b63ffffffff60e01b1690565b613b7a613b75613b7f92613b51565b610feb565b613b5a565b90565b90613bc9613bce93613bba60049493613ba163a9059cbb919391613b66565b92613baa61018c565b9687946020860190815201611591565b60208201810382520383610fc2565b613ccd565b565b613bd8612522565b613bf1613beb613be6613d81565b6101a9565b916101a9565b03613bf857565b613c1a613c03613d81565b5f91829163118cdaa760e01b8352600483016106c0565b0390fd5b613c275f610a87565b613c31825f612216565b90613c65613c5f7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610926565b91610926565b91613c6e61018c565b80613c78816101f6565b0390a3565b600492613cb7613ccb9593613cc69394613c9e6323b872dd92949192613b66565b93613ca761018c565b978895602087019081520161112f565b60208201810382520383610fc2565b613ccd565b565b905f602091613cda611960565b50613ce3611960565b50828151910182855af115613d76573d5f5190613d08613d025f610e51565b9161022e565b145f14613d5c5750613d1981611506565b3b613d2c613d265f610e51565b9161022e565b145b613d355750565b613d41613d5891611506565b5f918291635274afe760e01b8352600483016106c0565b0390fd5b613d6f613d696001611b79565b9161022e565b1415613d2e565b6040513d5f823e3d90fd5b613d8961251e565b50339056fea26469706673582212202cda928d6a2af0c538c08b7717560f306458218b2468fdda2984eeb4914cc80b64736f6c634300081c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000023e6a00892c3211f7909a75559317356fdd025a000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38000000000000000000000000b61be3ae770f2af4f6b0cfc9febeb027b62178d0
-----Decoded View---------------
Arg [0] : initialOwner (address): 0x023E6a00892C3211f7909a75559317356FdD025a
Arg [1] : _weth (address): 0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38
Arg [2] : initialExecutor (address): 0xB61be3aE770f2Af4f6B0CfC9FebeB027B62178D0
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000023e6a00892c3211f7909a75559317356fdd025a
Arg [1] : 000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38
Arg [2] : 000000000000000000000000b61be3ae770f2af4f6b0cfc9febeb027b62178d0
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
SONIC | 100.00% | $0.434207 | 40.3957 | $17.54 |
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.