Latest 25 from a total of 26,920 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Server Payout | 24511299 | 1 min ago | IN | 0 ETH | 0.00000266 | ||||
| Server Payout | 24511199 | 21 mins ago | IN | 0 ETH | 0.00000267 | ||||
| Server Payout | 24511174 | 26 mins ago | IN | 0 ETH | 0.00000278 | ||||
| Server Payout | 24511152 | 30 mins ago | IN | 0 ETH | 0.0000025 | ||||
| Server Payout | 24511092 | 43 mins ago | IN | 0 ETH | 0.00000238 | ||||
| Server Payout | 24511073 | 47 mins ago | IN | 0 ETH | 0.00000249 | ||||
| Server Payout | 24511031 | 55 mins ago | IN | 0 ETH | 0.00000261 | ||||
| Server Payout | 24511021 | 57 mins ago | IN | 0 ETH | 0.00000277 | ||||
| Server Payout | 24510998 | 1 hr ago | IN | 0 ETH | 0.00000225 | ||||
| Server Payout | 24510974 | 1 hr ago | IN | 0 ETH | 0.00000238 | ||||
| Server Payout | 24510911 | 1 hr ago | IN | 0 ETH | 0.00000199 | ||||
| Server Payout | 24510898 | 1 hr ago | IN | 0 ETH | 0.00000213 | ||||
| Server Payout | 24510836 | 1 hr ago | IN | 0 ETH | 0.00000189 | ||||
| Server Payout | 24510808 | 1 hr ago | IN | 0 ETH | 0.0000023 | ||||
| Server Payout | 24510783 | 1 hr ago | IN | 0 ETH | 0.00000192 | ||||
| Server Payout | 24510777 | 1 hr ago | IN | 0 ETH | 0.00000221 | ||||
| Server Payout | 24510710 | 2 hrs ago | IN | 0 ETH | 0.00000191 | ||||
| Server Payout | 24510674 | 2 hrs ago | IN | 0 ETH | 0.00000213 | ||||
| Server Payout | 24510660 | 2 hrs ago | IN | 0 ETH | 0.00000202 | ||||
| Server Payout | 24510627 | 2 hrs ago | IN | 0 ETH | 0.00000229 | ||||
| Server Payout | 24510622 | 2 hrs ago | IN | 0 ETH | 0.00000211 | ||||
| Server Payout | 24510590 | 2 hrs ago | IN | 0 ETH | 0.00000173 | ||||
| Server Payout | 24510557 | 2 hrs ago | IN | 0 ETH | 0.00000182 | ||||
| Server Payout | 24510525 | 2 hrs ago | IN | 0 ETH | 0.00000222 | ||||
| Server Payout | 24510465 | 2 hrs ago | IN | 0 ETH | 0.00000207 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 24511299 | 1 min ago | 0.00970942 ETH | ||||
| Transfer | 24511199 | 21 mins ago | 0.00913787 ETH | ||||
| Transfer | 24511174 | 26 mins ago | 0.00913747 ETH | ||||
| Transfer | 24511152 | 30 mins ago | 0.01313834 ETH | ||||
| Transfer | 24511092 | 43 mins ago | 0.00856665 ETH | ||||
| Transfer | 24511073 | 47 mins ago | 0.01010889 ETH | ||||
| Transfer | 24511031 | 55 mins ago | 0.00856605 ETH | ||||
| Transfer | 24511021 | 57 mins ago | 0.01085341 ETH | ||||
| Transfer | 24510998 | 1 hr ago | 0.00742325 ETH | ||||
| Transfer | 24510974 | 1 hr ago | 0.01199626 ETH | ||||
| Transfer | 24510911 | 1 hr ago | 0.01011107 ETH | ||||
| Transfer | 24510898 | 1 hr ago | 0.01256883 ETH | ||||
| Transfer | 24510836 | 1 hr ago | 0.01314066 ETH | ||||
| Transfer | 24510808 | 1 hr ago | 0.00913983 ETH | ||||
| Transfer | 24510783 | 1 hr ago | 0.01085406 ETH | ||||
| Transfer | 24510777 | 1 hr ago | 0.00856847 ETH | ||||
| Transfer | 24510710 | 2 hrs ago | 0.00856768 ETH | ||||
| Transfer | 24510674 | 2 hrs ago | 0.0108549 ETH | ||||
| Transfer | 24510660 | 2 hrs ago | 0.01085456 ETH | ||||
| Transfer | 24510627 | 2 hrs ago | 0.00971141 ETH | ||||
| Transfer | 24510622 | 2 hrs ago | 0.00913928 ETH | ||||
| Transfer | 24510590 | 2 hrs ago | 0.01314083 ETH | ||||
| Transfer | 24510557 | 2 hrs ago | 0.01199735 ETH | ||||
| Transfer | 24510525 | 2 hrs ago | 0.00898679 ETH | ||||
| Transfer | 24510465 | 2 hrs ago | 0.00954906 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
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 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: MIT
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";
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 onlyAdminRole whenNotPaused {
InputValidator.validateAddr(_token);
dailyWithdrawalCap[_token] = _cap;
emit DailyWithdrawalCapChanged(_token, _cap);
}
function setDailyPayoutCap(address _token, uint256 _cap) external onlyAdminRole 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 {}
}// 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: MIT
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: MIT
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: MIT
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];
}
if (msg.value > 0) {
if (supportedToken[address(weth)] == false) {
revert NotSupportedToken();
}
tt[tokenTransfers.length] = IEthgasPool.TokenTransfer(address(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE), msg.value);
}
emit DepositsTriggered(
msg.sender, tt
);
}
}// SPDX-License-Identifier: MIT
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: MIT
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/EthgasPool.sol": {
"DepositHelper": "0x796fa0f613b9871044954f0c6839b329a0ba299c"
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
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
60a060405234801561001057600080fd5b50604051613387380380613387833981810160405281019061003291906107c4565b60016000819055506000600160006101000a81548160ff0219169083151502179055506100648561041b60201b60201c565b6100738461041b60201b60201c565b84600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050815183511415806100fb57508051835114155b80610107575060008351145b1561013e576040517fb824824000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8351811015610410576101738482815181106101605761015f610893565b5b602002602001015161041b60201b60201c565b82818151811061018657610185610893565b5b6020026020010151600360008684815181106101a5576101a4610893565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507fd743397d2c2b0cfae24d70020938ca9e367d31bebf7ec10391c8025589d2cd6f84828151811061021f5761021e610893565b5b602002602001015184838151811061023a57610239610893565b5b60200260200101516040516102509291906108e0565b60405180910390a181818151811061026b5761026a610893565b5b60200260200101516006600086848151811061028a57610289610893565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f017284dd427e3192370095f0611924a4dc14a9697d78e9f5e71e7c01239b535284828151811061030457610303610893565b5b602002602001015183838151811061031f5761031e610893565b5b60200260200101516040516103359291906108e0565b60405180910390a160016002600086848151811061035657610355610893565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fc61100f04059ab37e6520ebedc73c3712cd763eda94fc8bb9f1bfdf7f8f3765c8482815181106103e3576103e2610893565b5b602002602001015160016040516103fb929190610924565b60405180910390a18080600101915050610141565b50505050505061094d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610481576040517fed96523a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006104c382610498565b9050919050565b60006104d5826104b8565b9050919050565b6104e5816104ca565b81146104f057600080fd5b50565b600081519050610502816104dc565b92915050565b6000610513826104b8565b9050919050565b61052381610508565b811461052e57600080fd5b50565b6000815190506105408161051a565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6105948261054b565b810181811067ffffffffffffffff821117156105b3576105b261055c565b5b80604052505050565b60006105c6610484565b90506105d2828261058b565b919050565b600067ffffffffffffffff8211156105f2576105f161055c565b5b602082029050602081019050919050565b600080fd5b610611816104b8565b811461061c57600080fd5b50565b60008151905061062e81610608565b92915050565b6000610647610642846105d7565b6105bc565b9050808382526020820190506020840283018581111561066a57610669610603565b5b835b81811015610693578061067f888261061f565b84526020840193505060208101905061066c565b5050509392505050565b600082601f8301126106b2576106b1610546565b5b81516106c2848260208601610634565b91505092915050565b600067ffffffffffffffff8211156106e6576106e561055c565b5b602082029050602081019050919050565b6000819050919050565b61070a816106f7565b811461071557600080fd5b50565b60008151905061072781610701565b92915050565b600061074061073b846106cb565b6105bc565b9050808382526020820190506020840283018581111561076357610762610603565b5b835b8181101561078c57806107788882610718565b845260208401935050602081019050610765565b5050509392505050565b600082601f8301126107ab576107aa610546565b5b81516107bb84826020860161072d565b91505092915050565b600080600080600060a086880312156107e0576107df61048e565b5b60006107ee888289016104f3565b95505060206107ff88828901610531565b945050604086015167ffffffffffffffff8111156108205761081f610493565b5b61082c8882890161069d565b935050606086015167ffffffffffffffff81111561084d5761084c610493565b5b61085988828901610796565b925050608086015167ffffffffffffffff81111561087a57610879610493565b5b61088688828901610796565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6108cb816104b8565b82525050565b6108da816106f7565b82525050565b60006040820190506108f560008301856108c2565b61090260208301846108d1565b9392505050565b60008115159050919050565b61091e81610909565b82525050565b600060408201905061093960008301856108c2565b6109466020830184610915565b9392505050565b6080516129ee6109996000396000818161063a0152818161083d015281816108da01528181610bfa01528181610d8101528181610eb301528181611104015261138d01526129ee6000f3fe6080604052600436106101445760003560e01c80638456cb59116100b6578063ca85dfc71161006f578063ca85dfc714610456578063cfc34c861461047f578063def275d8146104a8578063e2c6e438146104d1578063e79864661461050e578063f3c3bddc146105375761014b565b80638456cb591461034a5780639181450e1461036157806397730d041461039e578063a5080f30146103db578063ae9779c614610404578063b0cede251461042d5761014b565b806340298ed71161010857806340298ed714610221578063413156441461024c5780634de5120e1461028957806359e97475146102c65780635c975abb146102e25780637c4645501461030d5761014b565b80631cd892ed146101505780631d5e75e01461017957806339ca80ab146101a25780633f4ba83a146101df5780633fc8cef3146101f65761014b565b3661014b57005b600080fd5b34801561015c57600080fd5b5061017760048036038101906101729190611ea5565b610560565b005b34801561018557600080fd5b506101a0600480360381019061019b9190611f57565b610677565b005b3480156101ae57600080fd5b506101c960048036038101906101c49190611f84565b61078e565b6040516101d69190611fc0565b60405180910390f35b3480156101eb57600080fd5b506101f46107a6565b005b34801561020257600080fd5b5061020b61083b565b604051610218919061203a565b60405180910390f35b34801561022d57600080fd5b5061023661085f565b6040516102439190612076565b60405180910390f35b34801561025857600080fd5b50610273600480360381019061026e9190611f84565b610885565b6040516102809190611fc0565b60405180910390f35b34801561029557600080fd5b506102b060048036038101906102ab9190611f84565b61089d565b6040516102bd9190611fc0565b60405180910390f35b6102e060048036038101906102db9190612235565b6108b5565b005b3480156102ee57600080fd5b506102f761094c565b6040516103049190612299565b60405180910390f35b34801561031957600080fd5b50610334600480360381019061032f9190611f84565b610963565b6040516103419190611fc0565b60405180910390f35b34801561035657600080fd5b5061035f61097b565b005b34801561036d57600080fd5b5061038860048036038101906103839190611f84565b610a10565b6040516103959190611fc0565b60405180910390f35b3480156103aa57600080fd5b506103c560048036038101906103c09190611f84565b610a28565b6040516103d29190611fc0565b60405180910390f35b3480156103e757600080fd5b5061040260048036038101906103fd91906122b4565b610a40565b005b34801561041057600080fd5b5061042b600480360381019061042691906122f4565b610b5d565b005b34801561043957600080fd5b50610454600480360381019061044f91906123cd565b610c84565b005b34801561046257600080fd5b5061047d600480360381019061047891906122f4565b610e16565b005b34801561048b57600080fd5b506104a660048036038101906104a191906122b4565b610f47565b005b3480156104b457600080fd5b506104cf60048036038101906104ca919061244e565b611064565b005b3480156104dd57600080fd5b506104f860048036038101906104f39190611f84565b611140565b6040516105059190612299565b60405180910390f35b34801561051a57600080fd5b50610535600480360381019061053091906124da565b611160565b005b34801561054357600080fd5b5061055e600480360381019061055991906123cd565b611290565b005b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663353b4b65336040518263ffffffff1660e01b81526004016105bb9190612529565b60006040518083038186803b1580156105d357600080fd5b505afa1580156105e7573d6000803e3d6000fd5b505050506105f3611422565b6105fb611468565b80431115610635576040517f4e47846c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106697f000000000000000000000000000000000000000000000000000000000000000060008686866006600860076114a9565b61067161180d565b50505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8c0d2cf336040518263ffffffff1660e01b81526004016106d29190612529565b60006040518083038186803b1580156106ea57600080fd5b505afa1580156106fe573d6000803e3d6000fd5b5050505061070a611468565b61071381611817565b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fa1182d49f3f679324120cc9938f0ae049e614a029c8f20ec854862bf94a9338d816040516107839190612529565b60405180910390a150565b60086020528060005260406000206000915090505481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e386be2e336040518263ffffffff1660e01b81526004016108019190612529565b60006040518083038186803b15801561081957600080fd5b505afa15801561082d573d6000803e3d6000fd5b50505050610839611880565b565b7f000000000000000000000000000000000000000000000000000000000000000081565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60076020528060005260406000206000915090505481565b60056020528060005260406000206000915090505481565b6108bd611468565b73796fa0f613b9871044954f0c6839b329a0ba299c6337cc8e90827f000000000000000000000000000000000000000000000000000000000000000060026040518463ffffffff1660e01b815260040161091993929190612656565b60006040518083038186803b15801561093157600080fd5b505af4158015610945573d6000803e3d6000fd5b5050505050565b6000600160009054906101000a900460ff16905090565b60036020528060005260406000206000915090505481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166394911356336040518263ffffffff1660e01b81526004016109d69190612529565b60006040518083038186803b1580156109ee57600080fd5b505afa158015610a02573d6000803e3d6000fd5b50505050610a0e6118e3565b565b60066020528060005260406000206000915090505481565b60046020528060005260406000206000915090505481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e386be2e336040518263ffffffff1660e01b8152600401610a9b9190612529565b60006040518083038186803b158015610ab357600080fd5b505afa158015610ac7573d6000803e3d6000fd5b50505050610ad3611468565b610adc82611817565b80600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507fd743397d2c2b0cfae24d70020938ca9e367d31bebf7ec10391c8025589d2cd6f8282604051610b51929190612694565b60405180910390a15050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0fde6dc336040518263ffffffff1660e01b8152600401610bb89190612529565b60006040518083038186803b158015610bd057600080fd5b505afa158015610be4573d6000803e3d6000fd5b50505050610bf0611422565b610bf8611468565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015610c6057600080fd5b505af1158015610c74573d6000803e3d6000fd5b5050505050610c8161180d565b50565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0fde6dc336040518263ffffffff1660e01b8152600401610cdf9190612529565b60006040518083038186803b158015610cf757600080fd5b505afa158015610d0b573d6000803e3d6000fd5b50505050610d17611422565b610d1f611468565b8181905084849050141580610d375750600084849050145b15610d6e576040517fb824824000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b84849050811015610e0757610dfa7f00000000000000000000000000000000000000000000000000000000000000006000878785818110610db557610db46126bd565b5b9050602002016020810190610dca9190611f84565b868686818110610ddd57610ddc6126bd565b5b9050602002810190610def91906126fb565b6003600560046114a9565b8080600101915050610d71565b50610e1061180d565b50505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0fde6dc336040518263ffffffff1660e01b8152600401610e719190612529565b60006040518083038186803b158015610e8957600080fd5b505afa158015610e9d573d6000803e3d6000fd5b50505050610ea9611422565b610eb1611468565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b8152600401610f0a9190611fc0565b600060405180830381600087803b158015610f2457600080fd5b505af1158015610f38573d6000803e3d6000fd5b50505050610f4461180d565b50565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e386be2e336040518263ffffffff1660e01b8152600401610fa29190612529565b60006040518083038186803b158015610fba57600080fd5b505afa158015610fce573d6000803e3d6000fd5b50505050610fda611468565b610fe382611817565b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f017284dd427e3192370095f0611924a4dc14a9697d78e9f5e71e7c01239b53528282604051611058929190612694565b60405180910390a15050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0fde6dc336040518263ffffffff1660e01b81526004016110bf9190612529565b60006040518083038186803b1580156110d757600080fd5b505afa1580156110eb573d6000803e3d6000fd5b505050506110f7611422565b6110ff611468565b6111337f000000000000000000000000000000000000000000000000000000000000000060008585856003600560046114a9565b61113b61180d565b505050565b60026020528060005260406000206000915054906101000a900460ff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166388bb7825336040518263ffffffff1660e01b81526004016111bb9190612529565b60006040518083038186803b1580156111d357600080fd5b505afa1580156111e7573d6000803e3d6000fd5b505050506111f3611468565b6111fc82611817565b80600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fc61100f04059ab37e6520ebedc73c3712cd763eda94fc8bb9f1bfdf7f8f3765c828260405161128492919061275e565b60405180910390a15050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8c0d2cf336040518263ffffffff1660e01b81526004016112eb9190612529565b60006040518083038186803b15801561130357600080fd5b505afa158015611317573d6000803e3d6000fd5b50505050611323611422565b61132b611468565b81819050848490501415806113435750600084849050145b1561137a576040517fb824824000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b84849050811015611413576114067f000000000000000000000000000000000000000000000000000000000000000060018787858181106113c1576113c06126bd565b5b90506020020160208101906113d69190611f84565b8686868181106113e9576113e86126bd565b5b90506020028101906113fb91906126fb565b6003600560046114a9565b808060010191505061137d565b5061141c61180d565b50505050565b60026000540361145e576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600081905550565b61147061094c565b156114a7576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b600085859050036114e6576040517f81f0d4c900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060005b8787905081101561180057600088888381811061150c5761150b6126bd565b5b9050604002018036038101906115229190612787565b905073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036115b057600193508b816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506115b8565b806000015192505b62015180866000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020544261160a91906127e3565b11156116a05742866000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000856000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8a156116b7576116b2848b8386611945565b6117f2565b866000826000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548160200151866000846000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461174c9190612817565b116117bf578060200151856000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117a79190612817565b925050819055506117ba848b8386611945565b6117f1565b6040517f9cc23ef800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5080806001019150506114ec565b5050505050505050505050565b6001600081905550565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361187d576040517fed96523a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b611888611a83565b6000600160006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6118cc611ac3565b6040516118d99190612529565b60405180910390a1565b6118eb611468565b60018060006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861192e611ac3565b60405161193b9190612529565b60405180910390a1565b83156119ff5760008373ffffffffffffffffffffffffffffffffffffffff1683602001516040516119759061287c565b60006040518083038185875af1925050503d80600081146119b2576040519150601f19603f3d011682016040523d82523d6000602084013e6119b7565b606091505b5050905060001515811515036119f9576040517ffe8a94f400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611a2f565b611a2e8383602001518373ffffffffffffffffffffffffffffffffffffffff16611acb9092919063ffffffff16565b5b8273ffffffffffffffffffffffffffffffffffffffff167f3c3a6ae8916ee8eae179cba84e1e1e83aa622daa3e5562a6c95fad91151751a383604051611a7591906128de565b60405180910390a250505050565b611a8b61094c565b611ac1576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b600033905090565b611b45838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401611afe929190612694565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611b4a565b505050565b6000611b75828473ffffffffffffffffffffffffffffffffffffffff16611be190919063ffffffff16565b90506000815114158015611b9a575080806020019051810190611b98919061290e565b155b15611bdc57826040517f5274afe7000000000000000000000000000000000000000000000000000000008152600401611bd39190612529565b60405180910390fd5b505050565b6060611bef83836000611bf7565b905092915050565b606081471015611c3e57306040517fcd786059000000000000000000000000000000000000000000000000000000008152600401611c359190612529565b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff168486604051611c6791906129a1565b60006040518083038185875af1925050503d8060008114611ca4576040519150601f19603f3d011682016040523d82523d6000602084013e611ca9565b606091505b5091509150611cb9868383611cc4565b925050509392505050565b606082611cd957611cd482611d53565b611d4b565b60008251148015611d01575060008473ffffffffffffffffffffffffffffffffffffffff163b145b15611d4357836040517f9996b315000000000000000000000000000000000000000000000000000000008152600401611d3a9190612529565b60405180910390fd5b819050611d4c565b5b9392505050565b600081511115611d665780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611dd782611dac565b9050919050565b611de781611dcc565b8114611df257600080fd5b50565b600081359050611e0481611dde565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611e2f57611e2e611e0a565b5b8235905067ffffffffffffffff811115611e4c57611e4b611e0f565b5b602083019150836040820283011115611e6857611e67611e14565b5b9250929050565b6000819050919050565b611e8281611e6f565b8114611e8d57600080fd5b50565b600081359050611e9f81611e79565b92915050565b60008060008060608587031215611ebf57611ebe611da2565b5b6000611ecd87828801611df5565b945050602085013567ffffffffffffffff811115611eee57611eed611da7565b5b611efa87828801611e19565b93509350506040611f0d87828801611e90565b91505092959194509250565b6000611f2482611dcc565b9050919050565b611f3481611f19565b8114611f3f57600080fd5b50565b600081359050611f5181611f2b565b92915050565b600060208284031215611f6d57611f6c611da2565b5b6000611f7b84828501611f42565b91505092915050565b600060208284031215611f9a57611f99611da2565b5b6000611fa884828501611df5565b91505092915050565b611fba81611e6f565b82525050565b6000602082019050611fd56000830184611fb1565b92915050565b6000819050919050565b6000612000611ffb611ff684611dac565b611fdb565b611dac565b9050919050565b600061201282611fe5565b9050919050565b600061202482612007565b9050919050565b61203481612019565b82525050565b600060208201905061204f600083018461202b565b92915050565b600061206082612007565b9050919050565b61207081612055565b82525050565b600060208201905061208b6000830184612067565b92915050565b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6120da82612091565b810181811067ffffffffffffffff821117156120f9576120f86120a2565b5b80604052505050565b600061210c611d98565b905061211882826120d1565b919050565b600067ffffffffffffffff821115612138576121376120a2565b5b602082029050602081019050919050565b600080fd5b60006040828403121561216457612163612149565b5b61216e6040612102565b9050600061217e84828501611df5565b600083015250602061219284828501611e90565b60208301525092915050565b60006121b16121ac8461211d565b612102565b905080838252602082019050604084028301858111156121d4576121d3611e14565b5b835b818110156121fd57806121e9888261214e565b8452602084019350506040810190506121d6565b5050509392505050565b600082601f83011261221c5761221b611e0a565b5b813561222c84826020860161219e565b91505092915050565b60006020828403121561224b5761224a611da2565b5b600082013567ffffffffffffffff81111561226957612268611da7565b5b61227584828501612207565b91505092915050565b60008115159050919050565b6122938161227e565b82525050565b60006020820190506122ae600083018461228a565b92915050565b600080604083850312156122cb576122ca611da2565b5b60006122d985828601611df5565b92505060206122ea85828601611e90565b9150509250929050565b60006020828403121561230a57612309611da2565b5b600061231884828501611e90565b91505092915050565b60008083601f84011261233757612336611e0a565b5b8235905067ffffffffffffffff81111561235457612353611e0f565b5b6020830191508360208202830111156123705761236f611e14565b5b9250929050565b60008083601f84011261238d5761238c611e0a565b5b8235905067ffffffffffffffff8111156123aa576123a9611e0f565b5b6020830191508360208202830111156123c6576123c5611e14565b5b9250929050565b600080600080604085870312156123e7576123e6611da2565b5b600085013567ffffffffffffffff81111561240557612404611da7565b5b61241187828801612321565b9450945050602085013567ffffffffffffffff81111561243457612433611da7565b5b61244087828801612377565b925092505092959194509250565b60008060006040848603121561246757612466611da2565b5b600061247586828701611df5565b935050602084013567ffffffffffffffff81111561249657612495611da7565b5b6124a286828701611e19565b92509250509250925092565b6124b78161227e565b81146124c257600080fd5b50565b6000813590506124d4816124ae565b92915050565b600080604083850312156124f1576124f0611da2565b5b60006124ff85828601611df5565b9250506020612510858286016124c5565b9150509250929050565b61252381611dcc565b82525050565b600060208201905061253e600083018461251a565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61257981611dcc565b82525050565b61258881611e6f565b82525050565b6040820160008201516125a46000850182612570565b5060208201516125b7602085018261257f565b50505050565b60006125c9838361258e565b60408301905092915050565b6000602082019050919050565b60006125ed82612544565b6125f7818561254f565b935061260283612560565b8060005b8381101561263357815161261a88826125bd565b9750612625836125d5565b925050600181019050612606565b5085935050505092915050565b61264981612019565b82525050565b8082525050565b6000606082019050818103600083015261267081866125e2565b905061267f6020830185612640565b61268c604083018461264f565b949350505050565b60006040820190506126a9600083018561251a565b6126b66020830184611fb1565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612718576127176126ec565b5b80840192508235915067ffffffffffffffff82111561273a576127396126f1565b5b602083019250604082023603831315612756576127556126f6565b5b509250929050565b6000604082019050612773600083018561251a565b612780602083018461228a565b9392505050565b60006040828403121561279d5761279c611da2565b5b60006127ab8482850161214e565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006127ee82611e6f565b91506127f983611e6f565b9250828203905081811115612811576128106127b4565b5b92915050565b600061282282611e6f565b915061282d83611e6f565b9250828201905080821115612845576128446127b4565b5b92915050565b600081905092915050565b50565b600061286660008361284b565b915061287182612856565b600082019050919050565b600061288782612859565b9150819050919050565b61289a81611dcc565b82525050565b6128a981611e6f565b82525050565b6040820160008201516128c56000850182612891565b5060208201516128d860208501826128a0565b50505050565b60006040820190506128f360008301846128af565b92915050565b600081519050612908816124ae565b92915050565b60006020828403121561292457612923611da2565b5b6000612932848285016128f9565b91505092915050565b600081519050919050565b60005b83811015612964578082015181840152602081019050612949565b60008484015250505050565b600061297b8261293b565b612985818561284b565b9350612995818560208601612946565b80840191505092915050565b60006129ad8284612970565b91508190509291505056fea26469706673582212203a13aa66cfaf74687fdb1e12347903c1c23fe8e8f14e21f98b1e8813e57aa70464736f6c634300081c0033000000000000000000000000d7e914f44d3985e5c6e6fbe36d561b470c6184da000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000008ac7230489e80000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000168d28e3f00280000
Deployed Bytecode
0x6080604052600436106101445760003560e01c80638456cb59116100b6578063ca85dfc71161006f578063ca85dfc714610456578063cfc34c861461047f578063def275d8146104a8578063e2c6e438146104d1578063e79864661461050e578063f3c3bddc146105375761014b565b80638456cb591461034a5780639181450e1461036157806397730d041461039e578063a5080f30146103db578063ae9779c614610404578063b0cede251461042d5761014b565b806340298ed71161010857806340298ed714610221578063413156441461024c5780634de5120e1461028957806359e97475146102c65780635c975abb146102e25780637c4645501461030d5761014b565b80631cd892ed146101505780631d5e75e01461017957806339ca80ab146101a25780633f4ba83a146101df5780633fc8cef3146101f65761014b565b3661014b57005b600080fd5b34801561015c57600080fd5b5061017760048036038101906101729190611ea5565b610560565b005b34801561018557600080fd5b506101a0600480360381019061019b9190611f57565b610677565b005b3480156101ae57600080fd5b506101c960048036038101906101c49190611f84565b61078e565b6040516101d69190611fc0565b60405180910390f35b3480156101eb57600080fd5b506101f46107a6565b005b34801561020257600080fd5b5061020b61083b565b604051610218919061203a565b60405180910390f35b34801561022d57600080fd5b5061023661085f565b6040516102439190612076565b60405180910390f35b34801561025857600080fd5b50610273600480360381019061026e9190611f84565b610885565b6040516102809190611fc0565b60405180910390f35b34801561029557600080fd5b506102b060048036038101906102ab9190611f84565b61089d565b6040516102bd9190611fc0565b60405180910390f35b6102e060048036038101906102db9190612235565b6108b5565b005b3480156102ee57600080fd5b506102f761094c565b6040516103049190612299565b60405180910390f35b34801561031957600080fd5b50610334600480360381019061032f9190611f84565b610963565b6040516103419190611fc0565b60405180910390f35b34801561035657600080fd5b5061035f61097b565b005b34801561036d57600080fd5b5061038860048036038101906103839190611f84565b610a10565b6040516103959190611fc0565b60405180910390f35b3480156103aa57600080fd5b506103c560048036038101906103c09190611f84565b610a28565b6040516103d29190611fc0565b60405180910390f35b3480156103e757600080fd5b5061040260048036038101906103fd91906122b4565b610a40565b005b34801561041057600080fd5b5061042b600480360381019061042691906122f4565b610b5d565b005b34801561043957600080fd5b50610454600480360381019061044f91906123cd565b610c84565b005b34801561046257600080fd5b5061047d600480360381019061047891906122f4565b610e16565b005b34801561048b57600080fd5b506104a660048036038101906104a191906122b4565b610f47565b005b3480156104b457600080fd5b506104cf60048036038101906104ca919061244e565b611064565b005b3480156104dd57600080fd5b506104f860048036038101906104f39190611f84565b611140565b6040516105059190612299565b60405180910390f35b34801561051a57600080fd5b50610535600480360381019061053091906124da565b611160565b005b34801561054357600080fd5b5061055e600480360381019061055991906123cd565b611290565b005b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663353b4b65336040518263ffffffff1660e01b81526004016105bb9190612529565b60006040518083038186803b1580156105d357600080fd5b505afa1580156105e7573d6000803e3d6000fd5b505050506105f3611422565b6105fb611468565b80431115610635576040517f4e47846c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106697f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260008686866006600860076114a9565b61067161180d565b50505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8c0d2cf336040518263ffffffff1660e01b81526004016106d29190612529565b60006040518083038186803b1580156106ea57600080fd5b505afa1580156106fe573d6000803e3d6000fd5b5050505061070a611468565b61071381611817565b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fa1182d49f3f679324120cc9938f0ae049e614a029c8f20ec854862bf94a9338d816040516107839190612529565b60405180910390a150565b60086020528060005260406000206000915090505481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e386be2e336040518263ffffffff1660e01b81526004016108019190612529565b60006040518083038186803b15801561081957600080fd5b505afa15801561082d573d6000803e3d6000fd5b50505050610839611880565b565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60076020528060005260406000206000915090505481565b60056020528060005260406000206000915090505481565b6108bd611468565b73796fa0f613b9871044954f0c6839b329a0ba299c6337cc8e90827f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260026040518463ffffffff1660e01b815260040161091993929190612656565b60006040518083038186803b15801561093157600080fd5b505af4158015610945573d6000803e3d6000fd5b5050505050565b6000600160009054906101000a900460ff16905090565b60036020528060005260406000206000915090505481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166394911356336040518263ffffffff1660e01b81526004016109d69190612529565b60006040518083038186803b1580156109ee57600080fd5b505afa158015610a02573d6000803e3d6000fd5b50505050610a0e6118e3565b565b60066020528060005260406000206000915090505481565b60046020528060005260406000206000915090505481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e386be2e336040518263ffffffff1660e01b8152600401610a9b9190612529565b60006040518083038186803b158015610ab357600080fd5b505afa158015610ac7573d6000803e3d6000fd5b50505050610ad3611468565b610adc82611817565b80600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507fd743397d2c2b0cfae24d70020938ca9e367d31bebf7ec10391c8025589d2cd6f8282604051610b51929190612694565b60405180910390a15050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0fde6dc336040518263ffffffff1660e01b8152600401610bb89190612529565b60006040518083038186803b158015610bd057600080fd5b505afa158015610be4573d6000803e3d6000fd5b50505050610bf0611422565b610bf8611468565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015610c6057600080fd5b505af1158015610c74573d6000803e3d6000fd5b5050505050610c8161180d565b50565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0fde6dc336040518263ffffffff1660e01b8152600401610cdf9190612529565b60006040518083038186803b158015610cf757600080fd5b505afa158015610d0b573d6000803e3d6000fd5b50505050610d17611422565b610d1f611468565b8181905084849050141580610d375750600084849050145b15610d6e576040517fb824824000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b84849050811015610e0757610dfa7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26000878785818110610db557610db46126bd565b5b9050602002016020810190610dca9190611f84565b868686818110610ddd57610ddc6126bd565b5b9050602002810190610def91906126fb565b6003600560046114a9565b8080600101915050610d71565b50610e1061180d565b50505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0fde6dc336040518263ffffffff1660e01b8152600401610e719190612529565b60006040518083038186803b158015610e8957600080fd5b505afa158015610e9d573d6000803e3d6000fd5b50505050610ea9611422565b610eb1611468565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b8152600401610f0a9190611fc0565b600060405180830381600087803b158015610f2457600080fd5b505af1158015610f38573d6000803e3d6000fd5b50505050610f4461180d565b50565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e386be2e336040518263ffffffff1660e01b8152600401610fa29190612529565b60006040518083038186803b158015610fba57600080fd5b505afa158015610fce573d6000803e3d6000fd5b50505050610fda611468565b610fe382611817565b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f017284dd427e3192370095f0611924a4dc14a9697d78e9f5e71e7c01239b53528282604051611058929190612694565b60405180910390a15050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0fde6dc336040518263ffffffff1660e01b81526004016110bf9190612529565b60006040518083038186803b1580156110d757600080fd5b505afa1580156110eb573d6000803e3d6000fd5b505050506110f7611422565b6110ff611468565b6111337f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260008585856003600560046114a9565b61113b61180d565b505050565b60026020528060005260406000206000915054906101000a900460ff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166388bb7825336040518263ffffffff1660e01b81526004016111bb9190612529565b60006040518083038186803b1580156111d357600080fd5b505afa1580156111e7573d6000803e3d6000fd5b505050506111f3611468565b6111fc82611817565b80600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fc61100f04059ab37e6520ebedc73c3712cd763eda94fc8bb9f1bfdf7f8f3765c828260405161128492919061275e565b60405180910390a15050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8c0d2cf336040518263ffffffff1660e01b81526004016112eb9190612529565b60006040518083038186803b15801561130357600080fd5b505afa158015611317573d6000803e3d6000fd5b50505050611323611422565b61132b611468565b81819050848490501415806113435750600084849050145b1561137a576040517fb824824000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b84849050811015611413576114067f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260018787858181106113c1576113c06126bd565b5b90506020020160208101906113d69190611f84565b8686868181106113e9576113e86126bd565b5b90506020028101906113fb91906126fb565b6003600560046114a9565b808060010191505061137d565b5061141c61180d565b50505050565b60026000540361145e576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600081905550565b61147061094c565b156114a7576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b600085859050036114e6576040517f81f0d4c900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060005b8787905081101561180057600088888381811061150c5761150b6126bd565b5b9050604002018036038101906115229190612787565b905073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036115b057600193508b816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506115b8565b806000015192505b62015180866000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020544261160a91906127e3565b11156116a05742866000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000856000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8a156116b7576116b2848b8386611945565b6117f2565b866000826000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548160200151866000846000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461174c9190612817565b116117bf578060200151856000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117a79190612817565b925050819055506117ba848b8386611945565b6117f1565b6040517f9cc23ef800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5080806001019150506114ec565b5050505050505050505050565b6001600081905550565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361187d576040517fed96523a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b611888611a83565b6000600160006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6118cc611ac3565b6040516118d99190612529565b60405180910390a1565b6118eb611468565b60018060006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861192e611ac3565b60405161193b9190612529565b60405180910390a1565b83156119ff5760008373ffffffffffffffffffffffffffffffffffffffff1683602001516040516119759061287c565b60006040518083038185875af1925050503d80600081146119b2576040519150601f19603f3d011682016040523d82523d6000602084013e6119b7565b606091505b5050905060001515811515036119f9576040517ffe8a94f400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611a2f565b611a2e8383602001518373ffffffffffffffffffffffffffffffffffffffff16611acb9092919063ffffffff16565b5b8273ffffffffffffffffffffffffffffffffffffffff167f3c3a6ae8916ee8eae179cba84e1e1e83aa622daa3e5562a6c95fad91151751a383604051611a7591906128de565b60405180910390a250505050565b611a8b61094c565b611ac1576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b600033905090565b611b45838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401611afe929190612694565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611b4a565b505050565b6000611b75828473ffffffffffffffffffffffffffffffffffffffff16611be190919063ffffffff16565b90506000815114158015611b9a575080806020019051810190611b98919061290e565b155b15611bdc57826040517f5274afe7000000000000000000000000000000000000000000000000000000008152600401611bd39190612529565b60405180910390fd5b505050565b6060611bef83836000611bf7565b905092915050565b606081471015611c3e57306040517fcd786059000000000000000000000000000000000000000000000000000000008152600401611c359190612529565b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff168486604051611c6791906129a1565b60006040518083038185875af1925050503d8060008114611ca4576040519150601f19603f3d011682016040523d82523d6000602084013e611ca9565b606091505b5091509150611cb9868383611cc4565b925050509392505050565b606082611cd957611cd482611d53565b611d4b565b60008251148015611d01575060008473ffffffffffffffffffffffffffffffffffffffff163b145b15611d4357836040517f9996b315000000000000000000000000000000000000000000000000000000008152600401611d3a9190612529565b60405180910390fd5b819050611d4c565b5b9392505050565b600081511115611d665780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611dd782611dac565b9050919050565b611de781611dcc565b8114611df257600080fd5b50565b600081359050611e0481611dde565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611e2f57611e2e611e0a565b5b8235905067ffffffffffffffff811115611e4c57611e4b611e0f565b5b602083019150836040820283011115611e6857611e67611e14565b5b9250929050565b6000819050919050565b611e8281611e6f565b8114611e8d57600080fd5b50565b600081359050611e9f81611e79565b92915050565b60008060008060608587031215611ebf57611ebe611da2565b5b6000611ecd87828801611df5565b945050602085013567ffffffffffffffff811115611eee57611eed611da7565b5b611efa87828801611e19565b93509350506040611f0d87828801611e90565b91505092959194509250565b6000611f2482611dcc565b9050919050565b611f3481611f19565b8114611f3f57600080fd5b50565b600081359050611f5181611f2b565b92915050565b600060208284031215611f6d57611f6c611da2565b5b6000611f7b84828501611f42565b91505092915050565b600060208284031215611f9a57611f99611da2565b5b6000611fa884828501611df5565b91505092915050565b611fba81611e6f565b82525050565b6000602082019050611fd56000830184611fb1565b92915050565b6000819050919050565b6000612000611ffb611ff684611dac565b611fdb565b611dac565b9050919050565b600061201282611fe5565b9050919050565b600061202482612007565b9050919050565b61203481612019565b82525050565b600060208201905061204f600083018461202b565b92915050565b600061206082612007565b9050919050565b61207081612055565b82525050565b600060208201905061208b6000830184612067565b92915050565b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6120da82612091565b810181811067ffffffffffffffff821117156120f9576120f86120a2565b5b80604052505050565b600061210c611d98565b905061211882826120d1565b919050565b600067ffffffffffffffff821115612138576121376120a2565b5b602082029050602081019050919050565b600080fd5b60006040828403121561216457612163612149565b5b61216e6040612102565b9050600061217e84828501611df5565b600083015250602061219284828501611e90565b60208301525092915050565b60006121b16121ac8461211d565b612102565b905080838252602082019050604084028301858111156121d4576121d3611e14565b5b835b818110156121fd57806121e9888261214e565b8452602084019350506040810190506121d6565b5050509392505050565b600082601f83011261221c5761221b611e0a565b5b813561222c84826020860161219e565b91505092915050565b60006020828403121561224b5761224a611da2565b5b600082013567ffffffffffffffff81111561226957612268611da7565b5b61227584828501612207565b91505092915050565b60008115159050919050565b6122938161227e565b82525050565b60006020820190506122ae600083018461228a565b92915050565b600080604083850312156122cb576122ca611da2565b5b60006122d985828601611df5565b92505060206122ea85828601611e90565b9150509250929050565b60006020828403121561230a57612309611da2565b5b600061231884828501611e90565b91505092915050565b60008083601f84011261233757612336611e0a565b5b8235905067ffffffffffffffff81111561235457612353611e0f565b5b6020830191508360208202830111156123705761236f611e14565b5b9250929050565b60008083601f84011261238d5761238c611e0a565b5b8235905067ffffffffffffffff8111156123aa576123a9611e0f565b5b6020830191508360208202830111156123c6576123c5611e14565b5b9250929050565b600080600080604085870312156123e7576123e6611da2565b5b600085013567ffffffffffffffff81111561240557612404611da7565b5b61241187828801612321565b9450945050602085013567ffffffffffffffff81111561243457612433611da7565b5b61244087828801612377565b925092505092959194509250565b60008060006040848603121561246757612466611da2565b5b600061247586828701611df5565b935050602084013567ffffffffffffffff81111561249657612495611da7565b5b6124a286828701611e19565b92509250509250925092565b6124b78161227e565b81146124c257600080fd5b50565b6000813590506124d4816124ae565b92915050565b600080604083850312156124f1576124f0611da2565b5b60006124ff85828601611df5565b9250506020612510858286016124c5565b9150509250929050565b61252381611dcc565b82525050565b600060208201905061253e600083018461251a565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61257981611dcc565b82525050565b61258881611e6f565b82525050565b6040820160008201516125a46000850182612570565b5060208201516125b7602085018261257f565b50505050565b60006125c9838361258e565b60408301905092915050565b6000602082019050919050565b60006125ed82612544565b6125f7818561254f565b935061260283612560565b8060005b8381101561263357815161261a88826125bd565b9750612625836125d5565b925050600181019050612606565b5085935050505092915050565b61264981612019565b82525050565b8082525050565b6000606082019050818103600083015261267081866125e2565b905061267f6020830185612640565b61268c604083018461264f565b949350505050565b60006040820190506126a9600083018561251a565b6126b66020830184611fb1565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612718576127176126ec565b5b80840192508235915067ffffffffffffffff82111561273a576127396126f1565b5b602083019250604082023603831315612756576127556126f6565b5b509250929050565b6000604082019050612773600083018561251a565b612780602083018461228a565b9392505050565b60006040828403121561279d5761279c611da2565b5b60006127ab8482850161214e565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006127ee82611e6f565b91506127f983611e6f565b9250828203905081811115612811576128106127b4565b5b92915050565b600061282282611e6f565b915061282d83611e6f565b9250828201905080821115612845576128446127b4565b5b92915050565b600081905092915050565b50565b600061286660008361284b565b915061287182612856565b600082019050919050565b600061288782612859565b9150819050919050565b61289a81611dcc565b82525050565b6128a981611e6f565b82525050565b6040820160008201516128c56000850182612891565b5060208201516128d860208501826128a0565b50505050565b60006040820190506128f360008301846128af565b92915050565b600081519050612908816124ae565b92915050565b60006020828403121561292457612923611da2565b5b6000612932848285016128f9565b91505092915050565b600081519050919050565b60005b83811015612964578082015181840152602081019050612949565b60008484015250505050565b600061297b8261293b565b612985818561284b565b9350612995818560208601612946565b80840191505092915050565b60006129ad8284612970565b91508190509291505056fea26469706673582212203a13aa66cfaf74687fdb1e12347903c1c23fe8e8f14e21f98b1e8813e57aa70464736f6c634300081c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000d7e914f44d3985e5c6e6fbe36d561b470c6184da000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000008ac7230489e80000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000168d28e3f00280000
-----Decoded View---------------
Arg [0] : _aclManager (address): 0xd7E914F44D3985E5c6e6FBe36D561b470c6184dA
Arg [1] : _weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [2] : _token (address[]): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [3] : _withdrawalCap (uint256[]): 10000000000000000000
Arg [4] : _payoutCap (uint256[]): 26000000000000000000
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 000000000000000000000000d7e914f44d3985e5c6e6fbe36d561b470c6184da
Arg [1] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [6] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [8] : 0000000000000000000000000000000000000000000000008ac7230489e80000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [10] : 00000000000000000000000000000000000000000000000168d28e3f00280000
Loading...
Loading
Loading...
Loading
Net Worth in USD
$53,401.10
Net Worth in ETH
27.076019
Token Allocations
ETH
100.00%
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $1,972.37 | 27.0745 | $53,401.1 |
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.