Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 232 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Deposit ETH | 21483737 | 96 days ago | IN | 0.00003 ETH | 0.00014537 | ||||
Deposit ETH | 21483718 | 96 days ago | IN | 0.0001 ETH | 0.00015504 | ||||
Deposit ETH | 21483670 | 96 days ago | IN | 0.001 ETH | 0.00016402 | ||||
Deposit | 21480999 | 96 days ago | IN | 0 ETH | 0.00223385 | ||||
Deposit ETH | 21478629 | 97 days ago | IN | 0.00003 ETH | 0.00017865 | ||||
Deposit ETH | 21478604 | 97 days ago | IN | 0.0001 ETH | 0.00015936 | ||||
Deposit ETH | 21478588 | 97 days ago | IN | 0.00001 ETH | 0.00016379 | ||||
Deposit ETH | 21478581 | 97 days ago | IN | 0.01 ETH | 0.00016297 | ||||
Deposit ETH | 21478490 | 97 days ago | IN | 0.0001 ETH | 0.00013388 | ||||
Deposit ETH | 21478464 | 97 days ago | IN | 0.00011 ETH | 0.00014276 | ||||
Deposit ETH | 21478367 | 97 days ago | IN | 0.0002 ETH | 0.00013359 | ||||
Deposit ETH | 21478359 | 97 days ago | IN | 0.0001 ETH | 0.00012846 | ||||
Deposit ETH | 21478163 | 97 days ago | IN | 0.0001 ETH | 0.00016362 | ||||
Deposit ETH | 21477607 | 97 days ago | IN | 0.0001 ETH | 0.00015443 | ||||
Deposit | 21460455 | 99 days ago | IN | 0 ETH | 0.00252488 | ||||
Deposit | 21456098 | 100 days ago | IN | 0 ETH | 0.00184539 | ||||
Deposit | 21443188 | 101 days ago | IN | 0 ETH | 0.01033256 | ||||
Deposit | 21438331 | 102 days ago | IN | 0 ETH | 0.02030454 | ||||
Deposit | 21437866 | 102 days ago | IN | 0 ETH | 0.00663095 | ||||
Deposit | 21437752 | 102 days ago | IN | 0 ETH | 0.00720959 | ||||
Deposit | 21437624 | 102 days ago | IN | 0 ETH | 0.00779043 | ||||
Deposit | 21434420 | 103 days ago | IN | 0 ETH | 0.00331016 | ||||
Deposit | 21433544 | 103 days ago | IN | 0 ETH | 0.01121949 | ||||
Deposit | 21429970 | 103 days ago | IN | 0 ETH | 0.00834618 | ||||
Deposit | 21421521 | 104 days ago | IN | 0 ETH | 0.0034199 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
TokenSwapAndDeposit
Compiler Version
v0.8.2+commit.661d1103
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import "../interfaces/IAggregationRouterV5.sol"; import "../interfaces/IZkSyncL1Gateway.sol"; import "hardhat/console.sol"; contract TokenSwapAndDeposit is ReentrancyGuard, Ownable { using SafeERC20 for IERC20; using SafeMath for uint256; address immutable public AGGREGATION_ROUTER_V5_ADDRESS; // 1inch Router contract address address immutable public ZK_SYNC_L1_GATEWAY_ADDRESS; // zkLink contract address address[] public signers; // The addresses that can co-sign transactions on the wallet mapping(uint256 => order) orders; // history orders IERC20 private constant ETH_ADDRESS = IERC20(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE); IERC20 private constant ZERO_ADDRESS = IERC20(address(0)); event Deposit( address from, address token, uint256 spentAmount, uint256 swapReturnAmount ); event Withdraw( address indexed user, address indexed token, uint256 amount ); event WithdrawERC20(uint256 orderId, address token, address to, uint256 amount); event WithdrawETH(uint256 orderId, address to, uint256 amount); struct order{ address to; // The address the transaction was sent to uint256 amount; // Amount of Wei sent to the address address token; // The address of the ERC20 token contract, 0 means ETH bool executed; // If the order was executed } constructor(address aggregationRouterV5, address zkSyncL1Gateway, address[] memory allowedSigners) { require(allowedSigners.length == 3, "invalid allSigners length"); require(allowedSigners[0] != allowedSigners[1], "must be different signers"); require(allowedSigners[0] != allowedSigners[2], "must be different signers"); require(allowedSigners[1] != allowedSigners[2], "must be different signers"); signers = allowedSigners; AGGREGATION_ROUTER_V5_ADDRESS = aggregationRouterV5; ZK_SYNC_L1_GATEWAY_ADDRESS = zkSyncL1Gateway; } /** * Gets called when a transaction is received without calling a method */ receive() external payable { } uint256 beforeSwapSrcTokenBalance; uint256 beforeSwapDstTokenBalance; uint256 afterDepositSrcTokenBalance; uint256 afterDepositDstTokenBalance; uint256 afterSwapSrcTokenBalance; uint256 afterSwapDstTokenBalance; function deposit( address _token, uint256 _amount, bytes32 _zkLinkAddress, bytes calldata _exchangeData ) external payable nonReentrant returns (uint256) { uint256 returnAmount; (, IAggregationRouterV5.SwapDescription memory desc,) = abi.decode(_exchangeData[4:], (address, IAggregationRouterV5.SwapDescription, bytes)); require(_token == address(desc.srcToken), 'mismatch token and desc.srcToken'); require(_amount == desc.amount, 'mismatch amount and desc.amount'); require(address(this) == address(desc.dstReceiver), 'invalid desc.dstReceiver'); IERC20 tokenERC20 = IERC20(_token); tokenERC20.safeTransferFrom(msg.sender, address(this), _amount); if (_token == address(desc.dstToken)) { // If ERC20 tokens are deposited directly returnAmount = _amount; } else { // Use 1inch for token exchange tokenERC20.safeApprove(AGGREGATION_ROUTER_V5_ADDRESS, 0); tokenERC20.safeApprove(AGGREGATION_ROUTER_V5_ADDRESS, desc.amount); (bool success, bytes memory returndata)= AGGREGATION_ROUTER_V5_ADDRESS.call{value:msg.value}(_exchangeData); require(success, "exchange failed"); (returnAmount, ) = abi.decode(returndata, (uint256, uint256)); require(returnAmount >= desc.minReturnAmount, "received less than minReturnAmount"); } // // Assets deposited after exchange IERC20 assetERC20 = IERC20(address(desc.dstToken)); assetERC20.safeApprove(ZK_SYNC_L1_GATEWAY_ADDRESS, 0); assetERC20.safeApprove(ZK_SYNC_L1_GATEWAY_ADDRESS, returnAmount); uint104 smallAmount = uint104(returnAmount); IZkSyncL1Gateway(ZK_SYNC_L1_GATEWAY_ADDRESS).depositERC20(address(desc.dstToken), smallAmount, _zkLinkAddress, 0, false); emit Deposit( msg.sender, _token, _amount, returnAmount ); return returnAmount; } /** * Withdraw ETHER from this wallet using 2 signers. * * @param to the destination address to send an outgoing transaction * @param amount the amount in Wei to be sent * @param expireTime the number of seconds since 1970 for which this transaction is valid * @param orderId the unique order id * @param allSigners all signers who sign the tx * @param signatures the signatures of tx */ function withdrawETH( address payable to, uint256 amount, uint256 expireTime, uint256 orderId, address[] memory allSigners, bytes[] memory signatures ) public nonReentrant { require(allSigners.length >= 2, "invalid allSigners length"); require(allSigners.length == signatures.length, "invalid signatures length"); require(allSigners[0] != allSigners[1],"can not be same signer"); // must be different signer require(expireTime >= block.timestamp,"expired transaction"); bytes32 operationHash = keccak256(abi.encodePacked("ETHER", to, amount, expireTime, orderId, address(this))); operationHash = ECDSA.toEthSignedMessageHash(operationHash); for (uint8 index = 0; index < allSigners.length; index++) { address signer = ECDSA.recover(operationHash, signatures[index]); require(signer == allSigners[index], "invalid signer"); require(isAllowedSigner(signer), "not allowed signer"); } // Try to insert the order ID. Will revert if the order id was invalid tryInsertOrderId(orderId, to, amount, address(0)); // send ETHER require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = to.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); emit WithdrawETH(orderId, to, amount); } /** * Withdraw ERC20 from this wallet using 2 signers. * * @param to the destination address to send an outgoing transactioni * @param amount the amount in Wei to be sent * @param token the address of the erc20 token contract * @param expireTime the number of seconds since 1970 for which this transaction is valid * @param orderId the unique order id * @param allSigners all signer who sign the tx * @param signatures the signatures of tx */ function withdrawErc20( address to, uint256 amount, address token, uint256 expireTime, uint256 orderId, address[] memory allSigners, bytes[] memory signatures ) public nonReentrant { require(allSigners.length >=2, "invalid allSigners length"); require(allSigners.length == signatures.length, "invalid signatures length"); require(allSigners[0] != allSigners[1],"can not be same signer"); // must be different signer require(expireTime >= block.timestamp,"expired transaction"); bytes32 operationHash = keccak256(abi.encodePacked("ERC20", to, amount, token, expireTime, orderId, address(this))); operationHash = ECDSA.toEthSignedMessageHash(operationHash); for (uint8 index = 0; index < allSigners.length; index++) { address signer = ECDSA.recover(operationHash, signatures[index]); require(signer == allSigners[index], "invalid signer"); require(isAllowedSigner(signer),"not allowed signer"); } // Try to insert the order ID. Will revert if the order id was invalid tryInsertOrderId(orderId, to, amount, token); // Success, send ERC20 token IERC20(token).safeTransfer(to, amount); emit WithdrawERC20(orderId, token, to, amount); } /** * Determine if an address is a signer on this wallet * * @param signer address to check */ function isAllowedSigner(address signer) public view returns (bool) { // Iterate through all signers on the wallet and for (uint i = 0; i < signers.length; i++) { if (signers[i] == signer) { return true; } } return false; } /** * Verify that the order id has not been used before and inserts it. Throws if the order ID was not accepted. * * @param orderId the unique order id * @param to the destination address to send an outgoing transaction * @param amount the amount in Wei to be sent * @param token the address of the ERC20 contract */ function tryInsertOrderId( uint256 orderId, address to, uint256 amount, address token ) internal { if (orders[orderId].executed) { // This order ID has been excuted before. Disallow! revert("repeated order"); } orders[orderId].executed = true; orders[orderId].to = to; orders[orderId].amount = amount; orders[orderId].token = token; } function isNative(IERC20 token_) internal pure returns (bool) { return (token_ == ZERO_ADDRESS || token_ == ETH_ADDRESS); } function updateSigners(address[] memory newSigners) public onlyOwner { require(newSigners.length == 3, "newSigners must have exactly 3 signers"); require(newSigners[0] != newSigners[1], "newSigners[0] and newSigners[1] must be different"); require(newSigners[0] != newSigners[2], "newSigners[0] and newSigners[2] must be different"); require(newSigners[1] != newSigners[2], "newSigners[1] and newSigners[2] must be different"); signers = newSigners; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol) pragma solidity ^0.8.0; import "../token/ERC20/IERC20.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @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; 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 require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // 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 // OpenZeppelin Contracts (last updated v4.9.4) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.0; /** * @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 v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @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 amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` 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 amount) 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 `amount` 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 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` 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 amount) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../extensions/IERC20Permit.sol"; import "../../../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 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.encodeWithSelector(token.transfer.selector, 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.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 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); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @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.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @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, "SafeERC20: low-level call failed"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } /** * @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.isContract(address(token)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @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.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @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, it is bubbled up by this * function (like regular Solidity function calls). * * 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. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @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`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) 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(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol) pragma solidity ^0.8.0; /** * @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 v4.9.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; import "../Strings.sol"; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV // Deprecated in v4.8 } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) { // 32 is the length in bytes of hash, // enforced by the type signature above /// @solidity memory-safe-assembly assembly { mstore(0x00, "\x19Ethereum Signed Message:\n32") mstore(0x1c, hash) message := keccak256(0x00, 0x3c) } } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(ptr, "\x19\x01") mstore(add(ptr, 0x02), domainSeparator) mstore(add(ptr, 0x22), structHash) data := keccak256(ptr, 0x42) } } /** * @dev Returns an Ethereum Signed Data with intended validator, created from a * `validator` and `data` according to the version 0 of EIP-191. * * See {recover}. */ function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x00", validator, data)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol) pragma solidity ^0.8.0; import "./math/Math.sol"; import "./math/SignedMath.sol"; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value)))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IAggregationExecutor { function callBytes(bytes calldata data) external payable; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/interfaces/IERC20.sol"; import "./IAggregationExecutorV5.sol"; interface IAggregationRouterV5 { struct SwapDescription { IERC20 srcToken; IERC20 dstToken; address payable srcReceiver; address payable dstReceiver; uint256 amount; uint256 minReturnAmount; uint256 flags; // uint256 exchangeRate; } function swap( IAggregationExecutor executor, SwapDescription calldata desc, bytes calldata permit, bytes calldata data ) external payable returns ( uint256 returnAmount, uint256 spentAmount ); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IZkSyncL1Gateway { function depositERC20( address _token, // uint256 _amount, uint104 _amount, bytes32 _zkLinkAddress, uint8 _subAccountId, bool _mapping ) external payable; function depositETH( bytes32 _zkLinkAddress, uint8 _subAccountId, bool _mapping ) external payable; }
// SPDX-License-Identifier: MIT pragma solidity >=0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67; function _sendLogPayloadImplementation(bytes memory payload) internal view { address consoleAddress = CONSOLE_ADDRESS; /// @solidity memory-safe-assembly assembly { pop( staticcall( gas(), consoleAddress, add(payload, 32), mload(payload), 0, 0 ) ) } } function _castToPure( function(bytes memory) internal view fnIn ) internal pure returns (function(bytes memory) pure fnOut) { assembly { fnOut := fnIn } } function _sendLogPayload(bytes memory payload) internal pure { _castToPure(_sendLogPayloadImplementation)(payload); } function log() internal pure { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int256 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(int256)", p0)); } function logUint(uint256 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function logString(string memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint256 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function log(string memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint256 p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1)); } function log(uint256 p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1)); } function log(uint256 p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1)); } function log(uint256 p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1)); } function log(string memory p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1)); } function log(string memory p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1)); } function log(bool p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1)); } function log(address p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint256 p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2)); } function log(uint256 p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2)); } function log(uint256 p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2)); } function log(uint256 p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2)); } function log(uint256 p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2)); } function log(uint256 p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2)); } function log(uint256 p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2)); } function log(uint256 p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2)); } function log(uint256 p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2)); } function log(uint256 p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2)); } function log(uint256 p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2)); } function log(uint256 p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2)); } function log(uint256 p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2)); } function log(string memory p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2)); } function log(string memory p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2)); } function log(string memory p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2)); } function log(string memory p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2)); } function log(bool p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2)); } function log(bool p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2)); } function log(bool p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2)); } function log(address p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2)); } function log(address p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2)); } function log(address p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"aggregationRouterV5","type":"address"},{"internalType":"address","name":"zkSyncL1Gateway","type":"address"},{"internalType":"address[]","name":"allowedSigners","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"spentAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"swapReturnAmount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"orderId","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawERC20","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"orderId","type":"uint256"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawETH","type":"event"},{"inputs":[],"name":"AGGREGATION_ROUTER_V5_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ZK_SYNC_L1_GATEWAY_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32","name":"_zkLinkAddress","type":"bytes32"},{"internalType":"bytes","name":"_exchangeData","type":"bytes"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"isAllowedSigner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"signers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"newSigners","type":"address[]"}],"name":"updateSigners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"expireTime","type":"uint256"},{"internalType":"uint256","name":"orderId","type":"uint256"},{"internalType":"address[]","name":"allSigners","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"expireTime","type":"uint256"},{"internalType":"uint256","name":"orderId","type":"uint256"},{"internalType":"address[]","name":"allSigners","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"withdrawErc20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c06040523480156200001157600080fd5b50604051620049cf380380620049cf83398181016040528101906200003791906200064d565b60016000819055506200005f620000536200041860201b60201c565b6200042060201b60201c565b6003815114620000a6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200009d906200072c565b60405180910390fd5b80600181518110620000e1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16816000815181106200013a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614156200019c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000193906200070a565b60405180910390fd5b80600281518110620001d7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168160008151811062000230577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16141562000292576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000289906200070a565b60405180910390fd5b80600281518110620002cd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168160018151811062000326577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16141562000388576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200037f906200070a565b60405180910390fd5b8060029080519060200190620003a0929190620004e6565b508273ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b815250508173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050505050620008cd565b600033905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805482825590600052602060002090810192821562000562579160200282015b82811115620005615782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062000507565b5b50905062000571919062000575565b5090565b5b808211156200059057600081600090555060010162000576565b5090565b6000620005ab620005a58462000777565b6200074e565b90508083825260208201905082856020860282011115620005cb57600080fd5b60005b85811015620005ff5781620005e4888262000609565b845260208401935060208301925050600181019050620005ce565b5050509392505050565b6000815190506200061a81620008b3565b92915050565b600082601f8301126200063257600080fd5b81516200064484826020860162000594565b91505092915050565b6000806000606084860312156200066357600080fd5b6000620006738682870162000609565b9350506020620006868682870162000609565b925050604084015167ffffffffffffffff811115620006a457600080fd5b620006b28682870162000620565b9150509250925092565b6000620006cb601983620007a6565b9150620006d88262000861565b602082019050919050565b6000620006f2601983620007a6565b9150620006ff826200088a565b602082019050919050565b600060208201905081810360008301526200072581620006bc565b9050919050565b600060208201905081810360008301526200074781620006e3565b9050919050565b60006200075a6200076d565b9050620007688282620007eb565b919050565b6000604051905090565b600067ffffffffffffffff82111562000795576200079462000821565b5b602082029050602081019050919050565b600082825260208201905092915050565b6000620007c482620007cb565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b620007f68262000850565b810181811067ffffffffffffffff8211171562000818576200081762000821565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f6d75737420626520646966666572656e74207369676e65727300000000000000600082015250565b7f696e76616c696420616c6c5369676e657273206c656e67746800000000000000600082015250565b620008be81620007b7565b8114620008ca57600080fd5b50565b60805160601c60a05160601c6140ac6200092360003960008181610a3601528181610a8201528181610acf01526110ca01526000818161085d015281816108a9015281816108f8015261145101526140ac6000f3fe6080604052600436106100a05760003560e01c806383924ba51161006457806383924ba5146101825780638da5cb5b146101ad57806396751ae9146101d85780639fdd761d14610201578063cabb9e7a1461022c578063f2fde38b14610269576100a7565b80631025e095146100ac57806317c224e8146100d55780632079fb9a146101055780636b1430d614610142578063715018a61461016b576100a7565b366100a757005b600080fd5b3480156100b857600080fd5b506100d360048036038101906100ce9190612707565b610292565b005b6100ef60048036038101906100ea91906127d5565b61068b565b6040516100fc919061353e565b60405180910390f35b34801561011157600080fd5b5061012c600480360381019061012791906128bf565b610bbb565b6040516101399190613000565b60405180910390f35b34801561014e57600080fd5b506101696004803603810190610164919061264e565b610bfa565b005b34801561017757600080fd5b506101806110b4565b005b34801561018e57600080fd5b506101976110c8565b6040516101a49190613000565b60405180910390f35b3480156101b957600080fd5b506101c26110ec565b6040516101cf9190613000565b60405180910390f35b3480156101e457600080fd5b506101ff60048036038101906101fa9190612855565b611116565b005b34801561020d57600080fd5b5061021661144f565b6040516102239190613000565b60405180910390f35b34801561023857600080fd5b50610253600480360381019061024e91906125bc565b611473565b604051610260919061313c565b60405180910390f35b34801561027557600080fd5b50610290600480360381019061028b91906125bc565b611548565b005b61029a6115cc565b6002825110156102df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102d69061343e565b60405180910390fd5b8051825114610323576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161031a9061321e565b60405180910390fd5b8160018151811061035d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16826000815181106103b5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415610414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040b906134de565b60405180910390fd5b42841015610457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044e9061345e565b60405180910390fd5b600087878787873060405160200161047496959493929190612f70565b6040516020818303038152906040528051906020012090506104958161161c565b905060005b83518160ff1610156106045760006104f583858460ff16815181106104e8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151611652565b9050848260ff1681518110610533577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146105a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059f9061329e565b60405180910390fd5b6105b181611473565b6105f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e7906132de565b60405180910390fd5b5080806105fc90613893565b91505061049a565b5061061184898989611679565b61063c88888873ffffffffffffffffffffffffffffffffffffffff166117d79092919063ffffffff16565b7ff8eff9ed148da048feccebca2617170aec98bea5840b0b0be8a289ec03c375fd84878a8a6040516106719493929190613590565b60405180910390a15061068261185d565b50505050505050565b60006106956115cc565b600080848460049080926106ab939291906136c0565b8101906106b891906125e5565b50915050806000015173ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161461072e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610725906133de565b60405180910390fd5b80608001518714610774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076b9061337e565b60405180910390fd5b806060015173ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16146107e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107dd906131de565b60405180910390fd5b600088905061081833308a8473ffffffffffffffffffffffffffffffffffffffff16611867909392919063ffffffff16565b816020015173ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16141561085857879250610a28565b6108a47f000000000000000000000000000000000000000000000000000000000000000060008373ffffffffffffffffffffffffffffffffffffffff166118f09092919063ffffffff16565b6108f37f000000000000000000000000000000000000000000000000000000000000000083608001518373ffffffffffffffffffffffffffffffffffffffff166118f09092919063ffffffff16565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1634898960405161093e929190612ed6565b60006040518083038185875af1925050503d806000811461097b576040519150601f19603f3d011682016040523d82523d6000602084013e610980565b606091505b5091509150816109c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bc9061325e565b60405180910390fd5b808060200190518101906109d99190612911565b50809550508360a00151851015610a25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1c9061327e565b60405180910390fd5b50505b600082602001519050610a7d7f000000000000000000000000000000000000000000000000000000000000000060008373ffffffffffffffffffffffffffffffffffffffff166118f09092919063ffffffff16565b610ac87f0000000000000000000000000000000000000000000000000000000000000000858373ffffffffffffffffffffffffffffffffffffffff166118f09092919063ffffffff16565b60008490507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663862a85b28560200151838c6000806040518663ffffffff1660e01b8152600401610b339594939291906130c0565b600060405180830381600087803b158015610b4d57600080fd5b505af1158015610b61573d6000803e3d6000fd5b505050507fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7338c8c88604051610b9a949392919061307b565b60405180910390a18495505050505050610bb261185d565b95945050505050565b60028181548110610bcb57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610c026115cc565b600282511015610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e9061343e565b60405180910390fd5b8051825114610c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c829061321e565b60405180910390fd5b81600181518110610cc5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1682600081518110610d1d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415610d7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d73906134de565b60405180910390fd5b42841015610dbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db69061345e565b60405180910390fd5b60008686868630604051602001610dda959493929190612f06565b604051602081830303815290604052805190602001209050610dfb8161161c565b905060005b83518160ff161015610f6a576000610e5b83858460ff1681518110610e4e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151611652565b9050848260ff1681518110610e99577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f059061329e565b60405180910390fd5b610f1781611473565b610f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4d906132de565b60405180910390fd5b508080610f6290613893565b915050610e00565b50610f788488886000611679565b85471015610fbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb29061333e565b60405180910390fd5b60008773ffffffffffffffffffffffffffffffffffffffff1687604051610fe190612feb565b60006040518083038185875af1925050503d806000811461101e576040519150601f19603f3d011682016040523d82523d6000602084013e611023565b606091505b5050905080611067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105e906132fe565b60405180910390fd5b7f4d7574efc376e1ee5e6eacc9b23ed30ae9f40acfddb028be515fb99a14e2290c85898960405161109a93929190613559565b60405180910390a150506110ac61185d565b505050505050565b6110bc611a4e565b6110c66000611acc565b565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61111e611a4e565b6003815114611162576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111599061339e565b60405180910390fd5b8060018151811061119c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16816000815181106111f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415611253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124a906132be565b60405180910390fd5b8060028151811061128d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16816000815181106112e5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415611344576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133b9061341e565b60405180910390fd5b8060028151811061137e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16816001815181106113d6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415611435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142c906133be565b60405180910390fd5b806002908051906020019061144b929190612203565b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600090505b60028054905081101561153d578273ffffffffffffffffffffffffffffffffffffffff16600282815481106114d9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561152a576001915050611543565b80806115359061384a565b91505061147b565b50600090505b919050565b611550611a4e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b79061323e565b60405180910390fd5b6115c981611acc565b50565b60026000541415611612576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611609906134fe565b60405180910390fd5b6002600081905550565b60007f19457468657265756d205369676e6564204d6573736167653a0a33320000000060005281601c52603c6000209050919050565b60008060006116618585611b92565b9150915061166e81611be4565b819250505092915050565b6003600085815260200190815260200160002060020160149054906101000a900460ff16156116dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d49061349e565b60405180910390fd5b60016003600086815260200190815260200160002060020160146101000a81548160ff021916908315150217905550826003600086815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550816003600086815260200190815260200160002060010181905550806003600086815260200190815260200160002060020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b6118588363a9059cbb60e01b84846040516024016117f6929190613113565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611e82565b505050565b6001600081905550565b6118ea846323b872dd60e01b85858560405160240161188893929190613044565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611e82565b50505050565b6000811480611989575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b815260040161193792919061301b565b60206040518083038186803b15801561194f57600080fd5b505afa158015611963573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198791906128e8565b145b6119c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bf9061351e565b60405180910390fd5b611a498363095ea7b360e01b84846040516024016119e7929190613113565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611e82565b505050565b611a56611f4a565b73ffffffffffffffffffffffffffffffffffffffff16611a746110ec565b73ffffffffffffffffffffffffffffffffffffffff1614611aca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac1906133fe565b60405180910390fd5b565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080604183511415611bd45760008060006020860151925060408601519150606086015160001a9050611bc887828585611f52565b94509450505050611bdd565b60006002915091505b9250929050565b60006004811115611c1e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115611c57577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611c6257611e7f565b60016004811115611c9c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115611cd5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0d906131be565b60405180910390fd5b60026004811115611d50577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115611d89577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611dca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc1906131fe565b60405180910390fd5b60036004811115611e04577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115611e3d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611e7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e759061331e565b60405180910390fd5b5b50565b6000611ee4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166120359092919063ffffffff16565b9050600081511480611f06575080806020019051810190611f059190612896565b5b611f45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3c906134be565b60405180910390fd5b505050565b600033905090565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115611f8d57600060039150915061202c565b600060018787878760405160008152602001604052604051611fb29493929190613157565b6020604051602081039080840390855afa158015611fd4573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120235760006001925092505061202c565b80600092509250505b94509492505050565b6060612044848460008561204d565b90509392505050565b606082471015612092576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120899061335e565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516120bb9190612eef565b60006040518083038185875af1925050503d80600081146120f8576040519150601f19603f3d011682016040523d82523d6000602084013e6120fd565b606091505b509150915061210e8783838761211a565b92505050949350505050565b6060831561217d576000835114156121755761213585612190565b612174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216b9061347e565b60405180910390fd5b5b829050612188565b61218783836121b3565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000825111156121c65781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fa919061319c565b60405180910390fd5b82805482825590600052602060002090810192821561227c579160200282015b8281111561227b5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190612223565b5b509050612289919061228d565b5090565b5b808211156122a657600081600090555060010161228e565b5090565b60006122bd6122b8846135fa565b6135d5565b905080838252602082019050828560208602820111156122dc57600080fd5b60005b8581101561230c57816122f288826123b1565b8452602084019350602083019250506001810190506122df565b5050509392505050565b600061232961232484613626565b6135d5565b9050808382526020820190508260005b85811015612369578135850161234f88826124a3565b845260208401935060208301925050600181019050612339565b5050509392505050565b600061238661238184613652565b6135d5565b90508281526020810184848401111561239e57600080fd5b6123a98482856137d7565b509392505050565b6000813590506123c081613fec565b92915050565b6000813590506123d581614003565b92915050565b600082601f8301126123ec57600080fd5b81356123fc8482602086016122aa565b91505092915050565b600082601f83011261241657600080fd5b8135612426848260208601612316565b91505092915050565b60008151905061243e8161401a565b92915050565b60008135905061245381614031565b92915050565b60008083601f84011261246b57600080fd5b8235905067ffffffffffffffff81111561248457600080fd5b60208301915083600182028301111561249c57600080fd5b9250929050565b600082601f8301126124b457600080fd5b81356124c4848260208601612373565b91505092915050565b6000813590506124dc81614048565b92915050565b600060e082840312156124f457600080fd5b6124fe60e06135d5565b9050600061250e848285016124cd565b6000830152506020612522848285016124cd565b6020830152506040612536848285016123c6565b604083015250606061254a848285016123c6565b606083015250608061255e84828501612592565b60808301525060a061257284828501612592565b60a08301525060c061258684828501612592565b60c08301525092915050565b6000813590506125a18161405f565b92915050565b6000815190506125b68161405f565b92915050565b6000602082840312156125ce57600080fd5b60006125dc848285016123b1565b91505092915050565b600080600061012084860312156125fb57600080fd5b6000612609868287016123c6565b935050602061261a868287016124e2565b92505061010084013567ffffffffffffffff81111561263857600080fd5b612644868287016124a3565b9150509250925092565b60008060008060008060c0878903121561266757600080fd5b600061267589828a016123c6565b965050602061268689828a01612592565b955050604061269789828a01612592565b94505060606126a889828a01612592565b935050608087013567ffffffffffffffff8111156126c557600080fd5b6126d189828a016123db565b92505060a087013567ffffffffffffffff8111156126ee57600080fd5b6126fa89828a01612405565b9150509295509295509295565b600080600080600080600060e0888a03121561272257600080fd5b60006127308a828b016123b1565b97505060206127418a828b01612592565b96505060406127528a828b016123b1565b95505060606127638a828b01612592565b94505060806127748a828b01612592565b93505060a088013567ffffffffffffffff81111561279157600080fd5b61279d8a828b016123db565b92505060c088013567ffffffffffffffff8111156127ba57600080fd5b6127c68a828b01612405565b91505092959891949750929550565b6000806000806000608086880312156127ed57600080fd5b60006127fb888289016123b1565b955050602061280c88828901612592565b945050604061281d88828901612444565b935050606086013567ffffffffffffffff81111561283a57600080fd5b61284688828901612459565b92509250509295509295909350565b60006020828403121561286757600080fd5b600082013567ffffffffffffffff81111561288157600080fd5b61288d848285016123db565b91505092915050565b6000602082840312156128a857600080fd5b60006128b68482850161242f565b91505092915050565b6000602082840312156128d157600080fd5b60006128df84828501612592565b91505092915050565b6000602082840312156128fa57600080fd5b6000612908848285016125a7565b91505092915050565b6000806040838503121561292457600080fd5b6000612932858286016125a7565b9250506020612943858286016125a7565b9150509250929050565b6129568161378f565b82525050565b61296d61296882613705565b6138cf565b82525050565b61297c816136f3565b82525050565b61299361298e826136f3565b6138bd565b82525050565b6129a281613717565b82525050565b6129b181613723565b82525050565b60006129c38385613699565b93506129d08385846137d7565b82840190509392505050565b60006129e782613683565b6129f18185613699565b9350612a018185602086016137e6565b80840191505092915050565b612a16816137a1565b82525050565b6000612a278261368e565b612a3181856136a4565b9350612a418185602086016137e6565b612a4a8161395b565b840191505092915050565b6000612a626018836136a4565b9150612a6d82613979565b602082019050919050565b6000612a856018836136a4565b9150612a90826139a2565b602082019050919050565b6000612aa86005836136b5565b9150612ab3826139cb565b600582019050919050565b6000612acb601f836136a4565b9150612ad6826139f4565b602082019050919050565b6000612aee6019836136a4565b9150612af982613a1d565b602082019050919050565b6000612b116026836136a4565b9150612b1c82613a46565b604082019050919050565b6000612b34600f836136a4565b9150612b3f82613a95565b602082019050919050565b6000612b576022836136a4565b9150612b6282613abe565b604082019050919050565b6000612b7a600e836136a4565b9150612b8582613b0d565b602082019050919050565b6000612b9d6031836136a4565b9150612ba882613b36565b604082019050919050565b6000612bc06012836136a4565b9150612bcb82613b85565b602082019050919050565b6000612be3603a836136a4565b9150612bee82613bae565b604082019050919050565b6000612c066022836136a4565b9150612c1182613bfd565b604082019050919050565b6000612c29601d836136a4565b9150612c3482613c4c565b602082019050919050565b6000612c4c6026836136a4565b9150612c5782613c75565b604082019050919050565b6000612c6f601f836136a4565b9150612c7a82613cc4565b602082019050919050565b6000612c926026836136a4565b9150612c9d82613ced565b604082019050919050565b6000612cb56031836136a4565b9150612cc082613d3c565b604082019050919050565b6000612cd86020836136a4565b9150612ce382613d8b565b602082019050919050565b6000612cfb6005836136b5565b9150612d0682613db4565b600582019050919050565b6000612d1e6020836136a4565b9150612d2982613ddd565b602082019050919050565b6000612d416031836136a4565b9150612d4c82613e06565b604082019050919050565b6000612d646019836136a4565b9150612d6f82613e55565b602082019050919050565b6000612d87600083613699565b9150612d9282613e7e565b600082019050919050565b6000612daa6013836136a4565b9150612db582613e81565b602082019050919050565b6000612dcd601d836136a4565b9150612dd882613eaa565b602082019050919050565b6000612df0600e836136a4565b9150612dfb82613ed3565b602082019050919050565b6000612e13602a836136a4565b9150612e1e82613efc565b604082019050919050565b6000612e366016836136a4565b9150612e4182613f4b565b602082019050919050565b6000612e59601f836136a4565b9150612e6482613f74565b602082019050919050565b6000612e7c6036836136a4565b9150612e8782613f9d565b604082019050919050565b612e9b8161373f565b82525050565b612eaa81613778565b82525050565b612ec1612ebc82613778565b6138f3565b82525050565b612ed081613782565b82525050565b6000612ee38284866129b7565b91508190509392505050565b6000612efb82846129dc565b915081905092915050565b6000612f1182612a9b565b9150612f1d828861295c565b601482019150612f2d8287612eb0565b602082019150612f3d8286612eb0565b602082019150612f4d8285612eb0565b602082019150612f5d8284612982565b6014820191508190509695505050505050565b6000612f7b82612cee565b9150612f878289612982565b601482019150612f978288612eb0565b602082019150612fa78287612982565b601482019150612fb78286612eb0565b602082019150612fc78285612eb0565b602082019150612fd78284612982565b601482019150819050979650505050505050565b6000612ff682612d7a565b9150819050919050565b60006020820190506130156000830184612973565b92915050565b60006040820190506130306000830185612973565b61303d6020830184612973565b9392505050565b60006060820190506130596000830186612973565b6130666020830185612973565b6130736040830184612ea1565b949350505050565b60006080820190506130906000830187612973565b61309d6020830186612973565b6130aa6040830185612ea1565b6130b76060830184612ea1565b95945050505050565b600060a0820190506130d56000830188612973565b6130e26020830187612e92565b6130ef60408301866129a8565b6130fc6060830185612a0d565b6131096080830184612999565b9695505050505050565b60006040820190506131286000830185612973565b6131356020830184612ea1565b9392505050565b60006020820190506131516000830184612999565b92915050565b600060808201905061316c60008301876129a8565b6131796020830186612ec7565b61318660408301856129a8565b61319360608301846129a8565b95945050505050565b600060208201905081810360008301526131b68184612a1c565b905092915050565b600060208201905081810360008301526131d781612a55565b9050919050565b600060208201905081810360008301526131f781612a78565b9050919050565b6000602082019050818103600083015261321781612abe565b9050919050565b6000602082019050818103600083015261323781612ae1565b9050919050565b6000602082019050818103600083015261325781612b04565b9050919050565b6000602082019050818103600083015261327781612b27565b9050919050565b6000602082019050818103600083015261329781612b4a565b9050919050565b600060208201905081810360008301526132b781612b6d565b9050919050565b600060208201905081810360008301526132d781612b90565b9050919050565b600060208201905081810360008301526132f781612bb3565b9050919050565b6000602082019050818103600083015261331781612bd6565b9050919050565b6000602082019050818103600083015261333781612bf9565b9050919050565b6000602082019050818103600083015261335781612c1c565b9050919050565b6000602082019050818103600083015261337781612c3f565b9050919050565b6000602082019050818103600083015261339781612c62565b9050919050565b600060208201905081810360008301526133b781612c85565b9050919050565b600060208201905081810360008301526133d781612ca8565b9050919050565b600060208201905081810360008301526133f781612ccb565b9050919050565b6000602082019050818103600083015261341781612d11565b9050919050565b6000602082019050818103600083015261343781612d34565b9050919050565b6000602082019050818103600083015261345781612d57565b9050919050565b6000602082019050818103600083015261347781612d9d565b9050919050565b6000602082019050818103600083015261349781612dc0565b9050919050565b600060208201905081810360008301526134b781612de3565b9050919050565b600060208201905081810360008301526134d781612e06565b9050919050565b600060208201905081810360008301526134f781612e29565b9050919050565b6000602082019050818103600083015261351781612e4c565b9050919050565b6000602082019050818103600083015261353781612e6f565b9050919050565b60006020820190506135536000830184612ea1565b92915050565b600060608201905061356e6000830186612ea1565b61357b602083018561294d565b6135886040830184612ea1565b949350505050565b60006080820190506135a56000830187612ea1565b6135b26020830186612973565b6135bf6040830185612973565b6135cc6060830184612ea1565b95945050505050565b60006135df6135f0565b90506135eb8282613819565b919050565b6000604051905090565b600067ffffffffffffffff8211156136155761361461392c565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156136415761364061392c565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561366d5761366c61392c565b5b6136768261395b565b9050602081019050919050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600080858511156136d057600080fd5b838611156136dd57600080fd5b6001850283019150848603905094509492505050565b60006136fe82613758565b9050919050565b600061371082613758565b9050919050565b60008115159050919050565b6000819050919050565b6000613738826136f3565b9050919050565b60006cffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061379a826137b3565b9050919050565b60006137ac82613782565b9050919050565b60006137be826137c5565b9050919050565b60006137d082613758565b9050919050565b82818337600083830152505050565b60005b838110156138045780820151818401526020810190506137e9565b83811115613813576000848401525b50505050565b6138228261395b565b810181811067ffffffffffffffff821117156138415761384061392c565b5b80604052505050565b600061385582613778565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613888576138876138fd565b5b600182019050919050565b600061389e82613782565b915060ff8214156138b2576138b16138fd565b5b600182019050919050565b60006138c8826138e1565b9050919050565b60006138da826138e1565b9050919050565b60006138ec8261396c565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f696e76616c696420646573632e64737452656365697665720000000000000000600082015250565b7f4554484552000000000000000000000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f696e76616c6964207369676e617475726573206c656e67746800000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f65786368616e6765206661696c65640000000000000000000000000000000000600082015250565b7f7265636569766564206c657373207468616e206d696e52657475726e416d6f7560008201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b7f696e76616c6964207369676e6572000000000000000000000000000000000000600082015250565b7f6e65775369676e6572735b305d20616e64206e65775369676e6572735b315d2060008201527f6d75737420626520646966666572656e74000000000000000000000000000000602082015250565b7f6e6f7420616c6c6f776564207369676e65720000000000000000000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f6d69736d6174636820616d6f756e7420616e6420646573632e616d6f756e7400600082015250565b7f6e65775369676e657273206d75737420686176652065786163746c792033207360008201527f69676e6572730000000000000000000000000000000000000000000000000000602082015250565b7f6e65775369676e6572735b315d20616e64206e65775369676e6572735b325d2060008201527f6d75737420626520646966666572656e74000000000000000000000000000000602082015250565b7f6d69736d6174636820746f6b656e20616e6420646573632e737263546f6b656e600082015250565b7f4552433230000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f6e65775369676e6572735b305d20616e64206e65775369676e6572735b325d2060008201527f6d75737420626520646966666572656e74000000000000000000000000000000602082015250565b7f696e76616c696420616c6c5369676e657273206c656e67746800000000000000600082015250565b50565b7f65787069726564207472616e73616374696f6e00000000000000000000000000600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f7265706561746564206f72646572000000000000000000000000000000000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f63616e206e6f742062652073616d65207369676e657200000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000602082015250565b613ff5816136f3565b811461400057600080fd5b50565b61400c81613705565b811461401757600080fd5b50565b61402381613717565b811461402e57600080fd5b50565b61403a81613723565b811461404557600080fd5b50565b6140518161372d565b811461405c57600080fd5b50565b61406881613778565b811461407357600080fd5b5056fea2646970667358221220eef0ddd719a796dc785708c4d3410361ecc135708d0ea648236373542841242e64736f6c634300080200330000000000000000000000001111111254eeb25477b68fb85ed929f73a96058200000000000000000000000035d173cdfe4d484bc5985fda55fabad5892c7b820000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000300000000000000000000000022c89137525b593dd2a18434348b550ffa5984fe0000000000000000000000005cdded5ea50ae7973943394de17ab51c365254dd0000000000000000000000002a2a180373391915738ab1f89a1b258893361964
Deployed Bytecode
0x6080604052600436106100a05760003560e01c806383924ba51161006457806383924ba5146101825780638da5cb5b146101ad57806396751ae9146101d85780639fdd761d14610201578063cabb9e7a1461022c578063f2fde38b14610269576100a7565b80631025e095146100ac57806317c224e8146100d55780632079fb9a146101055780636b1430d614610142578063715018a61461016b576100a7565b366100a757005b600080fd5b3480156100b857600080fd5b506100d360048036038101906100ce9190612707565b610292565b005b6100ef60048036038101906100ea91906127d5565b61068b565b6040516100fc919061353e565b60405180910390f35b34801561011157600080fd5b5061012c600480360381019061012791906128bf565b610bbb565b6040516101399190613000565b60405180910390f35b34801561014e57600080fd5b506101696004803603810190610164919061264e565b610bfa565b005b34801561017757600080fd5b506101806110b4565b005b34801561018e57600080fd5b506101976110c8565b6040516101a49190613000565b60405180910390f35b3480156101b957600080fd5b506101c26110ec565b6040516101cf9190613000565b60405180910390f35b3480156101e457600080fd5b506101ff60048036038101906101fa9190612855565b611116565b005b34801561020d57600080fd5b5061021661144f565b6040516102239190613000565b60405180910390f35b34801561023857600080fd5b50610253600480360381019061024e91906125bc565b611473565b604051610260919061313c565b60405180910390f35b34801561027557600080fd5b50610290600480360381019061028b91906125bc565b611548565b005b61029a6115cc565b6002825110156102df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102d69061343e565b60405180910390fd5b8051825114610323576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161031a9061321e565b60405180910390fd5b8160018151811061035d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16826000815181106103b5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415610414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040b906134de565b60405180910390fd5b42841015610457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044e9061345e565b60405180910390fd5b600087878787873060405160200161047496959493929190612f70565b6040516020818303038152906040528051906020012090506104958161161c565b905060005b83518160ff1610156106045760006104f583858460ff16815181106104e8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151611652565b9050848260ff1681518110610533577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146105a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059f9061329e565b60405180910390fd5b6105b181611473565b6105f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e7906132de565b60405180910390fd5b5080806105fc90613893565b91505061049a565b5061061184898989611679565b61063c88888873ffffffffffffffffffffffffffffffffffffffff166117d79092919063ffffffff16565b7ff8eff9ed148da048feccebca2617170aec98bea5840b0b0be8a289ec03c375fd84878a8a6040516106719493929190613590565b60405180910390a15061068261185d565b50505050505050565b60006106956115cc565b600080848460049080926106ab939291906136c0565b8101906106b891906125e5565b50915050806000015173ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161461072e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610725906133de565b60405180910390fd5b80608001518714610774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076b9061337e565b60405180910390fd5b806060015173ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16146107e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107dd906131de565b60405180910390fd5b600088905061081833308a8473ffffffffffffffffffffffffffffffffffffffff16611867909392919063ffffffff16565b816020015173ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16141561085857879250610a28565b6108a47f0000000000000000000000001111111254eeb25477b68fb85ed929f73a96058260008373ffffffffffffffffffffffffffffffffffffffff166118f09092919063ffffffff16565b6108f37f0000000000000000000000001111111254eeb25477b68fb85ed929f73a96058283608001518373ffffffffffffffffffffffffffffffffffffffff166118f09092919063ffffffff16565b6000807f0000000000000000000000001111111254eeb25477b68fb85ed929f73a96058273ffffffffffffffffffffffffffffffffffffffff1634898960405161093e929190612ed6565b60006040518083038185875af1925050503d806000811461097b576040519150601f19603f3d011682016040523d82523d6000602084013e610980565b606091505b5091509150816109c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bc9061325e565b60405180910390fd5b808060200190518101906109d99190612911565b50809550508360a00151851015610a25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1c9061327e565b60405180910390fd5b50505b600082602001519050610a7d7f00000000000000000000000035d173cdfe4d484bc5985fda55fabad5892c7b8260008373ffffffffffffffffffffffffffffffffffffffff166118f09092919063ffffffff16565b610ac87f00000000000000000000000035d173cdfe4d484bc5985fda55fabad5892c7b82858373ffffffffffffffffffffffffffffffffffffffff166118f09092919063ffffffff16565b60008490507f00000000000000000000000035d173cdfe4d484bc5985fda55fabad5892c7b8273ffffffffffffffffffffffffffffffffffffffff1663862a85b28560200151838c6000806040518663ffffffff1660e01b8152600401610b339594939291906130c0565b600060405180830381600087803b158015610b4d57600080fd5b505af1158015610b61573d6000803e3d6000fd5b505050507fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7338c8c88604051610b9a949392919061307b565b60405180910390a18495505050505050610bb261185d565b95945050505050565b60028181548110610bcb57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610c026115cc565b600282511015610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e9061343e565b60405180910390fd5b8051825114610c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c829061321e565b60405180910390fd5b81600181518110610cc5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1682600081518110610d1d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415610d7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d73906134de565b60405180910390fd5b42841015610dbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db69061345e565b60405180910390fd5b60008686868630604051602001610dda959493929190612f06565b604051602081830303815290604052805190602001209050610dfb8161161c565b905060005b83518160ff161015610f6a576000610e5b83858460ff1681518110610e4e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151611652565b9050848260ff1681518110610e99577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f059061329e565b60405180910390fd5b610f1781611473565b610f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4d906132de565b60405180910390fd5b508080610f6290613893565b915050610e00565b50610f788488886000611679565b85471015610fbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb29061333e565b60405180910390fd5b60008773ffffffffffffffffffffffffffffffffffffffff1687604051610fe190612feb565b60006040518083038185875af1925050503d806000811461101e576040519150601f19603f3d011682016040523d82523d6000602084013e611023565b606091505b5050905080611067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105e906132fe565b60405180910390fd5b7f4d7574efc376e1ee5e6eacc9b23ed30ae9f40acfddb028be515fb99a14e2290c85898960405161109a93929190613559565b60405180910390a150506110ac61185d565b505050505050565b6110bc611a4e565b6110c66000611acc565b565b7f00000000000000000000000035d173cdfe4d484bc5985fda55fabad5892c7b8281565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61111e611a4e565b6003815114611162576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111599061339e565b60405180910390fd5b8060018151811061119c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16816000815181106111f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415611253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124a906132be565b60405180910390fd5b8060028151811061128d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16816000815181106112e5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415611344576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133b9061341e565b60405180910390fd5b8060028151811061137e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16816001815181106113d6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415611435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142c906133be565b60405180910390fd5b806002908051906020019061144b929190612203565b5050565b7f0000000000000000000000001111111254eeb25477b68fb85ed929f73a96058281565b600080600090505b60028054905081101561153d578273ffffffffffffffffffffffffffffffffffffffff16600282815481106114d9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561152a576001915050611543565b80806115359061384a565b91505061147b565b50600090505b919050565b611550611a4e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b79061323e565b60405180910390fd5b6115c981611acc565b50565b60026000541415611612576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611609906134fe565b60405180910390fd5b6002600081905550565b60007f19457468657265756d205369676e6564204d6573736167653a0a33320000000060005281601c52603c6000209050919050565b60008060006116618585611b92565b9150915061166e81611be4565b819250505092915050565b6003600085815260200190815260200160002060020160149054906101000a900460ff16156116dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d49061349e565b60405180910390fd5b60016003600086815260200190815260200160002060020160146101000a81548160ff021916908315150217905550826003600086815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550816003600086815260200190815260200160002060010181905550806003600086815260200190815260200160002060020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b6118588363a9059cbb60e01b84846040516024016117f6929190613113565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611e82565b505050565b6001600081905550565b6118ea846323b872dd60e01b85858560405160240161188893929190613044565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611e82565b50505050565b6000811480611989575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b815260040161193792919061301b565b60206040518083038186803b15801561194f57600080fd5b505afa158015611963573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198791906128e8565b145b6119c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bf9061351e565b60405180910390fd5b611a498363095ea7b360e01b84846040516024016119e7929190613113565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611e82565b505050565b611a56611f4a565b73ffffffffffffffffffffffffffffffffffffffff16611a746110ec565b73ffffffffffffffffffffffffffffffffffffffff1614611aca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac1906133fe565b60405180910390fd5b565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080604183511415611bd45760008060006020860151925060408601519150606086015160001a9050611bc887828585611f52565b94509450505050611bdd565b60006002915091505b9250929050565b60006004811115611c1e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115611c57577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611c6257611e7f565b60016004811115611c9c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115611cd5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0d906131be565b60405180910390fd5b60026004811115611d50577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115611d89577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611dca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc1906131fe565b60405180910390fd5b60036004811115611e04577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115611e3d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611e7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e759061331e565b60405180910390fd5b5b50565b6000611ee4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166120359092919063ffffffff16565b9050600081511480611f06575080806020019051810190611f059190612896565b5b611f45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3c906134be565b60405180910390fd5b505050565b600033905090565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115611f8d57600060039150915061202c565b600060018787878760405160008152602001604052604051611fb29493929190613157565b6020604051602081039080840390855afa158015611fd4573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120235760006001925092505061202c565b80600092509250505b94509492505050565b6060612044848460008561204d565b90509392505050565b606082471015612092576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120899061335e565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516120bb9190612eef565b60006040518083038185875af1925050503d80600081146120f8576040519150601f19603f3d011682016040523d82523d6000602084013e6120fd565b606091505b509150915061210e8783838761211a565b92505050949350505050565b6060831561217d576000835114156121755761213585612190565b612174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216b9061347e565b60405180910390fd5b5b829050612188565b61218783836121b3565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000825111156121c65781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fa919061319c565b60405180910390fd5b82805482825590600052602060002090810192821561227c579160200282015b8281111561227b5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190612223565b5b509050612289919061228d565b5090565b5b808211156122a657600081600090555060010161228e565b5090565b60006122bd6122b8846135fa565b6135d5565b905080838252602082019050828560208602820111156122dc57600080fd5b60005b8581101561230c57816122f288826123b1565b8452602084019350602083019250506001810190506122df565b5050509392505050565b600061232961232484613626565b6135d5565b9050808382526020820190508260005b85811015612369578135850161234f88826124a3565b845260208401935060208301925050600181019050612339565b5050509392505050565b600061238661238184613652565b6135d5565b90508281526020810184848401111561239e57600080fd5b6123a98482856137d7565b509392505050565b6000813590506123c081613fec565b92915050565b6000813590506123d581614003565b92915050565b600082601f8301126123ec57600080fd5b81356123fc8482602086016122aa565b91505092915050565b600082601f83011261241657600080fd5b8135612426848260208601612316565b91505092915050565b60008151905061243e8161401a565b92915050565b60008135905061245381614031565b92915050565b60008083601f84011261246b57600080fd5b8235905067ffffffffffffffff81111561248457600080fd5b60208301915083600182028301111561249c57600080fd5b9250929050565b600082601f8301126124b457600080fd5b81356124c4848260208601612373565b91505092915050565b6000813590506124dc81614048565b92915050565b600060e082840312156124f457600080fd5b6124fe60e06135d5565b9050600061250e848285016124cd565b6000830152506020612522848285016124cd565b6020830152506040612536848285016123c6565b604083015250606061254a848285016123c6565b606083015250608061255e84828501612592565b60808301525060a061257284828501612592565b60a08301525060c061258684828501612592565b60c08301525092915050565b6000813590506125a18161405f565b92915050565b6000815190506125b68161405f565b92915050565b6000602082840312156125ce57600080fd5b60006125dc848285016123b1565b91505092915050565b600080600061012084860312156125fb57600080fd5b6000612609868287016123c6565b935050602061261a868287016124e2565b92505061010084013567ffffffffffffffff81111561263857600080fd5b612644868287016124a3565b9150509250925092565b60008060008060008060c0878903121561266757600080fd5b600061267589828a016123c6565b965050602061268689828a01612592565b955050604061269789828a01612592565b94505060606126a889828a01612592565b935050608087013567ffffffffffffffff8111156126c557600080fd5b6126d189828a016123db565b92505060a087013567ffffffffffffffff8111156126ee57600080fd5b6126fa89828a01612405565b9150509295509295509295565b600080600080600080600060e0888a03121561272257600080fd5b60006127308a828b016123b1565b97505060206127418a828b01612592565b96505060406127528a828b016123b1565b95505060606127638a828b01612592565b94505060806127748a828b01612592565b93505060a088013567ffffffffffffffff81111561279157600080fd5b61279d8a828b016123db565b92505060c088013567ffffffffffffffff8111156127ba57600080fd5b6127c68a828b01612405565b91505092959891949750929550565b6000806000806000608086880312156127ed57600080fd5b60006127fb888289016123b1565b955050602061280c88828901612592565b945050604061281d88828901612444565b935050606086013567ffffffffffffffff81111561283a57600080fd5b61284688828901612459565b92509250509295509295909350565b60006020828403121561286757600080fd5b600082013567ffffffffffffffff81111561288157600080fd5b61288d848285016123db565b91505092915050565b6000602082840312156128a857600080fd5b60006128b68482850161242f565b91505092915050565b6000602082840312156128d157600080fd5b60006128df84828501612592565b91505092915050565b6000602082840312156128fa57600080fd5b6000612908848285016125a7565b91505092915050565b6000806040838503121561292457600080fd5b6000612932858286016125a7565b9250506020612943858286016125a7565b9150509250929050565b6129568161378f565b82525050565b61296d61296882613705565b6138cf565b82525050565b61297c816136f3565b82525050565b61299361298e826136f3565b6138bd565b82525050565b6129a281613717565b82525050565b6129b181613723565b82525050565b60006129c38385613699565b93506129d08385846137d7565b82840190509392505050565b60006129e782613683565b6129f18185613699565b9350612a018185602086016137e6565b80840191505092915050565b612a16816137a1565b82525050565b6000612a278261368e565b612a3181856136a4565b9350612a418185602086016137e6565b612a4a8161395b565b840191505092915050565b6000612a626018836136a4565b9150612a6d82613979565b602082019050919050565b6000612a856018836136a4565b9150612a90826139a2565b602082019050919050565b6000612aa86005836136b5565b9150612ab3826139cb565b600582019050919050565b6000612acb601f836136a4565b9150612ad6826139f4565b602082019050919050565b6000612aee6019836136a4565b9150612af982613a1d565b602082019050919050565b6000612b116026836136a4565b9150612b1c82613a46565b604082019050919050565b6000612b34600f836136a4565b9150612b3f82613a95565b602082019050919050565b6000612b576022836136a4565b9150612b6282613abe565b604082019050919050565b6000612b7a600e836136a4565b9150612b8582613b0d565b602082019050919050565b6000612b9d6031836136a4565b9150612ba882613b36565b604082019050919050565b6000612bc06012836136a4565b9150612bcb82613b85565b602082019050919050565b6000612be3603a836136a4565b9150612bee82613bae565b604082019050919050565b6000612c066022836136a4565b9150612c1182613bfd565b604082019050919050565b6000612c29601d836136a4565b9150612c3482613c4c565b602082019050919050565b6000612c4c6026836136a4565b9150612c5782613c75565b604082019050919050565b6000612c6f601f836136a4565b9150612c7a82613cc4565b602082019050919050565b6000612c926026836136a4565b9150612c9d82613ced565b604082019050919050565b6000612cb56031836136a4565b9150612cc082613d3c565b604082019050919050565b6000612cd86020836136a4565b9150612ce382613d8b565b602082019050919050565b6000612cfb6005836136b5565b9150612d0682613db4565b600582019050919050565b6000612d1e6020836136a4565b9150612d2982613ddd565b602082019050919050565b6000612d416031836136a4565b9150612d4c82613e06565b604082019050919050565b6000612d646019836136a4565b9150612d6f82613e55565b602082019050919050565b6000612d87600083613699565b9150612d9282613e7e565b600082019050919050565b6000612daa6013836136a4565b9150612db582613e81565b602082019050919050565b6000612dcd601d836136a4565b9150612dd882613eaa565b602082019050919050565b6000612df0600e836136a4565b9150612dfb82613ed3565b602082019050919050565b6000612e13602a836136a4565b9150612e1e82613efc565b604082019050919050565b6000612e366016836136a4565b9150612e4182613f4b565b602082019050919050565b6000612e59601f836136a4565b9150612e6482613f74565b602082019050919050565b6000612e7c6036836136a4565b9150612e8782613f9d565b604082019050919050565b612e9b8161373f565b82525050565b612eaa81613778565b82525050565b612ec1612ebc82613778565b6138f3565b82525050565b612ed081613782565b82525050565b6000612ee38284866129b7565b91508190509392505050565b6000612efb82846129dc565b915081905092915050565b6000612f1182612a9b565b9150612f1d828861295c565b601482019150612f2d8287612eb0565b602082019150612f3d8286612eb0565b602082019150612f4d8285612eb0565b602082019150612f5d8284612982565b6014820191508190509695505050505050565b6000612f7b82612cee565b9150612f878289612982565b601482019150612f978288612eb0565b602082019150612fa78287612982565b601482019150612fb78286612eb0565b602082019150612fc78285612eb0565b602082019150612fd78284612982565b601482019150819050979650505050505050565b6000612ff682612d7a565b9150819050919050565b60006020820190506130156000830184612973565b92915050565b60006040820190506130306000830185612973565b61303d6020830184612973565b9392505050565b60006060820190506130596000830186612973565b6130666020830185612973565b6130736040830184612ea1565b949350505050565b60006080820190506130906000830187612973565b61309d6020830186612973565b6130aa6040830185612ea1565b6130b76060830184612ea1565b95945050505050565b600060a0820190506130d56000830188612973565b6130e26020830187612e92565b6130ef60408301866129a8565b6130fc6060830185612a0d565b6131096080830184612999565b9695505050505050565b60006040820190506131286000830185612973565b6131356020830184612ea1565b9392505050565b60006020820190506131516000830184612999565b92915050565b600060808201905061316c60008301876129a8565b6131796020830186612ec7565b61318660408301856129a8565b61319360608301846129a8565b95945050505050565b600060208201905081810360008301526131b68184612a1c565b905092915050565b600060208201905081810360008301526131d781612a55565b9050919050565b600060208201905081810360008301526131f781612a78565b9050919050565b6000602082019050818103600083015261321781612abe565b9050919050565b6000602082019050818103600083015261323781612ae1565b9050919050565b6000602082019050818103600083015261325781612b04565b9050919050565b6000602082019050818103600083015261327781612b27565b9050919050565b6000602082019050818103600083015261329781612b4a565b9050919050565b600060208201905081810360008301526132b781612b6d565b9050919050565b600060208201905081810360008301526132d781612b90565b9050919050565b600060208201905081810360008301526132f781612bb3565b9050919050565b6000602082019050818103600083015261331781612bd6565b9050919050565b6000602082019050818103600083015261333781612bf9565b9050919050565b6000602082019050818103600083015261335781612c1c565b9050919050565b6000602082019050818103600083015261337781612c3f565b9050919050565b6000602082019050818103600083015261339781612c62565b9050919050565b600060208201905081810360008301526133b781612c85565b9050919050565b600060208201905081810360008301526133d781612ca8565b9050919050565b600060208201905081810360008301526133f781612ccb565b9050919050565b6000602082019050818103600083015261341781612d11565b9050919050565b6000602082019050818103600083015261343781612d34565b9050919050565b6000602082019050818103600083015261345781612d57565b9050919050565b6000602082019050818103600083015261347781612d9d565b9050919050565b6000602082019050818103600083015261349781612dc0565b9050919050565b600060208201905081810360008301526134b781612de3565b9050919050565b600060208201905081810360008301526134d781612e06565b9050919050565b600060208201905081810360008301526134f781612e29565b9050919050565b6000602082019050818103600083015261351781612e4c565b9050919050565b6000602082019050818103600083015261353781612e6f565b9050919050565b60006020820190506135536000830184612ea1565b92915050565b600060608201905061356e6000830186612ea1565b61357b602083018561294d565b6135886040830184612ea1565b949350505050565b60006080820190506135a56000830187612ea1565b6135b26020830186612973565b6135bf6040830185612973565b6135cc6060830184612ea1565b95945050505050565b60006135df6135f0565b90506135eb8282613819565b919050565b6000604051905090565b600067ffffffffffffffff8211156136155761361461392c565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156136415761364061392c565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561366d5761366c61392c565b5b6136768261395b565b9050602081019050919050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600080858511156136d057600080fd5b838611156136dd57600080fd5b6001850283019150848603905094509492505050565b60006136fe82613758565b9050919050565b600061371082613758565b9050919050565b60008115159050919050565b6000819050919050565b6000613738826136f3565b9050919050565b60006cffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061379a826137b3565b9050919050565b60006137ac82613782565b9050919050565b60006137be826137c5565b9050919050565b60006137d082613758565b9050919050565b82818337600083830152505050565b60005b838110156138045780820151818401526020810190506137e9565b83811115613813576000848401525b50505050565b6138228261395b565b810181811067ffffffffffffffff821117156138415761384061392c565b5b80604052505050565b600061385582613778565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613888576138876138fd565b5b600182019050919050565b600061389e82613782565b915060ff8214156138b2576138b16138fd565b5b600182019050919050565b60006138c8826138e1565b9050919050565b60006138da826138e1565b9050919050565b60006138ec8261396c565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f696e76616c696420646573632e64737452656365697665720000000000000000600082015250565b7f4554484552000000000000000000000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f696e76616c6964207369676e617475726573206c656e67746800000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f65786368616e6765206661696c65640000000000000000000000000000000000600082015250565b7f7265636569766564206c657373207468616e206d696e52657475726e416d6f7560008201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b7f696e76616c6964207369676e6572000000000000000000000000000000000000600082015250565b7f6e65775369676e6572735b305d20616e64206e65775369676e6572735b315d2060008201527f6d75737420626520646966666572656e74000000000000000000000000000000602082015250565b7f6e6f7420616c6c6f776564207369676e65720000000000000000000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f6d69736d6174636820616d6f756e7420616e6420646573632e616d6f756e7400600082015250565b7f6e65775369676e657273206d75737420686176652065786163746c792033207360008201527f69676e6572730000000000000000000000000000000000000000000000000000602082015250565b7f6e65775369676e6572735b315d20616e64206e65775369676e6572735b325d2060008201527f6d75737420626520646966666572656e74000000000000000000000000000000602082015250565b7f6d69736d6174636820746f6b656e20616e6420646573632e737263546f6b656e600082015250565b7f4552433230000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f6e65775369676e6572735b305d20616e64206e65775369676e6572735b325d2060008201527f6d75737420626520646966666572656e74000000000000000000000000000000602082015250565b7f696e76616c696420616c6c5369676e657273206c656e67746800000000000000600082015250565b50565b7f65787069726564207472616e73616374696f6e00000000000000000000000000600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f7265706561746564206f72646572000000000000000000000000000000000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f63616e206e6f742062652073616d65207369676e657200000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000602082015250565b613ff5816136f3565b811461400057600080fd5b50565b61400c81613705565b811461401757600080fd5b50565b61402381613717565b811461402e57600080fd5b50565b61403a81613723565b811461404557600080fd5b50565b6140518161372d565b811461405c57600080fd5b50565b61406881613778565b811461407357600080fd5b5056fea2646970667358221220eef0ddd719a796dc785708c4d3410361ecc135708d0ea648236373542841242e64736f6c63430008020033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000001111111254eeb25477b68fb85ed929f73a96058200000000000000000000000035d173cdfe4d484bc5985fda55fabad5892c7b820000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000300000000000000000000000022c89137525b593dd2a18434348b550ffa5984fe0000000000000000000000005cdded5ea50ae7973943394de17ab51c365254dd0000000000000000000000002a2a180373391915738ab1f89a1b258893361964
-----Decoded View---------------
Arg [0] : aggregationRouterV5 (address): 0x1111111254EEB25477B68fb85Ed929f73A960582
Arg [1] : zkSyncL1Gateway (address): 0x35D173cdfE4d484BC5985fDa55FABad5892c7B82
Arg [2] : allowedSigners (address[]): 0x22c89137525b593Dd2A18434348b550ffA5984Fe,0x5cDded5ea50aE7973943394De17aB51C365254Dd,0x2A2A180373391915738aB1F89a1B258893361964
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000001111111254eeb25477b68fb85ed929f73a960582
Arg [1] : 00000000000000000000000035d173cdfe4d484bc5985fda55fabad5892c7b82
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [4] : 00000000000000000000000022c89137525b593dd2a18434348b550ffa5984fe
Arg [5] : 0000000000000000000000005cdded5ea50ae7973943394de17ab51c365254dd
Arg [6] : 0000000000000000000000002a2a180373391915738ab1f89a1b258893361964
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.