Source Code
Latest 19 from a total of 19 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Add Operator | 22573744 | 289 days ago | IN | 0 ETH | 0.00007553 | ||||
| Execute Erc20Tra... | 22534111 | 294 days ago | IN | 0 ETH | 0.00010459 | ||||
| Execute Erc20Tra... | 22534013 | 294 days ago | IN | 0 ETH | 0.00011111 | ||||
| Execute Erc20Tra... | 22519234 | 296 days ago | IN | 0 ETH | 0.00012213 | ||||
| Execute Erc20Tra... | 22481504 | 302 days ago | IN | 0 ETH | 0.0089408 | ||||
| Execute Erc20Tra... | 22475413 | 303 days ago | IN | 0 ETH | 0.00445911 | ||||
| Grant Role | 22435751 | 308 days ago | IN | 0 ETH | 0.00011168 | ||||
| Execute Erc20Tra... | 22420456 | 310 days ago | IN | 0 ETH | 0.00044205 | ||||
| Execute Erc20Tra... | 22420297 | 310 days ago | IN | 0.00324925 ETH | 0.00009005 | ||||
| Execute Erc20Tra... | 22420266 | 310 days ago | IN | 0.00304987 ETH | 0.00008136 | ||||
| Execute Erc20Tra... | 22420220 | 310 days ago | IN | 0.00325196 ETH | 0.00008571 | ||||
| Execute Erc20Tra... | 22420145 | 310 days ago | IN | 0 ETH | 0.00049427 | ||||
| Execute Erc20Tra... | 22420071 | 310 days ago | IN | 0 ETH | 0.00035463 | ||||
| Execute Erc20Tra... | 22420041 | 310 days ago | IN | 0 ETH | 0.0003728 | ||||
| Execute Erc20Tra... | 22420017 | 310 days ago | IN | 0 ETH | 0.00041617 | ||||
| Execute Erc20Tra... | 22419989 | 310 days ago | IN | 0.0032421 ETH | 0.00014331 | ||||
| Execute Erc20Tra... | 22419830 | 310 days ago | IN | 0 ETH | 0.00046022 | ||||
| Execute Erc20Tra... | 22419796 | 310 days ago | IN | 0.00304645 ETH | 0.000101 | ||||
| Execute Erc20Tra... | 22419684 | 310 days ago | IN | 0.00304131 ETH | 0.00009143 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 22534196 | 294 days ago | 0.00000821 ETH | ||||
| Transfer | 22534196 | 294 days ago | 0.00000821 ETH | ||||
| Deposit | 22534196 | 294 days ago | 0.00082885 ETH | ||||
| Execute Erc20Tra... | 22534196 | 294 days ago | 0.00082885 ETH | ||||
| Transfer | 22534109 | 294 days ago | 0.00002018 ETH | ||||
| Transfer | 22534109 | 294 days ago | 0.00002018 ETH | ||||
| Deposit | 22534109 | 294 days ago | 0.00203836 ETH | ||||
| Execute Erc20Tra... | 22534109 | 294 days ago | 0.00203836 ETH | ||||
| Transfer | 22534035 | 294 days ago | 0.00000804 ETH | ||||
| Transfer | 22534035 | 294 days ago | 0.00000804 ETH | ||||
| Deposit | 22534035 | 294 days ago | 0.00080744 ETH | ||||
| Execute Erc20Tra... | 22534035 | 294 days ago | 0.00080744 ETH | ||||
| Transfer | 22534011 | 294 days ago | 0.00002064 ETH | ||||
| Transfer | 22534011 | 294 days ago | 0.00002064 ETH | ||||
| Deposit | 22534011 | 294 days ago | 0.00204237 ETH | ||||
| Execute Erc20Tra... | 22534011 | 294 days ago | 0.00204237 ETH | ||||
| Transfer | 22533952 | 294 days ago | 0.0000075 ETH | ||||
| Transfer | 22533952 | 294 days ago | 0.0000075 ETH | ||||
| Deposit | 22533952 | 294 days ago | 0.00080906 ETH | ||||
| Execute Erc20Tra... | 22533952 | 294 days ago | 0.00080906 ETH | ||||
| Transfer | 22533932 | 294 days ago | 0.00001979 ETH | ||||
| Transfer | 22533932 | 294 days ago | 0.00001979 ETH | ||||
| Deposit | 22533932 | 294 days ago | 0.00200208 ETH | ||||
| Execute Erc20Tra... | 22533932 | 294 days ago | 0.00200208 ETH | ||||
| Transfer | 22533891 | 294 days ago | 0.00000817 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
DeFiSmartTransfer
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2025-05-05
*/
// File: @uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol
pragma solidity >=0.5.0;
/// @title Callback for IUniswapV3PoolActions#swap
/// @notice Any contract that calls IUniswapV3PoolActions#swap must implement this interface
interface IUniswapV3SwapCallback {
/// @notice Called to `msg.sender` after executing a swap via IUniswapV3Pool#swap.
/// @dev In the implementation you must pay the pool tokens owed for the swap.
/// The caller of this method must be checked to be a UniswapV3Pool deployed by the canonical UniswapV3Factory.
/// amount0Delta and amount1Delta can both be 0 if no tokens were swapped.
/// @param amount0Delta The amount of token0 that was sent (negative) or must be received (positive) by the pool by
/// the end of the swap. If positive, the callback must send that amount of token0 to the pool.
/// @param amount1Delta The amount of token1 that was sent (negative) or must be received (positive) by the pool by
/// the end of the swap. If positive, the callback must send that amount of token1 to the pool.
/// @param data Any data passed through by the caller via the IUniswapV3PoolActions#swap call
function uniswapV3SwapCallback(
int256 amount0Delta,
int256 amount1Delta,
bytes calldata data
) external;
}
// File: @uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol
pragma solidity >=0.7.5;
pragma abicoder v2;
/// @title Router token swapping functionality
/// @notice Functions for swapping tokens via Uniswap V3
interface ISwapRouter is IUniswapV3SwapCallback {
struct ExactInputSingleParams {
address tokenIn;
address tokenOut;
uint24 fee;
address recipient;
uint256 deadline;
uint256 amountIn;
uint256 amountOutMinimum;
uint160 sqrtPriceLimitX96;
}
/// @notice Swaps `amountIn` of one token for as much as possible of another token
/// @param params The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata
/// @return amountOut The amount of the received token
function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut);
struct ExactInputParams {
bytes path;
address recipient;
uint256 deadline;
uint256 amountIn;
uint256 amountOutMinimum;
}
/// @notice Swaps `amountIn` of one token for as much as possible of another along the specified path
/// @param params The parameters necessary for the multi-hop swap, encoded as `ExactInputParams` in calldata
/// @return amountOut The amount of the received token
function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut);
struct ExactOutputSingleParams {
address tokenIn;
address tokenOut;
uint24 fee;
address recipient;
uint256 deadline;
uint256 amountOut;
uint256 amountInMaximum;
uint160 sqrtPriceLimitX96;
}
/// @notice Swaps as little as possible of one token for `amountOut` of another token
/// @param params The parameters necessary for the swap, encoded as `ExactOutputSingleParams` in calldata
/// @return amountIn The amount of the input token
function exactOutputSingle(ExactOutputSingleParams calldata params) external payable returns (uint256 amountIn);
struct ExactOutputParams {
bytes path;
address recipient;
uint256 deadline;
uint256 amountOut;
uint256 amountInMaximum;
}
/// @notice Swaps as little as possible of one token for `amountOut` of another along the specified path (reversed)
/// @param params The parameters necessary for the multi-hop swap, encoded as `ExactOutputParams` in calldata
/// @return amountIn The amount of the input token
function exactOutput(ExactOutputParams calldata params) external payable returns (uint256 amountIn);
}
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
// 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);
}
// File: @openzeppelin/contracts/interfaces/IERC20.sol
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol)
pragma solidity ^0.8.20;
// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
// 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);
}
// File: @openzeppelin/contracts/interfaces/IERC165.sol
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)
pragma solidity ^0.8.20;
// File: @openzeppelin/contracts/interfaces/IERC1363.sol
// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC1363.sol)
pragma solidity ^0.8.20;
/**
* @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);
}
// File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol
// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.20;
/**
* @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 Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.
*/
function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {
return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));
}
/**
* @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.
*/
function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {
return _callOptionalReturnBool(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);
}
}
// File: @openzeppelin/contracts/access/IAccessControl.sol
// OpenZeppelin Contracts (last updated v5.3.0) (access/IAccessControl.sol)
pragma solidity ^0.8.20;
/**
* @dev External interface of AccessControl declared to support ERC-165 detection.
*/
interface IAccessControl {
/**
* @dev The `account` is missing a role.
*/
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);
/**
* @dev The caller of a function is not the expected one.
*
* NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.
*/
error AccessControlBadConfirmation();
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted to signal this.
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call. This account bears the admin role (for the granted role).
* Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) external view returns (bool);
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {AccessControl-_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) external view returns (bytes32);
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `callerConfirmation`.
*/
function renounceRole(bytes32 role, address callerConfirmation) external;
}
// File: @openzeppelin/contracts/utils/Context.sol
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
// File: @openzeppelin/contracts/utils/introspection/ERC165.sol
// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165.sol)
pragma solidity ^0.8.20;
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
// File: @openzeppelin/contracts/access/AccessControl.sol
// OpenZeppelin Contracts (last updated v5.3.0) (access/AccessControl.sol)
pragma solidity ^0.8.20;
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```solidity
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```solidity
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
* roles. More complex role relationships can be created by using
* {_setRoleAdmin}.
*
* WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}
* to enforce additional security measures for this role.
*/
abstract contract AccessControl is Context, IAccessControl, ERC165 {
struct RoleData {
mapping(address account => bool) hasRole;
bytes32 adminRole;
}
mapping(bytes32 role => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev Modifier that checks that an account has a specific role. Reverts
* with an {AccessControlUnauthorizedAccount} error including the required role.
*/
modifier onlyRole(bytes32 role) {
_checkRole(role);
_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view virtual returns (bool) {
return _roles[role].hasRole[account];
}
/**
* @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`
* is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.
*/
function _checkRole(bytes32 role) internal view virtual {
_checkRole(role, _msgSender());
}
/**
* @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`
* is missing `role`.
*/
function _checkRole(bytes32 role, address account) internal view virtual {
if (!hasRole(role, account)) {
revert AccessControlUnauthorizedAccount(account, role);
}
}
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {
return _roles[role].adminRole;
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*
* May emit a {RoleGranted} event.
*/
function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
_grantRole(role, account);
}
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*
* May emit a {RoleRevoked} event.
*/
function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
_revokeRole(role, account);
}
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been revoked `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `callerConfirmation`.
*
* May emit a {RoleRevoked} event.
*/
function renounceRole(bytes32 role, address callerConfirmation) public virtual {
if (callerConfirmation != _msgSender()) {
revert AccessControlBadConfirmation();
}
_revokeRole(role, callerConfirmation);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*
* Emits a {RoleAdminChanged} event.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
bytes32 previousAdminRole = getRoleAdmin(role);
_roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
/**
* @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.
*
* Internal function without access restriction.
*
* May emit a {RoleGranted} event.
*/
function _grantRole(bytes32 role, address account) internal virtual returns (bool) {
if (!hasRole(role, account)) {
_roles[role].hasRole[account] = true;
emit RoleGranted(role, account, _msgSender());
return true;
} else {
return false;
}
}
/**
* @dev Attempts to revoke `role` from `account` and returns a boolean indicating if `role` was revoked.
*
* Internal function without access restriction.
*
* May emit a {RoleRevoked} event.
*/
function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {
if (hasRole(role, account)) {
_roles[role].hasRole[account] = false;
emit RoleRevoked(role, account, _msgSender());
return true;
} else {
return false;
}
}
}
// File: contracts/Operator.sol
pragma solidity 0.8.20;
// Operator contract that extends OpenZeppelin's AccessControl for role management
contract Operator is AccessControl {
// Define bytes32 identifiers for each role
bytes32 public constant OPERATOR_ROLE =
keccak256(abi.encodePacked("OPERATOR_ROLE"));
error UnAuthorized();
constructor(address _additionalAdmin, address[] memory _operators) {
require(_additionalAdmin != address(0), "Additional admin cannot be zero address");
require(_additionalAdmin != msg.sender, "Additional admin cannot be the deployer");
// Grant DEFAULT_ADMIN_ROLE, only the DEFAULT_ADMIN_ROLE can add and remove operators
_grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
_grantRole(DEFAULT_ADMIN_ROLE, _additionalAdmin);
// Setup roles for initial operators
for (uint256 i; i < _operators.length; ) {
require(_operators[i] != address(0), "Operator address cannot be zero");
_grantRole(OPERATOR_ROLE, _operators[i]);
unchecked {
++i;
}
}
}
// Modifier to restrict function access to users with the operator role
modifier onlyOperator() {
if (!hasRole(OPERATOR_ROLE, msg.sender)) {
revert UnAuthorized();
}
_;
}
// Function to add a new operator, restricted to users with the admin role
function addOperator(
address _operator
) external onlyRole(DEFAULT_ADMIN_ROLE) {
grantRole(OPERATOR_ROLE, _operator);
}
// Function to remove an existing operator, restricted to users with the admin role
function removeOperator(
address _operator
) external onlyRole(DEFAULT_ADMIN_ROLE) {
revokeRole(OPERATOR_ROLE, _operator);
}
}
// File: contracts/DeFiSmartContract.sol
pragma solidity 0.8.20;
interface IWETH is IERC20 {
function deposit() external payable;
function withdraw(uint256 wad) external;
}
contract DeFiSmartTransfer is Operator {
using SafeERC20 for IERC20;
ISwapRouter public immutable swapRouter;
address public immutable WETH;
address public constant feeReceiver =
0xD0E698815BFE8D2Ea1fDA3Fa0748646adbd3e9bF;
uint256 public constant MIN_ETH_TRANSFER = 0.00001 ether;
uint256 public constant MAX_ETH_TRANSFER = 1000 ether;
// Constructor that initializes the Operator contract with the provided operators
constructor(
address _additionalAdmin,
address[] memory _operators,
ISwapRouter _swapRouter,
address weth
) Operator(_additionalAdmin, _operators) {
swapRouter = _swapRouter;
WETH = weth;
}
// A structure to define the properties of a transfer
struct NativeTransfer {
bytes32 id; // Unique identifier for the transfer
uint256 amount; // Amount of tokens to be transferred
uint256 fee; // Transfer fee amount
address payable receiver; // Address to receive the transfer amount
}
// A structure to define the properties of a transfer
struct ERC20Transfer {
bytes32 id; // Unique identifier for the transfer
uint256 amount; // Amount of tokens to be transferred
uint256 fee; // Transfer fee amount
address payable payer; // Address of the payer. It is marked as payable so we can refund the dust remained from the swap
address payable receiver; // Address to receive the transfer amount
address token; // Token address (address(0) for native tokens)
}
struct Path {
address[] tokens;
uint24[] fees;
}
struct Swap {
uint256 amountOut;
uint256 amountInMaximum;
}
// Event to be emitted when a native transfer is completed
event NativeSmartTransferComplete(bytes32 id);
// Event to be emitted when an ERC-20 transfer is completed
event Erc20SmartTransferComplete(bytes32 id);
// Custom Errors
error AmountValueMismatch(uint256 amount, uint256 value);
error ReceiverAddressIsNull();
error InvalidFeeAmount(uint256 fee, uint256 amount);
error OutOfRangeAmount(
uint256 amount,
uint256 minAllowed,
uint256 maxAllowed
);
error NativeTransferFailed(address receiver, uint256 amount);
error InvalidSwapPath(Path path);
// To receive ETH from the WETH's withdraw function (it won't work without it)
receive() external payable {}
// Function to execute a transfer of native tokens (such as ETH)
function executeNativeTransfer(
NativeTransfer memory transfer
) external payable {
// Input Validation
if (transfer.amount != msg.value) {
revert AmountValueMismatch({
amount: transfer.amount,
value: msg.value
});
}
if ((transfer.receiver == address(0))) {
revert ReceiverAddressIsNull();
}
if (transfer.fee > transfer.amount) {
revert InvalidFeeAmount({
fee: transfer.fee,
amount: transfer.amount
});
}
if (
(transfer.amount < MIN_ETH_TRANSFER) ||
(transfer.amount > MAX_ETH_TRANSFER)
) {
revert OutOfRangeAmount({
amount: transfer.amount,
minAllowed: MIN_ETH_TRANSFER,
maxAllowed: MAX_ETH_TRANSFER
});
}
// Transfer the specified amount minus the fee to the receiver
(bool success, ) = transfer.receiver.call{
value: transfer.amount - transfer.fee
}("");
if (!success) {
revert NativeTransferFailed({
receiver: transfer.receiver,
amount: transfer.amount - transfer.fee
});
}
// Emit an event to indicate the transfer is complete
emit NativeSmartTransferComplete(transfer.id);
}
// Function to execute a transfer of ERC20 tokens
// This function can only be called by an operator (role enforced by `onlyOperator` modifier)
function executeErc20Transfer(
ERC20Transfer memory transfer
) external onlyOperator {
// Transfer the specified amount minus the fee from the payer to the receiver
IERC20(transfer.token).safeTransferFrom(
transfer.payer,
transfer.receiver,
transfer.amount - transfer.fee
);
// Withdraw the fee from the payer
IERC20(transfer.token).safeTransferFrom(
transfer.payer,
address(this),
transfer.fee
);
// Emit an event to indicate the transfer is complete
emit Erc20SmartTransferComplete(transfer.id);
}
function executeErc20TransferWithSwap(
ERC20Transfer memory transfer,
Swap memory swap,
Path memory path
) external payable onlyOperator {
if (path.fees.length + 1 != path.tokens.length) {
revert InvalidSwapPath({path: path});
}
IERC20(path.tokens[0]).safeTransferFrom(
transfer.payer,
address(this),
swap.amountInMaximum
);
IERC20(path.tokens[0]).approve(
address(swapRouter),
swap.amountInMaximum
);
ISwapRouter.ExactOutputParams memory params = ISwapRouter
.ExactOutputParams({
path: encodePath(path),
recipient: address(this),
deadline: block.timestamp,
amountOut: swap.amountOut,
amountInMaximum: swap.amountInMaximum
});
uint256 amountIn = swapRouter.exactOutput(params);
// If the swap did not require the full amountInMaximum to achieve the exact amountOut then we refund msg.sender and approve the router to spend 0.
if (amountIn < swap.amountInMaximum) {
IERC20(path.tokens[0]).approve(
address(this),
swap.amountInMaximum - amountIn
);
IERC20(path.tokens[0]).safeTransferFrom(
address(this),
transfer.payer,
swap.amountInMaximum - amountIn
);
}
IERC20(transfer.token).approve(
address(this),
swap.amountOut - transfer.fee
);
IERC20(transfer.token).safeTransferFrom(
address(this),
transfer.receiver,
swap.amountOut - transfer.fee
);
// Emit an event to indicate the transfer is complete
emit Erc20SmartTransferComplete(transfer.id);
}
function executeErc20TransferWithNativeSwap(
ERC20Transfer memory transfer,
Swap memory swap,
Path memory path
) external payable {
IWETH(WETH).deposit{value: msg.value}();
if (path.fees.length + 1 != path.tokens.length) {
revert InvalidSwapPath({path: path});
}
IERC20(WETH).approve(address(swapRouter), swap.amountInMaximum);
ISwapRouter.ExactOutputParams memory params = ISwapRouter
.ExactOutputParams({
path: encodePath(path),
recipient: address(this),
deadline: block.timestamp,
amountOut: swap.amountOut,
amountInMaximum: swap.amountInMaximum
});
uint256 amountIn = swapRouter.exactOutput(params);
// If the swap did not require the full amountInMaximum to achieve the exact amountOut then we refund msg.sender and approve the router to spend 0.
if (amountIn < swap.amountInMaximum) {
IWETH(path.tokens[0]).withdraw(swap.amountInMaximum - amountIn);
(bool success, ) = transfer.payer.call{
value: swap.amountInMaximum - amountIn
}("");
require(success, "Dust refund failed");
}
IERC20(transfer.token).approve(
address(this),
swap.amountOut - transfer.fee
);
IERC20(transfer.token).safeTransferFrom(
address(this),
transfer.receiver,
swap.amountOut - transfer.fee
);
// Emit an event to indicate the transfer is complete
emit Erc20SmartTransferComplete(transfer.id);
}
// Enable the ADMIN to withdraw funds in this contract
function withdraw(address token) external onlyRole(DEFAULT_ADMIN_ROLE) {
if (token == address(0)) {
payable(feeReceiver).transfer(address(this).balance);
} else {
uint256 balance = IERC20(token).balanceOf(address(this));
IERC20(token).safeTransfer(feeReceiver, balance);
}
}
function refund(
address token,
address payable receiver
) external onlyRole(DEFAULT_ADMIN_ROLE) {
uint256 balance = IERC20(token).balanceOf(address(this));
IERC20(token).safeTransfer(receiver, balance);
}
function encodePath(
Path memory path
) internal pure returns (bytes memory encoded) {
uint i = path.fees.length - 1;
while (i >= 0) {
encoded = bytes.concat(
encoded,
abi.encodePacked(path.tokens[i + 1])
);
encoded = bytes.concat(encoded, abi.encodePacked(path.fees[i]));
if (i == 0) {
break;
}
i--;
}
encoded = bytes.concat(encoded, abi.encodePacked(path.tokens[0]));
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_additionalAdmin","type":"address"},{"internalType":"address[]","name":"_operators","type":"address[]"},{"internalType":"contract ISwapRouter","name":"_swapRouter","type":"address"},{"internalType":"address","name":"weth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"AmountValueMismatch","type":"error"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"InvalidFeeAmount","type":"error"},{"inputs":[{"components":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint24[]","name":"fees","type":"uint24[]"}],"internalType":"struct DeFiSmartTransfer.Path","name":"path","type":"tuple"}],"name":"InvalidSwapPath","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"NativeTransferFailed","type":"error"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minAllowed","type":"uint256"},{"internalType":"uint256","name":"maxAllowed","type":"uint256"}],"name":"OutOfRangeAmount","type":"error"},{"inputs":[],"name":"ReceiverAddressIsNull","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"UnAuthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"Erc20SmartTransferComplete","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"NativeSmartTransferComplete","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ETH_TRANSFER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_ETH_TRANSFER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"addOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"address payable","name":"payer","type":"address"},{"internalType":"address payable","name":"receiver","type":"address"},{"internalType":"address","name":"token","type":"address"}],"internalType":"struct DeFiSmartTransfer.ERC20Transfer","name":"transfer","type":"tuple"}],"name":"executeErc20Transfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"address payable","name":"payer","type":"address"},{"internalType":"address payable","name":"receiver","type":"address"},{"internalType":"address","name":"token","type":"address"}],"internalType":"struct DeFiSmartTransfer.ERC20Transfer","name":"transfer","type":"tuple"},{"components":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMaximum","type":"uint256"}],"internalType":"struct DeFiSmartTransfer.Swap","name":"swap","type":"tuple"},{"components":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint24[]","name":"fees","type":"uint24[]"}],"internalType":"struct DeFiSmartTransfer.Path","name":"path","type":"tuple"}],"name":"executeErc20TransferWithNativeSwap","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"address payable","name":"payer","type":"address"},{"internalType":"address payable","name":"receiver","type":"address"},{"internalType":"address","name":"token","type":"address"}],"internalType":"struct DeFiSmartTransfer.ERC20Transfer","name":"transfer","type":"tuple"},{"components":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMaximum","type":"uint256"}],"internalType":"struct DeFiSmartTransfer.Swap","name":"swap","type":"tuple"},{"components":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint24[]","name":"fees","type":"uint24[]"}],"internalType":"struct DeFiSmartTransfer.Path","name":"path","type":"tuple"}],"name":"executeErc20TransferWithSwap","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"address payable","name":"receiver","type":"address"}],"internalType":"struct DeFiSmartTransfer.NativeTransfer","name":"transfer","type":"tuple"}],"name":"executeNativeTransfer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"feeReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address payable","name":"receiver","type":"address"}],"name":"refund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"removeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapRouter","outputs":[{"internalType":"contract ISwapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60c060405234801562000010575f80fd5b50604051620036913803806200369183398181016040528101906200003691906200063a565b83835f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620000a9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000a0906200074c565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200011a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200011190620007e0565b60405180910390fd5b6200012e5f801b33620002b560201b60201c565b50620001435f801b83620002b560201b60201c565b505f5b815181101562000240575f73ffffffffffffffffffffffffffffffffffffffff168282815181106200017d576200017c62000800565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603620001de576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001d5906200087b565b60405180910390fd5b62000233604051602001620001f390620008f3565b604051602081830303815290604052805190602001208383815181106200021f576200021e62000800565b5b6020026020010151620002b560201b60201c565b5080600101905062000146565b5050508173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250505050505062000909565b5f620002c88383620003b060201b60201c565b620003a65760015f808581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550620003426200041360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019050620003aa565b5f90505b92915050565b5f805f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f33905090565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000456826200042b565b9050919050565b62000468816200044a565b811462000473575f80fd5b50565b5f8151905062000486816200045d565b92915050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b620004d88262000490565b810181811067ffffffffffffffff82111715620004fa57620004f9620004a0565b5b80604052505050565b5f6200050e6200041a565b90506200051c8282620004cd565b919050565b5f67ffffffffffffffff8211156200053e576200053d620004a0565b5b602082029050602081019050919050565b5f80fd5b5f62000569620005638462000521565b62000503565b905080838252602082019050602084028301858111156200058f576200058e6200054f565b5b835b81811015620005bc5780620005a7888262000476565b84526020840193505060208101905062000591565b5050509392505050565b5f82601f830112620005dd57620005dc6200048c565b5b8151620005ef84826020860162000553565b91505092915050565b5f62000604826200044a565b9050919050565b6200061681620005f8565b811462000621575f80fd5b50565b5f8151905062000634816200060b565b92915050565b5f805f806080858703121562000655576200065462000423565b5b5f620006648782880162000476565b945050602085015167ffffffffffffffff81111562000688576200068762000427565b5b6200069687828801620005c6565b9350506040620006a98782880162000624565b9250506060620006bc8782880162000476565b91505092959194509250565b5f82825260208201905092915050565b7f4164646974696f6e616c2061646d696e2063616e6e6f74206265207a65726f205f8201527f6164647265737300000000000000000000000000000000000000000000000000602082015250565b5f62000734602783620006c8565b91506200074182620006d8565b604082019050919050565b5f6020820190508181035f830152620007658162000726565b9050919050565b7f4164646974696f6e616c2061646d696e2063616e6e6f742062652074686520645f8201527f65706c6f79657200000000000000000000000000000000000000000000000000602082015250565b5f620007c8602783620006c8565b9150620007d5826200076c565b604082019050919050565b5f6020820190508181035f830152620007f981620007ba565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4f70657261746f7220616464726573732063616e6e6f74206265207a65726f005f82015250565b5f62000863601f83620006c8565b915062000870826200082d565b602082019050919050565b5f6020820190508181035f830152620008948162000855565b9050919050565b5f81905092915050565b7f4f50455241544f525f524f4c45000000000000000000000000000000000000005f82015250565b5f620008db600d836200089b565b9150620008e882620008a5565b600d82019050919050565b5f620008ff82620008cd565b9150819050919050565b60805160a051612d3c620009555f395f8181610bce01528181610ca4015261168c01525f8181610ce001528181610db40152818161120c015281816112e001526116c80152612d3c5ff3fe60806040526004361061012d575f3560e01c80637e66520f116100aa578063ac8a584a1161006e578063ac8a584a146103ae578063ad5c4648146103d6578063b3f0067414610400578063c31c9c071461042a578063d547741f14610454578063f5b541a61461047c57610134565b80637e66520f146102e8578063891e0d0b1461030457806391d14854146103205780639870d7fe1461035c578063a217fddf1461038457610134565b80632904027b116100f15780632904027b1461022c5780632f2ff15d1461024857806336568abe1461027057806351cff8d9146102985780635e30b8a6146102c057610134565b806301ffc9a71461013857806307dd0e21146101745780631a16d88b1461019e578063248a9ca3146101c85780632841b8da1461020457610134565b3661013457005b5f80fd5b348015610143575f80fd5b5061015e60048036038101906101599190611d4a565b6104a6565b60405161016b9190611d8f565b60405180910390f35b34801561017f575f80fd5b5061018861051f565b6040516101959190611dc0565b60405180910390f35b3480156101a9575f80fd5b506101b261052c565b6040516101bf9190611dc0565b60405180910390f35b3480156101d3575f80fd5b506101ee60048036038101906101e99190611e0c565b610536565b6040516101fb9190611e46565b60405180910390f35b34801561020f575f80fd5b5061022a6004803603810190610225919061204b565b610552565b005b610246600480360381019061024191906120eb565b610678565b005b348015610253575f80fd5b5061026e60048036038101906102699190612116565b61091b565b005b34801561027b575f80fd5b5061029660048036038101906102919190612116565b61093d565b005b3480156102a3575f80fd5b506102be60048036038101906102b99190612154565b6109b8565b005b3480156102cb575f80fd5b506102e660048036038101906102e1919061217f565b610b14565b005b61030260048036038101906102fd919061244f565b610bcc565b005b61031e6004803603810190610319919061244f565b6110c2565b005b34801561032b575f80fd5b5061034660048036038101906103419190612116565b6115a5565b6040516103539190611d8f565b60405180910390f35b348015610367575f80fd5b50610382600480360381019061037d9190612154565b611608565b005b34801561038f575f80fd5b50610398611646565b6040516103a59190611e46565b60405180910390f35b3480156103b9575f80fd5b506103d460048036038101906103cf9190612154565b61164c565b005b3480156103e1575f80fd5b506103ea61168a565b6040516103f791906124cc565b60405180910390f35b34801561040b575f80fd5b506104146116ae565b60405161042191906124cc565b60405180910390f35b348015610435575f80fd5b5061043e6116c6565b60405161044b9190612540565b60405180910390f35b34801561045f575f80fd5b5061047a60048036038101906104759190612116565b6116ea565b005b348015610487575f80fd5b5061049061170c565b60405161049d9190611e46565b60405180910390f35b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610518575061051782611734565b5b9050919050565b683635c9adc5dea0000081565b6509184e72a00081565b5f805f8381526020019081526020015f20600101549050919050565b610580604051602001610564906125ad565b60405160208183030381529060405280519060200120336115a5565b6105b6576040517fbe24598300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61060281606001518260800151836040015184602001516105d791906125ee565b8460a0015173ffffffffffffffffffffffffffffffffffffffff1661179d909392919063ffffffff16565b61063b81606001513083604001518460a0015173ffffffffffffffffffffffffffffffffffffffff1661179d909392919063ffffffff16565b7f1bd6c98146215f6f25fb7095aa7d6cc88e4cbe0fbf23c6ff4fad81ab3d1b4862815f015160405161066d9190611e46565b60405180910390a150565b348160200151146106c6578060200151346040517f1d078cfc0000000000000000000000000000000000000000000000000000000081526004016106bd929190612621565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff16816060015173ffffffffffffffffffffffffffffffffffffffff160361072f576040517f18f7d3f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80602001518160400151111561078657806040015181602001516040517f18731f9b00000000000000000000000000000000000000000000000000000000815260040161077d929190612621565b60405180910390fd5b6509184e72a000816020015110806107aa5750683635c9adc5dea000008160200151115b156108035780602001516509184e72a000683635c9adc5dea000006040517fc5edea450000000000000000000000000000000000000000000000000000000081526004016107fa93929190612648565b60405180910390fd5b5f816060015173ffffffffffffffffffffffffffffffffffffffff168260400151836020015161083391906125ee565b60405161083f906126aa565b5f6040518083038185875af1925050503d805f8114610879576040519150601f19603f3d011682016040523d82523d5f602084013e61087e565b606091505b50509050806108dd578160600151826040015183602001516108a091906125ee565b6040517fa5b05eec0000000000000000000000000000000000000000000000000000000081526004016108d49291906126de565b60405180910390fd5b7fbead3314911dea300cd80ff22fc82ef6b9c7c7e9fe5ebb1fc20d258b18a1408f825f015160405161090f9190611e46565b60405180910390a15050565b61092482610536565b61092d8161181f565b6109378383611833565b50505050565b61094561191c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109a9576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109b38282611923565b505050565b5f801b6109c48161181f565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a545773d0e698815bfe8d2ea1fda3fa0748646adbd3e9bf73ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f19350505050158015610a4e573d5f803e3d5ffd5b50610b10565b5f8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610a8e91906124cc565b602060405180830381865afa158015610aa9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610acd9190612719565b9050610b0e73d0e698815bfe8d2ea1fda3fa0748646adbd3e9bf828573ffffffffffffffffffffffffffffffffffffffff16611a0c9092919063ffffffff16565b505b5050565b5f801b610b208161181f565b5f8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610b5a91906124cc565b602060405180830381865afa158015610b75573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b999190612719565b9050610bc683828673ffffffffffffffffffffffffffffffffffffffff16611a0c9092919063ffffffff16565b50505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b158015610c32575f80fd5b505af1158015610c44573d5f803e3d5ffd5b5050505050805f0151516001826020015151610c609190612744565b14610ca257806040517ffdd040c2000000000000000000000000000000000000000000000000000000008152600401610c999190612926565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f000000000000000000000000000000000000000000000000000000000000000084602001516040518363ffffffff1660e01b8152600401610d21929190612946565b6020604051808303815f875af1158015610d3d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d619190612997565b505f6040518060a00160405280610d7784611a8b565b81526020013073ffffffffffffffffffffffffffffffffffffffff168152602001428152602001845f01518152602001846020015181525090505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f28c0498836040518263ffffffff1660e01b8152600401610e0b9190612abe565b6020604051808303815f875af1158015610e27573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e4b9190612719565b90508360200151811015610fa857825f01515f81518110610e6f57610e6e612ade565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d828660200151610ea291906125ee565b6040518263ffffffff1660e01b8152600401610ebe9190611dc0565b5f604051808303815f87803b158015610ed5575f80fd5b505af1158015610ee7573d5f803e3d5ffd5b505050505f856060015173ffffffffffffffffffffffffffffffffffffffff16828660200151610f1791906125ee565b604051610f23906126aa565b5f6040518083038185875af1925050503d805f8114610f5d576040519150601f19603f3d011682016040523d82523d5f602084013e610f62565b606091505b5050905080610fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9d90612b65565b60405180910390fd5b505b8460a0015173ffffffffffffffffffffffffffffffffffffffff1663095ea7b3308760400151875f0151610fdc91906125ee565b6040518363ffffffff1660e01b8152600401610ff9929190612946565b6020604051808303815f875af1158015611015573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110399190612997565b506110813086608001518760400151875f015161105691906125ee565b8860a0015173ffffffffffffffffffffffffffffffffffffffff1661179d909392919063ffffffff16565b7f1bd6c98146215f6f25fb7095aa7d6cc88e4cbe0fbf23c6ff4fad81ab3d1b4862855f01516040516110b39190611e46565b60405180910390a15050505050565b6110f06040516020016110d4906125ad565b60405160208183030381529060405280519060200120336115a5565b611126576040517fbe24598300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f015151600182602001515161113d9190612744565b1461117f57806040517ffdd040c20000000000000000000000000000000000000000000000000000000081526004016111769190612926565b60405180910390fd5b6111d18360600151308460200151845f01515f815181106111a3576111a2612ade565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1661179d909392919063ffffffff16565b805f01515f815181106111e7576111e6612ade565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f000000000000000000000000000000000000000000000000000000000000000084602001516040518363ffffffff1660e01b815260040161124d929190612946565b6020604051808303815f875af1158015611269573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061128d9190612997565b505f6040518060a001604052806112a384611a8b565b81526020013073ffffffffffffffffffffffffffffffffffffffff168152602001428152602001845f01518152602001846020015181525090505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f28c0498836040518263ffffffff1660e01b81526004016113379190612abe565b6020604051808303815f875af1158015611353573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113779190612719565b9050836020015181101561148b57825f01515f8151811061139b5761139a612ade565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663095ea7b3308387602001516113cf91906125ee565b6040518363ffffffff1660e01b81526004016113ec929190612946565b6020604051808303815f875af1158015611408573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061142c9190612997565b5061148a30866060015183876020015161144691906125ee565b865f01515f8151811061145c5761145b612ade565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1661179d909392919063ffffffff16565b5b8460a0015173ffffffffffffffffffffffffffffffffffffffff1663095ea7b3308760400151875f01516114bf91906125ee565b6040518363ffffffff1660e01b81526004016114dc929190612946565b6020604051808303815f875af11580156114f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061151c9190612997565b506115643086608001518760400151875f015161153991906125ee565b8860a0015173ffffffffffffffffffffffffffffffffffffffff1661179d909392919063ffffffff16565b7f1bd6c98146215f6f25fb7095aa7d6cc88e4cbe0fbf23c6ff4fad81ab3d1b4862855f01516040516115969190611e46565b60405180910390a15050505050565b5f805f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f801b6116148161181f565b611642604051602001611626906125ad565b604051602081830303815290604052805190602001208361091b565b5050565b5f801b81565b5f801b6116588161181f565b61168660405160200161166a906125ad565b60405160208183030381529060405280519060200120836116ea565b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b73d0e698815bfe8d2ea1fda3fa0748646adbd3e9bf81565b7f000000000000000000000000000000000000000000000000000000000000000081565b6116f382610536565b6116fc8161181f565b6117068383611923565b50505050565b60405160200161171b906125ad565b6040516020818303038152906040528051906020012081565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611819848573ffffffffffffffffffffffffffffffffffffffff166323b872dd8686866040516024016117d293929190612b83565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611bf8565b50505050565b6118308161182b61191c565b611c93565b50565b5f61183e83836115a5565b6119125760015f808581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506118af61191c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019050611916565b5f90505b92915050565b5f33905090565b5f61192e83836115a5565b15611a02575f805f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061199f61191c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a460019050611a06565b5f90505b92915050565b611a86838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401611a3f929190612946565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611bf8565b505050565b60605f6001836020015151611aa091906125ee565b90505b5f8110611b925781835f0151600183611abc9190612744565b81518110611acd57611acc612ade565b5b6020026020010151604051602001611ae59190612bfd565b604051602081830303815290604052604051602001611b05929190612c47565b60405160208183030381529060405291508183602001518281518110611b2e57611b2d612ade565b5b6020026020010151604051602001611b469190612c9e565b604051602081830303815290604052604051602001611b66929190612c47565b60405160208183030381529060405291505f810315611b92578080611b8a90612cb8565b915050611aa3565b81835f01515f81518110611ba957611ba8612ade565b5b6020026020010151604051602001611bc19190612bfd565b604051602081830303815290604052604051602001611be1929190612c47565b604051602081830303815290604052915050919050565b5f8060205f8451602086015f885af180611c17576040513d5f823e3d81fd5b3d92505f519150505f8214611c30576001811415611c4b565b5f8473ffffffffffffffffffffffffffffffffffffffff163b145b15611c8d57836040517f5274afe7000000000000000000000000000000000000000000000000000000008152600401611c8491906124cc565b60405180910390fd5b50505050565b611c9d82826115a5565b611ce05780826040517fe2517d3f000000000000000000000000000000000000000000000000000000008152600401611cd7929190612cdf565b60405180910390fd5b5050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611d2981611cf5565b8114611d33575f80fd5b50565b5f81359050611d4481611d20565b92915050565b5f60208284031215611d5f57611d5e611ced565b5b5f611d6c84828501611d36565b91505092915050565b5f8115159050919050565b611d8981611d75565b82525050565b5f602082019050611da25f830184611d80565b92915050565b5f819050919050565b611dba81611da8565b82525050565b5f602082019050611dd35f830184611db1565b92915050565b5f819050919050565b611deb81611dd9565b8114611df5575f80fd5b50565b5f81359050611e0681611de2565b92915050565b5f60208284031215611e2157611e20611ced565b5b5f611e2e84828501611df8565b91505092915050565b611e4081611dd9565b82525050565b5f602082019050611e595f830184611e37565b92915050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611ea982611e63565b810181811067ffffffffffffffff82111715611ec857611ec7611e73565b5b80604052505050565b5f611eda611ce4565b9050611ee68282611ea0565b919050565b5f80fd5b611ef881611da8565b8114611f02575f80fd5b50565b5f81359050611f1381611eef565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611f4282611f19565b9050919050565b611f5281611f38565b8114611f5c575f80fd5b50565b5f81359050611f6d81611f49565b92915050565b5f611f7d82611f19565b9050919050565b611f8d81611f73565b8114611f97575f80fd5b50565b5f81359050611fa881611f84565b92915050565b5f60c08284031215611fc357611fc2611e5f565b5b611fcd60c0611ed1565b90505f611fdc84828501611df8565b5f830152506020611fef84828501611f05565b602083015250604061200384828501611f05565b604083015250606061201784828501611f5f565b606083015250608061202b84828501611f5f565b60808301525060a061203f84828501611f9a565b60a08301525092915050565b5f60c082840312156120605761205f611ced565b5b5f61206d84828501611fae565b91505092915050565b5f6080828403121561208b5761208a611e5f565b5b6120956080611ed1565b90505f6120a484828501611df8565b5f8301525060206120b784828501611f05565b60208301525060406120cb84828501611f05565b60408301525060606120df84828501611f5f565b60608301525092915050565b5f60808284031215612100576120ff611ced565b5b5f61210d84828501612076565b91505092915050565b5f806040838503121561212c5761212b611ced565b5b5f61213985828601611df8565b925050602061214a85828601611f9a565b9150509250929050565b5f6020828403121561216957612168611ced565b5b5f61217684828501611f9a565b91505092915050565b5f806040838503121561219557612194611ced565b5b5f6121a285828601611f9a565b92505060206121b385828601611f5f565b9150509250929050565b5f604082840312156121d2576121d1611e5f565b5b6121dc6040611ed1565b90505f6121eb84828501611f05565b5f8301525060206121fe84828501611f05565b60208301525092915050565b5f80fd5b5f67ffffffffffffffff82111561222857612227611e73565b5b602082029050602081019050919050565b5f80fd5b5f61224f61224a8461220e565b611ed1565b9050808382526020820190506020840283018581111561227257612271612239565b5b835b8181101561229b57806122878882611f9a565b845260208401935050602081019050612274565b5050509392505050565b5f82601f8301126122b9576122b861220a565b5b81356122c984826020860161223d565b91505092915050565b5f67ffffffffffffffff8211156122ec576122eb611e73565b5b602082029050602081019050919050565b5f62ffffff82169050919050565b612314816122fd565b811461231e575f80fd5b50565b5f8135905061232f8161230b565b92915050565b5f612347612342846122d2565b611ed1565b9050808382526020820190506020840283018581111561236a57612369612239565b5b835b81811015612393578061237f8882612321565b84526020840193505060208101905061236c565b5050509392505050565b5f82601f8301126123b1576123b061220a565b5b81356123c1848260208601612335565b91505092915050565b5f604082840312156123df576123de611e5f565b5b6123e96040611ed1565b90505f82013567ffffffffffffffff81111561240857612407611eeb565b5b612414848285016122a5565b5f83015250602082013567ffffffffffffffff81111561243757612436611eeb565b5b6124438482850161239d565b60208301525092915050565b5f805f610120848603121561246757612466611ced565b5b5f61247486828701611fae565b93505060c0612485868287016121bd565b92505061010084013567ffffffffffffffff8111156124a7576124a6611cf1565b5b6124b3868287016123ca565b9150509250925092565b6124c681611f73565b82525050565b5f6020820190506124df5f8301846124bd565b92915050565b5f819050919050565b5f6125086125036124fe84611f19565b6124e5565b611f19565b9050919050565b5f612519826124ee565b9050919050565b5f61252a8261250f565b9050919050565b61253a81612520565b82525050565b5f6020820190506125535f830184612531565b92915050565b5f81905092915050565b7f4f50455241544f525f524f4c45000000000000000000000000000000000000005f82015250565b5f612597600d83612559565b91506125a282612563565b600d82019050919050565b5f6125b78261258b565b9150819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6125f882611da8565b915061260383611da8565b925082820390508181111561261b5761261a6125c1565b5b92915050565b5f6040820190506126345f830185611db1565b6126416020830184611db1565b9392505050565b5f60608201905061265b5f830186611db1565b6126686020830185611db1565b6126756040830184611db1565b949350505050565b5f81905092915050565b50565b5f6126955f8361267d565b91506126a082612687565b5f82019050919050565b5f6126b48261268a565b9150819050919050565b5f6126c88261250f565b9050919050565b6126d8816126be565b82525050565b5f6040820190506126f15f8301856126cf565b6126fe6020830184611db1565b9392505050565b5f8151905061271381611eef565b92915050565b5f6020828403121561272e5761272d611ced565b5b5f61273b84828501612705565b91505092915050565b5f61274e82611da8565b915061275983611da8565b9250828201905080821115612771576127706125c1565b5b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6127a981611f73565b82525050565b5f6127ba83836127a0565b60208301905092915050565b5f602082019050919050565b5f6127dc82612777565b6127e68185612781565b93506127f183612791565b805f5b8381101561282157815161280888826127af565b9750612813836127c6565b9250506001810190506127f4565b5085935050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b612860816122fd565b82525050565b5f6128718383612857565b60208301905092915050565b5f602082019050919050565b5f6128938261282e565b61289d8185612838565b93506128a883612848565b805f5b838110156128d85781516128bf8882612866565b97506128ca8361287d565b9250506001810190506128ab565b5085935050505092915050565b5f604083015f8301518482035f8601526128ff82826127d2565b915050602083015184820360208601526129198282612889565b9150508091505092915050565b5f6020820190508181035f83015261293e81846128e5565b905092915050565b5f6040820190506129595f8301856124bd565b6129666020830184611db1565b9392505050565b61297681611d75565b8114612980575f80fd5b50565b5f815190506129918161296d565b92915050565b5f602082840312156129ac576129ab611ced565b5b5f6129b984828501612983565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156129f95780820151818401526020810190506129de565b5f8484015250505050565b5f612a0e826129c2565b612a1881856129cc565b9350612a288185602086016129dc565b612a3181611e63565b840191505092915050565b612a4581611da8565b82525050565b5f60a083015f8301518482035f860152612a658282612a04565b9150506020830151612a7a60208601826127a0565b506040830151612a8d6040860182612a3c565b506060830151612aa06060860182612a3c565b506080830151612ab36080860182612a3c565b508091505092915050565b5f6020820190508181035f830152612ad68184612a4b565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82825260208201905092915050565b7f4475737420726566756e64206661696c656400000000000000000000000000005f82015250565b5f612b4f601283612b0b565b9150612b5a82612b1b565b602082019050919050565b5f6020820190508181035f830152612b7c81612b43565b9050919050565b5f606082019050612b965f8301866124bd565b612ba360208301856124bd565b612bb06040830184611db1565b949350505050565b5f8160601b9050919050565b5f612bce82612bb8565b9050919050565b5f612bdf82612bc4565b9050919050565b612bf7612bf282611f73565b612bd5565b82525050565b5f612c088284612be6565b60148201915081905092915050565b5f612c21826129c2565b612c2b818561267d565b9350612c3b8185602086016129dc565b80840191505092915050565b5f612c528285612c17565b9150612c5e8284612c17565b91508190509392505050565b5f8160e81b9050919050565b5f612c8082612c6a565b9050919050565b612c98612c93826122fd565b612c76565b82525050565b5f612ca98284612c87565b60038201915081905092915050565b5f612cc282611da8565b91505f8203612cd457612cd36125c1565b5b600182039050919050565b5f604082019050612cf25f8301856124bd565b612cff6020830184611e37565b939250505056fea264697066735822122038775c40a94183684b5c31370f759556571909429bd1b9c9f8153dd97a3bf36964736f6c6343000814003300000000000000000000000072ed7ce76a7bb01ae6af244c561bcc483db13a150000000000000000000000000000000000000000000000000000000000000080000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000003000000000000000000000000aa5dac843057407d5d5d103328a4325cce079677000000000000000000000000615d3b20ec4cf2155c5aa8b7c0faf04bec696eb800000000000000000000000028d3c19a75127dba0acaf7f86030859520791c72
Deployed Bytecode
0x60806040526004361061012d575f3560e01c80637e66520f116100aa578063ac8a584a1161006e578063ac8a584a146103ae578063ad5c4648146103d6578063b3f0067414610400578063c31c9c071461042a578063d547741f14610454578063f5b541a61461047c57610134565b80637e66520f146102e8578063891e0d0b1461030457806391d14854146103205780639870d7fe1461035c578063a217fddf1461038457610134565b80632904027b116100f15780632904027b1461022c5780632f2ff15d1461024857806336568abe1461027057806351cff8d9146102985780635e30b8a6146102c057610134565b806301ffc9a71461013857806307dd0e21146101745780631a16d88b1461019e578063248a9ca3146101c85780632841b8da1461020457610134565b3661013457005b5f80fd5b348015610143575f80fd5b5061015e60048036038101906101599190611d4a565b6104a6565b60405161016b9190611d8f565b60405180910390f35b34801561017f575f80fd5b5061018861051f565b6040516101959190611dc0565b60405180910390f35b3480156101a9575f80fd5b506101b261052c565b6040516101bf9190611dc0565b60405180910390f35b3480156101d3575f80fd5b506101ee60048036038101906101e99190611e0c565b610536565b6040516101fb9190611e46565b60405180910390f35b34801561020f575f80fd5b5061022a6004803603810190610225919061204b565b610552565b005b610246600480360381019061024191906120eb565b610678565b005b348015610253575f80fd5b5061026e60048036038101906102699190612116565b61091b565b005b34801561027b575f80fd5b5061029660048036038101906102919190612116565b61093d565b005b3480156102a3575f80fd5b506102be60048036038101906102b99190612154565b6109b8565b005b3480156102cb575f80fd5b506102e660048036038101906102e1919061217f565b610b14565b005b61030260048036038101906102fd919061244f565b610bcc565b005b61031e6004803603810190610319919061244f565b6110c2565b005b34801561032b575f80fd5b5061034660048036038101906103419190612116565b6115a5565b6040516103539190611d8f565b60405180910390f35b348015610367575f80fd5b50610382600480360381019061037d9190612154565b611608565b005b34801561038f575f80fd5b50610398611646565b6040516103a59190611e46565b60405180910390f35b3480156103b9575f80fd5b506103d460048036038101906103cf9190612154565b61164c565b005b3480156103e1575f80fd5b506103ea61168a565b6040516103f791906124cc565b60405180910390f35b34801561040b575f80fd5b506104146116ae565b60405161042191906124cc565b60405180910390f35b348015610435575f80fd5b5061043e6116c6565b60405161044b9190612540565b60405180910390f35b34801561045f575f80fd5b5061047a60048036038101906104759190612116565b6116ea565b005b348015610487575f80fd5b5061049061170c565b60405161049d9190611e46565b60405180910390f35b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610518575061051782611734565b5b9050919050565b683635c9adc5dea0000081565b6509184e72a00081565b5f805f8381526020019081526020015f20600101549050919050565b610580604051602001610564906125ad565b60405160208183030381529060405280519060200120336115a5565b6105b6576040517fbe24598300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61060281606001518260800151836040015184602001516105d791906125ee565b8460a0015173ffffffffffffffffffffffffffffffffffffffff1661179d909392919063ffffffff16565b61063b81606001513083604001518460a0015173ffffffffffffffffffffffffffffffffffffffff1661179d909392919063ffffffff16565b7f1bd6c98146215f6f25fb7095aa7d6cc88e4cbe0fbf23c6ff4fad81ab3d1b4862815f015160405161066d9190611e46565b60405180910390a150565b348160200151146106c6578060200151346040517f1d078cfc0000000000000000000000000000000000000000000000000000000081526004016106bd929190612621565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff16816060015173ffffffffffffffffffffffffffffffffffffffff160361072f576040517f18f7d3f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80602001518160400151111561078657806040015181602001516040517f18731f9b00000000000000000000000000000000000000000000000000000000815260040161077d929190612621565b60405180910390fd5b6509184e72a000816020015110806107aa5750683635c9adc5dea000008160200151115b156108035780602001516509184e72a000683635c9adc5dea000006040517fc5edea450000000000000000000000000000000000000000000000000000000081526004016107fa93929190612648565b60405180910390fd5b5f816060015173ffffffffffffffffffffffffffffffffffffffff168260400151836020015161083391906125ee565b60405161083f906126aa565b5f6040518083038185875af1925050503d805f8114610879576040519150601f19603f3d011682016040523d82523d5f602084013e61087e565b606091505b50509050806108dd578160600151826040015183602001516108a091906125ee565b6040517fa5b05eec0000000000000000000000000000000000000000000000000000000081526004016108d49291906126de565b60405180910390fd5b7fbead3314911dea300cd80ff22fc82ef6b9c7c7e9fe5ebb1fc20d258b18a1408f825f015160405161090f9190611e46565b60405180910390a15050565b61092482610536565b61092d8161181f565b6109378383611833565b50505050565b61094561191c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109a9576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109b38282611923565b505050565b5f801b6109c48161181f565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a545773d0e698815bfe8d2ea1fda3fa0748646adbd3e9bf73ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f19350505050158015610a4e573d5f803e3d5ffd5b50610b10565b5f8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610a8e91906124cc565b602060405180830381865afa158015610aa9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610acd9190612719565b9050610b0e73d0e698815bfe8d2ea1fda3fa0748646adbd3e9bf828573ffffffffffffffffffffffffffffffffffffffff16611a0c9092919063ffffffff16565b505b5050565b5f801b610b208161181f565b5f8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610b5a91906124cc565b602060405180830381865afa158015610b75573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b999190612719565b9050610bc683828673ffffffffffffffffffffffffffffffffffffffff16611a0c9092919063ffffffff16565b50505050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b158015610c32575f80fd5b505af1158015610c44573d5f803e3d5ffd5b5050505050805f0151516001826020015151610c609190612744565b14610ca257806040517ffdd040c2000000000000000000000000000000000000000000000000000000008152600401610c999190612926565b60405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f000000000000000000000000e592427a0aece92de3edee1f18e0157c0586156484602001516040518363ffffffff1660e01b8152600401610d21929190612946565b6020604051808303815f875af1158015610d3d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d619190612997565b505f6040518060a00160405280610d7784611a8b565b81526020013073ffffffffffffffffffffffffffffffffffffffff168152602001428152602001845f01518152602001846020015181525090505f7f000000000000000000000000e592427a0aece92de3edee1f18e0157c0586156473ffffffffffffffffffffffffffffffffffffffff1663f28c0498836040518263ffffffff1660e01b8152600401610e0b9190612abe565b6020604051808303815f875af1158015610e27573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e4b9190612719565b90508360200151811015610fa857825f01515f81518110610e6f57610e6e612ade565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d828660200151610ea291906125ee565b6040518263ffffffff1660e01b8152600401610ebe9190611dc0565b5f604051808303815f87803b158015610ed5575f80fd5b505af1158015610ee7573d5f803e3d5ffd5b505050505f856060015173ffffffffffffffffffffffffffffffffffffffff16828660200151610f1791906125ee565b604051610f23906126aa565b5f6040518083038185875af1925050503d805f8114610f5d576040519150601f19603f3d011682016040523d82523d5f602084013e610f62565b606091505b5050905080610fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9d90612b65565b60405180910390fd5b505b8460a0015173ffffffffffffffffffffffffffffffffffffffff1663095ea7b3308760400151875f0151610fdc91906125ee565b6040518363ffffffff1660e01b8152600401610ff9929190612946565b6020604051808303815f875af1158015611015573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110399190612997565b506110813086608001518760400151875f015161105691906125ee565b8860a0015173ffffffffffffffffffffffffffffffffffffffff1661179d909392919063ffffffff16565b7f1bd6c98146215f6f25fb7095aa7d6cc88e4cbe0fbf23c6ff4fad81ab3d1b4862855f01516040516110b39190611e46565b60405180910390a15050505050565b6110f06040516020016110d4906125ad565b60405160208183030381529060405280519060200120336115a5565b611126576040517fbe24598300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f015151600182602001515161113d9190612744565b1461117f57806040517ffdd040c20000000000000000000000000000000000000000000000000000000081526004016111769190612926565b60405180910390fd5b6111d18360600151308460200151845f01515f815181106111a3576111a2612ade565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1661179d909392919063ffffffff16565b805f01515f815181106111e7576111e6612ade565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f000000000000000000000000e592427a0aece92de3edee1f18e0157c0586156484602001516040518363ffffffff1660e01b815260040161124d929190612946565b6020604051808303815f875af1158015611269573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061128d9190612997565b505f6040518060a001604052806112a384611a8b565b81526020013073ffffffffffffffffffffffffffffffffffffffff168152602001428152602001845f01518152602001846020015181525090505f7f000000000000000000000000e592427a0aece92de3edee1f18e0157c0586156473ffffffffffffffffffffffffffffffffffffffff1663f28c0498836040518263ffffffff1660e01b81526004016113379190612abe565b6020604051808303815f875af1158015611353573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113779190612719565b9050836020015181101561148b57825f01515f8151811061139b5761139a612ade565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663095ea7b3308387602001516113cf91906125ee565b6040518363ffffffff1660e01b81526004016113ec929190612946565b6020604051808303815f875af1158015611408573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061142c9190612997565b5061148a30866060015183876020015161144691906125ee565b865f01515f8151811061145c5761145b612ade565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1661179d909392919063ffffffff16565b5b8460a0015173ffffffffffffffffffffffffffffffffffffffff1663095ea7b3308760400151875f01516114bf91906125ee565b6040518363ffffffff1660e01b81526004016114dc929190612946565b6020604051808303815f875af11580156114f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061151c9190612997565b506115643086608001518760400151875f015161153991906125ee565b8860a0015173ffffffffffffffffffffffffffffffffffffffff1661179d909392919063ffffffff16565b7f1bd6c98146215f6f25fb7095aa7d6cc88e4cbe0fbf23c6ff4fad81ab3d1b4862855f01516040516115969190611e46565b60405180910390a15050505050565b5f805f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f801b6116148161181f565b611642604051602001611626906125ad565b604051602081830303815290604052805190602001208361091b565b5050565b5f801b81565b5f801b6116588161181f565b61168660405160200161166a906125ad565b60405160208183030381529060405280519060200120836116ea565b5050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b73d0e698815bfe8d2ea1fda3fa0748646adbd3e9bf81565b7f000000000000000000000000e592427a0aece92de3edee1f18e0157c0586156481565b6116f382610536565b6116fc8161181f565b6117068383611923565b50505050565b60405160200161171b906125ad565b6040516020818303038152906040528051906020012081565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611819848573ffffffffffffffffffffffffffffffffffffffff166323b872dd8686866040516024016117d293929190612b83565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611bf8565b50505050565b6118308161182b61191c565b611c93565b50565b5f61183e83836115a5565b6119125760015f808581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506118af61191c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019050611916565b5f90505b92915050565b5f33905090565b5f61192e83836115a5565b15611a02575f805f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061199f61191c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a460019050611a06565b5f90505b92915050565b611a86838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401611a3f929190612946565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611bf8565b505050565b60605f6001836020015151611aa091906125ee565b90505b5f8110611b925781835f0151600183611abc9190612744565b81518110611acd57611acc612ade565b5b6020026020010151604051602001611ae59190612bfd565b604051602081830303815290604052604051602001611b05929190612c47565b60405160208183030381529060405291508183602001518281518110611b2e57611b2d612ade565b5b6020026020010151604051602001611b469190612c9e565b604051602081830303815290604052604051602001611b66929190612c47565b60405160208183030381529060405291505f810315611b92578080611b8a90612cb8565b915050611aa3565b81835f01515f81518110611ba957611ba8612ade565b5b6020026020010151604051602001611bc19190612bfd565b604051602081830303815290604052604051602001611be1929190612c47565b604051602081830303815290604052915050919050565b5f8060205f8451602086015f885af180611c17576040513d5f823e3d81fd5b3d92505f519150505f8214611c30576001811415611c4b565b5f8473ffffffffffffffffffffffffffffffffffffffff163b145b15611c8d57836040517f5274afe7000000000000000000000000000000000000000000000000000000008152600401611c8491906124cc565b60405180910390fd5b50505050565b611c9d82826115a5565b611ce05780826040517fe2517d3f000000000000000000000000000000000000000000000000000000008152600401611cd7929190612cdf565b60405180910390fd5b5050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611d2981611cf5565b8114611d33575f80fd5b50565b5f81359050611d4481611d20565b92915050565b5f60208284031215611d5f57611d5e611ced565b5b5f611d6c84828501611d36565b91505092915050565b5f8115159050919050565b611d8981611d75565b82525050565b5f602082019050611da25f830184611d80565b92915050565b5f819050919050565b611dba81611da8565b82525050565b5f602082019050611dd35f830184611db1565b92915050565b5f819050919050565b611deb81611dd9565b8114611df5575f80fd5b50565b5f81359050611e0681611de2565b92915050565b5f60208284031215611e2157611e20611ced565b5b5f611e2e84828501611df8565b91505092915050565b611e4081611dd9565b82525050565b5f602082019050611e595f830184611e37565b92915050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611ea982611e63565b810181811067ffffffffffffffff82111715611ec857611ec7611e73565b5b80604052505050565b5f611eda611ce4565b9050611ee68282611ea0565b919050565b5f80fd5b611ef881611da8565b8114611f02575f80fd5b50565b5f81359050611f1381611eef565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611f4282611f19565b9050919050565b611f5281611f38565b8114611f5c575f80fd5b50565b5f81359050611f6d81611f49565b92915050565b5f611f7d82611f19565b9050919050565b611f8d81611f73565b8114611f97575f80fd5b50565b5f81359050611fa881611f84565b92915050565b5f60c08284031215611fc357611fc2611e5f565b5b611fcd60c0611ed1565b90505f611fdc84828501611df8565b5f830152506020611fef84828501611f05565b602083015250604061200384828501611f05565b604083015250606061201784828501611f5f565b606083015250608061202b84828501611f5f565b60808301525060a061203f84828501611f9a565b60a08301525092915050565b5f60c082840312156120605761205f611ced565b5b5f61206d84828501611fae565b91505092915050565b5f6080828403121561208b5761208a611e5f565b5b6120956080611ed1565b90505f6120a484828501611df8565b5f8301525060206120b784828501611f05565b60208301525060406120cb84828501611f05565b60408301525060606120df84828501611f5f565b60608301525092915050565b5f60808284031215612100576120ff611ced565b5b5f61210d84828501612076565b91505092915050565b5f806040838503121561212c5761212b611ced565b5b5f61213985828601611df8565b925050602061214a85828601611f9a565b9150509250929050565b5f6020828403121561216957612168611ced565b5b5f61217684828501611f9a565b91505092915050565b5f806040838503121561219557612194611ced565b5b5f6121a285828601611f9a565b92505060206121b385828601611f5f565b9150509250929050565b5f604082840312156121d2576121d1611e5f565b5b6121dc6040611ed1565b90505f6121eb84828501611f05565b5f8301525060206121fe84828501611f05565b60208301525092915050565b5f80fd5b5f67ffffffffffffffff82111561222857612227611e73565b5b602082029050602081019050919050565b5f80fd5b5f61224f61224a8461220e565b611ed1565b9050808382526020820190506020840283018581111561227257612271612239565b5b835b8181101561229b57806122878882611f9a565b845260208401935050602081019050612274565b5050509392505050565b5f82601f8301126122b9576122b861220a565b5b81356122c984826020860161223d565b91505092915050565b5f67ffffffffffffffff8211156122ec576122eb611e73565b5b602082029050602081019050919050565b5f62ffffff82169050919050565b612314816122fd565b811461231e575f80fd5b50565b5f8135905061232f8161230b565b92915050565b5f612347612342846122d2565b611ed1565b9050808382526020820190506020840283018581111561236a57612369612239565b5b835b81811015612393578061237f8882612321565b84526020840193505060208101905061236c565b5050509392505050565b5f82601f8301126123b1576123b061220a565b5b81356123c1848260208601612335565b91505092915050565b5f604082840312156123df576123de611e5f565b5b6123e96040611ed1565b90505f82013567ffffffffffffffff81111561240857612407611eeb565b5b612414848285016122a5565b5f83015250602082013567ffffffffffffffff81111561243757612436611eeb565b5b6124438482850161239d565b60208301525092915050565b5f805f610120848603121561246757612466611ced565b5b5f61247486828701611fae565b93505060c0612485868287016121bd565b92505061010084013567ffffffffffffffff8111156124a7576124a6611cf1565b5b6124b3868287016123ca565b9150509250925092565b6124c681611f73565b82525050565b5f6020820190506124df5f8301846124bd565b92915050565b5f819050919050565b5f6125086125036124fe84611f19565b6124e5565b611f19565b9050919050565b5f612519826124ee565b9050919050565b5f61252a8261250f565b9050919050565b61253a81612520565b82525050565b5f6020820190506125535f830184612531565b92915050565b5f81905092915050565b7f4f50455241544f525f524f4c45000000000000000000000000000000000000005f82015250565b5f612597600d83612559565b91506125a282612563565b600d82019050919050565b5f6125b78261258b565b9150819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6125f882611da8565b915061260383611da8565b925082820390508181111561261b5761261a6125c1565b5b92915050565b5f6040820190506126345f830185611db1565b6126416020830184611db1565b9392505050565b5f60608201905061265b5f830186611db1565b6126686020830185611db1565b6126756040830184611db1565b949350505050565b5f81905092915050565b50565b5f6126955f8361267d565b91506126a082612687565b5f82019050919050565b5f6126b48261268a565b9150819050919050565b5f6126c88261250f565b9050919050565b6126d8816126be565b82525050565b5f6040820190506126f15f8301856126cf565b6126fe6020830184611db1565b9392505050565b5f8151905061271381611eef565b92915050565b5f6020828403121561272e5761272d611ced565b5b5f61273b84828501612705565b91505092915050565b5f61274e82611da8565b915061275983611da8565b9250828201905080821115612771576127706125c1565b5b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6127a981611f73565b82525050565b5f6127ba83836127a0565b60208301905092915050565b5f602082019050919050565b5f6127dc82612777565b6127e68185612781565b93506127f183612791565b805f5b8381101561282157815161280888826127af565b9750612813836127c6565b9250506001810190506127f4565b5085935050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b612860816122fd565b82525050565b5f6128718383612857565b60208301905092915050565b5f602082019050919050565b5f6128938261282e565b61289d8185612838565b93506128a883612848565b805f5b838110156128d85781516128bf8882612866565b97506128ca8361287d565b9250506001810190506128ab565b5085935050505092915050565b5f604083015f8301518482035f8601526128ff82826127d2565b915050602083015184820360208601526129198282612889565b9150508091505092915050565b5f6020820190508181035f83015261293e81846128e5565b905092915050565b5f6040820190506129595f8301856124bd565b6129666020830184611db1565b9392505050565b61297681611d75565b8114612980575f80fd5b50565b5f815190506129918161296d565b92915050565b5f602082840312156129ac576129ab611ced565b5b5f6129b984828501612983565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156129f95780820151818401526020810190506129de565b5f8484015250505050565b5f612a0e826129c2565b612a1881856129cc565b9350612a288185602086016129dc565b612a3181611e63565b840191505092915050565b612a4581611da8565b82525050565b5f60a083015f8301518482035f860152612a658282612a04565b9150506020830151612a7a60208601826127a0565b506040830151612a8d6040860182612a3c565b506060830151612aa06060860182612a3c565b506080830151612ab36080860182612a3c565b508091505092915050565b5f6020820190508181035f830152612ad68184612a4b565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82825260208201905092915050565b7f4475737420726566756e64206661696c656400000000000000000000000000005f82015250565b5f612b4f601283612b0b565b9150612b5a82612b1b565b602082019050919050565b5f6020820190508181035f830152612b7c81612b43565b9050919050565b5f606082019050612b965f8301866124bd565b612ba360208301856124bd565b612bb06040830184611db1565b949350505050565b5f8160601b9050919050565b5f612bce82612bb8565b9050919050565b5f612bdf82612bc4565b9050919050565b612bf7612bf282611f73565b612bd5565b82525050565b5f612c088284612be6565b60148201915081905092915050565b5f612c21826129c2565b612c2b818561267d565b9350612c3b8185602086016129dc565b80840191505092915050565b5f612c528285612c17565b9150612c5e8284612c17565b91508190509392505050565b5f8160e81b9050919050565b5f612c8082612c6a565b9050919050565b612c98612c93826122fd565b612c76565b82525050565b5f612ca98284612c87565b60038201915081905092915050565b5f612cc282611da8565b91505f8203612cd457612cd36125c1565b5b600182039050919050565b5f604082019050612cf25f8301856124bd565b612cff6020830184611e37565b939250505056fea264697066735822122038775c40a94183684b5c31370f759556571909429bd1b9c9f8153dd97a3bf36964736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000072ed7ce76a7bb01ae6af244c561bcc483db13a150000000000000000000000000000000000000000000000000000000000000080000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000003000000000000000000000000aa5dac843057407d5d5d103328a4325cce079677000000000000000000000000615d3b20ec4cf2155c5aa8b7c0faf04bec696eb800000000000000000000000028d3c19a75127dba0acaf7f86030859520791c72
-----Decoded View---------------
Arg [0] : _additionalAdmin (address): 0x72eD7cE76A7BB01ae6Af244C561bcc483DB13a15
Arg [1] : _operators (address[]): 0xAa5dAC843057407D5D5D103328A4325cce079677,0x615d3B20Ec4cf2155C5AA8B7c0FaF04BeC696eB8,0x28D3C19a75127dba0ACaf7f86030859520791C72
Arg [2] : _swapRouter (address): 0xE592427A0AEce92De3Edee1F18E0157C05861564
Arg [3] : weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 00000000000000000000000072ed7ce76a7bb01ae6af244c561bcc483db13a15
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564
Arg [3] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [5] : 000000000000000000000000aa5dac843057407d5d5d103328a4325cce079677
Arg [6] : 000000000000000000000000615d3b20ec4cf2155c5aa8b7c0faf04bec696eb8
Arg [7] : 00000000000000000000000028d3c19a75127dba0acaf7f86030859520791c72
Deployed Bytecode Sourcemap
37611:9821:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30904:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37935:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37872:56;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32184:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41855:670;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40228:1465;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32616:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33753:251;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46262:345;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46615:251;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44479:1715;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42533:1938;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31200:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37004:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30512:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37249:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37738:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37774:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37692:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33047:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35773:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30904:204;30989:4;31028:32;31013:47;;;:11;:47;;;;:87;;;;31064:36;31088:11;31064:23;:36::i;:::-;31013:87;31006:94;;30904:204;;;:::o;37935:53::-;37978:10;37935:53;:::o;37872:56::-;37915:13;37872:56;:::o;32184:122::-;32249:7;32276:6;:12;32283:4;32276:12;;;;;;;;;;;:22;;;32269:29;;32184:122;;;:::o;41855:670::-;36813:34;35832:33;;;;;;;:::i;:::-;;;;;;;;;;;;;35822:44;;;;;;36836:10;36813:7;:34::i;:::-;36808:89;;36871:14;;;;;;;;;;;;;;36808:89;42052:156:::1;42106:8;:14;;;42135:8;:17;;;42185:8;:12;;;42167:8;:15;;;:30;;;;:::i;:::-;42059:8;:14;;;42052:39;;;;:156;;;;;;:::i;:::-;42263:134;42317:8;:14;;;42354:4;42374:8;:12;;;42270:8;:14;;;42263:39;;;;:134;;;;;;:::i;:::-;42478:39;42505:8;:11;;;42478:39;;;;;;:::i;:::-;;;;;;;;41855:670:::0;:::o;40228:1465::-;40387:9;40368:8;:15;;;:28;40364:181;;40467:8;:15;;;40508:9;40420:113;;;;;;;;;;;;:::i;:::-;;;;;;;;40364:181;40589:1;40560:31;;:8;:17;;;:31;;;40555:96;;40616:23;;;;;;;;;;;;;;40555:96;40680:8;:15;;;40665:8;:12;;;:30;40661:181;;;40760:8;:12;;;40799:8;:15;;;40719:111;;;;;;;;;;;;:::i;:::-;;;;;;;;40661:181;37915:13;40871:8;:15;;;:34;40870:89;;;;37978:10;40924:8;:15;;;:34;40870:89;40852:322;;;41037:8;:15;;;37915:13;37978:10;40993:169;;;;;;;;;;;;;:::i;:::-;;;;;;;;40852:322;41259:12;41277:8;:17;;;:22;;41339:8;:12;;;41321:8;:15;;;:30;;;;:::i;:::-;41277:89;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41258:108;;;41382:7;41377:188;;41463:8;:17;;;41525:8;:12;;;41507:8;:15;;;:30;;;;:::i;:::-;41413:140;;;;;;;;;;;;:::i;:::-;;;;;;;;41377:188;41645:40;41673:8;:11;;;41645:40;;;;;;:::i;:::-;;;;;;;;40324:1369;40228:1465;:::o;32616:138::-;32690:18;32703:4;32690:12;:18::i;:::-;30796:16;30807:4;30796:10;:16::i;:::-;32721:25:::1;32732:4;32738:7;32721:10;:25::i;:::-;;32616:138:::0;;;:::o;33753:251::-;33869:12;:10;:12::i;:::-;33847:34;;:18;:34;;;33843:104;;33905:30;;;;;;;;;;;;;;33843:104;33959:37;33971:4;33977:18;33959:11;:37::i;:::-;;33753:251;;:::o;46262:345::-;30557:4;46313:18;;30796:16;30807:4;30796:10;:16::i;:::-;46365:1:::1;46348:19;;:5;:19;;::::0;46344:256:::1;;37821:42;46384:29;;:52;46414:21;46384:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;46344:256;;;46469:15;46494:5;46487:23;;;46519:4;46487:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46469:56;;46540:48;37821:42;46580:7;46547:5;46540:26;;;;:48;;;;;:::i;:::-;46454:146;46344:256;46262:345:::0;;:::o;46615:251::-;30557:4;46715:18;;30796:16;30807:4;30796:10;:16::i;:::-;46746:15:::1;46771:5;46764:23;;;46796:4;46764:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46746:56;;46813:45;46840:8;46850:7;46820:5;46813:26;;;;:45;;;;;:::i;:::-;46735:131;46615:251:::0;;;:::o;44479:1715::-;44658:4;44652:19;;;44679:9;44652:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44730:4;:11;;;:18;44725:1;44706:4;:9;;;:16;:20;;;;:::i;:::-;:42;44702:111;;44795:4;44772:29;;;;;;;;;;;:::i;:::-;;;;;;;;44702:111;44832:4;44825:20;;;44854:10;44867:4;:20;;;44825:63;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44901:43;44947:288;;;;;;;;45016:16;45027:4;45016:10;:16::i;:::-;44947:288;;;;45070:4;44947:288;;;;;;45104:15;44947:288;;;;45149:4;:14;;;44947:288;;;;45199:4;:20;;;44947:288;;;44901:334;;45248:16;45267:10;:22;;;45290:6;45267:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45248:49;;45482:4;:20;;;45471:8;:31;45467:309;;;45525:4;:11;;;45537:1;45525:14;;;;;;;;:::i;:::-;;;;;;;;45519:30;;;45573:8;45550:4;:20;;;:31;;;;:::i;:::-;45519:63;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45598:12;45616:8;:14;;;:19;;45684:8;45661:4;:20;;;:31;;;;:::i;:::-;45616:95;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45597:114;;;45734:7;45726:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;45504:272;45467:309;45795:8;:14;;;45788:30;;;45841:4;45878:8;:12;;;45861:4;:14;;;:29;;;;:::i;:::-;45788:113;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45912:154;45974:4;45994:8;:17;;;46043:8;:12;;;46026:4;:14;;;:29;;;;:::i;:::-;45919:8;:14;;;45912:39;;;;:154;;;;;;:::i;:::-;46147:39;46174:8;:11;;;46147:39;;;;;;:::i;:::-;;;;;;;;44641:1553;;44479:1715;;;:::o;42533:1938::-;36813:34;35832:33;;;;;;;:::i;:::-;;;;;;;;;;;;;35822:44;;;;;;36836:10;36813:7;:34::i;:::-;36808:89;;36871:14;;;;;;;;;;;;;;36808:89;42741:4:::1;:11;;;:18;42736:1;42717:4;:9;;;:16;:20;;;;:::i;:::-;:42;42713:111;;42806:4;42783:29;;;;;;;;;;;:::i;:::-;;;;;;;;42713:111;42836:142;42890:8;:14;;;42927:4;42947;:20;;;42843:4;:11;;;42855:1;42843:14;;;;;;;;:::i;:::-;;;;;;;;42836:39;;;;:142;;;;;;:::i;:::-;42996:4;:11;;;43008:1;42996:14;;;;;;;;:::i;:::-;;;;;;;;42989:30;;;43042:10;43068:4;:20;;;42989:110;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;43112:43;43158:288;;;;;;;;43227:16;43238:4;43227:10;:16::i;:::-;43158:288;;;;43281:4;43158:288;;;;;;43315:15;43158:288;;;;43360:4;:14;;;43158:288;;;;43410:4;:20;;;43158:288;;::::0;43112:334:::1;;43459:16;43478:10;:22;;;43501:6;43478:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43459:49;;43693:4;:20;;;43682:8;:31;43678:375;;;43737:4;:11;;;43749:1;43737:14;;;;;;;;:::i;:::-;;;;;;;;43730:30;;;43787:4;43834:8;43811:4;:20;;;:31;;;;:::i;:::-;43730:127;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;43872:169;43938:4;43962:8;:14;;;44018:8;43995:4;:20;;;:31;;;;:::i;:::-;43879:4;:11;;;43891:1;43879:14;;;;;;;;:::i;:::-;;;;;;;;43872:39;;;;:169;;;;;;:::i;:::-;43678:375;44072:8;:14;;;44065:30;;;44118:4;44155:8;:12;;;44138:4;:14;;;:29;;;;:::i;:::-;44065:113;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44189:154;44251:4;44271:8;:17;;;44320:8;:12;;;44303:4;:14;;;:29;;;;:::i;:::-;44196:8;:14;;;44189:39;;;;:154;;;;;;:::i;:::-;44424:39;44451:8;:11;;;44424:39;;;;;;:::i;:::-;;;;;;;;42702:1769;;42533:1938:::0;;;:::o;31200:138::-;31277:4;31301:6;:12;31308:4;31301:12;;;;;;;;;;;:20;;:29;31322:7;31301:29;;;;;;;;;;;;;;;;;;;;;;;;;31294:36;;31200:138;;;;:::o;37004:148::-;30557:4;37078:18;;30796:16;30807:4;30796:10;:16::i;:::-;37109:35:::1;35832:33;;;;;;;:::i;:::-;;;;;;;;;;;;;35822:44;;;;;;37134:9;37109;:35::i;:::-;37004:148:::0;;:::o;30512:49::-;30557:4;30512:49;;;:::o;37249:152::-;30557:4;37326:18;;30796:16;30807:4;30796:10;:16::i;:::-;37357:36:::1;35832:33;;;;;;;:::i;:::-;;;;;;;;;;;;;35822:44;;;;;;37383:9;37357:10;:36::i;:::-;37249:152:::0;;:::o;37738:29::-;;;:::o;37774:89::-;37821:42;37774:89;:::o;37692:39::-;;;:::o;33047:140::-;33122:18;33135:4;33122:12;:18::i;:::-;30796:16;30807:4;30796:10;:16::i;:::-;33153:26:::1;33165:4;33171:7;33153:11;:26::i;:::-;;33047:140:::0;;;:::o;35773:93::-;35832:33;;;;;;;:::i;:::-;;;;;;;;;;;;;35822:44;;;;;;35773:93;:::o;28240:148::-;28316:4;28355:25;28340:40;;;:11;:40;;;;28333:47;;28240:148;;;:::o;14337:190::-;14438:81;14458:5;14480;:18;;;14501:4;14507:2;14511:5;14465:53;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14438:19;:81::i;:::-;14337:190;;;;:::o;31553:105::-;31620:30;31631:4;31637:12;:10;:12::i;:::-;31620:10;:30::i;:::-;31553:105;:::o;34630:324::-;34707:4;34729:22;34737:4;34743:7;34729;:22::i;:::-;34724:223;;34800:4;34768:6;:12;34775:4;34768:12;;;;;;;;;;;:20;;:29;34789:7;34768:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;34851:12;:10;:12::i;:::-;34824:40;;34842:7;34824:40;;34836:4;34824:40;;;;;;;;;;34886:4;34879:11;;;;34724:223;34930:5;34923:12;;34630:324;;;;;:::o;27137:98::-;27190:7;27217:10;27210:17;;27137:98;:::o;35200:325::-;35278:4;35299:22;35307:4;35313:7;35299;:22::i;:::-;35295:223;;;35370:5;35338:6;:12;35345:4;35338:12;;;;;;;;;;;:20;;:29;35359:7;35338:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;35422:12;:10;:12::i;:::-;35395:40;;35413:7;35395:40;;35407:4;35395:40;;;;;;;;;;35457:4;35450:11;;;;35295:223;35501:5;35494:12;;35200:325;;;;;:::o;13930:162::-;14013:71;14033:5;14055;:14;;;14072:2;14076:5;14040:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14013:19;:71::i;:::-;13930:162;;;:::o;46874:555::-;46951:20;46984:6;47012:1;46993:4;:9;;;:16;:20;;;;:::i;:::-;46984:29;;47024:322;47036:1;47031;:6;47024:322;;47095:7;47138:4;:11;;;47154:1;47150;:5;;;;:::i;:::-;47138:18;;;;;;;;:::i;:::-;;;;;;;;47121:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;47064:108;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47054:118;;47210:7;47236:4;:9;;;47246:1;47236:12;;;;;;;;:::i;:::-;;;;;;;;47219:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;47197:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47187:63;;47274:1;47269;:6;47265:52;47296:5;47265:52;47331:3;;;;;:::i;:::-;;;;47024:322;;;47379:7;47405:4;:11;;;47417:1;47405:14;;;;;;;;:::i;:::-;;;;;;;;47388:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;47366:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47356:65;;46973:456;46874:555;;;:::o;21221:738::-;21302:18;21331:19;21471:4;21468:1;21461:4;21455:11;21448:4;21442;21438:15;21435:1;21428:5;21421;21416:60;21530:7;21520:180;;21575:4;21569:11;21621:16;21618:1;21613:3;21598:40;21668:16;21663:3;21656:29;21520:180;21728:16;21714:30;;21779:1;21773:8;21758:23;;21386:406;21822:1;21808:10;:15;:68;;21875:1;21860:11;:16;;21808:68;;;21856:1;21834:5;21826:26;;;:31;21808:68;21804:148;;;21933:5;21900:40;;;;;;;;;;;:::i;:::-;;;;;;;;21804:148;21291:668;;21221:738;;:::o;31794:201::-;31883:22;31891:4;31897:7;31883;:22::i;:::-;31878:110;;31962:7;31971:4;31929:47;;;;;;;;;;;;:::i;:::-;;;;;;;;31878:110;31794:201;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:118::-;1688:24;1706:5;1688:24;:::i;:::-;1683:3;1676:37;1601:118;;:::o;1725:222::-;1818:4;1856:2;1845:9;1841:18;1833:26;;1869:71;1937:1;1926:9;1922:17;1913:6;1869:71;:::i;:::-;1725:222;;;;:::o;1953:77::-;1990:7;2019:5;2008:16;;1953:77;;;:::o;2036:122::-;2109:24;2127:5;2109:24;:::i;:::-;2102:5;2099:35;2089:63;;2148:1;2145;2138:12;2089:63;2036:122;:::o;2164:139::-;2210:5;2248:6;2235:20;2226:29;;2264:33;2291:5;2264:33;:::i;:::-;2164:139;;;;:::o;2309:329::-;2368:6;2417:2;2405:9;2396:7;2392:23;2388:32;2385:119;;;2423:79;;:::i;:::-;2385:119;2543:1;2568:53;2613:7;2604:6;2593:9;2589:22;2568:53;:::i;:::-;2558:63;;2514:117;2309:329;;;;:::o;2644:118::-;2731:24;2749:5;2731:24;:::i;:::-;2726:3;2719:37;2644:118;;:::o;2768:222::-;2861:4;2899:2;2888:9;2884:18;2876:26;;2912:71;2980:1;2969:9;2965:17;2956:6;2912:71;:::i;:::-;2768:222;;;;:::o;2996:117::-;3105:1;3102;3095:12;3119:102;3160:6;3211:2;3207:7;3202:2;3195:5;3191:14;3187:28;3177:38;;3119:102;;;:::o;3227:180::-;3275:77;3272:1;3265:88;3372:4;3369:1;3362:15;3396:4;3393:1;3386:15;3413:281;3496:27;3518:4;3496:27;:::i;:::-;3488:6;3484:40;3626:6;3614:10;3611:22;3590:18;3578:10;3575:34;3572:62;3569:88;;;3637:18;;:::i;:::-;3569:88;3677:10;3673:2;3666:22;3456:238;3413:281;;:::o;3700:129::-;3734:6;3761:20;;:::i;:::-;3751:30;;3790:33;3818:4;3810:6;3790:33;:::i;:::-;3700:129;;;:::o;3835:117::-;3944:1;3941;3934:12;3958:122;4031:24;4049:5;4031:24;:::i;:::-;4024:5;4021:35;4011:63;;4070:1;4067;4060:12;4011:63;3958:122;:::o;4086:139::-;4132:5;4170:6;4157:20;4148:29;;4186:33;4213:5;4186:33;:::i;:::-;4086:139;;;;:::o;4231:126::-;4268:7;4308:42;4301:5;4297:54;4286:65;;4231:126;;;:::o;4363:104::-;4408:7;4437:24;4455:5;4437:24;:::i;:::-;4426:35;;4363:104;;;:::o;4473:138::-;4554:32;4580:5;4554:32;:::i;:::-;4547:5;4544:43;4534:71;;4601:1;4598;4591:12;4534:71;4473:138;:::o;4617:155::-;4671:5;4709:6;4696:20;4687:29;;4725:41;4760:5;4725:41;:::i;:::-;4617:155;;;;:::o;4778:96::-;4815:7;4844:24;4862:5;4844:24;:::i;:::-;4833:35;;4778:96;;;:::o;4880:122::-;4953:24;4971:5;4953:24;:::i;:::-;4946:5;4943:35;4933:63;;4992:1;4989;4982:12;4933:63;4880:122;:::o;5008:139::-;5054:5;5092:6;5079:20;5070:29;;5108:33;5135:5;5108:33;:::i;:::-;5008:139;;;;:::o;5199:1247::-;5279:5;5323:4;5311:9;5306:3;5302:19;5298:30;5295:117;;;5331:79;;:::i;:::-;5295:117;5430:21;5446:4;5430:21;:::i;:::-;5421:30;;5508:1;5548:49;5593:3;5584:6;5573:9;5569:22;5548:49;:::i;:::-;5541:4;5534:5;5530:16;5523:75;5461:148;5670:2;5711:49;5756:3;5747:6;5736:9;5732:22;5711:49;:::i;:::-;5704:4;5697:5;5693:16;5686:75;5619:153;5830:2;5871:49;5916:3;5907:6;5896:9;5892:22;5871:49;:::i;:::-;5864:4;5857:5;5853:16;5846:75;5782:150;5992:2;6033:57;6086:3;6077:6;6066:9;6062:22;6033:57;:::i;:::-;6026:4;6019:5;6015:16;6008:83;5942:160;6165:3;6207:57;6260:3;6251:6;6240:9;6236:22;6207:57;:::i;:::-;6200:4;6193:5;6189:16;6182:83;6112:164;6336:3;6378:49;6423:3;6414:6;6403:9;6399:22;6378:49;:::i;:::-;6371:4;6364:5;6360:16;6353:75;6286:153;5199:1247;;;;:::o;6452:392::-;6542:6;6591:3;6579:9;6570:7;6566:23;6562:33;6559:120;;;6598:79;;:::i;:::-;6559:120;6718:1;6743:84;6819:7;6810:6;6799:9;6795:22;6743:84;:::i;:::-;6733:94;;6689:148;6452:392;;;;:::o;6897:914::-;6978:5;7022:4;7010:9;7005:3;7001:19;6997:30;6994:117;;;7030:79;;:::i;:::-;6994:117;7129:21;7145:4;7129:21;:::i;:::-;7120:30;;7207:1;7247:49;7292:3;7283:6;7272:9;7268:22;7247:49;:::i;:::-;7240:4;7233:5;7229:16;7222:75;7160:148;7369:2;7410:49;7455:3;7446:6;7435:9;7431:22;7410:49;:::i;:::-;7403:4;7396:5;7392:16;7385:75;7318:153;7529:2;7570:49;7615:3;7606:6;7595:9;7591:22;7570:49;:::i;:::-;7563:4;7556:5;7552:16;7545:75;7481:150;7694:2;7735:57;7788:3;7779:6;7768:9;7764:22;7735:57;:::i;:::-;7728:4;7721:5;7717:16;7710:83;7641:163;6897:914;;;;:::o;7817:394::-;7908:6;7957:3;7945:9;7936:7;7932:23;7928:33;7925:120;;;7964:79;;:::i;:::-;7925:120;8084:1;8109:85;8186:7;8177:6;8166:9;8162:22;8109:85;:::i;:::-;8099:95;;8055:149;7817:394;;;;:::o;8217:474::-;8285:6;8293;8342:2;8330:9;8321:7;8317:23;8313:32;8310:119;;;8348:79;;:::i;:::-;8310:119;8468:1;8493:53;8538:7;8529:6;8518:9;8514:22;8493:53;:::i;:::-;8483:63;;8439:117;8595:2;8621:53;8666:7;8657:6;8646:9;8642:22;8621:53;:::i;:::-;8611:63;;8566:118;8217:474;;;;;:::o;8697:329::-;8756:6;8805:2;8793:9;8784:7;8780:23;8776:32;8773:119;;;8811:79;;:::i;:::-;8773:119;8931:1;8956:53;9001:7;8992:6;8981:9;8977:22;8956:53;:::i;:::-;8946:63;;8902:117;8697:329;;;;:::o;9032:490::-;9108:6;9116;9165:2;9153:9;9144:7;9140:23;9136:32;9133:119;;;9171:79;;:::i;:::-;9133:119;9291:1;9316:53;9361:7;9352:6;9341:9;9337:22;9316:53;:::i;:::-;9306:63;;9262:117;9418:2;9444:61;9497:7;9488:6;9477:9;9473:22;9444:61;:::i;:::-;9434:71;;9389:126;9032:490;;;;;:::o;9565:587::-;9636:5;9680:4;9668:9;9663:3;9659:19;9655:30;9652:117;;;9688:79;;:::i;:::-;9652:117;9787:21;9803:4;9787:21;:::i;:::-;9778:30;;9872:1;9912:49;9957:3;9948:6;9937:9;9933:22;9912:49;:::i;:::-;9905:4;9898:5;9894:16;9887:75;9818:155;10043:2;10084:49;10129:3;10120:6;10109:9;10105:22;10084:49;:::i;:::-;10077:4;10070:5;10066:16;10059:75;9983:162;9565:587;;;;:::o;10158:117::-;10267:1;10264;10257:12;10281:311;10358:4;10448:18;10440:6;10437:30;10434:56;;;10470:18;;:::i;:::-;10434:56;10520:4;10512:6;10508:17;10500:25;;10580:4;10574;10570:15;10562:23;;10281:311;;;:::o;10598:117::-;10707:1;10704;10697:12;10738:710;10834:5;10859:81;10875:64;10932:6;10875:64;:::i;:::-;10859:81;:::i;:::-;10850:90;;10960:5;10989:6;10982:5;10975:21;11023:4;11016:5;11012:16;11005:23;;11076:4;11068:6;11064:17;11056:6;11052:30;11105:3;11097:6;11094:15;11091:122;;;11124:79;;:::i;:::-;11091:122;11239:6;11222:220;11256:6;11251:3;11248:15;11222:220;;;11331:3;11360:37;11393:3;11381:10;11360:37;:::i;:::-;11355:3;11348:50;11427:4;11422:3;11418:14;11411:21;;11298:144;11282:4;11277:3;11273:14;11266:21;;11222:220;;;11226:21;10840:608;;10738:710;;;;;:::o;11471:370::-;11542:5;11591:3;11584:4;11576:6;11572:17;11568:27;11558:122;;11599:79;;:::i;:::-;11558:122;11716:6;11703:20;11741:94;11831:3;11823:6;11816:4;11808:6;11804:17;11741:94;:::i;:::-;11732:103;;11548:293;11471:370;;;;:::o;11847:310::-;11923:4;12013:18;12005:6;12002:30;11999:56;;;12035:18;;:::i;:::-;11999:56;12085:4;12077:6;12073:17;12065:25;;12145:4;12139;12135:15;12127:23;;11847:310;;;:::o;12163:91::-;12199:7;12239:8;12232:5;12228:20;12217:31;;12163:91;;;:::o;12260:120::-;12332:23;12349:5;12332:23;:::i;:::-;12325:5;12322:34;12312:62;;12370:1;12367;12360:12;12312:62;12260:120;:::o;12386:137::-;12431:5;12469:6;12456:20;12447:29;;12485:32;12511:5;12485:32;:::i;:::-;12386:137;;;;:::o;12545:707::-;12640:5;12665:80;12681:63;12737:6;12681:63;:::i;:::-;12665:80;:::i;:::-;12656:89;;12765:5;12794:6;12787:5;12780:21;12828:4;12821:5;12817:16;12810:23;;12881:4;12873:6;12869:17;12861:6;12857:30;12910:3;12902:6;12899:15;12896:122;;;12929:79;;:::i;:::-;12896:122;13044:6;13027:219;13061:6;13056:3;13053:15;13027:219;;;13136:3;13165:36;13197:3;13185:10;13165:36;:::i;:::-;13160:3;13153:49;13231:4;13226:3;13222:14;13215:21;;13103:143;13087:4;13082:3;13078:14;13071:21;;13027:219;;;13031:21;12646:606;;12545:707;;;;;:::o;13274:368::-;13344:5;13393:3;13386:4;13378:6;13374:17;13370:27;13360:122;;13401:79;;:::i;:::-;13360:122;13518:6;13505:20;13543:93;13632:3;13624:6;13617:4;13609:6;13605:17;13543:93;:::i;:::-;13534:102;;13350:292;13274:368;;;;:::o;13685:942::-;13756:5;13800:4;13788:9;13783:3;13779:19;13775:30;13772:117;;;13808:79;;:::i;:::-;13772:117;13907:21;13923:4;13907:21;:::i;:::-;13898:30;;14017:1;14006:9;14002:17;13989:31;14047:18;14039:6;14036:30;14033:117;;;14069:79;;:::i;:::-;14033:117;14189:74;14259:3;14250:6;14239:9;14235:22;14189:74;:::i;:::-;14182:4;14175:5;14171:16;14164:100;13938:337;14362:2;14351:9;14347:18;14334:32;14393:18;14385:6;14382:30;14379:117;;;14415:79;;:::i;:::-;14379:117;14535:73;14604:3;14595:6;14584:9;14580:22;14535:73;:::i;:::-;14528:4;14521:5;14517:16;14510:99;14285:335;13685:942;;;;:::o;14633:932::-;14785:6;14793;14801;14850:3;14838:9;14829:7;14825:23;14821:33;14818:120;;;14857:79;;:::i;:::-;14818:120;14977:1;15002:84;15078:7;15069:6;15058:9;15054:22;15002:84;:::i;:::-;14992:94;;14948:148;15135:3;15162:75;15229:7;15220:6;15209:9;15205:22;15162:75;:::i;:::-;15152:85;;15106:141;15314:3;15303:9;15299:19;15286:33;15346:18;15338:6;15335:30;15332:117;;;15368:79;;:::i;:::-;15332:117;15473:75;15540:7;15531:6;15520:9;15516:22;15473:75;:::i;:::-;15463:85;;15257:301;14633:932;;;;;:::o;15571:118::-;15658:24;15676:5;15658:24;:::i;:::-;15653:3;15646:37;15571:118;;:::o;15695:222::-;15788:4;15826:2;15815:9;15811:18;15803:26;;15839:71;15907:1;15896:9;15892:17;15883:6;15839:71;:::i;:::-;15695:222;;;;:::o;15923:60::-;15951:3;15972:5;15965:12;;15923:60;;;:::o;15989:142::-;16039:9;16072:53;16090:34;16099:24;16117:5;16099:24;:::i;:::-;16090:34;:::i;:::-;16072:53;:::i;:::-;16059:66;;15989:142;;;:::o;16137:126::-;16187:9;16220:37;16251:5;16220:37;:::i;:::-;16207:50;;16137:126;;;:::o;16269:145::-;16338:9;16371:37;16402:5;16371:37;:::i;:::-;16358:50;;16269:145;;;:::o;16420:169::-;16526:56;16576:5;16526:56;:::i;:::-;16521:3;16514:69;16420:169;;:::o;16595:260::-;16707:4;16745:2;16734:9;16730:18;16722:26;;16758:90;16845:1;16834:9;16830:17;16821:6;16758:90;:::i;:::-;16595:260;;;;:::o;16861:148::-;16963:11;17000:3;16985:18;;16861:148;;;;:::o;17015:163::-;17155:15;17151:1;17143:6;17139:14;17132:39;17015:163;:::o;17184:402::-;17344:3;17365:85;17447:2;17442:3;17365:85;:::i;:::-;17358:92;;17459:93;17548:3;17459:93;:::i;:::-;17577:2;17572:3;17568:12;17561:19;;17184:402;;;:::o;17592:381::-;17777:3;17799:148;17943:3;17799:148;:::i;:::-;17792:155;;17964:3;17957:10;;17592:381;;;:::o;17979:180::-;18027:77;18024:1;18017:88;18124:4;18121:1;18114:15;18148:4;18145:1;18138:15;18165:194;18205:4;18225:20;18243:1;18225:20;:::i;:::-;18220:25;;18259:20;18277:1;18259:20;:::i;:::-;18254:25;;18303:1;18300;18296:9;18288:17;;18327:1;18321:4;18318:11;18315:37;;;18332:18;;:::i;:::-;18315:37;18165:194;;;;:::o;18365:332::-;18486:4;18524:2;18513:9;18509:18;18501:26;;18537:71;18605:1;18594:9;18590:17;18581:6;18537:71;:::i;:::-;18618:72;18686:2;18675:9;18671:18;18662:6;18618:72;:::i;:::-;18365:332;;;;;:::o;18703:442::-;18852:4;18890:2;18879:9;18875:18;18867:26;;18903:71;18971:1;18960:9;18956:17;18947:6;18903:71;:::i;:::-;18984:72;19052:2;19041:9;19037:18;19028:6;18984:72;:::i;:::-;19066;19134:2;19123:9;19119:18;19110:6;19066:72;:::i;:::-;18703:442;;;;;;:::o;19151:147::-;19252:11;19289:3;19274:18;;19151:147;;;;:::o;19304:114::-;;:::o;19424:398::-;19583:3;19604:83;19685:1;19680:3;19604:83;:::i;:::-;19597:90;;19696:93;19785:3;19696:93;:::i;:::-;19814:1;19809:3;19805:11;19798:18;;19424:398;;;:::o;19828:379::-;20012:3;20034:147;20177:3;20034:147;:::i;:::-;20027:154;;20198:3;20191:10;;19828:379;;;:::o;20213:134::-;20271:9;20304:37;20335:5;20304:37;:::i;:::-;20291:50;;20213:134;;;:::o;20353:147::-;20448:45;20487:5;20448:45;:::i;:::-;20443:3;20436:58;20353:147;;:::o;20506:348::-;20635:4;20673:2;20662:9;20658:18;20650:26;;20686:79;20762:1;20751:9;20747:17;20738:6;20686:79;:::i;:::-;20775:72;20843:2;20832:9;20828:18;20819:6;20775:72;:::i;:::-;20506:348;;;;;:::o;20860:143::-;20917:5;20948:6;20942:13;20933:22;;20964:33;20991:5;20964:33;:::i;:::-;20860:143;;;;:::o;21009:351::-;21079:6;21128:2;21116:9;21107:7;21103:23;21099:32;21096:119;;;21134:79;;:::i;:::-;21096:119;21254:1;21279:64;21335:7;21326:6;21315:9;21311:22;21279:64;:::i;:::-;21269:74;;21225:128;21009:351;;;;:::o;21366:191::-;21406:3;21425:20;21443:1;21425:20;:::i;:::-;21420:25;;21459:20;21477:1;21459:20;:::i;:::-;21454:25;;21502:1;21499;21495:9;21488:16;;21523:3;21520:1;21517:10;21514:36;;;21530:18;;:::i;:::-;21514:36;21366:191;;;;:::o;21563:114::-;21630:6;21664:5;21658:12;21648:22;;21563:114;;;:::o;21683:174::-;21772:11;21806:6;21801:3;21794:19;21846:4;21841:3;21837:14;21822:29;;21683:174;;;;:::o;21863:132::-;21930:4;21953:3;21945:11;;21983:4;21978:3;21974:14;21966:22;;21863:132;;;:::o;22001:108::-;22078:24;22096:5;22078:24;:::i;:::-;22073:3;22066:37;22001:108;;:::o;22115:179::-;22184:10;22205:46;22247:3;22239:6;22205:46;:::i;:::-;22283:4;22278:3;22274:14;22260:28;;22115:179;;;;:::o;22300:113::-;22370:4;22402;22397:3;22393:14;22385:22;;22300:113;;;:::o;22449:712::-;22558:3;22587:54;22635:5;22587:54;:::i;:::-;22657:76;22726:6;22721:3;22657:76;:::i;:::-;22650:83;;22757:56;22807:5;22757:56;:::i;:::-;22836:7;22867:1;22852:284;22877:6;22874:1;22871:13;22852:284;;;22953:6;22947:13;22980:63;23039:3;23024:13;22980:63;:::i;:::-;22973:70;;23066:60;23119:6;23066:60;:::i;:::-;23056:70;;22912:224;22899:1;22896;22892:9;22887:14;;22852:284;;;22856:14;23152:3;23145:10;;22563:598;;;22449:712;;;;:::o;23167:113::-;23233:6;23267:5;23261:12;23251:22;;23167:113;;;:::o;23286:173::-;23374:11;23408:6;23403:3;23396:19;23448:4;23443:3;23439:14;23424:29;;23286:173;;;;:::o;23465:131::-;23531:4;23554:3;23546:11;;23584:4;23579:3;23575:14;23567:22;;23465:131;;;:::o;23602:105::-;23677:23;23694:5;23677:23;:::i;:::-;23672:3;23665:36;23602:105;;:::o;23713:175::-;23780:10;23801:44;23841:3;23833:6;23801:44;:::i;:::-;23877:4;23872:3;23868:14;23854:28;;23713:175;;;;:::o;23894:112::-;23963:4;23995;23990:3;23986:14;23978:22;;23894:112;;;:::o;24040:704::-;24147:3;24176:53;24223:5;24176:53;:::i;:::-;24245:75;24313:6;24308:3;24245:75;:::i;:::-;24238:82;;24344:55;24393:5;24344:55;:::i;:::-;24422:7;24453:1;24438:281;24463:6;24460:1;24457:13;24438:281;;;24539:6;24533:13;24566:61;24623:3;24608:13;24566:61;:::i;:::-;24559:68;;24650:59;24702:6;24650:59;:::i;:::-;24640:69;;24498:221;24485:1;24482;24478:9;24473:14;;24438:281;;;24442:14;24735:3;24728:10;;24152:592;;;24040:704;;;;:::o;24820:731::-;24933:3;24969:4;24964:3;24960:14;25058:4;25051:5;25047:16;25041:23;25111:3;25105:4;25101:14;25094:4;25089:3;25085:14;25078:38;25137:103;25235:4;25221:12;25137:103;:::i;:::-;25129:111;;24984:267;25333:4;25326:5;25322:16;25316:23;25386:3;25380:4;25376:14;25369:4;25364:3;25360:14;25353:38;25412:101;25508:4;25494:12;25412:101;:::i;:::-;25404:109;;25261:263;25541:4;25534:11;;24938:613;24820:731;;;;:::o;25557:361::-;25694:4;25732:2;25721:9;25717:18;25709:26;;25781:9;25775:4;25771:20;25767:1;25756:9;25752:17;25745:47;25809:102;25906:4;25897:6;25809:102;:::i;:::-;25801:110;;25557:361;;;;:::o;25924:332::-;26045:4;26083:2;26072:9;26068:18;26060:26;;26096:71;26164:1;26153:9;26149:17;26140:6;26096:71;:::i;:::-;26177:72;26245:2;26234:9;26230:18;26221:6;26177:72;:::i;:::-;25924:332;;;;;:::o;26262:116::-;26332:21;26347:5;26332:21;:::i;:::-;26325:5;26322:32;26312:60;;26368:1;26365;26358:12;26312:60;26262:116;:::o;26384:137::-;26438:5;26469:6;26463:13;26454:22;;26485:30;26509:5;26485:30;:::i;:::-;26384:137;;;;:::o;26527:345::-;26594:6;26643:2;26631:9;26622:7;26618:23;26614:32;26611:119;;;26649:79;;:::i;:::-;26611:119;26769:1;26794:61;26847:7;26838:6;26827:9;26823:22;26794:61;:::i;:::-;26784:71;;26740:125;26527:345;;;;:::o;26878:98::-;26929:6;26963:5;26957:12;26947:22;;26878:98;;;:::o;26982:158::-;27055:11;27089:6;27084:3;27077:19;27129:4;27124:3;27120:14;27105:29;;26982:158;;;;:::o;27146:246::-;27227:1;27237:113;27251:6;27248:1;27245:13;27237:113;;;27336:1;27331:3;27327:11;27321:18;27317:1;27312:3;27308:11;27301:39;27273:2;27270:1;27266:10;27261:15;;27237:113;;;27384:1;27375:6;27370:3;27366:16;27359:27;27208:184;27146:246;;;:::o;27398:353::-;27474:3;27502:38;27534:5;27502:38;:::i;:::-;27556:60;27609:6;27604:3;27556:60;:::i;:::-;27549:67;;27625:65;27683:6;27678:3;27671:4;27664:5;27660:16;27625:65;:::i;:::-;27715:29;27737:6;27715:29;:::i;:::-;27710:3;27706:39;27699:46;;27478:273;27398:353;;;;:::o;27757:108::-;27834:24;27852:5;27834:24;:::i;:::-;27829:3;27822:37;27757:108;;:::o;27955:1169::-;28092:3;28128:4;28123:3;28119:14;28215:4;28208:5;28204:16;28198:23;28268:3;28262:4;28258:14;28251:4;28246:3;28242:14;28235:38;28294:71;28360:4;28346:12;28294:71;:::i;:::-;28286:79;;28143:233;28463:4;28456:5;28452:16;28446:23;28482:63;28539:4;28534:3;28530:14;28516:12;28482:63;:::i;:::-;28386:169;28641:4;28634:5;28630:16;28624:23;28660:63;28717:4;28712:3;28708:14;28694:12;28660:63;:::i;:::-;28565:168;28820:4;28813:5;28809:16;28803:23;28839:63;28896:4;28891:3;28887:14;28873:12;28839:63;:::i;:::-;28743:169;29005:4;28998:5;28994:16;28988:23;29024:63;29081:4;29076:3;29072:14;29058:12;29024:63;:::i;:::-;28922:175;29114:4;29107:11;;28097:1027;27955:1169;;;;:::o;29130:409::-;29291:4;29329:2;29318:9;29314:18;29306:26;;29378:9;29372:4;29368:20;29364:1;29353:9;29349:17;29342:47;29406:126;29527:4;29518:6;29406:126;:::i;:::-;29398:134;;29130:409;;;;:::o;29545:180::-;29593:77;29590:1;29583:88;29690:4;29687:1;29680:15;29714:4;29711:1;29704:15;29731:169;29815:11;29849:6;29844:3;29837:19;29889:4;29884:3;29880:14;29865:29;;29731:169;;;;:::o;29906:168::-;30046:20;30042:1;30034:6;30030:14;30023:44;29906:168;:::o;30080:366::-;30222:3;30243:67;30307:2;30302:3;30243:67;:::i;:::-;30236:74;;30319:93;30408:3;30319:93;:::i;:::-;30437:2;30432:3;30428:12;30421:19;;30080:366;;;:::o;30452:419::-;30618:4;30656:2;30645:9;30641:18;30633:26;;30705:9;30699:4;30695:20;30691:1;30680:9;30676:17;30669:47;30733:131;30859:4;30733:131;:::i;:::-;30725:139;;30452:419;;;:::o;30877:442::-;31026:4;31064:2;31053:9;31049:18;31041:26;;31077:71;31145:1;31134:9;31130:17;31121:6;31077:71;:::i;:::-;31158:72;31226:2;31215:9;31211:18;31202:6;31158:72;:::i;:::-;31240;31308:2;31297:9;31293:18;31284:6;31240:72;:::i;:::-;30877:442;;;;;;:::o;31325:94::-;31358:8;31406:5;31402:2;31398:14;31377:35;;31325:94;;;:::o;31425:::-;31464:7;31493:20;31507:5;31493:20;:::i;:::-;31482:31;;31425:94;;;:::o;31525:100::-;31564:7;31593:26;31613:5;31593:26;:::i;:::-;31582:37;;31525:100;;;:::o;31631:157::-;31736:45;31756:24;31774:5;31756:24;:::i;:::-;31736:45;:::i;:::-;31731:3;31724:58;31631:157;;:::o;31794:256::-;31906:3;31921:75;31992:3;31983:6;31921:75;:::i;:::-;32021:2;32016:3;32012:12;32005:19;;32041:3;32034:10;;31794:256;;;;:::o;32056:386::-;32160:3;32188:38;32220:5;32188:38;:::i;:::-;32242:88;32323:6;32318:3;32242:88;:::i;:::-;32235:95;;32339:65;32397:6;32392:3;32385:4;32378:5;32374:16;32339:65;:::i;:::-;32429:6;32424:3;32420:16;32413:23;;32164:278;32056:386;;;;:::o;32448:427::-;32624:3;32646:93;32735:3;32726:6;32646:93;:::i;:::-;32639:100;;32756:93;32845:3;32836:6;32756:93;:::i;:::-;32749:100;;32866:3;32859:10;;32448:427;;;;;:::o;32881:96::-;32915:8;32964:5;32959:3;32955:15;32934:36;;32881:96;;;:::o;32983:94::-;33021:7;33050:21;33065:5;33050:21;:::i;:::-;33039:32;;32983:94;;;:::o;33083:153::-;33186:43;33205:23;33222:5;33205:23;:::i;:::-;33186:43;:::i;:::-;33181:3;33174:56;33083:153;;:::o;33242:251::-;33352:3;33367:73;33436:3;33427:6;33367:73;:::i;:::-;33465:1;33460:3;33456:11;33449:18;;33484:3;33477:10;;33242:251;;;;:::o;33499:171::-;33538:3;33561:24;33579:5;33561:24;:::i;:::-;33552:33;;33607:4;33600:5;33597:15;33594:41;;33615:18;;:::i;:::-;33594:41;33662:1;33655:5;33651:13;33644:20;;33499:171;;;:::o;33676:332::-;33797:4;33835:2;33824:9;33820:18;33812:26;;33848:71;33916:1;33905:9;33901:17;33892:6;33848:71;:::i;:::-;33929:72;33997:2;33986:9;33982:18;33973:6;33929:72;:::i;:::-;33676:332;;;;;:::o
Swarm Source
ipfs://38775c40a94183684b5c31370f759556571909429bd1b9c9f8153dd97a3bf369
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.