Source Code
Overview
ETH Balance
977.306824321867660005 ETH
Token Holdings
More Info
ContractCreator
Multichain Info
N/A
Latest 25 from a total of 257 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Unwrap Weth | 638358 | 1 hr ago | IN | 0 ETH | 0.00007163 | ||||
Server Payout | 634627 | 14 hrs ago | IN | 0 ETH | 0.00006373 | ||||
Deposit | 632134 | 23 hrs ago | IN | 10 ETH | 0.00005584 | ||||
Unwrap Weth | 631708 | 24 hrs ago | IN | 0 ETH | 0.0000752 | ||||
Deposit | 630104 | 30 hrs ago | IN | 1 ETH | 0.00005469 | ||||
Deposit | 630082 | 30 hrs ago | IN | 1 ETH | 0.00005503 | ||||
Server Payout | 627685 | 39 hrs ago | IN | 0 ETH | 0.00006736 | ||||
Unwrap Weth | 626925 | 42 hrs ago | IN | 0 ETH | 0.00007661 | ||||
Deposit | 625503 | 47 hrs ago | IN | 10 ETH | 0.0000525 | ||||
Unwrap Weth | 625015 | 2 days ago | IN | 0 ETH | 0.00006638 | ||||
Deposit | 622968 | 2 days ago | IN | 5 ETH | 0.00005883 | ||||
Server Payout | 619674 | 2 days ago | IN | 0 ETH | 0.00005624 | ||||
Server Payout | 619290 | 2 days ago | IN | 0 ETH | 0.00005483 | ||||
Server Payout | 618406 | 3 days ago | IN | 0 ETH | 0.00005811 | ||||
Unwrap Weth | 618340 | 3 days ago | IN | 0 ETH | 0.00006389 | ||||
Server Payout | 618014 | 3 days ago | IN | 0 ETH | 0.0000523 | ||||
Server Payout | 617019 | 3 days ago | IN | 0 ETH | 0.00006246 | ||||
Deposit | 617010 | 3 days ago | IN | 2 ETH | 0.0000614 | ||||
Deposit | 613029 | 3 days ago | IN | 0.5 ETH | 0.0000741 | ||||
Deposit | 612626 | 3 days ago | IN | 15 ETH | 0.00005065 | ||||
Deposit | 612231 | 3 days ago | IN | 10 ETH | 0.00005735 | ||||
Server Payout | 610045 | 4 days ago | IN | 0 ETH | 0.00005584 | ||||
Server Payout | 609849 | 4 days ago | IN | 0 ETH | 0.00005419 | ||||
Unwrap Weth | 604997 | 5 days ago | IN | 0 ETH | 0.00006683 | ||||
Server Payout | 603677 | 5 days ago | IN | 0 ETH | 0.0000618 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
Transfer | 638358 | 1 hr ago | 10 ETH | ||||
Withdraw | 638358 | 1 hr ago | 0 ETH | ||||
Check Treasurer ... | 638358 | 1 hr ago | 0 ETH | ||||
Transfer | 634627 | 14 hrs ago | 1.0820739 ETH | ||||
Check Payouter R... | 634627 | 14 hrs ago | 0 ETH | ||||
Deposit | 632134 | 23 hrs ago | 10 ETH | ||||
0x37cc8e90 | 632134 | 23 hrs ago | 10 ETH | ||||
Transfer | 631708 | 24 hrs ago | 2 ETH | ||||
Withdraw | 631708 | 24 hrs ago | 0 ETH | ||||
Check Treasurer ... | 631708 | 24 hrs ago | 0 ETH | ||||
Deposit | 630104 | 30 hrs ago | 1 ETH | ||||
0x37cc8e90 | 630104 | 30 hrs ago | 1 ETH | ||||
Deposit | 630082 | 30 hrs ago | 1 ETH | ||||
0x37cc8e90 | 630082 | 30 hrs ago | 1 ETH | ||||
Transfer | 627685 | 39 hrs ago | 0.67370737 ETH | ||||
Check Payouter R... | 627685 | 39 hrs ago | 0 ETH | ||||
Transfer | 626925 | 42 hrs ago | 10 ETH | ||||
Withdraw | 626925 | 42 hrs ago | 0 ETH | ||||
Check Treasurer ... | 626925 | 42 hrs ago | 0 ETH | ||||
Deposit | 625503 | 47 hrs ago | 10 ETH | ||||
0x37cc8e90 | 625503 | 47 hrs ago | 10 ETH | ||||
Transfer | 625015 | 2 days ago | 5 ETH | ||||
Withdraw | 625015 | 2 days ago | 0 ETH | ||||
Check Treasurer ... | 625015 | 2 days ago | 0 ETH | ||||
Deposit | 622968 | 2 days ago | 5 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
EthgasPool
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
No with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.28; import "./interfaces/IEthgasPool.sol"; import "./interfaces/IWETH.sol"; import "./interfaces/IACLManager.sol"; import "./libraries/DepositHelper.sol"; import "./libraries/TransferFundHelper.sol"; import "./libraries/InputValidator.sol"; // openzeppelin contracts v4.7.3 import "./dependencies/openzeppelin-v5.0.1/utils/Pausable.sol"; import "./dependencies/openzeppelin-v5.0.1/utils/Context.sol"; import "./dependencies/openzeppelin-v5.0.1/utils/ReentrancyGuard.sol"; contract EthgasPool is IEthgasPool, Context, ReentrancyGuard, Pausable { mapping(address => bool) public supportedToken; // for serverTransferFund & serverTransferFundSingle mapping(address => uint256) public dailyWithdrawalCap; mapping(address => uint256) public currentDailyWithdrawalAmount; mapping(address => uint256) public lastWithdrawalTime; // for serverPayout mapping(address => uint256) public dailyPayoutCap; mapping(address => uint256) public currentDailyPayoutAmount; mapping(address => uint256) public lastPayoutTime; IACLManager public aclManager; IWETH public immutable weth; modifier onlyAdminRole() { aclManager.checkAdminRole(msg.sender); _; } modifier onlyTreasurerRole() { aclManager.checkTreasurerRole(msg.sender); _; } modifier onlyTimelockRole() { aclManager.checkTimelockRole(msg.sender); _; } modifier onlyPauserRole() { aclManager.checkPauserRole(msg.sender); _; } modifier onlyBookKeeperRole() { aclManager.checkBookKeeperRole(msg.sender); _; } modifier onlyPayouterRole() { aclManager.checkPayouterRole(msg.sender); _; } constructor(IACLManager _aclManager, IWETH _weth, address[] memory _token, uint256[] memory _withdrawalCap, uint256[] memory _payoutCap) { InputValidator.validateAddr(address(_aclManager)); InputValidator.validateAddr(address(_weth)); aclManager = _aclManager; weth = _weth; if ((_token.length != _withdrawalCap.length) || (_token.length != _payoutCap.length) || _token.length == 0) { revert InvalidParamLength(); } for (uint256 i; i < _token.length; i++) { InputValidator.validateAddr(address(_token[i])); dailyWithdrawalCap[_token[i]] = _withdrawalCap[i]; emit DailyWithdrawalCapChanged(_token[i], _withdrawalCap[i]); dailyPayoutCap[_token[i]] = _payoutCap[i]; emit DailyPayoutCapChanged(_token[i], _payoutCap[i]); supportedToken[_token[i]] = true; emit SupportedTokenChanged(_token[i], true); } } function pause() external onlyPauserRole { super._pause(); } function unpause() external onlyAdminRole { super._unpause(); } function setAclManager(IACLManager _aclManager) external onlyTimelockRole whenNotPaused { InputValidator.validateAddr(address(_aclManager)); aclManager = _aclManager; emit AclManagerChanged(address(_aclManager)); } function setDailyWithdrawalCap(address _token, uint256 _cap) external onlyTimelockRole whenNotPaused { InputValidator.validateAddr(_token); dailyWithdrawalCap[_token] = _cap; emit DailyWithdrawalCapChanged(_token, _cap); } function setDailyPayoutCap(address _token, uint256 _cap) external onlyTimelockRole whenNotPaused { InputValidator.validateAddr(_token); dailyPayoutCap[_token] = _cap; emit DailyPayoutCapChanged(_token, _cap); } function setSupportedToken(address _token, bool _isSupport) external onlyBookKeeperRole whenNotPaused { InputValidator.validateAddr(_token); supportedToken[_token] = _isSupport; emit SupportedTokenChanged(_token, _isSupport); } function deposit(TokenTransfer[] memory tokenTransfers) external whenNotPaused payable { DepositHelper.deposit(tokenTransfers, weth, supportedToken); } function serverPayout(address clientAddress, TokenTransfer[] calldata tokenTransfers, uint256 targetBlockNumber) onlyPayouterRole nonReentrant whenNotPaused external { if (block.number > targetBlockNumber) { revert InvalidBlockNumber(); } TransferFundHelper.serverTransferFund( address(weth), false, clientAddress, tokenTransfers, dailyPayoutCap, lastPayoutTime, currentDailyPayoutAmount ); } function serverTransferFundSingle(address clientAddress, TokenTransfer[] calldata tokenTransfers) onlyTreasurerRole nonReentrant whenNotPaused external { TransferFundHelper.serverTransferFund( address(weth), false, clientAddress, tokenTransfers, dailyWithdrawalCap, lastWithdrawalTime, currentDailyWithdrawalAmount ); } function serverTransferFund(address[] calldata clientAddresses, TokenTransfer[][] calldata tokenTransferss) onlyTreasurerRole nonReentrant whenNotPaused external { if ((clientAddresses.length != tokenTransferss.length) || clientAddresses.length == 0) { revert InvalidParamLength(); } for(uint i = 0; i < clientAddresses.length; i++) { TransferFundHelper.serverTransferFund( address(weth), false, clientAddresses[i], tokenTransferss[i], dailyWithdrawalCap, lastWithdrawalTime, currentDailyWithdrawalAmount ); } } /** * @dev can transfer any amount out */ function serverTransferAnyFund(address[] calldata clientAddresses, TokenTransfer[][] calldata tokenTransferss) onlyTimelockRole nonReentrant whenNotPaused external { if ((clientAddresses.length != tokenTransferss.length) || clientAddresses.length == 0) { revert InvalidParamLength(); } for(uint i = 0; i < clientAddresses.length; i++) { TransferFundHelper.serverTransferFund( address(weth), true, clientAddresses[i], tokenTransferss[i], dailyWithdrawalCap, lastWithdrawalTime, currentDailyWithdrawalAmount ); } } function wrapEth(uint256 amount) onlyTreasurerRole nonReentrant whenNotPaused external { weth.deposit{value: amount}(); } function unwrapWeth(uint256 amount) onlyTreasurerRole nonReentrant whenNotPaused external { weth.withdraw(amount); } receive() external payable { if (msg.sender != address(weth)) revert CannotSendEthDirectly(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * ==== Security Considerations * * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be * considered as an intention to spend the allowance in any specific way. The second is that because permits have * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be * generally recommended is: * * ```solidity * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} * doThing(..., value); * } * * function doThing(..., uint256 value) public { * token.safeTransferFrom(msg.sender, address(this), value); * ... * } * ``` * * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also * {SafeERC20-safeTransferFrom}). * * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so * contracts should have entry points that don't rely on permit. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. * * CAUTION: See Security Considerations above. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.20; import {IERC20} from "./IERC20.sol"; import {IERC20Permit} from "./IERC20Permit.sol"; import {Address} from "../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev An operation with an ERC20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data); if (returndata.length != 0 && !abi.decode(returndata, (bool))) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol) pragma solidity ^0.8.20; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error AddressInsufficientBalance(address account); /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedInnerCall(); /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert AddressInsufficientBalance(address(this)); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert FailedInnerCall(); } } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {FailedInnerCall} error. * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert AddressInsufficientBalance(address(this)); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an * unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {FailedInnerCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. */ function _revert(bytes memory returndata) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert FailedInnerCall(); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/Pausable.sol) pragma solidity ^0.8.20; import {Context} from "./Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { bool private _paused; /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); /** * @dev The operation failed because the contract is paused. */ error EnforcedPause(); /** * @dev The operation failed because the contract is not paused. */ error ExpectedPause(); /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { if (paused()) { revert EnforcedPause(); } } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { if (!paused()) { revert ExpectedPause(); } } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol) pragma solidity ^0.8.20; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant NOT_ENTERED = 1; uint256 private constant ENTERED = 2; uint256 private _status; /** * @dev Unauthorized reentrant call. */ error ReentrancyGuardReentrantCall(); constructor() { _status = NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be NOT_ENTERED if (_status == ENTERED) { revert ReentrancyGuardReentrantCall(); } // Any calls to nonReentrant after this point will fail _status = ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == ENTERED; } }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.12; interface IACLManager { function checkAdminRole(address _account) external view; function checkTreasurerRole(address _account) external view; function checkTimelockRole(address _account) external view; function checkPauserRole(address _account) external view; function checkBookKeeperRole(address _account) external view; function checkPayouterRole(address _account) external view; function checkOtherRole1(address _account) external view; function checkOtherRole2(address _account) external view; function checkOtherRole3(address _account) external view; }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.12; interface IEthgasPool { struct TokenTransfer { address token; uint256 amount; } error InvalidParamLength(); error InvalidBlockNumber(); error CannotSendEthDirectly(); event DepositsTriggered( address indexed sender, TokenTransfer[] transfers ); event Withdrawal( address indexed clientAddress, IEthgasPool.TokenTransfer tokenTranfer ); event AclManagerChanged(address aclManager); event DailyWithdrawalCapChanged( address token, uint256 cap ); event DailyPayoutCapChanged( address token, uint256 cap ); event SupportedTokenChanged( address token, bool isSupport ); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.12; import "../dependencies/openzeppelin-v5.0.1/token/SafeERC20.sol"; interface IWETH is IERC20 { function deposit() external payable; function withdraw(uint) external; }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.12; import "../interfaces/IWETH.sol"; import "../interfaces/IEthgasPool.sol"; import "../dependencies/openzeppelin-v5.0.1/token/SafeERC20.sol"; library DepositHelper { using SafeERC20 for IERC20; event DepositsTriggered( address indexed sender, IEthgasPool.TokenTransfer[] transfers ); error InvalidTokenValue(); error NotEnoughBalance(); error NotSupportedToken(); function deposit (IEthgasPool.TokenTransfer[] memory tokenTransfers, IWETH weth, mapping(address => bool) storage supportedToken) external { if(msg.value == 0 && tokenTransfers.length == 0 ) { revert InvalidTokenValue(); } IEthgasPool.TokenTransfer[] memory tt = new IEthgasPool.TokenTransfer[](tokenTransfers.length + (msg.value > 0 ? 1 : 0)); for (uint i = 0; i < tokenTransfers.length; i++) { if (supportedToken[tokenTransfers[i].token] == false) { revert NotSupportedToken(); } IERC20 token = IERC20(tokenTransfers[i].token); uint256 tokenAmount = tokenTransfers[i].amount; uint balance = token.balanceOf(address(msg.sender)); if (balance < tokenAmount) { revert NotEnoughBalance(); } token.safeTransferFrom( msg.sender, address(this), tokenAmount); tt[i] = tokenTransfers[i]; } // wrap eth if (msg.value > 0) { if (supportedToken[address(weth)] == false) { revert NotSupportedToken(); } weth.deposit{value: msg.value}(); tt[tokenTransfers.length] = IEthgasPool.TokenTransfer(address(weth), msg.value); } emit DepositsTriggered( msg.sender, tt ); } }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.12; import "../interfaces/IWETH.sol"; import "../interfaces/IEthgasPool.sol"; library InputValidator { error IncorrectAddress(); function validateAddr (address _inputAddr) internal pure { if (_inputAddr == address(0)) { revert IncorrectAddress(); } } }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.12; import "../interfaces/IEthgasPool.sol"; import "../dependencies/openzeppelin-v5.0.1/token/SafeERC20.sol"; library TransferFundHelper { using SafeERC20 for IERC20; error ZeroParamLength(); error ExceedDailyTransferCap(); error FailedToSendEth(); function serverTransferFund( address weth, bool isAdmin, address clientAddress, IEthgasPool.TokenTransfer[] calldata tokenTransfers, mapping(address => uint256) storage dailyTransferCap, mapping(address => uint256) storage lastTransferTime, mapping(address => uint256) storage currentDailyTransferAmount ) internal { if (tokenTransfers.length == 0) { revert ZeroParamLength(); } bool isNativeEth; IERC20 token; for (uint i = 0; i < tokenTransfers.length; i++) { IEthgasPool.TokenTransfer memory tt = tokenTransfers[i]; if (tt.token == address(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)) { isNativeEth = true; tt.token = weth; } else { token = IERC20(tt.token); } // reset limit after a day if (block.timestamp - lastTransferTime[tt.token] > 1 days) { lastTransferTime[tt.token] = block.timestamp; currentDailyTransferAmount[tt.token] = 0; } if (isAdmin) { transfer(isNativeEth, clientAddress, tt, token); } else if (currentDailyTransferAmount[tt.token] + tt.amount <= dailyTransferCap[tt.token]) { currentDailyTransferAmount[tt.token] += tt.amount; transfer(isNativeEth, clientAddress, tt, token); } else { revert ExceedDailyTransferCap(); } } } function transfer(bool isNativeEth, address clientAddress, IEthgasPool.TokenTransfer memory tokenTransfer, IERC20 token) internal { if (isNativeEth) { (bool success, ) = clientAddress.call{value: tokenTransfer.amount}(""); if (success == false) revert FailedToSendEth(); } else { token.safeTransfer(clientAddress, tokenTransfer.amount); } emit IEthgasPool.Withdrawal(clientAddress, tokenTransfer); } }
{ "evmVersion": "paris", "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": { "contracts/libraries/DepositHelper.sol": { "DepositHelper": "0xdce453d1769f3677f426f5d454fbbb4feb4798db" } } }
Contract ABI
API[{"inputs":[{"internalType":"contract IACLManager","name":"_aclManager","type":"address"},{"internalType":"contract IWETH","name":"_weth","type":"address"},{"internalType":"address[]","name":"_token","type":"address[]"},{"internalType":"uint256[]","name":"_withdrawalCap","type":"uint256[]"},{"internalType":"uint256[]","name":"_payoutCap","type":"uint256[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"CannotSendEthDirectly","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExceedDailyTransferCap","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"FailedToSendEth","type":"error"},{"inputs":[],"name":"IncorrectAddress","type":"error"},{"inputs":[],"name":"InvalidBlockNumber","type":"error"},{"inputs":[],"name":"InvalidParamLength","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"ZeroParamLength","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"aclManager","type":"address"}],"name":"AclManagerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"cap","type":"uint256"}],"name":"DailyPayoutCapChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"cap","type":"uint256"}],"name":"DailyWithdrawalCapChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"indexed":false,"internalType":"struct IEthgasPool.TokenTransfer[]","name":"transfers","type":"tuple[]"}],"name":"DepositsTriggered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"bool","name":"isSupport","type":"bool"}],"name":"SupportedTokenChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"clientAddress","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"indexed":false,"internalType":"struct IEthgasPool.TokenTransfer","name":"tokenTranfer","type":"tuple"}],"name":"Withdrawal","type":"event"},{"inputs":[],"name":"aclManager","outputs":[{"internalType":"contract IACLManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"currentDailyPayoutAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"currentDailyWithdrawalAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"dailyPayoutCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"dailyWithdrawalCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IEthgasPool.TokenTransfer[]","name":"tokenTransfers","type":"tuple[]"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastPayoutTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastWithdrawalTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"clientAddress","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IEthgasPool.TokenTransfer[]","name":"tokenTransfers","type":"tuple[]"},{"internalType":"uint256","name":"targetBlockNumber","type":"uint256"}],"name":"serverPayout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"clientAddresses","type":"address[]"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IEthgasPool.TokenTransfer[][]","name":"tokenTransferss","type":"tuple[][]"}],"name":"serverTransferAnyFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"clientAddresses","type":"address[]"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IEthgasPool.TokenTransfer[][]","name":"tokenTransferss","type":"tuple[][]"}],"name":"serverTransferFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"clientAddress","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IEthgasPool.TokenTransfer[]","name":"tokenTransfers","type":"tuple[]"}],"name":"serverTransferFundSingle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IACLManager","name":"_aclManager","type":"address"}],"name":"setAclManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_cap","type":"uint256"}],"name":"setDailyPayoutCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_cap","type":"uint256"}],"name":"setDailyWithdrawalCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"bool","name":"_isSupport","type":"bool"}],"name":"setSupportedToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"supportedToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unwrapWeth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"wrapEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a060405234801561001057600080fd5b50604051613413380380613413833981810160405281019061003291906107c4565b60016000819055506000600160006101000a81548160ff0219169083151502179055506100648561041b60201b60201c565b6100738461041b60201b60201c565b84600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050815183511415806100fb57508051835114155b80610107575060008351145b1561013e576040517fb824824000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8351811015610410576101738482815181106101605761015f610893565b5b602002602001015161041b60201b60201c565b82818151811061018657610185610893565b5b6020026020010151600360008684815181106101a5576101a4610893565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507fd743397d2c2b0cfae24d70020938ca9e367d31bebf7ec10391c8025589d2cd6f84828151811061021f5761021e610893565b5b602002602001015184838151811061023a57610239610893565b5b60200260200101516040516102509291906108e0565b60405180910390a181818151811061026b5761026a610893565b5b60200260200101516006600086848151811061028a57610289610893565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f017284dd427e3192370095f0611924a4dc14a9697d78e9f5e71e7c01239b535284828151811061030457610303610893565b5b602002602001015183838151811061031f5761031e610893565b5b60200260200101516040516103359291906108e0565b60405180910390a160016002600086848151811061035657610355610893565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fc61100f04059ab37e6520ebedc73c3712cd763eda94fc8bb9f1bfdf7f8f3765c8482815181106103e3576103e2610893565b5b602002602001015160016040516103fb929190610924565b60405180910390a18080600101915050610141565b50505050505061094d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610481576040517fed96523a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006104c382610498565b9050919050565b60006104d5826104b8565b9050919050565b6104e5816104ca565b81146104f057600080fd5b50565b600081519050610502816104dc565b92915050565b6000610513826104b8565b9050919050565b61052381610508565b811461052e57600080fd5b50565b6000815190506105408161051a565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6105948261054b565b810181811067ffffffffffffffff821117156105b3576105b261055c565b5b80604052505050565b60006105c6610484565b90506105d2828261058b565b919050565b600067ffffffffffffffff8211156105f2576105f161055c565b5b602082029050602081019050919050565b600080fd5b610611816104b8565b811461061c57600080fd5b50565b60008151905061062e81610608565b92915050565b6000610647610642846105d7565b6105bc565b9050808382526020820190506020840283018581111561066a57610669610603565b5b835b81811015610693578061067f888261061f565b84526020840193505060208101905061066c565b5050509392505050565b600082601f8301126106b2576106b1610546565b5b81516106c2848260208601610634565b91505092915050565b600067ffffffffffffffff8211156106e6576106e561055c565b5b602082029050602081019050919050565b6000819050919050565b61070a816106f7565b811461071557600080fd5b50565b60008151905061072781610701565b92915050565b600061074061073b846106cb565b6105bc565b9050808382526020820190506020840283018581111561076357610762610603565b5b835b8181101561078c57806107788882610718565b845260208401935050602081019050610765565b5050509392505050565b600082601f8301126107ab576107aa610546565b5b81516107bb84826020860161072d565b91505092915050565b600080600080600060a086880312156107e0576107df61048e565b5b60006107ee888289016104f3565b95505060206107ff88828901610531565b945050604086015167ffffffffffffffff8111156108205761081f610493565b5b61082c8882890161069d565b935050606086015167ffffffffffffffff81111561084d5761084c610493565b5b61085988828901610796565b925050608086015167ffffffffffffffff81111561087a57610879610493565b5b61088688828901610796565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6108cb816104b8565b82525050565b6108da816106f7565b82525050565b60006040820190506108f560008301856108c2565b61090260208301846108d1565b9392505050565b60008115159050919050565b61091e81610909565b82525050565b600060408201905061093960008301856108c2565b6109466020830184610915565b9392505050565b608051612a736109a06000396000818161014b015281816106bf015281816108c20152818161095f01528181610c7f01528181610e0601528181610f380152818161118901526114120152612a736000f3fe6080604052600436106101445760003560e01c80638456cb59116100b6578063ca85dfc71161006f578063ca85dfc7146104db578063cfc34c8614610504578063def275d81461052d578063e2c6e43814610556578063e798646614610593578063f3c3bddc146105bc576101d0565b80638456cb59146103cf5780639181450e146103e657806397730d0414610423578063a5080f3014610460578063ae9779c614610489578063b0cede25146104b2576101d0565b806340298ed71161010857806340298ed7146102a657806341315644146102d15780634de5120e1461030e57806359e974751461034b5780635c975abb146103675780637c46455014610392576101d0565b80631cd892ed146101d55780631d5e75e0146101fe57806339ca80ab146102275780633f4ba83a146102645780633fc8cef31461027b576101d0565b366101d0577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101ce576040517f12ff0b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b005b600080fd5b3480156101e157600080fd5b506101fc60048036038101906101f79190611f2a565b6105e5565b005b34801561020a57600080fd5b5061022560048036038101906102209190611fdc565b6106fc565b005b34801561023357600080fd5b5061024e60048036038101906102499190612009565b610813565b60405161025b9190612045565b60405180910390f35b34801561027057600080fd5b5061027961082b565b005b34801561028757600080fd5b506102906108c0565b60405161029d91906120bf565b60405180910390f35b3480156102b257600080fd5b506102bb6108e4565b6040516102c891906120fb565b60405180910390f35b3480156102dd57600080fd5b506102f860048036038101906102f39190612009565b61090a565b6040516103059190612045565b60405180910390f35b34801561031a57600080fd5b5061033560048036038101906103309190612009565b610922565b6040516103429190612045565b60405180910390f35b610365600480360381019061036091906122ba565b61093a565b005b34801561037357600080fd5b5061037c6109d1565b604051610389919061231e565b60405180910390f35b34801561039e57600080fd5b506103b960048036038101906103b49190612009565b6109e8565b6040516103c69190612045565b60405180910390f35b3480156103db57600080fd5b506103e4610a00565b005b3480156103f257600080fd5b5061040d60048036038101906104089190612009565b610a95565b60405161041a9190612045565b60405180910390f35b34801561042f57600080fd5b5061044a60048036038101906104459190612009565b610aad565b6040516104579190612045565b60405180910390f35b34801561046c57600080fd5b5061048760048036038101906104829190612339565b610ac5565b005b34801561049557600080fd5b506104b060048036038101906104ab9190612379565b610be2565b005b3480156104be57600080fd5b506104d960048036038101906104d49190612452565b610d09565b005b3480156104e757600080fd5b5061050260048036038101906104fd9190612379565b610e9b565b005b34801561051057600080fd5b5061052b60048036038101906105269190612339565b610fcc565b005b34801561053957600080fd5b50610554600480360381019061054f91906124d3565b6110e9565b005b34801561056257600080fd5b5061057d60048036038101906105789190612009565b6111c5565b60405161058a919061231e565b60405180910390f35b34801561059f57600080fd5b506105ba60048036038101906105b5919061255f565b6111e5565b005b3480156105c857600080fd5b506105e360048036038101906105de9190612452565b611315565b005b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663353b4b65336040518263ffffffff1660e01b815260040161064091906125ae565b60006040518083038186803b15801561065857600080fd5b505afa15801561066c573d6000803e3d6000fd5b505050506106786114a7565b6106806114ed565b804311156106ba576040517f4e47846c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106ee7f0000000000000000000000000000000000000000000000000000000000000000600086868660066008600761152e565b6106f6611892565b50505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8c0d2cf336040518263ffffffff1660e01b815260040161075791906125ae565b60006040518083038186803b15801561076f57600080fd5b505afa158015610783573d6000803e3d6000fd5b5050505061078f6114ed565b6107988161189c565b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fa1182d49f3f679324120cc9938f0ae049e614a029c8f20ec854862bf94a9338d8160405161080891906125ae565b60405180910390a150565b60086020528060005260406000206000915090505481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e386be2e336040518263ffffffff1660e01b815260040161088691906125ae565b60006040518083038186803b15801561089e57600080fd5b505afa1580156108b2573d6000803e3d6000fd5b505050506108be611905565b565b7f000000000000000000000000000000000000000000000000000000000000000081565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60076020528060005260406000206000915090505481565b60056020528060005260406000206000915090505481565b6109426114ed565b73dce453d1769f3677f426f5d454fbbb4feb4798db6337cc8e90827f000000000000000000000000000000000000000000000000000000000000000060026040518463ffffffff1660e01b815260040161099e939291906126db565b60006040518083038186803b1580156109b657600080fd5b505af41580156109ca573d6000803e3d6000fd5b5050505050565b6000600160009054906101000a900460ff16905090565b60036020528060005260406000206000915090505481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166394911356336040518263ffffffff1660e01b8152600401610a5b91906125ae565b60006040518083038186803b158015610a7357600080fd5b505afa158015610a87573d6000803e3d6000fd5b50505050610a93611968565b565b60066020528060005260406000206000915090505481565b60046020528060005260406000206000915090505481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8c0d2cf336040518263ffffffff1660e01b8152600401610b2091906125ae565b60006040518083038186803b158015610b3857600080fd5b505afa158015610b4c573d6000803e3d6000fd5b50505050610b586114ed565b610b618261189c565b80600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507fd743397d2c2b0cfae24d70020938ca9e367d31bebf7ec10391c8025589d2cd6f8282604051610bd6929190612719565b60405180910390a15050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0fde6dc336040518263ffffffff1660e01b8152600401610c3d91906125ae565b60006040518083038186803b158015610c5557600080fd5b505afa158015610c69573d6000803e3d6000fd5b50505050610c756114a7565b610c7d6114ed565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015610ce557600080fd5b505af1158015610cf9573d6000803e3d6000fd5b5050505050610d06611892565b50565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0fde6dc336040518263ffffffff1660e01b8152600401610d6491906125ae565b60006040518083038186803b158015610d7c57600080fd5b505afa158015610d90573d6000803e3d6000fd5b50505050610d9c6114a7565b610da46114ed565b8181905084849050141580610dbc5750600084849050145b15610df3576040517fb824824000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b84849050811015610e8c57610e7f7f00000000000000000000000000000000000000000000000000000000000000006000878785818110610e3a57610e39612742565b5b9050602002016020810190610e4f9190612009565b868686818110610e6257610e61612742565b5b9050602002810190610e749190612780565b60036005600461152e565b8080600101915050610df6565b50610e95611892565b50505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0fde6dc336040518263ffffffff1660e01b8152600401610ef691906125ae565b60006040518083038186803b158015610f0e57600080fd5b505afa158015610f22573d6000803e3d6000fd5b50505050610f2e6114a7565b610f366114ed565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b8152600401610f8f9190612045565b600060405180830381600087803b158015610fa957600080fd5b505af1158015610fbd573d6000803e3d6000fd5b50505050610fc9611892565b50565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8c0d2cf336040518263ffffffff1660e01b815260040161102791906125ae565b60006040518083038186803b15801561103f57600080fd5b505afa158015611053573d6000803e3d6000fd5b5050505061105f6114ed565b6110688261189c565b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f017284dd427e3192370095f0611924a4dc14a9697d78e9f5e71e7c01239b535282826040516110dd929190612719565b60405180910390a15050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0fde6dc336040518263ffffffff1660e01b815260040161114491906125ae565b60006040518083038186803b15801561115c57600080fd5b505afa158015611170573d6000803e3d6000fd5b5050505061117c6114a7565b6111846114ed565b6111b87f0000000000000000000000000000000000000000000000000000000000000000600085858560036005600461152e565b6111c0611892565b505050565b60026020528060005260406000206000915054906101000a900460ff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166388bb7825336040518263ffffffff1660e01b815260040161124091906125ae565b60006040518083038186803b15801561125857600080fd5b505afa15801561126c573d6000803e3d6000fd5b505050506112786114ed565b6112818261189c565b80600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fc61100f04059ab37e6520ebedc73c3712cd763eda94fc8bb9f1bfdf7f8f3765c82826040516113099291906127e3565b60405180910390a15050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8c0d2cf336040518263ffffffff1660e01b815260040161137091906125ae565b60006040518083038186803b15801561138857600080fd5b505afa15801561139c573d6000803e3d6000fd5b505050506113a86114a7565b6113b06114ed565b81819050848490501415806113c85750600084849050145b156113ff576040517fb824824000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b848490508110156114985761148b7f0000000000000000000000000000000000000000000000000000000000000000600187878581811061144657611445612742565b5b905060200201602081019061145b9190612009565b86868681811061146e5761146d612742565b5b90506020028101906114809190612780565b60036005600461152e565b8080600101915050611402565b506114a1611892565b50505050565b6002600054036114e3576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600081905550565b6114f56109d1565b1561152c576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6000858590500361156b576040517f81f0d4c900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060005b8787905081101561188557600088888381811061159157611590612742565b5b9050604002018036038101906115a7919061280c565b905073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff160361163557600193508b816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061163d565b806000015192505b62015180866000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020544261168f9190612868565b11156117255742866000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000856000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8a1561173c57611737848b83866119ca565b611877565b866000826000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548160200151866000846000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117d1919061289c565b11611844578060200151856000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461182c919061289c565b9250508190555061183f848b83866119ca565b611876565b6040517f9cc23ef800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b508080600101915050611571565b5050505050505050505050565b6001600081905550565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611902576040517fed96523a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b61190d611b08565b6000600160006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611951611b48565b60405161195e91906125ae565b60405180910390a1565b6119706114ed565b60018060006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586119b3611b48565b6040516119c091906125ae565b60405180910390a1565b8315611a845760008373ffffffffffffffffffffffffffffffffffffffff1683602001516040516119fa90612901565b60006040518083038185875af1925050503d8060008114611a37576040519150601f19603f3d011682016040523d82523d6000602084013e611a3c565b606091505b505090506000151581151503611a7e576040517ffe8a94f400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611ab4565b611ab38383602001518373ffffffffffffffffffffffffffffffffffffffff16611b509092919063ffffffff16565b5b8273ffffffffffffffffffffffffffffffffffffffff167f3c3a6ae8916ee8eae179cba84e1e1e83aa622daa3e5562a6c95fad91151751a383604051611afa9190612963565b60405180910390a250505050565b611b106109d1565b611b46576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b600033905090565b611bca838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401611b83929190612719565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611bcf565b505050565b6000611bfa828473ffffffffffffffffffffffffffffffffffffffff16611c6690919063ffffffff16565b90506000815114158015611c1f575080806020019051810190611c1d9190612993565b155b15611c6157826040517f5274afe7000000000000000000000000000000000000000000000000000000008152600401611c5891906125ae565b60405180910390fd5b505050565b6060611c7483836000611c7c565b905092915050565b606081471015611cc357306040517fcd786059000000000000000000000000000000000000000000000000000000008152600401611cba91906125ae565b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff168486604051611cec9190612a26565b60006040518083038185875af1925050503d8060008114611d29576040519150601f19603f3d011682016040523d82523d6000602084013e611d2e565b606091505b5091509150611d3e868383611d49565b925050509392505050565b606082611d5e57611d5982611dd8565b611dd0565b60008251148015611d86575060008473ffffffffffffffffffffffffffffffffffffffff163b145b15611dc857836040517f9996b315000000000000000000000000000000000000000000000000000000008152600401611dbf91906125ae565b60405180910390fd5b819050611dd1565b5b9392505050565b600081511115611deb5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611e5c82611e31565b9050919050565b611e6c81611e51565b8114611e7757600080fd5b50565b600081359050611e8981611e63565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611eb457611eb3611e8f565b5b8235905067ffffffffffffffff811115611ed157611ed0611e94565b5b602083019150836040820283011115611eed57611eec611e99565b5b9250929050565b6000819050919050565b611f0781611ef4565b8114611f1257600080fd5b50565b600081359050611f2481611efe565b92915050565b60008060008060608587031215611f4457611f43611e27565b5b6000611f5287828801611e7a565b945050602085013567ffffffffffffffff811115611f7357611f72611e2c565b5b611f7f87828801611e9e565b93509350506040611f9287828801611f15565b91505092959194509250565b6000611fa982611e51565b9050919050565b611fb981611f9e565b8114611fc457600080fd5b50565b600081359050611fd681611fb0565b92915050565b600060208284031215611ff257611ff1611e27565b5b600061200084828501611fc7565b91505092915050565b60006020828403121561201f5761201e611e27565b5b600061202d84828501611e7a565b91505092915050565b61203f81611ef4565b82525050565b600060208201905061205a6000830184612036565b92915050565b6000819050919050565b600061208561208061207b84611e31565b612060565b611e31565b9050919050565b60006120978261206a565b9050919050565b60006120a98261208c565b9050919050565b6120b98161209e565b82525050565b60006020820190506120d460008301846120b0565b92915050565b60006120e58261208c565b9050919050565b6120f5816120da565b82525050565b600060208201905061211060008301846120ec565b92915050565b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61215f82612116565b810181811067ffffffffffffffff8211171561217e5761217d612127565b5b80604052505050565b6000612191611e1d565b905061219d8282612156565b919050565b600067ffffffffffffffff8211156121bd576121bc612127565b5b602082029050602081019050919050565b600080fd5b6000604082840312156121e9576121e86121ce565b5b6121f36040612187565b9050600061220384828501611e7a565b600083015250602061221784828501611f15565b60208301525092915050565b6000612236612231846121a2565b612187565b9050808382526020820190506040840283018581111561225957612258611e99565b5b835b81811015612282578061226e88826121d3565b84526020840193505060408101905061225b565b5050509392505050565b600082601f8301126122a1576122a0611e8f565b5b81356122b1848260208601612223565b91505092915050565b6000602082840312156122d0576122cf611e27565b5b600082013567ffffffffffffffff8111156122ee576122ed611e2c565b5b6122fa8482850161228c565b91505092915050565b60008115159050919050565b61231881612303565b82525050565b6000602082019050612333600083018461230f565b92915050565b600080604083850312156123505761234f611e27565b5b600061235e85828601611e7a565b925050602061236f85828601611f15565b9150509250929050565b60006020828403121561238f5761238e611e27565b5b600061239d84828501611f15565b91505092915050565b60008083601f8401126123bc576123bb611e8f565b5b8235905067ffffffffffffffff8111156123d9576123d8611e94565b5b6020830191508360208202830111156123f5576123f4611e99565b5b9250929050565b60008083601f84011261241257612411611e8f565b5b8235905067ffffffffffffffff81111561242f5761242e611e94565b5b60208301915083602082028301111561244b5761244a611e99565b5b9250929050565b6000806000806040858703121561246c5761246b611e27565b5b600085013567ffffffffffffffff81111561248a57612489611e2c565b5b612496878288016123a6565b9450945050602085013567ffffffffffffffff8111156124b9576124b8611e2c565b5b6124c5878288016123fc565b925092505092959194509250565b6000806000604084860312156124ec576124eb611e27565b5b60006124fa86828701611e7a565b935050602084013567ffffffffffffffff81111561251b5761251a611e2c565b5b61252786828701611e9e565b92509250509250925092565b61253c81612303565b811461254757600080fd5b50565b60008135905061255981612533565b92915050565b6000806040838503121561257657612575611e27565b5b600061258485828601611e7a565b92505060206125958582860161254a565b9150509250929050565b6125a881611e51565b82525050565b60006020820190506125c3600083018461259f565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6125fe81611e51565b82525050565b61260d81611ef4565b82525050565b60408201600082015161262960008501826125f5565b50602082015161263c6020850182612604565b50505050565b600061264e8383612613565b60408301905092915050565b6000602082019050919050565b6000612672826125c9565b61267c81856125d4565b9350612687836125e5565b8060005b838110156126b857815161269f8882612642565b97506126aa8361265a565b92505060018101905061268b565b5085935050505092915050565b6126ce8161209e565b82525050565b8082525050565b600060608201905081810360008301526126f58186612667565b905061270460208301856126c5565b61271160408301846126d4565b949350505050565b600060408201905061272e600083018561259f565b61273b6020830184612036565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b6000808335600160200384360303811261279d5761279c612771565b5b80840192508235915067ffffffffffffffff8211156127bf576127be612776565b5b6020830192506040820236038313156127db576127da61277b565b5b509250929050565b60006040820190506127f8600083018561259f565b612805602083018461230f565b9392505050565b60006040828403121561282257612821611e27565b5b6000612830848285016121d3565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061287382611ef4565b915061287e83611ef4565b925082820390508181111561289657612895612839565b5b92915050565b60006128a782611ef4565b91506128b283611ef4565b92508282019050808211156128ca576128c9612839565b5b92915050565b600081905092915050565b50565b60006128eb6000836128d0565b91506128f6826128db565b600082019050919050565b600061290c826128de565b9150819050919050565b61291f81611e51565b82525050565b61292e81611ef4565b82525050565b60408201600082015161294a6000850182612916565b50602082015161295d6020850182612925565b50505050565b60006040820190506129786000830184612934565b92915050565b60008151905061298d81612533565b92915050565b6000602082840312156129a9576129a8611e27565b5b60006129b78482850161297e565b91505092915050565b600081519050919050565b60005b838110156129e95780820151818401526020810190506129ce565b60008484015250505050565b6000612a00826129c0565b612a0a81856128d0565b9350612a1a8185602086016129cb565b80840191505092915050565b6000612a3282846129f5565b91508190509291505056fea2646970667358221220ee0cde33cbc33c1d59baaeebead7a3d596ecf17bb5fef2d0a4fc92ad35a6199364736f6c634300081c00330000000000000000000000007fc08320b3e376bfbde7952a8ad76d115e358e44000000000000000000000000da58ec189b6454d82d5ff76604d35cb291fe0aef00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000007e0000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000da58ec189b6454d82d5ff76604d35cb291fe0aef00000000000000000000000022c0975ef440883f88dfd70988370b7276e702910000000000000000000000000de4f847b9b79763bc2a8ad5433b1988e247aaaf0000000000000000000000000592121106a7fc71fca5ffb9dfb5b09086bb619000000000000000000000000092b26d002a0f1959be1acf5124761618e6376706000000000000000000000000f186693b36357850f9ab7c89db8148e56939283f000000000000000000000000b9857dda56e5a18a4fece5f765d2ff4e8e12c656000000000000000000000000df45c8fb96708b94da56b497929b82703e55c3c300000000000000000000000019008d4f3399352fc0d03c6658ab4d6985f3e2b2000000000000000000000000c10d48e60f7e35a02440c9220919316b113118b600000000000000000000000025a254d2af99f98942a259743f7882d8dd9f8d4c000000000000000000000000889c30797e3e5905bf5a3acb37224cd5eff17dd9000000000000000000000000ec9e2607887cd0fc32bb4de936dbb1a1985fc583000000000000000000000000c351f9bd16e1ec98a45aa3e8d479b5128d42c255000000000000000000000000ba45fb9eb0d6a9747e8c9761e133a7399aa1be94000000000000000000000000f8641c5cda97d9427a88e69bdc8c5b87f303875b000000000000000000000000989e0b12d83a07548dc2aa382a1eabaf4bf845d10000000000000000000000001833dc7cb84202eac2f42a91531f8ff37175fe7b000000000000000000000000559d3a686ecae2cb320c8d81cfde6fe830ed0a96000000000000000000000000c24fa486ea52a594192151946e91daf5e2e70ddc000000000000000000000000141fe369cb334402b0d4e2cad960750d205d8b6c000000000000000000000000c64d22c6b29c94480df1d692d41181ac1b2cd4440000000000000000000000000971f3341edd91f9344fa65f52c23e0821fca5fc0000000000000000000000001178c865dbd8656ff43c47261b0f4493e598a5370000000000000000000000003bb34e34e29ec26da84530f0cf394ef912b559b1000000000000000000000000fbf00421af88dbb8956cea0488825ef057c669cc0000000000000000000000007c96a62bf95de58ffc4e463c43889770e27ba6d700000000000000000000000074ad299d76696fd9772e325ec10b315d86b7f4e3000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000002b5e3af16b1880000000000000000000000000000000000000000000000000000000000000ee6b2800000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000000000000000000000000002b5e3af16b1880000000000000000000000000000000000000000000000000002b5e3af16b1880000000000000000000000000000000000000000000000000002b5e3af16b1880000000000000000000000000000000000000000000000000002b5e3af16b18800000000000000000000000000000000000000000000000000000000000005f5e1000000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000000000000000000000000002b5e3af16b1880000000000000000000000000000000000000000000000000002b5e3af16b1880000000000000000000000000000000000000000000000000002b5e3af16b1880000000000000000000000000000000000000000000000000002b5e3af16b1880000000000000000000000000000000000000000000000000002b5e3af16b1880000000000000000000000000000000000000000000000000002b5e3af16b188000000000000000000000000000000000000000000000000000d8d726b7177a80000000000000000000000000000000000000000000000000002b5e3af16b1880000000000000000000000000000000000000000000000000002b5e3af16b18800000000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000000000000000000000000002b5e3af16b1880000000000000000000000000000000000000000000000000002b5e3af16b1880000000000000000000000000000000000000000000000000002b5e3af16b188000000000000000000000000000000000000000000000000000d8d726b7177a800000000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000002b5e3af16b1880000000000000000000000000000000000000000000000000002b5e3af16b1880000000000000000000000000000000000000000000000000002b5e3af16b1880000000000000000000000000000000000000000000000000002b5e3af16b1880000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000008ac7230489e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106101445760003560e01c80638456cb59116100b6578063ca85dfc71161006f578063ca85dfc7146104db578063cfc34c8614610504578063def275d81461052d578063e2c6e43814610556578063e798646614610593578063f3c3bddc146105bc576101d0565b80638456cb59146103cf5780639181450e146103e657806397730d0414610423578063a5080f3014610460578063ae9779c614610489578063b0cede25146104b2576101d0565b806340298ed71161010857806340298ed7146102a657806341315644146102d15780634de5120e1461030e57806359e974751461034b5780635c975abb146103675780637c46455014610392576101d0565b80631cd892ed146101d55780631d5e75e0146101fe57806339ca80ab146102275780633f4ba83a146102645780633fc8cef31461027b576101d0565b366101d0577f000000000000000000000000da58ec189b6454d82d5ff76604d35cb291fe0aef73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101ce576040517f12ff0b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b005b600080fd5b3480156101e157600080fd5b506101fc60048036038101906101f79190611f2a565b6105e5565b005b34801561020a57600080fd5b5061022560048036038101906102209190611fdc565b6106fc565b005b34801561023357600080fd5b5061024e60048036038101906102499190612009565b610813565b60405161025b9190612045565b60405180910390f35b34801561027057600080fd5b5061027961082b565b005b34801561028757600080fd5b506102906108c0565b60405161029d91906120bf565b60405180910390f35b3480156102b257600080fd5b506102bb6108e4565b6040516102c891906120fb565b60405180910390f35b3480156102dd57600080fd5b506102f860048036038101906102f39190612009565b61090a565b6040516103059190612045565b60405180910390f35b34801561031a57600080fd5b5061033560048036038101906103309190612009565b610922565b6040516103429190612045565b60405180910390f35b610365600480360381019061036091906122ba565b61093a565b005b34801561037357600080fd5b5061037c6109d1565b604051610389919061231e565b60405180910390f35b34801561039e57600080fd5b506103b960048036038101906103b49190612009565b6109e8565b6040516103c69190612045565b60405180910390f35b3480156103db57600080fd5b506103e4610a00565b005b3480156103f257600080fd5b5061040d60048036038101906104089190612009565b610a95565b60405161041a9190612045565b60405180910390f35b34801561042f57600080fd5b5061044a60048036038101906104459190612009565b610aad565b6040516104579190612045565b60405180910390f35b34801561046c57600080fd5b5061048760048036038101906104829190612339565b610ac5565b005b34801561049557600080fd5b506104b060048036038101906104ab9190612379565b610be2565b005b3480156104be57600080fd5b506104d960048036038101906104d49190612452565b610d09565b005b3480156104e757600080fd5b5061050260048036038101906104fd9190612379565b610e9b565b005b34801561051057600080fd5b5061052b60048036038101906105269190612339565b610fcc565b005b34801561053957600080fd5b50610554600480360381019061054f91906124d3565b6110e9565b005b34801561056257600080fd5b5061057d60048036038101906105789190612009565b6111c5565b60405161058a919061231e565b60405180910390f35b34801561059f57600080fd5b506105ba60048036038101906105b5919061255f565b6111e5565b005b3480156105c857600080fd5b506105e360048036038101906105de9190612452565b611315565b005b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663353b4b65336040518263ffffffff1660e01b815260040161064091906125ae565b60006040518083038186803b15801561065857600080fd5b505afa15801561066c573d6000803e3d6000fd5b505050506106786114a7565b6106806114ed565b804311156106ba576040517f4e47846c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106ee7f000000000000000000000000da58ec189b6454d82d5ff76604d35cb291fe0aef600086868660066008600761152e565b6106f6611892565b50505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8c0d2cf336040518263ffffffff1660e01b815260040161075791906125ae565b60006040518083038186803b15801561076f57600080fd5b505afa158015610783573d6000803e3d6000fd5b5050505061078f6114ed565b6107988161189c565b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fa1182d49f3f679324120cc9938f0ae049e614a029c8f20ec854862bf94a9338d8160405161080891906125ae565b60405180910390a150565b60086020528060005260406000206000915090505481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e386be2e336040518263ffffffff1660e01b815260040161088691906125ae565b60006040518083038186803b15801561089e57600080fd5b505afa1580156108b2573d6000803e3d6000fd5b505050506108be611905565b565b7f000000000000000000000000da58ec189b6454d82d5ff76604d35cb291fe0aef81565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60076020528060005260406000206000915090505481565b60056020528060005260406000206000915090505481565b6109426114ed565b73dce453d1769f3677f426f5d454fbbb4feb4798db6337cc8e90827f000000000000000000000000da58ec189b6454d82d5ff76604d35cb291fe0aef60026040518463ffffffff1660e01b815260040161099e939291906126db565b60006040518083038186803b1580156109b657600080fd5b505af41580156109ca573d6000803e3d6000fd5b5050505050565b6000600160009054906101000a900460ff16905090565b60036020528060005260406000206000915090505481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166394911356336040518263ffffffff1660e01b8152600401610a5b91906125ae565b60006040518083038186803b158015610a7357600080fd5b505afa158015610a87573d6000803e3d6000fd5b50505050610a93611968565b565b60066020528060005260406000206000915090505481565b60046020528060005260406000206000915090505481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8c0d2cf336040518263ffffffff1660e01b8152600401610b2091906125ae565b60006040518083038186803b158015610b3857600080fd5b505afa158015610b4c573d6000803e3d6000fd5b50505050610b586114ed565b610b618261189c565b80600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507fd743397d2c2b0cfae24d70020938ca9e367d31bebf7ec10391c8025589d2cd6f8282604051610bd6929190612719565b60405180910390a15050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0fde6dc336040518263ffffffff1660e01b8152600401610c3d91906125ae565b60006040518083038186803b158015610c5557600080fd5b505afa158015610c69573d6000803e3d6000fd5b50505050610c756114a7565b610c7d6114ed565b7f000000000000000000000000da58ec189b6454d82d5ff76604d35cb291fe0aef73ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015610ce557600080fd5b505af1158015610cf9573d6000803e3d6000fd5b5050505050610d06611892565b50565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0fde6dc336040518263ffffffff1660e01b8152600401610d6491906125ae565b60006040518083038186803b158015610d7c57600080fd5b505afa158015610d90573d6000803e3d6000fd5b50505050610d9c6114a7565b610da46114ed565b8181905084849050141580610dbc5750600084849050145b15610df3576040517fb824824000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b84849050811015610e8c57610e7f7f000000000000000000000000da58ec189b6454d82d5ff76604d35cb291fe0aef6000878785818110610e3a57610e39612742565b5b9050602002016020810190610e4f9190612009565b868686818110610e6257610e61612742565b5b9050602002810190610e749190612780565b60036005600461152e565b8080600101915050610df6565b50610e95611892565b50505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0fde6dc336040518263ffffffff1660e01b8152600401610ef691906125ae565b60006040518083038186803b158015610f0e57600080fd5b505afa158015610f22573d6000803e3d6000fd5b50505050610f2e6114a7565b610f366114ed565b7f000000000000000000000000da58ec189b6454d82d5ff76604d35cb291fe0aef73ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b8152600401610f8f9190612045565b600060405180830381600087803b158015610fa957600080fd5b505af1158015610fbd573d6000803e3d6000fd5b50505050610fc9611892565b50565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8c0d2cf336040518263ffffffff1660e01b815260040161102791906125ae565b60006040518083038186803b15801561103f57600080fd5b505afa158015611053573d6000803e3d6000fd5b5050505061105f6114ed565b6110688261189c565b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f017284dd427e3192370095f0611924a4dc14a9697d78e9f5e71e7c01239b535282826040516110dd929190612719565b60405180910390a15050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0fde6dc336040518263ffffffff1660e01b815260040161114491906125ae565b60006040518083038186803b15801561115c57600080fd5b505afa158015611170573d6000803e3d6000fd5b5050505061117c6114a7565b6111846114ed565b6111b87f000000000000000000000000da58ec189b6454d82d5ff76604d35cb291fe0aef600085858560036005600461152e565b6111c0611892565b505050565b60026020528060005260406000206000915054906101000a900460ff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166388bb7825336040518263ffffffff1660e01b815260040161124091906125ae565b60006040518083038186803b15801561125857600080fd5b505afa15801561126c573d6000803e3d6000fd5b505050506112786114ed565b6112818261189c565b80600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fc61100f04059ab37e6520ebedc73c3712cd763eda94fc8bb9f1bfdf7f8f3765c82826040516113099291906127e3565b60405180910390a15050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8c0d2cf336040518263ffffffff1660e01b815260040161137091906125ae565b60006040518083038186803b15801561138857600080fd5b505afa15801561139c573d6000803e3d6000fd5b505050506113a86114a7565b6113b06114ed565b81819050848490501415806113c85750600084849050145b156113ff576040517fb824824000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b848490508110156114985761148b7f000000000000000000000000da58ec189b6454d82d5ff76604d35cb291fe0aef600187878581811061144657611445612742565b5b905060200201602081019061145b9190612009565b86868681811061146e5761146d612742565b5b90506020028101906114809190612780565b60036005600461152e565b8080600101915050611402565b506114a1611892565b50505050565b6002600054036114e3576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600081905550565b6114f56109d1565b1561152c576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6000858590500361156b576040517f81f0d4c900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060005b8787905081101561188557600088888381811061159157611590612742565b5b9050604002018036038101906115a7919061280c565b905073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff160361163557600193508b816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061163d565b806000015192505b62015180866000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020544261168f9190612868565b11156117255742866000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000856000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8a1561173c57611737848b83866119ca565b611877565b866000826000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548160200151866000846000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117d1919061289c565b11611844578060200151856000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461182c919061289c565b9250508190555061183f848b83866119ca565b611876565b6040517f9cc23ef800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b508080600101915050611571565b5050505050505050505050565b6001600081905550565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611902576040517fed96523a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b61190d611b08565b6000600160006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611951611b48565b60405161195e91906125ae565b60405180910390a1565b6119706114ed565b60018060006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586119b3611b48565b6040516119c091906125ae565b60405180910390a1565b8315611a845760008373ffffffffffffffffffffffffffffffffffffffff1683602001516040516119fa90612901565b60006040518083038185875af1925050503d8060008114611a37576040519150601f19603f3d011682016040523d82523d6000602084013e611a3c565b606091505b505090506000151581151503611a7e576040517ffe8a94f400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611ab4565b611ab38383602001518373ffffffffffffffffffffffffffffffffffffffff16611b509092919063ffffffff16565b5b8273ffffffffffffffffffffffffffffffffffffffff167f3c3a6ae8916ee8eae179cba84e1e1e83aa622daa3e5562a6c95fad91151751a383604051611afa9190612963565b60405180910390a250505050565b611b106109d1565b611b46576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b600033905090565b611bca838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401611b83929190612719565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611bcf565b505050565b6000611bfa828473ffffffffffffffffffffffffffffffffffffffff16611c6690919063ffffffff16565b90506000815114158015611c1f575080806020019051810190611c1d9190612993565b155b15611c6157826040517f5274afe7000000000000000000000000000000000000000000000000000000008152600401611c5891906125ae565b60405180910390fd5b505050565b6060611c7483836000611c7c565b905092915050565b606081471015611cc357306040517fcd786059000000000000000000000000000000000000000000000000000000008152600401611cba91906125ae565b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff168486604051611cec9190612a26565b60006040518083038185875af1925050503d8060008114611d29576040519150601f19603f3d011682016040523d82523d6000602084013e611d2e565b606091505b5091509150611d3e868383611d49565b925050509392505050565b606082611d5e57611d5982611dd8565b611dd0565b60008251148015611d86575060008473ffffffffffffffffffffffffffffffffffffffff163b145b15611dc857836040517f9996b315000000000000000000000000000000000000000000000000000000008152600401611dbf91906125ae565b60405180910390fd5b819050611dd1565b5b9392505050565b600081511115611deb5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611e5c82611e31565b9050919050565b611e6c81611e51565b8114611e7757600080fd5b50565b600081359050611e8981611e63565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611eb457611eb3611e8f565b5b8235905067ffffffffffffffff811115611ed157611ed0611e94565b5b602083019150836040820283011115611eed57611eec611e99565b5b9250929050565b6000819050919050565b611f0781611ef4565b8114611f1257600080fd5b50565b600081359050611f2481611efe565b92915050565b60008060008060608587031215611f4457611f43611e27565b5b6000611f5287828801611e7a565b945050602085013567ffffffffffffffff811115611f7357611f72611e2c565b5b611f7f87828801611e9e565b93509350506040611f9287828801611f15565b91505092959194509250565b6000611fa982611e51565b9050919050565b611fb981611f9e565b8114611fc457600080fd5b50565b600081359050611fd681611fb0565b92915050565b600060208284031215611ff257611ff1611e27565b5b600061200084828501611fc7565b91505092915050565b60006020828403121561201f5761201e611e27565b5b600061202d84828501611e7a565b91505092915050565b61203f81611ef4565b82525050565b600060208201905061205a6000830184612036565b92915050565b6000819050919050565b600061208561208061207b84611e31565b612060565b611e31565b9050919050565b60006120978261206a565b9050919050565b60006120a98261208c565b9050919050565b6120b98161209e565b82525050565b60006020820190506120d460008301846120b0565b92915050565b60006120e58261208c565b9050919050565b6120f5816120da565b82525050565b600060208201905061211060008301846120ec565b92915050565b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61215f82612116565b810181811067ffffffffffffffff8211171561217e5761217d612127565b5b80604052505050565b6000612191611e1d565b905061219d8282612156565b919050565b600067ffffffffffffffff8211156121bd576121bc612127565b5b602082029050602081019050919050565b600080fd5b6000604082840312156121e9576121e86121ce565b5b6121f36040612187565b9050600061220384828501611e7a565b600083015250602061221784828501611f15565b60208301525092915050565b6000612236612231846121a2565b612187565b9050808382526020820190506040840283018581111561225957612258611e99565b5b835b81811015612282578061226e88826121d3565b84526020840193505060408101905061225b565b5050509392505050565b600082601f8301126122a1576122a0611e8f565b5b81356122b1848260208601612223565b91505092915050565b6000602082840312156122d0576122cf611e27565b5b600082013567ffffffffffffffff8111156122ee576122ed611e2c565b5b6122fa8482850161228c565b91505092915050565b60008115159050919050565b61231881612303565b82525050565b6000602082019050612333600083018461230f565b92915050565b600080604083850312156123505761234f611e27565b5b600061235e85828601611e7a565b925050602061236f85828601611f15565b9150509250929050565b60006020828403121561238f5761238e611e27565b5b600061239d84828501611f15565b91505092915050565b60008083601f8401126123bc576123bb611e8f565b5b8235905067ffffffffffffffff8111156123d9576123d8611e94565b5b6020830191508360208202830111156123f5576123f4611e99565b5b9250929050565b60008083601f84011261241257612411611e8f565b5b8235905067ffffffffffffffff81111561242f5761242e611e94565b5b60208301915083602082028301111561244b5761244a611e99565b5b9250929050565b6000806000806040858703121561246c5761246b611e27565b5b600085013567ffffffffffffffff81111561248a57612489611e2c565b5b612496878288016123a6565b9450945050602085013567ffffffffffffffff8111156124b9576124b8611e2c565b5b6124c5878288016123fc565b925092505092959194509250565b6000806000604084860312156124ec576124eb611e27565b5b60006124fa86828701611e7a565b935050602084013567ffffffffffffffff81111561251b5761251a611e2c565b5b61252786828701611e9e565b92509250509250925092565b61253c81612303565b811461254757600080fd5b50565b60008135905061255981612533565b92915050565b6000806040838503121561257657612575611e27565b5b600061258485828601611e7a565b92505060206125958582860161254a565b9150509250929050565b6125a881611e51565b82525050565b60006020820190506125c3600083018461259f565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6125fe81611e51565b82525050565b61260d81611ef4565b82525050565b60408201600082015161262960008501826125f5565b50602082015161263c6020850182612604565b50505050565b600061264e8383612613565b60408301905092915050565b6000602082019050919050565b6000612672826125c9565b61267c81856125d4565b9350612687836125e5565b8060005b838110156126b857815161269f8882612642565b97506126aa8361265a565b92505060018101905061268b565b5085935050505092915050565b6126ce8161209e565b82525050565b8082525050565b600060608201905081810360008301526126f58186612667565b905061270460208301856126c5565b61271160408301846126d4565b949350505050565b600060408201905061272e600083018561259f565b61273b6020830184612036565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b6000808335600160200384360303811261279d5761279c612771565b5b80840192508235915067ffffffffffffffff8211156127bf576127be612776565b5b6020830192506040820236038313156127db576127da61277b565b5b509250929050565b60006040820190506127f8600083018561259f565b612805602083018461230f565b9392505050565b60006040828403121561282257612821611e27565b5b6000612830848285016121d3565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061287382611ef4565b915061287e83611ef4565b925082820390508181111561289657612895612839565b5b92915050565b60006128a782611ef4565b91506128b283611ef4565b92508282019050808211156128ca576128c9612839565b5b92915050565b600081905092915050565b50565b60006128eb6000836128d0565b91506128f6826128db565b600082019050919050565b600061290c826128de565b9150819050919050565b61291f81611e51565b82525050565b61292e81611ef4565b82525050565b60408201600082015161294a6000850182612916565b50602082015161295d6020850182612925565b50505050565b60006040820190506129786000830184612934565b92915050565b60008151905061298d81612533565b92915050565b6000602082840312156129a9576129a8611e27565b5b60006129b78482850161297e565b91505092915050565b600081519050919050565b60005b838110156129e95780820151818401526020810190506129ce565b60008484015250505050565b6000612a00826129c0565b612a0a81856128d0565b9350612a1a8185602086016129cb565b80840191505092915050565b6000612a3282846129f5565b91508190509291505056fea2646970667358221220ee0cde33cbc33c1d59baaeebead7a3d596ecf17bb5fef2d0a4fc92ad35a6199364736f6c634300081c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000007fc08320b3e376bfbde7952a8ad76d115e358e44000000000000000000000000da58ec189b6454d82d5ff76604d35cb291fe0aef00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000007e0000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000da58ec189b6454d82d5ff76604d35cb291fe0aef00000000000000000000000022c0975ef440883f88dfd70988370b7276e702910000000000000000000000000de4f847b9b79763bc2a8ad5433b1988e247aaaf0000000000000000000000000592121106a7fc71fca5ffb9dfb5b09086bb619000000000000000000000000092b26d002a0f1959be1acf5124761618e6376706000000000000000000000000f186693b36357850f9ab7c89db8148e56939283f000000000000000000000000b9857dda56e5a18a4fece5f765d2ff4e8e12c656000000000000000000000000df45c8fb96708b94da56b497929b82703e55c3c300000000000000000000000019008d4f3399352fc0d03c6658ab4d6985f3e2b2000000000000000000000000c10d48e60f7e35a02440c9220919316b113118b600000000000000000000000025a254d2af99f98942a259743f7882d8dd9f8d4c000000000000000000000000889c30797e3e5905bf5a3acb37224cd5eff17dd9000000000000000000000000ec9e2607887cd0fc32bb4de936dbb1a1985fc583000000000000000000000000c351f9bd16e1ec98a45aa3e8d479b5128d42c255000000000000000000000000ba45fb9eb0d6a9747e8c9761e133a7399aa1be94000000000000000000000000f8641c5cda97d9427a88e69bdc8c5b87f303875b000000000000000000000000989e0b12d83a07548dc2aa382a1eabaf4bf845d10000000000000000000000001833dc7cb84202eac2f42a91531f8ff37175fe7b000000000000000000000000559d3a686ecae2cb320c8d81cfde6fe830ed0a96000000000000000000000000c24fa486ea52a594192151946e91daf5e2e70ddc000000000000000000000000141fe369cb334402b0d4e2cad960750d205d8b6c000000000000000000000000c64d22c6b29c94480df1d692d41181ac1b2cd4440000000000000000000000000971f3341edd91f9344fa65f52c23e0821fca5fc0000000000000000000000001178c865dbd8656ff43c47261b0f4493e598a5370000000000000000000000003bb34e34e29ec26da84530f0cf394ef912b559b1000000000000000000000000fbf00421af88dbb8956cea0488825ef057c669cc0000000000000000000000007c96a62bf95de58ffc4e463c43889770e27ba6d700000000000000000000000074ad299d76696fd9772e325ec10b315d86b7f4e3000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000002b5e3af16b1880000000000000000000000000000000000000000000000000000000000000ee6b2800000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000000000000000000000000002b5e3af16b1880000000000000000000000000000000000000000000000000002b5e3af16b1880000000000000000000000000000000000000000000000000002b5e3af16b1880000000000000000000000000000000000000000000000000002b5e3af16b18800000000000000000000000000000000000000000000000000000000000005f5e1000000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000000000000000000000000002b5e3af16b1880000000000000000000000000000000000000000000000000002b5e3af16b1880000000000000000000000000000000000000000000000000002b5e3af16b1880000000000000000000000000000000000000000000000000002b5e3af16b1880000000000000000000000000000000000000000000000000002b5e3af16b1880000000000000000000000000000000000000000000000000002b5e3af16b188000000000000000000000000000000000000000000000000000d8d726b7177a80000000000000000000000000000000000000000000000000002b5e3af16b1880000000000000000000000000000000000000000000000000002b5e3af16b18800000000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000000000000000000000000002b5e3af16b1880000000000000000000000000000000000000000000000000002b5e3af16b1880000000000000000000000000000000000000000000000000002b5e3af16b188000000000000000000000000000000000000000000000000000d8d726b7177a800000000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000002b5e3af16b1880000000000000000000000000000000000000000000000000002b5e3af16b1880000000000000000000000000000000000000000000000000002b5e3af16b1880000000000000000000000000000000000000000000000000002b5e3af16b1880000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000008ac7230489e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _aclManager (address): 0x7FC08320b3e376BfbDE7952a8ad76d115e358e44
Arg [1] : _weth (address): 0xDa58eC189B6454d82d5Ff76604d35cb291FE0aef
Arg [2] : _token (address[]): 0xDa58eC189B6454d82d5Ff76604d35cb291FE0aef,0x22C0975Ef440883F88dFD70988370b7276E70291,0x0dE4F847b9B79763BC2a8ad5433B1988e247AaAF,0x0592121106a7fc71fca5FfB9Dfb5B09086bB6190,0x92b26d002a0F1959Be1aCF5124761618e6376706,0xF186693B36357850F9ab7C89db8148E56939283F,0xb9857Dda56e5A18a4fecE5f765d2ff4e8e12c656,0xDF45C8FB96708b94dA56b497929B82703e55C3c3,0x19008d4F3399352FC0d03C6658AB4d6985F3e2B2,0xc10d48E60F7e35A02440C9220919316B113118B6,0x25A254D2af99f98942a259743F7882d8dD9F8D4C,0x889c30797E3E5905Bf5a3ACb37224cd5EfF17dd9,0xEC9e2607887cD0FC32bB4De936DBb1A1985FC583,0xc351f9BD16E1ec98a45Aa3E8D479B5128D42c255,0xBA45FB9eb0d6A9747e8c9761e133A7399Aa1Be94,0xF8641C5Cda97D9427A88e69Bdc8c5B87f303875B,0x989E0b12D83a07548Dc2aA382A1eabaF4bF845d1,0x1833DC7cb84202EAC2F42a91531f8FF37175FE7B,0x559d3A686eCae2cb320c8d81cfDE6fE830Ed0A96,0xc24fa486eA52A594192151946E91DAF5e2E70ddc,0x141FE369Cb334402b0D4E2CAd960750d205D8b6c,0xC64D22c6b29c94480df1D692d41181AC1B2cD444,0x0971f3341eDd91f9344Fa65F52c23e0821FCa5Fc,0x1178C865Dbd8656ff43C47261B0f4493E598a537,0x3bB34E34e29EC26DA84530F0Cf394ef912B559b1,0xFBf00421aF88DBB8956Cea0488825EF057c669CC,0x7C96a62bF95dE58FfC4e463C43889770e27ba6D7,0x74aD299d76696fD9772e325EC10b315d86B7F4E3
Arg [3] : _withdrawalCap (uint256[]): 50000000000000000000,250000000,100000000,50000000000000000000,50000000000000000000,50000000000000000000,50000000000000000000,100000000,100000000,50000000000000000000,50000000000000000000,50000000000000000000,50000000000000000000,50000000000000000000,50000000000000000000,250000000000000000000,50000000000000000000,50000000000000000000,100000000,50000000000000000000,50000000000000000000,50000000000000000000,250000000000000000000,1000000000000000000,50000000000000000000,50000000000000000000,50000000000000000000,50000000000000000000
Arg [4] : _payoutCap (uint256[]): 10000000000000000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-----Encoded View---------------
92 Constructor Arguments found :
Arg [0] : 0000000000000000000000007fc08320b3e376bfbde7952a8ad76d115e358e44
Arg [1] : 000000000000000000000000da58ec189b6454d82d5ff76604d35cb291fe0aef
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000440
Arg [4] : 00000000000000000000000000000000000000000000000000000000000007e0
Arg [5] : 000000000000000000000000000000000000000000000000000000000000001c
Arg [6] : 000000000000000000000000da58ec189b6454d82d5ff76604d35cb291fe0aef
Arg [7] : 00000000000000000000000022c0975ef440883f88dfd70988370b7276e70291
Arg [8] : 0000000000000000000000000de4f847b9b79763bc2a8ad5433b1988e247aaaf
Arg [9] : 0000000000000000000000000592121106a7fc71fca5ffb9dfb5b09086bb6190
Arg [10] : 00000000000000000000000092b26d002a0f1959be1acf5124761618e6376706
Arg [11] : 000000000000000000000000f186693b36357850f9ab7c89db8148e56939283f
Arg [12] : 000000000000000000000000b9857dda56e5a18a4fece5f765d2ff4e8e12c656
Arg [13] : 000000000000000000000000df45c8fb96708b94da56b497929b82703e55c3c3
Arg [14] : 00000000000000000000000019008d4f3399352fc0d03c6658ab4d6985f3e2b2
Arg [15] : 000000000000000000000000c10d48e60f7e35a02440c9220919316b113118b6
Arg [16] : 00000000000000000000000025a254d2af99f98942a259743f7882d8dd9f8d4c
Arg [17] : 000000000000000000000000889c30797e3e5905bf5a3acb37224cd5eff17dd9
Arg [18] : 000000000000000000000000ec9e2607887cd0fc32bb4de936dbb1a1985fc583
Arg [19] : 000000000000000000000000c351f9bd16e1ec98a45aa3e8d479b5128d42c255
Arg [20] : 000000000000000000000000ba45fb9eb0d6a9747e8c9761e133a7399aa1be94
Arg [21] : 000000000000000000000000f8641c5cda97d9427a88e69bdc8c5b87f303875b
Arg [22] : 000000000000000000000000989e0b12d83a07548dc2aa382a1eabaf4bf845d1
Arg [23] : 0000000000000000000000001833dc7cb84202eac2f42a91531f8ff37175fe7b
Arg [24] : 000000000000000000000000559d3a686ecae2cb320c8d81cfde6fe830ed0a96
Arg [25] : 000000000000000000000000c24fa486ea52a594192151946e91daf5e2e70ddc
Arg [26] : 000000000000000000000000141fe369cb334402b0d4e2cad960750d205d8b6c
Arg [27] : 000000000000000000000000c64d22c6b29c94480df1d692d41181ac1b2cd444
Arg [28] : 0000000000000000000000000971f3341edd91f9344fa65f52c23e0821fca5fc
Arg [29] : 0000000000000000000000001178c865dbd8656ff43c47261b0f4493e598a537
Arg [30] : 0000000000000000000000003bb34e34e29ec26da84530f0cf394ef912b559b1
Arg [31] : 000000000000000000000000fbf00421af88dbb8956cea0488825ef057c669cc
Arg [32] : 0000000000000000000000007c96a62bf95de58ffc4e463c43889770e27ba6d7
Arg [33] : 00000000000000000000000074ad299d76696fd9772e325ec10b315d86b7f4e3
Arg [34] : 000000000000000000000000000000000000000000000000000000000000001c
Arg [35] : 000000000000000000000000000000000000000000000002b5e3af16b1880000
Arg [36] : 000000000000000000000000000000000000000000000000000000000ee6b280
Arg [37] : 0000000000000000000000000000000000000000000000000000000005f5e100
Arg [38] : 000000000000000000000000000000000000000000000002b5e3af16b1880000
Arg [39] : 000000000000000000000000000000000000000000000002b5e3af16b1880000
Arg [40] : 000000000000000000000000000000000000000000000002b5e3af16b1880000
Arg [41] : 000000000000000000000000000000000000000000000002b5e3af16b1880000
Arg [42] : 0000000000000000000000000000000000000000000000000000000005f5e100
Arg [43] : 0000000000000000000000000000000000000000000000000000000005f5e100
Arg [44] : 000000000000000000000000000000000000000000000002b5e3af16b1880000
Arg [45] : 000000000000000000000000000000000000000000000002b5e3af16b1880000
Arg [46] : 000000000000000000000000000000000000000000000002b5e3af16b1880000
Arg [47] : 000000000000000000000000000000000000000000000002b5e3af16b1880000
Arg [48] : 000000000000000000000000000000000000000000000002b5e3af16b1880000
Arg [49] : 000000000000000000000000000000000000000000000002b5e3af16b1880000
Arg [50] : 00000000000000000000000000000000000000000000000d8d726b7177a80000
Arg [51] : 000000000000000000000000000000000000000000000002b5e3af16b1880000
Arg [52] : 000000000000000000000000000000000000000000000002b5e3af16b1880000
Arg [53] : 0000000000000000000000000000000000000000000000000000000005f5e100
Arg [54] : 000000000000000000000000000000000000000000000002b5e3af16b1880000
Arg [55] : 000000000000000000000000000000000000000000000002b5e3af16b1880000
Arg [56] : 000000000000000000000000000000000000000000000002b5e3af16b1880000
Arg [57] : 00000000000000000000000000000000000000000000000d8d726b7177a80000
Arg [58] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [59] : 000000000000000000000000000000000000000000000002b5e3af16b1880000
Arg [60] : 000000000000000000000000000000000000000000000002b5e3af16b1880000
Arg [61] : 000000000000000000000000000000000000000000000002b5e3af16b1880000
Arg [62] : 000000000000000000000000000000000000000000000002b5e3af16b1880000
Arg [63] : 000000000000000000000000000000000000000000000000000000000000001c
Arg [64] : 0000000000000000000000000000000000000000000000008ac7230489e80000
Arg [65] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [66] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [67] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [68] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [69] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [70] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [71] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [72] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [73] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [74] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [75] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [76] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [77] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [78] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [79] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [80] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [81] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [82] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [83] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [84] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [85] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [86] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [87] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [88] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [89] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [90] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [91] : 0000000000000000000000000000000000000000000000000000000000000000
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.